在 AirSim 上使用C++的API
本文的提供了C++调用API的样例和一些切合C++特性的细节,在阅读本文档之前请先阅读 通用 API 文档。
快速开始
最快的入门方式是在 Visual Studio 2017 内打开 AirSim.sln。您将在解决方案中看到名为 Hello Car 以及 Hello Drone 的样例代码。这些代码内包含配置好的include路径以及lib路径,您也可以通过参考来迅速的在其他VC++项目中使用。如果您使用的是Linux,那么您需要在 cmake file 中配置好相关路径,或者在编译器命令行中传递相应路径。
Include 以及 Lib 文件夹
- Include 文件夹:
$(ProjectDir)..\AirLib\deps\rpclib\include;include;$(ProjectDir)..\AirLib\deps\eigen3;$(ProjectDir)..\AirLib\include
- 依赖:
rpc.lib
- Lib 文件夹:
$(ProjectDir)\..\AirLib\deps\MavLinkCom\lib\$(Platform)\$(Configuration);$(ProjectDir)\..\AirLib\deps\rpclib\lib\$(Platform)\$(Configuration);$(ProjectDir)\..\AirLib\lib\$(Platform)\$(Configuration)
Hello Car
以下代码展示的是如何使用 AirSim APIs 来控制仿真车辆(Python 版本的代码见此):
// 准备好运行这个样例
// ready to run example: https://github.com/Microsoft/AirSim/blob/master/HelloCar/main.cpp
#include <iostream>
#include "vehicles/car/api/CarRpcLibClient.hpp"
int main()
{
msr::airlib::CarRpcLibClient client;
client.enableApiControl(true); //在此禁止手工控制
CarControllerBase::CarControls controls;
std::cout << "Press enter to drive forward" << std::endl; std::cin.get();
controls.throttle = 1;
client.setCarControls(controls);
std::cout << "Press Enter to activate handbrake" << std::endl; std::cin.get();
controls.handbrake = true;
client.setCarControls(controls);
std::cout << "Press Enter to take turn and drive backward" << std::endl; std::cin.get();
controls.handbrake = false;
controls.throttle = -1;
controls.steering = 1;
client.setCarControls(controls);
std::cout << "Press Enter to stop" << std::endl; std::cin.get();
client.setCarControls(CarControllerBase::CarControls());
return 0;
}
Hello Drone
Here's how to use AirSim APIs using Python to control simulated car (see also Python example):
// ready to run example: https://github.com/Microsoft/AirSim/blob/master/HelloDrone/main.cpp
#include <iostream>
#include "vehicles/multirotor/api/MultirotorRpcLibClient.hpp"
int main()
{
using namespace std;
msr::airlib::MultirotorRpcLibClient client;
cout << "Press Enter to enable API control" << endl; cin.get();
client.enableApiControl(true);
cout << "Press Enter to arm the drone" << endl; cin.get();
client.armDisarm(true);
cout << "Press Enter to takeoff" << endl; cin.get();
client.takeoffAsync(5)->waitOnLastTask();
cout << "Press Enter to move 5 meters in x direction with 1 m/s velocity" << endl; cin.get();
auto position = client.getMultirotorState().getPosition(); // 从当前位置开始移动
client.moveToPositionAsync(position.x() + 5, position.y(), position.z(), 1)->waitOnLastTask();
cout << "Press Enter to land" << endl; cin.get();
client.landAsync()->waitOnLastTask();
return 0;
}
进一步深入
- 在其他的AirSim项目中使用内部硬件(internal infrastructure)的示例。
- DroneShell 这个app展示了使用C++ APIs来对无人机进行简单的交互操控。
- Python APIs