0 写在前面

在本博客中将主要介绍:

  1. 利用系列(一)中我们搭建的移动机器人,即将Xacro语言编写的机器人集成至Gazebo仿真环境中
  2. 利用Gazebo作为物理环境平台,利用Xacro语言编写的移动机器人为载体,在Rviz仿真环境中上实现机器人感知世界显示

1 Gazebo与Xacro集成

目标

将本系列第一篇博客中的由Xacro编写的移动机器人集成至Gazebo仿真环境中

实现手段

主要利用launch文件,将xacro文件中的内容加载到参数服务器(robot_description)中,并且启动gazebo中的仿真空环境,并引用gazebo_ros节点实现gazebo中显示机器人模型

代码

launch文件代码

首先仍是关注launch文件位置:
airobot_ws/src/myCar_gazebo/launch/hw_gazebo.launch
代码有如下显示:

<launch>

    <!-- 将 Xacro 文件的内容加载到参数服务器 -->
    <param name="robot_description" command="$(find xacro)/xacro $(find my_car)/urdf/xacro/car.xacro" />

    <!-- 启动 Gazebo 的仿真环境,当前环境为空环境 -->
    <include file="$(find gazebo_ros)/launch/empty_world.launch" />

    <!-- 在 gazebo 中显示机器人模型 -->
    <node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description"  />
    <!-- 
        在 Gazebo 中加载一个机器人模型,该功能由 gazebo_ros 下的 spawn_model 提供:
        -urdf 加载的是 urdf 文件
        -model mycar 模型名称是 mycar
        -param robot_description 从参数服务器 robot_description 中载入模型
        -x 模型载入的 x 坐标
        -y 模型载入的 y 坐标
        -z 模型载入的 z 坐标
    -->
</launch>

对于launch文件的每一个包含节点都有详细的注释,从中不难发现利用launch文件的优点:

  1. 更改机器人模型 -> 改变参数服务器中command后的机器人模型所在路径即可
  2. 更改Gazebo环境 -> 改变include file后的包含环境路径即可

Xacro文件代码

在本实验中,Xacro文件与上一篇博客中的移动机器人Xacro完全一致,详情请见上一篇博客,已经给出了百度网盘的下载地址,其中需要说明的是,子文件中的laser.xacro, camera.xacro, kinect.xacro给出了传感器的具体参数;move.xacro给出了移动机器人的移动控制参数,如控制手段,底盘控制节点设定等,这在利用机器人进行移动中至关重要。
以laser.xacro介绍参数含义:

<robot name="my_sensors" xmlns:xacro="http://wiki.ros.org/xacro">

  <!--guanliandelink-->
  <gazebo reference="laser">
    <sensor type="ray" name="rplidar">
      <pose>0 0 0 0 0 0</pose>
      <!--jiguangshushifoukejian-->
      <visualize>true</visualize>
      <update_rate>5.5</update_rate>
      <ray>
        <scan>
          <horizontal>
            <samples>360</samples>
            <!--fenbianlv-->
            <resolution>1</resolution>
            <!--youxiaofanwei-->
            <min_angle>-3</min_angle>
            <max_angle>3</max_angle>
          </horizontal>
        </scan>
        <range>
          <!--youxiaojuli-->
          <min>0.10</min>
          <max>30.0</max>
          <!--jindu-->
          <resolution>0.01</resolution>
        </range>
        <noise>
          <type>gaussian</type>
          <mean>0.0</mean>
          <stddev>0.01</stddev>
        </noise>
      </ray>
      <plugin name="gazebo_rplidar" filename="libgazebo_ros_laser.so">
        <topicName>/scan</topicName>
        <frameName>laser</frameName>
      </plugin>
    </sensor>
  </gazebo>

</robot>

由于xacro不支持中文注释,对上面的拼音注释加以说明:

  1. guanliandelink -> 传感器关联的link
  2. jiguangshushifoukejian -> 激光束是否可见
  3. fenbianlv -> laser分辨率
  4. youxiaofanwei -> 有效范围
  5. youxiaojuli -> 有效距离
  6. jindu -> 精度

实现效果

gazebo与xacro

2 Gazebo与Xacro与Rviz集成

目标

实现xacro文件与gazeboRviz的集成

实现手段

在上步(Gazebo与Xacro集成)中的launch文件中加入Rviz节点即可

代码

launch文件

首先仍是关注launch文件位置:
airobot_ws/src/my_car/launch/hw_car_gazebo.launch
代码有如下显示:

<launch>
    <!-- 将 Xacro 文件的内容加载到参数服务器 -->
    <param name="robot_description" command="$(find xacro)/xacro $(find my_car)/urdf/xacro/car.xacro" />
    <!-- 启动 gazebo -->
    <include file="$(find gazebo_ros)/launch/empty_world.launch" >
        <arg name="world_name" value="$(find myCar_gazebo)/worlds/box_house.world"/>
    </include>

    <!-- 在 gazebo 中显示机器人模型 -->
    <node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description"  />

    <!--启动rviz-->
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find my_car)/config/test01.rviz" />
    <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" output="screen" />
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" output="screen" />

</launch>

其中rviz中的test01.rviz中主要给定了rviz的一些参数,不是很重要

实现效果

gazebo与xacro与rviz1
gazebo与xacro与rviz2

3 写在最后

至此我们以一个自己设计的移动机器人为例,实现了:
urdf搭建原始模型 -> xacro简化模型,增加传感器模型 -> gazebo仿真物理环境 -> rviz中显示机器人在仿真物理环境中的感知
接下来我们就可以利用已经搭建好的环境进行下一步移动机器人建图、定位、导航的工作啦~