airsim-client 0.3.2

A Rust client library for Airsim.
Documentation
use airsim_client::{ImageType, MultiRotorClient, NetworkResult};
use async_std::task;

#[allow(clippy::no_effect)]
fn _settings_json() {
    r#"
        {
            "SeeDocsAt": "https://github.com/Microsoft/AirSim/blob/main/docs/settings_json.md",
            "SettingsVersion": 1.2,
            "SimMode": "Multirotor",
            "LocalHostIp": "0.0.0.0",
            "ApiServerPort": 41451,
            "Vehicles": {
                "Drone1": {
                    "VehicleType": "SimpleFlight",
                    "AutoCreate": true,
                    "Cameras": {
                        "high_res": {
                            "CaptureSettings": [
                                {
                                    "ImageType": 0,
                                    "Width": 4320,
                                    "Height": 2160
                                }
                            ],
                            "X": 0.50,
                            "Y": 0.00,
                            "Z": 0.10,
                            "Pitch": 0.0,
                            "Roll": 0.0,
                            "Yaw": 0.0
                        },
                        "low_res": {
                            "CaptureSettings": [
                                {
                                    "ImageType": 0,
                                    "Width": 256,
                                    "Height": 144
                                }
                            ],
                            "X": 0.50,
                            "Y": 0.00,
                            "Z": 0.10,
                            "Pitch": 0.0,
                            "Roll": 0.0,
                            "Yaw": 0.0
                        }
                    }
                }
            }
        }
    "#;
}

async fn connect_drone() -> NetworkResult<()> {
    let address = "172.22.224.1:41451"; // set with env variable
    let vehicle_name = "";

    log::info!("Start!");

    // connect
    log::info!("connect");
    let client = MultiRotorClient::connect(address, vehicle_name).await?;

    // confirm connect
    log::info!("confirm connection");
    let res = client.confirm_connection().await?;
    log::info!("Response: {:?}", res);

    // arm drone
    log::info!("arm drone");
    client.arm_disarm(true).await?;
    log::info!("Response: {:?}", res);

    // take off
    log::info!("take off drone");
    client.take_off_async(20.0).await?;
    log::info!("take off completed");

    // use camera
    log::info!("get vehicle images");
    let img = client.sim_get_image("high_res", ImageType::Scene, Some(false)).await?;
    // let _img = client
    //     .sim_get_images(
    //         ImageRequests(vec![ImageRequest {
    //             camera_name: "high_res".to_string(),
    //             image_type: ImageType::Scene,
    //             pixels_as_float: false,
    //             compress: false,
    //         }]),
    //         Some(false),
    //     )
    //     .await;

    log::info!("image response: {img:?}");

    client.arm_disarm(false).await?;
    client.enable_api_control(false).await?;
    log::info!("Mission done!");
    Ok(())
}

fn main() -> NetworkResult<()> {
    env_logger::init();
    task::block_on(connect_drone())
}