ROS TF2 添加一个 坐标系 附实例

本文涉及的产品
资源编排,不限时长
简介: ROS TF2 添加一个 坐标系 附实例

本片博客 讲解 如何添加 一个 固定的坐标系 到TF2

之前的博客 创建了 一个 乌龟的demo,添加了TF2 的 广播者和监听者。

这个和创建 TF2 的 广播者 很类似。

1、为什么添加 坐标系

对于很多任务在本地坐标系中处理很容易。例如激光雷达的数据在以雷达扫描器的中心为坐标系下最容易处理。
TF2 可以定义一个本地坐标系对每一个传感器、link等等。
tf2将处理所有引入的坐标系转换。

2、坐标系添加到了哪

TF2 对所有 的 坐标系 建立 了 一个 树行 结构 , 在整体结构中 不 能 存在闭环。也就是说 一个坐标系 只有一个 父坐标系,可以有很多的子坐标系。

之前的两只乌龟的例子含有三个坐标系:世界坐标系、乌龟1坐标系、乌龟2坐标系。

在这里插入图片描述

两个乌龟的坐标系是世界坐标系的子坐标系。

如果我们想要添加一个新的坐标系到TF2,这三个存在的坐标系一个会成为父坐标系,新的坐标系即为子坐标系。

3、如何添加一个坐标系

下面的例子 会在 之前的例子的基础上 在 乌龟1 的坐标系 下 建立一个新 的 坐标系

3.1 代码

在learning_tf2 的功能包的src 文件夹下 创建一个新的cpp文件 命名为 frame_tf2_broadcaster.cpp.

#include <ros/ros.h>
#include <tf2_ros/transform_broadcaster.h>
#include <tf2/LinearMath/Quaternion.h>

int main(int argc, char** argv){
  ros::init(argc, argv, "my_tf2_broadcaster");
  ros::NodeHandle node;

   tf2_ros::TransformBroadcaster tfb;
  geometry_msgs::TransformStamped transformStamped;

  
  transformStamped.header.frame_id = "turtle1";
  transformStamped.child_frame_id = "carrot1";
  transformStamped.transform.translation.x = 0.0;
  transformStamped.transform.translation.y = 2.0;
  transformStamped.transform.translation.z = 0.0;
  tf2::Quaternion q;
        q.setRPY(0, 0, 0);
  transformStamped.transform.rotation.x = q.x();
  transformStamped.transform.rotation.y = q.y();
  transformStamped.transform.rotation.z = q.z();
  transformStamped.transform.rotation.w = q.w();

  ros::Rate rate(10.0);
  while (node.ok()){
    transformStamped.header.stamp = ros::Time::now();
    tfb.sendTransform(transformStamped);
    rate.sleep();
    printf("sending\n");
  }

};

3.2 代码解释

这个 代码 和 之前 写的例子 广播 乌龟 坐标系 的 代码 基本类似
只是 之前 是 把 世界坐标系 作为 父坐标系 乌龟坐标系为 子 坐标系

这个是把 乌龟1坐标系为 父 坐标系 , 新坐标系 carrot1 为 子坐标系

   tf2_ros::TransformBroadcaster tfb;
  geometry_msgs::TransformStamped transformStamped;

  
  transformStamped.header.frame_id = "turtle1";
  transformStamped.child_frame_id = "carrot1";
  transformStamped.transform.translation.x = 0.0;
  transformStamped.transform.translation.y = 2.0;
  transformStamped.transform.translation.z = 0.0;
  tf2::Quaternion q;
        q.setRPY(0, 0, 0);
  transformStamped.transform.rotation.x = q.x();
  transformStamped.transform.rotation.y = q.y();
  transformStamped.transform.rotation.z = q.z();
  transformStamped.transform.rotation.w = q.w();

主要代码就是这部分 。 carrot1坐标系和turtle1坐标系 在y轴方向上偏移 2 m

4 、运行 坐标系 广播者 这个例子

在 CMakeLists.txt 中 加入 如下 代码:

add_executable(frame_tf2_broadcaster src/frame_tf2_broadcaster.cpp)
target_link_libraries(frame_tf2_broadcaster
 ${catkin_LIBRARIES}
)

编译成功的话

会 在工作空间 的这个路径下面 生成 frame_tf2_broadcaster 的 bin 文件
在这里插入图片描述

下面添加 launch 文件 给这个demo

5、测试结果

下面 更改 之前的 坐标系 监听者 的例子
让乌龟2 跟着 这个新的坐标系走

监听 坐标系变换的 地方 改成 下面的代码

  transformStamped = listener.lookupTransform("/turtle2", "/carrot1",
                           ros::Time(0));

再运行 launch 文件 乌龟2 不会 再去 乌龟1 那里 ,而是去了 乌龟 1 y轴上方 2m 的位置 。说明新的坐标系carrot1 成功 生成了
在这里插入图片描述

移动乌龟1 会 发现 乌龟2 的位置 和 乌龟1 的位置始终保持 左手边 2 m 的位置,因为 新的坐标系carrot1和乌龟1的坐标系的位置关系没有变化。

在这里插入图片描述

下面做一个 移动的坐标系

6、发布一个移动的坐标系

刚才添加的坐标系是一个固定的坐标系(和父坐标系关系不变)。

如果想发布一个 移动的坐标系 ,可以 随着时间变化更改 广播者。

下面修改 /carrot1 坐标系 和 /turtle1 坐标系的相对关系 随着时间变化。

在while循环中添加下面代码 ,在发送 坐标变换之前加

    transformStamped.transform.translation.x = 2.0*sin(ros::Time::now().toSec());
    transformStamped.transform.translation.y = 2.0*cos(ros::Time::now().toSec());

重新编译运行

再运行会发现乌龟2 不会 移动到一个地方不动了, 而是围者乌龟1 不停的转圈。

在这里插入图片描述
控制乌龟1 移动 乌龟2 轨迹如下

在这里插入图片描述

7、完毕

相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
相关文章
|
4月前
|
机器人
05 ROS Parameter服务器实例
本文介绍了如何在ROS(机器人操作系统)中使用参数服务器,包括获取和设置参数,并通过示例代码展示了如何读取和修改海龟仿真(turtlesim)的背景颜色参数。
32 0
|
4月前
|
存储 网络协议 机器人
04 ROS Client-Service-Server实例
本文通过实例讲解了ROS(机器人操作系统)中服务(Service)机制的工作原理,包括客户端请求服务的步骤、服务器提供服务的步骤,以及如何编写、编译和测试服务的客户端和服务器代码。
105 0
|
4月前
|
传感器 网络协议 机器人
03 ROS Publisher-Topic-Subscriber实例
关于ROS(机器人操作系统)中发布者-订阅者模式的教程,详细讲解了如何创建功能包、编写发布者和订阅者的源码、定义和使用自定义消息类型,以及编译和运行发布者和订阅者节点的过程。
64 0
|
弹性计算 固态存储 Linux
使用ROS创建ECS实例
本场景利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云云服务器实例(ECS)。
|
算法 机器人 API
【ROS】TF2坐标转换及实战示例
ROS中提供了坐标转换的软件包 Transform Frame TF的作用是ROS中实现不同坐标点/向量的转换。
729 0
ROS TF2当前坐标系如何计算其它历史坐标系的坐标变换
ROS TF2当前坐标系如何计算其它历史坐标系的坐标变换
ROS TF2当前坐标系如何计算其它历史坐标系的坐标变换
|
数据可视化 机器人 C++
ROS TF2
turtlesim的多机器人示例中,展示了tf2的一些功能。 也介绍了使用tf2_echo,view_frames和rviz。 使对tf2可以做的事情有个很好的了解。
ROS TF2
|
传感器 存储 机器人
ROS TF 将传感器数据转换为机器人坐标系下
ROS TF 将传感器数据转换为机器人坐标系下
ROS TF 将传感器数据转换为机器人坐标系下
|
传感器 缓存
ROS TF2 :通过tf2_ros::MessageFilter 将世界坐标系下的点转为期望坐标系下的点
ROS TF2 :通过tf2_ros::MessageFilter 将世界坐标系下的点转为期望坐标系下的点

推荐镜像

更多