ROS2探索总结(十一)—— ROS 2 gazebo仿真入门

  • 内容
  • 评论
  • 相关

~欢迎关注~
微信公众号:古月居
新浪微博:古月春旭
知乎专栏:古月居

 

gazebo是ROS中常用的三维物理仿真环境,在ROS 2中已经支持,这里我们就来小试牛刀。

前提条件

已经安装了ROS 2和gazebo 9(或者ROS melodic)

安装接口

  1. $ sudo apt install ros-crystal-gazebo-ros-pkgs

一、gazebo例程跑起来

gazebo例程跑起来:

  1. $ gazebo --verbose /opt/ros/crystal/share/gazebo_plugins/worlds/gazebo_ros_diff_drive_demo.world

终端中可以看到如下加载信息:

Screenshot from 2018-12-28 11-06-32

gazebo仿真环境很快就会打开:

Screenshot from 2018-12-28 10-53-40

想要看看系统有没有跑起来,关键是看话题有没有发布/订阅:

Screenshot from 2018-12-28 11-02-29

可以看到,其中有一个cmd_demo的话题,相当于ROS 1中的cmd_vel,发布该话题就可以让gazebo中的小车模型动起来了:

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

小车很快就会动起来:

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

Screenshot from 2018-12-28 11-05-18

 

二、探究仿真背后的内容

gazebo仿真例程跑起来了,各种数据我们也都可以看到,回过头来,我们再看下运行以上例程的文件gazebo_ros_diff_drive_demo.world,该文件可以在以下路径中找到:

Screenshot from 2018-12-28 11-10-03

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

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

  1.   Gazebo ROS differential drive plugin demo
  2.  
  3.   Try sending commands:
  4.  
  5.     ros2 topic pub /demo/cmd_demo geometry_msgs/Twist '{linear: {x: 1.0}}' -1
  6.  
  7.     ros2 topic pub /demo/cmd_demo geometry_msgs/Twist '{angular: {z: 0.1}}' -1
  8.  
  9.   Try listening to odometry:
  10.  
  11.     ros2 topic echo /demo/odom_demo
  12.  
  13.   Try listening to TF:
  14.  
  15.     ros2 run tf2_ros tf2_echo odom chassis
  16.  
  17.     ros2 run tf2_ros tf2_echo chassis right_wheel
  18.  
  19.     ros2 run tf2_ros tf2_echo chassis left_wheel

接下来是sdf模型相关的描述,除了ground和sun模型的调用外,重点是小车模型vehicle的描述,和URDF建模的语法差别不大:

  1.   <world name="default">
  2.  
  3.     <include>
  4.       <uri>model://ground_plane</uri>
  5.     </include>
  6.  
  7.     <include>
  8.       <uri>model://sun</uri>
  9.     </include>
  10.  
  11.     <model name='vehicle'>
  12.       <pose>0 0 0.325 0 -0 0</pose>
  13.  
  14.       <link name='chassis'>
  15.         <pose>-0.151427 -0 0.175 0 -0 0</pose>
  16.         <inertial>
  17.           <mass>1.14395</mass>
  18.           <inertia>
  19.             <ixx>0.126164</ixx>
  20.             <ixy>0</ixy>
  21.             <ixz>0</ixz>
  22.             <iyy>0.416519</iyy>
  23.             <iyz>0</iyz>
  24.             <izz>0.481014</izz>
  25.           </inertia>
  26.         </inertial>
  27.         <visual name='visual'>
  28.           <geometry>
  29.             <box>
  30.               <size>2.01142 1 0.568726</size>
  31.             </box>
  32.           </geometry>
  33.         </visual>
  34.         <collision name='collision'>
  35.           <geometry>
  36.             <box>
  37.               <size>2.01142 1 0.568726</size>
  38.             </box>
  39.           </geometry>
  40.         </collision>
  41.       </link>
  42.  
  43.       <link name='left_wheel'>
  44.         <pose>0.554283 0.625029 -0.025 -1.5707 0 0</pose>
  45.         <inertial>
  46.           <mass>2</mass>
  47.           <inertia>
  48.             <ixx>0.145833</ixx>
  49.             <ixy>0</ixy>
  50.             <ixz>0</ixz>
  51.             <iyy>0.145833</iyy>
  52.             <iyz>0</iyz>
  53.             <izz>0.125</izz>
  54.           </inertia>
  55.         </inertial>
  56.         <visual name='visual'>
  57.           <geometry>
  58.             <sphere>
  59.               <radius>0.3</radius>
  60.             </sphere>
  61.           </geometry>
  62.         </visual>
  63.         <collision name='collision'>
  64.           <geometry>
  65.             <sphere>
  66.               <radius>0.3</radius>
  67.             </sphere>
  68.           </geometry>
  69.           <surface>
  70.             <friction>
  71.               <ode>
  72.                 <mu>1</mu>
  73.                 <mu2>1</mu2>
  74.                 <slip1>0</slip1>
  75.                 <slip2>0</slip2>
  76.               </ode>
  77.             </friction>
  78.             <contact>
  79.               <ode>
  80.                 <soft_cfm>0</soft_cfm>
  81.                 <soft_erp>0.2</soft_erp>
  82.                 <kp>1e+13</kp>
  83.                 <kd>1</kd>
  84.                 <max_vel>0.01</max_vel>
  85.                 <min_depth>0.01</min_depth>
  86.               </ode>
  87.             </contact>
  88.           </surface>
  89.         </collision>
  90.       </link>
  91.  
  92.       <link name='right_wheel'>
  93.         <pose>0.554282 -0.625029 -0.025 -1.5707 0 0</pose>
  94.         <inertial>
  95.           <mass>2</mass>
  96.           <inertia>
  97.             <ixx>0.145833</ixx>
  98.             <ixy>0</ixy>
  99.             <ixz>0</ixz>
  100.             <iyy>0.145833</iyy>
  101.             <iyz>0</iyz>
  102.             <izz>0.125</izz>
  103.           </inertia>
  104.         </inertial>
  105.         <visual name='visual'>
  106.           <geometry>
  107.             <sphere>
  108.               <radius>0.3</radius>
  109.             </sphere>
  110.           </geometry>
  111.         </visual>
  112.         <collision name='collision'>
  113.           <geometry>
  114.             <sphere>
  115.               <radius>0.3</radius>
  116.             </sphere>
  117.           </geometry>
  118.           <surface>
  119.             <friction>
  120.               <ode>
  121.                 <mu>1</mu>
  122.                 <mu2>1</mu2>
  123.                 <slip1>0</slip1>
  124.                 <slip2>0</slip2>
  125.               </ode>
  126.             </friction>
  127.             <contact>
  128.               <ode>
  129.                 <soft_cfm>0</soft_cfm>
  130.                 <soft_erp>0.2</soft_erp>
  131.                 <kp>1e+13</kp>
  132.                 <kd>1</kd>
  133.                 <max_vel>0.01</max_vel>
  134.                 <min_depth>0.01</min_depth>
  135.               </ode>
  136.             </contact>
  137.           </surface>
  138.         </collision>
  139.       </link>
  140.  
  141.       <link name='caster'>
  142.         <pose>-0.957138 -0 -0.125 0 -0 0</pose>
  143.         <inertial>
  144.           <mass>1</mass>
  145.           <inertia>
  146.             <ixx>0.1</ixx>
  147.             <ixy>0</ixy>
  148.             <ixz>0</ixz>
  149.             <iyy>0.1</iyy>
  150.             <iyz>0</iyz>
  151.             <izz>0.1</izz>
  152.           </inertia>
  153.         </inertial>
  154.         <visual name='visual'>
  155.           <geometry>
  156.             <sphere>
  157.               <radius>0.2</radius>
  158.             </sphere>
  159.           </geometry>
  160.         </visual>
  161.         <collision name='collision'>
  162.           <geometry>
  163.             <sphere>
  164.               <radius>0.2</radius>
  165.             </sphere>
  166.           </geometry>
  167.         </collision>
  168.       </link>
  169.  
  170.       <joint name='left_wheel_joint' type='revolute'>
  171.         <parent>chassis</parent>
  172.         <child>left_wheel</child>
  173.         <axis>
  174.           <xyz>0 0 1</xyz>
  175.           <limit>
  176.             <lower>-1.79769e+308</lower>
  177.             <upper>1.79769e+308</upper>
  178.           </limit>
  179.         </axis>
  180.       </joint>
  181.  
  182.       <joint name='right_wheel_joint' type='revolute'>
  183.         <parent>chassis</parent>
  184.         <child>right_wheel</child>
  185.         <axis>
  186.           <xyz>0 0 1</xyz>
  187.           <limit>
  188.             <lower>-1.79769e+308</lower>
  189.             <upper>1.79769e+308</upper>
  190.           </limit>
  191.         </axis>
  192.       </joint>
  193.  
  194.       <joint name='caster_wheel' type='ball'>
  195.         <parent>chassis</parent>
  196.         <child>caster</child>
  197.       </joint>

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

  1.       <plugin name='diff_drive' filename='libgazebo_ros_diff_drive.so'>
  2.  
  3.         <ros>
  4.           <namespace>/demo</namespace>
  5.           <argument>cmd_vel:=cmd_demo</argument>
  6.           <argument>odom:=odom_demo</argument>
  7.         </ros>
  8.  
  9.         <!-- wheels -->
  10.         <left_joint>left_wheel_joint</left_joint>
  11.         <right_joint>right_wheel_joint</right_joint>
  12.  
  13.         <!-- kinematics -->
  14.         <wheel_separation>1.25</wheel_separation>
  15.         <wheel_diameter>0.6</wheel_diameter>
  16.  
  17.         <!-- limits -->
  18.         <max_wheel_torque>20</max_wheel_torque>
  19.         <max_wheel_acceleration>1.0</max_wheel_acceleration>
  20.  
  21.         <!-- output -->
  22.         <publish_odom>true</publish_odom>
  23.         <publish_odom_tf>true</publish_odom_tf>
  24.         <publish_wheel_tf>true</publish_wheel_tf>
  25.  
  26.         <odometry_frame>odom_demo</odometry_frame>
  27.         <robot_base_frame>chassis</robot_base_frame>
  28.  
  29.       </plugin>

三、更多仿真例程

在以上例程同样的路径下,还可以看到不少其他gazebo仿真例程,包含了多种传感器和常用功能:

Screenshot from 2018-12-28 11-10-03

这里仅以其中一个传感器的demo为例进行演示:

  1. $ gazebo --verbose /opt/ros/crystal/share/gazebo_plugins/worlds/gazebo_ros_ray_sensor_demo.world

Screenshot from 2018-12-28 11-18-21

启动后可以看到如下gazebo界面:

Screenshot from 2018-12-28 11-17-46

该仿真包含的传感器有:激光、点云、声纳。

Screenshot from 2018-12-28 11-18-41

在rviz中可以看到这些传感器的可视化效果:

Screenshot from 2018-12-28 11-16-59

 

更多内容欢迎关注:

微信公众号:古月居 (guyue_home)

新浪微博:古月春旭

知乎专栏:古月居 (https://zhuanlan.zhihu.com/guyuehome)


原创文章,转载请注明: 转载自古月居

本文链接地址: ROS2探索总结(十一)—— ROS 2 gazebo仿真入门

微信 OR 支付宝 扫描二维码
为本文作者 打个赏
pay_weixinpay_weixin

评论

15条评论
  1. Gravatar 头像

    梁同学 回复

    CMake Error at /home/lenovo/catkin_ws/devel/share/hardware_interface/cmake/hardware_interfaceConfig.cmake:113 (message):
    Project 'hardware_interface' specifies
    '/home/lenovo/catkin_ws/src/ros_control/hardware_interface/include' as an
    include dir, which is not found. It does neither exist as an absolute
    directory nor in '/home/lenovo/catkin_ws/src/ros_control/hardware_interface//home/lenovo/catkin_ws/src/ros_control/hardware_interface/include'.
    Check the issue tracker
    'https://github.com/ros-controls/ros_control/issues' and consider creating
    a ticket if the problem has not been reported yet.
    Call Stack (most recent call first):
    /opt/ros/kinetic/share/controller_interface/cmake/controller_interfaceConfig.cmake:172 (find_package)
    /opt/ros/kinetic/share/catkin/cmake/catkinConfig.cmake:76 (find_package)
    my_controller/CMakeLists.txt:4 (find_package)
    -- Configuring incomplete, errors occurred!
    See also "/home/lenovo/catkin_ws/build/CMakeFiles/CMakeOutput.log".
    See also "/home/lenovo/catkin_ws/build/CMakeFiles/CMakeError.log".
    Makefile:1956: recipe for target 'cmake_check_build_system' failed
    make: *** [cmake_check_build_system] Error 1
    Invoking "make cmake_check_build_system" failed

    古老师,这个错误找了好久,有的说要安装 sudo apt-get install ros-kinetic-ros-controller-manager,但是安装的时候显示无法定位软件包。您能帮忙解答一下吗?

    • 古月

      古月 回复

      @梁同学 安装ros-control,ros-controllers、gazeo-ros-control功能包

      • Gravatar 头像

        梁同学 回复

        @古月 这三个都是 sudo apt install 过了这三个功能包,但是还是出现这个错误

  2. Gravatar 头像

    伍六七 回复

    古老师,如果我要控制的输出量是电机的转矩,那么是不是不能使用速度控制?速度控制和位置控制的区别是啥?gazebo中有电机的转矩控制吗?

  3. Gravatar 头像

    何洋 回复

    老师你好,我是ROS初学者,买了您的书,在看第六章的时候我有问题想请教一下您,我在运行Gazebo跑模型的时候发现,您原来德例程是没有问题的,如果我改变了模型,甚至是仅仅删除Plate_2_link,模型就无法使用键盘控制了,打开rqt文件,发现节点都在,但是都没有连起来,不知道是什么问题,请教一下

    • 古月

      古月 回复

      @何洋 模型中link都是互相连接的,删掉后可能有影响,具体看下模型内容

  4. Gravatar 头像

    梁同学 回复

    古老师,如果差速控制不用PID,使用自己的算法控制,是不是需要去修改ros_control
    的底层?

    • 古月

      古月 回复

      @梁同学 ros_control里边提供了一些API接口,可以基于它的硬件抽象层上写一些算法,或者完全抛开ros_control自己实现也可以

      • Gravatar 头像

        梁同学 回复

        @古月 古老师,有没有什么推荐的文章之类的可以写您说的api的接口?现在在抽象层写一些算法还是比较难。

        • 古月

          古月 回复

          @梁同学 参考ros_control wiki,在官方的github上有一个简单的教程

  5. Gravatar 头像

    Trivas 回复

    古月老师您好
    请问这篇博客里的两张gazebo截图,为什么第一张的地面是黑色的,而第二张是亮色的呢?.world文件里应该都已经加上sun了吧?

  6. Gravatar 头像

    Leander 回复

    老师您好,请问如何实现四轮后驱小车的前轮转向装置描述呀?谢谢老师。

    • 古月

      古月 回复

      @Leander 可以参考ROS中类似模型的设计,看你什么类型的转向装置了,一般是用类似的关节模拟出来

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据