如何从零开始构建一个ros开发项目?

前言

最近在尝试实时处理一些传感器的数据,在启动传感器驱动之后,传感器数据会以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

编译后会自动生成 builddevel 文件夹。

(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文件。

相关推荐
艾莉丝努力练剑2 小时前
【Linux:文件 + 进程】理解IPC通信
linux·运维·服务器·开发语言·网络·c++·ide
开开心心就好2 小时前
安卓免费证件照制作软件,无广告弹窗
linux·运维·安全·pdf·迭代器模式·依赖倒置原则·1024程序员节
猿来如此呀2 小时前
Linux 常用命令选项与对应英文单词对照表
linux·运维·服务器
旺仔.2912 小时前
UDP 编程 详解
linux·网络·计算机网络·udp
晨非辰2 小时前
Linux终端输出哲学:从回车换行到进度条实战,掌握缓冲区刷新与ANSI控制,告别输出延迟焦虑
linux·运维·服务器·c++·人工智能·后端·自动化
杜子不疼.2 小时前
Linux 部署 RocketMQ 实操:从内网到公网,搞定远程消息服务
linux·运维·人工智能·rocketmq
!沧海@一粟!2 小时前
麒麟V10Sp3系统部署Zabbix7.0全攻略
linux·运维
YXWik62 小时前
Linux 环境 libreoffice 执行word转pdf 中文乱码问题
linux·pdf·word
bai_lan_ya2 小时前
嵌入式linux--文件IO中dup/dup2的使用
linux·运维·服务器