psiphi75/ahrs

Update Issues

Closed this issue · 3 comments

Hello.
I'm having some trouble with this library when I update the values of the madgwick AHRS filter.
My application is a web app and i'm using Cordova to get it into Android. To get the acceleration I use that plugin which gives me a vector 3 in m/s² and that plugin to get the gyroscope. But when I get the euler angles after having the filter updated, the values are set to NaN.

So here's my question, what are the units of what you need to put into your update function ?
Am I using this library correctly ?

That's a good point, because units are not documented. I have updated the documentation.
The units are:

  • gyroscope: radians / s
  • accelerometer: g, where 1 g is 9.81 m/s²
  • magnetometer: unit-less, but a relative proportion of the Earth's magnetic field

Do you provide magnetometer data as well? If you don't then you can't supply the deltaTimeSec value.

It would be good to see the code you are using to initialise and call the plug.

Thank you for your answer !
Here's the code I have done :

    onmove: function(){
        if(this.isActive === true) {
            navigator.accelerometer.getCurrentAcceleration(this.onSuccessAcceleration.bind(this), this.onError.bind(this));
        }
    },

    onSuccessAcceleration: function (acceleration) {
        this.acceleration = acceleration;
        this.gyroscope.getCurrent(this.onSuccessDirection.bind(this), this.onError.bind(this));
    },

    onSuccessDirection: function(directions){
        this.directions = directions;
        this.madgwick.update(this.directions.x, this.directions.y, this.directions.z, this.acceleration.x, this.acceleration.y, this.acceleration.z);
        navigator.geolocation.getCurrentPosition(this.moveCamera.bind(this), this.onError.bind(this), this.application.geolocationOptions);
    },

    moveCamera: function(position){
        var position = ADV.GEO.projection.convertToPositionDegree(position.coords.latitude, position.coords.longitude, 0);
        this.application.mainCamera.position.set(position[0], position[1], position[2]);
        var orientation = this.madgwick.getEulerAngles();
        this.application.mainCamera.rotation.set(orientation.z, orientation.x, orientation.y);
    }

The onmove function is called for every render frame (about 125 ms).
I also give you an exemple about the results of the differents functions which get the accelerometer and the gyroscope :

this.directions :
x: -0.25652483105659485
y: -0.2624049782752991
z: 3.314098834991455

this.acclerations:
x: 7.2142720222473145
y: 3.555708169937134
z: 7.643636226654053

To correct that, I tried to divide the result of the accelerometer by 9.81 to get it in g and not in m/s². But I still got a NaN result. Am I doing it right ?

Closed with this fix: d510111
Issue was due to blatant copying from C code to JavaScript. JavaScript allows for undefined function parameters, these were not checked for and caused the issue.