5.3.1 坐标系广播案例以及分析
1.案例需求
案例1:现有一无人车,在无人车底盘上装有固定式的雷达与摄像头,已知车辆底盘、雷达与摄像头各对应一坐标系,各坐标系的原点取其几何中心。现又已知雷达坐标系相对于底盘坐标系的三维平移量分别为:x方向0.4米,y方向0米,z方向0.2米,无旋转。摄像头坐标系相对于底盘坐标系的三维平移量分别为:x方向-0.5米,y方向0米,z方向0.4米,无旋转。请广播雷达与底盘的坐标系相对关系,摄像头与底盘的坐标系相对关系,并在 rviz2 中查看广播的结果。
案例2:启动 turtlesim_node,设该节点中窗体有一个世界坐标系(左下角为坐标系原点),乌龟是另一个坐标系,乌龟可以通过键盘控制运动,请动态发布乌龟坐标系与世界坐标系的相对关系。
2.案例分析
在上述案例中,案例1需要使用到静态坐标变换,案例2则需要使用动态坐标变换,不论无论何种实现关注的要素都有两个:
- 如何广播坐标系相对关系;
- 如何使用 rviz2 显示坐标系相对关系。
3.流程简介
以编码的实现实现静态或动态坐标变换的流程类似,主要步骤如下:
- 编写广播实现;
- 编辑配置文件;
- 编译;
- 执行;
- 在 rviz2 中查看坐标系关系。
案例我们会采用 C++ 和 Python 分别实现,二者都遵循上述实现流程。
另外:需要说明的是,静态广播器除了可以以编码的方式实现外,在 tf2 中还内置了相关工具,可以无需编码,直接执行节点并传入表示坐标系相对关系的参数,即可实现静态坐标系关系的发布。而动态广播器没有提供类似的工具。
4.准备工作
终端下进入工作空间的src目录,调用如下两条命令分别创建C++功能包和Python功能包。
ros2 pkg create cpp03_tf_broadcaster --build-type ament_cmake --dependencies rclcpp tf2 tf2_ros geometry_msgs turtlesim
ros2 pkg create py03_tf_broadcaster --build-type ament_python --dependencies rclpy tf_transformations tf2_ros geometry_msgs turtlesim