5. workspace กับ package แรก
จนถึงตอนนี้เราใช้แต่ของที่ติดตั้งมาแล้ว หัวข้อนี้คือการสร้างของเราเอง
workspace คืออะไร
โฟลเดอร์ที่เก็บโค้ดของเราและผลลัพธ์จากการ build โครงเป็นแบบนี้
~/ros2_ws/
├── src/ ← โค้ดที่เราเขียน (อันเดียวที่ต้องดูแล)
├── build/ ← ของกลางระหว่าง build (ลบทิ้งได้)
├── install/ ← ผลลัพธ์ที่ใช้งานจริง (ลบทิ้งได้)
└── log/ ← บันทึกการ build (ลบทิ้งได้)
3 โฟลเดอร์ล่างสร้างใหม่ได้เสมอ ด้วยการ build ใหม่ — ไม่ต้องเก็บลง git
สร้าง workspace
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon build
colcon build ครั้งแรกจะไม่มีอะไรให้ build แต่จะสร้างโครงโฟลเดอร์ให้
สร้าง package แรก
package คือหน่วยย่อยของโค้ด — หนึ่ง workspace มีได้หลาย package
cd ~/ros2_ws/src
ros2 pkg create --build-type ament_python my_robot --dependencies rclpy
ได้โครงแบบนี้
my_robot/
├── package.xml ← ชื่อ · รุ่น · แพ็กเกจที่ต้องพึ่งพา
├── setup.py ← บอกว่าจะติดตั้งอะไรบ้าง · ชื่อคำสั่งที่จะเรียกได้
├── setup.cfg
├── resource/my_robot
└── my_robot/ ← ไฟล์ .py อยู่ตรงนี้
└── __init__.py
Note
--build-type ament_python คือ Python · ถ้าเขียน C++ ใช้ ament_cmake
เริ่มด้วย Python ก่อนดีกว่า เพราะแก้แล้วเห็นผลทันทีโดยไม่ต้องคอมไพล์ พอเจองานที่ต้องการความเร็วจริง ๆ ค่อยย้ายไป C++
build
cd ~/ros2_ws
colcon build --symlink-install
Tip
ใช้ --symlink-install เสมอตอนพัฒนา
ปกติ colcon build จะ คัดลอก ไฟล์ Python ไปที่ install/
แปลว่าแก้โค้ดแล้วต้อง build ใหม่ทุกครั้ง ไม่งั้นได้ของเก่า
--symlink-install ทำเป็นทางลัดชี้กลับมาที่ src/ แทน — แก้แล้วรันได้เลย
ไม่ต้อง build ใหม่ (ยกเว้นเพิ่มไฟล์ใหม่หรือแก้ setup.py)
ไม่ใช้ข้อนี้แล้วจะเสียเวลาไปมาก กับอาการ "แก้โค้ดแล้วไม่เห็นผล"
build เฉพาะ package เดียวเมื่อ workspace ใหญ่ขึ้น
colcon build --symlink-install --packages-select my_robot
source — ขั้นที่ลืมกันมากที่สุด
หลัง build ทุกครั้ง ต้อง source ก่อนถึงจะเรียกใช้ได้
source ~/ros2_ws/install/setup.bash
Danger
🔴 นี่คือสาเหตุอันดับหนึ่งของ "โค้ดถูกแล้วแต่ทำไมไม่ทำงาน"
อาการที่เจอ:
Package 'my_robot' not foundทั้งที่ build ผ่านแล้วแก้โค้ดแล้วรันได้ผลเหมือนเดิม
terminal หนึ่งใช้ได้ อีก terminal ใช้ไม่ได้
ทุก terminal ที่เปิดใหม่ต้อง source ใหม่ ทั้ง /opt/ros/humble/setup.bash
และ ~/ros2_ws/install/setup.bash
ลำดับที่ถูกต้องคือ ROS ก่อน แล้วค่อย workspace
source /opt/ros/humble/setup.bash # ① ROS ก่อน
source ~/ros2_ws/install/setup.bash # ② workspace ทีหลัง
ใส่ทั้งสองบรรทัดใน ~/.bashrc ได้ แต่ให้ระวังตามที่เตือนไว้ใน หัวข้อ 2
rosdep — ติดตั้งของที่ package ต้องใช้
ตอนเอาโค้ดคนอื่นมาใช้ หรือย้ายไปเครื่องใหม่
cd ~/ros2_ws
rosdep install --from-paths src --ignore-src -r -y
มันจะอ่าน package.xml ของทุก package แล้วติดตั้งของที่ขาดให้อัตโนมัติ
เมื่อ build ไม่ผ่าน
colcon build --symlink-install 2>&1 | tail -40
ถ้าเจอ error แปลก ๆ ที่หาสาเหตุไม่ได้ ให้ลบผลลัพธ์เก่าทิ้งแล้ว build ใหม่
cd ~/ros2_ws
rm -rf build install log
colcon build --symlink-install
Warning
ลบได้เฉพาะ build install log — ห้ามลบ src เพราะโค้ดที่เขียนอยู่ในนั้น
ก่อนหน้า: 4. เครื่องมือบรรทัดคำสั่ง · ต่อไป: 6. เขียน publisher กับ subscriber