ROS TF
ros中,可以通过TF Tree来进行获取 机器人不同坐标系之间的转换关系,命令如下:
rosrun tf tf_echo base_link head_link1
意思为,从源坐标系base_link,到目标坐标系head_link1的变换关系,结果如下所示。
机器人的base_link在底部,头在1.2米的地方(平移),旋转基本没有。
齐次坐标系
机器人坐标系的变换,涉及了平移和旋转,在TF树中,我们可以得到Translation(平移)和Rotation(旋转)。
一般来讲我们可以得到一个旋转矩阵 (欧拉角转旋转矩阵 或者 四元数转旋转矩阵),和一个平移矩阵。
但是当我们有很多个坐标系需要进行转换时候,、..., 、...,坐标系变化的叠加,导致推到会很复杂(特别是平移矩阵),因此我们一般会写成齐次矩阵:
可以简单理解为,升了一个维度,让问题简单化了。
loc = np.array([translation[0], translation[1], translation[2]]) #tf 的平移rot = Rotation.from_quat([rotation[0], rotation[1], rotation[2], rotation[3]]).as_matrix() #tf的旋转,用四元数求旋转矩阵H = np.column_stack((rot,loc))H = np.row_stack((H, np.array([0, 0, 0, 1])))
对于坐标系base_link—>head_link1—>head_link2 可以有
左乘和右乘
讲这个问题之前,先区分一下,坐标点P=[x1,y1,z1]和H矩阵中平移分量T = [dx,dy,dz],这两个值没有啥关系。
矩阵的左乘和右乘
多个矩阵,连续左乘,相当于还是以base_link的x、y、z轴在旋转和平移,一般在机器人学多个关节正运动学运算的时候是左乘
而多个矩阵,连续右乘,相当于A坐标系的x、y、z转到B坐标系后, 再以B坐标系的x、y、z旋转平移,一般欧拉角变换是右乘,先绕x轴转、再绕新的y轴转等等
如果没有旋转,只有平移,H矩阵的R为单位矩阵,从base_link 到 head_link1。
左乘 — 转换矩阵*点
base_link 下的[0,0,0]点经过旋转和平移,变成了[-0.04,0,1.2],相对于base_link
base_link 下的[-0.04,0,1.2]点经过旋转和平移,变成了[-0.08,0,2.4]。
相机坐标系下的点,左乘 相机相对于机器人坐标系的变换矩阵(camera to robot),得到机器人坐标系下的点。
右乘 — 点*旋转矩阵,好像区别不大,就是个转置的关系?
base_link 下的点[-0.04, 0, 1.2] 在新坐标系下的值,刚好为新坐标系的原点
注意这里对H求了个逆!!