|
@@ -6,8 +6,8 @@
|
|
|
- 使用numpy表示位置矢量和旋转矩阵
|
|
|
- 使用numpy进行平移与旋转坐标变换
|
|
|
- 了解ROS2中TF2的概念
|
|
|
-- 掌握tf2相关CLI工具进行坐标变换
|
|
|
-- 掌握python操作TF进行坐标变换
|
|
|
+- 使用tf2相关CLI工具进行坐标变换
|
|
|
+- 使用python操作TF进行坐标变换
|
|
|
|
|
|
## 1.numpy表示位姿
|
|
|
|
|
@@ -66,7 +66,7 @@ print(R_AB)
|
|
|
|
|
|
## 2.numpy坐标变换
|
|
|
|
|
|
-掌握了使用numpy表示位置和姿态后,接着我们来使用numpy来完成上一节的小练习
|
|
|
+掌握了使用numpy表示位置和姿态后,接着我们使用numpy来完成上一节的小练习
|
|
|
|
|
|
### 2.1 题目
|
|
|
|
|
@@ -74,9 +74,9 @@ print(R_AB)
|
|
|
|
|
|

|
|
|
|
|
|
-1.相机坐标系{C}为参考坐标系,工具坐标系{P}的位置矢量在相机坐标系{C}`x,y,z`各轴投影为$2,1,2$,并且工具坐标系和相机坐标系姿态相同。
|
|
|
+1.相机坐标系{C}为参考坐标系,工具坐标系{P}的位置矢量在相机坐标系{C}的`x,y,z`各轴投影为$2,1,2$,并且工具坐标系和相机坐标系姿态相同。
|
|
|
|
|
|
-2.机器人基坐标系{B}为参考坐标系,相机坐标系{C}在的位置矢量在{B}各轴的投影为$0,0,3$,坐标系{C}和绕着坐标系{B}的x轴转了180度
|
|
|
+2.机器人基坐标系{B}为参考坐标系,相机坐标系{C}的位置矢量在{B}各轴的投影为$0,0,3$,坐标系{C}绕着坐标系{B}的x轴转了180度
|
|
|
|
|
|
可以参考下图看题目
|
|
|
|
|
@@ -159,7 +159,7 @@ $$\begin{bmatrix}
|
|
|
|
|
|
|
|
|
|
|
|
-大家好,我是小鱼,上一节我们学习了使用numpy表示位置和姿态,并使用了numpy来进行坐标变换,本节课我们直接使用ROS2中的TF工具不写一行代码进行坐标,同时我们还可以使用RVIZ2进行直观的查看坐标关系。
|
|
|
+以上大家跟着小鱼一起学习了使用numpy表示位置和姿态,并使用了numpy来进行坐标变换,接下来我们直接使用ROS2中的TF工具不写一行代码进行坐标发布,同时我们还可以使用RVIZ2直观的查看坐标关系。
|
|
|
|
|
|
|
|
|
|
|
@@ -178,7 +178,7 @@ TF即`变换`的英文单词`TransForm`的缩写。所以`ROS`和`ROS2`中的`TF
|
|
|
|
|
|

|
|
|
|
|
|
-拿上面的手眼系统来说,我们要想获取到相机的基坐标系{B}和工具{P}之间的关系,只需要将机械臂和相机、相机和工具之间的关系即可
|
|
|
+拿上面的手眼系统来说,我们要想获取到相机的基坐标系{B}和工具{P}之间的关系,只需要将机械臂和相机、相机和工具之间的关系告诉TF即可。
|
|
|
|
|
|
#### 我们如何告诉TF?
|
|
|
|
|
@@ -193,7 +193,7 @@ TF即`变换`的英文单词`TransForm`的缩写。所以`ROS`和`ROS2`中的`TF
|
|
|
ros2 run tf2_ros static_transform_publisher
|
|
|
```
|
|
|
|
|
|
-可以看到
|
|
|
+按`enter`键,可以看到
|
|
|
|
|
|
```
|
|
|
A command line utility for manually sending a transform.
|
|
@@ -221,7 +221,7 @@ Usage: static_transform_publisher x y z yaw pitch roll frame_id child_frame_id
|
|
|
|
|
|
比如针对上面的手眼转换,广播机械臂坐标系{B}和相机坐标系{C}之间的关系。
|
|
|
|
|
|
-父坐标系的名字就是B,子坐标系的名字是C,父子之间的平移关系是`0 0 3`,旋转关系是绕x轴旋转180度
|
|
|
+父坐标系的名字就是B,子坐标系的名字是C,父子之间的平移关系是`0 0 3`,旋转关系是绕x轴旋转180度。
|
|
|
|
|
|
在ROS2中可以使用下面的指令发布变换,打开终端,输入下面的指令:
|
|
|
|
|
@@ -255,7 +255,7 @@ ros2 run tf2_ros static_transform_publisher 2 1 2 0 0 0 C P
|
|
|

|
|
|
我们可以看到窗口左边的配置选项,全局选项默认选择的FixedFrame为map,这个map就是rviz2默认的坐标系的名字,动动脚趾头想一下我们并没有发布map这个坐标系,所以下面Global Status也是红色的错误。
|
|
|
|
|
|
-此时我们可以手动的修改以下固定的Frame为B,让默认的坐标系设置成机械臂的基坐标系{B}
|
|
|
+此时我们可以手动的修改以下固定的Frame为B,让默认的坐标系设置成机械臂的基坐标系{B}。
|
|
|
|
|
|

|
|
|
|
|
@@ -271,7 +271,7 @@ ros2 run tf2_ros static_transform_publisher 2 1 2 0 0 0 C P
|
|
|
|
|
|

|
|
|
|
|
|
-之后你就在RVIZ2中可以看到下图的坐标关系
|
|
|
+之后你在RVIZ2中就可以看到下图的坐标关系
|
|
|
|
|
|

|
|
|
|
|
@@ -291,11 +291,11 @@ ros2 run tf2_ros tf2_echo B P
|
|
|
```
|
|
|

|
|
|
|
|
|
-可以看到终端中不断输出B和C之间的平移和旋转,平移采用的是xyz,基本正确,y和z的微小变换是因为我们发布变换中时旋转输入的是3.14并不精确。
|
|
|
+可以看到终端中不断输出B和C之间的平移和旋转,平移采用的是xyz,基本正确,y和z的微小差异是因为我们发布变换时旋转输入的是3.14并不精确。
|
|
|
|
|
|
-至于旋转部分采用的是四元数表示,关于这部分姿态的表示,小鱼在第六节会讲,大家不必纠结。
|
|
|
+至于旋转部分采用的是四元数表示,关于这部分姿态的表示,小鱼在下一节会讲,大家不必纠结。
|
|
|
|
|
|
-除了使用TF获取关系外,ros2还提供很多工具来查看坐标之间的关系,大家可以在终端中输入下面的命令自行尝试
|
|
|
+除了使用TF获取关系外,ros2还提供很多工具来查看坐标之间的关系,大家可以在终端中输入下面的命令自行尝试。
|
|
|
|
|
|
#### rqt_tf_tree
|
|
|
> 2022-04-26更新的,这个工具的二进制安装版本作者3月底才发布,之前没提的原因是需要源码装太麻烦了
|
|
@@ -309,7 +309,7 @@ sudo apt install ros-foxy-rqt-tf-tree
|
|
|
|
|
|
|
|
|
|
|
|
-接着你就可以看到这个强大的,几乎可以实时看到系统tf更新信息的工具,这个工具在后面我们进行导航和机械臂的调试非常有帮助。
|
|
|
+接着你就可以看到这个强大的,几乎可以实时看到系统tf更新信息的工具,这个工具对于后面我们进行导航和机械臂的调试非常有帮助。
|
|
|
|
|
|
> 长的不一样没关系,这是后面补充的图。
|
|
|
|
|
@@ -363,7 +363,7 @@ ros2 run tf2_tools view_frames.py
|
|
|
|
|
|
|
|
|
|
|
|
-除了使用命令行进行坐标关系广播和监听,我们还可以使用代码来广播和监听,下一节小鱼就带你一起用程序来发布TF广播和获取坐标关系。
|
|
|
+除了使用命令行进行坐标关系的广播和监听,我们还可以使用代码来广播和监听,接下来小鱼就带你一起用程序来发布TF广播和获取坐标关系。
|
|
|
|
|
|
|
|
|
|
|
@@ -375,19 +375,19 @@ ros2 run tf2_tools view_frames.py
|
|
|
|
|
|
在开始之前,我们总结下TF相关的操作有哪些?
|
|
|
- 广播(TransformBroadcaster):将坐标系鱼坐标系之间的位姿态关系发布出去
|
|
|
-- 监听(TransformListener):获取坐标系和坐标之间的位姿关系
|
|
|
+- 监听(TransformListener):获取坐标系和坐标系之间的位姿关系
|
|
|
- TF(坐标变换TransformStamped)帧:广播出去的一组数据可以称作一个TF帧,包含父坐标系名称、子坐标系名称,父坐标系和子坐标系之间的关系
|
|
|
|
|
|
接着我们就可以编写代码来实现上面对TF帧的发布和监听。
|
|
|
|
|
|
### 4.1 坐标变换广播
|
|
|
|
|
|
-在进行坐标变换广播前,我们根据两个坐标系之间的关系是否会随着时间变化分出以下两种情况:
|
|
|
-1. 坐标系之间的关系不随时间推移而改变,称之为静态坐标变换,需要使用静态广播发布器(StaticTransformBroadcaster)发布。比如:机器人的两个轮子之间关系,可以认为随时间的变换其相对位置不变。
|
|
|
-2. 坐标系之间的关系随时间的推移而改变,称之为(动态)坐标变换,使用广播发布器(TransformBroadcaster)发布坐标关系。比如机器人在世界坐标系中的位置,因为机器人会动。
|
|
|
+在进行坐标变换广播前,我们根据两个坐标系之间的关系是否会随着时间变化分成以下两种情况:
|
|
|
+1. 坐标系之间的关系不随时间推移而改变,称为静态坐标变换,需要使用静态广播发布器(StaticTransformBroadcaster)发布。比如:机器人的两个轮子之间关系,可以认为随时间的变换其相对位置不变。
|
|
|
+2. 坐标系之间的关系随时间的推移而改变,称为(动态)坐标变换,使用广播发布器(TransformBroadcaster)发布坐标关系。比如机器人在世界坐标系中的位置,因为机器人会动。
|
|
|
|
|
|
我们依然使用手眼系统为例,尝试使用广播发布器来发布坐标系之间的关系。
|
|
|
-在手眼系统中,机械臂基座和相机坐标系之间的位置是固定不变的,我们可以通过静态广播发布器来发布,而相机坐标系下工件的位置是实时识别得到的,其值会随时间变换,故我们用广播发布器来发布。
|
|
|
+在手眼系统中,机械臂基座和相机坐标系之间的位置是固定不变的,我们可以通过静态广播发布器来发布,而相机坐标系下工件的位置是实时识别得到的,其值会随时间变化,故我们用广播发布器来发布。
|
|
|
|
|
|
#### 4.1.1 静态广播发布器
|
|
|
|
|
@@ -415,7 +415,7 @@ ros2 run tf2_tools view_frames.py
|
|
|
|
|
|
接着我们来使用广播发布器发布C和工具P之间的关系平移:` x:2 y:1 z:2 ` 旋转:`qx:0 qy:0 qz:0 qw:1`
|
|
|
|
|
|
-只需要将上面的静态广播发布器改为广播发布器,但需要注意的是,发布坐标变换时要以一定的频率实时发布,这样当我们获取坐标时才能获取到当前时刻的坐标(有点不好理解,就是坐标关系和时间有关系)。
|
|
|
+只需要将上面的静态广播发布器改为广播发布器,但需要注意的是,发布坐标变换时要以一定的频率实时发布,这样当我们获取坐标时才能获取到当前时刻的坐标(有点不好理解,就是坐标关系和时间有关系)。
|
|
|
|
|
|

|
|
|
|
|
@@ -434,7 +434,7 @@ ros2 run tf2_tools view_frames.py
|
|
|
|
|
|
### 4.2 坐标变换监听
|
|
|
|
|
|
-所谓坐标变换监听就是通过监听整个系统的坐标变换关系.
|
|
|
+所谓坐标变换监听就是监听整个系统的坐标变换关系。
|
|
|
|
|
|
通过`TransformListener`即可获取到整个`tf`系统中窗口大小为10s的坐标关系,并且我们创建了一个`buffer`,`TransformListener`会把收到的坐标关系放入`buffer`中,我们后面就可以通过`buffer`的`lookup_transform()`函数获取到坐标之间的关系。
|
|
|
|