Drake中使用parser.AddModelFromFile加载自定义URDF出现路径报错如何解决
Drake加载自定义URDF路径错误解决方案
错误原因
你调用的
drake::FindResourceOrThrow是Drake官方提供的、专门用于查找Drake内置资源的接口,强制要求传入路径必须以drake/开头,无法用于加载项目自定义的URDF文件,这是触发报错的核心原因。
解决方案
不用调用Drake的资源查找接口,直接给parser.AddModelFromFile传入自定义URDF的文件系统路径即可,推荐以下两种实现方式:
方案1:直接写相对/绝对路径(适合临时测试)
直接将查找资源的代码替换为对应路径即可,注意相对路径是相对于运行可执行文件时的工作目录,不是代码文件所在目录:
// 示例:如果运行时工作目录为build目录,build和model目录同级 std::string full_name = "../model/model.urdf";
方案2:CMake传递项目根目录(推荐,鲁棒性更高)
通过CMake定义项目根目录的全局宏,避免写死路径受工作目录影响:
- 修改
src/CMakeLists.txt,添加宏定义,同时修正原有语法错误:
cmake_minimum_required(VERSION 3.16.3) project(IK VERSION 1.0) # 新增:传递项目根目录宏到C++代码,适配当前CMakeLists放在src目录的结构 add_definitions(-DPROJECT_ROOT_DIR="${PROJECT_SOURCE_DIR}/..") # Drake要求C++17及以上,替换原有C++11配置 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED True) find_package (Eigen3 3.3 REQUIRED NO_MODULE) find_package(drake CONFIG REQUIRED) set(SOURCE main.cpp) add_executable(${PROJECT_NAME} ${SOURCE}) target_link_libraries("${PROJECT_NAME}" Eigen3::Eigen drake::drake )
- 修改C++代码,拼接URDF路径:
#include "drake/geometry/scene_graph.h" #include "drake/multibody/parsing/parser.h" #include <string> int main(void) { drake::multibody::MultibodyPlant<double> plant_{0.0}; drake::geometry::SceneGraph<double> scene_graph; // 用CMake传递的根目录拼接URDF路径 std::string full_name = std::string(PROJECT_ROOT_DIR) + "/model/model.urdf"; drake::multibody::Parser parser(&plant_, &scene_graph); parser.AddModelFromFile(full_name); plant_.Finalize(); return 0; }
额外注意事项
- 原CMakeLists.txt末尾
drake::drake}多了一个右大括号,属于语法错误,修正为drake::drake后加右括号即可 - Drake当前版本最低要求C17,原有C11配置会引发兼容问题,建议升级标准配置
内容的提问来源于stack exchange,提问作者skywalker
相关产品推荐
相关产品推荐

