PX4 ROS 2 Interface Library
Library to interface with PX4 from a companion computer using ROS 2
global_position_measurement_interface.hpp
1 /****************************************************************************
2  * Copyright (c) 2023 PX4 Development Team.
3  * SPDX-License-Identifier: BSD-3-Clause
4  ****************************************************************************/
5 
6 #pragma once
7 
8 #include <Eigen/Eigen>
9 #include <optional>
10 #include <px4_msgs/msg/aux_global_position.hpp>
11 #include <px4_ros2/navigation/experimental/navigation_interface_base.hpp>
12 #include <rclcpp/rclcpp.hpp>
13 
14 namespace px4_ros2 {
22 enum class GlobalPositionSource : uint8_t {
23  Unknown = px4_msgs::msg::AuxGlobalPosition::SOURCE_UNKNOWN,
24  GNSS = px4_msgs::msg::AuxGlobalPosition::SOURCE_GNSS,
25  Vision = px4_msgs::msg::AuxGlobalPosition::SOURCE_VISION,
26  Pseudolites = px4_msgs::msg::AuxGlobalPosition::SOURCE_PSEUDOLITES,
27  Terrain = px4_msgs::msg::AuxGlobalPosition::SOURCE_TERRAIN,
28  Magnetic = px4_msgs::msg::AuxGlobalPosition::SOURCE_MAGNETIC,
29  Estimator = px4_msgs::msg::AuxGlobalPosition::SOURCE_ESTIMATOR,
30 };
31 
43  rclcpp::Time timestamp_sample{};
44 
46  std::optional<Eigen::Vector2d> lat_lon{std::nullopt};
48  std::optional<float> horizontal_variance{std::nullopt};
49 
51  std::optional<float> altitude_msl{std::nullopt};
53  std::optional<float> vertical_variance{std::nullopt};
54 };
55 
61  public:
70  rclcpp::Node& node, uint8_t id = 1,
71  GlobalPositionSource source = GlobalPositionSource::Vision,
72  std::string topic_namespace_prefix = "");
73  ~GlobalPositionMeasurementInterface() override = default;
74 
84  void update(const GlobalPositionMeasurement& global_position_measurement) const;
85 
94  inline void reset() { ++_lat_lon_reset_counter; }
95 
96  private:
100  bool isMeasurementNonEmpty(const GlobalPositionMeasurement& measurement) const;
101 
106  bool isVarianceValid(const GlobalPositionMeasurement& measurement) const;
107 
112  bool isFrameValid(const GlobalPositionMeasurement& measurement) const;
113 
117  bool isValueNotNAN(const GlobalPositionMeasurement& measurement) const;
118 
119  rclcpp::Publisher<px4_msgs::msg::AuxGlobalPosition>::SharedPtr _aux_global_position_pub;
120 
121  const uint8_t _id;
122  const GlobalPositionSource _source;
123  uint8_t _lat_lon_reset_counter{
124  0};
125 };
126 
128 } // namespace px4_ros2
Base class for a global position measurement provider.
Definition: global_position_measurement_interface.hpp:60
void update(const GlobalPositionMeasurement &global_position_measurement) const
Publishes a global position measurement to the FMU. Throws an exception if the following conditions a...
GlobalPositionMeasurementInterface(rclcpp::Node &node, uint8_t id=1, GlobalPositionSource source=GlobalPositionSource::Vision, std::string topic_namespace_prefix="")
void reset()
Notify the FMU that the global position estimate has been reset.
Definition: global_position_measurement_interface.hpp:94
Base class for position measurement interface.
Definition: navigation_interface_base.hpp:27
GlobalPositionSource
Source type of the global position data.
Definition: global_position_measurement_interface.hpp:22
Represents a global position measurement to be passed to GlobalPositionMeasurementInterface::update.
Definition: global_position_measurement_interface.hpp:41
std::optional< float > horizontal_variance
Variance of horizontal position error (meters).
Definition: global_position_measurement_interface.hpp:48
rclcpp::Time timestamp_sample
Timestamp of the sample.
Definition: global_position_measurement_interface.hpp:43
std::optional< float > altitude_msl
Altitude in the MSL frame.
Definition: global_position_measurement_interface.hpp:51
std::optional< float > vertical_variance
Variance of vertical position error (meters).
Definition: global_position_measurement_interface.hpp:53
std::optional< Eigen::Vector2d > lat_lon
Latitude and longitude.
Definition: global_position_measurement_interface.hpp:46