# 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 的实心圆柱体
> 形状:
> 矩阵:
### 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将该模型显示出来。