ros关于一个软件包的完整解读(mrobot_gazebo)(一)模型文件mrobot_body.urdf.xacro

学了ros有一段时间了,所用的参考书目为《ROS机器人开发实践》,但是学了这么长时间,总感觉收货甚少,没有系统性的总结。
因此在这里,我针对一个功能性较为完善的软件包 mrobot_gazebo 进行完整解读。
参考链接:https://blog.csdn.net/wubaobao1993/article/details/80947968
这里不按照基础->深入的顺序,直接跟着代码走。
代码是《ROS机器人开发实践》的源码,功能包为mrobot_gazebo,用的模型是带有相机的mrobot模型

launch文件选择 view_mrobot_with_camera_gazebo.launch
xacro文件选择 mrobot_with_camera.urdf.xacro 和 mrobot_body.urdf.xacro

根据书的学习流程,先介绍模型文件

mrobot_body.urdf.xacro

首先xacro的头部模式:
规定了XML的版本、机器人的名称、以及声明链接也就是我们要告诉robot我们要用xacro

接下来预设材料的颜色,rgb代表三个通道,a代表透明度,这样我们之后直接使用这里设置的name调用颜色

接下来设置一系列属性值,是xacro的第一种宏定义方式。(理解为#define即可)

第一种就是你定义了一个值,这个值在以后的过程中一定是经常出现的,而后如果你某天数学变了,PI不等于3.14了,你就可以只更改这一个地方的值而修改程序中所有用到PI的地方,所谓牵一发而动全身也不错如此吧

也就是:
定义常量π

定义机器人底盘(base)的质量、半径、高

这个motor x以后再说

脚轮的半径、质量、脚轮与底盘链接关节处相关的x

轮子的半径、宽度、质量

底盘上面两个平台的质量、宽度和与立柱相连接joint的xy值

接下来是宏定义的第二种类型:

第二种就是你定义了一个宏定义,这个宏定义的名字就是name后面的字符串,他的参数在params中,因为是复数形式,因此参数值可以是多个值,声明的时候用空格隔开就可以了。如上面的例子所示,使用的时候照着形式来就可以了。

如这里定义球体的转动惯量,参数为 params=“m r” 参数之间用空格隔开
定义中需要传参或需要在传参后得到结果的地方都用参数符号进行占位,如
${m}
${2mr*r/5}

这里定义圆柱体的转动惯量,params=”m r h

接下来定义立方体的转动惯量

轮子link、joint、transmission的宏定义

轮子link

接下来定义轮子的宏定义,包括一个link+一个joint+与link绑定的transmission
link就是部件,joint就是关节,都很好理解
transmission是什么呢是一种动力源,是ros控制驱动机器人的体现,必须将传动装置transmistion与关节joint进行绑定,才能驱动机器人前进。
此宏定义如下图所示:

ros关于一个软件包的完整解读(mrobot_gazebo)(一)模型文件mrobot_body.urdf.xacro
图2
rpy=”${M_PI/2} 0 0 表示绕三个轴的旋转,弧度制,z轴是垂直rviz平台的。x轴沿着rviz平台,由于创建出的圆柱体是坐在rviz平台上的,因此绕着x轴旋转90度成为轮子的位姿。x轴方向可以理解为小车的前进方向。
当然,上面的位姿设定是在下的

可以这么认为,如果你想决定一个几何体在哪个位置,你只需要规定与之相连的joint在什么位置即可。

那么joint的位置怎么确定oint的位置与父级link相关,是相对与父级位置的xyz坐标

同样在下的还有,下是确定具体的几何形状。首先cylinder确认了是圆柱体,然后指定圆柱体的高度和半径。
使用了之前的宏定义颜色

总结一下:下有位姿、、材料(颜色)

接下来是碰撞检测 。看似是复制上面的visual定义,其实就是设置碰撞检测的范围和实体的范围一致
最后指定一下旋转惯量即可。
以上就定义结束了轮子的link实体,但是下面要跟一个与gazebo相关的

书上是这么说的:

针对机器人模型,需要对每一个link添加标签,包含的属性仅有material。要保持与link的visual下的material相同,并且gazebo无法使用上面visual的material进行颜色设置,因此在此标签中需要进一步指定。

轮子joint

接下来定义joint,是轮子与底盘链接的joint,具体可以参见图1。
type=”continuous”表示是一个旋转关节,可以围绕单轴无限旋转(P115)
紧接着指定父子link

接下来指定位姿

可以看到位姿x使用了宏定义的
即为-0.05,也就是沿着小车后退方向偏移-0.05。y位置是输入的参数translateY乘以底盘的半径base_link_radius,也用到了宏定义
这里为了明确,贴一张坐标图

ros关于一个软件包的完整解读(mrobot_gazebo)(一)模型文件mrobot_body.urdf.xacro
这里我用粗体再强调一遍

link的位置是由连接 父级和它 的joint决定的,而joint的位置是由父级link的位置决定的(而不是父级link的joint决定的,因为父级joint有多个,所以显然joint不能由joint决定,只能由唯一的父级link的位置进行偏移)

轮子transmission

最后一部分就是加驱动环节了。
首先是规定类型

ros关于一个软件包的完整解读(mrobot_gazebo)(一)模型文件mrobot_body.urdf.xacro

前侧球轮link、joint的宏定义

先贴上定义了什么:

ros关于一个软件包的完整解读(mrobot_gazebo)(一)模型文件mrobot_body.urdf.xacro
图6
接下来是几何形状,为球体,并指定半径

接下来材料为黑色,不必多说,用到了对颜色的宏定义
最终为碰撞检测,也不必多说,和visualize一致
最终指定一下旋转惯量即可,用到了球体旋转惯量的宏定义。

记住 link后面要加入gazebo标签

接下来定义球轮的joint

可以看到类型为fixed,固定关节,不允许运动的特殊关节(由此看来轮子不能转疑)
然后是父子link,其父级为base_link
最后是位置:

可以看到x方向(见图3)是一个偏移系数(宏输入的参数)乘以一个宏常量,y方向为0意味着是在中心轴线,z为负的球半径,意味着关节位于球体中心。记住,父级link是底盘base_link,位置要从base_link的中心进行推演。

ros关于一个软件包的完整解读(mrobot_gazebo)(一)模型文件mrobot_body.urdf.xacro

平台link、joint的宏定义

给个图

ros关于一个软件包的完整解读(mrobot_gazebo)(一)模型文件mrobot_body.urdf.xacro

立柱link、joint的宏定义

这次先定义joint,后定义的link,其实顺序都无所谓。但是一般先创建link,毕竟现有实体,再有连接嘛

ros关于一个软件包的完整解读(mrobot_gazebo)(一)模型文件mrobot_body.urdf.xacro
图10

最重要的mrobot_body的宏定义

这是最重要的打地基环节,一切东西都是由此伸展开来

首先要看到,这一大块宏定义叫做mrobot_body,最终此宏构建出来的东西为:

ros关于一个软件包的完整解读(mrobot_gazebo)(一)模型文件mrobot_body.urdf.xacro
图11
脚印叫做
脚印相当于创建了最原始的link,其他所有的东西都是由他来的,比如由他生成了底盘base_link,底盘又延展出来很多其他的东西。

代码就不进行详解了。

                                     来源:白色小靴
                                                        

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年1月17日
下一篇 2020年1月18日

相关推荐