C4-Ros2从零开始学习——开始你的第一个节点C++和python
用大白话讲 ROS2 节点
先打个比方:
一台机器人就像一家小工厂。
节点 = 工厂里一个专门干活的工人
1. 什么是节点?
每个工人只干一类活:
工人 A:负责读取摄像头
工人 B:负责识别画面里的物体
工人 C:负责控制轮子移动
工人 D:读取激光雷达
这里的 A、B、C、D,每一个就是节点。
2. 为什么不只用一个工人包揽全部工作?
如果全部事情交给同一个人:
一旦他出错 “罢工”,整个工厂直接停摆。
分开成多个工人好处:
某个工人崩了,其他人照常干活
想换识别算法,只换掉 “识别工人” 就行,不用动摄像头、底盘代码
谁出问题,能精准找到是谁的锅
3. 工人(节点)之间怎么交流?
工人不能直接跑到对面耳边说话。
大家共用一套公告栏(ROS2 通信系统,底层 DDS)。
摄像头工人不停往公告栏贴照片(发布话题)
识别工人一直盯着公告栏,看到照片就拿来看(订阅话题)
他们互相不需要知道对方叫什么,只看公告栏内容。
4. 几个小白必懂重点
运行起来的程序,才叫节点;代码源码本身不叫节点
同一个名字不能同时有两个工人(同名节点冲突)
节点之间不靠函数直接调用,全都走公告栏交换信息
一个程序文件,可以实现 1 个或者多个节点(但规范建议一个节点只干一件事)
5. 对应命令通俗理解
bash
ros2 node list
翻译成大白话:列出现在所有正在上班的工人
bash
ros2 node info /摄像头工人
看看这个工人:他会往公告栏发什么消息、会读取哪些消息
极简总结
节点 = 机器人软件里独立干活的小程序,各司其职,通过公共通道互相传数据。
一.python实现节点运行
1.先来一个简单的节点和节点查询
安装好扩展
先创建一个文件夹chapt2/ 然后在这个目录下创建ros2_python_node.py文件
import rclpy
from rclpy.node import Node
def main():
rclpy.init()
node = Node("python_node")
rclpy.shutdown()
if __name__=="__main__":
main()
bash进行下面指令启动和查询两个终端内同时进行
python3 ros2_python_node.py
ros2 node list
2.我们来创建有输出的节点信息
import rclpy
from rclpy.node import Node
def main():
rclpy.init()
node = Node("python_node")
node.get_logger().info("你好python节点")
rclpy.spin(node)
rclpy.shutdown()
if __name__=="__main__":
main()
bash打开一个终端
python3 ros2_python_node.py
来吧输出更详细的信息
export RCUTILS_CONSOLE_OUTPUT_FORMAT="[{function_name}]:{line_number}:{message}"
python3 ./chapt/ros2_python_node.py
二.C++实现节点运行
安装扩展
在这个目录下创建ros2_cpp_node.py文件
#include "rclcpp/rclcpp.hpp"
int main(int argc, char **argv)
{
rclcpp::init(argc, argv);
auto node = std::make_shared<rclcpp::Node>("cpp_node");
RCLCPP_INFO(node->get_logger(), "你好 C++ 节点!");
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}
修正包含目录、库错误

加入以下内容
/opt/ros/$ {ROS_DISTRO}/include/**
新建CMakeLists.txt
cmake_minimum_required(VERSION 3.8)
project(ros2_cpp)
add_executable(ros2_cpp_node ros2_python_node.cpp)
find_package(rclcpp REQUIRED)
target_include_directories(ros2_cpp_node PUBLIC ${rclcpp_INCLUDE_DIRS})
target_link_libraries(ros2_cpp_node ${rclcpp_LIBRARIES})
进入目录chapt2/下
cmake .
make
./ros2_cpp_node
打开新终端
ros2 node list
ros2 node info /cpp_node
更多推荐



所有评论(0)