UR3e teleoperation with Occulus quest2

UR3e teleoperation with Occulus quest2

Team member

นายจรัญวัฒน์ บัวศรี 63340500005

Objective

โปรเจคนี้มีจุประสงค์ในการควบคุมแขนหุ่นยนต์แบบ realtime ตามการขยับแขนของผู้ใช้ เพื่อใช้ในสถานการณ์ที่ต้องการความสามารถที่ตัดสินใจแบบมนุษย์แต่แม่นยำแบบเครื่องจักร ยกตัวอย่างเช่น การผ่าตัด การซ่อมแซมจากระยะไกลที่มนุษย์เข้าถึงไมได้ โดยการควบคุมแขนของหุ่นยนต์จะให้ผู้ใช้สวมใส่ Occulus quest 2 ซึ่งเป็นแว่น VR และควบคุมตำแหน่งและทิศทางของปลายแขนด้วยโดยใช้คอนโทลเลอ

System scenario

ผู้ใช้จะสวมใส่แว่น VR และรับภาพที่ stream มาจากกล้องที่ติดอยู่กับหุ่นยนต์ โดยข้อมูลที่รับส่งจากแว่น VR ไปยังหุ่นยนต์จะใช้ ROS-TCP connector เนื่องจากแว่น VR ไม่ระบบ DDS เพื่อสื่อสารกับ ROS2 HUMBLE จึงใช้ ROS-TCP connector แปลงข้อมูลที่ส่งผ่าน TCP เป็น ROS2 msg ก่อนที่จะส่งไปที่ Moveit2 เพื่อควบคุม UR3e

แขนกล UR3e

โดยผู้ใช้จะควบคุมตำแหน่งและการหมุนของ end effector หรือปลายแขนหุ่นยนต์ โดยใช้ที่ควบคุมของมือขวา โดยหลักการทำงานเป็นดังนี้

Design-Programming

โดยการคสบคุมแขนกลจะใช้ Moveit2 ซึ่งเป็น package ของ ROS2 ใช้สำหรับการคำนวณต่างๆของแขนหุ่นยนต์ เช่น การชน singularity ความเร็วแขน ตำแหน่งที่อยากไปเป็นต้น

โดยข้อมูลการควบคุมจะถูกส่งมาจาก Oculus Quest 2 ซึ่งขะใช้ package เสริมของ Unity ที่ชื่อว่า ROS-TCP-Connector ซึ่งเป็น package ที่ใช้สื่อสารระหว่าง ROS หรือ ROS2 กับ Unity

โดยเราจะนำค่า Position และ Orientation ของ Right controller มาแปลงให้อยู่ในกฎมือขวาก่อนที่จะส่ง msg ไปที่ ROS2 และสามารถกด set origin ใหม่ด้วยปุ่ม secondary เมื่อต้องการปรับตำแหน่งเริ่มต้นใหม่

Realtime servoing

เป็น node ของ ROS2 ที่ใช้ในการควบคุมความเร็วของ end effector โดยการส่ง msg ที่บอกว่าให้ความเร็วในแต่ละทิศมีขนาดเท่าไร ซึ่งในส่วนนี้ผู้จัดทำได้นำค่า Position และ Orientation มาทำ P controller เพื่อทำ Feedback control โดยตัวอย่างของ Code จะดังรูปด้านล่าง

Gripper control

ผู้ใช้ควบคุมโดยการกดปุ่ม Trigger บน Right controller เพื่อให้ Unity ส่ง ROS2 Service ผ่าน ROS-TCP-Connector เพื่อสื่อสารกับ node ที่จะใช้ในการ setIO บน UR3e ซึ่งชื่อ serviec ในการ setIO คือ /io_and_status_controller/set_io และเมื่อ node เริ่มการทำงาน มันจะส่งให้ Gripper อยู่ในสถานะ Open

จากนั้นสร้าง Finite state machine เพื่อใช้ควบคุม Gripper เมื่อได้รับการ Request จาก Service

โดยจะต้อง De-energized ก่อนที่จะเปลี่ยนสถานะเพื่อป้องกัน Short circuit โดยการ setIO ที่ควบคุม Gripper ให้ Digital output เป็น 0 ทั้งหมด

Implementation

1.เปิด terminal ใหม่แล้วพิมพ์คำสั่งด้านล่างเพื่อสื่อสารกับ UR3e

ros2 launch ur_robot_driver ur_control.launch.py ur_type:=ur3e robot_ip:=192.168.1.102 launch_rviz:=false

2.เปิด terminal ใหม่แล้วพิมพ์คำสั่งด้านล่างเพื่อใช้งาน Moveit2 กับ UR3e

ros2 launch ur_moveit_config ur_moveit.launch.py ur_type:=ur3e launch_rviz:=true

3.เปิด terminal ใหม่แล้วพิมพ์คำสั่งด้านล่างเพื่อหา IP ของคอมพิวเตอร์และนำไปใส่ใน Unity และ Upload โปรแกรมลงบน Oculus Quest 2

hostname -I

4.นำ IP ที่ได้มาใช้งานกับคำสั่งด้านล่างเพื่อเร่มการสื่อสารระหว่าง Unity และ ROS2

ros2 run ros_tcp_endpoint default_server_endpoint –ros-args -p ROS_IP:=<IP ที่ได้จากข้อ3p ROS_TCP_PORT:=10000

5.เปิด terminal ใหม่แล้วพิมพ์คำสั่งด้านล่างเพื่อนำหุ่นยนต์ไปในจุดเริ่มต้นและสร้างกำแพงดพื่อป้องกันการชน

ros2 launch manipulator_vr_teleop cmd_ur3e.launch.py

6.เปิด terminal ใหม่แล้วพิมพ์คำสั่งด้านล่าง เพื่อเริ่มการทำงานของ Real time servoing

ros2 service call /servo_node/start_servo std_srvs/srv/Trigger

7.พิมพ์คำสั่งด้านล่าง เพื่อเริ่มการทำงานของ ROS2 controller ที่จะใช้กับ Real time servoing

ros2 control switch_controllers –activate forward_position_controller –deactivate scaled_joint_trajectory_controller

8.เปิด terminal ใหม่แล้วพิมพ์คำสั่งด้านล่าง เพื่อเริ่มการควบคุม Position และ orientation ของ UR3e

ros2 run manipulator_vr_teleop occulus_cmd

9.เปิด terminal ใหม่แล้วพิมพ์คำสั่งด้านล่าง เพื่อเริ่มการควบคุม Gripper บน UR3e

ros2 run manipulator_vr_teleop gripper_cmd

10.เปิด terminal ใหม่แล้วพิมพ์คำสั่งด้านล่าง เพื่อเริ่มการส่งภาพจาก Web cam ไป Unity

ros2 run manipulator_vr_teleop webcam

Discussion

  1. ระบบ stream ภาพยังมีความหน่วงอาจมาจากการใช้ ROS เป็นตัวส่งภาพ
  2. แขนกลยังไม่สามารถตามแขนของผู้ใช้ทันเมื่อผู้ใช้ขยับแบบรวดเร็วอาจต้องใช้ RT kernel ของ Linux เพื่อเพิ่มอัตราการส่งข้อมูล
  3. ควรปรับปรุง perspective ของ VR เพื่อทำให้ผู้ใช้ใช้งานได้สดวกขึ้น

Code

https://github.com/jarunyawat/manipulator_vr_teleop/tree/main/manipulator_vr_teleop/src: UR3e teleoperation with Occulus quest2

Reference

  1. Realtime Arm Servoing — MoveIt Documentation: Humble documentation (picknik.ai)
  2. GitHub – UniversalRobots/Universal_Robots_ROS2_Driver: Universal Robots ROS2 driver supporting CB3 and e-Series
  3. Welcome to ur_robot_driver’s documentation! — ur_robot_driver documentation (ros.org)
  4. GitHub – Unity-Technologies/ROS-TCP-Connector