
自动驾驶人工智能深度学习强化学习计算机视觉科研【免费下载链接】AirSimOpen source simulator for autonomous vehicles built on Unreal Engine / Unity, from Microsoft AI Research项目地址https://gitcode.com/gh_mirrors/ai/AirSim点击查看免费下载本篇技术指南聚焦 AirSim微软开源、基于 Unreal Engine / Unity 的自动驾驶仿真器内置 Recording录制功能的扩展方法讲解默认录制的airsim_rec.txt数据格式、写出链路以及如何通过修改源码中的getRecordFileLine系列方法为多旋翼、汽车等载具追加 GPS、IMU、气压计、Lidar 等传感器字段。读完本文你将掌握从源码层面定制 AirSim 录制数据的能力能够按自己的数据集格式输出个性化仿真数据。Recording 功能与数据文件概述AirSim 内置了 Recording 录制功能用于方便地收集仿真数据与图像同时也可以通过 Recording APIs 用 Python/C 客户端以编程方式启停录制。其默认行为是将数据写入airsim_rec.txt文件Tab 分隔格式图像保存到同级的images/文件夹中。整个数据文件夹默认位于Documents目录也可通过设置项指定并使用录制开始时刻的时间戳%Y-%M-%D-%H-%M-%S格式作为子目录名。默认录制包含的字段往往不足以覆盖所有使用场景。例如你可能希望额外记录 IMU、GPS 传感器数据、旋翼机的 Rotor 转速或按自己的格式保存 Lidar 点云等。此时有两种路线直接使用现有 Python / C API在仿真过程中自行调用 API 获取所需数据并按需存储尤其适合 Lidar 这类数据量较大的传感器修改 AirSim 录制方法本身适合追加 GPS 等小字段或内部数据如 Unreal 世界坐标等修改后随录制流程自动写入airsim_rec.txt。本文重点讲解第二种方案——修改哪些方法、如何改、改完后的效果。默认录制数据格式airsim_rec.txt中的每一列以 Tab\t分隔。默认情况下各载具记录的字段如下。Car汽车记录字段VehicleName TimeStamp POS_X POS_Y POS_Z Q_W Q_X Q_Y Q_Z Throttle Steering Brake Gear Handbrake RPM Speed ImageFileMultirotor多旋翼记录字段VehicleName TimeStamp POS_X POS_Y POS_Z Q_W Q_X Q_Y Q_Z ImageFile其中VehicleName为载具名称TimeStamp为时间戳POS_X/Y/Z为位置Q_W/Q_X/Q_Y/Q_Z为四元数姿态末尾的ImageFile是本帧录制图像的文件名多张图像用;分隔。Car 额外记录了 Throttle油门、Steering转向、Brake刹车、Gear挡位、Handbrake手刹、RPM转速、Speed速度等车辆控制与状态量。在源码层面表头header与数据行data line由两个独立调用分别生成。RecordingFile::createFile在创建文件时通过vehicle_sim_api-getRecordFileLine(true)写入表头行并在appendColumnHeader中追加末尾的ImageFile列见 RecordingFile.cpp每次写入数据行时则在getRecordFileLine(false)的返回结果后拼接图像文件名与换行符见 RecordingFile.cpp。录制的完整写出链路源码级要定制录制内容先理解数据是如何从仿真环境流到磁盘的。以 Unreal 实现为例关键调用链如下录制线程FRecordingThread::Run循环中按RecordInterval设定的时间间隔判断是否抓帧若RecordOnMove为真还会比较载具前后两帧位姿位姿未变化则跳过见 RecordingThread.cpp抓取图像对每个载具调用其getImageCapture()-getImages(settings.requests[vehicle_name], responses)得到本帧所有相机的图像响应写文件调用RecordingFile::appendRecord(responses, vehicle_sim_api)先写图像到images/目录再调用vehicle_sim_api-getRecordFileLine(false)生成文本行并写入airsim_rec.txt。可见每一行数据最终都来自VehicleSimApiBase::getRecordFileLine。这是定义在 VehicleSimApiBase.hpp 中的纯虚函数virtual std::string getRecordFileLine(bool is_header_line) const 0;传入is_header_line true时返回表头否则返回数据行。因此所有载具的录制内容定制都围绕对该方法的实现/覆盖展开。另外录制相关设置record_on_move、record_interval、folder、enabled及按载具分组的相机请求requests在 AirSimSettings.hpp 的RecordingSetting结构中有完整定义。修改录制数据的核心方法前提修改录制数据需要从源码构建并使用 AirSimUnreal 插件源码位于Unreal/Plugins/AirSim修改后可按需自行编译二进制。负责填充待存储数据的基础方法是PawnSimApi::getRecordFileLine它是所有载具共用的基类实现std::string PawnSimApi::getRecordFileLine(bool is_header_line) const { if (is_header_line) { return VehicleName\tTimeStamp\tPOS_X\tPOS_Y\tPOS_Z\tQ_W\tQ_X\tQ_Y\tQ_Z\t; } const auto* kinematics getGroundTruthKinematics(); const uint64_t timestamp_millis static_castuint64_t(clock()-nowNanos() / 1.0E6); std::ostringstream ss; ss getVehicleName() \t; ss timestamp_millis \t; ss kinematics-pose.position.x() \t kinematics-pose.position.y() \t kinematics-pose.position.z() \t; ss kinematics-pose.orientation.w() \t kinematics-pose.orientation.x() \t kinematics-pose.orientation.y() \t kinematics-pose.orientation.z() \t; return ss.str(); }可以看到基类只输出载具名、毫秒时间戳、位置NED 坐标系与四元数姿态末尾均带\t为派生类追加字段预留了列位。Car 的覆盖实现是在基类行上追加字段的标准范例见CarPawnSimApi::getRecordFileLine先调用基类拿到公共字段行表头行追加Throttle\tSteering\tBrake\tGear\tHandbrake\tRPM\tSpeed\t数据行则通过pawn_api_-getCarState()与current_controls_填充对应值。为 Multirotor 追加 GPS / IMU / 气压计数据完整示例Multirotor 默认只记录基类的运动学字段。要额外记录 GPS、IMU 与气压计数据可在Unreal/Plugins/AirSim/Source/Vehicles/Multirotor目录下的MultirotorPawnSimApi.cpp与MultirotorPawnSimApi.h中覆盖基类实现并追加数据。示例代码如下。MultirotorPawnSimApi.cpp// 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// MultirotorPawnSimApi.h virtual std::string getRecordFileLine(bool is_header_line) const override;这段代码的关键点表头与数据列必须一一对应表头行追加了 7 列Latitude/Longitude/Altitude/Pressure/AccX/AccY/AccZ数据行也必须按完全相同的顺序追加 7 个值否则后续解析如 pandas 读入会错位每个值以\t结尾与既有列保持一致的 Tab 分隔约定通过vehicle_api_-getMultirotorState()获取的gps_location直接给出经纬高GPS 传感器输出对应GpsBase::OutputgetBarometerData()与getImuData()的空字符串表示使用载具默认第一个传感器实例。类似的表头与数据行的追加逻辑可以继续扩展例如记录Rotor 转速通过多旋翼状态 API、Lidar 点云通过getLidarData、磁力计getMagnetometerData等已有的字段也可以按需修改或删除。可用的传感器数据获取 API示例中使用的数据均来自载具 API 层。VehicleApiBase实现于 VehicleApiBase.hpp为扩展录制字段提供了丰富的只读接口包括getImuData(imu_name)IMU 输出含linear_acceleration、angular_velocity等见 VehicleApiBase.hppgetBarometerData(barometer_name)气压计输出含pressure、altitude、qnh等见 VehicleApiBase.hppgetGpsData(gps_name)GPS 输出含经纬度、海拔、速度等见 VehicleApiBase.hppgetMagnetometerData(magnetometer_name)磁力计输出getLidarData(lidar_name)Lidar 点云数据。传感器名称传空字符串时默认取该载具上第一个对应类型的传感器。若传感器不存在这些接口会抛出异常因此在定制录制时请确保载具配置settings 中的Sensors段中已启用了相应传感器。录制配置与 API 配合使用修改源码只是定制的一部分录制行为的启停与节奏仍由设置与 API 控制设置项完整说明见 settings.md 的 Recording 章节RecordInterval指定两次抓帧的最小间隔秒数RecordOnMove为true时位姿未变化不记录Folder指定时间戳子目录的父目录绝对路径Enabled为true时仿真启动即自动开始录制Cameras控制各相机抓图PixelsAsFloat: true时以 pfm 格式保存Cameras: []表示只记录物理数据不录图像。多载具场景下可为每个载具分别配置相机与VehicleNameAPI 控制Python 客户端中可调用client.startRecording()启动、client.stopRecording()停止、client.isRecording()查询录制状态见 apis.md 的 Recording APIs 章节。API 与视口中的 R 键 / 红色录制按钮互相联动。常见注意事项必须从源码构建getRecordFileLine是 AirSim Unreal 插件的 C 实现修改后需重新编译插件与工程无法在预编译二进制上热替换保持 Tab 分隔与列数一致表头与数据行的列数、顺序必须严格匹配多一个或少一个\t都会破坏 CSV/Tab 文件的解析末尾字段与ImageFile的关系airsim_rec.txt的最后一列ImageFile由RecordingFile在调用getRecordFileLine后自动追加因此自定义方法返回的字符串末尾无需也不应包含ImageFile列传感器可用性追加传感器字段前确认对应传感器已在载具设置中启用且注意传感器采样率与RecordInterval的匹配文件组织每次录制会生成带时间戳的独立子目录内含airsim_rec.txt与images/多个载具的数据会写入同一文件通过VehicleName列区分。通过上述方法与源码依据你可以完全掌控 AirSim 录制输出的字段集合按自己的数据集规范生成带传感器真值、姿态与控制量的仿真录制数据。相关实现与配套说明可继续查阅 PawnSimApi.cpp、CarPawnSimApi.cpp、RecordingFile.cpp 与 settings.md。赞分享自动驾驶人工智能深度学习强化学习计算机视觉科研【免费下载链接】AirSimOpen source simulator for autonomous vehicles built on Unreal Engine / Unity, from Microsoft AI Research项目地址https://gitcode.com/gh_mirrors/ai/AirSim点击查看免费下载相关推荐3个步骤快速完成SolidWorks到URDF转换机械设计到机器人仿真的终极指南3个步骤快速完成SolidWorks到URDF转换机械设计到机器人仿真的终极指南 你是否还在为从SolidWorks机械设计到ROS机器人仿真的繁琐转换而烦恼机器人3D建模开发工具GoCD制品元数据标准扩展企业自定义字段GoCD制品元数据标准扩展企业自定义字段 引言 在现代软件开发和运维流程中持续集成和持续部署CI/CD工具扮演着至关重要的角色。GoCD作为一款强大的开CI/CDDevOps后端任务调度扩展机制详解MCP Registry服务器扩展字段与自定义元数据终极指南扩展机制详解MCP Registry服务器扩展字段与自定义元数据终极指南 在Model Context Protocol MCP 生态系统中 MCP Reg后端AI Agent工具调用上一篇ik_llama.cpp 源码解析CUDA 非连续 RMS Norm 的实现与性能收益下一篇JBZoo/Utils HTTP工具PHP网络请求和URL处理的实用技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考