前言
由于官方文档没有仔细说明在Linux上该怎么使用C++来编程控制,我自己摸索了很久,终于用cmake构建成功了,我在这分享一下怎么实现的。
一 在ubuntu安装UE4,和构建Airsim
环境配置可以参考CSDN上的这篇博客,和官方文档,环境配置不是这篇博客的重点,不详细说了。
UE4,Airsim配置好后进入下一步。
二 main.cpp,CmakeList.txt文件的编写
首先创建一个文件夹,新建main.cpp,CmakeLists.txt,大概文件结构如下
1)main.cpp
main.cpp我直接拿官方的HelloDrone示例了,代码如下:
//main.cpp
#include <iostream>
#include "vehicles/multirotor/api/MultirotorRpcLibClient.hpp"
int main()
{
msr::airlib::MultirotorRpcLibClient client;
std::cout << "Press Enter to enable API control\n"; std::cin.get();
client.enableApiControl(true);
std::cout << "Press Enter to arm the drone\n"; std::cin.get();
client.armDisarm(true);
std::cout << "Press Enter to takeoff\n"; std::cin.get();
client.takeoffAsync(5)->waitOnLastTask();
std::cout << "Press Enter to move 5 meters in x direction with 1 m/s velocity\n"; std::cin.get();
auto position = client.getMultirotorState().getPosition(); // from current location
client.moveToPositionAsync(position.x() + 5, position.y(), position.z(), 1)->waitOnLastTask();
std::cout << "Press Enter to land\n"; std::cin.get();
client.landAsync()->waitOnLastTask();
return 0;
}
2)CmakeLists.txt
CmakeLists.txt文件如下,但是注意:不能直接复制使用,需要自己改一下路径。在
set(AIRSIM_ROOT "/home/liu/AirSim")这一行,要把"/home/liu/AirSim"替换为自己的Airsim路径,不然后面cmake操作肯定会报错,因为你的Airsim路径不可能与我的一模一样吧。Airsim路径的确定也很简单,打开Airsim文件夹,随便点文件夹内的子文件,右键选择属性,复制路径即可,在CmakeLists.txt中替换。
cmake_minimum_required(VERSION 3.5.0)
project(helloDrone)
SET(SRC_LIST main.cpp)
MESSAGE(STATUS "This is BINARY dir " ${HelloDrone_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir " ${HelloDrone_SOURCE_DIR})## Specify additional locations of header files
set(AIRSIM_ROOT "/home/liu/AirSim")include_directories(
${AIRSIM_ROOT}/HelloDrone
${AIRSIM_ROOT}/AirLib/include
${AIRSIM_ROOT}/AirLib/deps/rpclib/include
${AIRSIM_ROOT}/MavLinkCom/include
${AIRSIM_ROOT}/MavLinkCom/common_utils
${AIRSIM_ROOT}/AirLib/deps/eigen3
${AIRSIM_ROOT}/AirLib/deps/eigen3/Eigen
)# 添加 AirLib 子目录
add_subdirectory(${AIRSIM_ROOT}/cmake/AirLib AirLib)# 添加 MavLinkCom 子目录
add_subdirectory(${AIRSIM_ROOT}/cmake/MavLinkCom MavLinkCom)add_subdirectory(${AIRSIM_ROOT}/cmake/rpclib_wrapper rpclib_wrapper)
ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_LIST})
target_link_libraries(${PROJECT_NAME} ${AIRSIM_ROOT}/AirLib/deps/rpclib/lib/librpc.a)
# 链接 AirLib 和 MavLinkCom 到你的目标
target_link_libraries(${PROJECT_NAME} AirLib MavLinkCom )
三 构建Cpp源程序
打开main.cpp所在的文件夹,右键选择终端打开,输入
cmake .
make
第一次make大概需要1分钟时间。后面,再修改main.cpp保存,再次构建只需要在终端输入make就行,构建时间会短很多.
built成功后,你会在文件夹下看到一个可执行文件helloDrone。之所以叫做“helloDrone“这个名字,是因为在CmakeLists.txt中,这行代码 project(helloDrone),将项目名命名为helloDrone,又在ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_LIST}) 将项目名作为可执行文件的名字。如果想改,可以自己改成自己想要的名字。
四 运行可执行文件
首先打开UE4,打开Block环境,点击play按钮,运行游戏,出现弹窗是否选Car时,选择否,然后就会出现无人机了。详细打开运行UE4可以参考官方教程。
打开main.cpp所在的文件夹,右键选择终端打开,输入helloDrone后回车,运行helloDrone可执行文件
./helloDrone
之后呢,根据终端打印的文字提示,不断回车,就可以一步一步操控UE中的无人机起飞,移动,降落拉!(文字提示哪里冒出来的,为什么要回车?因为main.cpp就是这么写的,不懂可以仔细看看main.cpp哈)
结语
airsim用C++编程,麻烦就在构建上,官方也没给教程,这是最痛苦的,不过使用本篇教程的CmakeLists.txt,用cmake构建就ok了。
之后大家也可以将main.cpp的内容更改为自己的程序内容,实现自己的功能。
不过博主友情提醒一下大家,如果不是非的用C++编程的话,还是建议用python,python环境配置简单,直接pip install 就行。用C++的话,不仅命令行cmake构建有点麻烦,而且要是在IDE中编程要想有提示,还得添加头文件路径,才能看到提示。