Webots中CMake开发环境配置

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。

图1 未编译状态的文件结构
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,就完成配置了哈!