diff --git a/msg/vehicle_attitude.msg b/msg/vehicle_attitude.msg index 2c64c32e13..a7d02ac963 100644 --- a/msg/vehicle_attitude.msg +++ b/msg/vehicle_attitude.msg @@ -18,3 +18,5 @@ float32[4] q # Quaternion (NED) float32[3] g_comp # Compensated gravity vector bool R_valid # Rotation matrix valid bool q_valid # Quaternion valid + +# TOPICS vehicle_attitude vehicle_attitude_groundtruth diff --git a/src/modules/logger/logger.cpp b/src/modules/logger/logger.cpp index 6f6b5fdb3d..4c7038c5bc 100644 --- a/src/modules/logger/logger.cpp +++ b/src/modules/logger/logger.cpp @@ -476,6 +476,7 @@ bool Logger::copy_if_updated_multi(LoggerSubscription &sub, int multi_instance, void Logger::add_default_topics() { add_topic("vehicle_attitude", 10); + add_topic("vehicle_attitude_groundtruth", 10); add_topic("actuator_outputs", 50); add_topic("telemetry_status", 50); add_topic("vehicle_command"); diff --git a/src/modules/simulator/simulator.h b/src/modules/simulator/simulator.h index f23efc217d..812686a3a4 100644 --- a/src/modules/simulator/simulator.h +++ b/src/modules/simulator/simulator.h @@ -245,6 +245,7 @@ private: #ifndef __PX4_QURT , _rc_channels_pub(nullptr), + _attitude_pub(nullptr), _actuator_outputs_sub{}, _vehicle_attitude_sub(-1), _manual_sub(-1), @@ -306,6 +307,7 @@ private: #ifndef __PX4_QURT // uORB publisher handlers orb_advert_t _rc_channels_pub; + orb_advert_t _attitude_pub; // uORB subscription handlers int _actuator_outputs_sub[ORB_MULTI_MAX_INSTANCES]; diff --git a/src/modules/simulator/simulator_mavlink.cpp b/src/modules/simulator/simulator_mavlink.cpp index 003f3fe9c2..6911cb4285 100644 --- a/src/modules/simulator/simulator_mavlink.cpp +++ b/src/modules/simulator/simulator_mavlink.cpp @@ -41,6 +41,8 @@ #include #include +#include + extern "C" __EXPORT hrt_abstime hrt_reset(void); #define SEND_INTERVAL 20 @@ -301,7 +303,40 @@ void Simulator::handle_message(mavlink_message_t *msg, bool publish) } break; + + case MAVLINK_MSG_ID_HIL_STATE_QUATERNION: + mavlink_hil_state_quaternion_t hil_state; + mavlink_msg_hil_state_quaternion_decode(msg, &hil_state); + + uint64_t timestamp = hrt_absolute_time(); + + /* attitude */ + struct vehicle_attitude_s hil_attitude; + { + hil_attitude.timestamp = timestamp; + + math::Quaternion q(hil_state.attitude_quaternion); + math::Matrix<3, 3> C_nb = q.to_dcm(); + math::Vector<3> euler = C_nb.to_euler(); + + hil_attitude.q[0] = q(0); + hil_attitude.q[1] = q(1); + hil_attitude.q[2] = q(2); + hil_attitude.q[3] = q(3); + hil_attitude.q_valid = true; + + hil_attitude.roll = euler(1); + hil_attitude.pitch = euler(0); + hil_attitude.yaw = euler(2); + + if (true) { + int hilstate_multi; + orb_publish_auto(ORB_ID(vehicle_attitude_groundtruth), &_attitude_pub, &hil_attitude, &hilstate_multi, ORB_PRIO_HIGH); + } + } + break; } + } void Simulator::send_mavlink_message(const uint8_t msgid, const void *msg, uint8_t component_ID) diff --git a/src/systemcmds/mixer/mixer.cpp b/src/systemcmds/mixer/mixer.cpp index 773faffc11..996a220b91 100644 --- a/src/systemcmds/mixer/mixer.cpp +++ b/src/systemcmds/mixer/mixer.cpp @@ -91,7 +91,7 @@ mixer_main(int argc, char *argv[]) int ret = load(argv[2], argv[3], true); if (ret != 0) { - warnx("failed to append mixer"); + PX4_ERR("failed to append mixer"); return 1; }