寻求基于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
相关产品推荐
相关产品推荐

