ROS2(Humble)的文件系统架构

本文依托Ubuntu22.04+ROS2(Humble)

1.文件系统

ROS的文件系统描述了程序和文件在计算机硬盘上是如何存储、组织和管理的,要包括:功能包集功能包包清单消息类型服务类型代码等。

1.1 功能包集(MetaPackage)

又称ROS元包,是将某些具有特定作用的功能包组合在一起而形成的。如移动机器人的导航功能包集 Navigation,由构图包Gmapping、定位包 AMCL 等功能包组合而成。

1.2 功能包(Package)

又称程序包,是ROS软件的独立单元。所有的源代码文件、数据文件、生成文件、依赖包和其他文件都放在程序包中。

1.3 包清单(Package Manifest)

是ROS功能包里的 package.xml 文件,记录了功能包所需的所有基本信息,包括功能包的名称、描述、作者、依赖关系、许可信息等,通过 package.xml 文件能够对功能包进行管理。

1.4 消息类型(Message Type)

ROS通过消息进行信息的传递,以扩展名 .msg 文件存储。用户自定义的消息类型文件通常都被定义、编译、保存在对应功能包中的 msgs 文件夹下。

1.5 服务类型(Service Type)

ROS中有许多内建的标准服务类型,可供用户直接使用,也可以创建用户自定义的服务类型,并以扩展名 .srv 文件存储用户自定义的服务类型文件通常都被定义、编译、保存在对应功能包中的 src 文件夹下。

1.6 代码(Code)

功能包中的元代码,例如采用 C++ 语言编写的 .cpp 文件,保存在对应功能包中的 src 文件夹下。采用 Python 语言编写的 .Py 文件保存在对应功能包中的 script 文件夹下。

2. 工作空间(ROS1与ROS2的区别)

2.1 ROS1 工作空间的文件结构

在 ROS1 中,工作空间(WorkSpace)就是一个保存与工程开发相关文件的文件夹,又称为Catkin 工作空间

注意用户可以创建多个工作空间,但是任何时刻都只能在一个工作空间中工作,即任何时刻只能看到当前工作空间中的代码。

一个典型的Catkin工作空间的文件存储结构如下图所示:

2.2 ROS2 工作空间的文件结构

(1)src 文件夹(Source Space,代码空间):主要用来保存功能包(Package)的源代码文件,是开发过程中最常用的文件夹。src 文件夹下可能包含多个功能包,如上中的 package1、package2...。但是 src 文件夹下的功能包不可以重名

(2)build 文件夹(BuildSpace,编译空间):主要用来保存编译过程中产生的缓存信息和中间文件,该文件夹在编译工作空间后才会自动生成。

(3)install 文件夹(Imnstal Space,安装空间):有些编译选项中会包括该文件夹。编译成功后,使用 make install 命令将可执行文件安装在该文件夹中。当运行某一程序时,install 文件夹中相应的可执行文件就会被加载到内存中,被CPU 执行。

(4)log 文件夹:目录包含有关每个 colcon 调用的各种日志信息

注意:不同于catkin中的工作空间,这里面没有devel文件夹

2.3 创建ROS2工作空间

在终端中输人如下命令,创建工作空间 ros2_ws 及其子文件夹 src

mkdir -p ~/ros2_ws/src

其中,-p 表示创建目标路径上的所有文件夹及其子文件夹。

3. 编译系统—colcon的使用

注意:在ROS2中,catkin_make 不再存在,取而代之的是使用 colcon 作为构建工具。具体到某个软件包的构建,应该使用 colcon build 命令。

3.1 编译工作空间

在终端中输人如下命令,回到工作空间的根目录,并编译工作空间:

cd ~/ros2_ws/
colcon build

需要说明的是,编译之前需要回到工作空间的根目录下。colcon build 命令在其他路径下编译不会成功。编译成功之后,在 ros2_ws 文件夹下,除了 src 文件夹之外,将会生成 build、install、log 3个文件夹,如下图所示。

3.2 配置环境变量

(1)编译完成后,进入install 目录

cd ~/ros2_ws/install

(2)激活编译好的工作空间

在 install 目录下,会有一个setup.bash(Linux系统)脚本文件,用于配置环境变量:

source setup.bash

(3)验证环境变量配置

可以通过打印一些环境变量来检查它们是否正确设置:

echo $ROS_DISTRO
echo $PREFIX

4. 功能包

功能包(Package)是编译的基本单元,也是 ROS保存源代码的地方。

4.1 功能包的文件结构

(1)package.xml 文件:属于功能包的包清单文件,描述了功能包的包名、版本号、内容描述、维护人员、软件许可等基本信息,是功能包中必需的文件之一。
(2)CMakeLists.txt 文件:属于编译系统的规则文件,定义了功能包的包名、源文件、依赖、目标文件等编译规则,也是功能包中必需的文件之一。
(3)src 文件夹:用来保存功能包的源代码文件,即需要编译的源代码。
(4)include 文件夹:用来保存源代码所需的头文件,包括C++的源代码(.cpp)和Python的 module(.py)文件。
(5)script 文件夹:用来保存可执行的脚本文件,如 shell 脚本文件(.sh)、python 脚本文件(.py)。
(6)msg 文件夹:用来保存用户自定义格式的消息类型文件(.msg)。
(7)srv 文件夹:用来保存用户自定义格式的服务类型文件(.srv)。
(8)models 文件夹:用来保存机器人或仿真场景的3D模型文件(.sda、.sl、.dae等)。
(9)urdf 文件夹:用来保存机器人的模型描述文件(.urdf 或 .macro)。
(10)launch 文件夹:用来保存功能包中所有的启动文件(.launch 或 .xml)。

4.2 创建功能包

ROS2中创建功能包需要使用 ros2 pkg create 命令,具体步骤如下:

(1)在终端中输入以下命令来创建一个新的功能包:

cd ~/ros2_ws/src
ros2 pkg create --build-type ament_cmake <package_name>

其中<package_name>是你的功能包名称,比如 lianxi1、my_robot
此命令会创建一个新目录,并在其中生成基本的文件结构,包括CMakeLists.txt、package.xml以及源代码和头文件目录。

(2)创建节点文件

创建功能包后,需要为其添加节点源文件。进入功能包目录 cd ~/ros2_ws/src/lianxi1,然后使用文本编辑器手动创建一个名为lianxi1.cpp的文件,并编写相应的代码来实现特定功能。

在终端用代码创建节点文件也可以:

cd ~/ros2_ws/src/lianxi1
sudo gedit lianxi1.cpp

(3)修改CMakeLists.txt

同样在功能包目录下,编辑 CMakeLists.txt 文件以告知构建系统如何编译你的节点。这包括添加必要的依赖和定义可执行文件。

cd ~/ros2_ws/src/lianxi1
sudo gedit CMakeLists.txt

在 find_package(ament_cmake REQUIRED)下面添加

find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)

添加可执行文件的名字为lianxi1

add_executable(lianxi1 src/lianxi1.cpp)
ament_target_dependencies(lianxi1 rclcpp std_msgs)

添加 install(TARGETS…) 把可执行文件安装到install去

install(TARGETS
  lianxi1
  DESTINATION lib/${PROJECT_NAME})

4.3 编译功能包

(1) 返回工作空间根目录

cd ~/ros2_ws

(2) 构建特定功能包 

为了节省编译时间和资源,可以选择只编译特定的功能包。使用命令 colcon build --packages-select lianxi1将只编译名为"lianxi1"的功能包。

colcon build --packages-select lianxi1

(3)运行安装脚本 

编译完成后,需要执行安装脚本以使新编译的节点可以在当前shell中使用。使用命令:

source install/setup.bash

(4)运行功能包

ros2 run lianxi1

  • 17
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值