无法在Bazel工作区将底层ROS2与drake-ros作为外部依赖使用
解决Drake-ROS Bazel规则引入Debian版ROS2 Humble的CMake错误
我之前碰到过类似的问题,Debian预编译的ROS2包有时候会存在导出路径、目标定义的小问题,和Bazel的ros2_local_repository配合时容易触发这类报错。这里有几个从易到难的解决方案,推荐按顺序尝试:
1. 排除无关的问题包
从错误信息来看,出问题的大多是demo或测试类包(比如quality_of_service_demo_cpp、empty_using_image_tools),你的outdoor_slam_ros2大概率不需要这些包。直接在ros2_local_repository里排除它们,就能跳过这些错误:
ros2_local_repository( name = "ros2", workspaces = ["/opt/ros/humble/"], exclude = [ "quality_of_service_demo_cpp", "empty_using_image_tools", "empty_using_tf2_bullet", # 如果后续还有其他报错的包,继续添加到这里 ] )
2. 补全ROS2依赖开发包
Debian默认安装的ROS2可能缺少部分rosidl类型支持的开发包,导致CMake找不到对应的目标。执行以下命令补全依赖:
sudo apt update && sudo apt install \ ros-humble-sensor-msgs ros-humble-tf2 ros-humble-geometry-msgs ros-humble-tf2-ros \ ros-humble-rosidl-typesupport-fastrtps-c ros-humble-rosidl-typesupport-fastrtps-cpp \ ros-humble-rosidl-typesupport-introspection-c ros-humble-rosidl-typesupport-introspection-cpp \ ros-humble-rosidl-default-generators
安装完成后重新构建,很多"目标未找到"的错误都是因为缺失对应的开发包导致的。
3. 手动引入单个所需ROS2包
如果排除法还是不行,可以放弃引入整个ROS2 workspace,只手动引入outdoor_slam_ros2实际依赖的包。比如针对sensor_msgs和tf2相关包,在WORKSPACE里添加:
# 引入sensor_msgs new_local_repository( name = "sensor_msgs", path = "/opt/ros/humble/share/sensor_msgs/cmake", build_file_content = """ load("@drake_ros//ros:defs.bzl", "ros_cmake_package") ros_cmake_package() """ ) # 引入tf2 new_local_repository( name = "tf2", path = "/opt/ros/humble/share/tf2/cmake", build_file_content = """ load("@drake_ros//ros:defs.bzl", "ros_cmake_package") ros_cmake_package() """ ) # 按同样的方式添加其他依赖包,比如geometry_msgs、tf2_ros等
这种方式更精准,避免引入无关的有问题包。
4. 使用本地Colcon构建的ROS2 Workspace
如果上述方法都不奏效,可以创建一个本地Colcon workspace,编译你需要的ROS2包源码,这样能完全控制包的导出配置,避免Debian预编译包的兼容性问题:
- 创建并构建本地ROS2 workspace:
mkdir -p ~/ros2_humble_ws/src cd ~/ros2_humble_ws/src # 克隆你需要的ROS2核心包(根据slam包的依赖调整) git clone https://github.com/ros2/common_interfaces.git -b humble git clone https://github.com/ros2/tf2.git -b humble git clone https://github.com/ros2/rosidl_typesupport.git -b humble cd .. colcon build --symlink-install
- 在WORKSPACE里指向这个本地编译的workspace:
ros2_local_repository( name = "ros2", workspaces = ["~/ros2_humble_ws/install/"], )
这种方式虽然麻烦一点,但兼容性最好,适合解决复杂的依赖问题。
建议先从方案1和方案2开始尝试,这两个最快捷,大概率能解决你的问题。
内容的提问来源于stack exchange,提问作者ali
相关产品推荐
相关产品推荐

