【多喝热水系列】从零开始的ROS2之旅——Day5 再遇ROS2功能包:Python和C++功能包编写

【多喝热水系列】从零开始的ROS2之旅——Day5 再遇ROS2功能包:Python和C++功能包编写

【多喝热水系列】从零开始的ROS2之旅——Day5

大家好,这里是【多喝热水系列】从零开始的ROS2之旅第五天!经过前几天的铺垫,我们已经对ROS2的核心概念和基础环境有了一定了解,今天的重点是实战操作——分别完成Python和C++功能包的创建与编译,再把这些功能包整合到工作空间中处理依赖关系,最后还会分享一个Ubuntu系统卡登录界面的踩坑解决方案。话不多说,直接上干货!

一、Python功能包创建和编译

ROS2中功能包是代码组织的基本单位,不同编程语言的功能包创建和编译流程略有差异,先从相对简洁的Python功能包开始。

1.1 创建Python功能包

#建立一个Python语言的功能包 ros2 pkg create demo_python_pkg --build-type ament_python --license Apache-2.0 

结果如下图所示:

1.2 简单编写测试节点

为了验证功能包可用,我们在demo_python_pkg/demo_python_pkg目录下创建一个简单的节点文件python_node.py,实现基础的日志输出:

#demo_python_pkg/demo_python_pkg/python_node.py的节点内容import rclpy from rclpy.node import Node defmain(): rclpy.init() node = Node("python_node") node.get_logger().info("Hello from Python node!") rclpy.spin(node) node.destroy_node() rclpy.shutdown()

1.3 给当前packages.xml添加依赖

#packages.xml添加依赖<depend>rclpy</depend>

1.4 配置setup.py

#setup.py添加的内容 entry_points={'console_scripts':['python_node = demo_python_pkg.python_node:main',#当前面的python_node是你运行时的命令,就相当于执行demo_python_pkg目录下python_node文件中的main函数],},

1.5 编译Python功能包

colcon build 

若编译无报错,会在工作空间根目录生成build、install、log三个文件夹,其中install目录下存放编译后的可执行文件。

1.6 验证功能包

source install/setup.bash echo$AMENT_PREFIX_PATH ros2 run demo_python_pkg python_node 

运行结果:

在这里插入图片描述

1.7 出现的问题及解决方案:

在这里插入图片描述

解决方法:
看看你文件是否Ctrl+s保存,如果未保存会出现编译无可执行文件的问题。
建议把Vscode里面自动保存开启。

操作后文件列表如下所示:

在这里插入图片描述

二、C++功能包

C++功能包的构建类型为ament_cmake,相比Python包多了CMakeLists.txt配置步骤,下面详细说明。

2.1 创建C++功能包

#建立一个C++语言的功能包![请添加图片描述](https://i-blog.ZEEKLOGimg.cn/direct/3cace60e198c422a9bf4e2d0d5267b00.png) ros2 pkg create demo_cpp_pkg --build-type ament_cmake --license Apache-2.0 

结果如图所示:

在这里插入图片描述

2.2 编写测试节点

//demo_cpp_pkg/src/cpp_node.cpp的节点内容#include"rclcpp/rclcpp.hpp"#include<iostream>usingnamespace std;intmain(int argc,char**argv){ rclcpp::init(argc, argv);auto node =make_shared<rclcpp::Node>("cpp_node");RCLCPP_INFO(rclcpp::get_logger("cpp_node"),"Hello from C++ node!"); rclcpp::spin(node); rclcpp::shutdown();return0;}

2.3 配置CMakeLists.txt(核心步骤)

#CMakeLists.txt文件添加的内容 find_package(rclcpp REQUIRED)#1.查找可执行文件的头文件和库文件 add_executable(cpp_node src/cpp_node.cpp)#2.添加可执行文件 cpp_node ament_target_dependencies(cpp_node rclcpp)#3.为可执行文件添加依赖项 rclcpp‘ install(TARGETS cpp_node DESTINATION lib/${PROJECT_NAME})#4.将编译好的可执行文件复制到安装目录 lib/demo_cpp_pkg 下

2.4 packages.xml添加依赖

#packages.xml添加依赖<depend>rclcpp</depend>

2.5 编译C++功能包

colcon build 

2.6 验证功能包

source install/setup.bash ros2 run demo_cpp_pkg cpp_node 

运行结果:

在这里插入图片描述

操作后文件列表如下所示:

在这里插入图片描述

三、多功能包的最佳实践Workspace

实际开发中,可能会遇到需要将已创建的功能包移入指定工作空间。

3.1 功能包移入workspace

mkdir-p chapt2_ws/src 
请添加图片描述


编译结果如下:

请添加图片描述


3.2 处理demo_python_pkg对demo_cpp_pkg的依赖
处理功能包之间依赖的情况。这里我们模拟“demo_python_pkg依赖demo_cpp_pkg”的场景,说明完整的处理流程。

3.2.1 配置demo_python_pkg的package.xml

#demo_python_pkg的packages.xml添加依赖<depend>demo_cpp_pkg</depend>

编译结果如下:

请添加图片描述

运行时遇到的问题: Ubuntu熄屏卡登入界面方法

首先Ctrl+alt+f3进入命令界面,
然后把自己的用户名和密码输入之后,
再Ctrl+alt+f2把密码再输入一遍,
即可解决此问题。

四、总结
今天的ROS2实战之旅收获满满,我们不仅掌握了Python和C++功能包的创建、编译流程,还学会了处理功能包之间的依赖关系,同时解决了Ubuntu卡登录界面的小问题。功能包是ROS2开发的基础,后续的节点通信、服务客户端等功能都需要基于功能包展开,建议大家多动手实操,熟悉每个步骤的细节。

下一期我们将继续深入ROS2,学习节点之间的话题通信,敬请期待!如果今天的内容对你有帮助,别忘了点赞、收藏、关注,我们下期见!

Read more

OpenClaw接入模型并基于WebUI完成智能操作

OpenClaw接入自定义模型并基于WebUI完成智能操作 背景介绍 OpenClaw(原 Clawdbot)是一个开源的 AI 代理框架,支持通过配置文件或 GUI 界面进行灵活配置。安装 OpenClaw 后,用户可以通过修改工作目录下的配置文件 openclaw.json 来接入不同的 LLM 模型提供商。 OpenClaw 支持众多主流模型提供商,包括 OpenAI、Anthropic、Moonshot AI(Kimi)、OpenRouter、Vercel AI Gateway、Amazon Bedrock 等。完整的提供商目录可参考官方文档 模型提供商快速入门。 要使用自定义的提供商,需要通过 models.providers 配置进行设置。这种方式允许用户接入官方支持列表之外的其他兼容 OpenAI API 或 Anthropic 格式的模型服务。 接入配置说明 核心配置参数解析

By Ne0inhk
【算法详解】理解KMP,真的那么难吗?—— 一篇讲透它的核心思想

【算法详解】理解KMP,真的那么难吗?—— 一篇讲透它的核心思想

🫧 励志不掉头发的内向程序员:个人主页  ✨️ 个人专栏: 《C++语言》《Linux学习》 🌅偶尔悲伤,偶尔被幸福所完善 👓️博主简介: 文章目录 * 前言 * 一、相关概念 * 二、前缀函数 * 三、计算前缀函数 * 四、用前缀函数解决字符串匹配 * 五、kmp 算法模板 * 六、next 数组版本 * 七、周期和循环节 * 总结 前言 本文用尽量详细的语言来讲解说明 kmp 算法内容,学习之前需要知道一点点动态规划的基础,如果不知道最好去了解了解。我们一起来看看算法吧。 一、相关概念 在学习 kmp 算法之前,我们得先提前了解最基本的 “ 动态规划 ” 的知识,否则可能学习的时候会有一些困难,因为它的原理类似于动态规划。 字符串: * 用字符构成的的序列就是字符串。 这个概念很简单,但是我们这里有个小技巧:就和动态规划那样,

By Ne0inhk

Chromium WebRTC 在 AI 辅助开发中的实战优化与避坑指南

最近在做一个AI辅助的实时协作项目,用到了Chromium的WebRTC模块来处理音视频通信。项目上线初期,当AI推理任务(比如实时背景虚化、手势识别)和WebRTC的编解码、传输同时进行时,延迟抖动非常明显,GPU也经常被“打满”,用户体验很糟糕。这促使我深入研究了WebRTC的底层,并尝试用AI的思路去优化它,最终将端到端延迟降低了近30%。这里把整个实战优化过程和踩过的坑记录下来,希望能给遇到类似问题的朋友一些参考。 1. 背景痛点:当WebRTC遇上AI推理 在传统的视频会议场景中,WebRTC的自适应码率(GCC算法)和抗丢包(NACK、FEC)机制已经相当成熟。然而,在AI辅助开发场景下,比如实时虚拟背景、语音降噪、内容审核等,情况变得复杂很多: * 实时性要求更高:AI处理本身需要时间(推理延迟),这直接叠加在了视频采集、编码、传输、解码、渲染的链路上。用户能明显感觉到“说话”和“画面/效果响应”之间的迟滞。 * GPU资源竞争白热化:WebRTC的视频编码(特别是硬件编码)

By Ne0inhk

Qwen3-32B+Clawdbot惊艳效果展示:多轮上下文Web对话实测作品集

Qwen3-32B+Clawdbot惊艳效果展示:多轮上下文Web对话实测作品集 1. 这不是普通聊天,是真正“记得住话”的AI对话体验 你有没有试过和一个AI聊着聊着,它突然忘了你三句话前说的关键信息?或者刚让你提供产品参数,转头就问“你刚才说的产品是什么”?这种断裂感,让很多所谓“智能对话”停留在“高级复读机”阶段。 而这次实测的 Qwen3-32B + Clawdbot 组合,彻底打破了这个瓶颈。它不是在模拟理解,而是真正在维持、推理、调用长达20轮以上的上下文记忆——而且是在纯Web界面里,不装插件、不配环境、打开浏览器就能用。 我们没做任何提示词工程优化,没加特殊system message,也没调温度或top-p参数。就是像你平时和同事聊天一样:发问、补充、纠正、追问、切换话题……它全都接得住,还接得稳。 下面这12个真实对话案例,全部来自同一套部署环境下的连续实测记录,未经剪辑、未重试、未人工干预。你可以把它看作一份“

By Ne0inhk