2025年9月7日 星期日

ROS2 建立 workapace , package node , build 範例說明

 下面給你「一步到位」的順序+可直接複製的範例(含 Python/C++ 兩種做法)。

範例使用工作區名:~/ros2_ws_demo,套件名:my_pkg.

1) 建立 Workspace

# 建立目錄結構 mkdir -p ~/ros2_ws_demo/src cd ~/ros2_ws_demo # 只載入系統 ROS 2 source /opt/ros/humble/setup.bash

2A) 建立 Python 套件 (rclpy)

cd ~/ros2_ws_demo/src ros2 pkg create my_pkg --build-type ament_python --dependencies rclpy std_msgs

最小節點(my_pkg/my_pkg/talker.py):

#!/usr/bin/env python3 import rclpy from rclpy.node import Node from std_msgs.msg import String class Talker(Node): def __init__(self): super().__init__('talker') self.pub = self.create_publisher(String, 'chatter', 10) self.create_timer(0.5, self.tick) def tick(self): msg = String(); msg.data = 'hello ros2' self.pub.publish(msg) def main(): rclpy.init(); rclpy.spin(Talker()); rclpy.shutdown() if __name__ == '__main__': main()

setup.pyentry_points 增加(已自帶,補一行即可):

'console_scripts': [ 'talker = my_pkg.talker:main', ],

2B) 建立 C++ 套件 (rclcpp)

cd ~/ros2_ws_demo/src ros2 pkg create my_pkg_cpp --build-type ament_cmake --dependencies rclcpp std_msgs

最小節點(my_pkg_cpp/src/talker.cpp):

#include "rclcpp/rclcpp.hpp" #include "std_msgs/msg/string.hpp" using std::placeholders::_1; int main(int argc, char** argv){ rclcpp::init(argc, argv); auto node = rclcpp::Node::make_shared("talker_cpp"); auto pub = node->create_publisher<std_msgs::msg::String>("chatter", 10); rclcpp::WallTimer<std::chrono::milliseconds> *timer; timer = new rclcpp::WallTimer<std::chrono::milliseconds>( std::chrono::milliseconds(500), [pub](){ auto msg = std_msgs::msg::String(); msg.data = "hello ros2"; pub->publish(msg); }); node->create_wall_timer(std::chrono::milliseconds(500), [pub](){ auto msg = std_msgs::msg::String(); msg.data = "hello ros2"; pub->publish(msg); }); rclcpp::spin(node); rclcpp::shutdown(); return 0; }

my_pkg_cpp/CMakeLists.txt 增加可執行檔與安裝:

add_executable(talker src/talker.cpp) ament_target_dependencies(talker rclcpp std_msgs) install(TARGETS talker DESTINATION lib/${PROJECT_NAME})

3)(可選)建立 Launch

~/ros2_ws_demo/src/my_pkg/launch/demo.launch.py

from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node(package='my_pkg', executable='talker', name='talker_py'), # Node(package='my_pkg_cpp', executable='talker', name='talker_cpp'), # 若用 C++ ])

4) 建置

cd ~/ros2_ws_demo colcon build --symlink-install

5) 載入環境

source install/setup.bash

6) 執行與檢查

# 直接跑節點 ros2 run my_pkg talker # Python # ros2 run my_pkg_cpp talker # C++ # 或用 launch ros2 launch my_pkg demo.launch.py # 檢查 ros2 node list ros2 topic echo /chatter

小提示

  • 每次更動程式後:colcon buildsource install/setup.bash

  • 若有多個 workspace,確保最後 source 的是你要用的那個。

  • 新增相依套件:rosdep install -i --from-paths src -y



沒有留言:

張貼留言