Servers by jDrones

Indoor Positioning with ArduPilot based on UWB modules


(Debupt) #1

Hello, everyone~

I would like to share my recent project about indoor positioning system based on UWB modules. I’m really appreciated about what Randy had done Pozyx with ArduPilot for non-GPS navigation. I would like to have a try with other methods.

The original idea is based on ArduPilot which can set to Loiter mode in an open environment, the natural idea is making a Fake GPS signal to cheat the drone as if it flies outdoors.

There are two ways for making a Fake GPS signal:

a. NMEA0183, this is a common GPS protocol which used for transporting information from GNSS receiver to other devices. The information contains latitude, longitude, altitude, satellite numbers, position fix, etc. As for ArduCopter firmware, it just uses GGA, RMC, VTG messages for getting enough information to locate position outdoors.

b. Mavlink GPS_INPUT(#232) command, this is a GPS sensor input message which is a raw sensor value.

I test these two ways and find that GPS_INPUT command is much better. My drone is not right here, so I may not supply some datas to indicate my judgement, really sorry.

Here is some diagrams to introduce that I have done.

  1. hardware diagram

  2. A QT GroundStation shows the drone position and sends Waypoint command

  1. Diagram shows the process to get GPS_INPUT message from UWB module

  1. Setting position of four anchors, ZYX refers to really distance between two anchors

  1. how to choose the original latitude and longitude. (It is based on degree precision, as UWB module has 15-20cm error, we can get from figure that 11 degrees is a better choice)

ps. I refer the Hendrik’s way for changing the firmware code of ArduCopter

pps. The test video and the log

(rmackay9) #2

Really great to see this. When developing the pozyx beacon support, we originally used the “fake GPS” (aka GPS_INPUT) method as a starting point but then moved onto the more integrated beacon approach. According to Paul Riseborough with individual beacons we can get some information even if only one beacon is within range and it helps the position estimation. I also found in testing that AP_Beacon worked better than when we were using the fake GPS method. In any case, the Fake GPS is definitely useful to have and I’ve seen others use this method as well for integrating with ROS.

Thanks for the blog post!

(TI) #3

Yes, thank you for outlining your solution!
I am not sure that I fully understand the ins and outs of it, but I am curious if this approach would also allow for a seamless and accurate moving between a “real”-GPS (outdoors) and a “fake”-GPS (indoors), essentially fusing the two environments?

What are your thoughts to achieve this?

P.S.: (We had another discussion in a similar vein here, but it has not come to full fruition yet)

(rmackay9) #4

The fusing of GPSs is a good idea. I guess you’ve seen this page describing how the blending works?

The key thing is that the weighting between the GPSs depends upon the state (i.e. 2D fix, 3D Fix, RTK Fixed/Floating) and the GPS provided estimated speed and position accuracy.

Also you can define whether you’d like the EKF to hard switch between the GPSs (aka “Use best”) or blend. My guess is you’d want to go for the hard switch actually because it will be difficult to provide the estimated speed and position accuracy with NMEA messages. If you could provide this extra info then the blending would work.

(TI) #5

Thanks for those insights and the link.

I see a need for this while moving back and forth between a solid GPS signal, a somewhat degraded GPS signal and an area fitted with a secondary beacon network providing a “Fake GPS” signal.

So my first take-away would be that the “Fake GPS” setup ought to also supply speed estimation for this scenario to fuse well.

I am not familiar enough how position accuracy is communicated. Could you maybe elaborate a bit how this could be achieved with a UWB/ Pozyx/ similar beacon network?