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

【多喝热水系列】从零开始的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,实现基础的日志输出:

python 复制代码
#demo_python_pkg/demo_python_pkg/python_node.py的节点内容
import rclpy 
from rclpy.node import Node

def main():
    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添加依赖

bash 复制代码
#packages.xml添加依赖
  <depend>rclpy</depend>

1.4 配置setup.py

python 复制代码
#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功能包

bash 复制代码
colcon build

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

1.6 验证功能包

bash 复制代码
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.csdnimg.cn/direct/3cace60e198c422a9bf4e2d0d5267b00.png)

ros2 pkg create demo_cpp_pkg --build-type ament_cmake --license Apache-2.0

结果如图所示:

2.2 编写测试节点

cpp 复制代码
//demo_cpp_pkg/src/cpp_node.cpp的节点内容

#include "rclcpp/rclcpp.hpp"
#include <iostream>
using namespace std;

int main(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();
    return 0;
}

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

bash 复制代码
#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添加依赖

bash 复制代码
#packages.xml添加依赖

  <depend>rclcpp</depend>

2.5 编译C++功能包

bash 复制代码
colcon build

2.6 验证功能包

bash 复制代码
source install/setup.bash

ros2 run demo_cpp_pkg cpp_node

运行结果:

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

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

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

3.1 功能包移入workspace

bash 复制代码
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

bash 复制代码
#demo_python_pkg的packages.xml添加依赖

  <depend>demo_cpp_pkg</depend>

编译结果如下:

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

首先Ctrl+alt+f3进入命令界面,

然后把自己的用户名和密码输入之后,

再Ctrl+alt+f2把密码再输入一遍,

即可解决此问题。

四、总结

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

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

相关推荐
郑泰科技1 天前
fmm(快速地图匹配)实践:Boost header not found解决方案
c++·windows·交通物流
维C泡泡1 天前
STL(初识string)
开发语言·c++
叫我:松哥1 天前
基于Spark智能推荐算法的农业作物推荐系统,推荐算法使用Spark ML风格推荐引擎
大数据·python·机器学习·spark-ml·spark·flask·推荐算法
2501_941875281 天前
从日志语义到可观测性的互联网工程表达升级与多语言实践分享随笔
java·前端·python
郝学胜-神的一滴1 天前
Linux线程使用注意事项:骈文技术指南
linux·服务器·开发语言·数据结构·c++·程序人生
叫我:松哥1 天前
基于 Flask 的音乐推荐与可视化分析系统,包含用户、创作者、管理员三种角色,集成 ECharts 进行数据可视化,采用混合推荐算法
开发语言·python·信息可视化·flask·echarts·pandas·推荐算法
WarPigs1 天前
数据库笔记
数据库·笔记
此剑之势丶愈斩愈烈1 天前
mybatis-plus乐观锁
开发语言·python·mybatis
vibag1 天前
LangGraph全家桶使用
python·语言模型·langchain·大模型·langgraph