เขียน Node ภาษา C++ เบื้องต้น

การทำงานของ ROS จะแบ่งเป็น Node แต่ละ Node จะทำหน้าที่เฉพาะเช่น Node เซนเซอร์อุณหภูมิ, Node เซนเซอร์ความเร็ว, Node ควบคุมมอเตอร์, Node Lidar เป็นต้น แต่ละ Node จะประสานข้อมูลกันผ่าน Topic เช่นเซนเซอร์ Encoder จะ Publish ข้อมูลความเร็ว เข้าไปใน Topic Pool อุปกรณ์พวก Actuator เช่นมอเตอร์จะ Subscribe เพื่อดึงข้อมูลความเร็วไปประมวลผลและใช้งาน อาจจะเป็นการสั่งให้มอเตอร์หมุนเร็วหรือช้าขึ้น แต่ละวินาทีจะมีข้อมูล Publish หรือ Subscribe จำนวนมาก

1 : สร้าง Package ภาษา C++


สร้าง Package ภาษา C++ ตามขั้นตอนลิงค์ด้านล่าง


2 : เขียน Node ภาษา C++ เบื้องต้น


เริ่มการทำงานโดย เปิด Terminator หน้าต่างที่ 1


คลิกขวาที่ Terminator -> New Windows



จะได้หน้าต่างที่ 2


เริ่มเขียนคำสั่ง ที่หน้าต่างที่ 1

เริ่มสร้าง Node โดยเข้าไปที่โฟลเดอร์ของ Workspace ของ ROS2 โดยเราจะสร้าง Node ไว้ใน ros2_ws/scr/

cd ros2_ws/scr/


ดูรายชื่อไฟล์และ โฟลเดอร์ จะพบโฟลเดอร์ my_py_pkg และ my_cpp_pkg ซึ่งเป็น Package ที่ได้สร้างไว้ก่อนหน้านี้

ls


เข้าไปใน โฟลเดอร์ my_cpp_pkg

cd my_cpp_pkg/


เข้าไปใน โฟลเดอร์ src

cd src/


ดูรายชื่อไฟล์และ โฟลเดอร์ จะไม่พบ โฟลเดอร์หรือไฟล์ใดๆ

ls


สร้าง Node ภาษา C++ ชื่อ my_first_node.cpp

touch my_first_node.cpp


3 : ติดตั้ง Visual Studio Code


ติดตั้ง Visual Studio Code บน Ubuntu 20.04 และ ทดสอบ โปรแกรมแรก ภาษา C++ ตามขั้นตอนลิงค์ด้านล่าง


4 : เขียนโค้ดด้วย Visual Studio Code


เปิด Visual Studio Code


เปิดโฟลเดอร์ scr -> OK


คลิกเปิดไฟล์ my_first_node.cpp


เริ่มเขียนโค้ด

#include "rclcpp/rclcpp.hpp"

int main(int argc, char **argv)
{
return 0;
}


จะพบการแจ้งเตือน ว่าไม่พบไฟล์ rclcpp/rclcpp.hpp


ให้แก้ไขดังนี้

Edit Configurations : ที่คีย์บอร์ด กด Ctrl+Shift+P


ที่ช่องค้นหา ป้อน C/C แล้วเลือก C/C++: Edit Configurations (JSON)


จะเปิดไฟล์ c_cpp_properties.json


แก้ไข โดย เพิ่ม เครื่องหมาย comma หลังบรรทัดที่ 6 และ บรรทัดที่ 7 เพิ่มโค้ดตามด้านล่าง

"/opt/ros/foxy/include"



File -> Save แล้วปิดหน้าต่างไฟล์นี้ลงไป


เมื่อกลับไปที่ไฟล์ my_first_node.cpp จะไม่พบการแจ้งเตือนแล้ว


เขียนโค้ดเพิ่มดังนี้

#include "rclcpp/rclcpp.hpp"

int main(int argc, char **argv)
{
    rclcpp::init(argc, argv);
    auto node = std::make_shared<rclcpp::Node>("cpp_test");
    RCLCPP_INFO(node->get_logger(), "Hello Cpp Node");
    rclcpp::spin(node);
    rclcpp::shutdown();
    return 0;
}


5 : แก้ไขไฟล์ CMakeLists.txt


CMake คือการอ่านพิมพ์เขียวของโปรเจคจากไฟล์ CMakeLists.txt แล้วสร้าง build script แต่มันไม่ได้ทำการ build โปรแกรมด้วยตัวเอง การใช้ CMake ช่วยให้เรากำหนดซอฟต์แวร์ที่เราต้องการสร้างเพียงครั้งเดียว หลังจากนั้นเราสามารถพัฒนามันโดยใช้เครื่องมือที่เราชอบบนแพลตฟอร์มใดๆ ก็ได้ CMake จึงอำนวยช่วยความสะดวกให้กับโปรแกรมเมอร์ภาษา C++ ที่ต้องการสร้างซอฟต์แวร์ที่รันบนหลายๆ แพลตฟอร์มอย่างมาก

คลิกที่ไฟล์ CMakeLists.txt และคลิก install ตามคำแนะนำ ด้านล่าง ขวามือ



แสดงการติดตั้งสำเร็จ แล้วคลิกไอคอน Explorer ด้านซ้ายบน


กลับไปที่ไฟล์ CMakeLists.txt ค้นหา และลบส่วนนี้ออก เพื่อเขียนโค้ด บริเวณนี้


ที่ find_package(rclpy


แก้ไขเป็น rclcpp


เพิ่มโค้ดที่ บรรทัด 22 โค้ดดังนี้

add_executable(cpp_node src/my_first_node.cpp)
ament_target_dependencies(cpp_node rclcpp)

install(TARGETS
  cpp_node
  DESTINATION lib/${PROJECT_NAME}
)



File -> Save


6 : เรียกใช้งาน cpp_node


กลับไปที่ Terminator เขียนคำสั่ง cd กลับสู่ Home

cd


เข้าไปใน โฟลเดอร์ ros2_ws

cd ros2_ws/


Build แพ็คเกจ my_cpp_pkg

colcon build --packages-select my_cpp_pkg



เข้าไปในโฟลเดอร์ install/my_cpp_pkg/

cd install/my_cpp_pkg/


ลิสรายการ

ls



เข้าไปในโฟลเดอร์ lib

cd lib


เข้าไปโฟลเดอร์ my_pcc_pkg

cd my_cpp_pkg/


เรียกใช้งาน cpp_node จะแสดงผลลัพธ์ การทำงาน

./cpp_node

กด Ctrl + c เพื่อหยุดการทำงาน



7 : เรียกใช้งาน cpp_node โดยใช้ ROS2


ซึ่งการเรียกใช้งาน cpp_node แบบขั้นตอนที่ผ่านมา จะเห็นได้ว่ามีหลายขั้นตอน ที่ยุ่งยาก โดยการเรียกใช้งานด้วย ROS2 มีขั้นตอนดังนี้


ไปที่ Terminator หน้าต่างที่ 2


ใช้คำสั่ง

source .bashrc


เรียกใช้งานด้วยคำสั่ง ros2 run ชื่อPackag ชื่อNode จะแสดงผลลัพธ์ การทำงาน

ros2 run my_cpp_pkg cpp_node