草庐IT

【ROS2仿真-01】运动小车的gazebo仿真

无水先生 2023-05-26 原文

一、提要

        本文对于初学者的Gazebo仿真给出导学,通过学习,能使初学者对ROS2和gazebo配合得到初步认知。本文是系列文档,我们将讲述小车的种种仿真,本篇只是开头,讲最简单的仿真----运动仿真。

二、完善环境 

2.1 基础环境

全文的环境为: Ubuntu 20.04 + ROS2 foxy + Gazebo11

2.2 安装gazebo-plugin

        因为在foxy装完后,发现系统内无gazebo-plugin,因此,需要安装它。

 sudo apt install ros-foxy-gazebo-*

        注意:无论Ubuntu系统内有无安装gazebo,如已经独立安装,最后在路径:

cd  /opt/ros/foxy/share 下,必须看到:

(   若需要改apt-get的换数据源:

        从ubuntu首先进入 Settings -> Software & Updates -> Ubuntu Software, Download from 处选择对应的源即可。 )

  2.3 查看gazebo的版本 

 gazebo --version

 三、读入系统范例

        系统路径下,有许多预设案例,我们可以跑其中之一,若跑其它案例与此雷同。

3.1 从gazebo打开范例

gazebo --verbose /opt/ros/foxy/share/gazebo_plugins/worlds/gazebo_ros_diff_drive_demo.world

出现如下:

3.2 检查状态

ros2 toplic list

系统若正常显示为:

四、通过指令驱动小车

4.1 直线轨迹行驶

驱动小车直线行驶指令: 

ros2 topic pub /demo/cmd_demo geometry_msgs/Twist '{linear: {x: 1.0}}' -1

4.2 圆周轨迹行驶 

ros2 topic pub /demo/cmd_demo geometry_msgs/msg/Twist "{linear:{x=5,y=5,z:0},angular:{x=0,y=0,z=3.14}}"

4.3 里程计信息查看

        这是小车的传感器反馈到控制系统的topic。

ros2 topic echo /demo/odom_demo

        话题列表中还有一个odom_demo,可以实时反馈小车的里程计信息:

五、代码解释

       所谓程序语言的类别,有两种:

  • 功能性的:如C语言、java、python
  • 描述性的:xml

        gazebo仿真属于描述性的程序代码xml。

       下面我们对文件gazebo_ros_diff_drive_demo.world进行解读,该文件可以在以下路径中找到:

gazebo_ros_diff_drive_demo.world文件内容并不算多,主要是sdf模型文件的描述。

头部注释里是该例程的使用方法,大家也都可以试一下:

  Gazebo ROS differential drive plugin demo
  Try sending commands:
    ros2 topic pub /demo/cmd_demo geometry_msgs/Twist '{linear: {x: 1.0}}' -1
    ros2 topic pub /demo/cmd_demo geometry_msgs/Twist '{angular: {z: 0.1}}' -1
  Try listening to odometry:
    ros2 topic echo /demo/odom_demo
  Try listening to TF:
    ros2 run tf2_ros tf2_echo odom chassis
    ros2 run tf2_ros tf2_echo chassis right_wheel
    ros2 run tf2_ros tf2_echo chassis left_wheel

        接下来是sdf模型相关的描述,除了ground和sun模型的调用外,重点是小车模型vehicle的描述,和URDF建模的语都是xml结构体:

5.1 xml对world的描述

        对world的描述分两部分:

  • 点缀部分:环境描述部分,如地面、太阳、树等
  • 核心部分:被控对象,如:小车、机器人等

         无论world的点缀部分、还是核心部分都是由许多model组成,这些model有些是环境的,有些是被控对象的。

  • 代码如下:
 <world name="default">

    <include>
      <uri>model://ground_plane</uri>
    </include>

    <include>
      <uri>model://sun</uri>
    </include>

    <model name='vehicle'>

    ... 
    </model>

</world >

5.2 vehicle对应model的组成结构

对于任意model都包含以下属性:

  • 1)坐标位置
  • 2)几何形状
  • 3)物理惯性:就是与质量相关的若干物理量,URDF没有。
  • 4)视觉范围
  • 5)碰撞范围:可能碰撞的外观,只有运动起来才能显现。

关于model的构成:

  <world name="default">

    <include>
      <uri>model://ground_plane</uri>
    </include>

    <include>
      <uri>model://sun</uri>
    </include>

    <model name='vehicle'>
      <pose>0 0 0.325 0 -0 0</pose>

      <link name='chassis'>
        <pose>-0.151427 -0 0.175 0 -0 0</pose>
        <inertial>
          <mass>1.14395</mass>
          <inertia>
            <ixx>0.126164</ixx>
            <ixy>0</ixy>
            <ixz>0</ixz>
            <iyy>0.416519</iyy>
            <iyz>0</iyz>
            <izz>0.481014</izz>
          </inertia>
        </inertial>
        <visual name='visual'>
          <geometry>
            <box>
              <size>2.01142 1 0.568726</size>
            </box>
          </geometry>
        </visual>
        <collision name='collision'>
          <geometry>
            <box>
              <size>2.01142 1 0.568726</size>
            </box>
          </geometry>
        </collision>
      </link>

      <link name='left_wheel'>
        <pose>0.554283 0.625029 -0.025 -1.5707 0 0</pose>
        <inertial>
          <mass>2</mass>
          <inertia>
            <ixx>0.145833</ixx>
            <ixy>0</ixy>
            <ixz>0</ixz>
            <iyy>0.145833</iyy>
            <iyz>0</iyz>
            <izz>0.125</izz>
          </inertia>
        </inertial>
        <visual name='visual'>
          <geometry>
            <sphere>
              <radius>0.3</radius>
            </sphere>
          </geometry>
        </visual>
        <collision name='collision'>
          <geometry>
            <sphere>
              <radius>0.3</radius>
            </sphere>
          </geometry>
          <surface>
            <friction>
              <ode>
                <mu>1</mu>
                <mu2>1</mu2>
                <slip1>0</slip1>
                <slip2>0</slip2>
              </ode>
            </friction>
            <contact>
              <ode>
                <soft_cfm>0</soft_cfm>
                <soft_erp>0.2</soft_erp>
                <kp>1e+13</kp>
                <kd>1</kd>
                <max_vel>0.01</max_vel>
                <min_depth>0.01</min_depth>
              </ode>
            </contact>
          </surface>
        </collision>
      </link>

      <link name='right_wheel'>
        <pose>0.554282 -0.625029 -0.025 -1.5707 0 0</pose>
        <inertial>
          <mass>2</mass>
          <inertia>
            <ixx>0.145833</ixx>
            <ixy>0</ixy>
            <ixz>0</ixz>
            <iyy>0.145833</iyy>
            <iyz>0</iyz>
            <izz>0.125</izz>
          </inertia>
        </inertial>
        <visual name='visual'>
          <geometry>
            <sphere>
              <radius>0.3</radius>
            </sphere>
          </geometry>
        </visual>
        <collision name='collision'>
          <geometry>
            <sphere>
              <radius>0.3</radius>
            </sphere>
          </geometry>
          <surface>
            <friction>
              <ode>
                <mu>1</mu>
                <mu2>1</mu2>
                <slip1>0</slip1>
                <slip2>0</slip2>
              </ode>
            </friction>
            <contact>
              <ode>
                <soft_cfm>0</soft_cfm>
                <soft_erp>0.2</soft_erp>
                <kp>1e+13</kp>
                <kd>1</kd>
                <max_vel>0.01</max_vel>
                <min_depth>0.01</min_depth>
              </ode>
            </contact>
          </surface>
        </collision>
      </link>

      <link name='caster'>
        <pose>-0.957138 -0 -0.125 0 -0 0</pose>
        <inertial>
          <mass>1</mass>
          <inertia>
            <ixx>0.1</ixx>
            <ixy>0</ixy>
            <ixz>0</ixz>
            <iyy>0.1</iyy>
            <iyz>0</iyz>
            <izz>0.1</izz>
          </inertia>
        </inertial>
        <visual name='visual'>
          <geometry>
            <sphere>
              <radius>0.2</radius>
            </sphere>
          </geometry>
        </visual>
        <collision name='collision'>
          <geometry>
            <sphere>
              <radius>0.2</radius>
            </sphere>
          </geometry>
        </collision>
      </link>

      <joint name='left_wheel_joint' type='revolute'>
        <parent>chassis</parent>
        <child>left_wheel</child>
        <axis>
          <xyz>0 0 1</xyz>
          <limit>
            <lower>-1.79769e+308</lower>
            <upper>1.79769e+308</upper>
          </limit>
        </axis>
      </joint>

      <joint name='right_wheel_joint' type='revolute'>
        <parent>chassis</parent>
        <child>right_wheel</child>
        <axis>
          <xyz>0 0 1</xyz>
          <limit>
            <lower>-1.79769e+308</lower>
            <upper>1.79769e+308</upper>
          </limit>
        </axis>
      </joint>

      <joint name='caster_wheel' type='ball'>
        <parent>chassis</parent>
        <child>caster</child>
      </joint>

重点是最下边的差速控制器插件配置,其中的参数配置和ROS 1是一致的:

      <plugin name='diff_drive' filename='libgazebo_ros_diff_drive.so'>

        <ros>
          <namespace>/demo</namespace>
          <argument>cmd_vel:=cmd_demo</argument>
          <argument>odom:=odom_demo</argument>
        </ros>

        <!-- wheels -->
        <left_joint>left_wheel_joint</left_joint>
        <right_joint>right_wheel_joint</right_joint>

        <!-- kinematics -->
        <wheel_separation>1.25</wheel_separation>
        <wheel_diameter>0.6</wheel_diameter>

        <!-- limits -->
        <max_wheel_torque>20</max_wheel_torque>
        <max_wheel_acceleration>1.0</max_wheel_acceleration>

        <!-- output -->
        <publish_odom>true</publish_odom>
        <publish_odom_tf>true</publish_odom_tf>
        <publish_wheel_tf>true</publish_wheel_tf>

        <odometry_frame>odom_demo</odometry_frame>
        <robot_base_frame>chassis</robot_base_frame>

      </plugin>

(更新中...)

有关【ROS2仿真-01】运动小车的gazebo仿真的更多相关文章

  1. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  2. 建模分析 | 平面2R机器人(二连杆)运动学与动力学建模(附Matlab仿真) - 2

    目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标

  3. ABB-IRB-1200运动学分析MATLAB RVC工具分析+Simulink-Adams联合仿真 - 2

    一、机器人介绍        此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接

  4. day1-数组part01| 704. 二分查找、27. 移除元素 - 2

    数组理论基础数组是存放在连续内存空间上的相同类型数据的集合。数组下标从0开始数组内存空间的地址是连续的c++中vector和array的区别1、vector是顺序容器,其利用连续的内存空间来存储元素,但是其内存空间大小是能够改变的。2、array是顺序容器,其也是利用连续的内存空间来存储元素,但它的内存空间是固定大小的,申请之后就无法改变。3、vector的底层是array实现的二维数组二维数组在内存的空间地址是连续的704|二分查找思路1、把整个数组一分为二;2、判断目标值在左区间还是右区间,若在左区间,则修改右区间指针的位置;若在右区间,则修改新区间的左区间位置3、重复上述过程,直到lef

  5. 一、51单片机 使用Proteus掌握LCD1602显示屏的使用(仿真及代码) - 2

    1、单片机控制液晶显示模块1602LCD的显示。液晶显示器(LiquidCrystalDisplay,LCD)具有省电、体积小、抗干扰能力强等优点,LCD显示器分为字段型、字符型和点阵图形型。(1)字段型。以长条状组成字符显示,主要用于数字显示,也可用于显示西文字母或某些字符,广泛用于电子表、计算器、数字仪表中。(2)字符型。专门用于显示字母、数字、符号等。一个字符由5、7或5、10的点阵组成,在单片机系统中已广泛使用(3)点阵图形型。广泛用于图形显示,如笔记本电脑、彩色电视和游戏机等。它是在平板上排列的多行列的矩阵式的晶格点,点大小与多少决定了显示的清晰度。引脚包括8条数据线、3条控制线和3

  6. 最全ROS 入门 - 2

    目录简介ROS诞生背景ROS的设计目标ROS与ROS2安装ROS1.配置ubuntu的软件和更新2.设置安装源3.设置key4.安装5.配置环境变量安装可能出现的问题安装构建依赖卸载ROS架构1.设计者2.维护者3.立足系统架构:ROS可以划分为三层ROS通信机制话题通信理论模型流程通信样例自定义消息的通信服务通信理论模型服务通信自定义srv参数服务器理论模型参数操作常用命令简介rosnoderostopicrosmsgrosservicerossrvrosparam常用API初始化话题与服务相关对象C++回旋函数C++对比时间1.时刻2.持续时间3.持续时间与时刻运算4.设置运行频率(非常常

  7. STM32寻迹小车 - 2

    第一次发博客,以及第一次坐智能小车,可能有很多瑕疵和不足。一、项目时间:2022.11.19~11.22二、实现效果:小车进行循迹行驶三、使用模块:STM32F103RCT6核心板*1L298N电机驱动模块*2TCRT5000L五路红外循迹传感器模块*1DC3V-6V黄色直流减速电机-TT*4锂电池组电源12V*2OLED屏幕-四针*1LM2596降压模块(新款DC-DC可调稳压电源模块)*1DC-DC12V装3.3v5v12v电源模块 四、基础使用方式:OLED显示循迹模块反馈状态【例如:10001】电机驱动1【采用左右轮倒转实现拐弯】电机驱动2【1块控制左轮,一块控制右轮】循迹模式【转角力

  8. javascript - 如何在运动路径上有效地反转 SVG (SMIL) 动画? - 2

    我正在尝试确定如何有效地反转此SVG动画(使用SMIL),它使用animateMotion和path上的d属性元素。我需要动画围绕形状逆时针运行。当前动画可以查here相关代码如下。document.getElementById("svgobject").pauseAnimations();STARTSTOP我明白我可以手动反转SVG路径数据命令,包括moveto(M,m)、lineto(L,l)、curveto(C,c)等。考虑到我需要反转的路径坐标数量(除了这个动画中的那些),我正在尝试确定是否有更有效的方法来执行此操作。 最佳答案

  9. javascript - react 运动的压倒性语法 - 2

    我想使用https://github.com/chenglou/react-motion但是当我看到第一个例子时:import{Motion,spring}from'react-motion';//Inyourrender...{value=>{value.x}}我对ES6语法和JSX语法不知所措。我试着在babelREPL上翻译它但它去掉了JSX语法:"usestrict";React.createElement(Motion,{defaultStyle:{x:0},style:{x:spring(10)}},function(value){returnReact.createEle

  10. ROS学习笔记(八):ROS2 - 2

    ROS学习笔记(八):ROS2ROS1存在的问题ROS2ROS2的设计目标ROS2的系统架构ROS2的关键中间件——DDSROS2的通信模型ROS1存在的问题ROS(一般ROS均指ROS1)经过多年的发展,已成为机器人领域的重要的工具与平台。但是ROS1主要存在以下问题:(1)ROS1无法适用于多机器人系统。(2)ROS1基于Linux系统,在Windows、macOS和RTOS上无法应用或功能有限。(3)ROS1缺少实时性方面的设计。(4)ROS1的分布式机制需要良好的网络环境才能保证数据的完整性,而且网络不具备数据加密、安全防护等功能。(5)ROS1的稳定性不好,ROSMaster和节点有

随机推荐