@@ -57,6 +57,7 @@ def _vehicle_nav_sat_fix_callback(self, msg: NavSatFix) -> None:
57
57
self ._vehicle_nav_sat_fix = msg
58
58
self .publish_vehicle_geopose ()
59
59
self .publish_vehicle_altitude ()
60
+ self .publish_gimbal_quaternion () # TODO: temporarily assuming static camera so publishing gimbal quat here
60
61
61
62
def _vehicle_pose_stamped_callback (self , msg : PoseStamped ) -> None :
62
63
"""Handles latest :class:`mavros_msgs.msg.PoseStamped` message
@@ -102,16 +103,15 @@ def vehicle_geopose(self) -> Optional[GeoPoseStamped]:
102
103
latitude , longitude = self ._vehicle_nav_sat_fix .latitude , self ._vehicle_nav_sat_fix .longitude
103
104
altitude = self ._vehicle_nav_sat_fix .altitude
104
105
105
- # Attitude
106
- attitude_ned_q = np .array ([self ._vehicle_pose_stamped .pose .orientation .y ,
107
- self ._vehicle_pose_stamped .pose .orientation .x ,
108
- - self ._vehicle_pose_stamped .pose .orientation .z ,
109
- self ._vehicle_pose_stamped .pose .orientation .w ])
110
-
111
106
# Convert ENU->NED + re-center yaw
112
- attitude_ned = Rotation .from_quat (attitude_ned_q ) * Rotation .from_rotvec (np .array ([0 , 0 , np .pi / 2 ]))
113
- #attitude_ned = Attitude(attitude_ned.as_quat(), extrinsic=True)
114
- orientation = messaging .as_ros_quaternion (attitude_ned .as_quat ())
107
+ enu_to_ned = Rotation .from_euler ('XYZ' , np .array ([np .pi , 0 , np .pi / 2 ]))
108
+ attitude_ned = Rotation .from_quat (messaging .as_np_quaternion (self ._vehicle_pose_stamped .pose .orientation )) \
109
+ * enu_to_ned .inv ()
110
+ rpy = attitude_ned .as_euler ('XYZ' , degrees = True )
111
+ rpy [0 ] = (rpy [0 ] + 180 ) % 360
112
+ attitude_ned = Rotation .from_euler ('XYZ' , rpy , degrees = True )
113
+ attitude_ned = attitude_ned .as_quat ()
114
+ orientation = messaging .as_ros_quaternion (attitude_ned )
115
115
116
116
return GeoPoseStamped (header = messaging .create_header ('base_link' ),
117
117
pose = GeoPose (
@@ -165,11 +165,11 @@ def gimbal_quaternion(self) -> Optional[Quaternion]:
165
165
"""
166
166
# TODO: assumes static nadir facing camera, do proper implementation
167
167
if self .vehicle_geopose is not None :
168
- vehicle_attitude = Attitude ( q = messaging .as_np_quaternion (self .vehicle_geopose .pose .orientation ))
169
- vehicle_attitude = vehicle_attitude .as_rotation ( )
170
- gimbal_attitude = vehicle_attitude * Rotation . from_euler ( 'XYZ' , [ 0 , - np . pi / 2 , 0 ])
171
- gimbal_attitude = messaging . as_ros_quaternion ( gimbal_attitude . as_quat () )
172
- return gimbal_attitude
168
+ vehicle_attitude = Rotation . from_quat ( messaging .as_np_quaternion (self .vehicle_geopose .pose .orientation ))
169
+ gimbal_rpy = vehicle_attitude .as_euler ( 'xyz' , degrees = True )
170
+ gimbal_rpy [ 1 ] -= 90
171
+ gimbal_attitude = Rotation . from_euler ( 'xyz' , gimbal_rpy , degrees = True )
172
+ return messaging . as_ros_quaternion ( gimbal_attitude . as_quat ())
173
173
else :
174
174
self .get_logger ().warn ('Vehicle GeoPose unknown, cannot determine gimbal quaternion for static camera.' )
175
175
return None
0 commit comments