由于种种原因,有时我们不能直接使用真实的机器人进行调试,这时就需要对机器人进行建模与仿真,在虚拟世界中实现对机器人的控制。
常见的机器人仿真系统有多种,比如 Webots、V-REP、MuJoCo、PyBullet 以及 Gazebo 等。
由于ROS官方默认推荐 Gazebo,我们这里仅以 Gazebo为例介绍机器人的建模与仿真。
一、Gazebo 介绍
Gazebo是一个功能丰富的开源机器人仿真平台,具备以下特点和功能:
- 动力学仿真:Gazebo支持多种高性能的物理引擎,如ODE、Bullet、SimBody和DART,能够进行精确的动力学计算和仿真。
- 三维可视化环境:它提供了一个逼真的三维环境,包括光线、纹理和影子,使得仿真场景更加接近现实。
- 传感器仿真:Gazebo支持模拟多种传感器,如激光雷达、相机等,并能模拟传感器噪声,这对于开发和测试机器人感知系统非常重要。
- 可扩展插件:用户可以通过开发自定义插件来扩展Gazebo的功能,满足特定的仿真需求。
- 支持多种机器人模型:Gazebo官方提供了多种机器人模型,如PR2、Pioneer2 DX、TurtleBot等,用户也可以使用自己创建的模型。
- 网络通信:Gazebo支持TCP/IP传输,可以实现远程仿真,后台仿真和前台显示通过网络通信。
- 云仿真:Gazebo仿真可以在云平台上运行,如Amazon、Softlayer等,方便进行大规模或分布式仿真。
Gazebo通常与机器人操作系统(ROS)结合使用。以下是一些基本的使用方法:
-
安装Gazebo:一般安装完整版的ROS会一起安装 Gazebo,如果没有安装 Gazebo,可以使用以下方法安装(以gazebo11为例):
1.添加源 sudo sh -c 'echo "deb http://packages./gazebo/ubuntu-stable `lsb_release -cs` main" > /etc/apt/sources.list.d/gazebo-stable.list' 2.设置秘钥 wget https://packages./gazebo.key -O - | sudo apt-key add - 3.更新源 sudo apt update 4.安装 sudo apt install gazebo11 sudo apt install libgazebo11-dev
-
导入模型:在使用Gazebo时,需要导入机器人和环境的模型。这些模型通常是以
urdf/sdf
格式存在的,Gazebo支持这两种格式的文件,并且提供了一些常用的模型库供用户下载和使用。 -
URDF和SDF文件:URDF(Unified Robot Description Format)和SDF(Simulation Description Format)是用于描述机器人和仿真环境的两种文件格式。URDF主要用于描述机器人模型,而SDF则用于描述仿真世界。Gazebo可以处理这两种格式的文件,并且用户可以在这两种格式之间进行转换。
二、URDF 建模介绍
URDF(Unified Robot Description Format,统一机器人描述格式)是ROS中一个非常重要的机器人模型描述格式,是一个标准的 XML格式,它可以反映机器人各个组件之间的位置关系。ROS同时也提供了URDF文件的C++解析器,可以解析URDF文件中使用XML格式描述的机器人模型。可以在任何文本编辑器中创建URDF文件,如果已经存在机器人的 CAD 模型,则可以使用一些工具将 CAD 模型转换为 URDF。
URDF描述机器人有一个基本思想,就是一切实体皆连杆(link),实体间的相对运动关系为称为关节(joint)。
2.1 一个简单的实体
首先,感受一下rviz中的显示,我们写一个简单的URDF文件来描述一个圆柱体,如下:
<?xml version="1.0"?>
<robot name="mbot">
<link name="base_link">
<visual>
<geometry>
<cylinder length="0.1" radius="0.2"/>
</geometry>
</visual>
</link>
</robot>
使用rviz查看如下图:
2.2 rivz显示URDF模型
rviz是怎么找到所指定的URDF模型的呢?
通过向参数服务器查询,没错,URDF模型是储存在参数服务器中的,需要我们写入。
一般是通过 launch 文件写入,如下:
<launch>
<param name="urdf_hello_world" textfile="$(find simulation_learning)/urdf/hello_world.urdf" />
</launch>
其中,urdf_hello_world
是参数名字,后面供rviz查询模型;textfile
代表从文件写入参数,值为文件路径,$(find simulation_learning)
是查找simulation_learning
功能包的路径。
执行上述launch文件即可将你的URDF文件写入ROS参数服务器。
然后打开rviz,初始界面如下图:
然后点击Add
添加视图,选择By display type
中的 RobotModel
,如下图:
添加后会发现有报错,查看报错信息如下:
参数 robot_description
不存在,这是rviz RobotModel 默认的参数名,我们需要将Robot Description
一项改成自己设置的参数名,如下图:
可以发现,修改后,模型显示出来了,但仍有报错,报错为 base_link
和 map
没有转换关系。我们的模型实体名称为 base_link
,rviz中设置的固定参考系(Fixed Frame)是 map
,我们没有告知系统我们的模型在map中的位置,所以会报这个错。将固定参考系设置为我们的 base_link
即可,如下图:
2.3 保存与加载rviz配置
每次用rviz加载模型都需要配置信息,甚至更多,为了方便,我们可以导出rviz配置,下次打开直接加载即可。
导出配置:依次选择 File
-> Save Config As
,然后选择你要保存的位置即可。
加载配置:依次选择 File
-> Open Config
,然后选择你的配置文件即可。
2.4 launch文件快速启动
有时不仅会使用rviz打开模型并加载配置,还会发布模型位置信息,有时甚至还会打开多个模型,这时手动打开rviz就显得过于笨拙了,我们使用launch文件可以快速执行上述任务,如下是打开 hello_world
模型并加载rviz配置的launch内容:
<launch>
<param name="urdf_hello_world" textfile="$(find simulation_learning)/urdf/hello_world.urdf" />
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find simulation_learning)/config/hello_world.rviz"/>
</launch>
其中,hello_world.rviz
导出的rviz配置。
2.5 package结构
工程中,我们一般把上述文件存放在package结构中,需要时可以作为一个功能包发布,
其中,
config
:存放rviz配置文件launch
:存放launch文件meshes
:存放模型渲染文件urdf
:存放URDF模型文件src/include
:存放源文件和头文件