currently MultiWii uses sensor data to calculate its orientation resulting in roll and pitch angles. If a magnetometer is present you also get a yaw angle (= heading). Additional sensor data can be height/altitude (from sonar, barometer and/or GPS, but only barometer data seems to be used in current versions) and velocity (also from the barometer, sonar, optical flow sensors, GPS and ever from the accelerometer).
However, the only time speed/velocity is calculated and used is in the GPS code, the waypoint code specifically.
I think some modes could be greatly improved if the multicopter would know it's speed and could adjust motors to change it accordingly.
Examples:
* level mode: this is basically a position hold using only the accelerometer. Position hold means the horizontal speed should be 0. If implemented this way level mode could even counteract wind to a certain amount.
* altitude hold mode: this is also a kind of position hold, but the vertical speed should be 0. The current implementation adjusts throttle directly without knowing anything about the speed of the copter, this makes it very dependend of the PIDs used.
* position hold mode: well, this is a position hold mode and needs GPS to hold an absolute position (there is no other sensor that could provide that short of some triangulation from groundstations or advanced computer vision). But GPS is not very accurate with small movements ... this could also be improved.
If we could merge the different sensor data in a more or less accurate global velocity vector the copter would always know how fast it is moving in a certain direction. This could be used as a base for the mentioned modes and even some new ones, e.g. some mode where the throttle stick controls the speed of ascent/descent instead of the throttle.
Problems i see:
* accelerometer data is very noisy because of vibrations. Only integrating them to get velocity will probably not work and introduce large errors if no other sensors are available to compensate. However, they should be ok for small time frames.
* i only know about kalman filters being used to merge sensor data like this, they aren't fast and hard to understand. There could be a simpler, less accurate way ...
* it will probably only be useful to pilots with additional sensors and GPS
What do you think?
First step: calculate vertical velocity and use it to improve the altitude hold mode
