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