note02
節點
ROS2中每一個節點只負責一個單獨的模塊化功能
如:一個節點負責控制車輪轉動,一個節點負責從激光雷達獲取數據,一個節點負責定位
通信方式:
- 話題:topic
- 服務:services
- 動作:Action
- 參數:parameters
節點相關的CLI(command-Line Interface)
- 列出所有節點:
ros2 node list
- 查看節點的詳細信息:
ros2 node info <node_name>
- 列出所有Toic:
ros2 topic list
- 運行節點:
ros2 run <package_name> <executable_name>
工作空間
一個工作空間下有多個功能包,一個功能包可以有多個節點
ros2 run <功能包名字> <可執行文件>
工作空間:ROS2 工作空間是一個包含所有項目文件的目錄結構,用于組織和管理ROS2項目
創建c++功能包:
ros2 pkg create my_cpp_package --build-type ament_cmake --dependencies rclcpp std_msgs
--build-type
: 指定構建類型,ament_cmake
用于C++,ament_python
用于Python--dependencies
: 指定功能包的依賴項(如rclcpp
、rclpy
、std_msgs
等)
列出功能包可執行文件:
ros2 pkg executableseg:
ros2 pkg executables turtlesim
列出所有的包:
ros2 pkg list
編譯功能包:
cd ~/ros2_ws
colcon build --packages-select my_robot_package
手動編譯:
eg:
my_package/
├── CMakeLists.txt
├── package.xml
└── src/└── my_node.cpp
CMakeLists.txt
文件
cmake_minimum_required(VERSION 3.5)
project(my_package)find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)add_executable(my_node src/my_node.cpp)
ament_target_dependencies(my_node rclcpp std_msgs)install(TARGETSmy_nodeDESTINATION lib/${PROJECT_NAME})ament_package()
package.xml 文件
<package format="3"><name>my_package</name><version>0.0.0</version><description>A simple ROS2 package</description><maintainer email="user@todo.todo">user</maintainer><license>TODO</license><depend>rclcpp</depend><depend>std_msgs</depend>
</package>
my_node.cpp
文件
#include "rclcpp/rclcpp.hpp"int main(int argc, char *argv[]) {rclcpp::init(argc, argv);auto node = std::make_shared<rclcpp::Node>("my_node");RCLCPP_INFO(node->get_logger(), "Hello, ROS2!");rclcpp::spin(node);rclcpp::shutdown();return 0;
}
手動編譯命令
# 創建工作空間
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src# 添加功能包
cp -r /path/to/my_package .# 安裝依賴
sudo apt install ros-<ros2-distro>-rclcpp ros-<ros2-distro>-std-msgs# 配置環境
cd ~/ros2_ws
source /opt/ros/<ros2-distro>/setup.bash# 配置構建
mkdir -p build/my_package
cd build/my_package
cmake ../../src/my_package -DCMAKE_INSTALL_PREFIX=../../install/my_package# 編譯
make# 安裝
make install# 運行節點
source ../../install/my_package/setup.bash
ros2 run my_package my_node
colcon
是 ROS2 中用于構建和管理工作空間的工具,它自動化了許多編譯和安裝的步驟
域
域的概念來源于 ROS2 底層使用的 DDS(Data Distribution Service) 通信中間件
DDS中,不同邏輯網絡共享物理網絡的主義機制稱為Domain_ID
- 同一域上的ROS2節點可以自由地相互發現并發送消息,不同域則不能
- ROS2節點默認使用域ID為0
端口、進程和ROS2節點:
- DDS參與者
- 每個 ROS2 節點在啟動時,會創建一個 DDS 參與者
- 每個 DDS 參與者需要占用兩個端口(一個用于單播,一個用于多播)
- 端口分配:
- 隨著 ROS2 節點數量的增加,占用的端口數量也會增加
- 如果端口耗盡,新的節點將無法分配端口,導致通信失敗
- 進程與端口:
- 每個 ROS2 節點通常運行在一個獨立的進程中
- 每個進程(即每個節點)需要占用兩個端口