3 #include <geometry_msgs/msg/quaternion.hpp> 14 void parseMessageImpl(
const geometry_msgs::msg::Quaternion& msg,
double& timestamp)
override 28 _data[0]->pushBack({ timestamp, msg.x });
29 _data[1]->pushBack({ timestamp, msg.y });
30 _data[2]->pushBack({ timestamp, msg.z });
31 _data[3]->pushBack({ timestamp, msg.w });
35 double quat_norm2 = (q.w * q.w) + (q.x * q.x) + (q.y * q.y) + (q.z * q.z);
36 if (std::abs(quat_norm2 - 1.0) > std::numeric_limits<double>::epsilon())
38 double mult = 1.0 / std::sqrt(quat_norm2);
45 double roll, pitch, yaw;
47 double sinr_cosp = 2 * (q.w * q.x + q.y * q.z);
48 double cosr_cosp = 1 - 2 * (q.x * q.x + q.y * q.y);
49 roll = std::atan2(sinr_cosp, cosr_cosp);
52 double sinp = 2 * (q.w * q.y - q.z * q.x);
53 if (std::abs(sinp) >= 1)
55 pitch = std::copysign(
M_PI_2, sinp);
59 pitch = std::asin(sinp);
63 double siny_cosp = 2 * (q.w * q.z + q.x * q.y);
64 double cosy_cosp = 1 - 2 * (q.y * q.y + q.z * q.z);
65 yaw = std::atan2(siny_cosp, cosy_cosp);
69 _data[4]->pushBack({ timestamp, RAD_TO_DEG * roll });
70 _data[5]->pushBack({ timestamp, RAD_TO_DEG * pitch });
71 _data[6]->pushBack({ timestamp, RAD_TO_DEG * yaw });
75 std::vector<PJ::PlotData*>
_data;
QuaternionMsgParser(const std::string &topic_name, PJ::PlotDataMapRef &plot_data)
PJ::PlotData & getSeries(const std::string &key)
void parseMessageImpl(const geometry_msgs::msg::Quaternion &msg, double ×tamp) override
constexpr double RAD_TO_DEG
std::vector< PJ::PlotData * > _data