- 关节状态State物理意义;对旋转关节,即urdf中type=continuous或revolute,关节状态是旋转轴的旋转角度。举个例子,值1.57,表示此个关节绕旋转轴旋转90度,至于是顺时间还是逆时针,要看axis的正、负号以及开发者如何定义值的变化方向。
一、如何在urdf编写<link>、<joint>
- link(连杠)。连杠有面积。位置<visual.origin.xyz>和角度<visual.origin.rpy>都是在该连杠坐标系内进行定义。位置是距坐标系原点/中心的偏移。角度是连杠要旋转的角度。谁来生成坐标系?——分为两类:第一个连杠和其它连杠。对第一个连杠,外面生成一个名称是“name”的坐标系。举个例子,name="base_link",假设根坐标系是map,定义一个map和base_link之间的坐标变换,这个生成的bask_link就是第一个连杠的坐标系。对其它连杠,是它作为“child”的那个关节产生的坐标系。
- joint。关节没有面积,但有一个位姿。这个位姿就是parent link坐标系到关节坐标系的变换矩阵,当中的位置<origin.xyz>和角度<origin.rpy>都是在parent link坐标系内进行定义,即用着parent link坐标轴的方向和刻度。位置是距parent link坐标系原点/中心的偏移,角度是各坐标轴要旋转的角度。以这个位姿会生成一个新坐标系,称为该关节的坐标系,正如上面“连杠”写的,这个坐标系也作为child link的坐标系。关节是旋转类型时,<axis.xyz>定义该关节的旋转轴,表示关节运动是怎么个旋转法,这个旋转基于关节坐标系,不是parent link坐标系。至于符号是正还是负,和怎么赋值关节状态(角度)有关,有这么个对应关系:关节状态值由小变大后的旋转方向是正号。

<joint name="a" type="revolute"> <origin xyz="-0.02656 0 0.05" rpy="1.5708 -1.1102E-16 -1.5708" /> <parent link="arm_Link" /> <child link="Link1" /> <axis xyz="0 0 -1" /> <limit lower="-1.57" upper="1.57" effort="1000" velocity="2" /> </joint>
图1中,位置左下的是arm_link坐标系,右上的是Link1坐标系,三轴交叉点是各坐标系原点。关节a的<origin>定义了如何由arm_link坐标系生成Link1坐标系。在arm_link坐标系,先绕Z轴顺时针旋转90度,再绕X轴逆时针旋转90度,至此生成了Link1坐标系的角度。然后arm_link坐标系原点按照arm_link坐标系的x、y、z轴的方向及刻度平移(-0.02656, 0, 0.05)米,从而产生Link1坐标系原点的位置。
坐标系Link1就是关节a坐标系。“<axis xyz="0 0 -1" />”意味着关节a要绕着Z轴旋转,当旋转是由地面向天空转时,按规则这是逆时针方向,即正方向。但<axis>用了“-1”,即认为在定义关节状态值时,值从小变大是按反方向,即State最小值最朝天,最大值最朝地。用示例来解释,关节状态a范围是(-1.57, 1.57)。状态值是-1.57,表示关节位置停在最朝天,1.57则停在最朝地。

<joint name="arm_Joint" type="fixed"> <origin xyz="0.11787 0 0.078855" rpy="0.79764 2.5278E-15 1.5708" /> <parent link="base_link" /> <child link="arm_Link" /> </joint>
为强化理解<joint>“位置<origin.xyz>和角度<origin.rpy>都是在parent link坐标系内进行定义,即用着parent link坐标轴的方向和刻度”这句话,让看另一个由base_link生成arm_link例子。图2有三个坐标系,从底向上分别是base_link、arm_link、al_z+0.1。base_link是没有旋转过的坐标系,即x轴向东、y轴向里、z轴向上。arm_link是以base_link为父坐标系,按<origin xyz="0.11787 0 0.078855" rpy="0.79764 2.5278E-15 1.5708" />生成的坐标系。al_z+0.1也是以base_link为父坐标系,生成时xy、rpy和arm_link一样,z改为比arm_link多了0.1。于是从图2可以看到,al_z+0.1坐标系的角度和arm_link一样,但原点位置在arm_link原点的正上方,高度差是0.1米。“+0.1”符合了以着base_link的z轴的刻度、往Z轴正方向多移动0.1米。