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 节点通常运行在一个独立的进程中
- 每个进程(即每个节点)需要占用两个端口