diff --git a/libs/mavlink/include/mavlink/v2.0 b/libs/mavlink/include/mavlink/v2.0 index 68869da6575d4ca61b92e9081b7c81587f157ed6..cd003f27415dcb7abd94867fd5c44cda2fc3bdf5 160000 --- a/libs/mavlink/include/mavlink/v2.0 +++ b/libs/mavlink/include/mavlink/v2.0 @@ -1 +1 @@ -Subproject commit 68869da6575d4ca61b92e9081b7c81587f157ed6 +Subproject commit cd003f27415dcb7abd94867fd5c44cda2fc3bdf5 diff --git a/src/Vehicle/Vehicle.cc b/src/Vehicle/Vehicle.cc index 2412e85b165140b3becaacdf9b110e050f3d3b2a..55eee91eaaea5891aa20579fffef24b13ff40a52 100644 --- a/src/Vehicle/Vehicle.cc +++ b/src/Vehicle/Vehicle.cc @@ -12,6 +12,8 @@ #include #include +#include + #include "Vehicle.h" #include "MAVLinkProtocol.h" #include "FirmwarePluginManager.h" @@ -1132,15 +1134,25 @@ void Vehicle::_handleAttitudeQuaternion(mavlink_message_t& message) mavlink_attitude_quaternion_t attitudeQuaternion; mavlink_msg_attitude_quaternion_decode(&message, &attitudeQuaternion); + Eigen::Quaternionf quat(attitudeQuaternion.q1, attitudeQuaternion.q2, attitudeQuaternion.q3, attitudeQuaternion.q4); + Eigen::Vector3f rates(attitudeQuaternion.rollspeed, attitudeQuaternion.pitchspeed, attitudeQuaternion.yawspeed); + Eigen::Quaternionf repr_offset(attitudeQuaternion.repr_offset_q[0], attitudeQuaternion.repr_offset_q[1], attitudeQuaternion.repr_offset_q[2], attitudeQuaternion.repr_offset_q[3]); + + // if repr_offset is valid, rotate attitude and rates + if (repr_offset.norm() >= 0.5f) { + quat = quat * repr_offset; + rates = repr_offset * rates; + } + float roll, pitch, yaw; - float q[] = { attitudeQuaternion.q1, attitudeQuaternion.q2, attitudeQuaternion.q3, attitudeQuaternion.q4 }; + float q[] = { quat.w(), quat.x(), quat.y(), quat.z() }; mavlink_quaternion_to_euler(q, &roll, &pitch, &yaw); _handleAttitudeWorker(roll, pitch, yaw); - rollRate()->setRawValue(qRadiansToDegrees(attitudeQuaternion.rollspeed)); - pitchRate()->setRawValue(qRadiansToDegrees(attitudeQuaternion.pitchspeed)); - yawRate()->setRawValue(qRadiansToDegrees(attitudeQuaternion.yawspeed)); + rollRate()->setRawValue(qRadiansToDegrees(rates[0])); + pitchRate()->setRawValue(qRadiansToDegrees(rates[1])); + yawRate()->setRawValue(qRadiansToDegrees(rates[2])); } void Vehicle::_handleGpsRawInt(mavlink_message_t& message)