节点(Nodes)
在 ROS 2 中,节点( Node),是 ROS 2 中真正运行的程序单元。
比如机器人系统中可以有很多节点:
摄像头节点 负责读取摄像头图像
激光雷达节点 负责读取雷达数据
键盘控制节点 负责接收键盘输入
电机驱动节点 负责控制电机
导航节点 负责路径规划
语音识别节点 负责识别语音
ROS 2 节点之间常见通信方式有三种:
| 通信方式 | 说明 |
|---|---|
| Topic 话题 | 发布/订阅,适合连续数据 |
| Service 服务 | 请求/响应,适合一次性任务 |
| Action 动作 | 长时间任务,可反馈、可取消 |
一、Python 节点流程
1. 创建工作空间
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
2. 创建 Python 包
ros2 pkg create demo_py --build-type ament_python --dependencies rclpy
3. 创建节点文件
进入包中的 Python 模块目录:
cd ~/ros2_ws/src/demo_py/demo_py
touch my_node.py
编辑 my_node.py:
import rclpy
from rclpy.node import Node
class MyNode(Node):
def __init__(self):
super().__init__('my_node')
self.get_logger().info('Python 节点启动成功')
def main():
rclpy.init()
node = MyNode()
rclpy.spin(node)
rclpy.shutdown()
if __name__ == '__main__':
main()
4.修改 setup.py
打开:
~/ros2_ws/src/demo_py/setup.py
找到:
entry_points={
'console_scripts': [
],
},
改成:
entry_points={
'console_scripts': [
'my_node = demo_py.my_node:main',
],
},
含义:
my_node
是 ros2 run 使用的可执行名。
5. 编译
回到工作空间根目录:
cd ~/ros2_ws
colcon build
建议调试时使用:
colcon build --symlink-install #--symlink-install表示安装时尽量使用符号链接,而不是直接复制文件。
6. 加载环境
source install/setup.bash
7. 运行节点
ros2 run demo_py my_node
看到类似输出:
[INFO] [my_node]: Python 节点启动成功
8. 查看节点
新开一个终端,先加载环境:
source ~/ros2_ws/install/setup.bash
查看节点:
ros2 node list
输出:
/my_node
查看节点信息:
ros2 node info /my_node
二、C++ 节点流程
1. 创建工作空间
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
2. 创建 C++ 包
ros2 pkg create demo_cpp --build-type ament_cmake --dependencies rclcpp
3. 创建节点文件
cd ~/ros2_ws/src/demo_cpp/src
touch my_node.cpp
编辑 my_node.cpp:
#include "rclcpp/rclcpp.hpp"
class MyNode : public rclcpp::Node
{
public:
MyNode() : Node("my_node")
{
RCLCPP_INFO(this->get_logger(), "C++ 节点启动成功");
}
};
int main(int argc, char ** argv)
{
rclcpp::init(argc, argv);
auto node = std::make_shared<MyNode>();
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}
4. 修改 CMakeLists.txt
打开:
~/ros2_ws/src/demo_cpp/CMakeLists.txt
添加:
add_executable(my_node src/my_node.cpp)
ament_target_dependencies(my_node rclcpp)
install(TARGETS
my_node
DESTINATION lib/${PROJECT_NAME}
)
一般放在:
find_package(rclcpp REQUIRED)
后面,ament_package() 前面。
5. 编译
cd ~/ros2_ws
colcon build
或只编译这个包:
colcon build --packages-select demo_cpp
6. 加载环境
source install/setup.bash
7. 运行节点
ros2 run demo_cpp my_node
看到:
[INFO] [my_node]: C++ 节点启动成功
8. 查看节点
新开一个终端:
source ~/ros2_ws/install/setup.bash
ros2 node list
输出:
/my_node
最简记忆版
Python 节点
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
ros2 pkg create demo_py --build-type ament_python --dependencies rclpy
cd demo_py/demo_py
touch my_node.py
写节点代码后,修改:
setup.py
添加:
'my_node = demo_py.my_node:main',
然后:
cd ~/ros2_ws
colcon build --symlink-install
source install/setup.bash
ros2 run demo_py my_node
C++ 节点
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
ros2 pkg create demo_cpp --build-type ament_cmake --dependencies rclcpp
cd demo_cpp/src
touch my_node.cpp
写节点代码后,修改:
CMakeLists.txt
添加:
add_executable(my_node src/my_node.cpp)
ament_target_dependencies(my_node rclcpp)
install(TARGETS
my_node
DESTINATION lib/${PROJECT_NAME}
)
然后:
cd ~/ros2_ws
colcon build
source install/setup.bash
ros2 run demo_cpp my_node
| 查看节点列表 | ros2 node list |
|---|---|
| 查看节点详情 | ros2 node info /节点名 |
| 运行时改节点名 | --ros-args -r __node:=新名字 |
| 加命名空间 | --ros-args -r __ns:=/命名空间 |
| 查看帮助 | ros2 node --help |