You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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定义项目根目录的全局宏,避免写死路径受工作目录影响:

  1. 修改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
)
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 15:54:04