## Triangulation via Colinear Beacons

One of the issues I encounter fairly frequently in robotics is reliable positioning of a robot. In particular, assigning a specific location to a small robot in a small area is usually fairly difficult proposition. That is to say, most localization methods don't really work on the smaller scale- GPS, for instance, takes time to lock, doesn't really work so great indoors, and reaches about 1m accuracy in ideal conditions. For a large scale system, like a self-driving car, this may be sufficient, but in my apartment, where +/-1m can easily move you from one room to another, it's not really practical. Most local position identifiers work off map identification and are statistical in nature, essentially using feature identification to guess at where you are, based on what you can see. This typically requires a large database of information about the environment, which in many cases will be subject to frequent change.

In light of all these issues, I wanted to work on a system that would be more applicable to my situation. In particular, to work on a positioning resource which would be adjustable in scale. In the interest of implementation I also wanted something minimalist, with as few moving parts as possible, both literally and figuratively. A triangle is pretty simple, right? Let's start with that:

In light of all these issues, I wanted to work on a system that would be more applicable to my situation. In particular, to work on a positioning resource which would be adjustable in scale. In the interest of implementation I also wanted something minimalist, with as few moving parts as possible, both literally and figuratively. A triangle is pretty simple, right? Let's start with that:

What we have here is a pair of beacons (B1 and B2) a known distance

*l*apart. The target L is the location of the detector, whatever that may be. The detector itself measures the distances to the beacons, d1 and d2, respectively. This is sufficient information for us to deduce the location of L with respect to the beacons. Notice first that we can use the cosine formula to deduce the angle subtended by B1B2 from L: This angle will be essential for deducing the location of L. Now, let's say we know the location of the beacons (a fundamental requirement for a beacon to be useful really). Let's represent the locations of these beacons as two vectors

**B1**and**B2**. We can then specify a new vector**l**, the vector from B1 to B2, by the simple expression:**l**=**B**2 -**B**1.**I**is coordinate independent, since any choice for origin with respect to the beacons will yield the same difference vector: Now, we have a coordinate-independent reference,

dot(

It is easy to see that if we let

**l**, so we can construct vectors**d**1 and**d**2, which correspond to the undirected measured lengths. We'll direct these measures by projecting onto**l**and**lT**, a vector perpendicular to**l**, and constructed from it. Let's look at generating**l**T first. Recall that the dot product of two vectors is zero if and only if they are orthogonal. If we let**l**= <lx,ly>, and**l**T = <lTx,lTy>, then:dot(

**l**,**l**T) = lx(lTx) + ly(lTy) = 0It is easy to see that if we let

**l**T = <-ly,lx>, this equation is satisfied, and thus**l**is orthogonal to**l**T. Now, using these two components, we can locate L with respect to the beacons in coordinate independent form by projecting**d**1 onto them. In order to do so, we'll need the angle at B1 subtended by B2L. We can acquire this angle using the Sine Rule: