PX4 / PX4-ECL

Estimation & Control Library for Guidance, Navigation and Control Applications
http://dev.px4.io
BSD 3-Clause "New" or "Revised" License
478 stars 508 forks source link

Optical flow degrades altitude hold #474

Open RomanBapst opened 6 years ago

RomanBapst commented 6 years ago

@priseborough @DanielePettenuzzo and I noticed that when setting the aid mask to 'optical flow' the altitude hold performance degrades considerably. We did two tests (see logs and videos below) in which we flew in altitude hold mode, once with optical flow aid mask enabled and once without. As soon as you start moving horizontally the vehicle loses altitude. Without the optical flow enabled this issues does not occur.

Optical flow disabled in aid mask: Log: https://logs.px4.io/plot_app?log=149a1718-a893-40d2-9416-94156654bbe8 Video: https://www.youtube.com/watch?v=gnXhvMrfrrg&feature=youtu.be

Optical flow enabled in aid mask: Log: https://logs.px4.io/plot_app?log=4486cfba-21d7-45bc-adbf-fd5b87d05a31 https://www.youtube.com/watch?v=WUxe84Mh_P8&feature=youtu.be

mhkabir commented 6 years ago

Nice observation. I saw this too, but didn't connect it to optical flow use. What flow sensor and lidar are you using here?

mhkabir commented 6 years ago

Potentially related to the height limiter which is only active when flow fusion mask is enabled.

RomanBapst commented 6 years ago

@priseborough I started looking into this a bit and found that something causes the height state covariance to decrease during horizontal maneuvers. I replayed the bad log (with and without flow aid mask) and noticed that this causes the kalman gain of the height state during a baro update to be cut to half. I assume that the height solution is pulled less towards the baro and height performance degrades. Here's the plot of the height state covariance when flow is disabled: height_cov_no_flow

Here's the height state covariance when optical flow is enabled: height_state_cov_flow

RomanBapst commented 6 years ago

@priseborough Could you let me know if replaying the posted logs works for you? I can replay them but the replay log is very short (maybe one second).

priseborough commented 6 years ago

We need the logging to start from boot to do a useful replay. Otherwise it is doing an in-flight alignment and results are not representative.

priseborough commented 6 years ago

Inspecting the logs indicates we need to investigate (using replay) the possibility that optical flow observations are causing a reduction in vertical velocity variance which is also reducing vertical position variance.

RomanBapst commented 6 years ago

@priseborough I can provide replay logs tomorrow morning. I tried to set the rows/columns corresponding to vertical velocity and height of the KHP matrix to zero but that did not seem to have an influence. So I'm not quite sure yet how that coupling works. Anyway, replay should help us there.

priseborough commented 6 years ago

The theory is that as the vehicle tilts, the vertical velocity becomes observable via the angular rate corrected flow rates. If required, this behaviour can be modified by zeroing terms in the H matrix.

Edit: Anyway it looks like you already tried that. The replay should show us which fusion operation is responsible for the reduction in vertical state variances

RomanBapst commented 6 years ago

@priseborough I did an outdoor flight today in which I zeroed the entry of the optical flow observation vector corresponding to the vertical velocity state. The logs shows that this gets rid of the dip in vertical velocity and height state variance during horizontal maneuvers. During the flight I was not convinced of the success of the fix because the drone was still losing a lot of altitude during these maneuvers. However, after closer inspection of the logs I noticed that the barometer of the Pixhawk 4 must have been influenced a lot by dynamic pressure changes during the maneuver. The log contains the data of the distance sensor which served as a good measure for ground truth. I also did a replay of the log without the changes to the observation matrix and the dips in variance are noticeable again. I'm a bit unsure if we need this fix or not. Have you observed this problem on one of your drones before?

Here's a plot of height- and height rate variance with the fix: height_variance_good

Here's a plot of height- and height rate variance without the fix: height_variance_bad

This is the corresponding replay log file: https://logs.px4.io/plot_app?log=d9f72146-0bf9-4f54-92e5-7f8f3b4527e5

priseborough commented 6 years ago

The reduction in height variance not significant enough to account for the error, but does confirm optical flow observations are modifying the vertical states. If there is roll/pitch estimation error or angular misalignment of the flow sensor wrt the IMU, then when the vehicle is tilted, there will be vertical velocity errors introduced when optical flow data is fused.

I have seen increased height estimation errors when using optical flow on other vehicles, but that was in comparison to use of GPS and was explained at the time as being due to the loss of vertical velocity observations.

The 'fix' is a bit of a hack, but may be necessary unless we can find a tuning compromise.

priseborough commented 6 years ago

I've been running replay tests on https://logs.px4.io/plot_app?log=d9f72146-0bf9-4f54-92e5-7f8f3b4527e5 using PX4/Firmware master and blocking the optical flow fusion from modifying the vertical velocity and position states increased the RMS innovation levels for the baro observations.

RomanBapst commented 6 years ago

@priseborough Hm, what is your conclusion from that?

RomanBapst commented 6 years ago

@priseborough I think I found the mistake I made. I forgot that the kalman gain was computed independently of the H_LOS matrix. I zeroed the entries in the H_LOS matrix but not in the kalman gain. Replay shows promising results.

priseborough commented 6 years ago

I don't know what to make of the data from replay of that log at this point in time. Yes, zeroing the rows does remove the fluctuation in vertical state variances, but if I was to assess the effect purely on the innovation sequence, the estimator performance was degraded. However making an assessment based on innovation levels on their own when there are baro errors present is not reliable.

It is possible vertical velocity errors are causing more of the height fluctuation in the controller, so tomorrow the vertical velocity state. looking at the GPS vs estimated vertical velocity and also vertical position state vs range finder height when assessing the effect of replay code changes.

RomanBapst commented 6 years ago

@priseborough I think the replay log I provided you with is not very good. I'll provide something better to assess the potential improvement. We have also installed a traditional Px4 flow module just to verify that we are not suffering from issues related to the bitcraze flow module. At the moment we are especially struggling with effects of yawing on the flow innovations.

RomanBapst commented 6 years ago

@priseborough During our investigations we discovered two potential bugs for which I will provide a fix: 1) Here we are using _flow_sample_delayed.gyroXYZ which is a delta angle but we should be using the equivalent rate. https://github.com/PX4/ecl/blob/master/EKF/optflow_fusion.cpp#L81

2) The corrected height above ground estimate here is not necessarily the distance from the focal point to the center of the image. Since we know the position of the optical flow and the range finder we can correct for this. https://github.com/PX4/ecl/blob/master/EKF/optflow_fusion.cpp#L90

RomanBapst commented 6 years ago

Upper issues are addressed in #482

RomanBapst commented 6 years ago

@mhkabir You said that you also had this problem on one of your setups, correct? Do you have a video or a log of that. I'm looking for other people who are seeing this issue.

priseborough commented 5 years ago

The pmw3901 had a wider fov and violates the assumption of the observation equations that the flow is measured at a single point that is the intersection of the Z body axis and flat terrain.

priseborough commented 5 years ago

That will introduce vertical estimation errors at higher tilt angles.

mhkabir commented 5 years ago

@priseborough Is there a way forward to fix this?

priseborough commented 5 years ago

There are a couple of options that come to mind:

1) If we know the effective FOV (angular region used to calculate flow vectors, could be smaller than sensor total FOV), if we assume a flat earth, the mean 'stare point' can be adjusted with tilt angle.

2) The optical flow observations can be prevented from modifying the vertical velocity states by setting the H[0][6] observation Jacobian to zero.

https://github.com/PX4/ecl/blob/master/EKF/optflow_fusion.cpp#L133 https://github.com/PX4/ecl/blob/master/EKF/optflow_fusion.cpp#L279

Method 1) will take longer requires more testing to characterise the sensor. Method 2) can be implemented quickly and is what we should try first.

@RomanBapst Do you have a log suitable for replay that shows the problem? It will be required to verify the diagnosis and test the fix.

priseborough commented 3 years ago

Covariance stability changes may have reduced this effect, however the current observation model assumes a pinhole camera with zero fov, aligned with Z and looking at flat terrain. The original PX4 flow sensor had a narrower fov compared to PMW390x sensors, so we may be seeing the result of the wider fov. More testing required,