3 #include <geometry_msgs/Quaternion.h> 20 void parseMessageImpl(
const geometry_msgs::Quaternion& msg,
double& timestamp)
override 35 _data[0]->pushBack({ timestamp, msg.x });
36 _data[1]->pushBack({ timestamp, msg.y });
37 _data[2]->pushBack({ timestamp, msg.z });
38 _data[3]->pushBack({ timestamp, msg.w });
42 double quat_norm2 = (q.w * q.w) + (q.x * q.x) + (q.y * q.y) + (q.z * q.z);
43 if (std::abs(quat_norm2 - 1.0) > std::numeric_limits<double>::epsilon())
45 double mult = 1.0 / std::sqrt(quat_norm2);
52 double roll, pitch, yaw;
54 double sinr_cosp = 2 * (q.w * q.x + q.y * q.z);
55 double cosr_cosp = 1 - 2 * (q.x * q.x + q.y * q.y);
56 roll = std::atan2(sinr_cosp, cosr_cosp);
59 double sinp = 2 * (q.w * q.y - q.z * q.x);
60 if (std::abs(sinp) >= 1)
62 pitch = std::copysign(
M_PI_2, sinp);
66 pitch = std::asin(sinp);
70 double siny_cosp = 2 * (q.w * q.z + q.x * q.y);
71 double cosy_cosp = 1 - 2 * (q.y * q.y + q.z * q.z);
72 yaw = std::atan2(siny_cosp, cosy_cosp);
75 const double WRAP_ANGLE =
M_PI*2.0;
76 const double WRAP_THRESHOLD =
M_PI*1.95;
82 else if( (
_prev_roll - roll) > WRAP_THRESHOLD ) {
95 if( (yaw -
_prev_yaw) > WRAP_THRESHOLD ) {
98 else if( (
_prev_yaw - yaw) > WRAP_THRESHOLD ) {
void parseMessageImpl(const geometry_msgs::Quaternion &msg, double ×tamp) override
QuaternionMsgParser(const std::string &topic_name, PJ::PlotDataMapRef &plot_data)
PJ::PlotData & getSeries(const std::string &key)
constexpr double RAD_TO_DEG
std::vector< PJ::PlotData * > _data