From 0a56ba88737f24b9a16351536c54de5cb872c376 Mon Sep 17 00:00:00 2001 From: edkoch Date: Mon, 7 Dec 2015 13:30:38 -0800 Subject: [PATCH] Added new telemetry stream to display vision pose updates --- src/modules/mavlink/mavlink_main.cpp | 3 ++ src/modules/mavlink/mavlink_messages.cpp | 67 ++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/src/modules/mavlink/mavlink_main.cpp b/src/modules/mavlink/mavlink_main.cpp index 9af32f4b13..07b768354f 100644 --- a/src/modules/mavlink/mavlink_main.cpp +++ b/src/modules/mavlink/mavlink_main.cpp @@ -1690,6 +1690,7 @@ Mavlink::task_main(int argc, char *argv[]) configure_stream("OPTICAL_FLOW_RAD", 5.0f); configure_stream("EXTENDED_SYS_STATE", 1.0f); configure_stream("ALTITUDE", 1.0f); + configure_stream("VISION_POSITION_NED", 10.0f); break; case MAVLINK_MODE_ONBOARD: @@ -1717,6 +1718,7 @@ Mavlink::task_main(int argc, char *argv[]) configure_stream("CAMERA_TRIGGER", 500.0f); configure_stream("EXTENDED_SYS_STATE", 2.0f); configure_stream("ALTITUDE", 10.0f); + configure_stream("VISION_POSITION_NED", 10.0f); break; case MAVLINK_MODE_OSD: @@ -1764,6 +1766,7 @@ Mavlink::task_main(int argc, char *argv[]) configure_stream("CAMERA_TRIGGER", 500.0f); configure_stream("EXTENDED_SYS_STATE", 2.0f); configure_stream("ALTITUDE", 10.0f); + configure_stream("VISION_POSITION_NED", 10.0f); default: break; diff --git a/src/modules/mavlink/mavlink_messages.cpp b/src/modules/mavlink/mavlink_messages.cpp index 798849f116..1a5c6664b2 100644 --- a/src/modules/mavlink/mavlink_messages.cpp +++ b/src/modules/mavlink/mavlink_messages.cpp @@ -59,6 +59,7 @@ #include #include #include +#include #include #include #include @@ -79,6 +80,8 @@ #include #include +#include + #include "mavlink_messages.h" #include "mavlink_main.h" @@ -1216,6 +1219,69 @@ protected: } }; +class MavlinkStreamVisionPositionNED : public MavlinkStream +{ +public: + const char *get_name() const + { + return MavlinkStreamVisionPositionNED::get_name_static(); + } + + static const char *get_name_static() + { + return "VISION_POSITION_NED"; + } + + uint8_t get_id() + { + return MAVLINK_MSG_ID_VISION_POSITION_ESTIMATE; + } + + static MavlinkStream *new_instance(Mavlink *mavlink) + { + return new MavlinkStreamVisionPositionNED(mavlink); + } + + unsigned get_size() + { + return MAVLINK_MSG_ID_VISION_POSITION_ESTIMATE_LEN + MAVLINK_NUM_NON_PAYLOAD_BYTES; + } +private: + + MavlinkOrbSubscription *_pos_sub; + uint64_t _pos_time; + + /* do not allow top copying this class */ + MavlinkStreamVisionPositionNED(MavlinkStreamVisionPositionNED &); + MavlinkStreamVisionPositionNED& operator = (const MavlinkStreamVisionPositionNED &); + +protected: + explicit MavlinkStreamVisionPositionNED(Mavlink *mavlink) : MavlinkStream(mavlink), + _pos_sub(_mavlink->add_orb_subscription(ORB_ID(vision_position_estimate))), + _pos_time(0) + {} + + void send(const hrt_abstime t) + { + struct vision_position_estimate_s vpos; + memset(&vpos, 0, sizeof(vpos)); + + if (_pos_sub->update(&_pos_time, &vpos)) { + mavlink_vision_position_estimate_t vmsg; + vmsg.usec = vpos.timestamp_boot / 1000; + vmsg.x = vpos.x; + vmsg.y = vpos.y; + vmsg.z = vpos.z; + math::Quaternion q(vpos.q); + math::Vector<3> rpy = q.to_euler(); + vmsg.roll = rpy(0); + vmsg.pitch = rpy(1); + vmsg.yaw = rpy(2); + + _mavlink->send_message(MAVLINK_MSG_ID_VISION_POSITION_ESTIMATE, &vmsg); + } + } +}; class MavlinkStreamLocalPositionNED : public MavlinkStream { @@ -2644,6 +2710,7 @@ const StreamListItem *streams_list[] = { new StreamListItem(&MavlinkStreamTimesync::new_instance, &MavlinkStreamTimesync::get_name_static), new StreamListItem(&MavlinkStreamGlobalPositionInt::new_instance, &MavlinkStreamGlobalPositionInt::get_name_static), new StreamListItem(&MavlinkStreamLocalPositionNED::new_instance, &MavlinkStreamLocalPositionNED::get_name_static), + new StreamListItem(&MavlinkStreamVisionPositionNED::new_instance, &MavlinkStreamVisionPositionNED::get_name_static), new StreamListItem(&MavlinkStreamLocalPositionNEDCOV::new_instance, &MavlinkStreamLocalPositionNEDCOV::get_name_static), new StreamListItem(&MavlinkStreamAttPosMocap::new_instance, &MavlinkStreamAttPosMocap::get_name_static), new StreamListItem(&MavlinkStreamHomePosition::new_instance, &MavlinkStreamHomePosition::get_name_static),