ROS:URDF、Gazebo与Rviz结合使用

目录

  • 一、机器人运动控制以及里程计信息显示
    • 1.1ros_control 简介
    • 1.2运动控制实现流程(Gazebo)
      • 1.2.1为 joint 添加传动装置以及控制器
      • 1.2.2xacro文件集成
      • 1.2.3启动 gazebo并控制机器人运动
    • 1.3Rviz查看里程计信息
      • 1.3.1启动 Rviz
      • 1.3.2添加组件
  • 二、雷达信息仿真以及显示
    • 2.1流程分析
    • 2.2Gazebo 仿真雷达
      • 2.2.1新建 Xacro 文件,配置雷达传感器信息
      • 2.2.2xacro 文件集成
      • 2.2.3启动仿真环境
    • 2.3Rviz 显示雷达数据
  • 三、摄像头信息仿真以及显示
    • 3.1流程分析
    • 3.2Gazebo 仿真摄像头
      • 3.2.1新建 Xacro 文件,配置摄像头传感器信息
      • 3.2.2xacro 文件集成
      • 3.2.3启动仿真环境
    • 2.3Rviz 显示摄像头数据
  • 四、kinect信息仿真以及显示
    • 4.1流程分析
    • 4.2Gazebo仿真Kinect
      • 4.2.1新建 Xacro 文件,配置 kinetic传感器信息
      • 4.2.2xacro 文件集成
      • 4.2.3启动仿真环境
    • 4.3Rviz 显示 Kinect 数据
    • 4.4kinect 点云数据显示

一、机器人运动控制以及里程计信息显示

gazebo 中已经可以正常显示机器人模型了,那么如何像在 rviz 中一样控制机器人运动呢?在此,需要涉及到ros中的组件: ros_control。

1.1ros_control 简介

场景:同一套 ROS 程序,如何部署在不同的机器人系统上,比如:开发阶段为了提高效率是在仿真平台上测试的,部署时又有不同的实体机器人平台,不同平台的实现是有差异的,如何保证 ROS 程序的可移植性?ROS 内置的解决方式是 ros_control。

ros_control:是一组软件包,它包含了控制器接口,控制器管理器,传输和硬件接口。ros_control 是一套机器人控制的中间件,是一套规范,不同的机器人平台只要按照这套规范实现,那么就可以保证 与ROS 程序兼容,通过这套规范,实现了一种可插拔的架构设计,大大提高了程序设计的效率与灵活性。

gazebo 已经实现了 ros_control 的相关接口,如果需要在 gazebo 中控制机器人运动,直接调用相关接口即可

1.2运动控制实现流程(Gazebo)

已经创建完毕的机器人模型,编写一个单独的 xacro 文件,为机器人模型添加传动装置以及控制器
将此文件集成进xacro文件
启动 Gazebo 并发布 /cmd_vel 消息控制机器人运动

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

两轮差速配置

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

    <!-- 传动实现:用于连接控制器与关节 -->
    <xacro:macro name="joint_trans" params="joint_name">
        <!-- Transmission is important to link the joints and the controller -->
        <transmission name="${joint_name}_trans">
            <type>transmission_interface/SimpleTransmission</type>
            <joint name="${joint_name}">
                <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
            </joint>
            <actuator name="${joint_name}_motor">
                <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
                <mechanicalReduction>1</mechanicalReduction>
            </actuator>
        </transmission>
    </xacro:macro>

    <!-- 每一个驱动轮都需要配置传动装置 -->
    <xacro:joint_trans joint_name="left_wheel2base_link" />
    <xacro:joint_trans joint_name="right_wheel2base_link" />

    <!-- 控制器 -->
    <gazebo>
        <plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so">
            <rosDebugLevel>Debug</rosDebugLevel>
            <publishWheelTF>true</publishWheelTF>
            <robotNamespace>/</robotNamespace>
            <publishTf>1</publishTf>
            <publishWheelJointState>true</publishWheelJointState>
            <alwaysOn>true</alwaysOn>
            <updateRate>100.0</updateRate>
            <legacyMode>true</legacyMode>
            <leftJoint>left_wheel2base_link</leftJoint> <!-- 左轮 -->
            <rightJoint>right_wheel2base_link</rightJoint> <!-- 右轮 -->
            <wheelSeparation>${base_link_radius * 2}</wheelSeparation> <!-- 车轮间距 -->
            <wheelDiameter>${wheel_radius * 2}</wheelDiameter> <!-- 车轮直径 -->
            <broadcastTF>1</broadcastTF>
            <wheelTorque>30</wheelTorque>
            <wheelAcceleration>1.8</wheelAcceleration>
            <commandTopic>cmd_vel</commandTopic> <!-- 运动控制话题 -->
            <odometryFrame>odom</odometryFrame> 
            <odometryTopic>odom</odometryTopic> <!-- 里程计话题 -->
            <robotBaseFrame>base_footprint</robotBaseFrame> <!-- 根坐标系 -->
        </plugin>
    </gazebo>

</robot>

1.2.2xacro文件集成

<!-- 组合小车底盘与摄像头与雷达 -->
<robot name="my_car" xmlns:xacro="http://wiki.ros.org/xacro">
    <xacro:include filename="head.xacro" />
    <xacro:include filename="demo02_car_base.xacro" />
    <xacro:include filename="demo03_car_camera.xacro" />
    <xacro:include filename="demo04_car_laser.xacro" />

    <!--运动控制-->
    <xacro:include filename="gazebo/move.xacro" />
</robot>

1.2.3启动 gazebo并控制机器人运动

launch文件:

<launch>
    <param name="robot_description" command="$(find xacro)/xacro $(find urdf01_rviz)/urdf/xacro/demo05_car.xacro" />

    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find urdf01_rviz)/config/show_mycar.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" />
    <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" output="screen" />

</launch>

启动 launch 文件,使用 topic 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}}'

1.3Rviz查看里程计信息

在 Gazebo 的仿真环境中,机器人的里程计信息以及运动朝向等信息是无法获取的,可以通过 Rviz 显示机器人的里程计信息以及运动朝向

里程计: 机器人相对出发点坐标系的位姿状态(X 坐标 Y 坐标 Z坐标以及朝向)。

1.3.1启动 Rviz

launch 文件

<launch>
    <param name="robot_description" command="$(find xacro)/xacro $(find urdf01_rviz)/urdf/xacro/demo05_car.xacro" />

    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find urdf01_rviz)/config/show_mycar.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" />
    

    <!--集成arbotix运动控制节点,并且加载参数-->
    <node name="arbotix" pkg="arbotix_python" type="arbotix_driver" output="screen">
        <rosparam file="$(find urdf01_rviz)/config/control.yaml"  />
        <param name="sim" value="true" />
    </node>


</launch>

1.3.2添加组件

执行 launch 文件后,在 Rviz 中添加图示组件:
ROS:URDF、Gazebo与Rviz结合使用_第1张图片

二、雷达信息仿真以及显示

通过 Gazebo 模拟激光雷达传感器,并在 Rviz 中显示激光数据。

2.1流程分析

雷达仿真基本流程:
已经创建完毕的机器人模型,编写一个单独的 xacro 文件,为机器人模型添加雷达配置;
将此文件集成进xacro文件;
启动 Gazebo,使用 Rviz 显示雷达信息。

2.2Gazebo 仿真雷达

2.2.1新建 Xacro 文件,配置雷达传感器信息

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

  <!-- 雷达 -->
  <gazebo reference="laser">
    <sensor type="ray" name="rplidar">
      <pose>0 0 0 0 0 0</pose>
      <visualize>true</visualize>
      <update_rate>5.5</update_rate>
      <ray>
        <scan>
          <horizontal>
            <samples>360</samples>
            <resolution>1</resolution>
            <min_angle>-3</min_angle>
            <max_angle>3</max_angle>
          </horizontal>
        </scan>
        <range>
          <min>0.10</min>
          <max>30.0</max>
          <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>

2.2.2xacro 文件集成

!-- 组合小车底盘与摄像头与雷达 -->
<robot name="my_car" xmlns:xacro="http://wiki.ros.org/xacro">
    <xacro:include filename="head.xacro" />
    <xacro:include filename="demo02_car_base.xacro" />
    <xacro:include filename="demo03_car_camera.xacro" />
    <xacro:include filename="demo04_car_laser.xacro" />

    <!--运动控制-->
    <xacro:include filename="gazebo/move.xacro" />
    <!--雷达仿真-->
    <xacro:include filename="gazebo/laser.xacro" />
</robot>

2.2.3启动仿真环境

与上述启动仿真代码相同

2.3Rviz 显示雷达数据

启动 rviz代码与上述相同
添加雷达信息显示插件
ROS:URDF、Gazebo与Rviz结合使用_第2张图片

三、摄像头信息仿真以及显示

通过 Gazebo 模拟摄像头传感器,并在 Rviz 中显示摄像头数据。

3.1流程分析

摄像头仿真基本流程:

已经创建完毕的机器人模型,编写一个单独的 xacro 文件,为机器人模型添加摄像头配置;
将此文件集成进xacro文件;
启动 Gazebo,使用 Rviz 显示摄像头信息。

3.2Gazebo 仿真摄像头

3.2.1新建 Xacro 文件,配置摄像头传感器信息

<robot name="my_sensors" xmlns:xacro="http://wiki.ros.org/xacro">
  <!-- 被引用的link -->
  <gazebo reference="camera">
    <!-- 类型设置为 camara -->
    <sensor type="camera" name="camera_node">
      <update_rate>30.0</update_rate> <!-- 更新频率 -->
      <!-- 摄像头基本信息设置 -->
      <camera name="head">
        <horizontal_fov>1.3962634</horizontal_fov>
        <image>
          <width>1280</width>
          <height>720</height>
          <format>R8G8B8</format>
        </image>
        <clip>
          <near>0.02</near>
          <far>300</far>
        </clip>
        <noise>
          <type>gaussian</type>
          <mean>0.0</mean>
          <stddev>0.007</stddev>
        </noise>
      </camera>
      <!-- 核心插件 -->
      <plugin name="gazebo_camera" filename="libgazebo_ros_camera.so">
        <alwaysOn>true</alwaysOn>
        <updateRate>0.0</updateRate>
        <cameraName>/camera</cameraName>
        <imageTopicName>image_raw</imageTopicName>
        <cameraInfoTopicName>camera_info</cameraInfoTopicName>
        <frameName>camera</frameName>
        <hackBaseline>0.07</hackBaseline>
        <distortionK1>0.0</distortionK1>
        <distortionK2>0.0</distortionK2>
        <distortionK3>0.0</distortionK3>
        <distortionT1>0.0</distortionT1>
        <distortionT2>0.0</distortionT2>
      </plugin>
    </sensor>
  </gazebo>
</robot>

3.2.2xacro 文件集成

<!-- 组合小车底盘与摄像头与雷达 -->
<robot name="my_car" xmlns:xacro="http://wiki.ros.org/xacro">
    <xacro:include filename="head.xacro" />
    <xacro:include filename="demo02_car_base.xacro" />
    <xacro:include filename="demo03_car_camera.xacro" />
    <xacro:include filename="demo04_car_laser.xacro" />

    <!--运动控制-->
    <xacro:include filename="gazebo/move.xacro" />
    <!--雷达仿真-->
    <xacro:include filename="gazebo/laser.xacro" />
    <!--摄像头仿真-->
    <xacro:include filename="gazebo/camera.xacro" />

</robot>

3.2.3启动仿真环境

与上述启动仿真代码相同

2.3Rviz 显示摄像头数据

启动 rviz代码与上述相同
在 Rviz 中添加摄像头组件
ROS:URDF、Gazebo与Rviz结合使用_第3张图片

四、kinect信息仿真以及显示

通过 Gazebo 模拟kinect摄像头,并在 Rviz 中显示kinect摄像头数据。

4.1流程分析

kinect摄像头仿真基本流程:
已经创建完毕的机器人模型,编写一个单独的 xacro 文件,为机器人模型添加kinect摄像头配置;
将此文件集成进xacro文件;
启动 Gazebo,使用 Rviz 显示kinect摄像头信息。

4.2Gazebo仿真Kinect

4.2.1新建 Xacro 文件,配置 kinetic传感器信息

<robot name="my_sensors" xmlns:xacro="http://wiki.ros.org/xacro">
    <gazebo reference="support">  
      <sensor type="depth" name="camera">
        <always_on>true</always_on>
        <update_rate>20.0</update_rate>
        <camera>
          <horizontal_fov>${60.0*PI/180.0}</horizontal_fov>
          <image>
            <format>R8G8B8</format>
            <width>640</width>
            <height>480</height>
          </image>
          <clip>
            <near>0.05</near>
            <far>8.0</far>
          </clip>
        </camera>
        <plugin name="kinect_camera_controller" filename="libgazebo_ros_openni_kinect.so">
          <cameraName>camera</cameraName>
          <alwaysOn>true</alwaysOn>
          <updateRate>10</updateRate>
          <imageTopicName>rgb/image_raw</imageTopicName>
          <depthImageTopicName>depth/image_raw</depthImageTopicName>
          <pointCloudTopicName>depth/points</pointCloudTopicName>
          <cameraInfoTopicName>rgb/camera_info</cameraInfoTopicName>
          <depthImageCameraInfoTopicName>depth/camera_info</depthImageCameraInfoTopicName>
          <frameName>support</frameName>
          <baseline>0.1</baseline>
          <distortion_k1>0.0</distortion_k1>
          <distortion_k2>0.0</distortion_k2>
          <distortion_k3>0.0</distortion_k3>
          <distortion_t1>0.0</distortion_t1>
          <distortion_t2>0.0</distortion_t2>
          <pointCloudCutoff>0.4</pointCloudCutoff>
        </plugin>
      </sensor>
    </gazebo>

</robot>

4.2.2xacro 文件集成

<!-- 组合小车底盘与摄像头与雷达 -->
<robot name="my_car" xmlns:xacro="http://wiki.ros.org/xacro">
    <xacro:include filename="head.xacro" />
    <xacro:include filename="demo02_car_base.xacro" />
    <xacro:include filename="demo03_car_camera.xacro" />
    <xacro:include filename="demo04_car_laser.xacro" />

    <!--运动控制-->
    <xacro:include filename="gazebo/move.xacro" />
    <!--雷达仿真-->
    <xacro:include filename="gazebo/laser.xacro" />
    <!--摄像头仿真-->
    <xacro:include filename="gazebo/camera.xacro" />
    <!--深度相机仿真-->
    <xacro:include filename="gazebo/kinect.xacro" />

</robot>

4.2.3启动仿真环境

与上述启动仿真代码相同

4.3Rviz 显示 Kinect 数据

启动 rviz代码与上述相同
启动 rviz,添加摄像头组件查看数据
ROS:URDF、Gazebo与Rviz结合使用_第4张图片

4.4kinect 点云数据显示

在kinect中也可以以点云的方式显示感知周围环境,在 rviz 中操作如下:
ROS:URDF、Gazebo与Rviz结合使用_第5张图片
问题:在rviz中显示时错位。

原因:在kinect中图像数据与点云数据使用了两套坐标系统,且两套坐标系统位姿并不一致。

解决:
1.在插件中为kinect设置坐标系,修改配置文件的标签内容:

<frameName>support_depth</frameName>

2.发布新设置的坐标系到kinect连杆的坐标变换关系,在启动rviz的launch中,添加:

<node pkg="tf2_ros" type="static_transform_publisher" name="static_transform_publisher" args="0 0 0 -1.57 0 -1.57 /support /support_depth" />

3.启动rviz,重新显示。

参考视屏:赵虚左ros入门
ROS:URDF、Gazebo与Rviz结合使用_第6张图片

你可能感兴趣的:(ROS入门学习,机器人,自动驾驶,人工智能,ROS)