feat: add /chassis/feedforward subscription to gimbal_node
Receives angle_velocity from chassis_node and sends 0xA9 feedforward frame to gimbal MCU for yaw motor feedforward control.
This commit is contained in:
@@ -6,7 +6,7 @@ import serial
|
|||||||
import rclpy
|
import rclpy
|
||||||
from rclpy.node import Node
|
from rclpy.node import Node
|
||||||
from geometry_msgs.msg import Twist
|
from geometry_msgs.msg import Twist
|
||||||
from std_msgs.msg import Float32MultiArray, String
|
from std_msgs.msg import Float32, Float32MultiArray, String
|
||||||
|
|
||||||
CMD_AUTO = 0x01
|
CMD_AUTO = 0x01
|
||||||
CMD_MANUAL = 0x02
|
CMD_MANUAL = 0x02
|
||||||
@@ -53,12 +53,16 @@ class GimbalNode(Node):
|
|||||||
self._laser_sub = self.create_subscription(
|
self._laser_sub = self.create_subscription(
|
||||||
String, '/laser/command', self._laser_callback, 10
|
String, '/laser/command', self._laser_callback, 10
|
||||||
)
|
)
|
||||||
|
self._feedforward_sub = self.create_subscription(
|
||||||
|
Float32, '/chassis/feedforward', self._feedforward_callback, 10
|
||||||
|
)
|
||||||
|
|
||||||
self._current_mode = 'debug'
|
self._current_mode = 'debug'
|
||||||
|
|
||||||
self.get_logger().info(
|
self.get_logger().info(
|
||||||
'GimbalNode ready - subs: /cmd_gimbal, /vision/target, '
|
'GimbalNode ready - subs: /cmd_gimbal, /vision/target, '
|
||||||
'/web/gimbal_pid_config, /gimbal/mode, /laser/command'
|
'/web/gimbal_pid_config, /gimbal/mode, /laser/command, '
|
||||||
|
'/chassis/feedforward'
|
||||||
)
|
)
|
||||||
|
|
||||||
def _write_frame(self, data: bytearray):
|
def _write_frame(self, data: bytearray):
|
||||||
@@ -169,6 +173,17 @@ class GimbalNode(Node):
|
|||||||
data.append(_checksum(data))
|
data.append(_checksum(data))
|
||||||
self._write_frame(data)
|
self._write_frame(data)
|
||||||
|
|
||||||
|
def _feedforward_callback(self, msg: Float32):
|
||||||
|
angle_vel = float(msg.data)
|
||||||
|
self.get_logger().debug(
|
||||||
|
f'Feedforward: angle_vel={angle_vel:.4f} deg/s'
|
||||||
|
)
|
||||||
|
data = bytearray()
|
||||||
|
data.append(0xA9)
|
||||||
|
data.extend(struct.pack('<f', angle_vel))
|
||||||
|
data.append(_checksum(data))
|
||||||
|
self._write_frame(data)
|
||||||
|
|
||||||
def destroy_node(self):
|
def destroy_node(self):
|
||||||
if self._ser and self._ser.is_open:
|
if self._ser and self._ser.is_open:
|
||||||
self._ser.close()
|
self._ser.close()
|
||||||
|
|||||||
Reference in New Issue
Block a user