在三维激光雷达平台上我们飞控采用pixhawk2的飞控。官方给我说这个支持APM和PX4的固件,但是对APM固件的支持性比较好,因此就选用了APM的飞控。在一开始装好飞机后,第一次飞还好好的,但是之后出现了一个问题,就是yaw角会不受控制的自旋。这个找了电机电调的问题还是飞不稳(电调很容易焊接不牢靠)。之后我们把飞控的减震板去掉之后并且再次将电机连接到飞控上,进行了电调的校准,然后就可以很稳定的飞了。之后感觉飞控板质量有问题才导致了这个原因。不管怎么说现在可以在自稳模式平稳飞行了。超声波定高效果也还将就,偶尔会出现掉高的情况,反正先往下走吧(从后来回过头来看这个选择是很明智的)。之后遇到一个问题,AMP 3.5.7固件没有LPE,无法使用外部位置信息融合。如果使用外部位置控制的话有三种方式:1、将外部位置信息当做一个GPS的信息传入飞控,在EKF2中进行融合。2、自己修改EKF2,加上一个外部位置融合的模块。3、位置控制在NUC上进行计算,然后得到期望的姿态给飞机控制。斟酌了一下这些问题,我们决定我们换成PX4飞控来进行我们的工作,因为PX4固件有LPE,可以进行外部位置融合。
换成PX4固件,大概调了一下PID参数,可以定高飞行了(效果也只是一般般)。然后我们准备将雷达的位置信息融合进飞机。但是问题出现了,进不到定点模式,融合数据太差了。经过看飞行日志,发现加速度计的波动在+-0.5G之间,这怎么能用呢。然后我再看了一下其他正常飞行的飞机,加速度计的波动都在+-0.1G左右。这个差距也太大了吧,我们又加了一个比较好的减震板,数据勉强在+-0.3G的噪声,但是还是太差了。不管调参还是怎么搞,都没有改善。为啥不加减震APM固件噪声就比较小,加了这么好的减震PX4固件的加速度计的噪声就这么大,其他硬件都是一样的 啊。这个真的是APM固件比PX4固件好么?那还换回APM固件来试一下吧。APM固件看一下有没有什么方法来融合外部位置,当时想的最坏的不过是把位置控制写在nuc上,总比做不出来强。换后,测试自稳模式和定高模式都很不错,惊喜的是定高不会出现掉高的现象了,看来好的减震板还是有必要的。不错不错,也不枉我们这段时间的折腾。
现在就是位置估计了。查看了在APM论坛上,确实有人讨论外部位置融合的问题。我擦,有大神已经把APM外部位置融合做出来了。并且已经在github上合并到主项目中master版本上了。赶快下载下来试一下。参照官网上的APM编译环境配置,来配置好环境,编译最新的固件,然后看了一下固件版本3.7-dev。确实比我们在地面站上下载下来的固件新不少啊。试一下吧,按照他们说的步骤先设置一下飞机的参数。
Setup the Pixhawk
Connect to the Pixhawk with a ground station (i.e. Mission Planner) and set the following parameters:
-
SERIAL2_PROTOCOL = 1 (the default) to enable MAVLink on the serial port.
-
SERIAL2_BAUD = 921 so the Pixhawk can communicate with the TX1 at 921600 baud.
-
LOG_BACKEND_TYPE = 3 if you are using APSync to stream the dataflash log files to the TX1
You may need to manually disable flow control on Telem2 although this is not normally required:
As a side note the J120’s UART2 appears on the TX1 as /dev/ttyTHS1.
以上是pixhawk2与mavros连接需要设置的。
Configure ArduPilot
Connect to the flight controller with a ground station (i.e. Mission Planner) and check that the following parameters are set as shown below:
After changing any of the values above, reboot the flight controller.
以上是使用EKF2来取消GPS、取消MAG。这个是融合视觉信息的准备工作。
mavros连接到pixhawk2之后将位置信息通过vision_pose话题来发给飞控,然后在QGC上的analysis中可以看到视觉的估计值已经被飞控接收到了,然后就是看是否融合使用了视觉的信息。但是没有变量可以看到融合的位置信息。只能通过飞行日志来看了,让飞机产生一个飞行日志,然后查看EKF的消息中的PN PE来看一下融合进去了没有。看了一下确实融合进去了。并且yaw角使用的视觉yaw角这样的话,外部位置的坐标系和飞机的坐标系就对应起来了。
如果位置信息融合了的话可以看到地面站消息中会有这样的显示。
EKF2 IMU1 initial pos NED = 0.0,0.0,0.0 (m)
EKF2 IMU1 is using external nav data
EKF2 IMU0 initial pos NED = 0.0,0.0,0.0 (m)
EKF2 IMU0 is using external nav data
到这里就把视觉信息传给飞控了。此时还没有测试是否能够定点。之后测试之后再更新吧。
10月13日更新
经过这么久的调试,终于可以使用guided模式来寻点了。
到上面那步可以直接试一下自己的飞机能否准确定点。如果可以的话就可以尝试使用set_point来给飞机发期望的位置。这里有一个位置,有一个四元数。位置是给飞机期望的位置,四元数是给飞机期望的yaw角。通过set_point给飞机期望位置之后飞机就根据你给的位置和yaw角来达到期望的状态。mavros给飞机当前外部位置的时候需要xyz都需要给,要不然融合就会有问题。不能只给x和y,然后z给0,这样的话在定高和定点的时候不会有问题。在guided模式和auto模式的时候就会出现问题,当前的z方向的位置都是0,导致高度控制会产生错误。
reference
http://ardupilot.org/dev/docs/ros-slam.html
https://discuss.ardupilot.org/c/blog
https://github.com/ArduPilot/ardupilot