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.cpppkg_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

提供静态测试和动态单元测试

mergesymlink方式上需要与colcon build对应

为了区分测试,可使用--packages-select选择功能包进行测试

C/C++功能包可使用ament_uncrustify工具格式化代码
在目录下运行ament_uncrustify --reformat即可

C++功能包文件扩展名需要遵守uncrustifycpplint规范,使用.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

其中PATHLD_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功能包关联的可执行程序

posted @ 2024-11-01 19:54  sgqmax  阅读(13)  评论(0编辑  收藏  举报