本文依托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