โครงการ เต่าหรรษา+ นี้มีวัตถุประสงค์เพื่อช่วยให้นักเรียนได้เรียนรู้เกี่ยวกับแนวคิด ROS2 เช่น Topics, Services, Parameters, Namespaces, และ Launch Files โครงการนี้จำลองสองส่วนหลัก: Teleop Turtle และ Copy Turtle โดยที่ Teleop Turtle รับคำสั่งจากแป้นพิมพ์เพื่อควบคุมเต่าในสภาพแวดล้อมจำลอง ส่วน Copy Turtle จะติดตามเส้นทางที่บันทึกไว้และสร้างพิซซ่าในตำแหน่งที่บันทึกโดย Teleop Turtle
-
Teleop Turtle:
- เคลื่อนที่เต่าด้วยการควบคุมจากแป้นพิมพ์ (
w
,a
,s
,d
) - สร้างพิซซ่าที่ตำแหน่งปัจจุบันของเต่าด้วยปุ่มเฉพาะ (
i
) - บันทึกตำแหน่งของพิซซ่าลงในไฟล์
.yaml
ด้วยปุ่มเฉพาะ (o
) - ลบพิซซ่าที่ไม่ได้บันทึกด้วยปุ่มเฉพาะ (
p
) - Teleop Turtle จำกัดจำนวนพิซซ่าไว้ที่ n pizzas ซึ่งสามารถตั้งค่าได้โดยใช้ RQT
- ปรับค่าควบคุม (controller gains) สำหรับการเคลื่อนที่ของเต่าผ่าน RQT
- เคลื่อนที่เต่าด้วยการควบคุมจากแป้นพิมพ์ (
-
Copy Turtle:
- สร้างเต่าอัตโนมัติ 4 ตัว (Foxy, Noetic, Humble, Iron)
- เต่าแต่ละตัวจะติดตามตำแหน่งของพิซซ่าที่บันทึกไว้โดย Teleop Turtle
- เมื่อเต่าทุกตัวเสร็จสิ้นการวางพิซซ่า จะเคลื่อนที่ไปยังพื้นที่ที่กำหนดไว้ทางขวาบนของการจำลอง
- กระบวนการนี้จะทำซ้ำเมื่อ Teleop Turtle บันทึกการดำเนินการทั้งหมด 4 ครั้ง
- เริ่มจากการออกแบบวางแผนโครงสร้างความเชื่อมโยงของระบบเพื่อให้ง่ายต่อการทำงานประสานงานกับเพื่อน และความเข้าใจร่วมกัน
โครงสร้างนี้ประกอบด้วย Node และการสื่อสารระหว่าง Node ผ่าน Topic และ Service:
-
Teleop Turtle Nodes:
teleop_key.py
: รับคำสั่งจากแป้นพิมพ์เพื่อควบคุม Teleop Turtleteleop_schedule.py
: จัดการสถานะของ Teleop Turtle รวมถึงการสร้างและการบันทึกพิซซ่า
-
Copy Turtle Nodes:
copy_schedule.py
: จัดการกลุ่ม Copy Turtle เพื่อให้แต่ละตัวติดตามตำแหน่งพิซซ่าที่บันทึกไว้
-
Controller Nodes:
-
controller.py
: ควบคุมการเคลื่อนที่ของ Turtle ทุกตัวและ Copy Turtle แต่ละตัวตามตำแหน่งที่บันทึกไว้ในไฟล์.yaml
-
ไฟล์เพิ่มเติม:
path.yaml
: เก็บตำแหน่งของพิซซ่าที่บันทึกโดย Teleop Turtle- ไฟล์ Launch:
turtle_fun.launch.py
: รันโหนดทั้งหมด- โดยมีขั้นตอนเริ่มจากสร้างหน้าต่าง
- ฆ่าเต่าตัวแรกของหน้าต่างออก
- กำเนิดเต่าตัวใหม่ด้วยชื่อใหม่ที่ตั้งด้วย namespace
- รันโหนดอื่นที่เหลือตามมา teleop_schedule.py controller.py copy_schedule.py
- โดยที่แต่ละโหนดมีการประยุกต์ใช้ความรู้ความเข้าใจที่มีในเนื้อหาการเรียนวิชา Robotic-Dev เพื่อทำโปรเจคนี้ให้สำเร็จ
ก่อนที่จะรันโครงการนี้ ตรวจสอบว่าได้ติดตั้งเครื่องมือดังต่อไปนี้:
- ROS2 ที่ติดตั้งและใช้งานได้ถูกต้อง (ทดสอบกับ ROS2 Humble)
- Colcon สำหรับสร้างระบบ ROS2
- RQT GUI สำหรับปรับค่าพารามิเตอร์
-
โคลนที่เก็บข้อมูล ลงในพื้นที่ทำงานของคุณ:
git clone https://github.com/beamkeerati/ros2_ws.git
-
ทำการแตกไฟล์:
sudo apt-get install unzip cd ros2_ws unzip src.zip
-
Build โดยใช้ colcon build:
colcon build
-
Source the workspace:
source install/local_setup.bash
launch file ทั้งหมดของระบบด้วยชุดคำสั่งนี้
ros2 launch turtle_fun turtle_fun.launch.py
สามารถเริ่มการจำลอง Teleop Turtle ได้โดยใช้คำสั่งต่อไปนี้:
ros2 run turtle_fun teleop_key.py
w
: เดินหน้า-โดยจะส่งความเร็วเชิงเส้นไปให้เต่าไปข้างหน้าa
: เลี้ยวซ้าย-โดยจะส่งความเร็วเชิงมุมไปให้เต่าหมุนทวนเข็มs
: ถอยหลัง-โดยจะส่งความเร็วเชิงเส้นไปให้เต่าไปข้างหลังd
: เลี้ยวขวา-ดยจะส่งความเร็วเชิงมุมไปให้เต่าหมุนตามเข็มr
: รีเซ็ตการจำลอง-รีเซ็ตค่าทั้งหมดที่เก็บมาได้เพื่อเริ่มเก็บใหม่i
: สร้างพิซซ่าที่ตำแหน่งของเต่า-เรียกใช้ service /spawn_pizza ณ ตำแหน่งที่เต่า trlrop อยู่o
: บันทึกตำแหน่งพิซซ่าในไฟล์.yaml
p
: ลบพิซซ่าที่ไม่ได้บันทึกออกจากการจำลอง-โดยการให้เต่าเดินไปกินตามลำดับโดยจะกินเฉพาะพิซซ่าที่เก็บมาแล้วแต่ยังไม่ได้ load ไปยัง .yaml file
สามารถปรับค่าพารามิเตอร์ต่อไปนี้ใน RQT:
- จำนวนพิซซ่า ที่ Teleop Turtle สามารถสร้างได้
- ค่า Gain ในการควมคุมความเร็ว ของเต่าทั้งในการเคลื่อนที่เชิงเส้นและเชิงมุม
-
หลังจากลองควบคุม teleop_key ผ่านคีย์บอร์ดและเสกพิซซ่าออกมาและเซิฟได้ผลลัพธ์ดังนัี้
-
สามารถ ปรับพารามิเตอร์ใน rqt ได้โดยการใช้ service call ดังนี้
-
หลังจากป้อนตำแหน่งพิซซ่าครบทั้ง 4 path แล้วทำการกดปุ่ม 'o' อีกครั้งเพื่อยืนยันแล้วจากนั้น copy turtle ในหน้าจอที่ 2 ก็จะทำการวิ่งและสร้างพิซซ่าตามค่าที่เราเก็บมาใน file .yaml
-สามารถดูความสัมพันของ Node Topic Service จริงๆของระบบทั้งหมดหลังจากทำเสร็จจาก rqt_graph ดังนี้
- ระยะเวลากับเครื่องมือที่มีทุกอย่างยังทำออกมาอย่างยากลำบาก
- การตีความโจทย์ เพื่อเขียนดักให้ได้ครบทุกทรณีมากที่สุดเป็นเรื่องที่ยากและงมนานมาก
- การทำงาน ros ร่วมกันเป็นสิ่งใหม่ที่ยังไม่เคยได้ทำประกอบกับความกดดันจึงเครียดมาก
- ยิ่งระบบใหญ่ขึ้นยิ่งต้องมีการออกแบบตอนต้นที่ดีกว่านี้ ส่วนตัวในคู่ได้เริ่มช่วยกันวางแผนเขียน System Architecture และแบ่ง Node กันเขียนแต่พอเขียนไปเรื่อยๆภาพที่วางแผนไว้ตอนแรกเริ่มทำออกมาได้ลำบากและยิ่งยากมากขึ้นเรื่อยๆเมื่อนำมารวมกัน ภายหลังจึงมีการปรับ System Architecture ใหม่และทำการ Debug โค้ดให้สามารถทำงานได้ครอบคลุมสถานการณ์ให้ได้มากที่สุด
- ต้องใช้ความรู้และความเข้าใจเยอะมากเกี่ยวกับการใช้ namespace parameter เพราะ node ในระบบเยอะมากและต้องควมคุมหลายอย่าง
- algorithm การเขียน state machine มีความเยอะและซับซ้อนมาก ทั้งการกำหนดการสื่อสาร การเลือกหน้าที่ให้โหดแต่ละตัว ถ้ามีเวลามากกว่านี้อาจจะทำให้ระบบเสถียรมากกว่านี้ได้
- นายกีรติ ยุบลมาตย์ 65340500003
- นายจรรยวรรธ ไทรงาม 65340500006
โปรเจคนี้เป็นส่วนหนึ่งของการสอบในวิชา Robotics-Dev