welcom ! Handel home

2025年4月14日 星期一

RRC(ROS Robot Control)馬達控制板 是透過 USB 串列裝置(/dev/ttyACM0)

 有一塊 RRC(ROS Robot Control)馬達控制板 是透過 USB 串列裝置(/dev/ttyACM0)與系統連線,並想要在 ROS + Docker 環境中驅動這塊控制板,你可以依照下列步驟設定。


🔧 系統目標

  • 控制板連接主機的 /dev/ttyACM0

  • ROS 在 Docker 容器中執行,透過 serial 通訊與 RRC 溝通

  • 控制板可能使用自定協議或標準如 rosserial, pyserial, ros_control 相關 Node


✅ 步驟 1:讓 Docker 容器存取 /dev/ttyACM0

啟動容器時加上:

bash
--device=/dev/ttyACM0 \ --group-add=dialout \

docker-compose.yml 中:

yaml
devices: - "/dev/ttyACM0:/dev/ttyACM0" group_add: - dialout

這樣容器內就能看到這個序列裝置。


✅ 步驟 2:主機使用者加入 dialout 群組(如尚未)

bash
sudo usermod -aG dialout $USER

登出再登入以生效,確保 Docker 能存取該設備。


✅ 步驟 3:在容器中安裝 serial 通訊函式庫

Python 通訊(使用 pyserial

bash
pip install pyserial

✅ 步驟 4:ROS 中寫 Serial 節點驅動 RRC 板

📄 rrc_serial_node.py(Python 範例)

python
#!/usr/bin/env python import rospy import serial from std_msgs.msg import String ser = None def command_callback(msg): rospy.loginfo("Sending command: %s", msg.data) ser.write((msg.data + '\n').encode()) if __name__ == '__main__': rospy.init_node('rrc_serial_node') port = rospy.get_param('~port', '/dev/ttyACM0') baud = rospy.get_param('~baud', 115200) try: ser = serial.Serial(port, baud, timeout=1) rospy.loginfo("Connected to RRC on %s", port) except serial.SerialException as e: rospy.logerr("Failed to connect to RRC: %s", e) exit(1) rospy.Subscriber('rrc_command', String, command_callback) rospy.spin()

✅ 步驟 5:撰寫 launch

📄 rrc_driver.launch

xml
<launch> <node pkg="your_rrc_pkg" type="rrc_serial_node.py" name="rrc_serial_node" output="screen"> <param name="port" value="/dev/ttyACM0"/> <param name="baud" value="115200"/> </node> </launch>

✅ 步驟 6:啟動並測試

在 Docker 容器內執行:

bash
roslaunch your_rrc_pkg rrc_driver.launch

若成功連線,你會看到:

pgsql
[INFO] Connected to RRC on /dev/ttyACM0

你可以透過發送指令給 /rrc_command topic 來控制馬達:

bash
rostopic pub /rrc_command std_msgs/String "data: 'M1:100'"

✅ 選擇性:使用 rosserial(若控制板支援)

若 RRC 支援 rosserial 協定,可用:

bash
rosrun rosserial_python serial_node.py _port:=/dev/ttyACM0 _baud:=115200

搭配控制板端跑 ros.h 的程式,能實現 ROS topic/service 控制。


📦 Docker Compose 範例

yaml
ros_rrc: image: your_ros_image container_name: ros_rrc devices: - "/dev/ttyACM0:/dev/ttyACM0" group_add: - dialout environment: - DISPLAY=${DISPLAY} volumes: - /tmp/.X11-unix:/tmp/.X11-unix command: bash -c "source /opt/ros/noetic/setup.bash && roslaunch your_rrc_pkg rrc_driver.launch"

✅ 總結

項目說明
/dev/ttyACM0是你的 RRC 控制板的 USB 串列埠
Docker 中使用加上 --device 參數讓容器能看到該埠
ROS 節點通訊使用 Python pyserial or rosserial 建立 Serial Node
Topic 控制可透過 /rrc_command 傳送控制指令
可加強加入解析協定 / 讀取回傳 / 發佈狀態等

如果你提供 RRC 指令格式(如:M1:100STOP 之類),我可以幫你擴寫完整 ROS 控制驅動節點!要嗎?

沒有留言: