• 【ROS进阶篇】第十一讲 基于Gazebo和Rviz的机器人联合仿真(运动控制与传感器)


    【ROS进阶篇】基于Gazebo和Rviz的机器人联合仿真(运动控制与传感器)

    在这里插入图片描述

    前言

    在上一节博客中我们系统的学习了如何使用Gazebo对使用URDF文件完成的机器人模型进行集成仿真,从基本的仿真流程出发,在后续给出了具体的机器人实例,并在最后附上了使用Gazebo创建仿真环境的教程,本节内容主要针对于使用URDF、Gazebo、Rviz进行联合仿真,URDF 用于创建机器人模型、Rviz 可以显示机器人感知到的环境信息,Gazebo 用于仿真,可以模拟外界环境,以及机器人传感器,本节内容则更加聚焦于使用Gazebo模拟传感器数据,并在Rviz中完成显示和分析。
    在这里插入图片描述

    一、机器人运动控制(ros_control)

    1. 组件介绍

    • 引入原因:在RVIZ中,我们通过Arbotix辅助实现了对于基于URDF文件的机器人模型的运动控制,而在Gazebo仿真中,虽然我们已经建立了具体的仿真环境,但是想要真正控制机器人运动,也需要着一个关键组件包。

    在这里插入图片描述

    • 应用场景:同样的ROS程序部署与不同的实际具体机器人系统上。
      在这里插入图片描述

    • 介绍:ROS_CONTROL,是一组软件包,包含控制器、管理器、硬件、传输等接口,本质上是一个控制中间件,提供了一套规范,除了这些,ros_control还提供了一个硬件的抽象层,用于负责硬件资源管理,controller从抽象层请求资源即可。

    在这里插入图片描述

    • 各数据流层功能介绍:
    1. Controller Manager:
      每个机器人可能有多个controller,所以这里有一个控制器管理器的概念,提供一种通用的接口来管理不同的controller。controller manager的输入就是ROS上层应用的输出。
    2. Controller:
      完成每个joint的控制,请求下层的硬件资源,提供了PID控制器,读取硬件资源接口中的状态,在发布控制命令。
    3. Hardware Rescource:
      为上下两层提供硬件资源的接口。
    4. RobotHW:
      硬件抽象层和硬件直接打交道,通过write和read方法来完成硬件的操作,这一层也包含关节限位、力矩转换、状态转换等功能。
    5. Real Robot:
      实际的机器人上也需要有自己的嵌入式控制器,接收到命令后需要反映到执行器上,比如接收到位置1的命令后,那就需要让执行器快速、稳定的到达位置1。
    • 特点:对于不同的机器人平台来说,ros_control提供了一个标准的规范接口架构,提高了程序的兼容性、涉及效率与灵活可移植性,使用时直接调用gazebo中的相关接口即可。

    2. 运动控制实现

    • 基本流程:
    1. 创建机器人模型;
    2. 编写一个单独的xacro文件,添加传动装置及控制器,并集成到一起;
    3. 启动Gazebo发布/cmd_vel消息控制运动
    • 基本机器人URDF文件略,传动、控制文件实例如下:
    <robot name="my_car_move" xmlns:xacro="http://wiki.ros.org/xacro">
    
        
        <xacro:macro name="joint_trans" params="joint_name">
            
            <transmission name="${joint_name}_trans">
                <type>transmission_interface/SimpleTransmissiontype>
                <joint name="${joint_name}">
                    <hardwareInterface>hardware_interface/VelocityJointInterfacehardwareInterface>
                joint>
                <actuator name="${joint_name}_motor">
                    <hardwareInterface>hardware_interface/VelocityJointInterfacehardwareInterface>
                    <mechanicalReduction>1mechanicalReduction>
                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>DebugrosDebugLevel>
                <publishWheelTF>truepublishWheelTF>
                <robotNamespace>/robotNamespace>
                <publishTf>1publishTf>
                <publishWheelJointState>truepublishWheelJointState>
                <alwaysOn>truealwaysOn>
                <updateRate>100.0updateRate>
                <legacyMode>truelegacyMode>
                <leftJoint>left_wheel2base_linkleftJoint> 
                <rightJoint>right_wheel2base_linkrightJoint> 
                <wheelSeparation>${base_link_radius * 2}wheelSeparation> 
                <wheelDiameter>${wheel_radius * 2}wheelDiameter> 
                <broadcastTF>1broadcastTF>
                <wheelTorque>30wheelTorque>
                <wheelAcceleration>1.8wheelAcceleration>
                <commandTopic>cmd_velcommandTopic> 
                <odometryFrame>odomodometryFrame> 
                <odometryTopic>odomodometryTopic> 
                <robotBaseFrame>base_footprintrobotBaseFrame> 
            plugin>
        gazebo>
    
    robot>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 集成xacro文件:
    
    <robot name="my_car_camera" xmlns:xacro="http://wiki.ros.org/xacro">
        <xacro:include filename="my_head.urdf.xacro" />
        <xacro:include filename="my_base.urdf.xacro" />
        <xacro:include filename="my_camera.urdf.xacro" />
        <xacro:include filename="my_laser.urdf.xacro" />
        <xacro:include filename="move.urdf.xacro" />
    robot>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 启动launch文件:
    <launch>
        
        <param name="robot_description" command="$(find xacro)/xacro $(find demo02_urdf_gazebo)/urdf/xacro/my_base_camera_laser.urdf.xacro" />
        
        <include file="$(find gazebo_ros)/launch/empty_world.launch">
            <arg name="world_name" value="$(find demo02_urdf_gazebo)/worlds/hello.world" />
        include>
    
        
        <node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description"  />
    launch>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 控制机器人运动:命令行控制/编写节点控制:

    在这里插入图片描述


    二、传感器信息仿真及显示

    1. 里程计信息

    • 里程计信息:机器人相对于出发点坐标系的位姿状态(位置坐标与运动朝向)

    • 操作流程:

    1. 通过启动文件启动Rviz,打开状态发布节点:
    <launch>
       
       <node pkg="rviz" type="rviz" name="rviz" />
       
       <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
       <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
    launch>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1. 在Rviz中添加组件:

    在这里插入图片描述


    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 0pose>
          <visualize>truevisualize>
          <update_rate>5.5update_rate>
          <ray>
            <scan>
              <horizontal>
                <samples>360samples>
                <resolution>1resolution>
                <min_angle>-3min_angle>
                <max_angle>3max_angle>
              horizontal>
            scan>
            <range>
              <min>0.10min>
              <max>30.0max>
              <resolution>0.01resolution>
            range>
            <noise>
              <type>gaussiantype>
              <mean>0.0mean>
              <stddev>0.01stddev>
            noise>
          ray>
          <plugin name="gazebo_rplidar" filename="libgazebo_ros_laser.so">
            <topicName>/scantopicName>
            <frameName>laserframeName>
          plugin>
        sensor>
      gazebo>
    
    robot>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 2.2 集成文件到机器人模型中:
    
    <robot name="my_car_camera" xmlns:xacro="http://wiki.ros.org/xacro">
        <xacro:include filename="my_head.urdf.xacro" />
        <xacro:include filename="my_base.urdf.xacro" />
        <xacro:include filename="my_camera.urdf.xacro" />
        <xacro:include filename="my_laser.urdf.xacro" />
        <xacro:include filename="move.urdf.xacro" />
        
        <xacro:include filename="my_sensors_laser.urdf.xacro" />
    robot>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 2.3 启动gazebo,启动rviz,添加雷达信息显示插件:

    在这里插入图片描述


    3. 摄像头信息

    • 3.1 配置摄像头传感器
    <robot name="my_sensors" xmlns:xacro="http://wiki.ros.org/xacro">
      
      <gazebo reference="camera">
        
        <sensor type="camera" name="camera_node">
          <update_rate>30.0update_rate> 
          
          <camera name="head">
            <horizontal_fov>1.3962634horizontal_fov>
            <image>
              <width>1280width>
              <height>720height>
              <format>R8G8B8format>
            image>
            <clip>
              <near>0.02near>
              <far>300far>
            clip>
            <noise>
              <type>gaussiantype>
              <mean>0.0mean>
              <stddev>0.007stddev>
            noise>
          camera>
          
          <plugin name="gazebo_camera" filename="libgazebo_ros_camera.so">
            <alwaysOn>truealwaysOn>
            <updateRate>0.0updateRate>
            <cameraName>/cameracameraName>
            <imageTopicName>image_rawimageTopicName>
            <cameraInfoTopicName>camera_infocameraInfoTopicName>
            <frameName>cameraframeName>
            <hackBaseline>0.07hackBaseline>
            <distortionK1>0.0distortionK1>
            <distortionK2>0.0distortionK2>
            <distortionK3>0.0distortionK3>
            <distortionT1>0.0distortionT1>
            <distortionT2>0.0distortionT2>
          plugin>
        sensor>
      gazebo>
    robot>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 3.2 集成机器人模型,类似于前两个传感器,略
    • 3.3 启动仿真环境gazebo,启动rviz显示数据,添加组件:

    在这里插入图片描述


    4. kinect摄像头信息

    • 4.1 配置kinect传感器:
    <robot name="my_sensors" xmlns:xacro="http://wiki.ros.org/xacro">
        <gazebo reference="kinect link名称">  
          <sensor type="depth" name="camera">
            <always_on>truealways_on>
            <update_rate>20.0update_rate>
            <camera>
              <horizontal_fov>${60.0*PI/180.0}horizontal_fov>
              <image>
                <format>R8G8B8format>
                <width>640width>
                <height>480height>
              image>
              <clip>
                <near>0.05near>
                <far>8.0far>
              clip>
            camera>
            <plugin name="kinect_camera_controller" filename="libgazebo_ros_openni_kinect.so">
              <cameraName>cameracameraName>
              <alwaysOn>truealwaysOn>
              <updateRate>10updateRate>
              <imageTopicName>rgb/image_rawimageTopicName>
              <depthImageTopicName>depth/image_rawdepthImageTopicName>
              <pointCloudTopicName>depth/pointspointCloudTopicName>
              <cameraInfoTopicName>rgb/camera_infocameraInfoTopicName>
              <depthImageCameraInfoTopicName>depth/camera_infodepthImageCameraInfoTopicName>
              <frameName>kinect link名称frameName>
              <baseline>0.1baseline>
              <distortion_k1>0.0distortion_k1>
              <distortion_k2>0.0distortion_k2>
              <distortion_k3>0.0distortion_k3>
              <distortion_t1>0.0distortion_t1>
              <distortion_t2>0.0distortion_t2>
              <pointCloudCutoff>0.4pointCloudCutoff>
            plugin>
          sensor>
        gazebo>
    
    robot>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 4.2 集成机器人模型,类似于之前的传感器,略
    • 4.3 启动仿真环境gazebo,启动rviz显示数据,添加组件:

    在这里插入图片描述


    总结

    • 声明:本节博客部分参考了CSDN用户赵虚左的ROS教程,本文主要内容是使用URDF文件建立机器人模型,并通过Gazebo创建仿真环境,模拟传感器使用,在RVIZ中完成对于传感器数据的可视化分析和处理,在后半部分的分析中我们发现,对于传感器(里程计、雷达、摄像头)分析来说,都是从xacro文件出发,添加相应配置,集成到机器人模型文件,最后启动各仿真组件修改配置完成联合仿真,各仿真组件各司其职,完成对应效果。
    • 至此,ROS教程的进阶篇结束了,对于ROS部分的内容主要还有关于导航部分的内容会在后续进行补充,针对于Gazebo的使用教程也会另起专栏,敬请期待。

    在这里插入图片描述

  • 相关阅读:
    C语言下的文件详解
    输入框(input)的宽度根据内容自适应
    【ArcPy】简化ArcGISPro默认Python环境体量
    代码都成屎山了,还在用if-else?不如试试我的这套工厂模式+Map+自定义注解+枚举
    循环冗余校验(CRC)原理及python实现
    为国产信创服务器提供LDAP统一身份认证方案
    抓包 - Charles 安装篇
    数据结构与算法设计分析——贪心算法的应用
    JSP SSH 产品质量追溯管理统myeclipse开发mysql数据库MVC模式java编程网页设计
    Gitlab仓库部署
  • 原文地址:https://blog.csdn.net/lc1852109/article/details/126048940