- 自动驾驶
- 人工智能
- 深度学习
- 强化学习
- 计算机视觉
- 科研
【免费下载链接】AirSim
Open source simulator for autonomous vehicles built on Unreal Engine / Unity, from Microsoft AI & Research
AirSim 官方在ros/src/airsim_ros_pkgs目录下提供了一个基于 AirSim C++ 客户端库的 ROS 封装包,它让 ROS 1(Kinetic / Melodic / Noetic)程序可以像操作真实无人机一样订阅 AirSim 中的里程计、传感器与图像数据,并发布速度指令、调用起飞/降落/重置等服务,从而无缝衔接基于 ROS 的自主飞行算法。本文以仓库中的官方文档 docs/airsim_ros_pkgs.md 为主体,结合 airsim_ros_pkgs 包 的源码、launch 文件与消息定义,完整讲解环境搭建、编译运行、两个 ROS 节点的完整 API 与 PD 位置控制器原理,读完你就能在自己的机器上跑通 AirSim + ROS 的仿真闭环。
说明:
ros/src/airsim_ros_pkgs/README.md仅是跳转占位页,本仓库中该文档的完整正文位于 docs/airsim_ros_pkgs.md,下文内容即以其为骨架展开。
一、包结构总览:两个节点与三类接口
从仓库目录看,该包是一个标准的 catkin 包(package.xml,名称为airsim_ros_pkgs,MIT 许可),其功能可概括为:
- 一个 ROS 封装节点
airsim_node:封装 AirSim 的MultirotorRpcLibClient/CarRpcLibClient(见 airsim_ros_wrapper.h),负责把 AirSim 中的状态、传感器、图像、LIDAR 数据发布到 ROS 话题,并把 ROS 话题上的控制指令下发到 AirSim。 - 一个简单的 PD 位置控制器节点
pd_position_controller_simple_node:监听里程计与 GPS 原点,通过服务接收位置目标,输出速度指令(VelCmd)驱动airsim_node。 - 消息与服务定义:9 个自定义 msg(msg 目录)与 7 个自定义 srv(srv 目录),在 CMakeLists.txt 中通过
add_message_files/add_service_files注册。
从源码 airsim_node.cpp 可以看到入口逻辑:读取私有参数host_ip(默认localhost),构造AirsimROSWrapper,然后按需启动图像与 LIDAR 的异步回调队列 spinner,最后ros::spin()。
二、环境准备:支持平台与依赖安装
官方文档明确说明以下步骤面向Linux;如果 AirSim 运行在 Windows 上,可以在WSL1/WSL2中运行 ROS 封装(详见后文“Windows10 + WSL 方案”);如果不方便在宿主机安装 ROS,还可以用 Docker(见“Docker 方案”)。
前提:GCC 版本 >= 8(用gcc --version检查)。如果默认 GCC 低于 8,需要安装并显式指定:
sudo apt-get install gcc-8 g++-8 gcc-8 --version # 验证安装按 Ubuntu 版本安装 ROS 及依赖包(核心依赖是 tf2 sensor/geometry 与 mavros 系列):
- Ubuntu 16.04 + ROS Kinetic
sudo apt-get install ros-kinetic-tf2-sensor-msgs ros-kinetic-tf2-geometry-msgs ros-kinetic-mavros* - Ubuntu 18.04 + ROS Melodic
sudo apt-get install ros-melodic-tf2-sensor-msgs ros-melodic-tf2-geometry-msgs ros-melodic-mavros* - Ubuntu 20.04 + ROS Noetic
sudo apt-get install ros-noetic-tf2-sensor-msgs ros-noetic-tf2-geometry-msgs ros-noetic-mavros*
安装 catkin_tools(编译工作区用):
sudo apt-get install python-catkin-tools # 或 pip 安装 pip install catkin_tools # Ubuntu 20.04 上推荐从源码安装 pip install "git+https://github.com/catkin/catkin_tools.git#egg=catkin_tools"从 package.xml 的依赖声明看,该包还依赖cv_bridge、image_transport、geographic_msgs、nav_msgs、sensor_msgs、geometry_msgs、std_srvs、tf2*、mavros_msgs以及运行时依赖joy(手柄控制),这些会在 catkin 编译时自动校验。
三、编译:先编 AirSim,再编 ROS 工作区
第一步:编译 AirSim 本体(封装包直接以源码方式链接 AirSim 的AirLib、MavLinkCom与rpclib,见 CMakeLists.txt 中的add_subdirectory):
git clone https://github.com/Microsoft/AirSim.git cd AirSim ./setup.sh ./build.sh第二步:把 ROS 环境变量写入~/.bashrc(把melodic换成你实际的 ROS 版本名):
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc source ~/.bashrc第三步:进入ros目录编译工作区:
cd ros catkin build # 或 catkin_make注意:如果默认 GCC 不是 8 或更高版本,编译会失败,此时需显式指定 gcc-8/g++-8:
catkin build -DCMAKE_C_COMPILER=gcc-8 -DCMAKE_CXX_COMPILER=g++-8
编译产物为两个可执行节点airsim_node与pd_position_controller_simple_node,以及共享库airsim_ros、pd_position_controller_simple、airsim_settings_parser,这些都在 CMakeLists.txt 中通过add_executable/add_library/install声明。
四、运行:启动封装节点与 RViz
确保 AirSim 仿真环境(Unreal/Unity 端)已启动后,运行:
source devel/setup.bash roslaunch airsim_ros_pkgs airsim_node.launch roslaunch airsim_ros_pkgs rviz.launchairsim_node.launch(launch/airsim_node.launch)启动airsim_node,并 include 了 static_transforms.launch,后者用tf的static_transform_publisher发布world_ned -> world_enu的静态变换(旋转参数1.57 0 3.14,频率 100Hz)。rviz.launch(launch/rviz.launch)以包内预置的 rviz/default.rviz 配置启动 RViz,便于可视化 TF、里程计与点云。- 常见问题:如果
roslaunch airsim_ros_pkgs airsim_node.launch报错,先执行catkin clean再重新编译。
airsim_node.launch支持的关键启动参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
output | log | 节点输出方式(log或screen) |
publish_clock | false | 是否发布 ROS/clock话题 |
is_vulkan | true(launch 中硬编码为false) | 是否为 Vulkan 渲染 |
host | localhost | AirSim 服务端 IP,映射为节点参数host_ip |
launch 内还设置了三个核心定时器参数(见下表),并可通过host参数向节点传递host_ip,供 airsim_node.cpp 读取以连接远程 AirSim 实例。
五、airsim_node 封装节点:完整 ROS API
封装节点围绕“发布感知数据 + 接收控制指令 + 提供服务”三组接口展开。所有带VEHICLE_NAME的话题名,实际会替换为 AirSim settings.json 中配置的车辆名(例如drone_1)。
5.1 发布者(Publishers)
| 话题 | 消息类型 | 内容说明 |
|---|---|---|
/airsim_node/origin_geo_point | airsim_ros_pkgs/GPSYaw | 全局 NED 坐标系对应的 GPS 坐标,来自 AirSim settings.json 的OriginGeopoint键;源码中由airsim_client_->getHomeGeoPoint("")获取(airsim_ros_wrapper.cpp) |
/airsim_node/VEHICLE_NAME/global_gps | sensor_msgs/NavSatFix | 无人机在 AirSim 中的当前 GPS 坐标 |
/airsim_node/VEHICLE_NAME/odom_local_ned | nav_msgs/Odometry | 相对于起飞点的 NED 坐标系里程计(话题名与坐标系类型可配置,见参数表) |
/airsim_node/VEHICLE_NAME/CAMERA_NAME/IMAGE_TYPE/camera_info | sensor_msgs/CameraInfo | 相机内参信息 |
/airsim_node/VEHICLE_NAME/CAMERA_NAME/IMAGE_TYPE | sensor_msgs/Image | 图像,RGB 或 float 类型取决于 settings.json 中请求的图像类型 |
/tf | tf2_msgs/TFMessage | TF 变换树 |
/airsim_node/VEHICLE_NAME/altimeter/SENSOR_NAME | airsim_ros_pkgs/Altimeter | 高度计读数(altitude、pressure、qnh) |
/airsim_node/VEHICLE_NAME/imu/SENSOR_NAME | sensor_msgs/Imu | IMU 数据 |
/airsim_node/VEHICLE_NAME/magnetometer/SENSOR_NAME | sensor_msgs/MagneticField | 磁力计/罗盘磁场矢量 |
/airsim_node/VEHICLE_NAME/distance/SENSOR_NAME | sensor_msgs/Range | 距离传感器(如红外测距)读数 |
/airsim_node/VEHICLE_NAME/lidar/SENSOR_NAME | sensor_msgs/PointCloud2 | LIDAR 点云,由airsim_client_lidar_.getLidarData(...)获取并转换(airsim_ros_wrapper.cpp) |
/airsim_node/VEHICLE_NAME/car_state | airsim_ros_pkgs/CarState | 车辆状态(位姿/速度/档位/rpm/手刹),见 airsim_ros_wrapper.cpp |
/airsim_node/VEHICLE_NAME/environment | airsim_ros_pkgs/Environment | 环境真值(位置、气压、温度、空气密度、重力),来自simGetGroundTruthEnvironment |
里程计话题的命名与坐标系在 airsim_ros_wrapper.cpp 中按以下规则联动:默认world_frame_id=world_ned、odom_frame_id=odom_local_ned;一旦把world_frame_id设为world_enu,odom 名会自动变为odom_local_enu,coordinate_system_enu也自动置为true。
5.2 订阅者(Subscribers)
| 话题 | 消息类型 | 内容说明 |
|---|---|---|
/airsim_node/vel_cmd_body_frame | airsim_ros_pkgs/VelCmd | 机体坐标系速度指令。vehicle_name字段留空即可(源码中 VelCmd 的该字段已被注释掉,见 VelCmd.msg) |
/airsim_node/vel_cmd_world_frame | airsim_ros_pkgs/VelCmd | 世界坐标系速度指令 |
/gimbal_angle_euler_cmd | airsim_ros_pkgs/GimbalAngleEulerCmd | 云台欧拉角设定(含camera_name、vehicle_name) |
/gimbal_angle_quat_cmd | airsim_ros_pkgs/GimbalAngleQuatCmd | 云台四元数设定 |
/airsim_node/VEHICLE_NAME/car_cmd | airsim_ros_pkgs/CarControls | 油门、刹车、转向与档位选择,支持自动/手动变速箱,示例见 scripts/car_joy.py |
CarControls消息字段(CarControls.msg)依次为:throttle(油门)、brake(刹车)、steering(转向)、handbrake(手刹)、manual(是否手动档)、manual_gear(手动档位,-1倒档、0空档、>=1前进档)、gear_immediate(是否立即换档)。car_cmd_cb(airsim_ros_wrapper.cpp)在互斥锁保护下将其映射到CarApiBase::CarControls后下发。
速度指令最终在定时器回调中通过get_multirotor_client()->moveByVelocityAsync(x, y, z, vel_cmd_duration_, ...)发送给 AirSim(airsim_ros_wrapper.cpp),单次速度指令持续时间vel_cmd_duration_ = 0.05s。
5.3 服务(Services)
| 服务 | 请求类型 | 说明 |
|---|---|---|
/airsim_node/VEHICLE_NAME/land | airsim_ros_pkgs/Land | 降落指定无人机,请求字段waitOnLastTask |
/airsim_node/takeoff | airsim_ros_pkgs/Takeoff | 起飞 |
/airsim_node/reset | airsim_ros_pkgs/Reset | 重置所有无人机 |
此外源码还注册了多机相关服务(airsim_ros_wrapper.cpp):all_robots/land、group_of_robots/takeoff、all_robots/vel_cmd_body_frame、all_robots/vel_cmd_world_frame、group_of_robots/vel_cmd_body_frame、group_of_robots/vel_cmd_world_frame等,对应 TakeoffGroup.srv 与 VelCmdGroup.msg(string[] vehicle_names批量下发)。
5.4 参数(Parameters)
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
/airsim_node/world_frame_id | string | world_ned | 在 airsim_node.launch 中设置;设为world_enu自动切换到 ENU 坐标系 |
/airsim_node/odom_frame_id | string | odom_local_ned | 里程计坐标系名;world_frame_id为world_enu时自动默认odom_local_enu |
/airsim_node/coordinate_system_enu | bool | false | 是否使用 ENU 坐标系;world_frame_id设为world_enu时自动置 true |
/airsim_node/update_airsim_control_every_n_sec | double | 0.01s | 控制定时器回调周期:更新里程计/状态并下发控制指令。当前 RPClib 到 Unreal 引擎的接口最高约 50Hz,ROS 定时器回调会以最大可能速率运行,官方建议不要改动此参数 |
/airsim_node/update_airsim_img_response_every_n_sec | double | 0.01s | 图像定时器回调周期:接收 AirSim 所有相机的图像。实际速度取决于请求的图像数量与分辨率,同样建议不要改动 |
/airsim_node/publish_clock | double | false | 为true时发布 ROS/clock话题(仿真时钟同步) |
launch 文件里实际设置的默认值为:update_airsim_img_response_every_n_sec=0.05、update_airsim_control_every_n_sec=0.01、update_lidar_every_n_sec=0.01(见 airsim_node.launch)。图像与 LIDAR 的回调队列在 airsim_node.cpp 中分别通过img_async_spinner_与lidar_async_spinner_异步驱动,避免阻塞主控制回路。
六、PD 位置控制器节点:原理与 API
封装包的第二个节点是“简单 PD 位置控制器”(pd_position_controller_simple_node),对应源码 pd_position_controller_simple.cpp 与头文件 pd_position_controller_simple.h。
6.1 工作原理(源码级解读)
- 订阅
airsim_node发布的里程计/airsim_node/VEHICLE_NAME/odom_local_ned和原点 GPS/airsim_node/home_geo_point,在airsim_odom_cb与home_geopoint_cb中分别缓存当前位置与 GPS 原点(并用GeodeticConverter::setHome初始化大地坐标转换,见 pd_position_controller_simple.cpp)。 - 通过服务
/airsim_node/VEHICLE_NAME/gps_goal或/airsim_node/VEHICLE_NAME/local_position_goal接收目标点。GPS 目标会先由geodetic2Ned(...)(ETH 库)或EarthUtils::GeodeticToNedFast(...)(AirLib 快速近似)转换为 NED 局部坐标(pd_position_controller_simple.cpp)。 - 定时器回调(默认 0.01s)中计算误差:位置误差
target - current,偏航误差用math_common::angular_dist求最小角距;然后按vel = kp * error + kd * prev_error计算速度指令,其中比例项用当前误差、微分项用上一拍误差(pd_position_controller_simple.cpp)。 - 通过
enforce_dynamic_constraints对水平速度、垂直速度与偏航速率做限幅,最后把VelCmd发布到/airsim_node/VEHICLE_NAME/vel_cmd_world_frame,由airsim_node转发给 AirSim(pd_position_controller_simple.cpp)。 - 当三维欧氏距离误差小于
reached_thresh_xyz且偏航角差小于reached_yaw_degrees时,判定“到达目标”,此后保持在目标位姿悬停。
6.2 PD 参数(Parameters)
在 position_controller_simple.launch 中配置,均属节点私有参数(~):
| 参数 | 类型 | 默认值(launch 示例) | 说明 |
|---|---|---|---|
/pd_position_node/kp_x | double | 0.30 | x 方向比例增益 |
/pd_position_node/kp_y | double | 0.30 | y 方向比例增益 |
/pd_position_node/kp_z | double | 0.30 | z 方向比例增益 |
/pd_position_node/kp_yaw | double | 0.30 | 偏航比例增益 |
/pd_position_node/kd_x | double | 0.05 | x 方向微分增益 |
/pd_position_node/kd_y | double | 0.05 | y 方向微分增益 |
/pd_position_node/kd_z | double | 0.05 | z 方向微分增益 |
/pd_position_node/kd_yaw | double | 0.05 | 偏航微分增益 |
/pd_position_node/reached_thresh_xyz | double | 0.1m | 判定“到达”的三维欧氏距离阈值 |
/pd_position_node/reached_yaw_degrees | double | 5.0° | 判定“到达”的偏航角差阈值 |
/pd_position_node/update_control_every_n_sec | double | 0.01s | 控制更新周期 |
头文件中定义的代码级默认值(pd_position_controller_simple.h)为:kp=0.5、kd=0.1、
reached_thresh_xyz=0.5、reached_yaw_degrees=5.0;launch 文件会用更保守的一组值覆盖。
6.3 控制器服务与订阅
| 类型 | 名称 | 说明 |
|---|---|---|
| 服务 | /airsim_node/VEHICLE_NAME/gps_goal | 目标 GPS 位置 + 偏航,请求字段latitude/longitude/altitude/yaw/vehicle_name,高度为绝对高度(SetGPSPosition.srv)。async=false且 30 秒内到达时返回success=true |
| 服务 | /airsim_node/VEHICLE_NAME/local_position_goal | 目标局部位置 + 偏航,请求字段x/y/z/yaw/vehicle_name,坐标系为全局 NED(SetLocalPosition.srv),z为 NED 下方向(向下为正) |
| 订阅 | /airsim_node/origin_geo_point | 监听airsim_node发布的起点 GPS 坐标(用于 GPS→NED 转换) |
| 订阅 | /airsim_node/VEHICLE_NAME/odom_local_ned | 监听airsim_node发布的里程计 |
| 发布 | /vel_cmd_world_frame | 向airsim_node发送速度指令 |
此外源码还提供了local_position_goal/override与gps_goal/override两个“覆盖式”服务(pd_position_controller_simple.cpp),可无视“正在执行上一个目标”的互斥逻辑,直接改写目标点。
6.4 全局动态约束参数
在 dynamic_constraints.launch 中配置(DynamicConstraints::load_from_rosparams从全局命名空间读取,见 pd_position_controller_simple.cpp):
| 参数 | 类型 | launch 示例值 | 说明 |
|---|---|---|---|
/max_vel_horz_abs | double | (launch 中被注释) | 最大水平速度(米/秒) |
/max_vel_vert_abs | double | 2.0(launch 中重复声明,后值覆盖前值) | 最大垂直速度(米/秒) |
/max_yaw_rate_degree | double | 1.0 | 最大偏航角速度(度/秒) |
注意:
dynamic_constraints.launch中第 3、4 行重复声明了max_vel_vert_abs(依次为10.0与2.0),按 rosparam 语义后者生效。头文件中的代码级默认值(pd_position_controller_simple.h)为:max_vel_horz_abs=1.0、max_vel_vert_abs=0.5、max_yaw_rate_degree=10.0。该 launch 还定义了云台角度限幅参数(gimbal_front_center_max/min_pitch/yaw/roll)。限幅逻辑在enforce_dynamic_constraints中对速度矢量按范数等比缩放实现。
6.5 一键启动组合
- airsim_all.launch:依次 include
airsim_node.launch+dynamic_constraints.launch+position_controller_simple.launch,一次拉起封装节点、动态约束与 PD 控制器,是无人机闭环控制的推荐入口。 - airsim_with_simple_PD_position_controller.launch:与
airsim_all.launch内容相同,等价别名。 - airsim_car_with_joy_control.launch:车模式 + 手柄控制,启动
joy_node与car_joy,并预置world_frame_id=world_enu、coordinate_system_enu=true。 - airsim_car_with_joy_control_auto.launch:同上,但
car_joy的manual_transmission设为false,即自动变速箱模式。
七、车辆(Car)手柄控制:car_joy.py 实战
对于地面车辆,包内提供了 Python 脚本 scripts/car_joy.py,把 ROS 的joy话题事件翻译成CarControls并发布到/airsim_node/drone_1/car_cmd(默认话题,可通过~car_control_topic覆盖)。
脚本关键逻辑:
- 摇杆
axes[1]控制油门/刹车(正值给油门、负值给刹车,~throttle_brake_sign可反转),axes[2]经~max_curvature(默认 0.75)缩放后控制转向,~steer_sign(默认 -1)决定转向方向。 - 按键 0~5 分别对应前进、倒车、空档、驻车、降档、升档(索引均可通过私有参数配置;
~nuetral_button_index为兼容旧版拼写的别名)。 - 档位语义:
-1倒档、0空档、>=1前进档;手动模式(~manual_transmission=true)下用升/降档键逐级换挡,自动模式(false)下直接挂到~auto_gear_max(默认 5)。 - 驻车时置
handbrake=true并把档位置 0;发布频率由~update_rate_hz(默认 20Hz)控制,数据用互斥锁保护以支持异步回调。
使用前需先运行rosrun joy joy_node提供手柄原始数据。
八、Windows10 + WSL1/WSL2 方案
官方文档提供了在 Windows 上运行 ROS 封装的两条路径:一是用 WSL 跑封装节点、Windows 跑 AirSim;二是用 Docker。
8.1 WSL1 与 WSL2 的选择
- WSL2是较新版本,在
/home/...原生文件系统上工作时比 WSL1 快很多(远快于/mnt/...下的 Windows 挂载盘),官方强烈推荐用它编译代码。 - 安装完成后可在 WSL1 / WSL2 之间自由切换。
8.2 设置步骤
- 按微软官方指引启用 WSL 并安装 Linux 发行版;确保所选 Ubuntu 版本支持你要装的 ROS 版本。
- 进入 Ubuntu 子系统后,按前面“环境准备”与“编译”章节的 Linux 步骤执行即可。
8.3 WSL 中运行图形程序(X11)
可以在 Windows 上安装VcXsrv后在 WSL 中运行 XWindows 应用(包括 SITL):
- 从开始菜单运行
XLaunch。 - 第一个弹窗选
Multiple Windows,第二个弹窗选Start no client,第三个弹窗只勾选Clipboard;不要选Native Opengl(若连不上再选Disable access control)。 - 设置 DISPLAY 环境变量:WSL1 下为
127.0.0.1:0;WSL2 下用下面的命令自动探测:export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0把该行加入
~/.bashrc可免去重复执行。WSL2 下还可能需要为公共网络关闭防火墙或添加例外,否则 VcXsrv 无法与 WSL2 通信。 - 建议在 WSL 内安装 VSCode 进行代码编辑;Windows Defender 会拖慢 WSL 磁盘性能,可自行权衡是否关闭。
8.4 WSL 与 Windows 的文件互访
- 在 WSL 内访问 Windows 盘:
ls /mnt/c/Users/<username>/Documents - 在 Windows 资源管理器地址栏访问 WSL 文件:
\\wsl$\<distribution name>,例如\\wsl$\Ubuntu-18.04
8.5 在 Windows 跑 AirSim、WSL 跑 ROS 封装
- 设置宿主机 IP:WSL1 用
export WSL_HOST_IP=127.0.0.1;WSL2 用export WSL_HOST_IP=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')。 - 像 Linux 一样启动封装,并通过
host参数指定该 IP:
source devel/setup.bash roslaunch airsim_ros_pkgs airsim_node.launch output:=screen host:=$WSL_HOST_IP roslaunch airsim_ros_pkgs rviz.launchhost参数最终进入节点的host_ip参数(见 airsim_node.cpp),驱动MultirotorRpcLibClient/CarRpcLibClient连接对应 IP 上的 AirSim RPC 服务。
九、Docker 方案
仓库 tools/Dockerfile-ROS 提供了一个基于ubuntu:18.04的镜像定义:创建免密 sudo 用户testuser,并通过 tools/install_ros_deps.sh 安装 ROS 依赖。
构建镜像:
cd tools docker build -t airsim-ros -f Dockerfile-ROS .运行容器(把<your-AirSim-folder-path>换成你的 AirSim 目录绝对路径):
docker run --rm -it --net=host -v <your-AirSim-folder-path>:/home/testuser/AirSim airsim-ros:latest bash命令把宿主机 AirSim 目录挂载到容器内/home/testuser/AirSim,宿主上的源码改动会即时反映到容器内,方便开发调试。随后按“编译”章节步骤在容器内编译并运行 ROS 封装即可。
十、典型使用流程小结
- 启动 AirSim 仿真(Unreal/Unity 端),并在其 settings.json 中配置车辆与相机、设置
OriginGeopoint。 - 按本文第二、三节完成 GCC/ROS/catkin_tools 安装与
catkin build编译。 roslaunch airsim_ros_pkgs airsim_all.launch一次性启动封装节点 + PD 控制器 + 动态约束。- 用
rosservice call调用起飞与位置目标服务,或在 RViz 中观察里程计、TF 与传感器话题。 - 需要手柄驾驶车辆时,改用
airsim_car_with_joy_control.launch(或_auto版本)。
相关参考资料:docs/airsim_ros_pkgs.md(本文文档主体)、ros/src/airsim_ros_pkgs(包源码)、airsim_tutorial_pkgs(配套的仿真教程包)、docs/code_structure.md(仓库结构总览)。
- 自动驾驶
- 人工智能
- 深度学习
- 强化学习
- 计算机视觉
- 科研
【免费下载链接】AirSim
Open source simulator for autonomous vehicles built on Unreal Engine / Unity, from Microsoft AI & Research
相关推荐
AirSim ROS 封装(airsim_ros_pkgs):从环境搭建到多旋翼/车辆控制的完整实战指南
AirSim ROS 封装(airsim_ros_pkgs):从环境搭建到多旋翼/车辆控制的完整实战指南 导读 airsim_ros_pkgs 是 AirSim
自动驾驶人工智能深度学习强化学习计算机视觉科研从零搭建Autoware高效开发环境:ROS 2包结构管理指南
从零搭建Autoware高效开发环境:ROS 2包结构管理指南 Autoware作为全球领先的自动驾驶开源项目,其基于ROS 2的模块化架构为开发者提供了强大的
自动驾驶Google Cartographer ROS API 完全指南
Google Cartographer ROS API 完全指南 概述 Google Cartographer 是一个开源的实时同步定位与地图构建 SLAM 系
机器人ROS
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考