Git Product home page Git Product logo

px4-ecl's Introduction

โš ๏ธ This repository is no longer maintained. EKF2 now lives in PX4-Autopilot.

ECL

Very lightweight Estimation & Control Library.

DOI

This library solves the estimation & control problems of a number of robots and drones. It accepts GPS, vision and inertial sensor inputs. It is extremely lightweight and efficient and yet has the rugged field-proven performance.

The library is BSD 3-clause licensed.

EKF Documentation

Building EKF

Prerequisites:

By following the steps mentioned below you can create a static library which can be included in projects:

make
// OR
mkdir build/
cd build/
cmake ..
make

Testing ECL

By following the steps you can run the unit tests

make test

Change Indicator / Unit Tests

Change indication is the concept of running the EKF on different data-sets and compare the state of the EKF to a previous version. If a contributor makes a functional change that is run during the change_indication tests, this will produce a different output of the EKF's state. As the tests are run in CI, this checks if a contributor forgot to run the checks themselves and add the new EKF's state outputs to the pull request.

The unit tests include a check to see if the pull request results in a difference to the output data csv file when replaying the sensor data csv file. If a pull request results in an expected difference, then it is important that the output reference file be re-generated and included as part of the pull request. A non-functional pull request should not result in changes to this file, however the default test case does not exercise all sensor types so this test passing is a necessary, but not sufficient requirement for a non-functional pull request.

The functionality that supports this test consists of:

  • Python scripts that extract sensor data from ulog files and writes them to a sensor data csv file. The default sensor data csv file used by the unit test was generated from a ulog created from an iris SITL flight.
  • A script file using functionality provided by the sensor simulator, that loads sensor data from the sensor data csv file , replays the EKF with it and logs the EKF's state and covariance data to the output data csv file.
  • CI action that checks if the logs of the test running with replay data is changing. This helps to see if there are functional changes.

How to run the Change Indicator test during development on your own logs:

  • create sensor_data.csv file from ulog file 'cd test/sensor_simulator/ python3 createSensorDataFile.py <path/to/ulog> ../replay_data/<descriptive_name>.csv'
  • Setup the test file to use the EKF with the created sensor data by copy&paste an existing test case in test/test_EKF_withReplayData.cpp and adapt the paths to load the right sensor data and write it to the right place, eg _sensor_simulator.loadSensorDataFromFile("../../../test/replay_data/<descriptive_name>.csv"); _ekf_logger.setFilePath("../../../test/change_indication/<descriptive_name>.csv");
  • You can feed the EKF with the data in the csv file, by running '_sensor_simulator.runReplaySeconds(duration_in_seconds)'. Be aware that replay sensor data will only be available when the corresponding sensor simulation are running. By default only imu, baro and mag sensor simulators are running. You can start a sensor simulation by calling sensor_simulator..start(). Be also aware that you still have to setup the EKF yourself. This includes setting the bit mask (fusion_mode in common.h) according to what you intend to fuse.
  • In between _sensor_simulator.runReplaySeconds(duration_in_seconds) calls, write the state and covariances to the change_indication file by including a _ekf_logger.writeStateToFile(); line.
  • Run the EKF with your data and all the other tests by running 'make test' from the ecl directory. The default output data csv file changes can then be included in the PR if differences are causing the CI test to fail.

Known Issues

If compiler versions other than GCC 7.5 are used to generate the output data file, then is is possible that the file will cause CI failures due to small numerical differences to file generated by the CI test.

px4-ecl's People

Contributors

andreasantener avatar bazookajoe1900 avatar bkueng avatar bresch avatar bugobliterator avatar carlolsson avatar christophtobler avatar dagar avatar dakejahl avatar devbharat avatar georgehines avatar hamishwillee avatar jgoppert avatar jkflying avatar julianoes avatar kamilritz avatar lorenzmeier avatar maetugr avatar mhkabir avatar mrivi avatar peterduerr-sony avatar philipoe avatar priseborough avatar px4buildbot avatar romanbapst avatar sevenbill avatar sfuhrer avatar tsc21 avatar tstellanova avatar waltjohnson avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

px4-ecl's Issues

Make library standalone

strip out dependencies on PX4 Firmware, create hooks for other dev environments to connect/use this library, e.g. ros.

Incomplete magnetometer and heading fusion tuning parameter implementation

The heading fusion observation noise parameter EKF2_HEAD_NOISE adjusts the observation variance, not the observation noise. It should be adjusting noise and have units of rad
The magnetometer noise parameter EKF2_MAG_NOISE ias actually adjusting the magnetic field state process noise, nor the magnetometer observation noise. It should be renamed.
There is no parameter to adjust the magnetometer observation noise
There is no parameter to control which magnetometer fusion method is used. A suggestion is to provide three options

  1. Auto selection (default)
  2. Always used heading fusion
  3. Always use 3-axis field fusion

EKF monitor function required

We need to add a separate filter monitoring function that looks at innovations, state variances, fusion timeout, GPS quality metrics, etc to:
a) Provide a position accuracy estimate to the system
b) Provide a dead-reckoning status to the system
c) Provide a validity status for the different states (eg attitude, hvel, hpos, vvel, vpos, wind, etc)
d) Provide position glitch warning to the system

Move PX4/Firmware/src/modules/controllib into ecl

Ecl and PX4/Firmware/src/modules/controllib have the same design and same purpose and should be combined. Basically all control blocks look like:

y = update(u)

With matrix lib we can even make all of these blocks in vector versions.
The controllib is set up similar to simulink. Each block has a set of parameters which form its context, and these blocks can be nested. When you call you call y = update(u), then the super block, can call update on all required subblocks to produce the output.

The parameter backend of the contorllib is currently tied to px4 internals, but this would be very easy to switch by modifying the controllib/blocks/Block.hpp

@Tumbili @LorenzMeier @priseborough

Flag for height measurement update when using external vision

When using external vision, external vision height is never used for height update as the baro flag does not go "off" and the if(baro) else if(external vision) fails to use external vision height. Need to reset baro flag when using external vision correctly.

For now, changing

if (_fuse_height) {
    if (_control_status.flags.baro_hgt) {
        fuse_map[5] = true;
        // vertical position innovation - baro measurement has opposite sign to earth z axis
        _vel_pos_innov[5] = _state.pos(2) + _baro_sample_delayed.hgt - _baro_hgt_offset - _hgt_sensor_offset;
        // observation variance - user parameter defined
        R[5] = fmaxf(_params.baro_noise, 0.01f);
        R[5] = R[5] * R[5];
        // innovation gate size
        gate_size[5] = fmaxf(_params.baro_innov_gate, 1.0f);

    } else if (_control_status.flags.gps_hgt) {
        fuse_map[5] = true;
        // vertical position innovation - gps measurement has opposite sign to earth z axis
        _vel_pos_innov[5] = _state.pos(2) + _gps_sample_delayed.hgt - _gps_alt_ref - _hgt_sensor_offset;
        // observation variance - receiver defined and parameter limited
        // use scaled horizontal position accuracy assuming typical ratio of VDOP/HDOP
        float lower_limit = fmaxf(_params.gps_pos_noise, 0.01f);
        float upper_limit = fmaxf(_params.pos_noaid_noise, lower_limit);
        R[5] = 1.5f * math::constrain(_gps_sample_delayed.vacc, lower_limit, upper_limit);
        R[5] = R[5] * R[5];
        // innovation gate size
        gate_size[5] = fmaxf(_params.baro_innov_gate, 1.0f);

    } else if (_control_status.flags.rng_hgt && (_R_to_earth(2, 2) > 0.7071f)) {
        fuse_map[5] = true;
        // use range finder with tilt correction
        _vel_pos_innov[5] = _state.pos(2) - (-math::max(_range_sample_delayed.rng * _R_to_earth(2, 2),
                             _params.rng_gnd_clearance));
        // observation variance - user parameter defined
        R[5] = fmaxf(_params.range_noise, 0.01f);
        R[5] = R[5] * R[5];
        // innovation gate size
        gate_size[5] = fmaxf(_params.range_innov_gate, 1.0f);
    }

}

to

if (_fuse_height) {
    if (_control_status.flags.baro_hgt && !_control_status.flags.gps && !_control_status.flags.ev_pos && !(_control_status.flags.rng_hgt && (_R_to_earth(2, 2) > 0.7071f))) {
        fuse_map[5] = true;
        // vertical position innovation - baro measurement has opposite sign to earth z axis
        _vel_pos_innov[5] = _state.pos(2) + _baro_sample_delayed.hgt - _baro_hgt_offset - _hgt_sensor_offset;
        // observation variance - user parameter defined
        R[5] = fmaxf(_params.baro_noise, 0.01f);
        R[5] = R[5] * R[5];
        // innovation gate size
        gate_size[5] = fmaxf(_params.baro_innov_gate, 1.0f);

    } else if (_control_status.flags.gps_hgt) {
        fuse_map[5] = true;
        // vertical position innovation - gps measurement has opposite sign to earth z axis
        _vel_pos_innov[5] = _state.pos(2) + _gps_sample_delayed.hgt - _gps_alt_ref - _hgt_sensor_offset;
        // observation variance - receiver defined and parameter limited
        // use scaled horizontal position accuracy assuming typical ratio of VDOP/HDOP
        float lower_limit = fmaxf(_params.gps_pos_noise, 0.01f);
        float upper_limit = fmaxf(_params.pos_noaid_noise, lower_limit);
        R[5] = 1.5f * math::constrain(_gps_sample_delayed.vacc, lower_limit, upper_limit);
        R[5] = R[5] * R[5];
        // innovation gate size
        gate_size[5] = fmaxf(_params.baro_innov_gate, 1.0f);

    } else if (_control_status.flags.rng_hgt && (_R_to_earth(2, 2) > 0.7071f)) {
        fuse_map[5] = true;
        // use range finder with tilt correction
        _vel_pos_innov[5] = _state.pos(2) - (-math::max(_range_sample_delayed.rng * _R_to_earth(2, 2),
                             _params.rng_gnd_clearance));
        // observation variance - user parameter defined
        R[5] = fmaxf(_params.range_noise, 0.01f);
        R[5] = R[5] * R[5];
        // innovation gate size
        gate_size[5] = fmaxf(_params.range_innov_gate, 1.0f);
    } else if (_control_status.flags.ev_pos) {
        // warnx("fusing ext_visn_hight");
        fuse_map[5] = true;
        // calculate the innovation assuming the external vision observaton is in local NED frame
        _vel_pos_innov[5] = _state.pos(2) - _ev_sample_delayed.posNED(2);
        // observation variance - defined externally
        R[5] = fmaxf(_ev_sample_delayed.posErr, 0.01f);
        R[5] = R[5] * R[5];
        // innovation gate size
        gate_size[5] = fmaxf(_params.baro_innov_gate, 1.0f);
    }

}

enables use of external vision height.

Enable fixed wing operation with bad magnetometer installation

For fixed wing applications, a aligning the initial heading using the GPS velocity and reinitialising the magnetic field states shortly after takeoff or launch is required to enable operation without a magnetometer or to recover from a bad magnetometer setup. An example of this functionality can be found in the APM EKF2 alignYawGPS() function.

Synthetic Sideslip Support

Enables planes to estimate wind without an airspeed sensor and improves dead reckoning performance when GPS is lost

Implementation of simpler magnetic heading fusion pre takeoff

The simpler magnetic heading fusion should be used when on the ground or indoors, with a transition to use of 3-axis magnetometer fusion for up and away flight. This is because the simple magnetic heading fusion is more robust to external field disturbances, whereas the 3-axis fusion is more robust to sensor errors and provides improved angular accuracy when the assumption of a consistent external field is true.

Local_position reference alt when using External vision

When the GPS is connected to the pixhawk and the GPS module is started, but external vision is enabled for position and altitude instead of GPS, the reference altitude of local position somehow also drifts with the GPS value(indoors). Turning off the GPS module or disconnecting it solves the issue.

I suspect its the estimators "_gps_alt_ref" value is leaking in from GPS somehow.

Airspeed Fusion Innovations

Yesterday we did a flight test with a fixed wing and ekf2. I adopted the current master code to always fuse airspeed above 3 meters per second just to verify if the calculations are correct. @priseborough @Tumbili It would be great if you could have a look and tell me what you think of the innovations?

Flight outside with Wingwing, fusing airspeed at 12.5 Hz
wingwing_fuse_rate12c5hz

Same code in SITL, fusing airspeed at 12.5 Hz
fuserate12c5hz

Same code in SITL, fusing airspeed at 1 Hz
fuserate1hz

External vision XY initialization and tracking

At initialization LPOS.X and LPOS.Y take way too long to converge to values sent by external vision. (Probably because aircraft is stationary but not at origin when EKF2 starts, so external vision is sending in non zero values). Need to support starting at non zero values.

lposxy_initialization

And they oscillate on external vision reset to new value:
lposxy_resetoscillatoin

External vision data is fused with 1cm variance.

IMU processing chain is not optimal for inertial navigation or flight control

Use of the in-built sensor digital noise filtering increases effect of coning errors and does not reduce effect of aliasing. The use of the IMU inbuilt digital filters should be minimised.
Coning error corrections should be applied before the gyro data is integrated to form delta angles and down-sampled to 400Hz.
Noise filtering for the angular rate and specific force measurements used by control loops should be done before the data is down-sampled to 400Hz using a Butterworth or equivalent IIR minimum group delay filter.

When to fuse syntetic sideslip measurements

@priseborough @Tumbili
I am working on the logic of when to fuse syntetic sideslip measurement. The user of the ecl library can control when to fuse airspeed by controlling when to push airspeed measurements into the ekf. This is not possible for sideslip, so do we need to create a flag that is set outside the library to control this?
Or should we implement something that works for most users, e.g. only fuse sideslip as a fallback when we lose airspeed measurements and then people will have to hack the library if they want to do something else, e.g. for vtol platforms?
What do you think?

Magnetic declination always starts at zero

The EKF has to learn the declination starting from an initial value of zero for each flight. We should calculate an initial value using the WGS-84 position or remember the value the end of each flight.

Ekf2 memory leackage

The parameter instances are never deleted in the constructor.
This burns 10kB of memory :-)

EKF2 Development Needs

This is a placeholder to capture miscellaneous ideas for improvement:

Efficiency improvements can be found by limiting the maximum index during covariance and state operations depending on whether magnetic field learning is required and whether wind state estimation is required. Doing so reduces the effective number of filter states to 16 for most multi-rotor applications.

Initial angular alignment should be done in stages with no yaw alignment and magnetometer fusion until the tilt error as determined by the filtered x,y length of the angle error state vector has decayed.

Coning corrections need to be added to the inertial sensor library. EKF2 assumes that these have already been applied to the delta angles.

A default filter tune that that prioritises robustness over accuracy has been implemented. It should be possible to have a second tune available that provides increased accuracy at the expense of robustness for experienced user setups.

Standalone build doesn't work

I'm trying to build this following the instructions of the README.md.

~/src/Firmware/src/lib/ecl/build
[127] % make
[  8%] Building CXX object CMakeFiles/ecl.dir/estimator_interface.cpp.o
In file included from /home/julianoes/src/Firmware/src/lib/ecl/EKF/geo.h:49:0,
                 from /home/julianoes/src/Firmware/src/lib/ecl/EKF/estimator_interface.h:45,
                 from /home/julianoes/src/Firmware/src/lib/ecl/EKF/estimator_interface.cpp:46:
/home/julianoes/src/Firmware/src/lib/ecl/EKF/mathlib.h:44:23: fatal error: Eigen/Dense: No such file or directory
compilation terminated.
CMakeFiles/ecl.dir/build.make:62: recipe for target 'CMakeFiles/ecl.dir/estimator_interface.cpp.o' failed
make[2]: *** [CMakeFiles/ecl.dir/estimator_interface.cpp.o] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/ecl.dir/all' failed
make[1]: *** [CMakeFiles/ecl.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

This is on Ubuntu 16.04.

Snapdragon: Poor altitude estimation with range sensor

I am trying to get the snapdragon flying in altitude control based on altitude estimation with the TeraRanger One. However, local_position_NED.z is very inaccurate and seems to depend a lot on the quality of the acceleration measurements.

I'm testing this the following way: I've hardcoded the TeraRanger driver to output a distance of 0.3m. EKF2_RNG_NOISE is set to 0.0001. The quad sits stationary on the ground. After a few seconds, I arm, after a few more seconds I increase the throttle.

While disarmed, local_position_NED.z already oscillates too much for my taste given the low measurement uncertainty. After arming, oscillation increases a lot (+/-10cm). See this log: http://logs.uaventure.com/view/5SfAq53SPzWRjmnxWUHF3U#Local_Z_PLOT

This oscillation appears largely independent of EKF2_RNG_NOISE and EKF2_ACC_NOISE. The problem seems to be the complementary filter. EST0.s8 tracks the range measurements quite reasonably, it's just LPOS.Z that oscillates.
I've confirmed this by changing this line to:

_output_new.pos += _vel_corr * imu_new.delta_vel_dt;

Now the estimated altitude looks much better: http://logs.uaventure.com/view/635VkhfaZqYAmDcM5ZeuDX#Local_Z_PLOT

Thus, the problem is the noise in delta_vel_NED(2), which cannot be tuned away by any EKF2 parameters, as far as I can see.

What is the suggested action to improve the altitude estimate?

Snapdragon: Poor altitude estimation with range sensor

After following the advice given in #111, we have come to the conclusion that altitude estimation performance of the complementary filter is still not satisfactory.

This can be seen in the following image:
alt_est

EST0.s8 tracks the range data (the sign of which is inverted in the shown plot) well, while LPOS.Z does not. LPOS.Z often overshoots in tracking changes in altitude. At 55s, LPOS.Z does something completely different than EST0.s8. Between 20s and 40s, the quad is placed on the ground (the range sensor saturates at its minimum value) and is disarmed (thus, IMU values are not noisy). Still, LPOS.Z overshoots significantly and appears to saturate at an offset value.

The depicted log is here: http://logs.uaventure.com/view/CYBGUXRipknC9Rr5Ug9kN4

Here is another replay log of my current setup: http://logs.uaventure.com/view/KphLtTVUAttaQhPtUf5XBn

The firmware is on ffb0d37 with all submodules updated.

On top of that I have added a low pass filter for the acceleration measurements fed into the control_status with a cutoff frequency of 30Hz, as suggested in the above-mentioned issue. I have also added the control_status acc measurements to the log file. However, it appears as though we have an estimation problem and not (or not only) a control problem.

@priseborough can you help us with this?

State flow after GPS loss

If GPS is lost, then a maximum dead-reckoning time must be observed, at which time the filter will need to be switched into its non-aiding mode of operation to prevent loss of attitude reference.

If the innovation consistency check on GPs position has failed for long enough that the horizontal position uncertainty has reached a user specified size, then the states should be reset to the GPS position. This is to stop bad inertial data causing permanent loss of GPs fusion which can happen if the inertial solution errors are growing faster than the innovation consistency gate.

Initialization in SITL is slow

The initialization in SITL is painfully slow and consumes a lot of time for developers.

The two delays to wait for are:

  • ekf2 initialized
  • home position initialized

Presumably both are due to the rather slow startup of ekf2.

It would be nicer to have this faster, or at least use a hack to speed it up for SITL.

EKF: come up with recommended default tuning parameters for lower quality boards

This user log with a pixhack board had large vibration errors on the accelerometer and very noisy baro data that caused a temporary loss of height reference. A different set of tuning defaults would have prevented this.

Note: The internal isolation design of the pixhack is poor and can cause clipping if resonance of the mount occurs. Unfortunately there are lots of those boards out there and users do not think they need to be isolated.

http://logs.uaventure.com/view/DJwKnqsFtHVJQuaKoEK8UY

This particular log would likely require a increase in baro observation noise to 3.0m and accel process noise to 0.5 m/s/s which would come at a cost of reduced angular accuracy and increased susceptibility to GPS glitches.

Specifying desired height sensor

Per control.cpp#L452-L470, what is the motivation for adding the _control_status.flags.XX as logical ors inside the if/else statements for baro/gps? Are we trying to limit the height sensor fusion to one sensor only or fuse all that are available?

If the prior, seems to make sense to add add a param check for VDIST_SENSOR_EV (which exists in the enum already) to the first if statement and remove the _control_status.flags checks for baro/gps. If the later is the case, what purpose does the _params.vdist_sensor_type serve?

Absolute heading and declination is unobservable when operating without absolute aiding

When operating with optical flow or some other relative aiding method, the absolute headin.g and magnetic declination is unobservable. To enable use of the more accurate 3-axis magnetometer fusion, fusion of synthetic declination observations is required to constrain declination drift and loss of absolute heading reference. The method to be implemented is here:

https://github.com/PX4/ecl/blob/master/matlab/generated/Inertial%20Nav%20EKF/Magnetic%20Declination%20Fusion.txt

Oscillations and settling time of EKF using EV

Ran some more motion tests today using the EV fusion updates that were pulled into master a few days ago (and the new alignment PR from yesterday -- alignment seems much faster). I'm passing in vision updates at 100Hz and they are pretty clean. There's quite of a bit of overshoot and settling time in the ekf (as compared to the vision measurements) that I'm struggling to tune out. Eg., as I'm walking with the drone, when I physically stop motion, the vision measurements flatline, but the ekf oscilates twice or so and eventually settles. I've played around with the noise parameters for both EV and accel/accel bias, with no clear trends to reduce the overshoot. Not sure what other nobs I can turn. Could use some advice. Log file with replay enabled here (not sure why the LPOS data isn't show up on logmuncher?): http://logs.uaventure.com/view/SWMESe69SkMENaTSPwHwcZ

Thanks!

TODO list for airspeed fusion

  • Increase the airspeed readout rate to 14 Hz and
  • And test in SITL
  • Make the estimator publish to the wind topic PX4/PX4-Autopilot#4147
  • Optimize the calculation of the covariance matrix by taking advantage of the sparseness in H
  • Add protection against the denominator in line 76 being too small #86
  • Move the check for if we want to fuse airspeed somewhere higher up
  • Implement the logic of when to fuse airspeed, i.e. not on the ground etc.
  • Make sure the wind states and covariances are initialized correctly when we start fusing airspeed
  • Clean up the use of TAS/EAS
  • Fix the issue with landed detected PX4/PX4-Autopilot#4155
  • Rename _airspeed_sample_delayed.airspeed to _airspeed_sample_delayed.true_airspeed

Robustness to onboard vibration

@priseborough @ndepal @CarlOlsson @boosfelm This is to discuss the effects of medium to strong vibration we saw on EKF2 and the relationship to other estimators which seemed to survive these better or at least hide the problem in a way that we felt they were fine to operate.

Could you share recent replay logs of these and maybe also a baseline flight with EKF1?

This is related to #125

Separate filter monitoring function for GPS quality

Addition of a separate filter monitoring function that looks at GPS innovations, eph, epv, speed accuracy, number of satellites, position variances, etc to determine if
a) Is the GPS solution is good enough to set an origin
b) Provide a position accuracy estimate to the system
c) Provide a dead-reckoning status to the system
d) Provide a validity status for the different states (eg attitude, hvel, hpos, vvel, vpos, wind, etc)
e) Provide position glitch warning to the system

Please make your job citable

Hi guys,
I'm doing some fusion algorithm research and has some work based on your code, so could you make the repo more friendly to be cited? The instruction is here.
Many thanks!

Autogenerate ECL sensor/motor interfaces

A lot of handwritten interface code is being done in ecl, for instance, GPS message structures etc. I think we should autogenerate these interfaces. Why not even using the existing uorb message generation in PX4/Firmware. This will keep ECL platform independent and make it easier to develop/read/maintain.

@Tumbili @LorenzMeier @priseborough

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.