4. Extrait de Code & Intégration (Passerelle CAN vers Nœud ROS2 (rclpy))
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
import can
class CanBridgeNode(Node):
"""Nœud ROS2 pont CAN-Bus pour télémétrie mécatronique."""
def __init__(self):
super().__init__('can_bridge_node')
self.pub = self.create_publisher(String, '/can/rx', 10)
self.bus = can.interface.Bus(channel='can0', bustype='socketcan', bitrate=500000)
self.timer = self.create_timer(0.01, self.poll_can) # 100 Hz
def poll_can(self):
msg = self.bus.recv(timeout=0.001)
if msg:
self.pub.publish(String(data=f"ID:0x{msg.arbitration_id:X} Data:{msg.data.hex()}"))
def main():
rclpy.init()
node = CanBridgeNode()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()