运行前面安装的jupyter,我们尝试使用代码来操作tf
在开始之前,我们总结下TF相关的操作有哪些?
接着我们就可以编写代码来实现上面对TF帧的发布和监听。
在进行坐标变换广播前,我们根据两个坐标系之间的关系是否会随着时间变化分成以下两种情况:
我们依然使用手眼系统为例,尝试使用广播发布器来发布坐标系之间的关系。 在手眼系统中,机械臂基座和相机坐标系之间的位置是固定不变的,我们可以通过静态广播发布器来发布,而相机坐标系下工件的位置是实时识别得到的,其值会随时间变化,故我们用广播发布器来发布。
在jupyter中输入并运行以下程序,使用方式就像ros2的话题发布,只不过不需要指名发布的话题(发布到系统的TF树上)。
这里四元数的值需要通过在线的坐标转换获取,选择角度,绕x轴旋转180
,上面就是对应的四元数,x,y,z,w
为1,0,0,0
最后通过坐标监听工具可以查找出B和C之间的关系:
注意这里输出的At time 0.0 代表任意时刻
接着我们来使用广播发布器发布C和工具P之间的关系平移:x:2 y:1 z:2
旋转:qx:0 qy:0 qz:0 qw:1
只需要将上面的静态广播发布器改为广播发布器,但需要注意的是,发布坐标变换时要以一定的频率实时发布,这样当我们获取坐标时才能获取到当前时刻的坐标(有点不好理解,就是坐标关系和时间有关系)。
同样也可以使用命令行获取到C和P之间关系。
也可以通过命令行获取到B和P之间关系,完成手眼转换
注意这里的结果中的时间:At time 1637494822.281105208.代表具体的某一个时刻,不同时刻坐标之间的平移和旋转可以不同
所谓坐标变换监听就是监听整个系统的坐标变换关系。
通过TransformListener
即可获取到整个tf
系统中窗口大小为10s的坐标关系,并且我们创建了一个buffer
,TransformListener
会把收到的坐标关系放入buffer
中,我们后面就可以通过buffer
的lookup_transform()
函数获取到坐标之间的关系。
可以看到最终打印的结果和我们上面用命令行和numpy计算结果一致。
技术交流&&问题求助: