# 2.为机器人URDF模型注入物理属性 上节我们知道,机器人仿真就是用软件来模拟硬件的特性,那么我们必须要告诉仿真平台机器人各个关节的物理属性,比如: - 有多重, - 有多大的惯性 - 重心在哪 - 碰撞边界在哪 - 关节的上下界限 - 其他的一些必要信息等等 所以这节课小鱼就带你将物理信息写入到urdf中,让机器人在gazebo中显示出来。 ## 1.需要哪些物理信息? 一般来说有`碰撞`和`内参`两个就够了,但是因为小鱼之前的偷懒,还要加一个摩擦力配置。 碰撞描述是物体的用于碰撞检测的包围形状。内参用于描述物体的质量,惯性矩阵。link的摩擦力。 ### 1.1 碰撞检测 在机器人仿真中,我们要对物体之前是否接触,是否发生碰撞做检测,常用的检测方法比如包围盒,判断两个物体的包围盒是否相交来快速判断物体是否发生碰撞。 在URDF中,我们可以可以在link标签下添加collison子标签来对物体的形状进行描述。 collision可以包含的子标签如下: - origin,表示碰撞体的中心位姿 - geometry,用于表示用于碰撞检测的几何形状 - `material`,可选的,描述碰撞几何体的材料(这个设置可以在gazebo仿真时通过view选项看到碰撞包围体的形状) 一个完整的collision标签实例如下: ```xml ``` ### 1.2 旋转惯量 旋转惯量矩阵是用于描述物体的惯性的,在做动力学仿真的时候,这些参数尤为重要。 在URDF中我们可以通过在link下添加inertial子标签,为link添加惯性参数的描述。 intertial标签包含的子标签如下: - mass,描述link的质量 - inertia,描述link的旋转惯量(该标签有六个属性值ixx\ixy\ixz\iyy\iyz\izz) 一个完整的inertial标签示例如下: ``` ``` 关于intertial的属性设置,不是随意设置的,常见的几何体我们可以通过公式进行计算。计算方法可以看小鱼的这篇文章-[URDF仿真惯性参数不知道怎么配?快收藏,常见几何物体URDF分享](https://mp.weixin.qq.com/s/3L8Lilesy2W_WY5qup0gmA)。 比如我们上一章节的fishbot的轮子和车体,都是实心圆柱,可以采用下面的公式进行计算: > 注意:这个矩阵是一个对称矩阵,所以只需要通过其上三角即可描述完整描述这个矩阵,所以在URDF中只需要填写六个数字即可。 > 实心圆柱体的惯性矩阵:半径为r,高度为h,质量为m 的实心圆柱体 > 形状:![实心圆柱体](2.给两轮差速机器人添加物理参数/imgs/453a07bf69814351a7c673deddf78087.png) > 矩阵:![矩阵](2.给两轮差速机器人添加物理参数/imgs/9b7f85f6d4314130ae6abdce6beeae8f.png) ### 1.3 摩擦力和刚性系数 在Fishbot的URDF中,前面的支撑轮主要起支撑作用,因为我们将其使用fixed标签固定到了base_link上,所以它无法转动。 哪该怎么办呢?小鱼教你一个取巧的办法,我们可以要把这个轮子的摩擦力设置为0,让它直接在地上滑动即可, 如何设置呢?6行代码放到URDF中: ``` ``` 其中mu1,mu2代表摩擦力,kp,kd代表刚性系数。 ## 2.为FishBot添加物理惯性 利用上面的方法公式,为我们的fishbot哥哥link添加好物理属性,完成后的base_link如下: ```xml ``` 完全添加好的机器人URDF模型小鱼已经放到了这里:[fishbot_gazebo.urdf](https://github.com/fishros/fishbot/blob/navgation2/src/fishbot_description/urdf/fishbot_gazebo.urdf) 可以将小鱼配置好的模型下载到`src/c/urdf`文件夹下,等下我们要用gazebo将该模型显示出来。