当前位置:   article > 正文

第 8 章 机器人实体导航实现01_准备工作(自学二刷笔记)

第 8 章 机器人实体导航实现01_准备工作(自学二刷笔记)

重要参考:

课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ

讲义链接:Introduction · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程

9.3.1 导航实现01_准备工作

1.1分布式架构

分布式架构搭建完毕且能正常运行,在PC端可以远程登陆机器人端。

1.2功能包安装

在机器人端安装导航所需功能包:

  • 安装 gmapping 包(用于构建地图):sudo apt install ros-<ROS版本>-gmapping

  • 安装地图服务包(用于保存与读取地图):sudo apt install ros-<ROS版本>-map-server

  • 安装 navigation 包(用于定位以及路径规划):sudo apt install ros-<ROS版本>-navigation

新建功能(包名自定义,比如:nav),并导入依赖: gmapping map_server amcl move_base

1.3机器人模型以及坐标变换

机器人的不同部件有不同的坐标系,我们需要将这些坐标系集成进同一坐标树,实现方案有两种:

  1. 不同的部件相对于机器人底盘其位置都是固定的,可以通过发布静态坐标变换以实现集成;
  2. 可以通过加载机器人URDF文件结合 robot_state_publisher、joint_state_publisher实现不同坐标系的集成。

方案1在上一章中已做演示,接下来介绍方案2的实现。

1.3.1 创建机器人模型相关的功能包

创建功能包:catkin_create_pkg mycar_description urdf xacro

1.3.2 准备机器人模型文件

在功能包下新建 urdf 目录,编写具体的 urdf 文件(机器人模型相关URDF文件的编写可以参考第6章内容),示例如下:

文件car.urdf.xacro用于集成不同的机器人部件,内容如下:

  1. <robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro">
  2. <xacro:include filename="car_base.urdf.xacro" />
  3. <xacro:include filename="car_camera.urdf.xacro" />
  4. <xacro:include filename="car_laser.urdf.xacro" />
  5. </robot>

文件car_base.urdf.xacro机器人底盘实现,内容如下:

  1. <robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro">
  2. <xacro:property name="footprint_radius" value="0.001" />
  3. <link name="base_footprint">
  4. <visual>
  5. <geometry>
  6. <sphere radius="${footprint_radius}" />
  7. </geometry>
  8. </visual>
  9. </link>
  10. <xacro:property name="base_radius" value="0.1" />
  11. <xacro:property name="base_length" value="0.08" />
  12. <xacro:property name="lidi" value="0.015" />
  13. <xacro:property name="base_joint_z" value="${base_length / 2 + lidi}" />
  14. <link name="base_link">
  15. <visual>
  16. <geometry>
  17. <cylinder radius="0.1" length="0.08" />
  18. </geometry>
  19. <origin xyz="0 0 0" rpy="0 0 0" />
  20. <material name="baselink_color">
  21. <color rgba="1.0 0.5 0.2 0.5" />
  22. </material>
  23. </visual>
  24. </link>
  25. <joint name="link2footprint" type="fixed">
  26. <parent link="base_footprint" />
  27. <child link="base_link" />
  28. <origin xyz="0 0 0.055" rpy="0 0 0" />
  29. </joint>
  30. <xacro:property name="wheel_radius" value="0.0325" />
  31. <xacro:property name="wheel_length" value="0.015" />
  32. <xacro:property name="PI" value="3.1415927" />
  33. <xacro:property name="wheel_joint_z" value="${(base_length / 2 + lidi - wheel_radius) * -1}" />
  34. <xacro:macro name="wheel_func" params="wheel_name flag">
  35. <link name="${wheel_name}_wheel">
  36. <visual>
  37. <geometry>
  38. <cylinder radius="${wheel_radius}" length="${wheel_length}" />
  39. </geometry>
  40. <origin xyz="0 0 0" rpy="${PI / 2} 0 0" />
  41. <material name="wheel_color">
  42. <color rgba="0 0 0 0.3" />
  43. </material>
  44. </visual>
  45. </link>
  46. <joint name="${wheel_name}2link" type="continuous">
  47. <parent link="base_link" />
  48. <child link="${wheel_name}_wheel" />
  49. <origin xyz="0 ${0.1 * flag} ${wheel_joint_z}" rpy="0 0 0" />
  50. <axis xyz="0 1 0" />
  51. </joint>
  52. </xacro:macro>
  53. <xacro:wheel_func wheel_name="left" flag="1" />
  54. <xacro:wheel_func wheel_name="right" flag="-1" />
  55. <xacro:property name="small_wheel_radius" value="0.0075" />
  56. <xacro:property name="small_joint_z" value="${(base_length / 2 + lidi - small_wheel_radius) * -1}" />
  57. <xacro:macro name="small_wheel_func" params="small_wheel_name flag">
  58. <link name="${small_wheel_name}_wheel">
  59. <visual>
  60. <geometry>
  61. <sphere radius="${small_wheel_radius}" />
  62. </geometry>
  63. <origin xyz="0 0 0" rpy="0 0 0" />
  64. <material name="wheel_color">
  65. <color rgba="0 0 0 0.3" />
  66. </material>
  67. </visual>
  68. </link>
  69. <joint name="${small_wheel_name}2link" type="continuous">
  70. <parent link="base_link" />
  71. <child link="${small_wheel_name}_wheel" />
  72. <origin xyz="${0.08 * flag} 0 ${small_joint_z}" rpy="0 0 0" />
  73. <axis xyz="0 1 0" />
  74. </joint>
  75. </xacro:macro >
  76. <xacro:small_wheel_func small_wheel_name="front" flag="1"/>
  77. <xacro:small_wheel_func small_wheel_name="back" flag="-1"/>
  78. </robot>

文件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="joint_camera_x" value="0.08" />
  6. <xacro:property name="joint_camera_y" value="0" />
  7. <xacro:property name="joint_camera_z" value="${base_length / 2 + camera_height / 2}" />
  8. <link name="camera">
  9. <visual>
  10. <geometry>
  11. <box size="${camera_length} ${camera_width} ${camera_height}" />
  12. </geometry>
  13. <origin xyz="0 0 0" rpy="0 0 0" />
  14. <material name="black">
  15. <color rgba="0 0 0 0.8" />
  16. </material>
  17. </visual>
  18. </link>
  19. <joint name="camera2base" type="fixed">
  20. <parent link="base_link" />
  21. <child link="camera" />
  22. <origin xyz="${joint_camera_x} ${joint_camera_y} ${joint_camera_z}" rpy="0 0 0" />
  23. </joint>
  24. </robot>

文件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="laser_radius" value="0.03" />
  5. <xacro:property name="laser_length" value="0.05" />
  6. <xacro:property name="joint_support_x" value="0" />
  7. <xacro:property name="joint_support_y" value="0" />
  8. <xacro:property name="joint_support_z" value="${base_length / 2 + support_length / 2}" />
  9. <xacro:property name="joint_laser_x" value="0" />
  10. <xacro:property name="joint_laser_y" value="0" />
  11. <xacro:property name="joint_laser_z" value="${support_length / 2 + laser_length / 2}" />
  12. <link name="support">
  13. <visual>
  14. <geometry>
  15. <cylinder radius="${support_radius}" length="${support_length}" />
  16. </geometry>
  17. <material name="yellow">
  18. <color rgba="0.8 0.5 0.0 0.5" />
  19. </material>
  20. </visual>
  21. </link>
  22. <joint name="support2base" type="fixed">
  23. <parent link="base_link" />
  24. <child link="support"/>
  25. <origin xyz="${joint_support_x} ${joint_support_y} ${joint_support_z}" rpy="0 0 0" />
  26. </joint>
  27. <link name="laser">
  28. <visual>
  29. <geometry>
  30. <cylinder radius="${laser_radius}" length="${laser_length}" />
  31. </geometry>
  32. <material name="black">
  33. <color rgba="0 0 0 0.5" />
  34. </material>
  35. </visual>
  36. </link>
  37. <joint name="laser2support" type="fixed">
  38. <parent link="support" />
  39. <child link="laser"/>
  40. <origin xyz="${joint_laser_x} ${joint_laser_y} ${joint_laser_z}" rpy="0 0 0" />
  41. </joint>
  42. </robot>
1.3.3 在launch文件加载机器人模型

launch 文件(文件名称自定义,比如:car.launch)内容示例如下:

  1. <launch>
  2. <param name="robot_description" command="$(find xacro)/xacro $(find mycar_description)/urdf/car.urdf.xacro" />
  3. <node pkg="joint_state_publisher" name="joint_state_publisher" type="joint_state_publisher" />
  4. <node pkg="robot_state_publisher" name="robot_state_publisher" type="robot_state_publisher" />
  5. </launch>

为了使用方便,还可以将该文件包含进启动机器人的launch文件中,示例如下:

  1. <launch>
  2. <include file="$(find ros_arduino_python)/launch/arduino.launch" />
  3. <include file="$(find usb_cam)/launch/usb_cam-test.launch" />
  4. <include file="$(find rplidar_ros)/launch/rplidar.launch" />
  5. <!-- 机器人模型加载文件 -->
  6. <include file="$(find mycar_description)/launch/car.launch" />
  7. </launch>
1.4结果演示

不使用机器人模型时,机器人端启动机器人(使用包含TF坐标换的launch文件),从机端启动rviz,在rviz中添加RobotModel与TF组件,rviz中结果(此时显示机器人模型异常,且TF中只有代码中发布的坐标变换):

使用机器人模型时,机器人端加载机器人模型(执行上一步的launch文件)且启动机器人,从机端启动rviz,在rviz中添加RobotModel与TF组件rviz中结果(此时显示机器人模型,且TF坐标变换正常):

后续,在导航时使用机器人模型。

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

闽ICP备14008679号