记录零基础ROS2学习和实践(二)(标准功能包中各个文件夹的理解)
ros功能包的各个文件
上一章说过,建立C++的功能包初始会有4个文件生成,分别是include、src、CMakeLists.txt、package.xml。除了这些还会介绍其他如像launch和scripts文件在功能包的作用。(%E6%A0%87%E5%87%86%E5%8A%9F%E8%83%BD%E5%8C%85%E4%B8%AD%E5%90%84%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%B9%E7%9A%84%E7%90%86%E8%A7%A3)/0.png)
(因为我做的项目是用C++建立的包,所有主要介绍C++功能包的内容,当然C++功能包也是可以写Python代码来实现功能,后面或者下一章会提及)
src
在功能包下的src文件中存放的是各种c++代码文件,都是实现一些具体功能,当然因为我们的小车和雷达买回来有给相关的ROS2的功能包,这些包下已经有写了相关功能的代码文件,我们需要做的是尽可能理解每个C++文件是做什么,再根据你的需求看看需不需写自己的c++代码文件来实现其他额外的功能。比如我下面有写forward_move_node.cpp等,是想让小车先动起来的C++代码。
(%E6%A0%87%E5%87%86%E5%8A%9F%E8%83%BD%E5%8C%85%E4%B8%AD%E5%90%84%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%B9%E7%9A%84%E7%90%86%E8%A7%A3)/1.png)
launch
launch文件夹是要自己通过创建新文件夹命名为launch,也是我觉得非常重要的一个文件夹,里面存放的是launch的启动文件,在ros1的后缀好像是.launch,在ros2就是python的.py文件了。一般我看一个功能包,都是先看launch文件先看看它会启动哪些节点哪些包,这样就知道它会串联哪些功能包来实现的一个功能。
这些launch.py文件说白了就是用来启动各个功能包的src中C++代码和scripts中python脚本写的功能,具体到启动了哪些节点,由与哪些节点进行通信
(%E6%A0%87%E5%87%86%E5%8A%9F%E8%83%BD%E5%8C%85%E4%B8%AD%E5%90%84%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%B9%E7%9A%84%E7%90%86%E8%A7%A3)/2.png)
package.xml
这个文件我对它主要的理解是,对该功能包所需要的依赖进行声明,build_depend:编译软件包时所需的依赖、exec_depend:软件包运行时需要的依赖、test_depend:测试软件包时会用到的依赖。如果缺少依赖,colcon build的编译过程就会出现报错,到时候根据报错对所需要的依赖进行补充就行。
(%E6%A0%87%E5%87%86%E5%8A%9F%E8%83%BD%E5%8C%85%E4%B8%AD%E5%90%84%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%B9%E7%9A%84%E7%90%86%E8%A7%A3)/3.png)
include
include文件夹里面存放的是头文件,这些头文件不是自动生成的,而是由开发者手动编写和维护的。可以声明类、函数、宏、结构体等,供其他源文件(.cpp)引用和实现。其他功能包可通过find_package()和target_link_libraries()引用这些头文件。
(%E6%A0%87%E5%87%86%E5%8A%9F%E8%83%BD%E5%8C%85%E4%B8%AD%E5%90%84%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%B9%E7%9A%84%E7%90%86%E8%A7%A3)/4.png)
scripts
scripts文件夹也是一个需要自己新创建文件夹命名为scripts,这个文件夹在我的理解是跟src文件夹很像,不过这个文件夹存放的是python语言编写的脚本文件,都是可以编写一些功能,但我用的很少,一般进行关于各个已经写好的节点的测试与调试。有放在 scripts/ 下的 Python 文件都可以直接作为可执行节点运行(前提是有可执行权限)
CMakeLists.txt
在ROS2中,CMakeLists.txt是软件包的核心构建配置文件,用于指导colcon构建工具如何编译代码、链接依赖以及安装文件。
我说明一下这个文件对于已有现成的功能包进行调用的场景下所要注意的地方。对于已有现成功能包进行调用无非就是对这些功能包进行测试和各个功能的结合。
在我们需要额外在src下编写c++功能文件时,比如上图我额外编写forward_move_node.cpp文件,这是一个可执行的文件,(%E6%A0%87%E5%87%86%E5%8A%9F%E8%83%BD%E5%8C%85%E4%B8%AD%E5%90%84%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%B9%E7%9A%84%E7%90%86%E8%A7%A3)/5.png)
编写好之后,需要在CMakeLists.txt进行一个声明操作,通过add_executable(forward_move_node src/forward_move_node.cpp)、ament_target_dependencies(forward_move_node rclcpp geometry_msgs)
这两行代码添加至CMakeLists.txt,
表明这个src/forward_move_node.cpp代码会生成forward_move_node这个可执行文件。再把forward_move_node安装可执行文件到对应目录中。(%E6%A0%87%E5%87%86%E5%8A%9F%E8%83%BD%E5%8C%85%E4%B8%AD%E5%90%84%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%B9%E7%9A%84%E7%90%86%E8%A7%A3)/6.png)
这样算是把在src写的一个功能完全融入ros2的功能包中,别忘了编写完要重新进行colcon build编译。
另外scripts文件夹下的python脚本文件也是类似的操作(%E6%A0%87%E5%87%86%E5%8A%9F%E8%83%BD%E5%8C%85%E4%B8%AD%E5%90%84%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%B9%E7%9A%84%E7%90%86%E8%A7%A3)/7.png)
models
这个文件夹用于放置训练好的大模型结果,例如本项目视觉模块采用yolov11技术,我们将训练集跑完的结果,作为二进制文件输出,命名为best.pt放在这个文件夹下由scripts中的脚本调用(%E6%A0%87%E5%87%86%E5%8A%9F%E8%83%BD%E5%8C%85%E4%B8%AD%E5%90%84%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%B9%E7%9A%84%E7%90%86%E8%A7%A3)/8.png)
后续如果要做轻量化部署,首先要把模型文件变小
这些就是我自己对ros功能包下各个文件的一些理解,下一章会将一下我是怎么调用雷达进行地图建模和自动定点巡航


