aerostack2 / as2_platform_tello

BSD 3-Clause "New" or "Revised" License
0 stars 1 forks source link

[tello platform] Tello Height Estimate resets to zero #5

Closed mhl787156 closed 3 months ago

mhl787156 commented 4 months ago

HI guys,

I'm seeing a really odd effect in that the height estimate seems to keep resetting to zero.

For example I just have the tello on my desk and move it upwards then stop. Looking at the alphanumeric, the Z position increases until I stop, at which point it snaps back to zero.

image

Looking further, if i remove reading height from tello state, and then integrate over z velocity to get height things are a bit more stable - but the accuracy is terrible! https://github.com/aerostack2/as2_platform_tello/blob/465bcf41993626bf06a4b04e0c8df99de175110a/src/tello_platform.cpp#L355

Has anyone seen this effect before?

mhl787156 commented 3 months ago

Ah okay - back at testing this, I think i've worked out whats happening, and it's actually expected behaviour! I was doing benchtesting with the tello not armed - this must be the tello's method of ensuring zero height when takeoff is requested. This does not happen in flight (thankfully).

However we are still getting odd drifting and localisation problems with velocity control. We will be trying to debug this and will raise new issue when we have more information.

RPS98 commented 3 months ago

Hi @mhl787156,

Exactly, the Tello does not provide correct height estimation until it has taken off. We are working on an update to the platform.

The problem we encountered is that the Tello does not provide position information. The alternative is to perform inertial odometry, but the state update frequency is 10Hz, which makes it inaccurate. Therefore, we are trying to release a version that allows the platform to be used when there is an external localization system (e.g. mocap), or when position information is not required (e.g. using velocity references)

mhl787156 commented 3 months ago

Ah I was wondering why the updates were coming so slowly. The most I was seeing when sending a go-to command was that a single rc command was just being resent over and over, i'm assuming that it doesn't know where it is. Though the tello must have an internal position estimate, as the onboard position controller mode works right?

Yes we were heading towards the mocap direction too, I saw that you guys have a mocap state estimator module which supports mocap4ros2? Does it work straight away, or is there something missing?

RPS98 commented 3 months ago

Right, the Tello has an internal position estimator, but it doesn't provide this information through the SDK.

Yes, we support mocap4ros, and it should work fine; just change the state estimator plugin to mocap plugin. We will verify it in the coming weeks.

mhl787156 commented 3 months ago

For the mocap plugin how does the optitrack/mocap name match the aerostack drone name? Is it just assumed to be identical?

We will also be verifying next week! Will update on our results.

pariaspe commented 3 months ago

For the mocap plugin how does the optitrack/mocap name match the aerostack drone name? Is it just assumed to be identical?

All rigid bodies goes through the same topic (/mocap/rigid_bodies I believe), but each has its own rigid_body_name that matches the name given in the Mocap software.

Edit: Aerostack2 get that pose through the state_estimator config file:

/**:
  ros__parameters:
    use_ignition_tf: False
    rigid_body_name: "1"
    mocap_topic: "/mocap/rigid_bodies"
    twist_smooth_filter_cte: 0.1
    orientation_smooth_filter_cte: 0.1
mhl787156 commented 3 months ago

@pariaspe thanks for all that, if we have multiple tellos, is there a way to pass in a different rigid_body_name for each tello? Or should I have a config for each tello and use the tmux script to manage it.

Also just to check, you guys are using this project for optitrack? https://github.com/MOCAP4ROS2-Project/mocap4ros2_optitrack I think your crazyflie example uses your own mocap_optitrack - but that doesnt use the mocap4ros2 messages.

pariaspe commented 3 months ago

@pariaspe thanks for all that, if we have multiple tellos, is there a way to pass in a different rigid_body_name for each tello? Or should I have a config for each tello and use the tmux script to manage it.

You could use the same config file or different ones. To use only one file, try something like:

/**:
  ros__parameters:
    use_ignition_tf: False
    mocap_topic: "/mocap/rigid_bodies"
    twist_smooth_filter_cte: 0.1
    orientation_smooth_filter_cte: 0.1

/drone0/state_estimator:
  ros__parameters:
    rigid_body_name: "1"

/drone1/state_estimator:
  ros__parameters:
    rigid_body_name: "2"

/drone2/state_estimator:
  ros__parameters:
    rigid_body_name: "3"

Make sure to write the correct node name, other wise the parameter won't reach the node.

Also just to check, you guys are using this project for optitrack? https://github.com/MOCAP4ROS2-Project/mocap4ros2_optitrack I think your crazyflie example uses your own mocap_optitrack - but that doesnt use the mocap4ros2 messages.

We used mocap_optitrack in the past, but we are now using mocap4r2. We merged a month ago the changes to use it, make sure to pull the repo to get the latest changes.