原教程链接:
Writing a tf2 static broadcaster (C++)
注释如下:
#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)
{
//初始化ros节点
ros::init(argc,argv, "my_static_tf2_broadcaster");
// 判断参数数量,参数至少应有8个
// 参数0:static_turtle_tf2_broadcaster
// 参数1:目标坐标系名(教程中是world坐标系的子坐标系即“mystaticturtle”)
// 参数2,3,4:X、Y、Z轴的位移值
// 参数5,6,7:横滚、俯仰、航向的旋转角度
if(argc != 8)
{
ROS_ERROR("Invalid number of parameters\nusage: static_turtle_tf2_broadcaster child_frame_name x y z roll pitch yaw");
return -1;
}
//目标的坐标系不能是world坐标系,world系是最根本的坐标系。
if(strcmp(argv[1],"world")==0)
{
ROS_ERROR("Your static turtle name cannot be 'world'");
return -1;
}
//将输入参数1作为目标坐标系。
static_turtle_name = argv[1];
//创建一个StaticTransformBroadcaster的对象static_broadcaster之后通过这个对象来发布坐标变换。
//可以把这个broadcaster对象想象成大喇叭。我们把变换消息消息用一个函数装填到喇叭里就能发送了。
static tf2_ros::StaticTransformBroadcaster static_broadcaster;
//声明变换消息。
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;
//赋值变换消息的3D位移变量
static_transformStamped.transform.translation.x = atof(argv[2]);
static_transformStamped.transform.translation.y = atof(argv[3]);
static_transformStamped.transform.translation.z = atof(argv[4]);
//声明一个四元数变量(通常用来表示坐标系的旋转)
tf2::Quaternion quat;
//用Roll/Pitch/Yaw数值来初始化四元数变量
quat.setRPY(atof(argv[5]), atof(argv[6]), atof(argv[7]));
//赋值变换消息中的四元数变量
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();
//将初始化好的变换消息发送出去
static_broadcaster.sendTransform(static_transformStamped);
//在终端上显示信息
ROS_INFO("Spinning until killed publishing %s to world", static_turtle_name.c_str());
ros::spin();
return 0;
};