C++ 第 29 课:回调函数 Callback
发布时间:2026/10/4 4:06:34 锦皓数字建站

上一课练习答案第 1 题auto f []() { std::cout Hi; };这里只是定义了 lambda。还没有执行。必须f();才执行。第 2 题int x 10; auto f [x]() { std::cout x; }; x 20; f();通常输出10因为[x]是按值捕获相当于保存了当时x 10的一份副本。第 3 题int x 10; auto f [x]() { x 50; }; f();最后x 50因为[x]是按引用捕获。第 4 题[this]() { speed 100; }[this]表示这个 lambda 可以访问当前对象的成员。所以speed 100;实际上是在操作当前对象自己的speed。第 5 题msg-data如果msg是智能指针就是通过msg找到它管理的消息对象然后访问这个消息对象里的data成员。第 29 课回调函数 Callback这一课是我们真正开始进入 ROS2 思维的关键课。先记一句回调函数 现在把函数交出去将来某件事情发生时由系统替你调用。它和普通函数最大的区别不是“函数长得不一样”而是谁负责调用它。1. 普通函数例如void hello() { std::cout Hello; }你必须主动hello();流程你的代码 ↓ 主动调用 hello() ↓ hello 执行2. 回调不是你主动调用假设我们有void onMessage(int data) { std::cout data; }普通情况下你可以onMessage(10);但是在回调模式里我们希望把onMessage告诉系统。然后系统说“好以后消息来了我帮你调用。”流程变成你把函数交给系统 ↓ 程序继续运行 ↓ 消息到达 ↓ 系统自动调用这个函数这就是 callback。3. 用生活例子理解你去餐厅排队。服务员说“留下电话号码有位置了我联系你。”你不是站在那里不停问有位置了吗 有位置了吗 有位置了吗而是把联系方式交出去 ↓ 等待 ↓ 条件满足 ↓ 别人主动找你回调就是这种思想。4. 为什么 ROS2 特别需要回调因为机器人程序大量事件不是你能预测准确时间的。例如相机图像什么时候到 JointState什么时候来 激光雷达什么时候更新 VLA Action什么时候生成 Service请求什么时候来你不能写if (现在消息来了)然后一直傻等。ROS2 更喜欢消息到达时自动执行你的函数。5. ROS2 subscriber 的核心逻辑比如订阅/joint_states可以理解成程序启动 ↓ 创建 subscriber ↓ 告诉 ROS2 “收到 JointState 后执行 callback” ↓ 继续等待 ↓ JointState 到达 ↓ ROS2 自动调用 callback(msg)这就是 subscriber 的灵魂。6. 为什么 lambda 很适合 callback例如auto callback [](int data) { std::cout data; };这个 lambda 本身就是一段可以被别人以后调用的功能。所以可以想象registerCallback(callback);意思把 callback 交给系统。以后系统内部可以callback(100);7. 一个最简单的模拟回调先不用 ROS2#include iostream void runCallback(void (*callback)(int)) { callback(100); }这里出现一个新的东西void (*callback)(int)它是函数指针先不要深入语法。你只需要理解runCallback()接收的不是普通数字而是“一个函数”。然后void printData(int data) { std::cout data std::endl; }调用runCallback(printData);执行过程把 printData 函数交给 runCallback ↓ runCallback 内部决定什么时候调用 ↓ callback(100) ↓ 实际上执行 printData(100)输出1008. 重点不是函数指针语法对你现在最重要的是理解函数也可以像“数据”一样交给另一个系统然后由对方在未来合适的时候调用。ROS2 正是大量使用这种模式。9. ROS2 风格以后你会看到类似[this](const Msg::SharedPtr msg) { current_angle msg-angle; }这个 lambda 就可以作为subscriber callback。意思ROS2 收到消息后执行这段代码。10. 放到 VLA 里未来你真正可能搭这样的链路VLA模型 ↓ 产生动作 ↓ 发布 ROS2 Action Topic ↓ 机器人控制节点订阅 ↓ Action 消息到达 ↓ callback 自动执行 ↓ 解析 msg ↓ 生成关节目标 ↓ 发送给仿真/真机所以你现在学习 callback不是在学一个孤立的 C 语法。它直接对应VLA 输出怎样进入 ROS2 机器人控制系统。本课先记住三个角色以后看到 ROS2 subscriber 时先找1. 谁在监听 subscriber 2. 监听什么 topic / message 3. 消息来了做什么 callback这是一个非常重要的 ROS2 阅读框架。本课小练习1普通函数hello();是谁主动调用2回调函数最大的特点是什么3如果一个 ROS2 subscriber 订阅/joint_states那么 callback 一般在什么时候执行4为什么 lambda 很适合用作 callback5VLA 发布了一个新的动作消息后控制节点的 subscriber callback 最可能负责做什么
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。