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:
dev01
2026-06-07 13:34:06 +08:00
parent e027c58f67
commit 00ba38ce11
@@ -6,7 +6,7 @@ import serial
import rclpy
from rclpy.node import Node
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_MANUAL = 0x02
@@ -53,12 +53,16 @@ class GimbalNode(Node):
self._laser_sub = self.create_subscription(
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.get_logger().info(
'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):
@@ -169,6 +173,17 @@ class GimbalNode(Node):
data.append(_checksum(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):
if self._ser and self._ser.is_open:
self._ser.close()