·【ROS】中级操作学习整理-gazebo机器人仿真
·【ROS】中级操作学习整理-TF坐标变换
·【ROS】中级操作学习整理-传感器建模
·【ROS】中级操作学习整理-激光SLAM
目录
系列文章目录
文章目录
前言
一、gazebo介绍
二、机器人模型描述
1.运动学模型
2.视觉模型
3.动力学模型
4.碰撞模型
5.模型优化
6.物理引擎
三、话题使用
总结
前言
对于ROS的学习,其实我很早就开始了,先是跟着古月居老师的【ROS入门21讲】学了一遍,对ROS有了一个大概的认识,但是当时学完的感觉就是很懵逼,只知道跟着写代码,一些概念和程序多半是死记硬背,一遍学下来感觉什么也记不住,主要原因可能是当时刚上大二,C++基础一般,学习能力也比较弱(大一摸鱼混了一年),自己的理解能力很差,学完一遍后也没及时应用(没加实验室是我很后悔的),导致我学玩一边只记得一些很寻常的概念。
现在在做SLAM方向,要把ROS捡起来再学一遍了,对于前面的基础课程,可以看入门21讲,个人感觉中科院的ROS讲的也很不错,当然,最经典的还是roswiki的入门教程,我感觉很足够了,这里就不介绍初级教程了,直接进入中级篇。
对于一些ROS学习方法和路线,我整理在了这篇文章中。
gazebo是ROS的常用组件之一,是用来进行机器人仿真的平台,采用统一的机器人描述格式,可以对机器人的物理力学性能进行仿真,另外gazebo还提供了插件,可以在仿真环境中,通过我们自己编写的程序对机器人进行控制,也可以对机器人的传感器进行仿真,反正就是很方便,具体的介绍很多教程都有,我就不说了,直接开始正题。
打开gazebo的语句:
roslaunch gazebo_ros empty_world.launch
要实现物理上逼真的动力学仿真,必须足够详细的描述对象,一般详细的建模分为三部分:动力学模型、碰撞模型和视觉模型,对于有控制关节的机器人,还需要指定运动学模型。
gazebo中的机器人认为是由一系列的连杆和关节组成的,这与机器人学中的机器人描述相同,建模方法有DH法和改进DH法,在gazebo中使用的机器人描述格式为urdf格式,它使用xml语言,采用标签的方法进行书写,下面这段例子:
定义了两个连杆(base_footprint个base_link)之间用一个关节(base_footprint_joint)连接,link标签中,没有定义任何其他属性,只说了连杆的名字,关节标签中说明了连杆的名字和关节类型(比如平动、转动、浮动等),origin标签说明了关节坐标系的位姿(平移和旋转),parent标签说明了父关节,child标签说明了子关节。
下面我们为其中的连杆添加更多的信息。
这个很好理解,就是用于图形显示,视觉模型通常和碰撞模型相同,但是视觉模型有更高的保真度,在视觉模型部分,我们可以为机器人添加颜色、反射率、透明度、材料等描述,一般用的比较多的参数是材料、颜色和形状。
在这段代码中,我们为关节添加了一个视觉模型标签visual,这个标签中有一些参数:
经过视觉模型的定义,我们的小车加载到gazebo环境中就可以看到它的样子了。
图片是我定义了更多的参数,包括摄像头,这只是说明一下效果。
动力学模型主要定义每个连杆的质量属性和惯性,相当于对连杆本身特性的一个描述,常用的参数是质量和惯性矩阵。
这里我为小车定义了动力学模型,它的主要参数就是质量mass和惯性矩阵inertia,关于关联矩阵的知识可以看机器人学。
碰撞模型主要用来规定两个物体相互作用时的处理方法,主要参数是形状。
最后再为小车添加碰撞模型,使用collision标签,它的主要参数是坐标系位姿origin和形状geometry,它和视觉模型很像,你可以把它想象成透明度视觉模型,当有物体碰到这个模型时会发生碰撞。
在构建完机器人模型后,我们可以使用下面的代码,来检查我们的机器人模型是否正确
check_urdf mbot_with_camera_gazebo.urdf
显示结果如下:
也可以使用下面的代码,直接生成更直观的pdf图:
urdf_to_graphiz mbot_with_camera_gazebo.urdf
在当前目录下生成了一个pdf文件,如下图:
除了urdf格式,ros提供了一种更加简便的方式去方便用户书写机器人模型,那就是xacro格式,这种格式可以使机器人模型更加模块化,可以定义通用参数、可以调用其他xacro文件、可以进行代数运算等等,最好的是其中描述机器人的格式和urdf一样,只是增加了简单的语法,方便我们使用,可以说很友好了。
下面是一些xacro文件语句的介绍:
忘了说了,最上面的两行是用来说明xml的版本要求和机器人模型标签,这块学别人的写就行,不用记。
定义了xacro模型后,可以使用下面的语句将xacro格式转换为urdf格式,因为gazebo只认urdf格式
rosrun xacro xacro 你的xacro文件名.xacro > 生成的urdf文件名.urdf
也可以在launch文件中,直接写代码将xacro文件加入到gazebo环境中:
gazebo的另一个强大之处在于它支持各种各样的插件,这些插件包括传感器插件、关节控制插件等等,它们的存在可以方便用户便捷的对其进行可视化操作、获取其中关节的状态等,它们在xacro文件中一般是这样描述的:
它是在gazebo标签下,使用plugin标签进行描述的,其中filename是指定使用到的插件静态库,下面设置了一些参数,比如移动控制的话题(commandTopic)、里程计坐标系(odometryFrame)具体更多插件的细节就不展开了,可以去roswiki查看。
我们也可以在gazebo标签下直接设置关于gazebo的各种参数,这里也不详细说,可以查看roswiki
建立好机器人模型后,我们就可以在gazebo中把模型加载进来,然后根据它发布的一些话题对他进行一些操作了,写写好launch文件,将小车加载进gazebo环境:
执行代码:
roslaunch mbot_gazebo view_mbot_gazebo_empty_world.lanch
然后我们查看一下有哪些话题,我们可以操作:
rostopic list
有着一些列话题,其中有控制速度的/cmd_vel,摄像头拍摄的图像话题/camera/image_raw
我们可以使用键盘控制器来控制小车运动:
也可以打开一个rviz或者qt,订阅一下摄像头的画面看一下:
打开rviz:
rosrun rviz rviz
打开rqt:
rqt_image_view
大概就这样吧,这只是仿真中比较基础的一些操作,基本可以满足日常使用了,我们可以多看别人的文件,学习更多使用,平时能看懂就行,平时项目需要我们自己建模的场合也不多,另外也可以使用SolidWorks建模,然后转换成urdf格式,这样更加简便了。