当前位置:   article > 正文

ROS机器人小车建模仿真与SLAM(2)

ROS机器人小车建模仿真与SLAM(2)

目录

一、在 Rviz 中显示一个盒状机器人 

1.1 创建ROS功能包 

1.2 在 launch 文件中集成 URDF 与 Rviz 

1.3 在 Rviz 中显示机器人模型 

1.4 优化 rviz 启动 

二、创建一个四轮圆柱状机器人模型

2.1 配置urdf和launch文件

2.2 URDF优化_xacro

2.2.1 配置xacro文件

2.2.3 集成launch文件

2.3 添加摄像头和雷达传感器

2.3.1 摄像头和雷达 Xacro 文件实现

2.3.2 组合底盘摄像头与雷达的 xacro 文件

2.4 launch 文件 

参考 


一 . 参考网上资料,在ROS中完成一个机器小车的模型创建,传感器配置,仿真环境的设置,并控制机器小车进行运动。

参考:

  1.   【Autolabor初级教程】ROS机器人入门  【Autolabor初级教程】ROS机器人入门_哔哩哔哩_bilibili

  2.  Introduction · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程

  3. Scout mini 仿真指南  松灵学院 | Scout mini 仿真指南_松灵开发社区-CSDN博客

二.  参考课件资料,在ROS中利用ROS工具完成你手机广角津贴(畸变较为严重)的标定,写出详细过程和输出结果。

三. 在ROS下,下载编译orbslam2代码,并在kitti数据集的一个序列图像中进行实验。

一、在 Rviz 中显示一个盒状机器人 

1.1 创建ROS功能包 

找一个空闲地方,新建文件夹catkin_ws01,输入以下命令
 

  1. mkdir catkin_ws01
  2. cd catkin_ws01/
  3. mkdir src
  4. cd src/
  5. catkin_init_workspace

导入依赖,在src目录下输入以下命令:

  1. catkin_create_pkg jubot_demo urdf xacro #创建功能包、添加依赖
  2. cd jubot_demo/
  3. mkdir urdf
  4. mkdir launch
  5. mkdir meshes #存放渲染机器人模型的文件
  6. mkdir config #存放rviz配置的文件

urdf文件夹中添加一个box_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. </visual>
  8. </link>
  9. </robot>

1.2 在 launch 文件中集成 URDF 与 Rviz 

 在launch目录下,新建一个 box_launch.launch 文件,该 launch 文件需要启动 Rviz,并导入 urdf 文件,Rviz 启动后可以自动载入解析urdf文件,并显示机器人模型,核心问题:如何导入 urdf 文件? 在 ROS 中,可以将 urdf 文件的路径设置到参数服务器,使用的参数名是:robot_description,代码如下:

  1. <launch>
  2. <!-- 设置参数 -->
  3. <param name="robot_description" textfile="$(find jubot_demo)/urdf/box_urdf.urdf" />
  4. <!-- 启动 rviz -->
  5. <node pkg="rviz" type="rviz" name="rviz" />
  6. </launch>

1.3 在 Rviz 中显示机器人模型 

先进行编译,再配置环境变量,然后启动rviz

  1. catkin_make
  2. catkin_make install
  3. source devel/setup.bash
  4. echo $ROS_PACKAGE_PATH 

启动launch文件

roslaunch src/jubot_demo/launch/box_launch.launch

rviz 启动后,会发现并没有盒装的机器人模型,这是因为默认情况下没有添加机器人显示组件,需要手动添加,添加方式如下

 

1.4 优化 rviz 启动 

重复启动launch文件时,Rviz 之前的组件配置信息不会自动保存,需要重复执行步骤4的操作,为了方便使用,可以使用如下方式优化:

首先,将当前配置保存进config目录

然后,launch文件中 Rviz 的启动配置添加参数:args,值设置为-d 配置文件路径

  1. <launch>
  2. <param name="robot_description" textfile="$(find 包名)/urdf/urdf/urdf01_HelloWorld.urdf" />
  3. <node pkg="rviz" type="rviz" name="rviz" args="-d $(find 报名)/config/rviz/show_mycar.rviz" />
  4. </launch>

再启动时,就可以包含之前的组件配置了,使用更方便快捷。

二、创建一个四轮圆柱状机器人模型

2.1 配置urdf和launch文件

在一的urdf和launch文件基础上进行修改

box_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. </visual>
  8. </link>
  9. </robot> -->
  10. <robot name="mycar">
  11. <!-- 设置 base_footprint -->
  12. <link name="base_footprint">
  13. <visual>
  14. <geometry>
  15. <sphere radius="0.001" />
  16. </geometry>
  17. </visual>
  18. </link>
  19. <!-- 添加底盘 -->
  20. <!--
  21. 参数
  22. 形状:圆柱
  23. 半径:10 cm
  24. 高度:8 cm
  25. 离地:1.5 cm
  26. -->
  27. <link name="base_link">
  28. <visual>
  29. <geometry>
  30. <cylinder radius="0.1" length="0.08" />
  31. </geometry>
  32. <origin xyz="0 0 0" rpy="0 0 0" />
  33. <material name="yellow">
  34. <color rgba="0.8 0.3 0.1 0.5" />
  35. </material>
  36. </visual>
  37. </link>
  38. <joint name="base_link2base_footprint" type="fixed">
  39. <parent link="base_footprint" />
  40. <child link="base_link"/>
  41. <origin xyz="0 0 0.055" />
  42. </joint>
  43. <!-- 添加驱动轮 -->
  44. <!-- 添加驱动轮 -->
  45. <!--
  46. 驱动轮是侧翻的圆柱
  47. 参数
  48. 半径: 3.25 cm
  49. 宽度: 1.5 cm
  50. 颜色: 黑色
  51. 关节设置:
  52. x = 0
  53. y = 底盘的半径 + 轮胎宽度 / 2
  54. z = 离地间距 + 底盘长度 / 2 - 轮胎半径 = 1.5 + 4 - 3.25 = 2.25(cm)
  55. axis = 0 1 0
  56. -->
  57. <link name="left_wheel">
  58. <visual>
  59. <geometry>
  60. <cylinder radius="0.0325" length="0.015" />
  61. </geometry>
  62. <origin xyz="0 0 0" rpy="1.5705 0 0" />
  63. <material name="black">
  64. <color rgba="0.0 0.0 0.0 1.0" />
  65. </material>
  66. </visual>
  67. </link>
  68. <joint name="left_wheel2base_link" type="continuous">
  69. <parent link="base_link" />
  70. <child link="left_wheel" />
  71. <origin xyz="0 0.1 -0.0225" />
  72. <axis xyz="0 1 0" />
  73. </joint>
  74. <link name="right_wheel">
  75. <visual>
  76. <geometry>
  77. <cylinder radius="0.0325" length="0.015" />
  78. </geometry>
  79. <origin xyz="0 0 0" rpy="1.5705 0 0" />
  80. <material name="black">
  81. <color rgba="0.0 0.0 0.0 1.0" />
  82. </material>
  83. </visual>
  84. </link>
  85. <joint name="right_wheel2base_link" type="continuous">
  86. <parent link="base_link" />
  87. <child link="right_wheel" />
  88. <origin xyz="0 -0.1 -0.0225" />
  89. <axis xyz="0 1 0" />
  90. </joint>
  91. <!-- 添加万向轮(支撑轮) -->
  92. <!-- 添加万向轮(支撑轮) -->
  93. <!--
  94. 参数
  95. 形状: 球体
  96. 半径: 0.75 cm
  97. 颜色: 黑色
  98. 关节设置:
  99. x = 自定义(底盘半径 - 万向轮半径) = 0.1 - 0.0075 = 0.0925(cm)
  100. y = 0
  101. z = 底盘长度 / 2 + 离地间距 / 2 = 0.08 / 2 + 0.015 / 2 = 0.0475 axis= 1 1 1
  102. -->
  103. <link name="front_wheel">
  104. <visual>
  105. <geometry>
  106. <sphere radius="0.0075" />
  107. </geometry>
  108. <origin xyz="0 0 0" rpy="0 0 0" />
  109. <material name="black">
  110. <color rgba="0.0 0.0 0.0 1.0" />
  111. </material>
  112. </visual>
  113. </link>
  114. <joint name="front_wheel2base_link" type="continuous">
  115. <parent link="base_link" />
  116. <child link="front_wheel" />
  117. <origin xyz="0.0925 0 -0.0475" />
  118. <axis xyz="1 1 1" />
  119. </joint>
  120. <link name="back_wheel">
  121. <visual>
  122. <geometry>
  123. <sphere radius="0.0075" />
  124. </geometry>
  125. <origin xyz="0 0 0" rpy="0 0 0" />
  126. <material name="black">
  127. <color rgba="0.0 0.0 0.0 1.0" />
  128. </material>
  129. </visual>
  130. </link>
  131. <joint name="back_wheel2base_link" type="continuous">
  132. <parent link="base_link" />
  133. <child link="back_wheel" />
  134. <origin xyz="-0.0925 0 -0.0475" />
  135. <axis xyz="1 1 1" />
  136. </joint>
  137. </robot>

box_launch.launch文件

  1. <launch>
  2. <!-- 将 urdf 文件内容设置进参数服务器 -->
  3. <param name="robot_description" textfile="$(find jubot_demo)/urdf/box_urdf.urdf" />
  4. <!-- 启动 rviz -->
  5. <!-- <node pkg="rviz" type="rviz" name="rviz" /> -->
  6. <node pkg="rviz" type="rviz" name="rviz" args="-d $(find jubot_demo)/config/rviz/show_four_wheel_car.rviz" />
  7. <!-- 启动机器人状态和关节状态发布节点 -->
  8. <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />
  9. <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" />
  10. <!-- 启动图形化的控制关节运动节点 -->
  11. <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" />
  12. </launch>

然后启动roslaunch,在rviz中显示机器人模型: 

  1. catkin_make
  2. catkin_make install
  3. source devel/setup.bash
  4. echo $ROS_PACKAGE_PATH 
  5. roslaunch src/jubot_demo/launch/box_launch.launch

2.2 URDF优化_xacro

前面 URDF 文件构建机器人模型的过程中,存在若干问题。

问题1:在设计关节的位置时,需要按照一定的公式计算,公式是固定的,但是在 URDF 中依赖于人工计算,存在不便,容易计算失误,且当某些参数发生改变时,还需要重新计算。


问题2:URDF 中的部分内容是高度重复的,驱动轮与支撑轮的设计实现,不同轮子只是部分参数不同,形状、颜色、翻转量都是一致的,在实际应用中,构建复杂的机器人模型时,更是易于出现高度重复的设计,按照一般的编程涉及到重复代码应该考虑封装。

如果在编程语言中,可以通过变量结合函数直接解决上述问题,在 ROS 中,已经给出了类似编程的优化方案,称之为:Xacro

概念
Xacro 是 XML Macros 的缩写,Xacro 是一种 XML 宏语言,是可编程的 XML。

原理
Xacro 可以声明变量,可以通过数学运算求解,使用流程控制控制执行顺序,还可以通过类似函数的实现,封装固定的逻辑,将逻辑中需要的可变的数据以参数的方式暴露出去,从而提高代码复用率以及程序的安全性。

作用
较之于纯粹的 URDF 实现,可以编写更安全、精简、易读性更强的机器人模型文件,且可以提高编写效率。

2.2.1 配置xacro文件

在urdf文件夹下新建一个xacro文件夹,在文件夹中新建my_base.urdf.xacro文件

 

2.2.2 编写 Xacro 文件

  1. <!--
  2. 使用 xacro 优化 URDF 版的小车底盘实现:
  3. 实现思路:
  4. 1.将一些常量、变量封装为 xacro:property
  5. 比如:PI 值、小车底盘半径、离地间距、车轮半径、宽度 ....
  6. 2.使用 宏 封装驱动轮以及支撑轮实现,调用相关宏生成驱动轮与支撑轮
  7. -->
  8. <!-- 根标签,必须声明 xmlns:xacro -->
  9. <robot name="my_base" xmlns:xacro="http://www.ros.org/wiki/xacro">
  10. <!-- 封装变量、常量 -->
  11. <xacro:property name="PI" value="3.141"/>
  12. <!-- 宏:黑色设置 -->
  13. <material name="black">
  14. <color rgba="0.0 0.0 0.0 1.0" />
  15. </material>
  16. <!-- 底盘属性 -->
  17. <xacro:property name="base_footprint_radius" value="0.001" /> <!-- base_footprint 半径 -->
  18. <xacro:property name="base_link_radius" value="0.1" /> <!-- base_link 半径 -->
  19. <xacro:property name="base_link_length" value="0.08" /> <!-- base_link 长 -->
  20. <xacro:property name="earth_space" value="0.015" /> <!-- 离地间距 -->
  21. <!-- 底盘 -->
  22. <link name="base_footprint">
  23. <visual>
  24. <geometry>
  25. <sphere radius="${base_footprint_radius}" />
  26. </geometry>
  27. </visual>
  28. </link>
  29. <link name="base_link">
  30. <visual>
  31. <geometry>
  32. <cylinder radius="${base_link_radius}" length="${base_link_length}" />
  33. </geometry>
  34. <origin xyz="0 0 0" rpy="0 0 0" />
  35. <material name="yellow">
  36. <color rgba="0.5 0.3 0.0 0.5" />
  37. </material>
  38. </visual>
  39. </link>
  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. <!-- 驱动轮 -->
  46. <!-- 驱动轮属性 -->
  47. <xacro:property name="wheel_radius" value="0.0325" /><!-- 半径 -->
  48. <xacro:property name="wheel_length" value="0.015" /><!-- 宽度 -->
  49. <!-- 驱动轮宏实现 -->
  50. <xacro:macro name="add_wheels" params="name flag">
  51. <link name="${name}_wheel">
  52. <visual>
  53. <geometry>
  54. <cylinder radius="${wheel_radius}" length="${wheel_length}" />
  55. </geometry>
  56. <origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0" />
  57. <material name="black" />
  58. </visual>
  59. </link>
  60. <joint name="${name}_wheel2base_link" type="continuous">
  61. <parent link="base_link" />
  62. <child link="${name}_wheel" />
  63. <origin xyz="0 ${flag * base_link_radius} ${-(earth_space + base_link_length / 2 - wheel_radius) }" />
  64. <axis xyz="0 1 0" />
  65. </joint>
  66. </xacro:macro>
  67. <xacro:add_wheels name="left" flag="1" />
  68. <xacro:add_wheels name="right" flag="-1" />
  69. <!-- 支撑轮 -->
  70. <!-- 支撑轮属性 -->
  71. <xacro:property name="support_wheel_radius" value="0.0075" /> <!-- 支撑轮半径 -->
  72. <!-- 支撑轮宏 -->
  73. <xacro:macro name="add_support_wheel" params="name flag" >
  74. <link name="${name}_wheel">
  75. <visual>
  76. <geometry>
  77. <sphere radius="${support_wheel_radius}" />
  78. </geometry>
  79. <origin xyz="0 0 0" rpy="0 0 0" />
  80. <material name="black" />
  81. </visual>
  82. </link>
  83. <joint name="${name}_wheel2base_link" type="continuous">
  84. <parent link="base_link" />
  85. <child link="${name}_wheel" />
  86. <origin xyz="${flag * (base_link_radius - support_wheel_radius)} 0 ${-(base_link_length / 2 + earth_space / 2)}" />
  87. <axis xyz="1 1 1" />
  88. </joint>
  89. </xacro:macro>
  90. <xacro:add_support_wheel name="front" flag="1" />
  91. <xacro:add_support_wheel name="back" flag="-1" />
  92. </robot>
2.2.3 集成launch文件

在 launch 文件中直接加载 xacro

box_launch.launch 内容示例:

  1. <launch>
  2. <!-- 将 urdf 文件内容设置进参数服务器 -->
  3. <!-- <param name="robot_description" textfile="$(find jubot_demo)/urdf/box_urdf.urdf" /> -->
  4. <!-- 使用xacro优化urdf文件 -->
  5. <param name="robot_description" command="$(find xacro)/xacro $(find jubot_demo)/urdf/xacro/my_base.urdf.xacro" />
  6. <!-- 启动 rviz -->
  7. <!-- <node pkg="rviz" type="rviz" name="rviz" /> -->
  8. <node pkg="rviz" type="rviz" name="rviz" args="-d $(find jubot_demo)/config/rviz/show_four_wheel_car.rviz" />
  9. <!-- 启动机器人状态和关节状态发布节点 -->
  10. <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />
  11. <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" />
  12. <!-- 启动图形化的控制关节运动节点 -->
  13. <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" />
  14. </launch>

加载robot_description时使用command属性,属性值就是调用 xacro 功能包的 xacro 程序直接解析 xacro 文件。

重新启动launch,正常显示小车,说明配置成功

2.3 添加摄像头和雷达传感器

2.3.1 摄像头和雷达 Xacro 文件实现

创建

my_camera.urdf.xacro

my_laser.urdf.xacro

my_car_camera.urdf.xacro

三个文件

摄像头my_camera.urdf.xacro 文件:

  1. <!-- 摄像头相关的 xacro 文件 -->
  2. <robot name="my_camera" xmlns:xacro="http://wiki.ros.org/xacro">
  3. <!-- 摄像头属性 -->
  4. <xacro:property name="camera_length" value="0.01" /> <!-- 摄像头长度(x) -->
  5. <xacro:property name="camera_width" value="0.025" /> <!-- 摄像头宽度(y) -->
  6. <xacro:property name="camera_height" value="0.025" /> <!-- 摄像头高度(z) -->
  7. <xacro:property name="camera_x" value="0.08" /> <!-- 摄像头安装的x坐标 -->
  8. <xacro:property name="camera_y" value="0.0" /> <!-- 摄像头安装的y坐标 -->
  9. <xacro:property name="camera_z" value="${base_link_length / 2 + camera_height / 2}" /> <!-- 摄像头安装的z坐标:底盘高度 / 2 + 摄像头高度 / 2 -->
  10. <!-- 摄像头关节以及link -->
  11. <link name="camera">
  12. <visual>
  13. <geometry>
  14. <box size="${camera_length} ${camera_width} ${camera_height}" />
  15. </geometry>
  16. <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
  17. <material name="black" />
  18. </visual>
  19. </link>
  20. <joint name="camera2base_link" type="fixed">
  21. <parent link="base_link" />
  22. <child link="camera" />
  23. <origin xyz="${camera_x} ${camera_y} ${camera_z}" />
  24. </joint>
  25. </robot>

雷达 my_laser.urdf.xacro文件:

  1. <!--
  2. 小车底盘添加雷达
  3. -->
  4. <robot name="my_laser" xmlns:xacro="http://wiki.ros.org/xacro">
  5. <!-- 雷达支架 -->
  6. <xacro:property name="support_length" value="0.15" /> <!-- 支架长度 -->
  7. <xacro:property name="support_radius" value="0.01" /> <!-- 支架半径 -->
  8. <xacro:property name="support_x" value="0.0" /> <!-- 支架安装的x坐标 -->
  9. <xacro:property name="support_y" value="0.0" /> <!-- 支架安装的y坐标 -->
  10. <xacro:property name="support_z" value="${base_link_length / 2 + support_length / 2}" /> <!-- 支架安装的z坐标:底盘高度 / 2 + 支架高度 / 2 -->
  11. <link name="support">
  12. <visual>
  13. <geometry>
  14. <cylinder radius="${support_radius}" length="${support_length}" />
  15. </geometry>
  16. <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
  17. <material name="red">
  18. <color rgba="0.8 0.2 0.0 0.8" />
  19. </material>
  20. </visual>
  21. </link>
  22. <joint name="support2base_link" type="fixed">
  23. <parent link="base_link" />
  24. <child link="support" />
  25. <origin xyz="${support_x} ${support_y} ${support_z}" />
  26. </joint>
  27. <!-- 雷达属性 -->
  28. <xacro:property name="laser_length" value="0.05" /> <!-- 雷达长度 -->
  29. <xacro:property name="laser_radius" value="0.03" /> <!-- 雷达半径 -->
  30. <xacro:property name="laser_x" value="0.0" /> <!-- 雷达安装的x坐标 -->
  31. <xacro:property name="laser_y" value="0.0" /> <!-- 雷达安装的y坐标 -->
  32. <xacro:property name="laser_z" value="${support_length / 2 + laser_length / 2}" /> <!-- 雷达安装的z坐标:支架高度 / 2 + 雷达高度 / 2 -->
  33. <!-- 雷达关节以及link -->
  34. <link name="laser">
  35. <visual>
  36. <geometry>
  37. <cylinder radius="${laser_radius}" length="${laser_length}" />
  38. </geometry>
  39. <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
  40. <material name="black" />
  41. </visual>
  42. </link>
  43. <joint name="laser2support" type="fixed">
  44. <parent link="support" />
  45. <child link="laser" />
  46. <origin xyz="${laser_x} ${laser_y} ${laser_z}" />
  47. </joint>
  48. </robot>
2.3.2 组合底盘摄像头与雷达的 xacro 文件

my_car_camera.urdf.xacro文件

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

2.4 launch 文件 

  1. <launch>
  2. <!-- 将 urdf 文件内容设置进参数服务器 -->
  3. <!-- <param name="robot_description" textfile="$(find jubot_demo)/urdf/box_urdf.urdf" /> -->
  4. <!-- 使用xacro优化urdf文件 -->
  5. <!-- <param name="robot_description" command="$(find xacro)/xacro $(find jubot_demo)/urdf/xacro/my_base.urdf.xacro" /> -->
  6. <param name="robot_description" command="$(find xacro)/xacro $(find jubot_demo)/urdf/xacro/my_car_camera.urdf.xacro" />
  7. <!-- 启动 rviz -->
  8. <!-- <node pkg="rviz" type="rviz" name="rviz" /> -->
  9. <node pkg="rviz" type="rviz" name="rviz" args="-d $(find jubot_demo)/config/rviz/show_four_wheel_car.rviz" />
  10. <!-- 启动机器人状态和关节状态发布节点 -->
  11. <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />
  12. <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" />
  13. <!-- 启动图形化的控制关节运动节点 -->
  14. <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" />
  15. </launch>

在rviz中显示机器人

在rviz中打开项目时要记得改名,不然是不会正常显示的

参考​​​​​​​ 

【Autolabor初级教程】ROS机器人入门_哔哩哔哩_bilibili

Gazebo中针对Gazebo软件或生成模型出现process has died问题的参考方案

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

闽ICP备14008679号