自主飞行之入门

1.ROS

ROS官网: 维基

ROS是用于开发复杂的分布式机器人系统的广泛使用的框架.

a. 安装

主要参考: 官网安装说明

在飞机上的机载计算机TX2上已经安装好了ROS.

如果要在PC上面使用ROS,我们建议使用Ubuntu Linux系统.Windows系统下面可以使用VMware虚拟机,Mac系统可以使用 VirtualBox 或者是 Parallels Desktop Lite

小技巧

我们建议使用Ubuntu16.04与之相对应的ROS版本Kinetic.

b.基本概念

节点(nodes):

主要参考来源: ROS节点

ROS节点是一个特殊的程序,通常使用Python或者C++编写,可以通过ROS主题和ROS服务与其他节点进行通信.将复杂的机器人系统划分为孤立的节点具有某些优点:减少代码的耦合性,提高可重用性和可靠性

许多机器人库和驱动程序都是以ROS节点的形式执行.

为了将普通程序变成ROS节点,请包含rospy或roscpp库,并插入初始化代码.

2.MAVROS

3.px4_command介绍

px4_command功能包是一个基于PX4开源固件及Mavros功能包的开源项目,旨在为PX4开发者提供更加简洁快速的开发体验。 目前已集成无人机外环控制器修改、目标追踪、激光SLAM定位、双目V-SLAM定位、激光避障等上层开发代码、后续将陆续推 出涵盖任务决策、路径规划、滤波导航、单/多机控制等无人机/无人车/无人船科研及开发领域的功能。 配合板载计算机(树莓派、TX2、Nano)等运算能力比较强的处理器,来实现复杂算法的运行,运行得到的控制指令通过串口或者网口通信发送给底层控制板。

../_images/framework.png
  • state_from_mavros.h:订阅飞控状态,包括无人机当前的状态(/mavros/state),当前位置(/mavros/local_position/pose),当前速度(/mavros/local_position/velocity_local),和当前角度,角速度(/mavros/imu/data)
  • command_to_mavros.h:发布px4_command功能包生成的控制量至mavros功能包,可发送期望位置,速度(本地系与机体系),角度,角速度,底层控制(遥控器输入)
  • px4_pos_estimator.cpp:订阅激光雷达或者mocap发布的位置信息,并进行坐标转换,在state_from_mavros.h中已订阅飞控发布的位置,速度,欧拉角信息,此处直接使用,根据订阅的数据,发布相应的位置,偏航角给飞控
  • px4_pos_controller.cpp:订阅由位置估计发布的DroneState,初始化当前飞机状态的时间.订阅ControlCommand(不知从何发布的数据).发布topic_for_log主题.在选择控制率,检查参数正确后,初始化完成.对move节点中,takeoff,Move_ENU,Move_Body,Hold,Land,Disarm,PPN_land和Trajectory_Tracking等进行逻辑处理.
  • ground_station.cpp:订阅自定义日志主题(/px4_command/topic_for_log),订阅视觉系统位置估计PoseStamped主题(/vrpn_client_node/UAV/pose,非mavlink消息,数据包括point位置(x,y,z),四元数方向(w,x,y,z)),订阅飞控姿态四元数AttitudeTarget主题(/mavros/setpoint_raw/target_attitude,#82号mavlink消息).不断的更新视觉传感器状态,并打印当前飞机的状态.
  • px4_sender.cpp:订阅自定义消息控制指令主题(/px4_command/control_command),机体系到惯性系坐标转换,move中控制命令的具体实现(0表示位置控制,3表示速度控制)
  • autonomous_landing.cpp:降落识别使用xyz均为速度控制.订阅数据包括降落板与无人机的相对位置,降落板与无人机的相对偏航角,视觉flag 来自视觉节点.最后发布位置控制指令
  • collisiom_avoidance_streo.cpp:订阅/streo_distance该数据作为计算飞机四个方向的距离判断.
  • formation_control_sitl.cpp:多机仿真SITL,只适用于Move_ENU坐标系下,若使用Move_Body,需自行添加修改.
  • payload_drop.cpp:订阅/mavros/local_position/pose本地位置.发布遥控器通道值.
  • square.cpp:发布/px4_command/control_command命令.子模式xyz均为位置控制.
  • target_tracking.cpp:
  • move.cpp:发布/px4_command/control_command,并设置子模式xy速度控制(0b10),位置控制.z速度控制(0b01),位置控制
  • set_mode.cpp:模拟遥控器,根据mavros服务,进行在SITL下解锁,切换offboard,控制飞行器.
  • TFmini.cpp:激光定高雷达的处理,如果需要添加超声波传感器,可参考此代码.

4.飞行前准备

WiFi数传两种配置模式

小技巧

WiFi数传的配置工具请在百度网盘自主下载 网盘链接

提取码: exk3

根据WiFi-LINK配置模式有两种连接方式:一种是无线AP模式,另外一种无线网卡模式.出厂默认配置为AP模式,如需配置为无线网卡模式,可按照无线网卡模式说明文档自行配置

WIFI-LINK配置成无线AP模式

../_images/XBEE_AP_mode.png

这是我们发货时的默认配置,其中WiFi-LINK模块相当与一个热点,笔记本2要连接这个热点进而连接QGC. 他们配置详细步骤请看WIFI数传远程连接QGroundControl非正常连接篇

WIFI数传远程连接QGroundControl

在WIFI数传连接QGroundControl的过程中,本小节文档中会分为两种情况来说明正常连接的过程以及非正常连接的过程.

正常连接

小技巧

飞机说明:本教程飞机配置为TX2+T265+D435I+pixhawk4

飞机整机图:

../_images/vehicle.jpg

飞机上面贴有标签,WIFI数传名字为amov-uav76.密码为amov19076.

首先拿到飞机之后,上电,打开自己电脑WIFI,选择WIFI名为amov-uav76,并输入密码进行连接.(截图WIFI的连接图片)

../_images/search_for_wifi.jpg

然后打开一个终端,ping一下WIFI数传的IP,192.168.10.76.(截图为WIFI数传配置成功的图片)

../_images/ping_success.jpg

发现已经ping成功了,说明我们可以连接到QGroundControl地面站上面了.

接着,打开QGC,第一步是打开 应用程序设置 菜单栏;第二步是选择 通讯连接 侧边栏;下面会出现五个可修改功能按钮,分别为删除,编辑,添加,连接,断开连接.第三步是点击 添加 按钮.(此处图片为qgc的连接1~3)

../_images/add_new_connect.jpg

第四步是在类型旁边将原有的类型serial重选为TCP.(此处图片为第四步)

../_images/serial_seclect_tcp.jpg

选择TCP类型之后,下面的输入框有所变化,主机地址就填写为192.168.10.76;端口号填写为6000,接着点击确认即可.(此处照片5~7)

../_images/write_vehicle_ip.jpg

第八步是选中刚才添加的通讯连接,第九步点击下面的连接按钮,进行连接到QGC.(此处照片为8~9)

../_images/connect_to_qgc.jpg

第十步就可以看到WIFI数传连接成功,地面站上显示飞控的各个信息.(此处照片为10)

../_images/wifi_connect_success.jpg

非正常连接

小技巧

飞机说明:本教程飞机配置为Nano+双目T265+A1+pixhawk4

飞机整体图:

../_images/vehicle1.jpg

飞机上面有标签,写的是有关WIFI数传的默认配置.例如本架飞机,我们出厂默认的WIFI数传配置为AP模式(数传是个热点,地面站连接热点).

上电之后热点名称就为:amov-uav77,热点密码为:amov19077,电脑连接上WIFI

../_images/first_connect_wifi.jpg

这时候你就可以在你连接热点的电脑打开终端(Windows下面Ctrl+r,输入cmd进入终端,Ubuntu下面直接右击鼠标打开termial), 使用ping命令看是否能ping通热点.热点的IP为192.168.10.77.直接输入ping 192.168.10.77. 如果ping通,说明就正常可以使用了.如果ping不通,那就是WIFI数传没有配置正确.可以看到是ping失败了,WIFI没有配置成功,你需要自己重新手动配置一下

../_images/ping_failure.jpg

首先需要准备的东西有,配置软件RM08K config tool CN V2.1,和WIFI数传配置线以及工具刀(有的WiFi数传的复位按钮地方在里面,可能需要镊子或者较细的工具)

../_images/configuration_tool.jpg ../_images/configuration_software.jpg

将WiFi数传配置线接上WIFI数传和电脑上,然后在电脑设备管理器查看识别到的串口号是多少,再打开配置软件,选择相应的串口号并点击搜索模块.点击搜索模块之后发现没响应,别急,继续看第三步.

../_images/view_com.jpg

在第三步中就要使用工具刀了,第二步执行点击搜索模块之后,使用工具刀按下WiFi数传复位按钮,复位按钮的位置在远离WiFi数传信号线的那个孔里面,如下图所示.(有的WIFI数传外壳遮挡住了复位按钮,根据实际情况选择适当的工具)

../_images/reset_button.jpg

进行第四步,复位按钮按下之后,继续点击搜索模块.这时候会出现两种情况,一种是下图错误提示无法打开com口,解决办法是重启电脑重新执行第一步到第三步.

../_images/open_com_failure.jpg

另外一种情况是,点击搜索模块之后,出现如图所示找到设备com口就说明正确打开了串口,可以继续下一步配置了.

../_images/open_com_success.jpg

第五步是配置WIFI数传为AP模式,如图所示,所有划红线部分为你手动选择或者手动添加内容,所有配置按照图片右边的具体配置一致即可,最后选择提交配置按钮.

../_images/configuration_ap.jpg

第六步,提交配置之后,左边这一栏会显示刚才提交配置的信息,配置就算完成结束,别着急拔掉配置线,我们先测试一下配置的成功不成功.

../_images/test_is_ok.jpg

继续连接WIFI,如下图所示

../_images/second_connetc_wifi.jpg

然后打开终端,ping一下WIFI数传的IP,直接执行 ping 192.168.10.77

../_images/ping_success1.jpg

发现ping通了之后,说明刚才配置就算完成,拔掉配置线,接到飞控上面.准备连接地面站QGroundControl.

打开QGC,选择 应用程序设置 菜单栏,继续选择 通讯连接 子项.下面有五种操作,分别为删除,编辑,添加,连接以及断开连接.

../_images/qgc123.jpg

接下来,选择 添加 项,将类型选择由默认的serial(串口)改为TCP,上面的名称可改可不改.

../_images/qgc4.jpg

下面的主机地址填写192.168.10.77(我们刚才ping通的地址,也就是WIFI数传配置好的IP地址),端口号填写为6000(注意和nomachine的默认端口号4000区分开).接着,右下角点击确认即可.

../_images/qgc567.jpg

然后,选择刚添加的通讯连接,点击第四个连接操作连接到地面站.

../_images/qgc89.jpg

最后可以看到QGC可以显示飞控相关姿态信息了.完成WiFi数传连接QGroundControl的过程.

../_images/qgc10.jpg

远程连接TX2

需要的硬件:

    1. 有HDMI接口的显示器一台(用于显示TX2,TX2连接你准备好的路由器的WiFi)
    1. 带宽比较好的路由器一台
    1. 安装有QGC地面站与NoMachine电脑一台或两台

NoMachine配置:此步骤需要英伟达TX2中的Ubuntu系统连接成功WiFi路由器,并在终端上输入ifconfig命令找到TX2的IP(我的TX2 IP为192.168.10.140)。

打开NOMACHINA软件,点击 New新建

../_images/WIFI_nomachine_create_new.png

Protrocol选择NX模式,然后输入TX2的IP地址192.168.10.140,Port默认4000

../_images/WIFI_nomachine_input_ip.png

下一步,鉴定方式选择Password,下一步选择Do not use proxy,最后Done

如下选择刚才配置的参数,点击连接

../_images/WIFI_nomachine_connect.png

成功后点击YES

输入TX2的用户名以及密码 然后一路OK即可进行访问。

../_images/WIFI_nomachine_username&passwd.png ../_images/WIFI_nomachine_connect_success.png

飞行环境说明

室内环境

激光雷达

室内我们采用的激光雷达进行定位,因为采用的二维雷达,会在室内构建出如下的平面地图

../_images/LIDAR_layout.jpg

所以在测试以前要选择一个房间大小合适(A1/A2雷达半径12米有效,A3雷达半径25米有效),房间不能地形非常复杂,也不能没有角点和几何特征点,否则不能很好的构建出地图,就不能很好的定位。

我们的测试环境如下:

../_images/Indoor_test_site.jpg

房间内有一些防护装置,房顶的防护网,地面的保护垫等等最好具备,防止伤人和损坏飞机。

视觉SLAM

视觉的室内环境也是如上图所示环境,在室内可以添加一些桌椅板凳放置视觉前方,以便能有较好的特征点.

室外环境

视觉SLAM

室外视觉的环境,可以选择在马路旁边的树下面,视觉所能覆盖的视野包括树,马路,以及楼区,这样特征点多一点,效果能好. 在视觉slam中就尽可能不要选择空旷,单一特征点的地方,如操场.我们实验室经常测试视觉的环境,有马路,有草地,有房屋, 如果视野只有单纯的草地,视觉定位就不是很好.容易漂移.

GPS/RTK

室外使用GPS/RTK时,应当选择较为空旷地方,不要在房屋旁边或者树的旁边,搜星信号会很差.推荐在公园绿地或者操场中.

5.自主飞行说明

自主飞行可分为室内和室外两种模式,相应的室内分为激光SLAM飞行模式和视觉SLAM飞行模式,室外分为视觉SLAM飞行模式和GPS/RTK飞行模式. 每一种飞行模式又对应分为TX2板载计算机和Nano板载计算机.在每一种飞行模式中,你就可以进行室内外相应的实现定点飞行,降落等.

小技巧

每一种飞行模式的位置来源有所不同,这里在QGroundControl地面站中有两个非常重要的参数,该参数决定了使用不同的飞行模式需要选择不同的位置数据来源 EKF2_AID_MASK和EKF2_HGT_MODE,前者是位置数据来源参数.后者是高度数据来源参数.

室内飞行

激光SLAM

室内激光雷达定位模式

  • EKF2_AID_MASK = 24 (选择位置以及偏航来源) ; EKF2_HGT_MODE = Vision/Range sensor(选择高度来源)
TX2

参数确定后尝试解锁,遇到解锁不成功,看看提示是否需要重新校准磁罗盘?解锁成功,电机启转,这时切记不要上浆试飞, 因为此时激光雷达没有工作,没有给飞控送入位置以及高度信息,所以此时姿态控制失效,飞机一飞就会偏。这是我们固件 的bug,近期会修复,请注意。

在TX2板载计算机系统里打开终端进入如下图所示目录并启动脚本:

./my_lidar_imu_fly.sh

脚本会依次启动各个launch文件

正常情况下各个窗口会正常工作,其中有个 px4_pos_estimate 节点要特别注意,如下图。

../_images/indoor_px4_pos_estimate_failed.png

当出现上述问题,需重新启动飞控以及脚本,飞控的重启需要在地面站的控制台上,输入 reboot 然后回车即可。

../_images/qgc_reboot_vehicle.png
NANO

与TX2类似,找其相应的启动脚本即可.

视觉SLAM

室内视觉SLAM定位模式

  • EKF2_AID_MASK = 24 (选择位置以及偏航来源) ; EKF2_HGT_MODE = Vision/Range sensor(选择高度来源)
TX2

把飞机放在室内待起飞点,远程已连接好板载计算机与飞控。

../_images/nomachine_connect_tx2.jpg

现在已经连接上了nomachine,第一步就是打开目录,进入到amov_ws/src/px4_command/sh/sh_for_P200/vio目录下面,待会准备启动的脚本为vio_fly.sh.(图片)

../_images/open_script_directory.jpg

然后进行第二步,鼠标右击空白处选择打开一个终端(图片)

../_images/open_termial.jpg

第三步输入启动脚本的执行指令 ./vio_fly.sh

../_images/startup_rplidar_fly.jpg

第四步,启动脚本完成之后,自动开启脚本终端.第一个终端为 roscore 此处不做详解.查看mavros脚本是否正常启动,如果红圈内容说明mavros正常与飞控已经建立了通信连接. (如果出现报错的话,请仔细查看报错的内容原因是什么,坐标系相关的报错是正常的,不影响我们飞行使用).图片

../_images/mavros.jpg

第五步,该脚本是T265驱动启动脚本,该脚本正常运行,说明T265已经正常启动.

../_images/t265_driver.jpg

第六步,是T265的处理脚本,不是异常错误就是正常的,此脚本角T265的位置信息提供给了位置估计节点,以用作位置估计定位

../_images/t265_data_processing.jpg

第七步,位置估计脚本,此处有多处打印消息,包含视觉信息,飞控信息,两者的各个数据基本保持动态波动就是正常的,波动很大就是非正常现象.如下图所示为正常.

../_images/estimator.jpg

第八步,是位置控制节点,按照提示输入1继续,它是位置环参数的初始化.如果此处不输入1继续的话,你可以在室内进行定位飞行,但是不能切换到offboard模式. 只有输入了1,确认位置环参数之后,才能进入offboard模式.

../_images/position_controller.jpg

第九步,为move节点,正常启动.他可以控制飞机前后左右,位置速度控制飞行.

../_images/move.jpg

此时你也可以用另外一台电脑连接到飞控中去,按照开箱第一步的教程执行.上面脚本如果都能正常运行的话,此时在遥控器上的5通道(三段)拨到中间, 将飞行模式改为定点模式,在地面站QGC上面可以看到是可以切到定点飞行模式的,这就说明,此时可以在室内进行定点飞行了.

../_images/vehicle_state_from_qgc.jpg
NANO

使用操作和TX2类似,区别在于文件目录不一致.

室外飞行

视觉SLAM

  • EKF2_AID_MASK = 24 (选择位置以及偏航来源) ; EKF2_HGT_MODE = Barometric pressure/GPS/Vision(选择高度来源)
TX2

待续……

NANO

GPS/RTK

  • EKF2_AID_MASK = 1 (选择位置以及偏航来源) ; EKF2_HGT_MODE = Barometric pressure/GPS(选择高度来源)
TX2

待续……

NANO

经过入门本章内容,你就可以在室内外进行定点飞行,若遇到困难请上论坛求助: 阿木社区论坛 .

在下一章自主飞行之进阶中,会详细讲解如何在室内进行move控制,自主跑四边形,室外圆跟踪等demo实现教程.