1. 前情提要
上一篇文章中分享了一下mac系统下开发Webots python的一些问题,但是python做实时性移植的时候会很不方便,所以课题组一般都是用C++作为标准的开发语言。CMake作用一个跨平台的C++编译环境,在软件开发中有着极高的通用性(说的就是你!VS!),今天就主要来分享一下如何采用CMake来开发Webots的机器人程序。
2. 环境介绍
本人环境:
OS X big sur
cmake version 3.18.4
Webots 2020b
3. 文件系统
在Webots中,控制器和仿真环境是分开的,如图1所示,分为controllers和simulation,我们今天主要关注controllers。
controllers下一级目录GeckoRunner中,包含着webots需要运行的程序,也包含其源文件。我们将在这个目录下进行CMake工作,其中最重要的就是编写CMakeLists.txt文件。一般CMake编译中,习惯将用到的编译源文件放在src中,将头文件放在include,因此需要添加:
1 2 3 4 | file(GLOB C_SOURCES ./src/*.c) file(GLOB CPP_SOURCES ./src/*.cpp) set(SOURCES ${C_SOURCES} ${CPP_SOURCES}) include_directories(./include) |
由于Webots本身带有一些编译所必须的库和lib,我们必须将它们的路径加入CMakelists中:
1 2 3 | link_directories($ENV{WEBOTS_HOME}/lib/controller) set (LIBRARIES ${CMAKE_SHARED_LIBRARY_PREFIX}Controller${CMAKE_SHARED_LIBRARY_SUFFIX} ${CMAKE_SHARED_LIBRARY_PREFIX}CppController${CMAKE_SHARED_$ include_directories($ENV{WEBOTS_HOME}/include/controller/c $ENV{WEBOTS_HOME}/include/controller/cpp ./include /usr/local/include/eigen3) |
此处的include_directories覆盖上一段include_directories。在进行一些基本的配置,CMakeLists就准备完了,我的CMakeLists如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | cmake_minimum_required(VERSION 3.0) # Debug set( CMAKE_BUILD_TYPE "Debug" ) set( CMAKE_CXX_FLAGS_DEBUG "-o0 -Wall -g -ggdb" ) # Setup the project. # Its name is defined to be the controller directory name. get_filename_component(PROJECT ${CMAKE_SOURCE_DIR} NAME) project(${PROJECT}) # Get C or C++ sources in the current directory (only). file(GLOB C_SOURCES ./src/*.c) file(GLOB CPP_SOURCES ./src/*.cpp) set(SOURCES ${C_SOURCES} ${CPP_SOURCES}) # Link with the Webots controller library. link_directories($ENV{WEBOTS_HOME}/lib/controller) set (LIBRARIES ${CMAKE_SHARED_LIBRARY_PREFIX}Controller${CMAKE_SHARED_LIBRARY_SUFFIX} ${CMAKE_SHARED_LIBRARY_PREFIX}CppController${CMAKE_SHARED_$ include_directories($ENV{WEBOTS_HOME}/include/controller/c $ENV{WEBOTS_HOME}/include/controller/cpp ./include /usr/local/include/eigen3) # Setup the target executable. add_executable(${PROJECT} ${SOURCES}) target_link_libraries(${PROJECT} ${LIBRARIES}) # Copy the target executable at the right location. add_custom_command(TARGET ${PROJECT} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/${PROJECT} ${CMAKE_SOURCE_DIR}) |
可以看到我们用到了$ENV{WEBOTS_HOME},这是需要在zsh或者bash中配置的,我现在用的是zsh,因此进行如下配置:
1 | vim ~/.zshrc |
按i进入insert模式,在最后添加:
1 | export WEBOTS_HOME=/Applications/Webots.app |
等于号后面是Webots的安装目录,mac下一般都相同,Linux或者windows可能有区别,大家按照自己的安装目录来修改(Webots的安装目录里会有lib,include之类的文件夹,大家可以按照这个特征来辨识自己找的是否正确)。
现在必要的步骤都已经完成了,在GeckoRunner目录底下在终端中输入:
1 2 3 4 | mkdir build cd build cmake .. make |
编译没出错的话可以看到我们编译的对象就已经出现在GeckoRunner目录里了,在Webots中选择我们刚刚编译得到的controller,就完成配置了哈!