欢迎光临散文网 会员登陆 & 注册

5.3 坐标变换广播

2023-10-24 11:54 作者:猛狮集训营  | 我要投稿

  5.3 坐标变换广播

坐标系相对关系主要有两种:静态坐标系相对关系与动态坐标系相对关系。

所谓静态坐标系相对关系是指两个坐标系之间的相对位置是固定不变的,比如:车辆上的雷达、摄像头等组件一般是固定式的,那么雷达坐标系相对于车辆底盘坐标系或摄像头坐标系相对于车辆底盘坐标系就是一种静态关系。

所谓动态坐标系相对关系是指两个坐标系之间的相对位置关系是动态改变的,比如:车辆上机械臂的关节或夹爪、多车编队中不同车辆等都是可以运动的,那么机械臂的关节或夹爪坐标系相对车辆底盘坐标系或不同车辆坐标系的相对关系就是一种动态关系。

本节会主要介绍如何实现静态坐标变换广播与动态坐标变换广播。另外,本节还会演示如何发布坐标点消息。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则需要使用动态坐标变换,不论无论何种实现关注的要素都有两个:

  1. 如何广播坐标系相对关系;

  2. 如何使用 rviz2 显示坐标系相对关系。

3.流程简介

以编码的实现实现静态或动态坐标变换的流程类似,主要步骤如下:

  1. 编写广播实现;

  2. 编辑配置文件;

  3. 编译;

  4. 执行;

  5. 在 rviz2 中查看坐标系关系。

案例我们会采用 C++ 和 Python 分别实现,二者都遵循上述实现流程。

另外:需要说明的是,静态广播器除了可以以编码的方式实现外,在 tf2 中还内置了相关工具,可以无需编码,直接执行节点并传入表示坐标系相对关系的参数,即可实现静态坐标系关系的发布。而动态广播器没有提供类似的工具。

4.准备工作

终端下进入工作空间的src目录,调用如下两条命令分别创建C++功能包和Python功能包。

5.3.2 静态广播器(命令)

1.静态广播器工具

在 tf2_ros功能包中提供了一个名为static_transform_publisher的可执行文件,通过该文件可以直接广播静态坐标系关系,其使用语法如下。

格式1:

使用以米为单位的 x/y/z 偏移量和以弧度为单位的roll/pitch/yaw(可直译为滚动/俯仰/偏航,分别指的是围绕 x/y/z 轴的旋转)向 tf2 发布静态坐标变换。

ros2 run tf2_ros static_transform_publisher --x x --y y --z z --yaw yaw --pitch pitch --roll roll --frame-id frame_id --child-frame-id child_frame_id

格式2:

使用以米为单位的 x/y/z 偏移量和 qx/qy/qz/qw 四元数向 tf2 发布静态坐标变换。

ros2 run tf2_ros static_transform_publisher --x x --y y --z z --qx qx --qy qy --qz qz --qw qw --frame-id frame_id --child-frame-id child_frame_id

注意:在上述两种格式中除了用于表示父级坐标系的--frame-id和用于表示子级坐标系的--child-frame-id之外,其他参数都是可选的,如果未指定特定选项,那么将直接使用默认值。

2.静态广播器工具使用

打开两个终端,终端1输入如下命令发布雷达(laser)相对于底盘(base_link)的静态坐标变换:

ros2 run tf2_ros static_transform_publisher --x 0.4 --y 0 --z 0.2 --yaw 0 --roll 0 --pitch 0 --frame-id base_link --child-frame-id laser

终端2输入如下命令发布摄像头(camera)相对于底盘(base_link)的静态坐标变换:

ros2 run tf2_ros static_transform_publisher --x -0.5 --y 0 --z 0.4 --yaw 0 --roll 0 --pitch 0 --frame-id base_link --child-frame-id camera

3.rviz2 查看坐标系关系

新建终端,通过命令rviz2打开 rviz2 并配置相关插件查看坐标变换消息:

  1. 将 Global Options 中的 Fixed Frame 设置为 base_link;

  2. 点击 add 按钮添加 TF 插件;

  3. 勾选 TF 插件中的 show names。

右侧 Grid 中将以图形化的方式显示坐标变换关系。

5.3.3 静态广播器(C++)

1.广播实现

功能包 cpp03_tf_broadcaster 的 src 目录下,新建 C++ 文件 demo01_static_tf_broadcaster.cpp,并编辑文件,输入如下内容:

2.编辑配置文件

1.package.xml

在创建功能包时,所依赖的功能包已经自动配置了,配置内容如下:

2.CMakeLists.txt

CMakeLists.txt 中发布和订阅程序核心配置如下:

3.编译

终端中进入当前工作空间,编译功能包:

colcon build --packages-select cpp03_tf_broadcaster

4.执行

当前工作空间下,启动两个终端,终端1输入如下命令发布雷达(laser)相对于底盘(base_link)的静态坐标变换:

. install/setup.bash ros2 run cpp03_tf_broadcaster demo01_static_tf_broadcaster 0.4 0 0.2 0 0 0 base_link laser

终端2输入如下命令发布摄像头(camera)相对于底盘(base_link)的静态坐标变换:

. install/setup.bash ros2 run cpp03_tf_broadcaster demo01_static_tf_broadcaster -0.5 0 0.4 0 0 0 base_link camera

5.rviz2 查看坐标系关系

参考 5.3.2 静态广播器(命令)内容启动并配置 rviz2,最终执行结果与案例1类似。5.3.4 静态广播器(Python)

1.广播实现

功能包 py03_tf_broadcaster 的 py03_tf_broadcaster 目录下,新建 Python 文件 demo01_static_tf_broadcaster_py.py,并编辑文件,输入如下内容:

B站有完整的ros系列教程视频,可以观看完整内容ros课程ROS2理论与实践

更多内容将在猛狮知识星球社区更新最新课程,后续将推出更多优质内容——详情可关注猛狮集训营公众号和猛狮集训营官方网站。

5.3 坐标变换广播的评论 (共 条)

分享到微博请遵守国家法律