go to index

ROS中的工作空间及功能包

read time 6 min read
ROS

机器人操作系统(ROS)实验课程

第二节 工作空间及功能包

一,工作空间的结构

workspace,中文翻译为工作空间,在ROS1中,Fuerte版本以后的ROS(不包括ROS2)使用Catkin编译系统

典型的工作空间包括以下四个目录:

  • src:代码空间(Source Code),开发工程中最关键的文件夹,用于存储该工作空间下所有ROS功能包的源文件
  • build:编译空间(Build Space),用来存储工作空间编译过程中所产生的缓存信息和中间文件
  • devel:开发空间(Development Space),用来存储编译生成的可执行文件
  • install:安装空间(Install Space),编译成功后,可以使用make install命令,将可执行文件夹安装到该空间中,运行空间中的环境变量脚本。

image-20240722015133773

在编译完工作空间以后,需要让ROS_PACKAGE_PATH(也就是ROS的环境变量)包含我们所创建的工作空间的目录,也就是需要让ROS可以找到你的工作空间,这里我们需要使用catkin中的source命令,在编译完成的工作空间中,devel文件夹下存在有几个脚本文件,这里以Ubuntu平台做说明,执行

bash
source devel/setup.bash		

将当前工作空间设置在ROS工作环境的最顶层

如果需要检查环境变量是否配置正确,则运行

bash
echo $ROS_PACKAGE_PATH

如果出现的路径中没有你所创建的工作空间路径,则工作空间没有创建好

二,功能包的结构

package,中文为功能包,指的是一种特定的文件结构和文件夹组合,通常将实现同一个具体功能的程序代码放在一个package中。

CMakeLists.txt: 定义package的包名、依赖、源文件、目标文件等编译规则,是package不可少的成分;

package.xml: 描述package的包名、版本号、作者、依赖等信息,是package不可少的成分 ;

src/: 存放ROS的源代码,包括C++的源码和(.cpp)以及Python的module(.py) ;

include/: 存放C++源码对应的头文件 ;

scripts/: 存放可执行脚本,例如shell脚本(.sh)、Python脚本(.py) ;

msg/: 存放自定义格式的消息(.msg) ;

srv/: 存放自定义格式的服务(.srv) ;

models/: 存放机器人或仿真场景的3D模型(.sda, .stl, .dae等) ;

urdf/: 存放机器人的模型描述(.urdf或.xacro) ;

launch/: 存放launch文件(.launch或.xml)

image-20240722015753781

通常来说,ROS的文件组织都是按照以上的格式,这是约定俗成的命名习惯,我们建议开发者遵守以上的组织架构习惯。在以上路径中,只有CMakeLists.txt和package.xml是必须的,其余的路径根据软件包是否需要来决定。

三,功能包的编译

ROS编译功能包的方式有很多种,但我们在ROS1中最常用的是catkin方法,在ROS2中最常用的是colcon方法。catkin编译的是利用catkin创建的package,编译之前需要修改创建功能包时生成的CMakeLists.txt文件。

CMakeLists.txt 原本是Cmake编译系统的规则文件,而Catkin编译系统基本沿用了CMake的编译风格,只是针对ROS工程添加了一些宏定义。所以在写法上,catkin的 CMakeLists.txt 与CMake的基本一致这个文件直接规定了这个package要依赖哪些package,要编译生成哪些目标,如何编译等等流程。所以 CMakeLists.txt 非常重要,它指定了由源码到目标文件的规则,catkin编译系统在工作时首先会找到每个package下CMakeLists.txt ,然后按照规则来编译构建我们使用cmake进行程序编译的时候,会根据CMakeLists.txt这个文件进行一步一步的处理,然后形成一个MakeFile文件,系统再通过这个文件的设置进行程序的编译

ROS中的CMakeLists.txt主要包括下面几个部分:

  • 所需CMake版本(cmake_minimum_required)
  • 软件包名称(project())
  • 查找构建所需的其他CMake / Catkin 软件包(find_package())
  • 启用Python模块支持(catkin_python_setup())
  • 消息/服务/动作生成器(add_message_files(),add_service_files(),add_action_files())
  • 消息/服务/动作生成(generate_messages())
  • 指定包构建的消息导出(catkin_package())
  • 要建立的库/可执行文件(add_library()/ add_executable()/ target_link_libraries())(target_link_libraryies通常情况下要有)
  • 测试建立(catkin_add_gtest())
  • 安装规则(install())