From 3d35e68da2e903ed3d7328fa7d6cac7136cf6f04 Mon Sep 17 00:00:00 2001
From: eharlan <eharlan@uni-bremen.de>
Date: Mon, 22 May 2023 10:19:30 +0200
Subject: [PATCH] a

---
 robomaster_pi/Odom.py | 46 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)

diff --git a/robomaster_pi/Odom.py b/robomaster_pi/Odom.py
index 4cb8995..90119d1 100644
--- a/robomaster_pi/Odom.py
+++ b/robomaster_pi/Odom.py
@@ -2,7 +2,9 @@ import rclpy
 from rclpy.node import Node
 from nav_msgs.msg import Odometry
 import robomaster
+import math
 from robomaster import robot
+import numpy as np
 
 class OdometryPublisher(Node):
     def __init__(self):
@@ -14,15 +16,59 @@ class OdometryPublisher(Node):
     
         ep_chassis = ep_robot.chassis
         ep_chassis.sub_velocity(freq=50, callback=self.sub_velocity_handler)
+        ep_chassis.sub_attitude(freq=50, callback=self.sub_attitude_info_handler)
+        ep_chassis.sub_position(freq=50, callback=self.sub_position_handler)
+
+
+    def sub_attitude_info_handler(self, attitude_info):
+        self.yaw, pitch, roll = attitude_info
+
+            
+    def sub_position_handler(self, position_info):
+        self.x, self.y, self.z = position_info
+        self.publish_odometry()
+        self.publish_transform()
 
     def sub_velocity_handler(self, velocity_info):
         a, b, c, x, y, z = velocity_info
+        q = self.quaternion_from_euler(0, 0, -self.yaw / (180 / math.pi))
         self.msg.header.stamp = self.get_clock().now().to_msg()
         self.msg.twist.twist.linear.x = x
         self.msg.twist.twist.linear.y = y
+        self.msg.twist.twist.linear.z = 0.0
+        self.msg.pose.pose.position.x = self.x
+        self.msg.pose.pose.position.y = -self.y
+        self.msg.pose.pose.position.z = 0.0
+        self.msg.pose.pose.orientation.x = 0.0
+        self.msg.pose.pose.orientation.y = 0.0
+        self.msg.pose.pose.orientation.z = q[2]
+        self.msg.pose.pose.orientation.w = 0.0
 
         self.publisher_.publish(self.msg)
 
+    def quaternion_from_euler(self, ai, aj, ak):
+        ai /= 2.0
+        aj /= 2.0
+        ak /= 2.0
+        ci = math.cos(ai)
+        si = math.sin(ai)
+        cj = math.cos(aj)
+        sj = math.sin(aj)
+        ck = math.cos(ak)
+        sk = math.sin(ak)
+        cc = ci*ck
+        cs = ci*sk
+        sc = si*ck
+        ss = si*sk
+
+        q = np.empty((4, ))
+        q[0] = cj*sc - sj*cs
+        q[1] = cj*ss + sj*cc
+        q[2] = cj*cs - sj*sc
+        q[3] = cj*cc + sj*ss
+
+        return q
+
 def main(args=None):
     rclpy.init(args=args)
     node = OdometryPublisher()
-- 
GitLab