# Installing ROS2 Jazzy (การติดตั้ง ROS2 Jazzy) ในบทนี้ เราจะเข้าสู่ขั้นตอนสำคัญคือการติดตั้ง "สมอง" ให้กับหุ่นยนต์ นั่นคือ **ROS2 Jazzy Jalisco** ลงบนระบบปฏิบัติการ **Ubuntu 24.04** พร้อมทั้งทำความเข้าใจว่าทำไมเราถึงเลือกใช้เครื่องมือชุดนี้ ## Why ROS2? (ทำไมต้อง ROS2) คำถามแรกที่ผู้เริ่มต้นมักสงสัยคือ *"ทำไมต้องใช้ ROS? ในเมื่อเราก็เขียน Python หรือ C++ สั่งงานบอร์ดไมโครคอนโทรลเลอร์โดยตรงได้อยู่แล้ว"* เพื่อตอบคำถามนี้ เราต้องทำความเข้าใจนิยามที่แท้จริงของมันก่อน **ROS (Robot Operating System)** ไม่ใช่ระบบปฏิบัติการ (OS) ที่จะมาแทนที่ Windows หรือ Linux และไม่ใช่โปรแกรมสำเร็จรูปเหมือน Microsoft Word แต่มันคือ **"Middleware" (ตัวกลาง)** หรือ **"Framework"** ที่รวบรวมเครื่องมือ ชุดคำสั่ง (Libraries) และมาตรฐานการสื่อสารสำหรับการสร้างหุ่นยนต์ไว้ครบถ้วน ### The Problem: "Reinventing the Wheel" (การเสียเวลาสร้างล้อใหม่) สมมติว่าท่านต้องการสร้าง "หุ่นยนต์เสิร์ฟอาหาร" หนึ่งตัว หากไม่ใช้ ROS ท่านจะต้องเขียนโค้ดมหาศาลเพื่อจัดการเรื่องพื้นฐานเหล่านี้เองทั้งหมด: 1. เขียน Driver เพื่อคุยกับเซนเซอร์ Lidar ยี่ห้อ A 2. เขียนโปรแกรมเพื่อสั่งมอเตอร์ Driver ยี่ห้อ B 3. ออกแบบโปรโตคอลเพื่อให้คอมพิวเตอร์คุยกับกล้อง 4. เขียนระบบนำทาง (Navigation) และหลบสิ่งกีดขวางใหม่ตั้งแต่ศูนย์ ผลลัพธ์คือ ท่านจะหมดเวลา 90% ไปกับการ **"เตรียมอุปกรณ์"** และเหลือเวลาเพียง 10% ในการพัฒนา **"ความฉลาด"** ของหุ่นยนต์จริงๆ และถ้าวันหนึ่งท่านเปลี่ยนยี่ห้อ Lidar ท่านก็ต้องรื้อโค้ดเขียนใหม่ทั้งหมด ### The Solution: ROS2 as a "Universal Translator" **ROS2** เข้ามาแก้ปัญหานี้โดยการทำตัวเป็น "ล่ามแปลภาษา" กลางครับ * **Hardware Abstraction:** ไม่ว่าท่านจะใช้ Lidar ยี่ห้อไหน หรือมอเตอร์รุ่นอะไร ผู้ผลิตมักจะเตรียม **ROS2 Driver** มาให้แล้ว หน้าที่ของท่านคือแค่โหลดมาใช้ ข้อมูลที่ออกมาจะเป็นมาตรฐานเดียวกันหมด (เช่น ข้อมูลระยะทางจะออกมาเป็น `LaserScan` เสมอ) * **Focus on Application:** เมื่อไม่ต้องห่วงเรื่องฮาร์ดแวร์ ท่านสามารถเอาเวลาไปโฟกัสที่ Logic สำคัญได้เลย เช่น "ถ้าเจอลูกค้า ให้หยุดและทักทาย" หรือ "เดินไปโต๊ะ 5 โดยหลบเก้าอี้" * **Reuse Capability:** โค้ดระบบนำทาง (Navigation Stack) ที่วิศวกรระดับโลกจาก **NASA** หรือ **Intel** เขียนไว้ ถูกเปิดเป็น Open Source ให้เราดึงมาใช้กับหุ่นยนต์ของเราได้ทันที ### ตัวอย่างการใช้งานจริง (Use Cases) ปัจจุบัน ROS2 ไม่ได้อยู่แค่ในห้องทดลองมหาวิทยาลัย แต่เป็นมาตรฐานอุตสาหกรรมที่บริษัทยักษ์ใหญ่เลือกใช้: * **Logistics & Warehouse:** หุ่นยนต์ **AMR** (Autonomous Mobile Robot) ที่วิ่งขนของในโกดังสินค้าของ Amazon หรือ Alibaba ล้วนใช้สถาปัตยกรรมแบบ ROS เพื่อจัดการจราจรหุ่นยนต์นับร้อยตัว * **Self-Driving Cars:** รถยนต์ไร้คนขับหลายค่ายใช้ ROS2 ในการจัดการข้อมูลมหาศาลจากกล้องและเรดาร์ เพื่อประมวลผลแบบ Real-time * **Agriculture:** โดรนพ่นยา หรือรถไถนาอัตโนมัติ ใช้ ROS2 เพื่อระบุพิกัด GPS และควบคุมเส้นทางการวิ่งในแปลงเกษตร ### สรุป: ทำไมต้องเรียน? การเขียนโค้ดคุมหุ่นยนต์แบบเดิม (Bare-metal) เหมือนการ "สร้างบ้านโดยต้องปั้นอิฐเองทีละก้อน" แต่การใช้ **ROS2** เปรียบเสมือนการ "สร้างบ้านด้วยชิ้นส่วนสำเร็จรูป" ที่มีคุณภาพสูง ทำให้เราสร้างหุ่นยนต์ที่ซับซ้อนและฉลาดได้ในเวลาอันสั้น ### ROS1 vs ROS2 ในอดีต **ROS1** ถูกออกแบบมาเพื่องานวิจัยในห้องแล็บ (Academic Research) ทำให้มีข้อจำกัดเมื่อนำไปใช้จริงในเชิงพาณิชย์ โดยเฉพาะเรื่องความเสถียรและการรองรับหุ่นยนต์หลายตัวทำงานร่วมกัน **ROS2** จึงถูกพัฒนาขึ้นมาใหม่ทั้งหมด (Re-written) เพื่อแก้ปัญหาเหล่านั้น โดยมีจุดเด่นคือ: * **No Master Node:** ROS2 ไม่มี "หัวหน้าห้อง" ที่คอยคุมระบบ (Master) เหมือน ROS1 ทำให้ระบบมีความทนทานสูงกว่า (Decentralized) ถ้า Node หนึ่งพัง ระบบที่เหลือก็ยังทำงานต่อได้ * **DDS (Data Distribution Service):** ใช้มาตรฐานการสื่อสารระดับอุตสาหกรรม ทำให้รับส่งข้อมูลได้รวดเร็วและเสถียร (Real-time Capability) * **Multi-Platform:** รองรับทั้ง Ubuntu, Windows และ macOS * **Scalability:** รองรับตั้งแต่หุ่นยนต์ตัวเล็กๆ (Micro-ROS) ไปจนถึงหุ่นยนต์ขนาดใหญ่ในโรงงานอุตสาหกรรม (Industrial Arms, Autonomous Vehicles) หรือฝูงหุ่นยนต์ (Swarm Robotics) ## Ubuntu and ROS2 Versions (ความสัมพันธ์ของเวอร์ชัน) การเลือกเวอร์ชันของ ROS2 ต้องสอดคล้องกับเวอร์ชันของ Ubuntu ที่เราใช้ โดยเราจะเน้นรุ่นที่เป็น **LTS (Long Term Support)** ### อะไรคือ LTS? **LTS** ย่อมาจาก **Long Term Support** หมายถึงเวอร์ชันที่จะได้รับการดูแล อัปเดตความปลอดภัย และแก้บั๊กยาวนานถึง **5 ปี** ซึ่งเหมาะสำหรับการพัฒนาโปรดักส์เพื่อขายจริง (Production) เพราะระบบจะนิ่งและเสถียร ### ตารางจับคู่เวอร์ชัน (Compatibility Map) * **Ubuntu 20.04** $\leftrightarrow$ **ROS2 Foxy** (เก่า, หมดระยะ Support แล้ว) * **Ubuntu 22.04** $\leftrightarrow$ **ROS2 Humble** (นิยมมาก, เป็น LTS ตัวก่อนหน้า) * **Ubuntu 24.04** $\leftrightarrow$ **ROS2 Jazzy** (ล่าสุด, เป็น LTS ที่เราจะใช้ในคอร์สนี้ Support ถึงปี 2029) ### ROS 2 Rolling Ridley คืออะไร? **Rolling Ridley** คือเวอร์ชัน "สนามเด็กเล่น" สำหรับนักพัฒนา (Development Distribution) โดยมีสถานะพิเศษดังนี้: 1. **เป็น Dev ตลอดกาล:** ชื่อ "Rolling Ridley" จะถูกใช้ถาวร ไม่มีการเปลี่ยนชื่อตามปีและไม่มีวันกลายเป็นตัว Stable 2. **อัปเดตรายวัน (Bleeding Edge):** เป็นที่รวมโค้ดและฟีเจอร์ใหม่ล่าสุดที่มีการเปลี่ยนแปลงทุกวัน จึง **ไม่เสถียร** และไม่เหมาะกับการใช้งานจริง 3. **ต้นกำเนิดของรุ่น Stable:** เวอร์ชันปกติที่เราใช้ (เช่น Humble, Jazzy) เกิดจากการดึงโค้ด (Branch) จาก Rolling ณ ช่วงเวลานั้นออกมาตั้งชื่อใหม่และแช่แข็งฟีเจอร์ (Freeze) เพื่อเน้นความเสถียร ส่วน Rolling ก็จะเดินหน้าพัฒนาของใหม่ต่อไป **สรุป:** * **Rolling Ridley** = ของใหม่ล่าสุด (Dev), เปลี่ยนแปลงตลอด, เสี่ยงบั๊ก * **Jazzy / Humble** = ของนิ่ง (Stable), แช่แข็งฟีเจอร์แล้ว, เหมาะกับงานจริง ## Installation Guide (ขั้นตอนการติดตั้ง) เราจะทำการติดตั้ง **ROS2 Jazzy** บน **Ubuntu 24.04** โดยอ้างอิงจาก [Official Documentation](https://docs.ros.org/en/jazzy/Installation/Ubuntu-Install-Debians.html) ### Step 1: Set Locale (ตั้งค่าภาษา) ต้องตรวจสอบให้แน่ใจว่าระบบรองรับ **UTF-8** เพื่อป้องกันปัญหาการแสดงผลข้อความ ```{code-block} bash # Check for UTF-8 locale # Update locale to UTF-8 (if needed) sudo apt update && sudo apt install locales sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 export LANG=en_US.UTF-8 # Check again locale ``` ### Step 2: Setup Sources (การเพิ่มแหล่งดาวน์โหลด) นี่คือขั้นตอนที่มักเกิดปัญหา **"GPG Key Error"** บ่อยที่สุด หากใช้วิธีเก่า เราจะใช้วิธีมาตรฐานใหม่ โดยการดาวน์โหลด Key ไปเก็บไว้ใน `/usr/share/keyrings` โดยตรง ซึ่งปลอดภัยและจัดการง่ายกว่า ```{code-block} bash # 1. Enable Ubuntu Universe Repository sudo apt install software-properties-common sudo add-apt-repository universe # 2. Update and install curl sudo apt update && sudo apt install curl -y # 3. Download GPG Key (Crucial Step for Security) # This command stores the key safely in the keyrings folder sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg # 4. Add ROS2 Repository to your sources list echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null ``` ### Step 3: Install ROS2 Packages & Dev Tools (เริ่มติดตั้ง) หลังจากเพิ่มแหล่งดาวน์โหลดแล้ว เราจะทำการติดตั้งแพ็กเกจหลักของ ROS2 และชุดเครื่องมือสำหรับนักพัฒนา (Development Tools) เพื่อให้สามารถเขียนโค้ดและสร้างโปรเจกต์เองได้ ```{code-block} bash # 1. Update apt repository caches sudo apt update sudo apt upgrade # 2. Install ROS2 Desktop (Includes ROS, RViz, demos, tutorials) # This is the core system and visualization tools sudo apt install ros-jazzy-desktop # 3. Install Development Tools (Compilers & Build System) # This package includes Colcon, Rosdep, and other essential tools sudo apt install ros-dev-tools ``` **คำอธิบายเพิ่มเติม:** * **ros-jazzy-desktop:** คือชุดโปรแกรมหลัก ประกอบด้วยแกนกลาง ROS2 และโปรแกรมแสดงผลอย่าง Rviz2 * **ros-dev-tools:** คือกล่องเครื่องมือช่าง ประกอบด้วย `colcon` (ตัวช่วย Build โค้ด), `rosdep` (ตัวช่วยติดตั้ง Library เสริม) และคอมไพเลอร์ต่างๆ ที่จำเป็นต่อการสร้าง Robot Node ### Step 4: Initialize rosdep (ตั้งค่าระบบจัดการ Library) ก่อนจะเริ่มเขียนโปรแกรม เราต้องตั้งค่า **rosdep** ซึ่งเป็นเครื่องมือสำคัญที่ช่วยตรวจสอบและติดตั้ง Library ที่ขาดหายไปโดยอัตโนมัติ ```{code-block} bash # 1. Initialize rosdep sources sudo rosdep init # 2. Update the database (Do not use sudo here) rosdep update ``` ```{tip} **Pro Tip:** หากเจอ Error เกี่ยวกับ Key (เช่น `NO_PUBKEY` หรือ `Key Expired`) ระหว่างการสั่ง update ใน Step 3 ให้ลองรันคำสั่งในขั้นตอนที่ 2 (Download GPG Key) ใหม่อีกครั้ง เพื่อดึง Key ล่าสุดมาทับตัวเดิม ``` **ทำความรู้จักกับ `ros-dev-tools` (มันคืออะไร?)** สำหรับผู้ที่เคยศึกษา ROS2 จากแหล่งข้อมูลอื่นหรือเวอร์ชันเก่า (เช่น Humble) อาจจะคุ้นเคยกับคำสั่งติดตั้งที่ยาวเหยียด เช่น: `sudo apt install python3-colcon-common-extensions python3-rosdep python3-vcstool ...` ในเวอร์ชันใหม่ (Jazzy) ทางผู้พัฒนาได้รวบรวมเครื่องมือเหล่านั้นมัดรวมกันเป็นแพ็กเกจเดียวชื่อ **`ros-dev-tools`** เพื่อความสะดวกครับ โดยภายในประกอบด้วยเครื่องมือสำคัญดังนี้: ```{list-table} :widths: 30 70 :header-rows: 1 * - Package Name - Description * - **Colcon** - (`python3-colcon-common-extensions`) เครื่องมือสำหรับ **Build** โค้ด (ใช้แทน `catkin_make` ใน ROS1) * - **Rosdep** - (`python3-rosdep`) เครื่องมือสำหรับตรวจสอบและติดตั้ง **Dependency** (Library ที่ขาดหายไป) * - **VCS Tool** - (`python3-vcstool`) เครื่องมือจัดการ Version Control สำหรับดึงโค้ดจากหลายๆ Repo พร้อมกัน * - **Build Essentials** - (`build-essential`, `cmake`, `git`) ชุดคอมไพเลอร์พื้นฐานของ Linux (GCC, G++) ที่จำเป็นต่อการแปลงโค้ด C++ ``` ## Environment Setup (การตั้งค่าสภาพแวดล้อม) เมื่อติดตั้งเสร็จแล้ว เราจะยังเรียกใช้คำสั่ง `ros2` ไม่ได้ จนกว่าจะทำการ **Source** ไฟล์ตั้งค่าก่อน ### แบบชั่วคราว (Temporary) ใช้ได้เฉพาะใน Terminal ที่เปิดอยู่ เมื่อปิดหน้าต่างไป ค่าจะหายไป ```{code-block} bash source /opt/ros/jazzy/setup.bash ``` ### แบบถาวร (Permanent) - แนะนำ สั่งให้เครื่องรันคำสั่ง Source ทุกครั้งที่เราเปิด Terminal ใหม่ โดยการเอาไปแปะไว้ในไฟล์ `.bashrc` ```{code-block} bash # Add source command to .bashrc echo "source /opt/ros/jazzy/setup.bash" >> ~/.bashrc # Reload .bashrc immediately source ~/.bashrc ``` ## Verify Installation (ทดสอบระบบ) ลองทดสอบระบบโดยใช้โปรแกรมตัวอย่าง **Talker/Listener** 1. เปิด Terminal ช่องที่ 1 แล้วรันคำสั่งสร้างผู้ส่งข้อมูล (**Talker**) ```{code-block} bash ros2 run demo_nodes_cpp talker ``` 2. เปิด Terminal ช่องที่ 2 แล้วรันคำสั่งสร้างผู้รับข้อมูล (**Listener**) ```{code-block} bash ros2 run demo_nodes_py listener ``` **ผลลัพธ์:** หากติดตั้งสมบูรณ์ ท่านจะเห็นข้อความ `Hello World: ...` วิ่งขึ้นที่หน้าจอทั้งสองฝั่ง แสดงว่า ROS2 พร้อมใช้งานแล้ว