myCobot 280 JN + AIKit 3D Vision
บทที่ 10

ROS Development

แนะนำการพัฒนาด้วย Robot Operating System (ROS1 + ROS2) บน myCobot 280 JN ทั้ง rviz สำหรับ visualize และ MoveIt สำหรับ motion planning

10.1 ROS คืออะไร?

Robot Operating System (ROS) เป็น meta-OS แบบ open-source สำหรับงานหุ่นยนต์ ที่จัดเตรียม Hardware Abstraction, การควบคุมอุปกรณ์, การสื่อสารระหว่างโปรเซส (Inter-Process Messaging) และระบบจัดการแพ็คเกจ

ROS ทำงานเป็น เครือข่ายของโปรเซสที่สื่อสารกันแบบหลวม ๆ ผ่าน Topics, Services, และ Parameter Server

แผนผังการสื่อสารของ ROS กับ myCobot

รูปที่ 10-1: ROS topic flow Bridge node เป็นศูนย์กลาง รับคำสั่งจาก Python/MoveIt ส่งต่อ Serial ไปหุ่นยนต์ พร้อมส่ง feedback กลับให้ rviz และ MoveIt

📰

Topics (Pub/Sub)

โหนดส่งข้อความผ่าน Topic ส่งครั้งเดียว ใครรับก็รับ เหมาะกับ stream ข้อมูล

📞

Services (RPC)

โหนดถาม-ตอบแบบ Request/Response เหมาะกับคำสั่งที่ต้องการคำตอบ

⚙️

Parameter Server

เก็บค่า Configuration กลาง ที่ทุกโหนดเข้าถึงได้

10.2 ROS1 vs ROS2 เลือกอันไหน?

ปัจจัยROS1 (Noetic)ROS2 (Foxy/Humble)
OS รองรับUbuntu 20.04Foxy: 20.04 · Humble: 22.04
โครงสร้างMaster-SlaveDDS-based, ไม่มี Master
ความปลอดภัยขาดมี DDS Security
เหมาะกับโปรเจกต์เก่า, ทรัพยากรการศึกษามากโปรเจกต์ใหม่, ระบบ Production
เวอร์ชันบน Jetson NanoROS Noetic (ติดตั้งมาแล้ว)ต้องติดตั้งเอง
ℹ️
แนะนำ

เครื่องที่มากับชุดเป็น Jetson Nano + Ubuntu 20.04 แนะนำใช้ ROS Noetic เพราะติดตั้งมาให้แล้ว และมีแพ็คเกจ mycobot_ros รองรับครบ

เรื่อง ROS2: Foxy ลงบน 20.04 นี้ได้ก็จริง แต่ หมดอายุซัพพอร์ต (EOL) ตั้งแต่ พ.ค. 2023 — ไม่มี security update แล้ว · ส่วน Humble (LTS) ต้องการ Ubuntu 22.04 เครื่องนี้ (20.04) จึงรัน Humble ได้ ผ่าน Docker เท่านั้น ไม่ใช่ลงเนทีฟ

10.3 แพ็คเกจสำคัญสำหรับ myCobot

🎯

mycobot_ros

แพ็คเกจหลักจาก Elephant Robotics มี URDF, controllers, topics สำหรับสั่ง joint และอ่านสถานะ

👁️

rviz

เครื่องมือ visualize 3D เห็นโมเดลหุ่นยนต์, frames, sensor data แบบเรียลไทม์

🗺️

MoveIt

Motion planning framework วางแผนเส้นทาง, หลบสิ่งกีดขวาง, แก้ Inverse Kinematics

10.4 เริ่มต้นกับ ROS1 บน Jetson Nano

ตั้งค่า Environment

เพิ่ม source ใน .bashrc ให้ ROS เข้าใช้งานได้ทุก terminal:

terminal
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc

เปิดโมเดลหุ่นยนต์ใน rviz

มี launch file สำหรับงาน 4 แบบ เลือกตามที่ต้องใช้:

terminal Slider control (drag slider ในแอปเพื่อขยับ joint จริง)
roslaunch mycobot_280jn slider_control.launch \
    port:=/dev/ttyTHS1 baud:=1000000
terminal Test config (แสดงโมเดล + frames + grid)
roslaunch mycobot_280jn test.launch
terminal Model Follow (โมเดลตามหุ่นยนต์จริงแบบ real-time)
roslaunch mycobot_280jn mycobot_follow.launch
terminal GUI control + Keyboard control
roslaunch mycobot_280jn mycobot_gui_control.launch
# หรือ
roslaunch mycobot_280jn keyboard_teleop.launch
💡
rviz UI สั้น ๆ

หน้าต่าง rviz แบ่งเป็น 4 ส่วน: Panel ซ้าย = Display list, กลาง = 3D viewport, ขวา = views/cameras, ล่าง = ROS time clock

สั่งจริงจาก ROS

ใช้ Python rospy เชื่อมระหว่าง ROS topic กับ pymycobot:

python example_ros_node.py
#!/usr/bin/env python3
import rospy
from std_msgs.msg import Float64MultiArray
from pymycobot import MyCobot280

mc = MyCobot280('/dev/ttyTHS1', 1000000)

# ช่วงมุมปลอดภัยของแต่ละ joint (องศา) — อ้างอิงตาราง 7.2
JOINT_LIMITS = [(-165, 165), (-165, 165), (-165, 165),
                (-165, 165), (-165, 165), (-175, 175)]

def angle_callback(msg):
    angles = list(msg.data)
    # 1) ตรวจขนาด: ต้องมี 6 มุมพอดี ไม่งั้นข้าม (กัน array ผิดขนาดจากโหนดอื่น)
    if len(angles) != 6:
        rospy.logwarn("ข้ามคำสั่ง: ต้องการ 6 มุม แต่ได้รับ %d", len(angles))
        return
    # 2) clamp ทุกมุมให้อยู่ในลิมิตก่อนส่งเข้ามอเตอร์ (กันแขนเหวี่ยงเกินพิกัด)
    safe = [max(lo, min(hi, a)) for a, (lo, hi) in zip(angles, JOINT_LIMITS)]
    mc.send_angles(safe, 50)

if __name__ == "__main__":
    rospy.init_node("mycobot_listener")
    rospy.Subscriber("/mycobot/angles", Float64MultiArray, angle_callback)
    rospy.spin()

10.5 MoveIt Motion Planning

MoveIt เป็น framework สำหรับวางแผนการเคลื่อนที่ของแขนกล แทนที่จะคำนวณ inverse kinematics เอง MoveIt จะหาทางที่ ปลอดภัย (ไม่ชนตัวเอง / สิ่งกีดขวาง) และ เหมาะสม ให้

เปิด MoveIt + rviz

terminal launch MoveIt
roslaunch mycobot_280jn_moveit mycobot_moveit.launch

จะเปิด rviz พร้อม MoveIt motion planning panel (ฝั่งซ้าย) แต่ตอนนี้ ยังไม่ขับหุ่นยนต์จริง เป็นแค่ simulation เปิดอีก terminal เพื่อ sync motion ไปยังหุ่นยนต์จริง:

terminal sync to real robot
rosrun mycobot_280jn_moveit sync_plan.py \
    _port:=/dev/ttyTHS1 _baud:=1000000
ℹ️
ข้อกำหนด firmware/library

MoveIt ต้องใช้: Atom firmware ≥ 6.5 + pymycobot ≥ 3.5.3 ถ้าเก่ากว่านี้ ให้ burn firmware ใหม่ใน บทที่ 12.8 ก่อน

ความสามารถ

  • ลากปลายแขนใน rviz เพื่อกำหนด goal pose แล้วกด Plan & Execute
  • หลบสิ่งกีดขวาง เพิ่ม collision objects ในฉาก MoveIt จะหลบให้
  • วาง Waypoints สั่งแขนผ่านลำดับจุดหลาย ๆ จุด
  • Cartesian Path เคลื่อนเป็นเส้นตรงในระนาบ XYZ
💡
เริ่มต้นเรียน MoveIt

คู่มืออย่างเป็นทางการของ MoveIt อยู่ที่ moveit.ros.org และเอกสารเฉพาะ myCobot ที่ Elephant Docs MoveIt

10.6 ROS2 (Foxy)

เครื่องนี้เป็น Ubuntu 20.04 อยู่แล้ว ติดตั้ง ROS2 Foxy เพิ่มได้เลย (ใช้ร่วมกับ ROS Noetic ที่มีอยู่ได้)

⚠️
Foxy หมดอายุแล้ว (EOL พ.ค. 2023)

ไม่มี security update/แพตช์อีกแล้ว เหมาะกับ เรียนรู้/ทดลอง บนเครื่องนี้เท่านั้น ถ้าเริ่มโปรเจกต์ใหม่ที่ต้องดูแลยาว ๆ แนะนำ ROS2 Humble (LTS) — แต่ Humble ต้องการ Ubuntu 22.04 จึงต้องรันผ่าน Docker บนเครื่อง 20.04 นี้ หรืออัปเกรด OS

ติดตั้ง ROS2 Foxy

terminal
sudo apt update && sudo apt install curl gnupg lsb-release
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
sudo apt update
# บน Jetson (arm64) เมตาแพ็กเกจ -desktop เต็ม (rviz/Gazebo) มักไม่มี binary ครบ
# ลง ros-base ก่อน แล้วค่อยเพิ่มเครื่องมือทีละตัวที่ต้องใช้ (เช่น ros-foxy-rviz2)
sudo apt install ros-foxy-ros-base

ความแตกต่างจาก ROS1

  • ใช้ ros2 launch แทน roslaunch
  • ใช้ ros2 topic แทน rostopic
  • ไม่ต้องเปิด roscore ก่อน (DDS-based, ไม่มี Master)
  • Python API ใช้ rclpy แทน rospy
⚠️
คำเตือน

ก่อนติดตั้งซอฟต์แวร์ระบบเพิ่มเติม (เช่น ROS2) แนะนำ สำรอง TF Card ก่อน (ดู บทที่ 12) เผื่อมีอะไรผิดพลาดจะกู้กลับได้

10.7 ทรัพยากรเพิ่มเติม