1.创建.xml文件形式的模型
首先确保安装了 joint_state_publisher package
简单的urdf模型代码如下:
//底座
//圆柱体的半径和高度
$ roslaunch urdf_tutorial display.launch model:=urdf/01-myfirst.urdf
上面的代码将会执行以下的任务:
将制定的模型载入parameter server;运行一些nodes来发布sensor_msgs/JointState消息以及坐标变化;运行Rviz
roslaunch假定我们是在urdf_tutorial directory情况下启动的,此时urdf是当前工作目录的直接子目录,如果不是这样的话01-myfirst.urdf的相对路径将无效,并且一旦roslaunch尝试将urdf加载到参数服务器,您就会收到错误。所以可以做如下更改:
$ roslaunch urdf_tutorial display.launch model:='$(find urdf_tutorial)/urdf/01-myfirst.urdf'
为模型添加joint来使两个part连接:
roslaunch urdf_tutorial display.launch model:=urdf/02-multipleshapes.urdf
但是这样建立的模型有问题,因为新添加的part是以原来的基座原点为自己的中心,所以下面我们要为它指定一个新的中心:
//part绕原点旋转pi/2,沿Z向下平移0.3m
坐标原点沿y移动-0.22,z移动0.25
roslaunch urdf_tutorial display.launch model:=urdf/03-origins.urdf
之后为机器人添加材料属性
//调制颜色[0,1]
roslaunch urdf_tutorial display.launch model:=urdf/04-materials.urdf
之后为机器人添加一些mesh
roslaunch urdf_tutorial display.launch model:=urdf/05-visual.urdf
添加mesh文件的后缀名可以是多种的例如STL,DAE,实例中的mesh存放在urdf_tutorial的mesh文件夹中
也可以使用其他package中的mesh文件如:
package://pr2_description/meshes/gripper_v0/l_finger.dae
2.建立可移动的模型
之前我们添加的joint都是fixed类型的,但是joint实际上有:continuous, revolute ,prismatic类型,以下对这些进行介绍。执行以下代码:
roslaunch urdf_tutorial display.launch model:=urdf/06-flexible.urdf
之后跳出来调控面板GUI,其中各个位置所用的joint类型如下所示:
Head: 像滚轮一样的joint,可以360°旋转,不过需要再axis中指定旋转轴
Gripper:有旋转角度限制的continous,因此我们必须再limit effort下面添加最高和最低角度,同时添加最大速度
Gripper Arm: 沿直线运行的滑块类,limit effort限制:力量,手臂伸出和缩回的距离,最大移动速度
除了这些之外还有planar joint, floating joint等
当滑动GUI上面的滑块时,他将会发送sensor_msgs/JointState类型的消息,这些消息会被robot_state_publisher所使用,并且计算出机器人不同parts之间应有的transform,计算出的transform TREE 会被Rviz所使用,从而显示出机器人的状态。
3. 添加质量和转动惯量矩阵:
惯性张量取决于物体的质量和质量分布,如果不确定放置什么,ixx / iyy / izz = 1e-3或更小的矩阵通常是中型链路的合理默认值,使用实时控制器时,零(或几乎为零)的惯性元素可能导致机器人模型在没有警告的情况下崩溃,并且所有link将显示其原点与世界原点一致。
还有一些其他的参数,如:
mu-Friction coefficient
kp - Stiffness coefficient
kd - Dampening coefficient
使用命令
rosrun xacro xacro model.xacro > model.urdf
也可以通过在launch文件中设置,从而避免再次调用rosrun命令,如下所示:
在Xacro文件的顶部,需要建立命名空间以便文件进行编译,如下所示:
之后可以编写文件内容,如下所示:
property是初始化变量的关键字,可以通过符号${width}来进行调用,之后该符号以及括号内的东西会被name所对应的value进行文本替换,在这个符号内的运算以浮点数进行。
之后可以使用宏来进一步替换文本,宏的关键字是macro,如下所示,name为宏的名称
在宏中还可以添加参数,只需要在调用宏的时候给参数赋值,如下所示就是一个宏:
调用它的命令为:
在宏中还可以添加指针类型来引用一个块,调用的方法为insert_block name,如下所示:
可以通过执行以下代码查看实例中的模型:
roslaunch urdf_tutorial display.launch model:=urdf/08-macroed.urdf.xacro
对于一些对称形状的物体,我们可以使用一些数学方法来缩短代码,如下面的代码所示: