前言
最近在尝试实时处理一些传感器的数据,在启动传感器驱动之后,传感器数据会以ros话题的形式发布,如果要实时处理数据,那么就需要订阅相关数据话题,处理之后再发布出来。这就涉及到了linux系统下的代码编写,而一个ros项目,应该包含哪些模块,又该怎么构建一个标准的ros开发项目呢?本文将详细介绍。注意:做以下步骤时,请检查自己是否正确安装了ros,并进行相关环境的配置,本文使用的ros版本为ros1
一、ROS包生成及文件配置
一个ros开发项目通常包含一个或多个ROS包,"ROS包"(ROS Package)是机器人操作系统(Robot Operating System, ROS)中软件组织和分发的基本单元。你可以把它理解为编程中的"项目文件夹"或"模块"。在ROS生态系统中,所有的功能代码、库、配置文件和数据都是被组织成一个个独立的"包"来管理的。举个例子,如果我要构建一个自主导航系统,假设我把过程分为三部,第一步是处理传感器数据,第二步是目标检测与跟踪,第三步说自主导航与避障,那么我就可以每个模块写一个ROS包,通过数据话题的交互来实现不同模块之间的数据交流。
那么问题来了,怎么去构建一个ROS包,ROS包里面又包含哪些内容呢?
表1 ros包通常包含的内容
|----------------|-------------------------------------------------------------------------------------------------|
| package.xml | 清单文件 。这是包的"身份证",描述了包的名称、版本、作者、许可证,以及最重要的------依赖关系(即运行或编译这个包需要其他哪些包)。 |
| CMakeLists.txt | 构建规则文件(针对C++项目)。它告诉ROS的构建系统(catkin或colcon)如何编译包中的源代码,生成可执行文件或库。如果是纯Python包,可能不需要这个或使用简化的版本。 |
| src/ | 存放源代码(C++或Python)。 |
| include/ | 存放C++头文件 |
| launch/ | 存放启动文件,用于一次性启动多个节点。 |
| config/ | 存放配置文件(通常是YAML格式),用于设置参数 |
| msg/ | 分别存放自定义的消息类型 |

图1 项目包含内容示例
一个ROS包大致会有以上内容构成,,以ros1为例,我们构建一个ROS包可以执行以下命令:
bash
catkin_create_pkg <包名> [依赖项1] [依赖项2] ... [依赖项N]
当你在终端运行这行命令后,系统会执行以下逻辑操作:
(1)创建目录:在当前路径下创建一个名为 pointcloud_fusion 的文件夹。
(2)生成 package.xml:
① 设置 <name> 为 设置的包名。
② 自动将所有列出的依赖项填入 <build_depend> (编译依赖) 和 <exec_depend> (运行依赖) 标签中。
注意:catkin_create_pkg 默认会将所有列出的依赖同时视为编译和运行依赖。
(3)生成 CMakeLists.txt:
① 初始化一个基础的 CMake 文件。
② 自动添加 find_package(catkin REQUIRED COMPONENTS ...),并将你列出的所有依赖项填入其中。
③ 配置基本的编译选项(因为包含了 roscpp,它会准备 C++ 编译环境)。
**(4)创建空文件夹:**通常会预创建 src/, include/, config/ 等标准子目录(取决于具体的 ROS 版本和配置,有时需要手动创建 src)。
执行完命令之后,需要对CMakeLists.txt文件和package.xml文件做一定修改。
(1)CMakeLists.txt:添加add_executable() 和 target_link_libraries()来编译你的 C++ 代码。
add_executable:告诉编译器"把哪些源代码文件编译成一个可执行程序(比如.exe或Linux下的二进制文件)"。
target_link_libraries:告诉链接器"这个程序在运行时需要依赖哪些库(比如ROS 的核心库、PCL 库、OpenCV 库等)"。
如果没有它们,你的代码即使写好了,也无法被编译成可以运行的节点。
(2) package.xml:补充 <description>, <maintainer>, <license> 等信息(工具生成的只是模板)。
文件配置好了之后,就进入了相关的代码编写阶段。
二、代码编写与调试
ros的开发一般常用的语言就两种,C++和python,python是相对简单的一种,使用的代码编辑器通常为跨平台轻量化的vscode,支持多种语言的编写,在官网下载即可。
(1)python:我们通常会构建一个隔离的conda环境或者虚拟环境,在里面安装各种我们想要的包,,构建的环境可以被视为一个解释器,在vscode中,我们只要选择正确的解释器就可以运行代码以及调试代码,相对简单。
(2)C++:在使用C++进行代码编写的时候,如果引用了一些第三方库,在vscode里面就会对头文件进行大量的报错,比如
cpp
#include <ros/ros.h>
#include <sensor_msgs/PointCloud2.h>
一直报错肯定是会影响我们代码的编写的,所以我们需要进行一定的配置来解决这个问题。我推荐的方法是使用CMake Tools扩展,具体操作如下:
(1)第一步:安装CMake Tools扩展

(2)第二步:配置VSCode设置
在项目根目录创建 .vscode 文件夹,然后创建 settings.json

填充其内容为:
cpp
{
"cmake.configureOnOpen": true,
"cmake.buildDirectory": "${workspaceFolder}/build",
"cmake.generator": "Unix Makefiles",
"cmake.sourceDirectory": "${workspaceFolder}",
"cmake.parallelJobs": 4,
"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools",
"C_Cpp.errorSquiggles": "enabled",
"C_Cpp.intelliSenseEngine": "default",
"files.associations": {
"*.h": "cpp",
"*.hpp": "cpp",
"*.cpp": "cpp"
},
"cmake.environment": {
"CMAKE_PREFIX_PATH": "/opt/ros/noetic:${workspaceFolder}/devel",
"ROS_PACKAGE_PATH": "/opt/ros/noetic/share:${workspaceFolder}/src"
},
"terminal.integrated.env.linux": {
"CMAKE_PREFIX_PATH": "/opt/ros/noetic:${workspaceFolder}/devel",
"ROS_PACKAGE_PATH": "/opt/ros/noetic/share:${workspaceFolder}/src",
"LD_LIBRARY_PATH": "/opt/ros/noetic/lib"
}
}
(3)第三步:配置CMake Tools的Kits
CMake Tools需要知道使用哪个编译器。按 Ctrl+Shift+P 打开命令面板:
输入 "CMake: Select a Kit" 并选择
选择您的编译器(通常是 GCC 或 Clang)
(4)第四步:配置和编译
打开VSCode,打开 fusion_cloud 文件夹,CMake Tools会自动检测CMakeLists.txt,并提示配置项目,点击"是",或者手动配置:
按 Ctrl+Shift+P
输入 "CMake: Configure"
选择配置:
按 Ctrl+Shift+P
输入 "CMake: Set Build Target"
选择对应的文件名
编译项目:
按 Ctrl+Shift+P
输入 "CMake: Build"

完成这些步骤之后即可解决头文件报错的问题,进行正常的代码编写。
三、ROS工作空间的创建
(1)创建目录结构
bash
# 创建工作空间目录(名称可自定义,通常叫 catkin_ws)
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
(2)初始化工作空间
bash
# 进入 src 目录初始化
cd ~/catkin_ws/src
catkin_init_workspace
(3)编译工作空间
bash
cd ~/catkin_ws/
catkin_make
编译后会自动生成 build、devel 文件夹。
(4)添加已有包到工作空间
bash
cp -r /path/to/existing_package ~/catkin_ws/src/
注意将路径改成本地包的路径。添加包或者修改代码之后,都需要重新编译
bash
cd ~/catkin_ws
catkin_make
(5)启动ros项目
ros项目的启动一般使用launch文件,这个文件就相当于启动文件,基本结构如下:
XML
<?xml version="1.0"?>
<launch>
<!-- 节点定义 -->
<node name="node_name" pkg="package_name" type="executable" />
</launch>
编写launch文件之后执行以下两步,即可完成项目启动
bash
source ~/catkin_ws/devel/setup.bash
roslaunch my_package robot.launch
其中,my_package是包名,launch文件改为自己编写的launch文件。