From 8fd867d0118feb6612694bc23adc68db1cd74c22 Mon Sep 17 00:00:00 2001 From: Ryan Friedman Date: Thu, 12 Sep 2024 17:47:03 -0600 Subject: [PATCH] Add GeoPoseStamped interface for REP-147 * This clarifies a standard way to publish global pose of a vehicle * Add another example to REP-103 to remove ambiguity Signed-off-by: Ryan Friedman --- rep-0103.rst | 10 ++++- rep-0147.rst | 48 ++++++++++++++++++++++- rep-0147/geopose-default-orientation.png | Bin 0 -> 14318 bytes 3 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 rep-0147/geopose-default-orientation.png diff --git a/rep-0103.rst b/rep-0103.rst index a37ae881..cac08b90 100644 --- a/rep-0103.rst +++ b/rep-0103.rst @@ -168,12 +168,15 @@ There are many ways to represent rotations. The preferred order is listed below, default. By the right hand rule, the yaw component of orientation increases as the child frame -rotates counter-clockwise, and for geographic poses, yaw is zero when pointing east. +rotates counter-clockwise. +For geographic poses, yaw is zero when pointing east, and is thus 90 degrees when the +vehicle is facing north. -This requires special mention only because it differs from a traditional compass bearing, +This requires special mention only because it differs from a traditional `compass bearing`_, which is zero when pointing north and increments clockwise. Hardware drivers should make the appropriate transformations before publishing standard ROS messages. +.. _compass bearing: https://en.wikipedia.org/wiki/Bearing_(navigation) Covariance Representation ------------------------- @@ -207,6 +210,9 @@ References .. [1] Bureau International des Poids et Mesures (http://www.bipm.org/en/home/) +.. [compass-bearing] Compass Bearing (Navigation) + (https://en.wikipedia.org/wiki/Bearing_(navigation)) + Copyright ========= diff --git a/rep-0147.rst b/rep-0147.rst index cc1b1ad8..b255effd 100644 --- a/rep-0147.rst +++ b/rep-0147.rst @@ -134,7 +134,9 @@ A higher level view of the system uses the following abstraction. Coordinate Frames ================= -It is expected that users of this interface will also follow the coordinate frame conventions layed out in REP 105 [#rep105]_. +It is expected that users of this interface will also follow the coordinate frame conventions layed out in REP 105 [#REP105]_. +As mentioned in REP 103 [#REP103]_, if using the NED convention, the frame ID must end in ``_ned``. +If unspecified, ENU can be assumed. Proposed Interfaces =================== @@ -341,6 +343,33 @@ To send a series of goals a list of GlobalPositions can be used. nav_msgs/GlobalPosition[] waypoints +Pose Reporting +------------------ + +An aerial vehicle can share its geographic pose via ``geographic_msgs/GeoPoseStamped`` [#geoposestamped]_. +The position coordinates should follow WGS-84 [#wgs84]_. + +EGM2008 [#egm]_ can be assumed as the altitude datum unless otherwise stated. +If and when EGM2020 is released, this REP can be updated. +Take caution integrating GPS data and terrain data as they frequently use different datums. + +The orientation field follows REP 103's [#REP103]_ recommendation. The orientation is the transform from the +local tangent plane [#ltpc]_ to the body frame. + +A vehicle flying facing east will have a unit identity quaternion for its orientation. + +x,y,z=0, w=1 + +.. image:: rep-0147/geopose-default-orientation.png + +Remember that per REP 103 [#REP103]_, when the orientation is decomposed to its yaw component, +this yaw value is NOT equal to the traditional compass bearing. + +In the situation that the position is known but orientation it not known, or vise versa, +the unknown fields should be populated with ``NaN`` to avoid Null Island [#null_island]_. + +TODO add link to ArduPilot test code for orientation. + Currently Unspecified --------------------- @@ -960,6 +989,9 @@ References .. [#twiststamped] geometry_msgs/TwistStamped (http://docs.ros.org/api/geometry_msgs/html/msg/TwistStamped.html) +.. [#rep103] REP 103: Standard Units of Measure and Coordinate Conventions + (http://www.ros.org/reps/rep-0103.html) + .. [#rep105] REP 105: Coordinate Frames for Mobile Platforms (http://www.ros.org/reps/rep-0105.html) @@ -978,6 +1010,20 @@ References .. [#ss_trigger] ``std_srvs/Trigger`` (http://docs.ros.org/melodic/api/std_srvs/html/srv/Trigger.html) +.. [#geoposestamped] odometry + (https://docs.ros.org/en/api/geographic_msgs/html/msg/GeoPoseStamped.html) + +.. [#egm] Earth Gravity Model + (https://en.wikipedia.org/wiki/Earth_Gravitational_Model) + +.. [#wgs84] WGS 84 + (https://en.wikipedia.org/wiki/World_Geodetic_System#WGS84) + +.. [#ltpc] Local Tangent Plane coordinates + (https://en.wikipedia.org/wiki/Local_tangent_plane_coordinates) + +.. [#null_island] Null Island + (https://en.wikipedia.org/wiki/Null_Island) Copyright ========= diff --git a/rep-0147/geopose-default-orientation.png b/rep-0147/geopose-default-orientation.png new file mode 100644 index 0000000000000000000000000000000000000000..c8c59d5ec5efa2524086cde49f1d795c484c162f GIT binary patch literal 14318 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