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

寻求基于CMakeLists.txt搭建Drake模拟器C++项目的教程与示例代码

用CMake构建非Bazel的Drake项目问题

问题描述

想尝试新版Drake模拟器,但不想局限在Drake安装目录的examples文件夹下用Bazel构建项目。要开发一个支持多物理模拟器的程序,具备加载模型、设置控制等基础功能,需要通过单个CMakeLists.txt完成构建,但找不到相关示例(哪怕是CMake调用Bazel编译Drake的示例也可以)。尝试在CMake中用find_package(drake REQUIRED),但找不到drake-config.cmake文件。

我的CMake代码

list(APPEND CMAKE_PREFIX_PATH /home/dave/projects/drake/tools/install/libdrake)
message(STATUS "CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}")
find_package(drake REQUIRED)

错误信息

CMake Error at CMakeLists.txt:28 (find_package):
  By not providing "Finddrake.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "drake", but
  CMake did not find one.

  Could not find a package configuration file provided by "drake" with any of
  the following names:

    drakeConfig.cmake
    drake-config.cmake

  Add the installation prefix of "drake" to CMAKE_PREFIX_PATH or set
  "drake_DIR" to a directory containing one of the above files.  If "drake"
  provides a separate development package or SDK, be sure it has been
  installed.

解决方案

1. 确认Drake的获取方式

  • 若你是源码编译Drake,默认不会生成CMake配置文件,需要在编译时加上参数-Ddrake_INSTALL=ON开启安装流程,编译完成后执行make install(或ninja install)把Drake安装到指定目录,此时安装目录下会生成drake-config.cmake。
  • 若你是下载预编译二进制包,要确保下载的是包含开发文件的版本,解压后在lib/cmake/drake目录下就能找到drake-config.cmake。

2. 修正CMake前缀路径

源码编译并安装后,CMAKE_PREFIX_PATH要指向Drake的安装根目录,不是libdrake子目录。比如安装到/home/dave/drake_install,配置代码如下:

list(APPEND CMAKE_PREFIX_PATH /home/dave/drake_install)
find_package(drake REQUIRED)

或者直接指定drake_DIR指向配置文件所在路径:

set(drake_DIR "/home/dave/drake_install/lib/cmake/drake")
find_package(drake REQUIRED)

3. 基础CMake项目示例

以下是最小化的CMake项目示例,可用于编译简单的Drake程序:

cmake_minimum_required(VERSION 3.20)
project(drake_cmake_example)

# 指定Drake配置文件路径
set(drake_DIR "/path/to/drake_install/lib/cmake/drake")
find_package(drake REQUIRED)

# 添加可执行文件
add_executable(hello_drake main.cpp)
# 链接Drake库
target_link_libraries(hello_drake PRIVATE drake::drake)

对应的main.cpp示例(实现模型加载功能):

#include <drake/multibody/parsing/parser.h>
#include <drake/multibody/plant/multibody_plant.h>
#include <drake/systems/analysis/simulator.h>

int main() {
  // 创建MultibodyPlant实例
  drake::multibody::MultibodyPlant<double> plant(0.0);
  drake::multibody::Parser parser(&plant);
  // 加载URDF模型(替换为你的模型路径)
  parser.AddModelFromFile("path/to/your/model.urdf");
  plant.Finalize();

  // 创建模拟器并初始化
  drake::systems::Simulator<double> simulator(plant);
  simulator.Initialize();
  std::cout << "模型加载成功!" << std::endl;

  return 0;
}

4. CMake调用Bazel编译Drake(可选)

如果不想单独安装Drake,也可以在CMake中直接调用Bazel构建Drake目标,示例如下:

cmake_minimum_required(VERSION 3.20)
project(drake_bazel_cmake)

# 调用Bazel构建Drake核心库
add_custom_target(drake_build ALL
  COMMAND bazel build //:drake
  WORKING_DIRECTORY /home/dave/projects/drake
)

# 添加可执行文件
add_executable(hello_drake main.cpp)
# 依赖Bazel构建的Drake目标
add_dependencies(hello_drake drake_build)

# 设置包含目录和链接库
target_include_directories(hello_drake PRIVATE
  /home/dave/projects/drake/bazel-bin
  /home/dave/projects/drake
)
target_link_libraries(hello_drake PRIVATE
  /home/dave/projects/drake/bazel-bin/libdrake.a
  # 需额外添加Drake的依赖库(如Eigen、Bullet等),需根据实际情况补充
)

注:这种方式需要手动处理所有依赖库,配置繁琐,优先推荐使用安装后的CMake配置方式。

内容的提问来源于stack exchange,提问作者DMackRus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 15:57:53