airsim_ros_pkgs#

基于 AirSim C++ 客户端库的 ROS 包装器。

设置#

以下步骤适用于 Linux。如果您在 Windows 上运行 AirSim,可以使用适用于 Linux 的 Windows 子系统 (WSL) 来运行 ROS 包装器,请参阅下面的说明。如果您由于某些问题无法或不希望在主机 Linux 上安装 ROS 和相关工具,也可以尝试使用 Docker,请参阅使用 Docker for ROS 包装器中的步骤。

  • 如果您的默认 GCC 版本不是 8 或更高版本(使用gcc --version检查)

    • 安装 gcc >= 8.0.0:sudo apt-get install gcc-8 g++-8
    • 通过gcc-8 --version验证安装
  • Ubuntu 16.04

    • 安装ROS kinetic
    • 安装 tf2 sensor 和 mavros 包:sudo apt-get install ros-kinetic-tf2-sensor-msgs ros-kinetic-tf2-geometry-msgs ros-kinetic-mavros*
  • Ubuntu 18.04

    • 安装ROS melodic
    • 安装 tf2 sensor 和 mavros 包:sudo apt-get install ros-melodic-tf2-sensor-msgs ros-melodic-tf2-geometry-msgs ros-melodic-mavros*
  • Ubuntu 20.04

    • 安装ROS noetic
    • 安装 tf2 sensor 和 mavros 包: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-toolspip install catkin_tools。如果使用 Ubuntu 20.04,请使用 pip install "git+https://github.com/catkin/catkin_tools.git#egg=catkin_tools"

构建#

  • 构建 AirSim
git clone https://github.com/Microsoft/AirSim.git;
cd AirSim;
./setup.sh;
./build.sh;
  • 确保您已按照上述安装页面中的说明设置了 ROS 的环境变量。为方便起见,将source命令添加到您的.bashrc中(将melodic替换为特定版本名称)-
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
  • 构建 ROS 包
cd ros;
catkin build; # or catkin_make

如果您的默认 GCC 版本不是 8 或更高版本(使用gcc --version检查),则编译将失败。在这种情况下,请明确使用gcc-8,如下所示-

catkin build -DCMAKE_C_COMPILER=gcc-8 -DCMAKE_CXX_COMPILER=g++-8

运行#

source devel/setup.bash;
roslaunch airsim_ros_pkgs airsim_node.launch;
roslaunch airsim_ros_pkgs rviz.launch;

注意:如果运行roslaunch airsim_ros_pkgs airsim_node.launch时出现错误,请运行catkin clean并重试

使用 AirSim ROS 包装器#

ROS 包装器由两个 ROS 节点组成 - 第一个是 AirSim 多旋翼 C++ 客户端库的包装器,第二个是简单的 PD 位置控制器。让我们看看这两个节点的 ROS API

AirSim ROS Wrapper 节点#

发布者:#

  • /airsim_node/origin_geo_point airsim_ros_pkgs/GPSYaw 对应于全局 NED 帧的 GPS 坐标。这在 airsim 的 settings.json 文件中,在 OriginGeopoint 键下设置。

  • /airsim_node/VEHICLE_NAME/global_gps sensor_msgs/NavSatFix 这是 airsim 中无人机的当前 GPS 坐标。

  • /airsim_node/VEHICLE_NAME/odom_local_ned nav_msgs/Odometry 相对于起飞点的 NED 帧中的里程计(默认名称:odom_local_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 或浮点图像,具体取决于 settings.json 中请求的图像类型。

  • /tf tf2_msgs/TFMessage

  • /airsim_node/VEHICLE_NAME/altimeter/SENSOR_NAME airsim_ros_pkgs/Altimeter 这是高度、压力和 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 来自有源测距仪(如红外或 IR)的距离测量

  • /airsim_node/VEHICLE_NAME/lidar/SENSOR_NAME sensor_msgs::PointCloud2 LIDAR 点云

订阅者:#

服务:#

参数:#

  • /airsim_node/world_frame_id [string] 设置于:$(airsim_ros_pkgs)/launch/airsim_node.launch 默认值:world_ned 设置为“world_enu”以自动切换到 ENU 帧

  • /airsim_node/odom_frame_id [string] 设置于:$(airsim_ros_pkgs)/launch/airsim_node.launch 默认值:odom_local_ned 如果您将 world_frame_id 设置为“world_enu”,则默认里程计名称将默认为“odom_local_enu”

  • /airsim_node/coordinate_system_enu [boolean] 设置于:$(airsim_ros_pkgs)/launch/airsim_node.launch 默认值:false 如果您将 world_frame_id 设置为“world_enu”,此设置将默认为 true

  • /airsim_node/update_airsim_control_every_n_sec [double] 设置于:$(airsim_ros_pkgs)/launch/airsim_node.launch 默认值:0.01 秒。用于更新无人机里程计和 AirSim 状态以及发送控制命令的计时器回调频率。当前到 Unreal Engine 的 RPClib 接口最大值为 50 Hz。ROS 中的计时器回调以最大速率运行,因此最好不要更改此参数。

  • /airsim_node/update_airsim_img_response_every_n_sec [double] 设置于:$(airsim_ros_pkgs)/launch/airsim_node.launch 默认值:0.01 秒。用于接收 AirSim 中所有相机图像的计时器回调频率。速度将取决于请求的图像数量及其分辨率。ROS 中的计时器回调以最大速率运行,因此最好不要更改此参数。

  • /airsim_node/publish_clock [double] 设置于:$(airsim_ros_pkgs)/launch/airsim_node.launch 默认值:false 如果设置为 true,将发布 ros /clock 主题。

简单 PID 位置控制器节点#

参数:#

  • PD 控制器参数
  • /pd_position_node/kd_x [double]、/pd_position_node/kp_y [double]、/pd_position_node/kp_z [double]、/pd_position_node/kp_yaw [double] 比例增益

  • /pd_position_node/kd_x [double]、/pd_position_node/kd_y [double]、/pd_position_node/kd_z [double]、/pd_position_node/kd_yaw [double] 微分增益

  • /pd_position_node/reached_thresh_xyz [double] 从当前位置到设定点位置的阈值欧拉距离(米)

  • /pd_position_node/reached_yaw_degrees [double] 从当前位置到设定点位置的阈值偏航距离(度)

  • /pd_position_node/update_control_every_n_sec [double] 默认值:0.01 秒

服务:#

  • /airsim_node/VEHICLE_NAME/gps_goal [请求:srv/SetGPSPosition] 目标 GPS 位置 + 偏航角。以绝对高度表示。

  • /airsim_node/VEHICLE_NAME/local_position_goal [请求:srv/SetLocalPosition] 全局 NED 帧中的目标局部位置 + 偏航角。

订阅者:#

  • /airsim_node/origin_geo_point airsim_ros_pkgs/GPSYaw 监听 airsim_node 发布的本站地理坐标。

  • /airsim_node/VEHICLE_NAME/odom_local_ned nav_msgs/Odometry 监听 airsim_node 发布的里程计

发布者:#

全局参数#

  • 动态约束。这些可以在 dynamic_constraints.launch 中更改

    • /max_vel_horz_abs [double] 无人机最大水平速度(米/秒)

    • /max_vel_vert_abs [double] 无人机最大垂直速度(米/秒)

    • /max_yaw_rate_degree [double] 最大偏航率(度/秒)

杂项#

在 Windows 10 上使用 WSL1 或 WSL2 设置构建环境#

这些设置说明描述了如何在 Windows 10 上设置“Ubuntu Bash”(又名“适用于 Linux 的 Windows 子系统”)。

它涉及在 Windows 10 中启用内置的 Windows Linux 环境 (WSL),安装兼容的 Linux OS 镜像,最后像在普通 Linux 系统中一样安装构建环境。

完成后,您将能够像在原生 Linux 机器中一样构建和运行 ros 包装器。

WSL1 vs WSL2#

WSL2 是 Windows10 Linux 子系统的最新版本。它比 WSL1 快很多倍(如果您使用/home/...中的本机文件系统而不是/mnt/...下的 Windows 挂载文件夹),因此在构建代码的速度方面更受青睐。

安装后,您可以根据需要切换 WSL1 或 WSL2 版本。

WSL 设置步骤#
  1. 按照此处的说明进行操作。检查您要使用的 ROS 版本是否受您要安装的 Ubuntu 版本支持。

  2. 恭喜,您现在拥有一个在 Windows 下工作的 Ubuntu 子系统,您现在可以前往Ubuntu 16 / 18 说明,然后前往如何在 Windows 上运行 Airsim,在 WSL 上运行 ROS 包装器

注意

您可以通过在 Windows 上安装 VcXsrv 来运行 XWindows 应用程序(包括 SITL)。要使用它,请从 Windows 开始菜单中找到并运行 XLaunch。在第一个弹出窗口中选择 Multiple Windows,在第二个弹出窗口中选择 Start no client,在第三个弹出窗口中选择 Clipboard不要选择 Native Opengl(如果您无法连接,请选择 Disable access control)。您需要设置 DISPLAY 变量指向您的显示器:在 WSL 中是 127.0.0.1:0,在 WSL2 中将是 PC 网络端口的 IP 地址,可以使用下面的代码设置。此外,在 WSL2 中,您可能需要禁用公共网络的防火墙,或创建例外,以便 VcXsrv 与 WSL2 通信。

export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0

提示

  • 如果您将此行添加到您的 ~/.bashrc 文件中,则无需再次运行此命令
  • 对于代码编辑,您可以在 WSL 中安装 VSCode。
  • Windows 10 包含“Windows Defender”病毒扫描程序。它会大大减慢 WSL 的速度。禁用它会大大提高磁盘性能,但会增加您感染病毒的风险,因此请自行承担风险。以下是许多资源/视频之一,展示了如何禁用它:如何在 Windows 10 上禁用或启用 Windows Defender
WSL 和 Windows 10 之间的文件系统访问#

在 WSL 中,Windows 驱动器在 /mnt 目录中引用。例如,要列出您的文档文件夹中的文档 () 文档文件夹

`ls /mnt/c/'Documents and Settings'/<username>/Documents`
or
`ls /mnt/c/Users/<username>/Documents`

在 Windows 中,WSL 分发的文件位于(在 Windows 资源管理器地址栏中输入)

\\wsl$\<分发名称> 例如 \\wsl$\Ubuntu-18.04

如何在 Windows 上运行 Airsim,在 WSL 上运行 ROS 包装器#

对于 WSL 1 执行:export WSL_HOST_IP=127.0.0.1,对于 WSL 2:export WSL_HOST_IP=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}') 现在,如Linux 运行部分所示,执行以下操作

source devel/setup.bash
roslaunch airsim_ros_pkgs airsim_node.launch output:=screen host:=$WSL_HOST_IP
roslaunch airsim_ros_pkgs rviz.launch

将 Docker 用于 ROS#

tools 目录中存在一个 Dockerfile。要构建 airsim-ros 镜像 -

cd tools
docker build -t airsim-ros -f Dockerfile-ROS .

要运行,请替换下面的 AirSim 文件夹路径 -

docker run --rm -it --net=host -v <your-AirSim-folder-path>:/home/testuser/AirSim airsim-ros:latest bash

上述命令将 AirSim 目录挂载到容器内的 home 目录。您在主机上对源文件所做的任何更改都将在容器内可见,这对于开发和测试非常有用。现在按照构建中的步骤编译和运行 ROS 包装器。