ROS——Gazebo仿真——四轮小车(SmartCar)详细教程

小鱼儿 2022-03-12 08:46 1929阅读 0赞

文章目录

    1. 教程描述
    1. 准备工作
    • 2.1 创建工作空间
    • 2.2 创建ROS硬件描述包
    1. 小车模型示意图
    1. 创建urdf描述文件
    1. 创建launch文件
    1. rviz模型展示
    • 6.1 添加Displays
    • 6.2 修改参数
    1. 可能遇到的问题
    • 7.1 No transform from [base_link] to [map].
  • 参考文献:

1. 教程描述

  本教程参考古月前辈的SmartCar教程,教程写的非常全面,对自己的ROS学习有很大的帮助,在此先谢过。在学习的过程中发现他的教程比较精简,而且使用的ROS版本比较旧,因此在看着教程复现的过程中会出现一些麻烦,因此便想着在他教程的基础上丰富下内容,增加一些个人的见解,同时将学习过程中遇到的问题、问题的解决方法一并写出来,供其他新学者参考,若有问题之处还望大家指出,以便可以即使纠正。

  主要实现内容为在ROS环境下基于Gazebo仿真软件创建一个四轮小车,并实现小车的控制,如下图所示,接下来教程将会进行详细解释。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Nzc1Mjkz_size_16_color_FFFFFF_t_70


2. 准备工作

2.1 创建工作空间

创建ROS工作空间,命名为SmartCar,并在该工作空间中创建src文件夹。

  1. mkdir -p /SmartCar/src

初始化工作空间

  1. cd /SmartCar
  2. catkin_init_workspace

2.2 创建ROS硬件描述包


  1. cd /src
  2. roscreate-pkg smartcar_description urdf

3. 小车模型示意图

  小车的车体主要由以下两部分构成:25cm x 16cm x 5cm的长方体作为小车的车体,直径5cm、高2cm的圆柱作为小车的轮子,四个轮子尺寸一样,只是安装位置不同。

20190305173439988.png


4. 创建urdf描述文件

smartcar_description文件夹下创建urdf文件夹,并创建智能车的描述文件smartcar.urdf,写入下述代码:

  1. <?xml version="1.0"?>
  2. <robot name="smartcar">
  3. <link name="base_link">
  4. <visual>
  5. <geometry>
  6. <box size="0.25 .16 .05"/>
  7. </geometry>
  8. <origin rpy="0 0 1.57075" xyz="0 0 0"/>
  9. <material name="blue">
  10. <color rgba="0 .5 .8 1"/>
  11. </material>
  12. </visual>
  13. </link>
  14. <link name="right_front_wheel">
  15. <visual>
  16. <geometry>
  17. <cylinder length=".02" radius="0.025"/>
  18. </geometry>
  19. <material name="black">
  20. <color rgba="0 0 0 1"/>
  21. </material>
  22. </visual>
  23. </link>
  24. <joint name="right_front_wheel_joint" type="continuous">
  25. <axis xyz="0 0 1"/>
  26. <parent link="base_link"/>
  27. <child link="right_front_wheel"/>
  28. <origin rpy="0 1.57075 0" xyz="0.08 0.1 -0.03"/>
  29. <limit effort="100" velocity="100"/>
  30. <joint_properties damping="0.0" friction="0.0"/>
  31. </joint>
  32. <link name="right_back_wheel">
  33. <visual>
  34. <geometry>
  35. <cylinder length=".02" radius="0.025"/>
  36. </geometry>
  37. <material name="black">
  38. <color rgba="0 0 0 1"/>
  39. </material>
  40. </visual>
  41. </link>
  42. <joint name="right_back_wheel_joint" type="continuous">
  43. <axis xyz="0 0 1"/>
  44. <parent link="base_link"/>
  45. <child link="right_back_wheel"/>
  46. <origin rpy="0 1.57075 0" xyz="0.08 -0.1 -0.03"/>
  47. <limit effort="100" velocity="100"/>
  48. <joint_properties damping="0.0" friction="0.0"/>
  49. </joint>
  50. <link name="left_front_wheel">
  51. <visual>
  52. <geometry>
  53. <cylinder length=".02" radius="0.025"/>
  54. </geometry>
  55. <material name="black">
  56. <color rgba="0 0 0 1"/>
  57. </material>
  58. </visual>
  59. </link>
  60. <joint name="left_front_wheel_joint" type="continuous">
  61. <axis xyz="0 0 1"/>
  62. <parent link="base_link"/>
  63. <child link="left_front_wheel"/>
  64. <origin rpy="0 1.57075 0" xyz="-0.08 0.1 -0.03"/>
  65. <limit effort="100" velocity="100"/>
  66. <joint_properties damping="0.0" friction="0.0"/>
  67. </joint>
  68. <link name="left_back_wheel">
  69. <visual>
  70. <geometry>
  71. <cylinder length=".02" radius="0.025"/>
  72. </geometry>
  73. <material name="black">
  74. <color rgba="0 0 0 1"/>
  75. </material>
  76. </visual>
  77. </link>
  78. <joint name="left_back_wheel_joint" type="continuous">
  79. <axis xyz="0 0 1"/>
  80. <parent link="base_link"/>
  81. <child link="left_back_wheel"/>
  82. <origin rpy="0 1.57075 0" xyz="-0.08 -0.1 -0.03"/>
  83. <limit effort="100" velocity="100"/>
  84. <joint_properties damping="0.0" friction="0.0"/>
  85. </joint>
  86. <link name="head">
  87. <visual>
  88. <geometry>
  89. <box size=".02 .03 .03"/>
  90. </geometry>
  91. <material name="white">
  92. <color rgba="1 1 1 1"/>
  93. </material>
  94. </visual>
  95. </link>
  96. <joint name="tobox" type="fixed">
  97. <parent link="base_link"/>
  98. <child link="head"/>
  99. <origin xyz="0 0.08 0.025"/>
  100. </joint>
  101. </robot>

  .urdf文件主要有两部分构成:<link><joint>,两者的关系如下图所示。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Nzc1Mjkz_size_16_color_FFFFFF_t_70 1

  其中<link>...</link>主要描述模型硬件结构的属性信息,里面对轮子的形状、颜色、质量、惯性等信息进行了语言描述;<joint>...</joint>可以理解为两个<link>...</link>之间的连接间,如图中蓝色框所示,主要描述两个…之间的位置等固定连接信息。
  文中的结构可以简化为下面的格式,定义一个robot标签,在标签中定义base_linkright_front_wheel两个标签,两个标签的后面跟着描述base_linkright_front_wheel关系的joint

  1. <?xml version="1.0"?>
  2. <robot name="smartcar">
  3. <link name="base_link">
  4. ...
  5. </link>
  6. <link name="right_front_wheel">
  7. ...
  8. </link>
  9. <joint name="left_front_wheel_joint" type="continuous">
  10. ...
  11. </joint>
  12. </robot>

在link中定义了小车的外观,以base_link为例。

  1. <link name="base_link">
  2. <visual> <!--视觉信息-->
  3. <geometry> <!--几何形状信息-->
  4. <box size="0.25 .16 .05"/> <!--形状为矩形盒子(还有其他可选形状,如圆、圆柱等),大小为"0.25 0.16 0.05"-->
  5. </geometry>
  6. <origin rpy="0 0 1.57075" xyz="0 0 0"/> <!--rpy代表欧拉角,绕着z轴转动90度;xyz代表在xyz三轴上的位移-->
  7. <material name="blue"> <!--材料信息-->
  8. <color rgba="0 .5 .8 1"/> <!--定义颜色信息-->
  9. </material>
  10. </visual>
  11. </link>

在每个信息标签中除了上述的类型外还有其他的信息可以增加,需要的请自行查阅。

在joint中定义两个link的连接信息,以right_front_wheel_joint为例。

  1. <joint name="right_front_wheel_joint" type="continuous">
  2. <axis xyz="0 0 1"/>
  3. <parent link="base_link"/>
  4. <child link="right_front_wheel"/> <!--将子link(right_front_wheel)连接到父link(base_link)上-->
  5. <origin rpy="0 1.57075 0" xyz="0.08 0.1 -0.03"/> <!--连接位置-->
  6. <limit effort="100" velocity="100"/>
  7. <joint_properties damping="0.0" friction="0.0"/>
  8. </joint>

对上述信息不太清楚的朋友可以再查阅相关资料,或者自己动手修改参数试试便知。


5. 创建launch文件

  在/smartcar_description文件夹下建立launch文件夹,并创建智能车的launch文件 base.urdf.rviz.launch,描述代码如下:

  1. <launch>
  2. <arg name="model" />
  3. <arg name="gui" default="False" />
  4. <param name="robot_description" textfile="$(find smartcar_description)/urdf/smartcar.urdf" />
  5. <param name="use_gui" value="$(arg gui)"/>
  6. <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node>
  7. <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
  8. <node name="rviz" pkg="rviz" type="rviz" args="-d $(find urdf_tutorial)/urdf.vcg" />
  9. </launch>

在旧版本ROS中使用该语句启动rviz

  1. <node name="rviz" pkg="rviz" type="rviz" args="-d $(find urdf_tutorial)/urdf.vcg" />

在旧版本ROS中使用该语句启动rviz

  1. <node name="rviz" pkg="rviz" type="rviz" args="-d $(find urdf_tutorial)/urdf.vcg" />

6. rviz模型展示

在工作空间/SmartCar路径下,先source下工作空间的路径

  1. source devel/setup.bash

然后运行.launch文件

  1. roslaunch servo_description base.urdf.rviz.launch

这时候你会发现rviz会自动打开,rviz的配置如下:

6.1 添加Displays

自动打开的rviz如下图所示,需要我们自己添加现实的内容,从而显示出小车

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Nzc1Mjkz_size_16_color_FFFFFF_t_70 2

点击左下角的Add添加显示内容到Display

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Nzc1Mjkz_size_16_color_FFFFFF_t_70 3

选择RobotModel,并点击确认添加到Display

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Nzc1Mjkz_size_16_color_FFFFFF_t_70 4

6.2 修改参数

添加过RobotModel后rviz显示如下图,这时候还不可以正常显示小车,可以点击Display中“RobotModel”选项,并点击“Status:Error”查看详细错误提示,提示为“No transform from [base_link] to [map].”类型,这是需要修改Fixed Frame选项。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Nzc1Mjkz_size_16_color_FFFFFF_t_70 5

修改Fixed Framebase_link即可正常显示,如下图。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2Nzc1Mjkz_size_16_color_FFFFFF_t_70 6


7. 可能遇到的问题

  • 没有修改Fixed Frame,详情请看6.2章节。
  • .urdf文件有误,可以使用下述语句查看

    check_urdf smartcar.urdf


参考文献:

古月老师博客

发表评论

表情:
评论列表 (有 0 条评论,1929人围观)

还没有评论,来说两句吧...

相关阅读