Airsim环境下的px4硬件在环仿真


前言

提示:本文部分大部分内容都是通过多次实验测试总结得出,有些地方比较玄学,也不是很严谨,希望懂得的小伙伴能在评论区指出。
本文总结在使用Airsim进行px4的硬件在环仿真的过程中踩的一些坑,使用硬件在环的目的是为了测试一个mpc算法(uzh开源的一个mpc控制器,我其实不是很懂mpc,只是协助搭建了px4硬件在环仿真平台)。
涉及的内容包括px4在aisim环境中的硬件在环仿真px4的offboard模式实践


1、Airsim和硬件在环介绍

Airsim是微软团队研发的一款针对无人机,汽车等的开源仿真平台,依托于Ue4引擎,拥有很逼真的场景。经过将近5年的发展(截至本文),已经相对成熟了,airsim里面包含了丰富的传感器和API接口,可以满足大部分需求。
在应用方面,airsim在这几年常被用于视觉SLAM的仿真,相比于传统的Gzebo,虚幻引擎能提供更加真实场景,这对于视觉还是很友好的。关于在airsim中进行vins的仿真,如果有时间也会出文章。

  1. Airsim的安装问题可以参看AirSim官网,强烈建议在windows下安装。ubuntu下的版本有很多问题,不是很稳定,会出现同样的配置文件在ubuntu下不能运行,在window下可以运行的情况(对,我就是在这里浪费了很多时间)。注意虚幻4很大,好几十个G,一定要留够空间。
  2. 什么是硬件在环?Airsim的硬件在环策略: 关于px4的硬件在环怎么配置,可以看官网的介绍。Airsim的硬件在环策略其实就是将传感器的数据传给飞控,飞控里运行它自己的控制器,然后将电机信号返回给aisim进行仿真,思路很简单,在Airsim的论文中有更详细的介绍。
    Aisim论文中的硬件在环仿真框架

2、硬件在环测试的准备工作(硬件和软件)

本文的硬件在环硬件配置:两台电脑(一台windows跑airsim,一台ubuntu跑mavros),px4,usb转ttl接口(这个需要自己制作,很简单),遥控器和接收机(当然也可以使用aisim的api控制)。
整体框架是这样的:
仿真框架

2.1 usb-ttl转接线的制作:

usbttl转接线用于连接px4和ubuntu系统的电脑,用于和mavros通讯。
关于usbttl端口的接线:
在这里插入图片描述
这里是px4的telem端口和ch340型号的ttl端口的介绍,主要就是注意TX和RT要反着接,另外这个连接线的长度不能太长,经过测试,确实会影响到端口的波特率(虽然影响不是很大)。

2.2 px4的ttl端口波特率设置

在这里插入图片描述
这是对mav_x_rate这个参数的解释,所有消息的最大rate都设置为了MAV_X_RATE,当总和大于最大上限的时候,会被限流,默认值是80000.
在这里插入图片描述注意在连接mavros的时候,如果改了波特率,需要指定serial,我这里是ttyACM0(默认的波特率应该是57600),ttyUSB0也是常见的,可以用 ls /dev/tty*查看你插的usb是对应的哪个。
在这里插入图片描述

roslaunch mavros px4.launch fcu_url:=serial:///dev/ttyACM0:921600

3 硬件在环测试过程中的问题

  1. 第一个是坐标系的问题,AirSim中是NED,在配置文件中可以设置飞机的初始位置和姿态:

X, Y, Z, Yaw, Roll, Pitch: These elements allows you to specify the initial position and orientation of the vehicle. Position is in NED coordinates in SI units with origin set to Player Start location in Unreal environment. The orientation is specified in degrees.

  1. MAVROS中的坐标系是ENU(mavros中的世界坐标系是ENU),飞机机体坐标系是FLU(前左上),所以机头的朝向正东的时候,姿态是0001(四元数)。
  2. MAVROS的local_position的频率默认是30还是40(忘了),但是MPC需要一个较高的local_position的频率,所以需要在启动mavros之后用mavcmd提高频率,我这里给的1000(μs),其实根本达不到,所以会给最大频率。
rosrun mavros mavcmd long 511 31 1000 0 0 0 0 0
rosrun mavros mavcmd long 511 32 1000 0 0 0 0 0
  1. 用ssh控制机载电脑运行节点的时候,注意不要在terminal上高频的输出东西(比如几百hz的频率),会出现节点卡死的情况。(这个测试主要是为了模拟实机测试的时候,用PC端ssh控制机载电脑运行mpc)

4 AirSim ROS Wrapper

airsim运行在window系统上,但是我们的大多在ubuntu系统上运行ros,官网给了WSL的方案来解决这个问题。其实我们可以通过局域网(比如手机的热点)来连接ros节点和windows上运行的airsim。这里需要进行一些简单的设置:

1.在setting文件中加上“LocalHostIp”这一项,后面的ip写运行airsim的这台主机的ip。
2.在ubuntu上安装编译好airsim的ros包,安装教程在官网有。先setup.bash,然后build.sh,然后进入ros目录,catkin_make(或者catkin build)。在catkin_make的时候会报找不到#include这个头文件,需要在报错文件中做一下修改:

#include <filesystem>
namespace fs = std::filesystem;

改成:

#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;

3.在ubuntu系统的Document下面建一个AirSim文件夹,把window下的setting文件拷贝一份放在这里。
4.ubuntu中启动ros节点连接window中运行的airsim:

roslaunch airsim_ros_pkgs airsim_node.launch output:=screen host:=$WSL_HOST_IP

$WSL_HOST_IP这个就是你在setting文件中“LocalHostIp”指定的ip,比如我的setting中是这样设置的:

{
    
    
  "SettingsVersion": 1.2,
  "SimMode": "Multirotor",
  "LocalHostIp": "192.168.55.***",
  "Vehicles": {
    
    
    "PX4": {
    
    
      
      "VehicleType": "PX4Multirotor",
      "UseSerial": true,
      "LockStep": true,
      "ClockType": "SteppableClock",
      "DefaultSensors": {
    
    
        "Barometer": {
    
    
        ***下面省略

如果ros节点一直显示waiting for connected 那就是没连上,检测下连接的网络是否是局域网。

5 AirSim ros节点中的真实轨迹的坐标系说明

关于AirSim ROS Wrapper Node的详细内容可以自己看官网,这里只对其中的真实轨迹这个topic做一些解释,主要涉及到了它的坐标系规定,同时和Mavros中的坐标系规定做了一些比较。
官网文档中关于ros发布的真实轨迹的解释:

/airsim_node/VEHICLE_NAME/odom_local_ned (nav_msgs/Odometry Odometry) in NED frame (default name: odom_local_ned, launch name and frame type are configurable) wrt take-off point.

这个真实轨迹的坐标系规定是NED(北东地,即x正方向朝北,y向东,z指向地),以启动airsim时的起飞点作为坐标系原点。airsim中的机体坐标系的定义是FRD(前右下,也就是x轴朝前,y轴正方向向右,z轴正方向向下)。
在Mavros中,/mavros/local_position/pose这个topic是全局坐标系下飞机的位姿,这个坐标系的规定是ENU(东北天),而机体坐标系的规定是FLU(前左上,x正方向朝前,y向左,z朝上)。
下面有一个简图帮助理解:请添加图片描述
所以在airsim仿真的时候,开始时机体朝北,那airsim的真实轨迹中的姿态是(0,0, 0, 0)四元数,但mavros中的local_position不是,如果起飞时机头朝东,则mavros中的local_position的姿态是(0,0,0,0)。

猜你喜欢

转载自blog.csdn.net/weixin_42681311/article/details/126237796