1.坐标信息
1.geometry_msgs/TransformStamped:传输坐标系相关位置信息
其中:
frame_id : 被参考的坐标系
chile_frame_id : 另外一个坐标系
translation : 两坐标系的偏移
rotation : 角度的变换
2.geometry_msgs/PointStamped:传输某个坐标系内坐标点的信息
2.静态坐标
发布:发布坐标系相对关系
订阅:订阅到坐标系相关信息,传入坐标点,利用tf进行坐标转换
发布方:
#include "ros/ros.h" #include "tf2_ros/static_transform_broadcaster.h" #include "geometry_msgs/TransformStamped.h" #include "tf2/LinearMath/Quaternion.h" /* 需求:发布两个坐标系的相对关系 */ int main(int argc, char *argv[]) { setlocale(LC_ALL,""); // 初始化ros节点 ros::init(argc,argv,"static_pub"); // 创建句柄 ros::NodeHandle nh; // 创建静态坐标转换广播 tf2_ros::StaticTransformBroadcaster pub; // 创建坐标系信息 geometry_msgs::TransformStamped ts; // 设置头信息 ts.header.stamp = ros::Time::now(); // 被参考的坐标系 ts.header.frame_id = "base_id"; // 另一个坐标系(此处为雷达) ts.child_frame_id = "laser"; // 坐标系之间的偏移量 ts.transform.translation.x = 0.2; ts.transform.translation.y = 0.0; ts.transform.translation.z = 0.5; // 需要根据欧拉角转换 tf2::Quaternion qtn; // 向该对象设置欧拉角 qtn.setRPY(0,0,0); ts.transform.rotation.x = qtn.getX(); ts.transform.rotation.y = qtn.getY(); ts.transform.rotation.z = qtn.getZ(); ts.transform.rotation.w = qtn.getW(); pub.sendTransform(ts); ros::spin(); return 0; }
可以使用rviz进行可视化
订阅方:
#include "ros/ros.h" #include "tf2_ros/transform_listener.h" #include "tf2_ros/buffer.h" #include "geometry_msgs/Point.h" #include "geometry_msgs/PointStamped.h" #include "tf2_geometry_msgs/tf2_geometry_msgs.h" /* 订阅方:订阅发布的坐标系相关关系,传入一个坐标,进行tf转换 */ int main(int argc, char *argv[]) { setlocale(LC_ALL,""); ros::init(argc,argv,"static_sub"); ros::NodeHandle nh; // 创建订阅对象,订阅坐标系的相对关系 //创建一个buffer 缓冲 tf2_ros::Buffer buffer; // 创建监听对象(监听对象可以将订阅的数据存入buffer tf2_ros::TransformListener listener(buffer); // 组织一个坐标点数据 geometry_msgs::PointStamped ps