赞
踩
在移植ROS2之前,先确认需要移植的版本以及其对应的依赖,这些信息可以在 ROS 2 Releases and Target Platforms 中有介绍,可依据自身需要使用的平台,参考该链接进行选择,下面以ROS2 Humble为例进行介绍ROS2移植操作。
ROS Humble依赖如下:
而ROS2的构建依赖Colcon工具,下面先从该工具进行介绍。
colcon是ROS构建工具catkin_make、catkin_make_isolated、catkin_tools和ament_tools的迭代。在PC端通过sudo apt install python3-colcon-common-extensions
可实现安装,而在交叉编译的时候,可安装https://github.com/colcon
、https://pypi.org/project/colcon-common-extensions/
等仓库下的多个包,以支持colcon的构建,如果colcon的拓展包功能不齐全,构建过程可能存在错误。当前移植过程使用到的colcon包如下:
colcon-argcomplete colcon-common-extensions colcon-defaults colcon-library-path colcon-notification colcon-package-information colcon-parallel-executor colcon-python-setup-py colcon-ros colcon-cmake colcon-core colcon-devtools colcon-metadata colcon-output colcon-package-selection colcon-pkg-config colcon-recursive-crawl colcon-test-result
在完成上述colcon包的编译后,将可通过colcon build --cmake-force-configure --cmake-args CMAKE_ARGS
进行编译ROS2包。
在准备好构建工具之后,下一步检查ROS2移植所需要的包,可以通过https://raw.githubusercontent.com/ros2/ros2/release-latest/ros2.repos
获取ROS2依赖的包,下载后逐个将其进行交叉编译即可。
colcon build \ --cmake-force-configure --cmake-args \ -DCMAKE_SYSTEM_NAME=Linux \ -DCMAKE_SYSTEM_VERSION=1 \ -DCMAKE_SYSTEM_PROCESSOR=$(ARCH) \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_C_FLAGS_RELEASE="-DNDEBUG" \ -DCMAKE_CXX_FLAGS_RELEASE="-DNDEBUG" \ -DCMAKE_C_COMPILER_LAUNCHER="$(CMAKE_C_COMPILER_LAUNCHER)" \ -DCMAKE_C_COMPILER="$(CMAKE_C_COMPILER)" \ -DCMAKE_CXX_COMPILER_LAUNCHER="$(CMAKE_CXX_COMPILER_LAUNCHER)" \ -DCMAKE_CXX_COMPILER="$(CMAKE_CXX_COMPILER)" \ -DCMAKE_ASM_COMPILER_LAUNCHER="$(CMAKE_C_COMPILER_LAUNCHER)" \ -DCMAKE_ASM_COMPILER="$(CMAKE_C_COMPILER)" \ -DCMAKE_EXE_LINKER_FLAGS:STRING="$(TARGET_LDFLAGS)" \ -DCMAKE_MODULE_LINKER_FLAGS:STRING="$(TARGET_LDFLAGS) $(CMAKE_SHARED_LDFLAGS)" \ -DCMAKE_SHARED_LINKER_FLAGS:STRING="$(TARGET_LDFLAGS) $(CMAKE_SHARED_LDFLAGS)" \ -DCMAKE_AR="$(CMAKE_AR)" \ -DCMAKE_NM="$(CMAKE_NM)" \ -DCMAKE_RANLIB="$(CMAKE_RANLIB)" \ -DCMAKE_FIND_ROOT_PATH="$(CMAKE_FIND_ROOT_PATH)" \ -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=BOTH \ -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \ -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY \ -DCMAKE_STRIP=$(call cmake_tool,$(TARGET_CROSS)strip) \ -DCMAKE_INSTALL_PREFIX=/usr \ -DDL_LIBRARY=$(STAGING_DIR) \ -DCMAKE_PREFIX_PATH=$(STAGING_DIR) \ -DCMAKE_SKIP_RPATH=TRUE \ -DCMAKE_EXPORT_PACKAGE_REGISTRY=FALSE \ -DCMAKE_EXPORT_NO_PACKAGE_REGISTRY=TRUE \ -DCMAKE_FIND_USE_PACKAGE_REGISTRY=FALSE \ -DCMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY=TRUE \ -DCMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY=FALSE \ -DCMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY=TRUE \ -DPython3_EXECUTABLE=$(HOST_PYTHON3_BIN) \ -DPYTHON_EXECUTABLE=$(HOST_PYTHON3_BIN) \ -DPYTHON_SOABI=cpython-$(PYTHON3_VERSION_MAJOR)$(PYTHON3_VERSION_MINOR) \ -DBUILD_TESTING=OFF \ -DSECURITY=ON \ $(CMAKE_OPTIONS)
通过上述命令,即可进行构建,而相关参数的作用,参考ROS2交叉编译可参考官方链接Cross-compilation)介绍。
ROS2安装包的时候,将会在shard目录下存在相关的local_setup.sh和package.sh文件,其中的AMENT_CURRENT_PREFIX和_colcon_package_sh_COLCON_CURRENT_PREFIX变量需要修改为目标平台的根文件系统路径,否则执行ROS2时无法查找到相关的包。
ROS节点间通信依赖本地回环网络,执行应用前需要确保系统本身网络回环是正常的。
ROS2的包很多,如果出现编译报错需要依赖的包没有找到,可以先到ROS2 Documentation:Humble界面搜索,确认找不到的包属于哪个ROS2包,然后将其下载编译即可,并增加相关的DEPENDS。
编译时找不到编译的库,可在Makefile中,通过TARGET_LDFLAGS
增加链接库即可。如果本身没有该库,则先编译,再增加链接和依赖。
如果执行cpp的应用程序可正常执行,而执行python的应用程序则出现找不到包的情况,则是因为在编译的时候,传递的PYTHON_SOABI
配置不正确导致的。PYTHON_SOABI包含了Python解释器使用的操作系统、编译器和Python版本的信息等细节,因此其具体内容会随着Python版本、操作系统和编译器不同而有所区别。由于PYTHON_SOABI包含了底层系统和编译器的信息,因此在不同平台和不同版本的Python中,它的值可能会有所不同。这意味着在构建C扩展模块时必须要注意确保与Python解释器使用相同的共享库文件,否则可能会导致未定义的行为或错误。
如何获取当前python的PYTHON_SOABI信息呢?
$ python3 -c "import sysconfig; print(sysconfig.get_config_var('SOABI'))"
在获取PYTHON_SOABI信息后,将其传递到编译参数即可。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。