ROS探索总结(二十四)——使用gazebo中的插件

  • 内容
  • 评论
  • 相关

URDF文件完成后,可以在rviz中显示机器人的模型,如果要在gazebo中进行物理环境仿真,还需要为URDF文件加入一些gazebo相关的标签。既然是仿真,那么机器人应该像真在真实环境中一样,可以通过传感器感知周围环境,还可以根据指令进行运动。

gazebo中可以通过插入一些插件,来仿真机器人的传感器、执行器的特性,这些插件通过<gazebo>元素中的<plugin>标签描述,使用下边的格式加入到URDF文件中:

  1. <gazebo>
  2.   <plugin name="differential_drive_controller" filename="libdiffdrive_plugin.so">
  3.     ... plugin parameters ...
  4.   </plugin>
  5. </gazebo>

当然,这些插件常常需要附着于机器人的某个部分,比如要加入一个激光传感器的插件,那么我们需要将这个插件与机器人模型中的激光传感器link绑定:

  1. <gazebo reference="your_link_name">
  2.   <plugin name="your_link_laser_controller" filename="libgazebo_ros_laser.so">
  3.     ... plugin parameters ...
  4.   </plugin>
  5. </gazebo>

gazebo默认支持不少常用的设备,可以找到ros安装目录中的gazebo_plugins功能包,里边就是所有支持的插件。当然,你也可以自己编写需要的gazebo插件。

下边列出一些常用插件的使用方法:

1.差速驱动插件

很多机器人本体都采用差速驱动的方式,gazebo提供差速机器人的仿真插件,可以直接将下边的代码放到URDF文件中,修改相应的参数,指定运动控制需要订阅的主题,让机器人在gazebo中动起来。

  1. <gazebo>
  2.   <plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so">
  3.     <alwaysOn>true</alwaysOn>
  4.     <updateRate>${update_rate}</updateRate>
  5.     <leftJoint>base_link_right_wheel_joint</leftJoint>
  6.     <rightJoint>base_link_left_wheel_joint</rightJoint>
  7.     <wheelSeparation>0.5380</wheelSeparation>
  8.     <wheelDiameter>0.2410</wheelDiameter>
  9.     <torque>20</torque>
  10.     <commandTopic>cmd_vel</commandTopic>
  11.     <odometryTopic>odom</odometryTopic>
  12.     <odometryFrame>odom</odometryFrame>
  13.     <robotBaseFrame>base_footprint</robotBaseFrame>
  14.   </plugin>
  15. </gazebo>

2.摄像头

   gazebo中也可以让机器人的摄像头看到虚拟的环境,将下边的代码放到URDF文件中,“reference”修改成机器人的摄像头link,还有一些分辨率、刷新率、发布的图像主题等等参数。把机器人模型在gazebo中运行起来后,用image_view或者rviz就可以看到机器人在虚拟环境中的视野了。

  1. <!-- camera -->
  2.   <gazebo reference="camera_link">
  3.     <sensor type="camera" name="camera1">
  4.       <update_rate>30.0</update_rate>
  5.       <camera name="head">
  6.         <horizontal_fov>1.3962634</horizontal_fov>
  7.         <image>
  8.           <width>800</width>
  9.           <height>800</height>
  10.           <format>R8G8B8</format>
  11.         </image>
  12.         <clip>
  13.           <near>0.02</near>
  14.           <far>300</far>
  15.         </clip>
  16.         <noise>
  17.           <type>gaussian</type>
  18.           <!-- Noise is sampled independently per pixel on each frame.
  19.                That pixel's noise value is added to each of its color
  20.                channels, which at that point lie in the range [0,1]. -->
  21.           <mean>0.0</mean>
  22.           <stddev>0.007</stddev>
  23.         </noise>
  24.       </camera>
  25.       <plugin name="camera_controller" filename="libgazebo_ros_camera.so">
  26.         <alwaysOn>true</alwaysOn>
  27.         <updateRate>0.0</updateRate>
  28.         <cameraName>rrbot/camera1</cameraName>
  29.         <imageTopicName>image_raw</imageTopicName>
  30.         <cameraInfoTopicName>camera_info</cameraInfoTopicName>
  31.         <frameName>camera_link</frameName>
  32.         <hackBaseline>0.07</hackBaseline>
  33.         <distortionK1>0.0</distortionK1>
  34.         <distortionK2>0.0</distortionK2>
  35.         <distortionK3>0.0</distortionK3>
  36.         <distortionT1>0.0</distortionT1>
  37.         <distortionT2>0.0</distortionT2>
  38.       </plugin>
  39.     </sensor>
  40.   </gazebo>

     我们来解释一下这个插件中的参数含义:

  1.   <gazebo reference="camera_link">

插件都是用来描述linkjoint的,是一种虚无的属性描述,需要关联相应的实体,所以首先我们需要通过reference参数来定义关联的link或者joint。这里我们关联的是camera_link

  1. <sensor type="camera" name="camera1">

       然后声明插件的类型,并为该插件取一个唯一的名称。

  1. <update_rate>30.0</update_rate>

       设置摄像头数据更新的最大频率。

  1.         <horizontal_fov>1.3962634</horizontal_fov>
  2.         <image>
  3.           <width>800</width>
  4.           <height>800</height>
  5.           <format>R8G8B8</format>
  6.         </image>
  7.         <clip>
  8.           <near>0.02</near>
  9.           <far>300</far>
  10.         </clip>

再来设置一些摄像头相关的参数,尽量让这些仿真的参数与实际使用的硬件相同。

  1. <plugin name="camera_controller" filename="libgazebo_ros_camera.so">

关联摄像头插件,该插件已经在gazebo中实现,所以直接关联即可。

  1.         <cameraName>rrbot/camera1</cameraName>
  2.         <imageTopicName>image_raw</imageTopicName>
  3.         <cameraInfoTopicName>camera_info</cameraInfoTopicName>
  4.         <frameName>camera_link</frameName>

声明摄像头发布的消息话题,以及数据所在的参考系。

clip_image002[4]

clip_image004[4]

3.Kinect

Kinect在机器人导航中用的也很多,为机器人的kinect link绑定这个kinect插件,我们就可以在gazebo中进行SLAM、导航了,对于一些初学者,就算没有实体机器人,也可以在仿真器中玩转机器人。

  1. <gazebo>
  2.   <plugin name="${link_name}_controller" filename="libgazebo_ros_openni_kinect.so">
  3.     <baseline>0.2</baseline>
  4.     <alwaysOn>true</alwaysOn>
  5.     <updateRate>1.0</updateRate>
  6.     <cameraName>${camera_name}_ir</cameraName>
  7.     <imageTopicName>/${camera_name}/depth/image_raw</imageTopicName>
  8.     <cameraInfoTopicName>/${camera_name}/depth/camera_info</cameraInfoTopicName>
  9.     <depthImageTopicName>/${camera_name}/depth/image_raw</depthImageTopicName>
  10.     <depthImageInfoTopicName>/${camera_name}/depth/camera_info</depthImageInfoTopicName>
  11.     <pointCloudTopicName>/${camera_name}/depth/points</pointCloudTopicName>
  12.     <frameName>${frame_name}</frameName>
  13.     <pointCloudCutoff>0.5</pointCloudCutoff>
  14.     <distortionK1>0.00000001</distortionK1>
  15.     <distortionK2>0.00000001</distortionK2>
  16.     <distortionK3>0.00000001</distortionK3>
  17.     <distortionT1>0.00000001</distortionT1>
  18.     <distortionT2>0.00000001</distortionT2>
  19.     <CxPrime>0</CxPrime>
  20.     <Cx>0</Cx>
  21.     <Cy>0</Cy>
  22.     <focalLength>0</focalLength>
  23.     <hackBaseline>0</hackBaseline>
  24.   </plugin>
  25. </gazebo>

4.激光

有没有感叹过激光传感器太贵了!现在不要9999,不要999,只要把激光传感器的插件放到URDF模型中,上万的激光传感器在gazebo里随便用,妈妈再也不用担心玩机器人败家了。

  1. <gazebo reference="hokuyo_link">
  2.     <sensor type="ray" name="head_hokuyo_sensor">
  3.       <pose>0 0 0 0 0 0</pose>
  4.       <visualize>false</visualize>
  5.       <update_rate>40</update_rate>
  6.       <ray>
  7.         <scan>
  8.           <horizontal>
  9.             <samples>720</samples>
  10.             <resolution>1</resolution>
  11.             <min_angle>-1.570796</min_angle>
  12.             <max_angle>1.570796</max_angle>
  13.           </horizontal>
  14.         </scan>
  15.         <range>
  16.           <min>0.10</min>
  17.           <max>30.0</max>
  18.           <resolution>0.01</resolution>
  19.         </range>
  20.         <noise>
  21.           <type>gaussian</type>
  22.           <!-- Noise parameters based on published spec for Hokuyo laser
  23.                achieving "+-30mm" accuracy at range < 10m.  A mean of 0.0m and
  24.                stddev of 0.01m will put 99.7% of samples within 0.03m of the true
  25.                reading. -->
  26.           <mean>0.0</mean>
  27.           <stddev>0.01</stddev>
  28.         </noise>
  29.       </ray>
  30.       <plugin name="gazebo_ros_head_hokuyo_controller" filename="libgazebo_ros_laser.so">
  31.         <topicName>/rrbot/laser/scan</topicName>
  32.         <frameName>hokuyo_link</frameName>
  33.       </plugin>
  34.     </sensor>
  35.   </gazebo>

当然,实践是第一要义,这些插件用起来效果到底怎么样,还得你上手来试试。ROS中的很多机器人也提供了gazebo中仿真的模型和实验的案例,如果你还不太明白,直接运行这些已有的模型,看看别人写的代码,理解会更快。这里,推荐一个husky机器人的案例,可以在gazeboSLAM和自主导航。

clip_image006[4]

    husky机器人的主页是http://wiki.ros.org/Robots/Husky,仿真案例在Demo Applications那里。

 

 

参考链接:

http://gazebosim.org/tutorials?tut=ros_gzplugins

http://wiki.ros.org/Robots/Husky

 

 


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

本文链接地址: ROS探索总结(二十四)——使用gazebo中的插件

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

评论

37条评论
  1. Gravatar 头像

    ghy 回复

    古哥,我利用了husky开源包在gazebo中跑仿真时,用teleop控制其旋转运动时,它很难在仿真环境实现原地旋转,有时跑偏得挺厉害的;再是通过EKF(robot_localiztion包)融合imu和里程计实现定位时,在gazebo中让它跑一段距离在跑回来时,它在rviz中的位置也定位得差别有大;想问有什么方法可以将它仿真环境运动误差降低,同时提高它定位精度(还是想用4轮差速底盘,又不太想用slam去实现定位,尝试过添加gps效果改善的好像不是明显);可以通过调整哪些参数改善它吗,或者哪些开源包能用?真心感谢古哥!! 😀

    • 古月

      古月 回复

      @ghy 首先gazebo仿真本身就存在一些误差,其次使用的这些功能包也并不是完善的,就和实际机器人一样,首先提高传感器精度,然后优化定位算法,这些包光改参数提升的空间不大,往深的话还是得代码优化或替换

      • Gravatar 头像

        ghy 回复

        @古月 哦哦,谢谢谷哥!如果采用单线激光雷达/GPS/imu 做室外融合定位的话,有没有推荐的开源包.

  2. Gravatar 头像

    wxm 回复

    古月老师您好!我在运行roslaunch mbot_gazebo view_mbot_gazebo_play_ground.launch语句时,查看了rostopic list ,/clock/gazebo/link_states/gazebo/model_states/gazebo/parameter_descriptions/gazebo/parameter_updates
    /gazebo/set_link_state/gazebo/set_model_state/gazebo_gui/parameter_descriptions/gazebo_gui/parameter_updates
    /joint_states/rosout/rosout_agg/tf/tf_static,在运行roslaunch mbot_teleop mbot_teleop.launch 时候,机器人怎么也不动?

    • 古月

      古月 回复

      @wxm 话题当中没看到速度话题,看下运行gazebo时候终端有没有报错

  3. Gravatar 头像

    回复

    古老师你好,在学习你的书,我用你的代码跑6.5的例子时,其他的没问题,用键盘操作时机器人一点也不动,跑6.7的例子也是不动

  4. Gravatar 头像

    cq 回复

    古月老师你好,想问下如何查看gazebo里插件有哪些标签,当我接触到一个新的插件时,比如libgazebo_ros_diff_drive,要怎么查看有哪些标签和这些标签要如何设置呢?

    • 古月

      古月 回复

      @cq 主要看已有的例程、wiki、gazebo的官网

  5. Gravatar 头像

    吴杰 回复

    运行 roslaunch mrobot_gazebo view_mrobot_gazebo.launch 时,
    报错:
    [gazebo-2] process has died [pid 8435, exit code 255, cmd /opt/ros/kinetic/lib/gazebo_ros/gzserver -e ode /home/wj/wujie/src/mrobot_gazebo/worlds/playground.world __name:=gazebo __log:=/home/wj/.ros/log/4e09b742-cb67-11e8-a6d1-000c29f716ad/gazebo-2.log].
    log file: /home/wj/.ros/log/4e09b742-cb67-11e8-a6d1-000c29f716ad/gazebo-2*.log
    请您指导。

    • 古月

      古月 回复

      @吴杰 gazebo启动失败,重启几次,还不行的话就重新安装试试,这个看不到明确的错误信息,硬件显卡问题、软件依赖问题都有可能

  6. Gravatar 头像

    王小白 回复

    古月大神,我在用 差速 插件的时候,出现了tf_tree错误。不知道您遇到过没有
    问题描述:
    (1)我在xacro文件中,规定好了一套 link 之间的连接方式, [left_wheel_link]和 [right_wheel_link]的parent link 是 [base_link];
    (2)配置 差速插件时,定义[left_wheel_link]和 [right_wheel_link] 为插件中左右轮的节点 ;
    (3) rviz中发现 [left_wheel_link]和 [right_wheel_link]的parent节点不停在跳变;
    (4)用roswtf 检查,发现了tf冲突,大概意思是,[/gazebo]和[/robot_state_publisher] 同时将 [left_wheel_link]和 [right_wheel_link] 映射到了不同的 parent link。
    1. ERROR TF re-parenting contention:
    * reparenting of [left_wheel_link] to [base_link] by [/robot_state_publisher]
    * reparenting of [right_wheel_link] to [base_link] by [/robot_state_publisher]
    * reparenting of [right_wheel_link] to [base_footprint] by [/gazebo]
    * reparenting of [left_wheel_link] to [base_footprint] by [/gazebo]
    我尝试修改了 插件的robot命令空间等参数。。任然有这个问题,我很苦恼。请求大神指点一二,谢谢。

  7. Gravatar 头像

    王小白 回复

    古月大神,为什么差速插件中的base_footprint 用的是base_footprint,而不是base_link?

    • 古月

      古月 回复

      @王小白 这个和模型有关系,只要模型中有,其实用哪个都可以

  8. Gravatar 头像

    王小白 回复

    古月大神,我用libgazebo_ros_diff_drive时碰到一个tf_tree的问题。问题描述:我在xacro中维护的tf关系是(1)base_footprint->base_link-> [left_wheel_link],(2)base_footprint->base_link->[right_wheel_link]。用libgazebo_ros_diff_drive.so插件控制,配置好左右轮的节点为 [left_wheel_link] 和 [right_wheel_link]。但是我用roswtf检查时出现了 tf 冲突,大概意思是 /gazebo 和 /ros_state_publiser 同时维护了 [left_wheel_link] 和 [right_wheel_link]的坐标关系。
    reparenting of [left_wheel_link] to [base_link] by [/robot_state_publisher]
    * reparenting of [right_wheel_link] to [base_link] by [/robot_state_publisher]
    * reparenting of [right_wheel_link] to [base_footprint] by [/gazebo]
    * reparenting of [left_wheel_link] to [base_footprint] by [/gazebo]
    观察rivz的tf可以明显看到 [right_wheel_link] 和[left_wheel_link] 的根节点在不停改变。
    我很困惑,不知这个是什么问题造成的?古月大神遇到过吗?

    • 古月

      古月 回复

      @王小白 应该是同时在发布tf变换,检查下是否可以把其中一个关掉

  9. Gravatar 头像

    姚~ 回复

    你好,博文中描述的摄像头,我怎么才能才ros里面获取这个摄像头的视频流呢~

    • Gravatar 头像

      姚~ 回复

      @姚~ 已经知道,谢谢

      • Gravatar 头像

        回复

        @姚~ 您好,请问您是怎样获取的gazebo中摄像头的视频呢?

  10. Gravatar 头像

    小菜鸡 回复

    请问,下载好的模型放在哪里啊 ?有说gazebo/model,可是没有找到。。

      • Gravatar 头像

        小菜鸡 回复

        @古月 在home里面建就可以吗?在usr-share-gazebo里面新建不了文件夹,usr-include-gazebo7-gazebo里面也新建不了。。

        • Gravatar 头像

          .-' _..`. / .'_.'.' | .' (.)`. ;' ,_ `. .--.__________.' ; `.;-' | ./ / | | / `..'`-._ _____, ..' / | | | |\ \ / /| | 回复

          @小菜鸡 ctrl+h 可以显示隐藏文件夹,那个是.gazebo

  11. Gravatar 头像

    一代瓜皮 回复

    古月老师,我写了一个3轮的小车模型,左右各一个动力轮,前面一个万向轮。现在,轮子走一步卡一步,不知道给万向轮添加什么插件合适。

    • 古月

      古月 回复

      @一代瓜皮 万向轮是被动运动的,不需要插件,做一个固定关节或者转动关节就可以了

  12. Gravatar 头像

    王涛 回复

    古月大哥,你好,我在 roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch 时,报如下错误,月哥能否知道什么原因

    Warning [parser.cc:478] XML Attribute[frame] in element[pose] not defined in SDF, ignoring.
    Error [parser.cc:697] XML Element[torsional], child of element[friction] not defined in SDF. Ignoring.[friction]
    Error [parser.cc:688] Error reading element
    Error [parser.cc:688] Error reading element
    Error [parser.cc:688] Error reading element
    Error [parser.cc:688] Error reading element
    Error [parser.cc:688] Error reading element
    Error [parser.cc:688] Error reading element
    Error [parser.cc:348] Unable to read element

    • 古月

      古月 回复

      @王涛 你用的ros版本或者gazebo版本是不是不一样,看上去是版本导致的,先把这个launch里调用的地图删掉,用空环境试试。空环境可以的话,应该就是版本导致,那就自己做一个环境。

  13. Gravatar 头像

    小峰峰 回复

    古神,请问请问,怎么在gazebo中搭建道路公路模型??

    • 古月

      古月 回复

      @小峰峰 这个要看gazebo官网的教程,或者使用solidworks建模导出

  14. Gravatar 头像

    朱洪彪 回复

    你好,我现在在做实际的小车,想用实际的激光雷达代替虚拟的激光雷达,但是不明白怎么把实际的激光雷达和urdf中的相应关节联系起来,就像gazebo是用reference直接关联虚拟的传感器关节那样。

    • 古月

      古月 回复

      @朱洪彪 URDF模型中的激光雷达模型有一个激光坐标系,激光数据发布在这个坐标系下就可以了

  15. Gravatar 头像

    y 回复

    月哥,我用move_group和gazebo已经连接成功了,目标点位置,随机位置都没有问题,但只有笛卡尔坐标系的不行,我的圆弧,直线和样条曲线都是在笛卡尔坐标系中实现的,不知道是我不应该用笛卡尔坐标系规划不对,还是对于笛卡尔坐标系规划的设置有问题。

    • 古月

      古月 回复

      @y 笛卡尔空间的运动,最终还是通过IK反解为关节角度,才能驱动机器人运动

  16. Gravatar 头像

    丿灬安 回复

    “当然,你也可以自己编写需要的gazebo插件。”
    如果要自己编写gazebo插件,要怎么操作呢。。。网上好像都找不到相关教程啊

    • 古月

      古月 回复

      @丿灬安 gazebo插件暂时我也没写过,在gazebo的官网上找找看

发表评论

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.