ROS学习笔记 06 构建机器人仿真平台
前言
系统环境: Ubuntu 18.04,硬盘安装。
ROS版本: melodic
深蓝学院(古月居)胡春旭ROS理论与实践笔记整理。
1. 优化物理仿真
1.1 xacro基本语法
-
精简模型代码
- 创建宏定义
- 文件包括
-
提供可编程接口
- 常量
- 变量
- 数学计算
- 条件语句
-
常量定义与使用:
1 | <xacro:property name="M_PI" value="3.14159" /> |
- 数学计算:
1 | <origin xyz="0 ${(motor_length+wheel_length)/2} 0" rpy = "0 0 0" /> |
- 宏定义:
1 | <xacro:macro name = "name" params="A B C"> |
- 宏调用:
1 | <name A="A_value" B="B_value" C="C_value" /> |
- 文件包含:
1 | <xacro:include filename="$(find mbot_description)/urdf/mbot_base_gazebo.xacro" /> |
1.2 ros_control框架
- ros_control
- ROS为开发者提供的机器人控制中间件
- 包含一系列控制器接口、传动装置接口、硬件接口、控制器工具箱等待
- 可以帮助机器人应用功能包快速落地,提高开发效率。
其中:
- 控制器管理器
提供一种通用的接口来管理不同的控制器。
- 控制器
读取硬件状态,发布控制命令,完成每个joint的控制。
- 硬件资源
为上下两层提供硬件资源的接口。
- 机器人硬件抽象
机器人硬件抽象和硬件资源直接打交道,通过write和read方法完成硬件操作。
- 真实机器人
执行接收到的命令
-
ros_control里主要提供四种控制器:
-
joint_state_controller
-
joint_effort_controller
-
joint_position_controller
-
joint_velocity_controller
-
1.3 模型优化步骤
需要对URDF文件做优化。
- 第一步:为link添加惯性参数和碰撞属性
比如下列代码,base_link的碰撞属性是一个圆柱体,惯性矩阵就是宏cylinder_inertial_matrix,返回的是一个的惯性矩阵。
1 | <xacro:macro name="cylinder_inertial_matrix" params="m r h"> |
- 第二步:为link添加gazebo标签
这里的<turnGravityOff>
是对模型的“影子”base_footprint的重力设置为0。
1 | <gazebo reference="${prefix}_wheel_link"> |
- 第三步:为joint添加传动装置
- SimpleTransmission: ROS提供的简单的传动装置类型
- 实现了VelocityJointInterface接口
<joint>
代表传动关节,<motor>
代表电机<mechanicalReduction>
代表关节和电机之间的减速比。
1 | <!-- Transmission is important to link the joints and the controller --> |
- 第四步:添加gazebo控制器插件
libgazebo_ros_diff_drive.so:ROS提供的差速控制插件。
1 | <!-- controller --> |
其中,需要注意的是:
<robotNamespace>
:机器人的命名空间,"/"代表不设置命名空间<leftJoint>
和<rightJoint>
左右轮转动的关节joint。<wheelSeparation>
和wheelDiameter
:机器人模型的相关尺寸,在计算差速参数时需要用到。<commandTopic>
:控制器订阅的速度控制指令,生成全局命名时需要结合<robotNamespace>
中设置的命名空间。<odometryFrame>
:里程计数据的参考坐标系,ROS中一般都命名为odom。
- 第五步:编写launch文件:
1 | <launch> |
- 第六步:编写launch文件
1 | <launch> |
- 第七步: 测试
1 | $ roslaunch mbot_gazebo view_mbot_gazebo_empty_world.launch |
2. 创建物理仿真环境
常用的两种方式:
- 第一种方法: 直接添加环境模型(直接insert)
- 第二种方法:使用Gazebo提供的小软件Building Editor
以一个之前保存的仿真环境为例:
1 | <launch> |
启动仿真环境:
1 | $ roslaunch mbot_gazebo view_mbot_gazebo_play_ground.launch |
编写键盘控制的脚本:
1 | #!/usr/bin/env python |
编写launch文件:
1 | <launch> |
启动键盘控制:
1 | $ roslaunch mbot_teleop mbot_teleop.launch |
3. 传感器仿真
3.1 常规摄像头
写一个宏定义文件camera_gazebo.xacro:
1 |
|
需要注意的是:
<sensor>
标签:描述传感器- type:传感器类型,camera
- name:摄像头命名,自由设置
<camera>
标签:描述摄像头参数- 分辨率,编码格式,图像范围,噪音参数等
<plugin>
标签:加载摄像头仿真插件 libgazebo_ros_camera.so- 设置插件的命名空间、发布图像的话题、参考坐标系等
此时,在之前的base_link的宏里把base_link和camera连接起来:
1 |
|
最后,写一个launch文件:
1 | <launch> |
启动仿真环境并使用rqt小工具仿真:
1 | $ roslaunch mbot_gazebo view_mbot_with_camera_gazebo.launch |
左上角改成/camera/image_raw,这样就可以通过rqt小工具仿真虚拟摄像头。
3.2 RGB-D摄像头(kinect)
和camera类似,先写一个宏定义文件:
1 | <?xml version="1.0"?> |
在之前的base_link的宏里把base_link和RGB-D连接起来:
1 |
|
最后写一个launch文件:
1 | <launch> |
启动仿真环境:
1 | $ roslaunch mbot_gazebo view_mbot_with_kinect_gazebo.launch |
在rviz中显示:
1 | $ rosrun rviz rviz |
Add一个pointCloud2,一个robotmodel,topic选择/kinect/depth/points,fixed Frame改成odom,让小车动起来:
1 | $ roslaunch mbot_teleop mbot_teleop.launch |
深度图也会随运动改变。
3.3 激光雷达仿真
也和常规camera类似,先写一个宏定义文件:
1 | <launch> |
再连接link:
1 |
|
最后写launch文件:
1 | <launch> |
启动仿真环境:
1 | roslaunch mbot_gazebo view_mbot_with_lase_gazebo.launch |
在rviz中显示:
1 | $ rosrun rviz rviz |
Add一个LaserScan并且topic订阅/scan,add一个robotModel,再键盘控制小车:
1 | $ roslaunch mbot_teleop mbot_teleop.launch |
深度图也会随运动改变。