【多喝热水系列】从零开始的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,学习节点之间的话题通信,敬请期待!如果今天的内容对你有帮助,别忘了点赞、收藏、关注,我们下期见!

相关推荐
听麟5 分钟前
HarmonyOS 6.0+ PC端虚拟仿真训练系统开发实战:3D引擎集成与交互联动落地
笔记·深度学习·3d·华为·交互·harmonyos
喵手9 分钟前
Python爬虫实战:针对Python官网,精准提取出每一个历史版本的版本号、发布日期以及对应的文档/详情页链接等信息,并最终清洗为标准化的CSV文件!
爬虫·python·爬虫实战·零基础python爬虫教学·python官方数据采集·采集历史版本版本号等信息·导出csv文件
一个人旅程~18 分钟前
我存在吗?你存在吗?
笔记·程序人生·电脑·ai写作
databook22 分钟前
像搭积木一样思考:数据科学中的“自下而上”之道
python·数据挖掘·数据分析
Mr_Xuhhh22 分钟前
介绍一下ref
开发语言·c++·算法
luoluoal23 分钟前
基于python的医疗问句中的实体识别算法的研究(源码+文档)
python·mysql·django·毕业设计·源码
xqqxqxxq23 分钟前
Java IO 核心:BufferedReader/BufferedWriter & PrintStream/PrintWriter 技术笔记
java·笔记·php
王老师青少年编程25 分钟前
2024年信奥赛C++提高组csp-s初赛真题及答案解析(完善程序第2题)
c++·题解·真题·初赛·信奥赛·csp-s·提高组
Trouvaille ~29 分钟前
【Linux】进程间关系与守护进程详解:从进程组到作业控制到守护进程实现
linux·c++·操作系统·守护进程·作业·会话·进程组
啊阿狸不会拉杆32 分钟前
《机器学习导论》第 9 章-决策树
人工智能·python·算法·决策树·机器学习·数据挖掘·剪枝