diff --git a/src/modules/mavlink/mavlink_receiver.cpp b/src/modules/mavlink/mavlink_receiver.cpp index 89eb06f240..d98e3c5ae8 100644 --- a/src/modules/mavlink/mavlink_receiver.cpp +++ b/src/modules/mavlink/mavlink_receiver.cpp @@ -241,6 +241,10 @@ MavlinkReceiver::handle_message(mavlink_message_t *msg) handle_message_obstacle_distance(msg); break; + case MAVLINK_MSG_ID_TRAJECTORY_REPRESENTATION_BEZIER: + handle_message_trajectory_representation_bezier(msg); + break; + case MAVLINK_MSG_ID_TRAJECTORY_REPRESENTATION_WAYPOINTS: handle_message_trajectory_representation_waypoints(msg); break; @@ -1776,6 +1780,29 @@ MavlinkReceiver::handle_message_obstacle_distance(mavlink_message_t *msg) _obstacle_distance_pub.publish(obstacle_distance); } +void +MavlinkReceiver::handle_message_trajectory_representation_bezier(mavlink_message_t *msg) +{ + mavlink_trajectory_representation_bezier_t trajectory; + mavlink_msg_trajectory_representation_bezier_decode(msg, &trajectory); + + vehicle_trajectory_bezier_s trajectory_bezier{}; + + trajectory_bezier.timestamp = _mavlink_timesync.sync_stamp(trajectory.time_usec); + + for (int i = 0; i < vehicle_trajectory_bezier_s::NUMBER_POINTS; ++i) { + trajectory_bezier.control_points[i].position[0] = trajectory.pos_x[i]; + trajectory_bezier.control_points[i].position[1] = trajectory.pos_y[i]; + trajectory_bezier.control_points[i].position[2] = trajectory.pos_z[i]; + + trajectory_bezier.control_points[i].delta = trajectory.delta[i]; + trajectory_bezier.control_points[i].yaw = trajectory.pos_yaw[i]; + } + + trajectory_bezier.bezier_order = math::min(trajectory.valid_points, vehicle_trajectory_bezier_s::NUMBER_POINTS); + _trajectory_bezier_pub.publish(trajectory_bezier); +} + void MavlinkReceiver::handle_message_trajectory_representation_waypoints(mavlink_message_t *msg) { diff --git a/src/modules/mavlink/mavlink_receiver.h b/src/modules/mavlink/mavlink_receiver.h index 3e0dab395a..7c55679e9c 100644 --- a/src/modules/mavlink/mavlink_receiver.h +++ b/src/modules/mavlink/mavlink_receiver.h @@ -98,6 +98,7 @@ #include #include #include +#include #include class Mavlink; @@ -166,6 +167,7 @@ private: void handle_message_set_position_target_local_ned(mavlink_message_t *msg); void handle_message_set_position_target_global_int(mavlink_message_t *msg); void handle_message_statustext(mavlink_message_t *msg); + void handle_message_trajectory_representation_bezier(mavlink_message_t *msg); void handle_message_trajectory_representation_waypoints(mavlink_message_t *msg); void handle_message_utm_global_position(mavlink_message_t *msg); void handle_message_vision_position_estimate(mavlink_message_t *msg); @@ -248,6 +250,7 @@ private: uORB::Publication _mocap_odometry_pub{ORB_ID(vehicle_mocap_odometry)}; uORB::Publication _visual_odometry_pub{ORB_ID(vehicle_visual_odometry)}; uORB::Publication _rates_sp_pub{ORB_ID(vehicle_rates_setpoint)}; + uORB::Publication _trajectory_bezier_pub{ORB_ID(vehicle_trajectory_bezier)}; uORB::Publication _trajectory_waypoint_pub{ORB_ID(vehicle_trajectory_waypoint)}; // ORB publications (multi)