修改记录数据#

AirSim 具有记录功能,可以轻松收集数据和图像。记录 API 还允许使用 API 启动和停止记录。

然而,默认记录的数据可能不足以满足您的用例,可能需要记录额外的数据,例如 IMU、GPS 传感器、旋翼机的旋翼速度等。您可以使用现有的 Python 和 C++ API 获取信息并根据需要存储,特别是对于激光雷达。另一种添加小型字段(如 GPS 或内部数据(如 Unreal 位置或其他))的选项可以通过修改 AirSim 中的记录方法来实现。本页面描述了您可能需要更改的具体方法。

记录的数据以制表符分隔的格式写入 airsim_rec.txt 文件,图像存储在 images/ 文件夹中。默认情况下,整个文件夹位于 Documents 文件夹中(或在设置中指定),并带有记录开始时间的 %Y-%M-%D-%H-%M-%S 格式的时间戳。

汽车车辆记录以下字段 -

VehicleName TimeStamp   POS_X   POS_Y   POS_Z   Q_W Q_X Q_Y Q_Z Throttle    Steering    Brake   Gear    Handbrake   RPM Speed   ImageFile

对于多旋翼飞行器 -

VehicleName TimeStamp   POS_X   POS_Y   POS_Z   Q_W Q_X Q_Y Q_Z ImageFile

代码更改#

请注意,这需要从源代码构建和使用 AirSim。如果需要,您可以在修改后自行编译二进制文件。

填充要存储数据的主要方法是 PawnSimApi::getRecordFileLine,它是所有车辆的基础方法,Car 覆盖它以记录额外的数据,如 CarPawnSimApi::getRecordFileLine 中所示。

为了记录多旋翼飞行器的额外数据,您可以在 MultirotorPawnSimApi.cpp/h 文件中添加类似的方法,该方法覆盖基类实现并附加其他数据。当前记录的数据也可以根据需要进行修改和删除。

例如,也记录多旋翼飞行器的 GPS、IMU 和气压计数据 -

// MultirotorPawnSimApi.cpp
std::string MultirotorPawnSimApi::getRecordFileLine(bool is_header_line) const
{
    std::string common_line = PawnSimApi::getRecordFileLine(is_header_line);
    if (is_header_line) {
        return common_line +
               "Latitude\tLongitude\tAltitude\tPressure\tAccX\tAccY\tAccZ\t";
    }

    const auto& state = vehicle_api_->getMultirotorState();
    const auto& bar_data = vehicle_api_->getBarometerData("");
    const auto& imu_data = vehicle_api_->getImuData("");

    std::ostringstream ss;
    ss << common_line;
    ss << state.gps_location.latitude << "\t" << state.gps_location.longitude << "\t"
       << state.gps_location.altitude << "\t";

    ss << bar_data.pressure << "\t";

    ss << imu_data.linear_acceleration.x() << "\t" << imu_data.linear_acceleration.y() << "\t"
       << imu_data.linear_acceleration.z() << "\t";

    return ss.str();
}
// MultirotorPawnSimApi.h
virtual std::string getRecordFileLine(bool is_header_line) const override;