apt安装Drake通过CMakeLists加载外部URDF报错求助
解决Drake加载自定义URDF时的路径错误
错误原因
drake::FindResourceOrThrow是Drake专门用来查找自身内置资源(比如官方示例模型)的函数,它强制要求路径以drake/开头,用来定位Drake安装包或源码中的资源文件。你用它加载自己项目中的URDF,必然会触发路径格式校验错误。
解决方案
方案1:直接使用本地文件路径
放弃FindResourceOrThrow,直接传入URDF的绝对路径或程序运行目录的相对路径:
// 示例:使用绝对路径 const std::string urdf = "/home/your_username/path_to_urdf/urdf.urdf"; // 或者使用相对路径(需确保程序运行时当前目录正确) // const std::string urdf = "../path_to_urdf/urdf.urdf"; drake::multibody::Parser(plant_).AddModelFromFile(urdf);
方案2:通过CMake传递路径(适配colcon构建,推荐)
在CMakeLists.txt中定义URDF路径并传递给代码,避免硬编码绝对路径:
- 在CMakeLists.txt中添加:
# 假设URDF位于项目的resources目录下 set(URDF_PATH "${CMAKE_CURRENT_SOURCE_DIR}/resources/urdf.urdf") # 将路径注入C++代码 add_definitions(-DURDF_PATH="${URDF_PATH}")
- 在C++代码中使用:
const std::string urdf = URDF_PATH; drake::multibody::Parser(plant_).AddModelFromFile(urdf);
方案3:配置Drake资源系统(复杂场景可选)
如果你的项目需要纳入Drake的资源管理体系,可以设置DRAKE_RESOURCE_ROOT环境变量指向你的资源根目录,或通过CMake配置资源索引,但这对于简单加载自定义URDF来说冗余,优先推荐前两种方案。
关于你提到的GitHub Issue
该Issue讨论的是外部项目集成Drake官方资源系统的配置逻辑,和你的场景无关——你不需要将自身URDF纳入Drake的官方资源路径,直接加载本地文件即可解决问题。
内容的提问来源于stack exchange,提问作者Murt
相关产品推荐
相关产品推荐

