airsim C++编程,cmake构建在ubuntu上实现

前言

        由于官方文档没有仔细说明在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中编程要想有提示,还得添加头文件路径,才能看到提示。

  • 34
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个使用CMake构建C++工程的示例。 我们假设这个工程有如下目录结构: ``` . ├── CMakeLists.txt ├── include │ └── mylib.h ├── src │ ├── main.cpp │ └── mylib.cpp └── test ├── CMakeLists.txt └── mylib_test.cpp ``` 其中: - `include` 目录包含头文件 `mylib.h` - `src` 目录包含源文件 `main.cpp` 和 `mylib.cpp` - `test` 目录包含测试代码 `mylib_test.cpp` 下面是 `CMakeLists.txt` 文件的内容: ```cmake # 设置 CMake 最低版本需求 cmake_minimum_required(VERSION 3.10) # 设置项目名称和版本号 project(myproject VERSION 1.0) # 设置 C++ 标准 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True) # 添加一个库 target,包含 mylib.cpp 和 mylib.h add_library(mylib src/mylib.cpp include/mylib.h) # 添加一个可执行文件 target,包含 main.cpp,以及 mylib 库 add_executable(myapp src/main.cpp) target_link_libraries(myapp PRIVATE mylib) # 添加一个测试 target,包含 mylib_test.cpp,以及 mylib 库 enable_testing() find_package(GTest REQUIRED) add_executable(mylib_test test/mylib_test.cpp) target_link_libraries(mylib_test PRIVATE mylib GTest::GTest GTest::Main) add_test(NAME mylib_test COMMAND mylib_test) ``` 其中: - `cmake_minimum_required(VERSION 3.10)` 声明了本工程需要 CMake 最低版本 3.10。 - `project(myproject VERSION 1.0)` 声明了本工程的名称和版本号。 - `set(CMAKE_CXX_STANDARD 11)` 设置了 C++ 标准为 C++11。 - `add_library(mylib src/mylib.cpp include/mylib.h)` 添加了一个名为 `mylib` 的库 target,包含 `mylib.cpp` 和 `mylib.h`。 - `add_executable(myapp src/main.cpp)` 添加了一个名为 `myapp` 的可执行文件 target,包含 `main.cpp` 和 `mylib` 库。 - `enable_testing()` 启用了测试功能。 - `find_package(GTest REQUIRED)` 查找 Google Test 库。 - `add_executable(mylib_test test/mylib_test.cpp)` 添加了一个名为 `mylib_test` 的测试 target,包含 `mylib_test.cpp` 和 `mylib` 库。 - `target_link_libraries(mylib_test PRIVATE mylib GTest::GTest GTest::Main)` 将 `mylib` 和 `GTest` 库链接到 `mylib_test` 中。 - `add_test(NAME mylib_test COMMAND mylib_test)` 添加了一个名为 `mylib_test` 的测试。 现在你可以使用以下命令构建和运行工程: ```bash mkdir build cd build cmake .. make ./myapp ctest ``` `make` 命令将编译所有 target,并生成可执行文件和库文件。`./myapp` 命令将运行 `myapp` 可执行文件。`ctest` 命令将运行所有测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值