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