当前位置:   article > 正文

0基础在ROS系统中实现RRT算法(四)URDF集成gazebo并搭建gazebo仿真环境_gazebo11 urdf

gazebo11 urdf

小白一枚,毕设突发奇想加入了ROS的内容,不知道自己还能不能毕业。以下均为通过看视频,翻博客等整理而成的笔记,并非我的原创。可能会出现一些报错的修改或者简单的代码是我自己做的。哈哈。

Gazebo是一款3D动态模拟器,用于显示机器人模型并创建仿真环境,能够在复杂的室内和室外环境中准确有效地模拟机器人。与游戏引擎提供高保真度的视觉模拟类似,Gazebo提供高保真度的物理模拟,其提供一整套传感器模型,以及对用户和程序非常友好的交互方式。

这篇主要学习:

  • URDF 与 Gazebo 的基本集成流程;
  • 如果要在 Gazebo 中显示机器人模型,URDF 需要做的一些额外配置;
  • 关于Gazebo仿真环境的搭建。比如建立房子、马路等。

如果 gazebo没有安装,请自行安装:

1.添加源:

  1. sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main"
  2. >
  3. /etc/apt/sources.list.d/gazebo-stable.list'
wget http://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add -

2.安装:

sudo apt update
  1. sudo apt install gazebo11
  2. sudo apt install libgazebo11-dev

一、URDF与Gazebo基本集成流程与相关设置

URDF 与 Gazebo 集成流程与 Rviz 实现类似,主要步骤如下:

  1. 创建功能包,导入依赖项

  2. 编写 URDF 或 Xacro 文件

  3. 启动 Gazebo 并显示机器人模型

接下来我们以创建盒状机器人显示在gazebo中为例,学习一下URDF集成gazebo。

1.创建功能包

在工作空间的src文件夹下打开终端进行以下操作,新建功能包urdf02_gazebo,并且导入依赖包: urdf、xacro、gazebo_ros、gazebo_ros_control、gazebo_plugins

catkin_create_pkg urdf02_gazebo urdf xacro gazebo_ros gazebo_ros_control gazebo_plugins

2.编写URDF文件

在urdf02_gazebo文件夹下新建urdf文件夹,在此文件夹下新建demo01_helloworld.urdf:

 接下来编写urdf文件,完整的文件内容:

  1. <robot name="mycar">
  2. <link name="base_link">
  3. <visual>
  4. <geometry>
  5. <box size="0.5 0.2 0.1" />
  6. </geometry>
  7. <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
  8. <material name="yellow">
  9. <color rgba="0.5 0.3 0.0 1" />
  10. </material>
  11. </visual>
  12. <collision>
  13. <geometry>
  14. <box size="0.5 0.2 0.1" />
  15. </geometry>
  16. <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
  17. </collision>
  18. <inertial>
  19. <origin xyz="0 0 0" />
  20. <mass value="6" />
  21. <inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1" />
  22. </inertial>
  23. </link>
  24. <gazebo reference="base_link">
  25. <material>Gazebo/Black</material>
  26. </gazebo>
  27. </robot>

接下来对上面的文件内容进行解释:

机器人的可视化部分visual:

盒装机器人,所以几何形状geometry选择为box,它在xyz上的尺寸分别是:0.5 ,0.2,0.1

颜色color为黄色,rgba为0.5 0.3 0,透明度为1

  1. <visual>
  2. <geometry>
  3. <box size="0.5 0.2 0.1" />
  4. </geometry>
  5. <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
  6. <material name="yellow">
  7. <color rgba="0.5 0.3 0.0 1" />
  8. </material>
  9. </visual>

连杆碰撞参数collision:碰撞参数用于检测机器人是否与外界环境发生碰撞。

如果是标准几何体,直接复制visual的geometry和origin即可。

  1. <collision>
  2. <geometry>
  3. <box size="0.5 0.2 0.1" />
  4. </geometry>
  5. <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
  6. </collision>

连杆惯性矩阵inertial:小车起步和刹车受到惯性影响,所以要设置一下惯性矩阵。

origin用于设置重心偏移量,如果连杆质量均匀,设置为0 0 0。

mass质量设置为 6 kg

inertial是在不同维度上的坐标值,实际应用时要根据情况进行计算来防止机器人打滑和翻车等,在这里我们先随意设置。

  1. <inertial>
  2. <origin xyz="0 0 0" />
  3. <mass value="6" />
  4. <inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1" />
  5. </inertial>

gazebo自己的颜色设置:

  1. <gazebo reference="base_link">
  2. <material>Gazebo/Black</material>
  3. </gazebo>

3.启动Gazebo并显示模型

在/DEMO05_WS/src/urdf02_gazebo目录下新建launch文件夹,在launch文件夹下新建demo01_helloworld.launch

我们要:

  • 将 Urdf 文件的内容加载到参数服务器:调用param标签,name="robot_description",textfile定位到 urdf02_gazebo/urdf/helloworld.urdf
  • 启动 gazebo:gazebo已经内置了launch文件empty_world.launch,是一个空的世界环境,我们在这里包含这个launch文件。
  • 在 gazebo 中显示机器人模型:    在 Gazebo 中加载一个机器人模型,该功能由 gazebo_ros 下的 spawn_model 提供:
        -urdf 加载的是 urdf 文件
        -model car 模型名称是 car
        -param robot_description 从参数 robot_description 中载入模型

launch文件内容:

  1. <launch>
  2. <param name="robot_description" textfile="$(find urdf02_gazebo)/urdf/helloworld.urdf" />
  3. <include file="$(find gazebo_ros)/launch/empty_world.launch" />
  4. <node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description" />
  5. </launch>

运行一下launch文件:

milk@milk:~/DEMO05_WS$ roslaunch urdf02_gazebo demo01_helloworld.launch

可以看到gazebo中显示的盒装机器人

 (不知道为什么我第一次不显示机器人模型,等我放弃了关机之后,再开机启动launch文件就显示出来了……)

二、URDF集成Gazebo实操

需求描述:将之前的机器人模型(xacro版)显示在 gazebo 中

结果演示:

实现流程:

  1. 需要编写封装惯性矩阵算法的 xacro 文件:我们的车轮、雷达等都要涉及到惯性矩阵的计算。

  2. 为机器人模型中的每一个 link 添加 collision 和 inertial 标签,并且重置颜色属性

  3. 在 launch 文件中启动 gazebo 并添加机器人模型

1.编写封装惯性矩阵算法的 xacro 文件

在/DEMO05_WS/src/urdf02_gazebo/urdf目录下新建用于封装惯性矩阵算法的文件:head.xacro

这个比较复杂,在这里直接复制文件内容:

  1. <robot name="base" xmlns:xacro="http://wiki.ros.org/xacro">
  2. <!-- Macro for inertia matrix -->
  3. <xacro:macro name="sphere_inertial_matrix" params="m r">
  4. <inertial>
  5. <mass value="${m}" />
  6. <inertia ixx="${2*m*r*r/5}" ixy="0" ixz="0"
  7. iyy="${2*m*r*r/5}" iyz="0"
  8. izz="${2*m*r*r/5}" />
  9. </inertial>
  10. </xacro:macro>
  11. <xacro:macro name="cylinder_inertial_matrix" params="m r h">
  12. <inertial>
  13. <mass value="${m}" />
  14. <inertia ixx="${m*(3*r*r+h*h)/12}" ixy = "0" ixz = "0"
  15. iyy="${m*(3*r*r+h*h)/12}" iyz = "0"
  16. izz="${m*r*r/2}" />
  17. </inertial>
  18. </xacro:macro>
  19. <xacro:macro name="Box_inertial_matrix" params="m l w h">
  20. <inertial>
  21. <mass value="${m}" />
  22. <inertia ixx="${m*(h*h + l*l)/12}" ixy = "0" ixz = "0"
  23. iyy="${m*(w*w + l*l)/12}" iyz= "0"
  24. izz="${m*(w*w + h*h)/12}" />
  25. </inertial>
  26. </xacro:macro>
  27. </robot>

 接下来把之前编写过的小车底盘、雷达、摄像头、汇总文件的xacro文件复制过来:

 并且在car.urdf.xacro中包含惯性矩阵文件:<xacro:include filename="head.xacro" />

  1. <robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro">
  2. <xacro:include filename="head.xacro" />
  3. <xacro:include filename="demo05_car_base.urdf.xacro" />
  4. <xacro:include filename="demo06_car_camera.urdf.xacro" />
  5. <xacro:include filename="demo07_car_laser.urdf.xacro" />
  6. </robot>

编写launch文件:在/DEMO05_WS/src/urdf02_gazebo/launch目录下新建car.launch

  1. <launch>
  2. <param name="robot_description" command="$(find xacro)/xacro $(find urdf02_gazebo)/urdf/car.urdf.xacro "/>
  3. <include file="$(find gazebo_ros)/launch/empty_world.launch" />
  4. <node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description" />
  5. </launch>

2.复制相关 xacro 文件,并设置 collision inertial 以及 color 等参数

在demo05_car_base.urdf.xacro中

设置底盘相关参数:

连杆:找到连杆相关代码

  1. <link name="base_link">
  2. <visual>
  3. <geometry>
  4. <cylinder radius="${base_link_radius}" length="${base_link_length}" />
  5. </geometry>
  6. <origin xyz="0 0 0" rpy="0 0 0" />
  7. <material name="yellow">
  8. <color rgba="0.5 0.3 0.0 0.5" />
  9. </material>
  10. </visual>
  11. </link>

添加collision:只要是规则的立方体,collision都和visual中的geometry和origin一样,直接复制。

添加interial:我们前面已经把interial封装成专门的宏。打开head.xacro,由于底盘是圆柱体,我们找到圆柱体的interial宏:cylinder_inertial_matrix

添加颜色

修改完成后的小车主体部分代码如下:

  1. <link name="base_link">
  2. <visual>
  3. <geometry>
  4. <cylinder radius="${base_link_radius}" length="${base_link_length}" />
  5. </geometry>
  6. <origin xyz="0 0 0" rpy="0 0 0" />
  7. <material name="yellow">
  8. <color rgba="0.5 0.3 0.0 0.5" />
  9. </material>
  10. </visual>
  11. <collision>
  12. <geometry>
  13. <cylinder radius="${base_link_radius}" length="${base_link_length}" />
  14. </geometry>
  15. <origin xyz="0 0 0" rpy="0 0 0" />
  16. </collision>
  17. <xacro:cylinder_inertial_matrix m= "${base_link_mass}" r= "${base_link_radius}" h = "${base_link_length}" />
  18. </link>
  19. <gazebo reference = "base_link">
  20. <material>Gazebo/Yellow</material>
  21. </gazebo>

保存之后,执行一下代码看一下gazebo中的机器人模型:

  1. milk@milk:~/DEMO05_WS$ source ./devel/setup.bash
  2. milk@milk:~/DEMO05_WS$ roslaunch urdf02_gazebo demo02_car.launch

 驱动轮:

  1. <!-- qudonglun -->
  2. <xacro:property name="wheel_radius" value="0.0325" />
  3. <xacro:property name="wheel_length" value="0.015" />
  4. <xacro:property name="wheel_mass" value="0.05" />
  5. <xacro:macro name="add_wheels" params="name flag">
  6. <link name="${name}_wheel">
  7. <visual>
  8. <geometry>
  9. <cylinder radius="${wheel_radius}" length="${wheel_length}" />
  10. </geometry>
  11. <origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0" />
  12. <material name="black" />
  13. </visual>
  14. <collosion>
  15. <geometry>
  16. <cylinder radius="${wheel_radius}" length="${wheel_length}" />
  17. </geometry>
  18. <origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0" />
  19. </collosion>
  20. <xacro:cylinder_inertial_matrix m= "${wheel_mass}" r= "${wheel_radius}" h = "${wheel_length}" />
  21. </link>
  22. <gazebo reference = "${name}_wheel">
  23. <material>Gazebo/Red</material>
  24. </gazebo>

支撑轮

  1. <link name="${name}_wheel">
  2. <visual>
  3. <geometry>
  4. <sphere radius="${support_wheel_radius}" />
  5. </geometry>
  6. <origin xyz="0 0 0" rpy="0 0 0" />
  7. <material name="black" />
  8. </visual>
  9. <collision>
  10. <geometry>
  11. <sphere radius="${support_wheel_radius}" />
  12. </geometry>
  13. <origin xyz="0 0 0" rpy="0 0 0" />
  14. </collision>
  15. <xacro:sphere_inertial_matrix m = "${support_wheel_mass}" r = "${support_wheel_radius}" />
  16. </link>
  17. <gazebo reference="${name}_wheel">
  18. <material>Gazebo/Black</material>
  19. </gazebo>

demo05_car_base.urdf.xacro整体代码:

  1. <robot name="my_base" xmlns:xacro="http://www.ros.org/wiki/xacro">
  2. <xacro:property name="PI" value="3.1415926"/>
  3. <material name="black">
  4. <color rgba="0.0 0.0 0.0 1.0" />
  5. </material>
  6. <xacro:property name="base_footprint_radius" value="0.001" /> <!-- base_footprint -->
  7. <xacro:property name="base_link_radius" value="0.1" /> <!-- base_link -->
  8. <xacro:property name="base_link_length" value="0.08" /> <!-- base_link -->
  9. <xacro:property name="base_link_mass" value="2" /> <!-- base_link -->
  10. <xacro:property name="earth_space" value="0.015" /> <!-- lidijianju -->
  11. <!-- dipan -->
  12. <link name="base_footprint">
  13. <visual>
  14. <geometry>
  15. <sphere radius="${base_footprint_radius}" />
  16. </geometry>
  17. </visual>
  18. </link>
  19. <link name="base_link">
  20. <visual>
  21. <geometry>
  22. <cylinder radius="${base_link_radius}" length="${base_link_length}" />
  23. </geometry>
  24. <origin xyz="0 0 0" rpy="0 0 0" />
  25. <material name="yellow">
  26. <color rgba="0.5 0.3 0.0 0.5" />
  27. </material>
  28. </visual>
  29. <collision>
  30. <geometry>
  31. <cylinder radius="${base_link_radius}" length="${base_link_length}" />
  32. </geometry>
  33. <origin xyz="0 0 0" rpy="0 0 0" />
  34. </collision>
  35. <xacro:cylinder_inertial_matrix m= "${base_link_mass}" r= "${base_link_radius}" h = "${base_link_length}" />
  36. </link>
  37. <gazebo reference = "base_link">
  38. <material>Gazebo/Yellow</material>
  39. </gazebo>
  40. <joint name="base_link2base_footprint" type="fixed">
  41. <parent link="base_footprint" />
  42. <child link="base_link" />
  43. <origin xyz="0 0 ${earth_space + base_link_length / 2 }" />
  44. </joint>
  45. <!-- qudonglun -->
  46. <xacro:property name="wheel_radius" value="0.0325" />
  47. <xacro:property name="wheel_length" value="0.015" />
  48. <xacro:property name="wheel_mass" value="0.05" />
  49. <xacro:macro name="add_wheels" params="name flag">
  50. <link name="${name}_wheel">
  51. <visual>
  52. <geometry>
  53. <cylinder radius="${wheel_radius}" length="${wheel_length}" />
  54. </geometry>
  55. <origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0" />
  56. <material name="black" />
  57. </visual>
  58. <collosion>
  59. <geometry>
  60. <cylinder radius="${wheel_radius}" length="${wheel_length}" />
  61. </geometry>
  62. <origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0" />
  63. </collosion>
  64. <xacro:cylinder_inertial_matrix m= "${wheel_mass}" r= "${wheel_radius}" h = "${wheel_length}" />
  65. </link>
  66. <gazebo reference = "${name}_wheel">
  67. <material>Gazebo/Red</material>
  68. </gazebo>
  69. <joint name="${name}_wheel2base_link" type="continuous">
  70. <parent link="base_link" />
  71. <child link="${name}_wheel" />
  72. <origin xyz="0 ${flag * base_link_radius} ${-(earth_space + base_link_length / 2 - wheel_radius) }" />
  73. <axis xyz="0 1 0" />
  74. </joint>
  75. </xacro:macro>
  76. <xacro:add_wheels name="left" flag="1" />
  77. <xacro:add_wheels name="right" flag="-1" />
  78. <!-- zhichenglun -->
  79. <xacro:property name="support_wheel_radius" value="0.0075" />
  80. <xacro:property name="support_wheel_mass" value="0.0100" />
  81. <xacro:macro name="add_support_wheel" params="name flag" >
  82. <link name="${name}_wheel">
  83. <visual>
  84. <geometry>
  85. <sphere radius="${support_wheel_radius}" />
  86. </geometry>
  87. <origin xyz="0 0 0" rpy="0 0 0" />
  88. <material name="black" />
  89. </visual>
  90. <collision>
  91. <geometry>
  92. <sphere radius="${support_wheel_radius}" />
  93. </geometry>
  94. <origin xyz="0 0 0" rpy="0 0 0" />
  95. </collision>
  96. <xacro:sphere_inertial_matrix m = "${support_wheel_mass}" r = "${support_wheel_radius}" />
  97. </link>
  98. <gazebo reference="${name}_wheel">
  99. <material>Gazebo/Black</material>
  100. </gazebo>
  101. <joint name="${name}_wheel2base_link" type="continuous">
  102. <parent link="base_link" />
  103. <child link="${name}_wheel" />
  104. <origin xyz="${flag * (base_link_radius - support_wheel_radius)} 0 ${-(base_link_length / 2 + earth_space / 2)}" />
  105. <axis xyz="1 1 1" />
  106. </joint>
  107. </xacro:macro>
  108. <xacro:add_support_wheel name="front" flag="1" />
  109. <xacro:add_support_wheel name="back" flag="-1" />
  110. </robot>

 gazebo:

 设置摄像头相关参数:demo06_car_camera.urdf.xacro

  1. <robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro">
  2. <xacro:property name = "camera_length" value = "0.02" />
  3. <xacro:property name = "camera_width" value = "0.05" />
  4. <xacro:property name = "camera_height" value = "0.05" />
  5. <xacro:property name = "camera_mass" value = "0.01" />
  6. <xacro:property name = "joint_camera_x" value = "0.08" />
  7. <xacro:property name = "joint_camera_y" value = "0" />
  8. <xacro:property name = "joint_camera_z" value = "${base_link_length / 2 + camera_height / 2}" />
  9. <link name = "camera">
  10. <visual>
  11. <geometry>
  12. <box size = "${camera_length} ${ camera_width} ${camera_height}" />
  13. </geometry>
  14. <material name = "black ">
  15. <color rgba = "0 0 0 0.8" />
  16. </material>
  17. </visual>
  18. <collision>
  19. <geometry>
  20. <box size = "${camera_length} ${ camera_width} ${camera_height}" />
  21. </geometry>
  22. </collision>
  23. <xacro:Box_inertial_matrix m = "${camera_mass}" l = "${camera_length}" w = "${camera_width}" h = "${camera_height}" />
  24. </link>
  25. <gazebo reference = "camera">
  26. <material>Gazebo/Blue</material>
  27. </gazebo>
  28. <joint name = "camera2base" type = "fixed">
  29. <parent link = "base_link" />
  30. <child link = "camera" />
  31. <origin xyz ="${joint_camera_x} ${joint_camera_y} ${joint_camera_z}" rpy= "0 0 0" />
  32. </joint>
  33. </robot>

设置雷达相关参数:demo07_car_laser.urdf.xacro

  1. <robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro">
  2. <xacro:property name = "support_radius" value = "0.01" />
  3. <xacro:property name = "support_length" value = "0.15" />
  4. <xacro:property name = "support_mass" value = "0.1" />
  5. <xacro:property name = "laser_radius" value = "0.03" />
  6. <xacro:property name = "laser_length" value = "0.05" />
  7. <xacro:property name = "laser_mass" value = "0.02" />
  8. <xacro:property name = "joint_support_x" value = "0" />
  9. <xacro:property name = "joint_support_y" value = "0" />
  10. <xacro:property name = "joint_support_z" value = "${base_link_length / 2 +support_length / 2}" />
  11. <xacro:property name = "joint_laser_x" value = "0" />
  12. <xacro:property name = "joint_laser_y" value = "0" />
  13. <xacro:property name = "joint_laser_z" value = "${support_length / 2 + laser_length / 2}" />
  14. <link name ="support">
  15. <visual>
  16. <geometry>
  17. <cylinder radius = "${support_radius}" length = "${support_length}"/>
  18. </geometry>
  19. <material name = "yellow">
  20. <color rgba = "0.8 0.5 0.0 0.5" />
  21. </material>
  22. </visual>
  23. <collision>
  24. <geometry>
  25. <cylinder radius = "${support_radius}" length = "${support_length}"/>
  26. </geometry>
  27. </collision>
  28. <xacro:cylinder_inertial_matrix m = "${support_mass}" r ="${support_radius}" h = "${support_length}" />
  29. </link>
  30. <gazebo reference = "support">
  31. <material>Gazebo/Gray</material>
  32. </gazebo>
  33. <joint name = "support2base" type = "fixed">
  34. <parent link ="base_link" />
  35. <child link = "support"/>
  36. <origin xyz = "${joint_support_x} ${joint_support_y} ${joint_support_z}" rpy ="0 0 0" />
  37. </joint>
  38. <link name ="laser">
  39. <visual>
  40. <geometry>
  41. <cylinder radius = "${laser_radius}" length = "${laser_length}"/>
  42. </geometry>
  43. <material name = "black">
  44. <color rgba = "0.0 0.0 0.0 0.5" />
  45. </material>
  46. </visual>
  47. <collision>
  48. <geometry>
  49. <cylinder radius = "${laser_radius}" length = "${laser_length}"/>
  50. </geometry>
  51. </collision>
  52. <xacro:cylinder_inertial_matrix m="${laser_mass}" r="${laser_radius}" h="${laser_length}" />
  53. </link>
  54. <gazebo reference = "laser">
  55. <material>Gazebo/Black</material>
  56. </gazebo>
  57. <joint name = "laser2support" type = "fixed">
  58. <parent link ="support" />
  59. <child link = "laser"/>
  60. <origin xyz = "${joint_laser_x} ${joint_laser_y} ${joint_laser_z}" rpy ="0 0 0" />
  61. </joint>
  62. </robot>

gazebo:

三、Gazebo仿真环境搭建

到目前为止,我们已经可以将机器人模型显示在 Gazebo 之中了,但是当前默认情况下,在 Gazebo 中机器人模型是在 empty world 中,并没有类似于房间、家具、道路、树木... 之类的仿真物,如何在 Gazebo 中创建仿真环境呢?

Gazebo 中创建仿真实现方式有两种:

  • 方式1: 直接添加内置组件创建仿真环境

  • 方式2: 手动绘制仿真环境(更为灵活)

也还可以直接下载使用官方或第三方提高的仿真环境插件。

1.创建仿真环境

首先打开新终端,启动roscore

$roscore

然后启动gazebo

$rosrun gazebo_ros gazebo

 点击上边栏的立方体添加

 2.自定义仿真环境

启动 gazebo ,打开构建面板,绘制仿真环境

 

保存构建的环境

点击: 左上角 file ---> Save (保存路径功能包下的: models)

然后 file ---> Exit Building Editor

 保存为 world 文件

可以像方式1一样再添加一些插件,然后保存为 world 文件(保存路径功能包下的: worlds)

3.使用官方提供的插件

 还可以下载官方提供的插件,下载地址:

https://github.com/osrf/gazebo_models

解压后的文件中有大量的模型:

 这些模型占用空间太大了,我下载后只留下了几个自己需要的模型。

四、启动gazebo并控制机器人运动

1.编写一个单独的 xacro 文件,为机器人模型添加传动装置以及控制器

1.1 为 joint 添加传动装置以及控制器

两轮差速配置

  1. <robot name="my_car_move" xmlns:xacro="http://wiki.ros.org/xacro">
  2. <!-- 传动实现:用于连接控制器与关节 -->
  3. <xacro:macro name="joint_trans" params="joint_name">
  4. <!-- Transmission is important to link the joints and the controller -->
  5. <transmission name="${joint_name}_trans">
  6. <type>transmission_interface/SimpleTransmission</type>
  7. <joint name="${joint_name}">
  8. <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
  9. </joint>
  10. <actuator name="${joint_name}_motor">
  11. <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
  12. <mechanicalReduction>1</mechanicalReduction>
  13. </actuator>
  14. </transmission>
  15. </xacro:macro>
  16. <!-- 每一个驱动轮都需要配置传动装置 -->
  17. <xacro:joint_trans joint_name="left_wheel2base_link" />
  18. <xacro:joint_trans joint_name="right_wheel2base_link" />
  19. <!-- 控制器 -->
  20. <gazebo>
  21. <plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so">
  22. <rosDebugLevel>Debug</rosDebugLevel>
  23. <publishWheelTF>true</publishWheelTF>
  24. <robotNamespace>/</robotNamespace>
  25. <publishTf>1</publishTf>
  26. <publishWheelJointState>true</publishWheelJointState>
  27. <alwaysOn>true</alwaysOn>
  28. <updateRate>100.0</updateRate>
  29. <legacyMode>true</legacyMode>
  30. <leftJoint>left_wheel2base_link</leftJoint> <!-- 左轮 -->
  31. <rightJoint>right_wheel2base_link</rightJoint> <!-- 右轮 -->
  32. <wheelSeparation>${base_link_radius * 2}</wheelSeparation> <!-- 车轮间距 -->
  33. <wheelDiameter>${wheel_radius * 2}</wheelDiameter> <!-- 车轮直径 -->
  34. <broadcastTF>1</broadcastTF>
  35. <wheelTorque>30</wheelTorque>
  36. <wheelAcceleration>1.8</wheelAcceleration>
  37. <commandTopic>cmd_vel</commandTopic> <!-- 运动控制话题 -->
  38. <odometryFrame>odom</odometryFrame>
  39. <odometryTopic>odom</odometryTopic> <!-- 里程计话题 -->
  40. <robotBaseFrame>base_footprint</robotBaseFrame> <!-- 根坐标系 -->
  41. </plugin>
  42. </gazebo>
  43. </robot>

1.2 xacro文件集成

最后还需要将上述 xacro 文件集成进总的机器人模型文件,代码示例如下:

  1. <!-- 组合小车底盘与摄像头 -->
  2. <robot name="my_car_camera" xmlns:xacro="http://wiki.ros.org/xacro">
  3. <xacro:include filename="my_head.urdf.xacro" />
  4. <xacro:include filename="my_base.urdf.xacro" />
  5. <xacro:include filename="my_camera.urdf.xacro" />
  6. <xacro:include filename="my_laser.urdf.xacro" />
  7. <xacro:include filename="move.urdf.xacro" />
  8. </robot>

2.编写launch文件:demo03_env.launch

  1. <launch>
  2. <!--1.需要在参数服务器中载入 urdf -->
  3. <param name="robot_description" command="$(find xacro)/xacro $(find urdf02_gazebo)/urdf/car.urdf.xacro" />
  4. <!--2.启动 Gazebo 仿真环境 -->
  5. <include file="$(find gazebo_ros)/launch/empty_world.launch" >
  6. <arg name="world_name" value="$(find urdf02_gazebo)/worlds/my_world/model.world" />
  7. </include>
  8. <!--3.在 Gazebo 中添加机器人模型 -->
  9. <node pkg="gazebo_ros" type="spawn_model" name="spawn_model" args="-urdf -model car -param robot_description" />
  10. </launch>

3.启动 launch 文件

  1. $ source ./devel/setup.bash
  2. $ roslaunch urdf02_gazebo demo03_env.launch

使用 topic list 查看话题列表:

$ rostopic list

会发现多了 /cmd_vel 然后发布 vmd_vel 消息控制即可

使用命令控制(或者可以编写单独的节点控制)

rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: 0.2, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}}'

 机器人开始做圆周运动。

五、rviz查看里程计信息

1.启动 Rviz

launch文件:demo04_sensor.launch

  1. <launch>
  2. <!-- 启动 rviz -->
  3. <node pkg="rviz" type="rviz" name="rviz" />
  4. <!-- 关节以及机器人状态发布节点 -->
  5. <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
  6. <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
  7. </launch>

$ roslaunch urdf02_gazebo demo04_sensor.launch

 2.添加组件

添加robotmodel和odometry组件

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/789447
推荐阅读
相关标签
  

闽ICP备14008679号