mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-05-31 10:26:52 +08:00
Mavlink: GLOBAL_POSITION for aux positioning (#26307)
* mavlink: add GLOBAL_POSITION message handling - Add handler for incoming GLOBAL_POSITION MAVLink messages - Publish received positions to aux_global_position uORB topic - Update GLOBAL_POSITION stream to use aux_global_position topic * correctly handle multi AGP in mavlink pub * move from GLOBAL_POSITION to GLOBAL_POSITION_SENSOR * mavlink: update submodule to include GLOBAL_POSITION_SENSOR in common.xml
This commit is contained in:
Submodule src/modules/mavlink/mavlink updated: 1ba67b3c9c...51a47ee9ae
@@ -1436,9 +1436,7 @@ Mavlink::configure_streams_to_default(const char *configure_single_stream)
|
|||||||
configure_stream_local("GIMBAL_DEVICE_ATTITUDE_STATUS", 5.0f);
|
configure_stream_local("GIMBAL_DEVICE_ATTITUDE_STATUS", 5.0f);
|
||||||
configure_stream_local("GIMBAL_DEVICE_SET_ATTITUDE", 5.0f);
|
configure_stream_local("GIMBAL_DEVICE_SET_ATTITUDE", 5.0f);
|
||||||
configure_stream_local("GIMBAL_MANAGER_STATUS", 0.5f);
|
configure_stream_local("GIMBAL_MANAGER_STATUS", 0.5f);
|
||||||
#if defined(MAVLINK_MSG_ID_GLOBAL_POSITION)
|
configure_stream_local("GLOBAL_POSITION_SENSOR", 5.0f);
|
||||||
configure_stream_local("GLOBAL_POSITION", 5.0f);
|
|
||||||
#endif
|
|
||||||
configure_stream_local("GLOBAL_POSITION_INT", 5.0f);
|
configure_stream_local("GLOBAL_POSITION_INT", 5.0f);
|
||||||
#if defined(MAVLINK_MSG_ID_GNSS_INTEGRITY)
|
#if defined(MAVLINK_MSG_ID_GNSS_INTEGRITY)
|
||||||
configure_stream_local("GNSS_INTEGRITY", 1.0f);
|
configure_stream_local("GNSS_INTEGRITY", 1.0f);
|
||||||
@@ -1779,9 +1777,7 @@ Mavlink::configure_streams_to_default(const char *configure_single_stream)
|
|||||||
configure_stream_local("CURRENT_MODE", 0.5f);
|
configure_stream_local("CURRENT_MODE", 0.5f);
|
||||||
configure_stream_local("ESTIMATOR_STATUS", 1.0f);
|
configure_stream_local("ESTIMATOR_STATUS", 1.0f);
|
||||||
configure_stream_local("EXTENDED_SYS_STATE", 1.0f);
|
configure_stream_local("EXTENDED_SYS_STATE", 1.0f);
|
||||||
#if defined(MAVLINK_MSG_ID_GLOBAL_POSITION)
|
configure_stream_local("GLOBAL_POSITION_SENSOR", 10.0f);
|
||||||
configure_stream_local("GLOBAL_POSITION", 10.0f);
|
|
||||||
#endif
|
|
||||||
configure_stream_local("GLOBAL_POSITION_INT", 10.0f);
|
configure_stream_local("GLOBAL_POSITION_INT", 10.0f);
|
||||||
configure_stream_local("GPS_GLOBAL_ORIGIN", 1.0f);
|
configure_stream_local("GPS_GLOBAL_ORIGIN", 1.0f);
|
||||||
#if defined(MAVLINK_MSG_ID_GNSS_INTEGRITY)
|
#if defined(MAVLINK_MSG_ID_GNSS_INTEGRITY)
|
||||||
@@ -1847,9 +1843,7 @@ Mavlink::configure_streams_to_default(const char *configure_single_stream)
|
|||||||
configure_stream_local("ESTIMATOR_STATUS", 1.0f);
|
configure_stream_local("ESTIMATOR_STATUS", 1.0f);
|
||||||
configure_stream_local("EXTENDED_SYS_STATE", 0.5f);
|
configure_stream_local("EXTENDED_SYS_STATE", 0.5f);
|
||||||
configure_stream_local("GLOBAL_POSITION_INT", 2.0f);
|
configure_stream_local("GLOBAL_POSITION_INT", 2.0f);
|
||||||
#if defined(MAVLINK_MSG_ID_GLOBAL_POSITION)
|
configure_stream_local("GLOBAL_POSITION_SENSOR", 2.0f);
|
||||||
configure_stream_local("GLOBAL_POSITION", 2.0f);
|
|
||||||
#endif
|
|
||||||
configure_stream_local("GPS_GLOBAL_ORIGIN", 1.0f);
|
configure_stream_local("GPS_GLOBAL_ORIGIN", 1.0f);
|
||||||
configure_stream_local("GPS2_RAW", 2.0f);
|
configure_stream_local("GPS2_RAW", 2.0f);
|
||||||
configure_stream_local("GPS_RAW_INT", 2.0f);
|
configure_stream_local("GPS_RAW_INT", 2.0f);
|
||||||
|
|||||||
@@ -75,9 +75,7 @@
|
|||||||
#include "streams/ESTIMATOR_STATUS.hpp"
|
#include "streams/ESTIMATOR_STATUS.hpp"
|
||||||
#include "streams/EXTENDED_SYS_STATE.hpp"
|
#include "streams/EXTENDED_SYS_STATE.hpp"
|
||||||
#include "streams/FLIGHT_INFORMATION.hpp"
|
#include "streams/FLIGHT_INFORMATION.hpp"
|
||||||
#if defined(MAVLINK_MSG_ID_GLOBAL_POSITION)
|
#include "streams/GLOBAL_POSITION_SENSOR.hpp"
|
||||||
#include "streams/GLOBAL_POSITION.hpp"
|
|
||||||
#endif //MAVLINK_MSG_ID_GLOBAL_POSITION
|
|
||||||
#include "streams/GLOBAL_POSITION_INT.hpp"
|
#include "streams/GLOBAL_POSITION_INT.hpp"
|
||||||
#if defined(MAVLINK_MSG_ID_GNSS_INTEGRITY)
|
#if defined(MAVLINK_MSG_ID_GNSS_INTEGRITY)
|
||||||
#include "streams/GNSS_INTEGRITY.hpp"
|
#include "streams/GNSS_INTEGRITY.hpp"
|
||||||
@@ -519,9 +517,9 @@ static const StreamListItem streams_list[] = {
|
|||||||
#if defined(CURRENT_MODE_HPP)
|
#if defined(CURRENT_MODE_HPP)
|
||||||
create_stream_list_item<MavlinkStreamCurrentMode>(),
|
create_stream_list_item<MavlinkStreamCurrentMode>(),
|
||||||
#endif // CURRENT_MODE_HPP
|
#endif // CURRENT_MODE_HPP
|
||||||
#if defined(GLOBAL_POSITION_HPP)
|
#if defined(GLOBAL_POSITION_SENSOR_HPP)
|
||||||
create_stream_list_item<MavlinkStreamGLobalPosition>(),
|
create_stream_list_item<MavlinkStreamGlobalPositionSensor>(),
|
||||||
#endif // GLOBAL_POSITION_HPP
|
#endif // GLOBAL_POSITION_SENSOR_HPP
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *get_stream_name(const uint16_t msg_id)
|
const char *get_stream_name(const uint16_t msg_id)
|
||||||
|
|||||||
@@ -213,6 +213,10 @@ MavlinkReceiver::handle_message(mavlink_message_t *msg)
|
|||||||
handle_message_follow_target(msg);
|
handle_message_follow_target(msg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MAVLINK_MSG_ID_GLOBAL_POSITION_SENSOR:
|
||||||
|
handle_message_global_position_sensor(msg);
|
||||||
|
break;
|
||||||
|
|
||||||
case MAVLINK_MSG_ID_LANDING_TARGET:
|
case MAVLINK_MSG_ID_LANDING_TARGET:
|
||||||
handle_message_landing_target(msg);
|
handle_message_landing_target(msg);
|
||||||
break;
|
break;
|
||||||
@@ -2492,6 +2496,31 @@ MavlinkReceiver::handle_message_hil_gps(mavlink_message_t *msg)
|
|||||||
_sensor_gps_pub.publish(gps);
|
_sensor_gps_pub.publish(gps);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MavlinkReceiver::handle_message_global_position_sensor(mavlink_message_t *msg)
|
||||||
|
{
|
||||||
|
mavlink_global_position_sensor_t global_pos;
|
||||||
|
mavlink_msg_global_position_sensor_decode(msg, &global_pos);
|
||||||
|
|
||||||
|
aux_global_position_s aux_global_position{};
|
||||||
|
const hrt_abstime now = hrt_absolute_time();
|
||||||
|
aux_global_position.timestamp = now;
|
||||||
|
aux_global_position.timestamp_sample = now;
|
||||||
|
|
||||||
|
aux_global_position.id = global_pos.id;
|
||||||
|
aux_global_position.source = global_pos.source;
|
||||||
|
|
||||||
|
aux_global_position.lat = global_pos.lat * 1e-7;
|
||||||
|
aux_global_position.lon = global_pos.lon * 1e-7;
|
||||||
|
aux_global_position.alt = global_pos.alt;
|
||||||
|
|
||||||
|
aux_global_position.lat_lon_reset_counter = 0;
|
||||||
|
aux_global_position.eph = global_pos.eph;
|
||||||
|
aux_global_position.epv = global_pos.epv;
|
||||||
|
|
||||||
|
_aux_global_position_pub.publish(aux_global_position);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MavlinkReceiver::handle_message_follow_target(mavlink_message_t *msg)
|
MavlinkReceiver::handle_message_follow_target(mavlink_message_t *msg)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -111,6 +111,7 @@
|
|||||||
#include <uORB/topics/vehicle_rates_setpoint.h>
|
#include <uORB/topics/vehicle_rates_setpoint.h>
|
||||||
#include <uORB/topics/vehicle_status.h>
|
#include <uORB/topics/vehicle_status.h>
|
||||||
#include <uORB/topics/velocity_limits.h>
|
#include <uORB/topics/velocity_limits.h>
|
||||||
|
#include <uORB/topics/aux_global_position.h>
|
||||||
|
|
||||||
#if !defined(CONSTRAINED_FLASH)
|
#if !defined(CONSTRAINED_FLASH)
|
||||||
# include <uORB/topics/debug_array.h>
|
# include <uORB/topics/debug_array.h>
|
||||||
@@ -208,7 +209,7 @@ private:
|
|||||||
void handle_message_gimbal_manager_set_manual_control(mavlink_message_t *msg);
|
void handle_message_gimbal_manager_set_manual_control(mavlink_message_t *msg);
|
||||||
void handle_message_gimbal_device_information(mavlink_message_t *msg);
|
void handle_message_gimbal_device_information(mavlink_message_t *msg);
|
||||||
void handle_message_gimbal_device_attitude_status(mavlink_message_t *msg);
|
void handle_message_gimbal_device_attitude_status(mavlink_message_t *msg);
|
||||||
|
void handle_message_global_position_sensor(mavlink_message_t *msg);
|
||||||
#if !defined(CONSTRAINED_FLASH)
|
#if !defined(CONSTRAINED_FLASH)
|
||||||
void handle_message_debug(mavlink_message_t *msg);
|
void handle_message_debug(mavlink_message_t *msg);
|
||||||
void handle_message_debug_float_array(mavlink_message_t *msg);
|
void handle_message_debug_float_array(mavlink_message_t *msg);
|
||||||
@@ -329,7 +330,6 @@ private:
|
|||||||
uORB::Publication<vehicle_odometry_s> _mocap_odometry_pub{ORB_ID(vehicle_mocap_odometry)};
|
uORB::Publication<vehicle_odometry_s> _mocap_odometry_pub{ORB_ID(vehicle_mocap_odometry)};
|
||||||
uORB::Publication<vehicle_odometry_s> _visual_odometry_pub{ORB_ID(vehicle_visual_odometry)};
|
uORB::Publication<vehicle_odometry_s> _visual_odometry_pub{ORB_ID(vehicle_visual_odometry)};
|
||||||
uORB::Publication<vehicle_rates_setpoint_s> _rates_sp_pub{ORB_ID(vehicle_rates_setpoint)};
|
uORB::Publication<vehicle_rates_setpoint_s> _rates_sp_pub{ORB_ID(vehicle_rates_setpoint)};
|
||||||
|
|
||||||
#if !defined(CONSTRAINED_FLASH)
|
#if !defined(CONSTRAINED_FLASH)
|
||||||
uORB::Publication<debug_array_s> _debug_array_pub {ORB_ID(debug_array)};
|
uORB::Publication<debug_array_s> _debug_array_pub {ORB_ID(debug_array)};
|
||||||
uORB::Publication<debug_key_value_s> _debug_key_value_pub{ORB_ID(debug_key_value)};
|
uORB::Publication<debug_key_value_s> _debug_key_value_pub{ORB_ID(debug_key_value)};
|
||||||
@@ -339,6 +339,7 @@ private:
|
|||||||
|
|
||||||
// ORB publications (multi)
|
// ORB publications (multi)
|
||||||
uORB::PublicationMulti<distance_sensor_s> _distance_sensor_pub{ORB_ID(distance_sensor)};
|
uORB::PublicationMulti<distance_sensor_s> _distance_sensor_pub{ORB_ID(distance_sensor)};
|
||||||
|
uORB::PublicationMulti<aux_global_position_s> _aux_global_position_pub{ORB_ID(aux_global_position)};
|
||||||
uORB::PublicationMulti<gps_inject_data_s> _gps_inject_data_pub{ORB_ID(gps_inject_data)};
|
uORB::PublicationMulti<gps_inject_data_s> _gps_inject_data_pub{ORB_ID(gps_inject_data)};
|
||||||
uORB::PublicationMulti<input_rc_s> _rc_pub{ORB_ID(input_rc)};
|
uORB::PublicationMulti<input_rc_s> _rc_pub{ORB_ID(input_rc)};
|
||||||
uORB::PublicationMulti<manual_control_setpoint_s> _manual_control_input_pub{ORB_ID(manual_control_input)};
|
uORB::PublicationMulti<manual_control_setpoint_s> _manual_control_input_pub{ORB_ID(manual_control_input)};
|
||||||
|
|||||||
+24
-20
@@ -31,46 +31,49 @@
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#ifndef GLOBAL_POSITION_HPP
|
#ifndef GLOBAL_POSITION_SENSOR_HPP
|
||||||
#define GLOBAL_POSITION_HPP
|
#define GLOBAL_POSITION_SENSOR_HPP
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include <uORB/topics/aux_global_position.h>
|
#include <uORB/topics/aux_global_position.h>
|
||||||
|
|
||||||
class MavlinkStreamGLobalPosition : public MavlinkStream
|
class MavlinkStreamGlobalPositionSensor : public MavlinkStream
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static MavlinkStream *new_instance(Mavlink *mavlink) { return new MavlinkStreamGLobalPosition(mavlink); }
|
static MavlinkStream *new_instance(Mavlink *mavlink) { return new MavlinkStreamGlobalPositionSensor(mavlink); }
|
||||||
|
|
||||||
static constexpr const char *get_name_static() { return "GLOBAL_POSITION"; }
|
static constexpr const char *get_name_static() { return "GLOBAL_POSITION_SENSOR"; }
|
||||||
static constexpr uint16_t get_id_static() { return MAVLINK_MSG_ID_GLOBAL_POSITION; }
|
static constexpr uint16_t get_id_static() { return MAVLINK_MSG_ID_GLOBAL_POSITION_SENSOR; }
|
||||||
|
|
||||||
const char *get_name() const override { return get_name_static(); }
|
const char *get_name() const override { return get_name_static(); }
|
||||||
uint16_t get_id() override { return get_id_static(); }
|
uint16_t get_id() override { return get_id_static(); }
|
||||||
|
|
||||||
unsigned get_size() override
|
unsigned get_size() override
|
||||||
{
|
{
|
||||||
return _aux_global_position_sub.advertised() ? (MAVLINK_MSG_ID_GLOBAL_POSITION_LEN +
|
return _aux_global_position_sub.advertised() ? (MAVLINK_MSG_ID_GLOBAL_POSITION_SENSOR_LEN +
|
||||||
MAVLINK_NUM_NON_PAYLOAD_BYTES) : 0;
|
MAVLINK_NUM_NON_PAYLOAD_BYTES) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit MavlinkStreamGLobalPosition(Mavlink *mavlink) : MavlinkStream(mavlink) {}
|
explicit MavlinkStreamGlobalPositionSensor(Mavlink *mavlink) : MavlinkStream(mavlink) {}
|
||||||
|
|
||||||
uORB::Subscription _aux_global_position_sub{ORB_ID(aux_global_position)};
|
uORB::SubscriptionMultiArray<aux_global_position_s, 4> _aux_global_position_sub{ORB_ID::aux_global_position};
|
||||||
|
|
||||||
bool send() override
|
bool send() override
|
||||||
{
|
{
|
||||||
vehicle_global_position_s pos{};
|
aux_global_position_s pos{};
|
||||||
|
bool sent = false;
|
||||||
|
|
||||||
if (_aux_global_position_sub.update(&pos)) {
|
for (int i = 0; i < _aux_global_position_sub.size(); i++) {
|
||||||
mavlink_global_position_t msg{};
|
if (_aux_global_position_sub[i].update(&pos)) {
|
||||||
|
mavlink_global_position_sensor_t msg{};
|
||||||
|
|
||||||
msg.id = UINT8_C(1);
|
msg.target_system = 0;
|
||||||
|
msg.target_component = 0;
|
||||||
|
msg.id = pos.id;
|
||||||
msg.time_usec = pos.timestamp;
|
msg.time_usec = pos.timestamp;
|
||||||
msg.source = GLOBAL_POSITION_UNKNOWN;
|
msg.source = pos.source;
|
||||||
msg.flags = 0;
|
|
||||||
|
|
||||||
if (PX4_ISFINITE(pos.lat)) {
|
if (PX4_ISFINITE(pos.lat)) {
|
||||||
msg.lat = static_cast<int32_t>(pos.lat * 1e7);
|
msg.lat = static_cast<int32_t>(pos.lat * 1e7);
|
||||||
@@ -87,19 +90,20 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
msg.alt = pos.alt;
|
msg.alt = pos.alt;
|
||||||
msg.alt_ellipsoid = pos.alt_ellipsoid;
|
msg.alt_ellipsoid = pos.alt;
|
||||||
|
|
||||||
msg.eph = pos.eph;
|
msg.eph = pos.eph;
|
||||||
msg.epv = pos.epv;
|
msg.epv = pos.epv;
|
||||||
|
|
||||||
|
|
||||||
mavlink_msg_global_position_send_struct(_mavlink->get_channel(), &msg);
|
mavlink_msg_global_position_sensor_send_struct(_mavlink->get_channel(), &msg);
|
||||||
|
|
||||||
return true;
|
sent = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return sent;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // GLOBAL_POSITION_HPP
|
#endif // GLOBAL_POSITION_SENSOR_HPP
|
||||||
Reference in New Issue
Block a user