通过配置settings.json可以设置数据记录参数。
0. 数据记录文件位置和格式
记录的数据以制表符Tab分隔的格式写入airsim_rec.txt文件,图像位于images/文件夹中。整个文件夹默认存在于Documents文件夹中(或在设置中指定),其时间戳为记录开始时的时间,格式为
%Y-%M-%D-%H-%M-%S
例如,car vehicle记录以下字段-
VehicleName TimeStamp POS_X POS_Y POS_Z Q_W Q_X Q_Y Q_Z Throttle Steering Brake Gear Handbrake RPM Speed ImageFile
再如,Multirotot记录以下字段
VehicleName TimeStamp POS_X POS_Y POS_Z Q_W Q_X Q_Y Q_Z ImageFile
1. Recording
- Recording允许您以指定的时间间隔记录位置、方向、速度等数据以及所捕获的图像。
- 可以按下右下角的红色Record键或R键开始录制数据。
- 数据存储在Documents\AirSim文件夹(或使用Folder配置参数指定的文件夹)。每开启一次记录,数据子文件夹以时间戳命名,tab分隔
- 具体参数:
参数 | 含义 |
---|
RecordInterval | 指定捕捉两个图像之间的最小间隔(以秒为单位)。 | RecordOnMove | true:指定如果车辆的位置或方向没有改变,则不记录帧 | Folder | 创建父文件夹,包含带有时间戳的记录子文件夹。必须指定目录的绝对路径。如果没有,则路径默认为 Documents/AirSim。 E.g. "Folder": "/home/<user>/Documents" | Enabled | true:仿真开始时自动开始记录。默认情况下,被设置为false | Cameras | 指定哪些相机被用来捕捉图像。默认情况下,相机0的场景图像被记录为压缩的png格式。该项设置是json array,所以可以指定多个相机来捕捉图像,每个都有可能不同的图像类型。目前在不支持外部摄像机记录 | Cameras.PixelsAsFloat | True:表示图像保存为PFM文件,而不是PNG文件 | Cameras.VehicleName | 为每辆车指定特定的摄像头。如果camera元素不存在,则会记录每辆车的默认摄像头的场景图像。 | “Cameras”: [] | 果不想记录任何图像,只记录车辆的物理数据,那么就指定camera元素为空 | 示例:下面的Cameras元素,代表记录Car1的场景和分割图像,记录Car2-的场景图像 | |
"Cameras": [
{ "CameraName": "0", "ImageType": 0, "PixelsAsFloat": false, "VehicleName": "Car1", "Compress": true },
{ "CameraName": "0", "ImageType": 5, "PixelsAsFloat": false, "VehicleName": "Car1", "Compress": true },
{ "CameraName": "0", "ImageType": 0, "PixelsAsFloat": false, "VehicleName": "Car2", "Compress": true }
]
2. ImageType 图像类型
该部分内容来自官网文档中的Image APIs部分 可用的ImageType值和含义:
| |
---|
Scene = 0, | | DepthPlanar = 1 | 相机平面内的深度图像,即所有平面平行于相机的点具有相同的深度,一般可用作ground truth image | DepthPerspective = 2, | 深度图像,using a projection ray that hits that pixel,一般可用作ground truth image | DepthVis = 3, | 获得一个有助于深度可视化的图像。在这种情况下,每个像素值是从黑到白插值,根据在相机平面的深度(米)。纯白色表示深度为100米或更多,纯黑色表示深度为0米。 | DisparityNormalized = 4, | diaparity图像,这种情况下,每个像素是(Xl - Xr)/Xmax,因此规一化为0到1之间的值 | Segmentation = 5, | 得到一个分割的场景图像,一般用作分割图像的ground truth。在启动时,AirSim为环境中每个可用网格mesh分配值0到255。然后将该值映射到托盘Pallet中的特定颜色。每个对象ID的RGB值都可以在这个文件中找到。建议您使用此API请求未压缩的图像,以确保您为分割图像任务获得精确的RGB值 | SurfaceNormals = 6, | | Infrared = 7, | 目前还只是一个从对象ID到灰色范围0-255的映射。噪声设置可以应用于这种图像类型,以获得更真实的效果。我们仍在努力添加其他红外artifacts | OpticalFlow = 8, | 这些图像类型返回由相机的视角感知到的运动信息。OpticalFlow返回一个2通道图像,通道分别对应vx和vy。 | OpticalFlowVis = 9 | 类似于OpticalFlow,但将流数据转换为RGB,以获得更“可视化”的输出。 |
3. API修改Recording数据: 增加、选择新数据
这部分内容来自官网:Design》Modifying Recording Data
-
AirSim提供了Recording的功能,可以轻松地收集数据和图像。采用接口函数Recording APIs也允许使用API启动和停止记录。 -
默认记录的数据对于您的用例可能不够,有时也期望能记录额外的数据,如IMU、GPS传感器、直升机的转子速度等。 -
可以使用现有的Python和c++ API来获取信息并按需存储,特别是对于Lidar。 -
另一个选项是添加小字段small fields是可能的,例如如GPS或内部数据(如虚幻位置或其他)可以通过修改AirSim内的recording methods -
Code Changes:代码改变后,需要从源码编译和使用AirSim。如果需要,您可以在修改后自己编译二进制文件。 -
填充要存储的数据的主要方法是:PawnSimApi::getRecordFileLine。它是所有车辆的基本方法,Car重写它以记录更多的数据,正如 CarPawnSimApi::getRecordFileLine.中看到的那样。 -
要记录multirotor的更多的additional数据,可以在MultirotorPawnSimApi.cpp/h文件中添加类似的方法,override base class基类实现,并附加append其他数据。 -
还可以根据需要修改和删除当前已记录logged数据。 以下是一个记录multirotor的GPS,IMU和气压计barometer数据的例子
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();
}
virtual std::string getRecordFileLine(bool is_header_line) const override;
|