一、使用Gazebo构建世界:
1、为什么使用?
ros2本身是不提供仿真功能的,所以要完成仿真就要结合其他软件来实现,上一章介绍的仿真软件中Gazebo对ros2的支持相对更加友好,所以我们使用Gazebo来完成接下来的仿真任务。
2、安装Gazebo:
sudo apt install gazebo
安装好后,输入:gazebo 打开Gazebo
使用WSL系统的如果启动闪退,则图形渲染有问题,先Ctrl键+C退出,输入:
export LIBGL_ALWAYS_SOFTWARE=1
顺便可以设置下改变字体:export QT_SCALE_FACTOR=1.5
3、下载模型:
Gazebo内置一些机器人的模型,我们可以下载来使用。
mkdir -p ~/.gazebo 创建一个隐藏文件夹,在主目录下,名字叫.gazebo
cd ~/.gazebo 进入文件目录
git clone https://gitee.com/ohhuo/gazebo_models.git ~/.gazebo/models git上拉取模型
rm -rf ~/.gazebo/models/.git 删掉.git 防止误识别为模型
在指定目录下启动gazebo
4、使用Gazebo
建墙
改名字,选择保存路径。
尽量把room放到世界中心,因为等会我们的机器人是在世界中心的
编辑好了后保存
上一步是建立房间,保存房间模型,这一步是把房间模型和家具组合到一起,绑定到一个世界。
保存的文件内容的格式和urdf的文件格式差不多,都是xml格式,但也有不一样,gazebo使用的是sdf格式,继承并扩展了URDF文件,这就是为什么gazebo文件在细节上和URDF相似的原因。
二、加载机器人模型
1、安装:
Gazebo使用的是sdf格式,而我们的机器人建模使用的是URDF,所以要想在Gazebo中显示机器人模型,就需要将URDF转换成sdf。ros2提供了一些功能包,可以帮助我们直接实现这一转换。
sudo apt install ros-$ROS_DISTRO-gazebo-ros-pkgs
2、启动gazebo:
启动gazebo的时候要加载我们自定义的世界模型。
3、fishbot加载到gazebo中:
1)xacro转换urdf格式:
2)urdf格式转换成sdf格式:
4、机器人加载到gazebo中:
spawn_entity.py —— 将 URDF 转换成sdf格式,然后调用相应的服务去把sdf加载到gazebo中来。
5、实现:
6、运行
启动后,发现我的小车翻了,原来是我的laser.urdf.xacro 里的laser_link的这个<xacro:cylinder_inertia m="0.10" r="0.02" h="0.02"/> 标签中的 m="0.10"给到了m="0.10"和base_link的m="0.10"一样的,雷达这么重,整个base_link也这么重,所以无法支撑起来,小车就翻了,后来改了,重新colcon build,但是半天还是歪的,说是已经有fishbot的link了,span-entity直接用的之前的,后来我才发现在小车翻车的时候,我保存了world文件,里面就有了fishbot的特点,无论我后面怎么改,在gazebo里都不会有变化,要么在gazebo_sim.lanuch.py中将
entity的值改了,对应的我在custom_room.world里找到了僵尸fishbot,我把他删了,一切正常了。
gazebo世界的东西和重量还有惯性以及碰撞属性都有关系,所以在做机器人建模的时候,一定要确定好各个link的重量关系、位置关系,因为重量关系在rviz里看不出来错误,但是在仿真世界里是一目了然的。还有就是要学会看启动文件下的代码,我也看下面的代码,才慢慢猜测到问题的可能性的。
三、使用Gazebo标签扩展URDF
1、扩展标签网址:
simulator_gazebo/Tutorials/ListOfMaterials - ROS Wiki
2、举例
四、使用两轮差速插件控制机器人
1、插件:
gazebo插件其实就是一行代码:
<plugin name='diff_drive' filename='libgazebo_ros_diff_drive.so'>
这一行代码会去解析我们在gazebo中URDF里的配置,这些配置就会去调用gazebo接口,去控制相关的,并且去订阅或发布一些话题,比如这个libgazebo_ros_diff_drive两轮差速驱动这一个插件,就会去订阅这个/cmf_vel这个驱动,用于控制机器人的角速度、线速度这样的一个话题,同时会发布/tf和/odom,/odom就是所谓的机器人往前走的多一点,然后转多少度。
2、实现:
1)编写:
2)使用:
新终端记得 source 下
3、控制小车:
打开新终端,使用键盘控制:
ros2 run teleop_twist_keyboard teleop_twist_keyboard
我们就可以使用键盘控制小车了。
五、激光雷达传感器仿真
1、介绍:
激光雷达传感器是一种可以测量距离的传感器,他可以准确提供机器人周围的环境距离信息,使用gazebo插件可以方便的对激光雷达进行仿真。
2、实现:
书本198页代码
修改fishbot.urdf.xacro
3、查看:
打开新终端,使用rviz2,然后按以下步骤执行。
六、惯性测量传感器仿真
1、介绍:
imu是一种继承了多个惯性传感器的设备,通过该传感器可以测量三轴角速度和线加速度数据,通过对角速度进行积分和计算,就可以得到设备的姿态变化信息。
2、实现:
imu实质也是一个传感器,因此写在一个gazebo_sensor_plugin.xacro里,书本200-201.
七、深度相机传感器仿真
1、介绍:
深度相机是一种可以获取深度信息的特殊相机,往往会配合彩色相机一起使用,彩色相机可以通过图像识别获取物体的像素坐标,结合深度就可以得到识别对象的三个坐标,机器人就可以针对目标做出相应的操作,因为深度相机的坐标系,默认的前方是Z轴,所以我们在URDF文件中就要添加一个虚拟的部件来调整一下方位。
2、调整方位:
虚拟部件的目的:就是将我们的相机的Z轴转向前方。
3、配置相机:
4、查看:
新终端打开 rviz2,记得