ROS中的imu数据(sensor_msgs/imu)一般为机体坐标系下,如果后续需要进行卡尔曼滤波等处理,需要先将其转换至世界坐标系中。借助ROS中tf工具里面的转换矩阵功能,可以较为简单的实现这一目的。(tf官方教程中是教用broadcaster与listener,个人感觉在这里有点大材小用且复杂化了)
代码全文
#include "ros/ros.h"
#include "sensor_msgs/Imu.h"
#include "geometry_msgs/Vector3.h"
#include "tf/tf.h"
void imu_fix_callback(const sensor_msgs::Imu::ConstPtr& data){
//将imu传感器中的四元数转换为tf工具中的四元数。顺序为x,y,z,w。
tf::Quaternion q1={data->orientation.x,data->orientation.y,data->orientation.z,data->orientation.w};
//通过四元数得到旋转矩阵
tf::Matrix3x3 r1;
r1.setRotation(q1);
geometry_msgs::Vector3 acc_world;//构建向量用于储存转换后的数据
//旋转矩阵右乘列向量获得转换后的向量
acc_world.x=(r1[0][0]*data->linear_acceleration.x)+(r1[0][1]*data->linear_acceleration.