21#ifndef IMU_SENSOR_BROADCASTER__IMU_TRANSFORM_HPP_
22#define IMU_SENSOR_BROADCASTER__IMU_TRANSFORM_HPP_
25#include "sensor_msgs/msg/imu.hpp"
27namespace imu_sensor_broadcaster
33Eigen::Quaterniond quat_from_euler(
double roll,
double pitch,
double yaw)
35 return Eigen::Quaterniond(
36 Eigen::AngleAxisd(yaw, Eigen::Vector3d::UnitZ()) *
37 Eigen::AngleAxisd(pitch, Eigen::Vector3d::UnitY()) *
38 Eigen::AngleAxisd(roll, Eigen::Vector3d::UnitX()));
44inline void transform_covariance(
45 std::array<double, 9> & out,
const std::array<double, 9> & in, Eigen::Quaterniond r)
47 Eigen::Map<const Eigen::Matrix<double, 3, 3, Eigen::RowMajor> > cov_in(in.data());
48 Eigen::Map<Eigen::Matrix<double, 3, 3, Eigen::RowMajor> > cov_out(out.data());
49 cov_out = r * cov_in * r.inverse();
55inline void do_transform(
56 sensor_msgs::msg::Imu & imu_out,
const sensor_msgs::msg::Imu & imu_in,
const Eigen::Quaterniond r)
58 imu_out.header = imu_in.header;
62 imu_in.angular_velocity.x, imu_in.angular_velocity.y, imu_in.angular_velocity.z);
64 imu_out.angular_velocity.x = vel.x();
65 imu_out.angular_velocity.y = vel.y();
66 imu_out.angular_velocity.z = vel.z();
68 transform_covariance(imu_out.angular_velocity_covariance, imu_in.angular_velocity_covariance, r);
70 Eigen::Vector3d accel =
72 imu_in.linear_acceleration.x, imu_in.linear_acceleration.y, imu_in.linear_acceleration.z);
74 imu_out.linear_acceleration.x = accel.x();
75 imu_out.linear_acceleration.y = accel.y();
76 imu_out.linear_acceleration.z = accel.z();
79 imu_out.linear_acceleration_covariance, imu_in.linear_acceleration_covariance, r);
83 Eigen::Quaterniond orientation =
85 imu_in.orientation.w, imu_in.orientation.x, imu_in.orientation.y, imu_in.orientation.z) *
88 imu_out.orientation.w = orientation.w();
89 imu_out.orientation.x = orientation.x();
90 imu_out.orientation.y = orientation.y();
91 imu_out.orientation.z = orientation.z();
95 imu_out.orientation_covariance = imu_in.orientation_covariance;