当前位置:   article > 正文

11.机器人系统仿真搭建gazebo环境、仿真深度相机、雷达、RGB相机_gazebo仿真环境搭建

gazebo仿真环境搭建

目录

1 gazebo仿真环境搭建

1.1  直接添加内置组件创建仿真环境

1.2 urdf、gazebo、rviz的综合应用

2 ROS_control

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

2.1.1 已经创建完毕的机器人模型,编写一个单独的 xacro 文件,为机器人模型添加传动装置以及控制器

2.1.2 将此文件集成进xacro文件

2.1.3 修改launch文件

2.1.3  启动 Gazebo 并发布 /cmd_vel 消息控制机器人运动

2.3.4 里程计查看

3 雷达仿真信息以及显示

3.1 实现流程

3.2 为机器人模型添加雷达配置

3.3 集成进xacro文件

3.4 启动 Gazebo,使用 Rviz 显示雷达信息

4 摄像头仿真

4.1 为机器人模型添加摄像头配置

4.2 为机器人模型添加相机配置

5 深度相机Kinect仿真

5.1 为机器人模型添加深度相机配置

5.2 kinect点云数据显示


1 gazebo仿真环境搭建

        到目前为止,我们已经可以将机器人模型显示在 Gazebo 之中了,但是当前默认情况下,在 Gazebo 中机器人模型是在 empty world 中,并没有类似于房间、家具、道路、树木... 之类的仿真物,如何在 Gazebo 中创建仿真环境呢?

Gazebo 中创建仿真实现方式有两种:

  • 方式1: 直接添加内置组件创建仿真环境

  • 方式2: 手动绘制仿真环境(更为灵活)

也还可以直接下载使用官方或第三方提高的仿真环境插件。

1.1  直接添加内置组件创建仿真环境

        启动roscore之后:

rosrun gazebo_ros gazebo

        是一个空的世界,我们设置一些障碍物。

        点击保存(save world as)即可。生成一个.world文件。

        选择Editor --> Building Editor

        可以添加门添加窗户等。

1.2 urdf、gazebo、rviz的综合应用

        关于URDF(Xacro)、Rviz 和 Gazebo 三者的关系,前面已有阐述: URDF 用于创建机器人模型、Rviz 可以显示机器人感知到的环境信息,Gazebo 用于仿真,可以模拟外界环境,以及机器人的一些传感器,如何在 Gazebo 中运行这些传感器,并显示这些传感器的数据(机器人的视角)呢?本节主要介绍的重点就是将三者结合:通过 Gazebo 模拟机器人的传感器,然后在 Rviz 中显示这些传感器感知到的数据。主要内容包括:

  • 运动控制以及里程计信息显示

  • 雷达信息仿真以及显示

  • 摄像头信息仿真以及显示

  • kinect 信息仿真以及显示

2 ROS_control

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

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

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

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

        承上,运动控制基本流程:

  1. 已经创建完毕的机器人模型,编写一个单独的 xacro 文件,为机器人模型添加传动装置以及控制器

  2. 将此文件集成进xacro文件

  3. 启动 Gazebo 并发布 /cmd_vel 消息控制机器人运动

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

2.1.1 已经创建完毕的机器人模型,编写一个单独的 xacro 文件,为机器人模型添加传动装置以及控制器

        我们建立一个文件夹gazebo,存放传动装置以及控制器相关文件:move.xacro

        把这个传动装置以及控制器相关文件集成进总的xacro文件中:

        官方文档复制下来即可,无需自己写:

  1. <robot name="my_car_move" xmlns:xacro="http://wiki.ros.org/xacro">
  2. <!-- 传动实现:用于连接控制器与关节 -->
  3. <xacro:macro name="joint_trans" params="joint_name">
  4. <!-- Transmission is important to link the joints and the controller -->
  5. <transmission name="${joint_name}_trans">
  6. <type>transmission_interface/SimpleTransmission</type>
  7. <joint name="${joint_name}">
  8. <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
  9. </joint>
  10. <actuator name="${joint_name}_motor">
  11. <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
  12. <mechanicalReduction>1</mechanicalReduction>
  13. </actuator>
  14. </transmission>
  15. </xacro:macro>
  16. <!-- 每一个驱动轮都需要配置传动装置 -->
  17. <xacro:joint_trans joint_name="left_wheel2base_link" />
  18. <xacro:joint_trans joint_name="right_wheel2base_link" />
  19. <!-- 控制器 -->
  20. <gazebo>
  21. <plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so">
  22. <rosDebugLevel>Debug</rosDebugLevel>
  23. <publishWheelTF>true</publishWheelTF>
  24. <robotNamespace>/</robotNamespace>
  25. <publishTf>1</publishTf>
  26. <publishWheelJointState>true</publishWheelJointState>
  27. <alwaysOn>true</alwaysOn>
  28. <updateRate>100.0</updateRate>
  29. <legacyMode>true</legacyMode>
  30. <leftJoint>left_wheel2base_link</leftJoint> <!-- 左轮 -->
  31. <rightJoint>right_wheel2base_link</rightJoint> <!-- 右轮 -->
  32. <wheelSeparation>${base_link_radius * 2}</wheelSeparation> <!-- 车轮间距 -->
  33. <wheelDiameter>${wheel_radius * 2}</wheelDiameter> <!-- 车轮直径 -->
  34. <broadcastTF>1</broadcastTF>
  35. <wheelTorque>30</wheelTorque>
  36. <wheelAcceleration>1.8</wheelAcceleration>
  37. <commandTopic>cmd_vel</commandTopic> <!-- 运动控制话题 -->
  38. <odometryFrame>odom</odometryFrame>
  39. <odometryTopic>odom</odometryTopic> <!-- 里程计话题 -->
  40. <robotBaseFrame>base_footprint</robotBaseFrame> <!-- 根坐标系 -->
  41. </plugin>
  42. </gazebo>
  43. </robot>

        解释一下怎么适配自己的场景:

        第一部分是传动实现:用于连接控制器与关节

        这里要改成我们自己的关节。

        我们的驱动轮关节名叫做base_link2_${wheel_name},传入参数是left和right,因此move.xacro改为:

  1. <xacro:joint_trans joint_name="base_link2_left" />
  2. <xacro:joint_trans joint_name="base_link2_right" />

        后面是差速控制器:

        整体来看是这样!

  1. <robot name="my_car_move" xmlns:xacro="http://wiki.ros.org/xacro">
  2. <xacro:macro name="joint_trans" params="joint_name">
  3. <!-- Transmission is important to link the joints and the controller -->
  4. <transmission name="${joint_name}_trans">
  5. <type>transmission_interface/SimpleTransmission</type>
  6. <joint name="${joint_name}">
  7. <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
  8. </joint>
  9. <actuator name="${joint_name}_motor">
  10. <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
  11. <mechanicalReduction>1</mechanicalReduction>
  12. </actuator>
  13. </transmission>
  14. </xacro:macro>
  15. <xacro:joint_trans joint_name="base_link2_left" />
  16. <xacro:joint_trans joint_name="base_link2_right" />
  17. <gazebo>
  18. <plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so">
  19. <rosDebugLevel>Debug</rosDebugLevel>
  20. <publishWheelTF>true</publishWheelTF>
  21. <robotNamespace>/</robotNamespace>
  22. <publishTf>1</publishTf>
  23. <publishWheelJointState>true</publishWheelJointState>
  24. <alwaysOn>true</alwaysOn>
  25. <updateRate>100.0</updateRate>
  26. <legacyMode>true</legacyMode>
  27. <leftJoint>base_link2_left</leftJoint>
  28. <rightJoint>base_link2_right</rightJoint>
  29. <wheelSeparation>${base_radius * 2}</wheelSeparation>
  30. <wheelDiameter>${wheel_radius * 2}</wheelDiameter>
  31. <broadcastTF>1</broadcastTF>
  32. <wheelTorque>30</wheelTorque>
  33. <wheelAcceleration>1.8</wheelAcceleration>
  34. <commandTopic>cmd_vel</commandTopic>
  35. <odometryFrame>odom</odometryFrame>
  36. <odometryTopic>odom</odometryTopic>
  37. <robotBaseFrame>base_footprint</robotBaseFrame>
  38. </plugin>
  39. </gazebo>
  40. </robot>

2.1.2 将此文件集成进xacro文件

  1. <robot name="mycarwithlidarandcamera" xmlns:xacro="http://wiki.ros.org/xacro">
  2. <xacro:include filename="interial.xacro" />
  3. <xacro:include filename="demo05carbase.xacro" />
  4. <xacro:include filename="cam.xacro" />
  5. <xacro:include filename="lidar.xacro" />
  6. <xacro:include filename="/home/liuhongwei/Desktop/final/catkin_studyrobot/src/gazebo/move.xacro"/>
  7. </robot>

        就把刚刚加入就好。

2.1.3 修改launch文件

         不需要修改:

  1. <launch>
  2. <param name="robot_description" command="$(find xacro)/xacro /home/liuhongwei/Desktop/final/catkin_studyrobot/src/urdf/xacro/car_gazebo.xacro" />
  3. <include file="$(find gazebo_ros)/launch/empty_world.launch">
  4. <arg name="world_name" value="/home/liuhongwei/Desktop/final/catkin_studyrobot/src/world/box_house.world" />
  5. </include>
  6. <node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description" />
  7. </launch>

        roslaunch test gazebo_car.launch

2.1.3  启动 Gazebo 并发布 /cmd_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}}'

        机器人运动了!

        或者安装控制节点:

sudo apt install ros-melodic-teleop-twist-keyboard

rosrun teleop_twist_keyboard teleop_twist_keyboard.py

        当然,线速度、角速度比较快.....

        我们可以通过传参降低速度:

 rosrun teleop_twist_keyboard teleop_twist_keyboard.py _speed:=0.3  _turn:=0.5

        现在运动幅度就小多了。

2.3.4 里程计查看

        我们要启动关节和机器人运动发布状态节点:multisensor.launch

  1. <launch>
  2. <node pkg="rviz" type="rviz" name="rviz" args="-d /home/liuhongwei/Desktop/final/catkin_studyrobot/src/config/qidong.rviz"/>
  3. <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />
  4. <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" />
  5. </launch>

        我们再打开之前的节点:

  1. <launch>
  2. <param name="robot_description" command="$(find xacro)/xacro /home/liuhongwei/Desktop/final/catkin_studyrobot/src/urdf/xacro/car_gazebo.xacro" />
  3. <include file="$(find gazebo_ros)/launch/empty_world.launch">
  4. <arg name="world_name" value="/home/liuhongwei/Desktop/final/catkin_studyrobot/src/world/box_house.world" />
  5. </include>
  6. <node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description" />
  7. </launch>

        设置Fix Frame为odom。

        我们打开键盘控制节点:

        都动啦!

3 雷达仿真信息以及显示

3.1 实现流程

实现流程:

雷达仿真基本流程:

  1. 已经创建完毕的机器人模型,编写一个单独的 xacro 文件,为机器人模型添加雷达配置;

  2. 将此文件集成进xacro文件;

  3. 启动 Gazebo,使用 Rviz 显示雷达信息。

3.2 为机器人模型添加雷达配置

        我们需要把雷达贴到一个模块上:

        之前我们设置过lidar:

        如下:

  1. <robot name="my_sensors" xmlns:xacro="http://wiki.ros.org/xacro">
  2. <gazebo reference="laser">
  3. <sensor type="ray" name="rplidar">
  4. <pose>0 0 0 0 0 0</pose>
  5. <visualize>true</visualize>
  6. <update_rate>5.5</update_rate>
  7. <ray>
  8. <scan>
  9. <horizontal>
  10. <samples>360</samples>
  11. <resolution>1</resolution>
  12. <min_angle>-3</min_angle>
  13. <max_angle>3</max_angle>
  14. </horizontal>
  15. </scan>
  16. <range>
  17. <min>0.10</min>
  18. <max>30.0</max>
  19. <resolution>0.01</resolution>
  20. </range>
  21. <noise>
  22. <type>gaussian</type>
  23. <mean>0.0</mean>
  24. <stddev>0.01</stddev>
  25. </noise>
  26. </ray>
  27. <plugin name="gazebo_rplidar" filename="libgazebo_ros_laser.so">
  28. <topicName>/scan</topicName>
  29. <frameName>laser</frameName>
  30. </plugin>
  31. </sensor>
  32. </gazebo>
  33. </robot>

        完成!

3.3 集成进xacro文件

  1. <robot name="mycarwithlidarandcamera" xmlns:xacro="http://wiki.ros.org/xacro">
  2. <xacro:include filename="interial.xacro" />
  3. <xacro:include filename="demo05carbase.xacro" />
  4. <xacro:include filename="cam.xacro" />
  5. <xacro:include filename="lidar.xacro" />
  6. <xacro:include filename="/home/liuhongwei/Desktop/final/catkin_studyrobot/src/gazebo/move.xacro"/>
  7. <xacro:include filename="/home/liuhongwei/Desktop/final/catkin_studyrobot/src/gazebo/laser.xacro"/>
  8. </robot>

        把雷达传感器集成进xacro。

3.4 启动 Gazebo,使用 Rviz 显示雷达信息

        启动双launch节点:

        /scan话题就是雷达话题。

        gazebo中也有显示了。这是雷达的不可见扫描光束。

4 摄像头仿真

4.1 为机器人模型添加摄像头配置

  1. <robot name="my_sensors" xmlns:xacro="http://wiki.ros.org/xacro">
  2. <gazebo reference="camera">
  3. <sensor type="camera" name="camera_node">
  4. <update_rate>30.0</update_rate>
  5. <camera name="head">
  6. <horizontal_fov>1.3962634</horizontal_fov>
  7. <image>
  8. <width>1280</width>
  9. <height>720</height>
  10. <format>R8G8B8</format>
  11. </image>
  12. <clip>
  13. <near>0.02</near>
  14. <far>300</far>
  15. </clip>
  16. <noise>
  17. <type>gaussian</type>
  18. <mean>0.0</mean>
  19. <stddev>0.007</stddev>
  20. </noise>
  21. </camera>
  22. <plugin name="gazebo_camera" filename="libgazebo_ros_camera.so">
  23. <alwaysOn>true</alwaysOn>
  24. <updateRate>0.0</updateRate>
  25. <cameraName>/camera</cameraName>
  26. <imageTopicName>image_raw</imageTopicName>
  27. <cameraInfoTopicName>camera_info</cameraInfoTopicName>
  28. <frameName>camera</frameName>
  29. <hackBaseline>0.07</hackBaseline>
  30. <distortionK1>0.0</distortionK1>
  31. <distortionK2>0.0</distortionK2>
  32. <distortionK3>0.0</distortionK3>
  33. <distortionT1>0.0</distortionT1>
  34. <distortionT2>0.0</distortionT2>
  35. </plugin>
  36. </sensor>
  37. </gazebo>
  38. </robot>

4.2 为机器人模型添加相机配置

  1. <robot name="mycarwithlidarandcamera" xmlns:xacro="http://wiki.ros.org/xacro">
  2. <xacro:include filename="interial.xacro" />
  3. <xacro:include filename="demo05carbase.xacro" />
  4. <xacro:include filename="cam.xacro" />
  5. <xacro:include filename="lidar.xacro" />
  6. <xacro:include filename="/home/liuhongwei/Desktop/final/catkin_studyrobot/src/gazebo/move.xacro"/>
  7. <xacro:include filename="/home/liuhongwei/Desktop/final/catkin_studyrobot/src/gazebo/laser.xacro"/>
  8. <xacro:include filename="/home/liuhongwei/Desktop/final/catkin_studyrobot/src/gazebo/camera.xacro"/>
  9. </robot>

        成功!

5 深度相机Kinect仿真

5.1 为机器人模型添加深度相机配置

  1. <robot name="my_sensors" xmlns:xacro="http://wiki.ros.org/xacro">
  2. <gazebo reference="support">
  3. <sensor type="depth" name="camera">
  4. <always_on>true</always_on>
  5. <update_rate>20.0</update_rate>
  6. <camera>
  7. <horizontal_fov>${60.0*PI/180.0}</horizontal_fov>
  8. <image>
  9. <format>R8G8B8</format>
  10. <width>640</width>
  11. <height>480</height>
  12. </image>
  13. <clip>
  14. <near>0.05</near>
  15. <far>8.0</far>
  16. </clip>
  17. </camera>
  18. <plugin name="kinect_camera_controller" filename="libgazebo_ros_openni_kinect.so">
  19. <cameraName>camera</cameraName>
  20. <alwaysOn>true</alwaysOn>
  21. <updateRate>10</updateRate>
  22. <imageTopicName>rgb/image_raw</imageTopicName>
  23. <depthImageTopicName>depth/image_raw</depthImageTopicName>
  24. <pointCloudTopicName>depth/points</pointCloudTopicName>
  25. <cameraInfoTopicName>rgb/camera_info</cameraInfoTopicName>
  26. <depthImageCameraInfoTopicName>depth/camera_info</depthImageCameraInfoTopicName>
  27. <frameName>support</frameName>
  28. <baseline>0.1</baseline>
  29. <distortion_k1>0.0</distortion_k1>
  30. <distortion_k2>0.0</distortion_k2>
  31. <distortion_k3>0.0</distortion_k3>
  32. <distortion_t1>0.0</distortion_t1>
  33. <distortion_t2>0.0</distortion_t2>
  34. <pointCloudCutoff>0.4</pointCloudCutoff>
  35. </plugin>
  36. </sensor>
  37. </gazebo>
  38. </robot>
  1. <robot name="mycarwithlidarandcamera" xmlns:xacro="http://wiki.ros.org/xacro">
  2. <xacro:include filename="interial.xacro" />
  3. <xacro:include filename="demo05carbase.xacro" />
  4. <xacro:include filename="cam.xacro" />
  5. <xacro:include filename="lidar.xacro" />
  6. <xacro:include filename="/home/liuhongwei/Desktop/final/catkin_studyrobot/src/gazebo/move.xacro"/>
  7. <xacro:include filename="/home/liuhongwei/Desktop/final/catkin_studyrobot/src/gazebo/laser.xacro"/>
  8. <xacro:include filename="/home/liuhongwei/Desktop/final/catkin_studyrobot/src/gazebo/camera.xacro"/>
  9. <xacro:include filename="/home/liuhongwei/Desktop/final/catkin_studyrobot/src/gazebo/kinect.xacro"/>
  10. </robot>

        启动!

5.2 kinect点云数据显示

        在kinect中也可以以点云的方式显示感知周围环境,在 rviz 中操作如下:

        添加PointCloud2点云,但是显示错位了。

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

        怎么解决呢??

        在插件中为kinect设置坐标系,修改配置文件的<frameName>标签内容:

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

  1. <launch>
  2. <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. <node pkg="rviz" type="rviz" name="rviz" args="-d /home/liuhongwei/Desktop/final/catkin_studyrobot/src/config/qidong.rviz"/>
  4. <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />
  5. <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" />
  6. </launch>

        OK!

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

闽ICP备14008679号