目录
- 写在前面的话
- 整体流程
- 1 URDF 文件结构
- 2 查看原始碰撞形状描述
- 3 加入简单碰撞形状描述
- 方法一 Meshlab 自动测量
- 方法二 人为测量
- 4 加入XACRO函数简化描述
- 最终结果展示
- 侧视图
- 正视图
- 碰撞几何体中心点设置不对出现的结果
写在前面的话
本文使用的 URDF 文件是由 solidworks 的 URDF export 插件生成,详情请看上一篇文章:solidworks模型导出urdf(超详细)
整体流程
1 URDF 文件结构
写法跟XML文件格式非常类似,<robot>
块包含了所有机器人的描述,<link>
块描述了零件的连接,<joint>
块描述了单个零件。collision碰撞的描述是在<link>
块中,包含<origin>
和<geometry>
两个属性,<geometry>
描述的是碰撞几何体的形状,<origin>
描述的是碰撞几何体的姿态,包括中心点的位置和欧拉角(这个地方需要重点关注)
2 查看原始碰撞形状描述
原始的 URDF 文件是直接使用零件的三维模型文件作为碰撞几何体的描述,但是这样在仿真的时候 gazebo 仿真软件需要耗费大量的时间进行碰撞计算,gazebo 会出现加载时间过长和崩溃的情况,所以有必要进行简化这个碰撞形状描述
<collision>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://car_urdf/meshes/left_front_wheel_Link.STL" />
</geometry>
</collision>
3 加入简单碰撞形状描述
需要提前下载meshlab软件,方便后面的碰撞形状参数测量和查看
sudo apt install meshlab
方法一 Meshlab 自动测量
在meshlab界面菜单栏找到 Render > Show Box Corners 可以查看外接矩形的尺寸大小(下图左上角的Size)和该外接矩形中心点的位置(下图左上角的center),这个矩形中心点一般不是零件的原点(可以通过下面第二图的坐标轴看出),因为零件不一定是对称物体,而且零件的原点也跟它保存的三维数据(三维坐标)有关。
注意:这个只能支持拟合外接矩阵
方法二 人为测量
还可以如下图操作,选中菜单栏的正方体,并在右边 Measure Info 设置为 On,进行人为测量,这个人为结果可能会有偏差,但其实影响不大,因为我们在实际设置碰撞几何体的时候经常会预设一定范围的安全空间。
为了得到更加准确的结果,可以选择不同的视图进行查看并测量
- 引入长方体描述整个机器人
box 表示长方体,size分别表示长宽高三个尺寸。
box size = 外接矩形的尺寸大小(下图左上角的Size)
origin xyz = 该外接矩形中心点的位置(下图左上角的center)
<collision>
<origin rpy="0 0 0" xyz="-0.9 0 0.1"/>
<geometry>
<box size="2.9 1.5 1.6"/>
</geometry>
</collision>
- 引入长方体描述车轮转向零件
box 表示长方体,size分别表示长宽高三个尺寸。
<collision>
<origin rpy="0 0 0" xyz="0 -0.03 -0.27"/>
<geometry>
<box size="0.34 0.39 0.54"/>
</geometry>
</collision>
- 引入圆柱体描述车轮
cylinder 表示圆柱体,length表示圆柱的高,radius表示圆柱的底的半径。
这里要注意的是要设置欧拉角,因为圆柱体默认是竖直的,也就是底部跟地面(xy面)平行,但是车轮是竖直的,所以这里的圆柱需要横滚角(roll角)设为90度,也就是约等于1.57弧度。
<collision>
<origin rpy="1.5707963267948966 0 0" xyz="0 -0.05 0"/>
<geometry>
<cylinder length="0.2" radius="0.3"/>
</geometry>
</collision>
4 加入XACRO函数简化描述
- 先把.urdf文件的后缀加上.xacro
- 在urdf文件头部的
<robot name=“”xxx“”>
后面属性加上xmlns:xacro="http://www.ros.org/wiki/xacro"
<robot
name="car_urdf" xmlns:xacro="http://www.ros.org/wiki/xacro">
- 因为我的三维模型车轮转向器和车轮都是重复的东西,可以进行统一函数封装,方便函数调用,这个类似函数定义,不细讲,可以去看古月居的视频,或者找几个代码看看。
这里的左右轮和左右轮转向器为什么要分开写?因为他们的中心点是不一样的,这个需要注意一下,这个可能真正的工程试验才会遇到,提醒一下。
<xacro:property name="base_box_size" value="2.9 1.5 1.6"/>
<xacro:property name="orient_box_size" value="0.34 0.39 0.54"/>
<xacro:property name="wheel_cylinder_radius" value="0.3"/>
<xacro:property name="wheel_cylinder_length" value="0.2"/>
<xacro:macro name='base_collision'>
<collision>
<origin
xyz="-0.9 0 0.1"
rpy="0 0 0" />
<geometry>
<box size="${base_box_size}"/>
</geometry>
</collision>
</xacro:macro>
<xacro:macro name='left_orient_collision'>
<collision>
<origin
xyz="0 -0.03 -0.27"
rpy="0 0 0" />
<geometry>
<box size="${orient_box_size}"/>
</geometry>
</collision>
</xacro:macro>
<xacro:macro name='right_orient_collision'>
<collision>
<origin
xyz="0 0.03 -0.27"
rpy="0 0 0" />
<geometry>
<box size="${orient_box_size}"/>
</geometry>
</collision>
</xacro:macro>
<xacro:macro name='left_wheel_collision'>
<collision>
<origin
xyz="0 -0.05 0"
rpy="${pi/2} 0 0" />
<geometry>
<cylinder radius="${wheel_cylinder_radius}" length="${wheel_cylinder_length}"/>
</geometry>
</collision>
</xacro:macro>
<xacro:macro name='right_wheel_collision'>
<collision>
<origin
xyz="0 0.05 0"
rpy="${pi/2} 0 0" />
<geometry>
<cylinder radius="${wheel_cylinder_radius}" length="${wheel_cylinder_length}"/>
</geometry>
</collision>
</xacro:macro>
最终结果展示
侧视图
正视图
碰撞几何体中心点设置不对出现的结果
这是长方体中心点全部默认为 0 ,且车轮圆柱没设置欧拉角的显示结果