ROS2:功能包
ROS2工作空间与功能包
ros2是基于分布式设计的模块化软件中间件,各个功能分布在不同软件包,并在不同仓库中维护,通过XML文件描述各个功能包的依赖关系
CMake可以配置自动化测试,下载并构建依赖库,运行特定脚步和获取环境变量并配置宏定义等
一个进程可以有若干个节点,一个节点可以提供若干个不同的功能,节点间通过ROS2提供的通信模式进行通信,还可以利用命名空间或DDS域作为隔离手段,将信息与资源分隔
ROS工作空间可以嵌套,上层工作空间overlay的功能包会覆盖override下层工作空间underlay的同名功能包,每个工作空间中可以有多个功能包,但功能包不能嵌套
创建功能包
ros2 pkg create
在工作空间下新建功能包pkg_cpp和pkg_py
mkdir -p ros_dev/src && cd ros_dev/src
ros2 pkg create pkg_cpp --license 'Apache-2.0'
ros2 pkg create pkg_py --build-type ament_python --license 'Apache-2.0'
pkg_cpp功能包目录如下
pkg_cpp/
include/
pkg_cpp/
src/
CMakeLists.txt
pakcage.xml
配置功能包
新建头文件pkg_cpp/include/pkg_cpp/pkg2go.hpp
新建源文件pkg_cpp/src/pkg2go.cpp
和pkg_cpp/src/main.cpp
新建文件pkg_py/pkg_py/pkg2go.py
配置pkg_py/package.xml
<depend>pkg_cpp</depend>
约束pkg_py依赖于pkg_cpp,即在pkg_cpp构建完后开始构建pkg_py
配置pkg_py/setup.py
setup(
entry_points={
'console_scripts': [
'pkg2go = pkg_py.pkg2go:main'
],
},
)
配置pkg_cpp/CMakeLists.txt
修改pkg_cpp的CMakeLists.txt添加编译配置
1.
add(executable_pkg2go pkg2go)
add(library_pkg2go ${executable_pkg2go}_core)
添加动态库和可执行文件的变量名称,便于统一管理
include_directories(include)
添加include
目录为头文件查找的目录
add_library(${library_pkg2go} SHARED
src/pkg2go.cpp
)
add_executable(${executable_pkg2go}
src/main.cpp
)
添加可执行文件和库,并注明了库属于SHARED
类型,即动态库
target_link_libraries(${executable_pkg2go}
${library_pkg2go}
)
链接方式使用CMake的传统方法
install(TARGETS
${library_pkg2go}
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin
)
install(TARGETS ${executable_pkg2go}
RUNTIME DESTINATION lib/${PROJECT_NAME}
)
install(DIRECTORY include/
DESTINATION include/
)
通过install命令对库、可执行文件和头文件做了区分安装
2.测试部分,即if(BUILD_TESTING)
后的内容
find_package(ament_lint_auto REQUIRED)
根据xml
中的配置项自动加载静态测试依赖
单元测试的功能包为ament_cmake_gtest
3.ament系列的CMake指令
ament_export_include_directories(include)
ament_export_libraries(${library_pkg2go})
ament_package()
完成对头文件目录和库的导出,便于其他包的查找和链接
生成一系列CMake文件,并安装到share
目录
构建功能包
colcon build
在工作空间ros_dev
下使用colcon build
对功能包进行构建
默认使用merge
方式进行构建,该命令会读取package.xml
文件进行解析
测试功能包
colcon test
提供静态测试和动态单元测试
在merge
或symlink
方式上需要与colcon build
对应
为了区分测试,可使用--packages-select
选择功能包进行测试
C/C++功能包可使用ament_uncrustify
工具格式化代码
在目录下运行ament_uncrustify --reformat
即可
C++功能包文件扩展名需要遵守uncrustify
和cpplint
规范,使用.c,.cc,.cpp,.cxx,.h,.hh,.hpp,.hxx
运行
ros2 run
运行指定功能包中的程序
source install/setup.sh
ros2 run pkg_cpp pkg2go
ros2run
仅提供一个通用的启动方式,即通过python提供执行多进程任务的脚本
ros2run
支持使用--prefix
参数为程序添加前缀和扩展参数argv
等
前缀还可以是gdb和valgrind等调试工具指令
更新环境变量
在使用ros2run
之前,需更新环境变量source install/setup.sh
其中PATH
和LD_LIBRARY_PATH
路径用于指定C/C++可执行文件、脚本和库文件的目录
这两类变量是操作系统通用的变量
还有ROS2提供的变量AMENT_PREFIX_PATH
指定ROS2的安装目录
该路径可在colcon build
指令中通过install_base
指定,也可通过编写安装包来指定
所有ROS2都是通过ament
系列工具构建,故所有功能包生成文件都会按特定的规则存放在安装目录
所以ROS2的运行和启动可以通过AMENT_PREFIX_PATH
对目录和子目录下的功能包进行快速遍历
ros2run会通过ros2pkg的API寻找lib目录下的可执行文件,而不会在bin目录下寻找
ROS2在构建过程中只会将C/C++这类需要编译的代码构建为二进制文件,而Pyhon代码仅作复制整合
lib目录下会创建和项目同名的文件夹,并将可执行的ROS2进程安装在该路径下
此路径外的可执行程序不会被ros2pkg认为是ROS2功能包关联的可执行程序