未央一梦
1.21GB · 2025-09-15
ROS2 提供的测试框架提供代码静态检查功能(linter),在使用 ros2 pkg create
命令(完整命令如下,供参考)创建空白项目时,会默认启用代码静态检查。
ros2 pkg create --build-type ament_cmake hello_world --dependencies rclcpp rclpy
生成的 package.xml
存在以下代码行。
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
生成的 CMakeLists.txt
存在以下代码行。
find_package(ament_lint_auto REQUIRED)
# the following line skips the linter which checks for copyrights
# comment the line when a copyright and license is added to all source files
set(ament_cmake_copyright_FOUND TRUE)
# the following line skips cpplint (only works in a git repo)
# comment the line when this package is in a git repo and when
# a copyright and license is added to all source files
set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
然而,以上默认配置在检查代码格式化时,使用的工具是 uncrustify,这导致了我们的 .clang-format
文件无法被用于测试,colcon test
会因为代码格式不匹配而产生意外的失败用例。
如果希望使用 clang-format 而非 uncrustify,需要进行以下操作。
安装 ros-${ROS_DISTRO}-ament-cmake-clang-format
。
sudo apt install ros-${ROS_DISTRO}-ament-cmake-clang-format
需要注意的是,还有一个包叫作 ros-${ROS_DISTRO}-ament-clang-format
,它被以上包依赖,所以无需手动安装。
如果因为某些原因你的环境变量没有 ROS_DISTRO
,请将以上命令中的 ${ROS_DISTRO}
替换为你的 ROS 发行版,以 humble 为例,完整命令如下。
sudo apt install ros-humble-ament-cmake-clang-format
在 CMakeLists.txt
中禁用 uncrustify。
仿照已有的样板代码,增加下面的代码。
set(ament_cmake_uncrustify_FOUND TRUE)
在 package.xml
中增加 ament-clang-format
依赖。
<test_depend>ament_clang_format</test_depend>
在 CMakeLists.txt
中配置要使用的 .clang-format
文件。参见 docs.ros.org/en/ros2_pac…
set(ament_cmake_clang_format_CONFIG_FILE "${CMAKE_CURRENT_SOURCE_DIR}/.clang-format")
以上语句需要在 ament_lint_auto_find_test_dependencies()
之前设置。
CMakeLists.txt
修改后的内容如下,供参考。
find_package(ament_lint_auto REQUIRED)
# the following line skips the linter which checks for copyrights
# comment the line when a copyright and license is added to all source files
set(ament_cmake_copyright_FOUND TRUE)
# the following line skips cpplint (only works in a git repo)
# comment the line when this package is in a git repo and when
# a copyright and license is added to all source files
set(ament_cmake_cpplint_FOUND TRUE)
set(ament_cmake_uncrustify_FOUND TRUE)
set(ament_cmake_clang_format_CONFIG_FILE "${CMAKE_CURRENT_SOURCE_DIR}/.clang-format")
ament_lint_auto_find_test_dependencies()