PX4 ROS 2 Interface Library
Library to interface with PX4 from a companion computer using ROS 2
geodesic.hpp
1 /****************************************************************************
2  * Copyright (c) 2024 PX4 Development Team.
3  * SPDX-License-Identifier: BSD-3-Clause
4  ****************************************************************************/
5 
20 #pragma once
21 
22 #include <Eigen/Eigen>
23 #include <cmath>
24 #include <px4_msgs/msg/vehicle_local_position.hpp>
25 #include <px4_ros2/common/context.hpp>
26 #include <px4_ros2/components/shared_subscription.hpp>
27 #include <rclcpp/rclcpp.hpp>
28 
29 namespace px4_ros2 {
34 class MapProjectionImpl;
35 
47  public:
48  explicit MapProjection(Context& context);
49 
50  ~MapProjection();
51 
55  bool isInitialized() const;
56 
64  Eigen::Vector2f globalToLocal(const Eigen::Vector2d& global_position) const;
65 
73  Eigen::Vector3f globalToLocal(const Eigen::Vector3d& global_position) const;
74 
82  Eigen::Vector2d localToGlobal(const Eigen::Vector2f& local_position) const;
83 
91  Eigen::Vector3d localToGlobal(const Eigen::Vector3f& local_position) const;
92 
93  private:
97  void assertInitalized() const;
98 
105  void vehicleLocalPositionCallback(const px4_msgs::msg::VehicleLocalPosition::UniquePtr& msg);
106 
107  rclcpp::Node& _node;
108  std::unique_ptr<MapProjectionImpl> _map_projection_math;
109  SharedSubscriptionCallbackInstance _vehicle_local_position_cb;
110 };
111 
121 float horizontalDistanceToGlobalPosition(const Eigen::Vector2d& global_position_now,
122  const Eigen::Vector2d& global_position_next);
123 
133 static inline float horizontalDistanceToGlobalPosition(const Eigen::Vector3d& global_position_now,
134  const Eigen::Vector3d& global_position_next)
135 {
137  static_cast<Eigen::Vector2d>(global_position_now.head(2)),
138  static_cast<Eigen::Vector2d>(global_position_next.head(2)));
139 }
140 
150 float distanceToGlobalPosition(const Eigen::Vector3d& global_position_now,
151  const Eigen::Vector3d& global_position_next);
152 
162 float headingToGlobalPosition(const Eigen::Vector2d& global_position_now,
163  const Eigen::Vector2d& global_position_next);
164 
174 static inline float headingToGlobalPosition(const Eigen::Vector3d& global_position_now,
175  const Eigen::Vector3d& global_position_next)
176 {
177  return headingToGlobalPosition(static_cast<Eigen::Vector2d>(global_position_now.head(2)),
178  static_cast<Eigen::Vector2d>(global_position_next.head(2)));
179 }
180 
190 Eigen::Vector2f vectorToGlobalPosition(const Eigen::Vector2d& global_position_now,
191  const Eigen::Vector2d& global_position_next);
192 
202 static inline Eigen::Vector3f vectorToGlobalPosition(const Eigen::Vector3d& global_position_now,
203  const Eigen::Vector3d& global_position_next)
204 {
205  const Eigen::Vector2f vector_res =
206  vectorToGlobalPosition(static_cast<Eigen::Vector2d>(global_position_now.head(2)),
207  static_cast<Eigen::Vector2d>(global_position_next.head(2)));
208  const double d_alt = -(global_position_next.z() - global_position_now.z());
209  return Eigen::Vector3f{vector_res.x(), vector_res.y(), static_cast<float>(d_alt)};
210 }
211 
223 Eigen::Vector2d globalPositionFromLineAndDist(const Eigen::Vector2d& global_position_line_start,
224  const Eigen::Vector2d& global_position_line_end,
225  float dist_from_start);
226 
238 Eigen::Vector2d globalPositionFromHeadingAndDist(const Eigen::Vector2d& global_position_now,
239  float heading, float dist);
240 
252 static inline Eigen::Vector3d globalPositionFromHeadingAndDist(
253  const Eigen::Vector3d& global_position_now, float heading, float dist)
254 {
255  const Eigen::Vector2d global_position_res = globalPositionFromHeadingAndDist(
256  static_cast<Eigen::Vector2d>(global_position_now.head(2)), heading, dist);
257  return Eigen::Vector3d{global_position_res.x(), global_position_res.y(), global_position_now.z()};
258 }
259 
270 Eigen::Vector2d addVectorToGlobalPosition(const Eigen::Vector2d& global_position,
271  const Eigen::Vector2f& vector_ne);
272 
283 static inline Eigen::Vector3d addVectorToGlobalPosition(const Eigen::Vector3d& global_position,
284  const Eigen::Vector3f& vector_ned)
285 {
286  const Eigen::Vector2d global_position_res =
287  addVectorToGlobalPosition(static_cast<Eigen::Vector2d>(global_position.head(2)),
288  static_cast<Eigen::Vector2f>(vector_ned.head(2)));
289  const double d_alt = -vector_ned.z();
290  return Eigen::Vector3d{global_position_res.x(), global_position_res.y(),
291  global_position.z() + d_alt};
292 }
293 
295 } // namespace px4_ros2
Definition: context.hpp:18
Provides methods to convert between the geographical coordinate system ("global") and the local azimu...
Definition: geodesic.hpp:46
bool isInitialized() const
Eigen::Vector2f globalToLocal(const Eigen::Vector2d &global_position) const
Transform a point in the geographic coordinate system to the local azimuthal equidistant plane using ...
Eigen::Vector2d localToGlobal(const Eigen::Vector2f &local_position) const
Transform a point in the local azimuthal equidistant plane to the geographic coordinate system using ...
Eigen::Vector3d localToGlobal(const Eigen::Vector3f &local_position) const
Transform a point in the local azimuthal equidistant plane to the geographic coordinate system using ...
Eigen::Vector3f globalToLocal(const Eigen::Vector3d &global_position) const
Transform a point in the geographic coordinate system to the local azimuthal equidistant plane using ...
static float horizontalDistanceToGlobalPosition(const Eigen::Vector3d &global_position_now, const Eigen::Vector3d &global_position_next)
Compute the horizontal distance between two global positions in meters.
Definition: geodesic.hpp:133
static Eigen::Vector3d globalPositionFromHeadingAndDist(const Eigen::Vector3d &global_position_now, float heading, float dist)
Compute the global position given another global position, distance and heading see http://www....
Definition: geodesic.hpp:252
static float headingToGlobalPosition(const Eigen::Vector3d &global_position_now, const Eigen::Vector3d &global_position_next)
Compute the heading to the next global position in radians.
Definition: geodesic.hpp:174
static Eigen::Vector3d addVectorToGlobalPosition(const Eigen::Vector3d &global_position, const Eigen::Vector3f &vector_ned)
Compute the global position from adding a local frame vector to the current global position.
Definition: geodesic.hpp:283
static Eigen::Vector3f vectorToGlobalPosition(const Eigen::Vector3d &global_position_now, const Eigen::Vector3d &global_position_next)
Compute the vector to the next global position in meters.
Definition: geodesic.hpp:202
float distanceToGlobalPosition(const Eigen::Vector3d &global_position_now, const Eigen::Vector3d &global_position_next)
Compute the distance between two global positions in meters.
Eigen::Vector2d globalPositionFromLineAndDist(const Eigen::Vector2d &global_position_line_start, const Eigen::Vector2d &global_position_line_end, float dist_from_start)
Compute the global position on the line vector defined by two positions (start -> end) at a certain d...