URL
tf2/Tutorials/Writing a tf2 static broadcaster (C++) - ROS Wiki
需要的软件包
tf2 tf2_ros
创建功能包的过程不再赘述,功能包官网中命名为learning_tf2 文件名为static_turtle_tf2_broadcaster.cpp
代码及解释
#include <ros/ros.h>
#include <tf2_ros/static_transform_broadcaster.h>
#include <geometry_msgs/TransformStamped.h>
#include <cstdio>
#include <tf2/LinearMath/Quaternion.h>
//创建一个字符串变量
std::string static_turtle_name;
int main(int argc, char **argv)
{
//节点命名为my_static_tf2_broadcaster
ros::init(argc, argv, "my_static_tf2_broadcaster");
if (argc != 8)
{
ROS_ERROR("Invalid number of parametersnusage: static_turtle_tf2_broadcaster child_frame_name x y z roll pitch yaw");
return -1;
}
if (strcmp(argv[1], "world") == 0)
{
ROS_ERROR("Your static turtle name cannot be 'world'");
return -1;
}
static_turtle_name = argv[1];
//创建一个静态tf广播对象 static_broadcaster
static tf2_ros::StaticTransformBroadcaster static_broadcaster;
//包含静态变化信息的变量 static_transformStemped
geometry_msgs::TransformStamped static_transformStamped;
//设置时间戳
static_transformStamped.header.stamp = ros::Time::now();
//设置父坐标系名称
static_transformStamped.header.frame_id = "world";
//设置子坐标系名称
static_transformStamped.child_frame_id = static_turtle_name;
//从命令行参数argv中读取值 设置偏移量
static_transformStamped.transform.translation.x = atof(argv[2]);
static_transformStamped.transform.translation.y = atof(argv[3]);
static_transformStamped.transform.translation.z = atof(argv[4]);
//创建一个四元数对象
//根据输入参数中的roll pitvh yaw角度设置四元数姿态
tf2::Quaternion quat;
quat.setRPY(atof(argv[5]), atof(argv[6]), atof(argv[7]));
//设置变换的旋转分量为四元数的x,y,z和w分量。
static_transformStamped.transform.rotation.x = quat.x();
static_transformStamped.transform.rotation.y = quat.y();
static_transformStamped.transform.rotation.z = quat.z();
static_transformStamped.transform.rotation.w = quat.w();
//使用静态tf广播器将static_transformStamped广播出去
static_broadcaster.sendTransform(static_transformStamped);
ROS_INFO("Spinning until killed publishing %s to world", static_turtle_name.c_str());
ros::spin();
return 0;
}
涉及到的模块的简介
- tf2_ros::StaticTransformBroadcaster
用于广播静态变换的类,可以另一和发布静态变换
常用的成员函数
sendTransform(const geometry_msgs::TransformStamped& transform):用于发布静态变换消息
- geometry_msgs::TransformStamped 用于表示带时间戳的变换信息。
geometry_msgs::TransformStamped 类型包含以下成员:
- std_msgs::Header header:消息头部信息,包含时间戳和坐标系信息。
- std::string child_frame_id:子坐标系的名称。
- geometry_msgs::Transform transform:坐标系变换的具体信息。
坐标系变换的具体信息包括:
- geometry_msgs::Vector3 translation:表示坐标系的平移变换,包含 x、y、z 三个浮点数。
- geometry_msgs::Quaternion rotation:表示坐标系的旋转变换,包含四元数的成员变量 x、y、z、w,用于表示旋转轴和旋转角度。
通过访问这些成员变量,可以分别获取或设置静态坐标系变换消息的各个属性值。
小结
通过tf2_ros::StaticTransformBroadcaster模块下的sendTransform发布geometry_msgs::TransformStamped类型的消息。
CMakeLists文件的编写不再赘述
静态转换的正确方法
本教程旨在展示如何使用 StaticTransformBroadcaster 发布静态转换。在实际的开发过程中,您不必自己编写此代码,而应该优先使用专用的tf2_ros工具来执行此操作。tf2_ros提供了一个名为 static_transform_publisher 的可执行文件,该可执行文件既可以用作命令行工具,也可以用作可以添加到启动文件的节点。
static_transform_publisher x y z 偏航俯仰滚frame_id child_frame_id
static_transform_publisher x y z qx qy qz qw frame_id child_frame_id
- 使用 x/y/z 偏移(以米为单位)和偏航/俯仰/滚动(以弧度为单位)将静态坐标变换发布到 tf2。(偏航是绕 Z 的旋转,俯仰是绕 Y 的旋转,滚动是绕 X 的旋转)。
<launch>
<node pkg="tf2_ros" type="static_transform_publisher" name="link1_broadcaster" args="1 0 0 0 0 0 1 link1_parent link1" />
</launch>