summaryrefslogtreecommitdiff
path: root/digital
diff options
context:
space:
mode:
Diffstat (limited to 'digital')
-rw-r--r--digital/beacon/triangle_beacon/doc/triangle.py125
-rw-r--r--digital/beacon/triangle_beacon/doc/triangle_drawing.svg578
-rw-r--r--digital/beacon/triangle_robot/doc/triangle.plot (renamed from digital/beacon/triangle/doc/triangle.plot)0
-rw-r--r--digital/beacon/triangle_robot/doc/triangle.py (renamed from digital/beacon/triangle/doc/triangle.py)0
-rw-r--r--digital/beacon/triangle_robot/doc/triangle_drawing.svg (renamed from digital/beacon/triangle/doc/triangle_drawing.svg)0
5 files changed, 703 insertions, 0 deletions
diff --git a/digital/beacon/triangle_beacon/doc/triangle.py b/digital/beacon/triangle_beacon/doc/triangle.py
new file mode 100644
index 00000000..828fe277
--- /dev/null
+++ b/digital/beacon/triangle_beacon/doc/triangle.py
@@ -0,0 +1,125 @@
+# Triangle - Triangulation beacon system study. {{{
+#
+# Copyright (C) 2010 Nicolas Schodet
+#
+# APBTeam:
+# Web: http://apbteam.org/
+# Email: team AT apbteam DOT org
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# }}}
+from math import *
+from numpy import *
+import Gnuplot, Gnuplot.funcutils
+
+B1 = array ([3000, 0])
+B2 = array ([3000, 2100])
+B3 = array ([0, 2100 / 2])
+
+def norm (v):
+ """Compute vector norm."""
+ return sqrt (sum (v ** 2))
+
+def rotate (v):
+ """Rotate a vector by pi/2."""
+ return array ([-v[1], v[0]])
+
+def angle (o, a, b):
+ """Compute angle (v_oa, v_ob)."""
+ v_oa = a - o
+ v_ob = b - o
+ # Use dot product to compute angle.
+ angle = acos (dot (v_oa, v_ob) / (norm (v_oa) * norm (v_ob)))
+ # Use cross product to determine angle sign.
+ if v_oa[0] * v_ob[1] - v_ob[0] * v_oa[1] >= 0:
+ return angle
+ else:
+ return 2 * pi - angle
+
+def solve (Ba, Bb, alphaa, alphab):
+ """Solve using angles."""
+ l = norm (Ba - Bb)
+ d = l * sin (alphaa) * sin (alphab) / sin (alphaa + alphab)
+ b = d / tan (alphaa)
+ v_n = Bb - Ba
+ v_n = v_n / norm (v_n)
+ o = Ba + v_n * b + rotate (v_n) * d
+ return o
+
+def trace (Ba, Bb, o, f, output, factor):
+ """Trace f()[output] * factor for alphan corresponding to the point o."""
+ # Compute angles.
+ alphaa = angle (Ba, Bb, o)
+ alphab = angle (Bb, o, Ba)
+ # Return.
+ return f (Ba, Bb, alphaa, alphab)[output] * factor
+
+def compute_prec (Ba, Bb, o, f, prec):
+ """Return an aproximation of distance error with the given angle error."""
+ # Compute angles.
+ alphaa = angle (Ba, Bb, o)
+ alphab = angle (Bb, o, Ba)
+ # Evaluate error.
+ e = 0
+ for i in ((-1, -1), (-1, 1), (1, -1), (1, 1)):
+ o2 = f (Ba, Bb, alphaa + i[0] * prec, alphab + i[1] * prec)
+ e = max (norm (o - o2), e)
+ return e
+
+if __name__ == '__main__':
+ # Parameters.
+ Ba = B1
+ Bb = B2
+ method = solve
+ prec = 2 * pi / 720
+ plot = 'prec'
+ style = 'map'
+ hardcopy = None
+ zrange = None
+ # Setup gnuplot.
+ persist = False
+ g = Gnuplot.Gnuplot (persist = persist)
+ g ('set term x11')
+ g ('set style data lines')
+ if style == '3d':
+ pass
+ else:
+ g ('set view map')
+ g ('set nosurface')
+ if style == 'map':
+ g ('set pm3d')
+ elif style == 'iso':
+ g ('set contour')
+ g.set_range ('xrange', (0,3000))
+ g.set_range ('yrange', (0,2100))
+ if zrange:
+ g.set_range ('zrange', zrange)
+ x = arange (25, 3000, 50)
+ y = arange (25, 2100, 50)
+ # Plot:
+ if plot == 'prec':
+ g ('set cntrparam levels discrete 5, 10, 20, 30, 40, 50, 100, 150, 200, 500')
+ g ('set cbrange [0:100]')
+ g.splot (Gnuplot.funcutils.compute_GridData (x, y,
+ lambda x, y: compute_prec (Ba, Bb, array ([x, y]), method, prec), binary=0))
+ else:
+ g.splot (Gnuplot.funcutils.compute_GridData (x, y,
+ lambda x, y: trace (Ba, Bb, array ([x, y]), method, plot, 1), binary=0))
+ # Hardcopy:
+ if hardcopy:
+ g.hardcopy (filename = hardcopy, terminal = 'png')
+ if not persist:
+ raw_input ("Pause...")
diff --git a/digital/beacon/triangle_beacon/doc/triangle_drawing.svg b/digital/beacon/triangle_beacon/doc/triangle_drawing.svg
new file mode 100644
index 00000000..e501d427
--- /dev/null
+++ b/digital/beacon/triangle_beacon/doc/triangle_drawing.svg
@@ -0,0 +1,578 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="744.09448819"
+ height="1052.3622047"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="triangle_drawing.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/nico/robot/beacon_triangulation.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ version="1.1">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Send"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Send"
+ style="overflow:visible;">
+ <path
+ id="path4976"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(0.3) rotate(180) translate(-2.3,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Mend"
+ style="overflow:visible;">
+ <path
+ id="path3249"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(0.6) rotate(180) translate(0,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Sstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Sstart"
+ style="overflow:visible">
+ <path
+ id="path3252"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(0.3) translate(-2.3,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Mstart"
+ style="overflow:visible">
+ <path
+ id="path3246"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(0.6) translate(0,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path3222"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="6.1230318e-14 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective10" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.2212581"
+ inkscape:cx="240.46582"
+ inkscape:cy="865"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1366"
+ inkscape:window-height="753"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2387"
+ visible="true"
+ enabled="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="background"
+ sodipodi:insensitive="true">
+ <rect
+ style="opacity:1;fill:#0c81c6;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect2415"
+ width="300"
+ height="210"
+ x="90"
+ y="82.362183" />
+ </g>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="display:inline;fill:#666666;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.50000000000000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;overflow:visible"
+ id="rect3191"
+ width="10"
+ height="10"
+ x="390"
+ y="72.362183" />
+ <rect
+ style="fill:#e75130;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect3197"
+ width="30"
+ height="30"
+ x="113.84435"
+ y="298.74231"
+ transform="matrix(0.7868701,-0.6171187,0.6171187,0.7868701,0,0)" />
+ <rect
+ style="fill:#666666;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect3199"
+ width="10"
+ height="10"
+ x="123.84435"
+ y="308.74231"
+ transform="matrix(0.7868701,-0.6171187,0.6171187,0.7868701,0,0)" />
+ <rect
+ style="opacity:1;fill:#666666;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect3193"
+ width="10"
+ height="10"
+ x="390"
+ y="292.36218" />
+ <rect
+ style="opacity:1;fill:#666666;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect3195"
+ width="10"
+ height="10"
+ x="80"
+ y="182.36218" />
+ <path
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 295,167.36218 L 395,77.362183"
+ id="path3209"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 295,167.36218 L 395,297.36218"
+ id="path3211"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 295,167.36218 L 85,187.36218"
+ id="path3213"
+ sodipodi:nodetypes="cc" />
+ <g
+ id="g6160"
+ transform="translate(120,100)">
+ <text
+ id="text6129"
+ y="162.36218"
+ x="255"
+ style="font-size:12px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="162.36218"
+ x="255"
+ id="tspan6131"
+ sodipodi:role="line">α</tspan></text>
+ <text
+ id="text6149"
+ y="164.36218"
+ x="263"
+ style="font-size:8px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="164.36218"
+ x="263"
+ id="tspan6151"
+ sodipodi:role="line">1</tspan></text>
+ </g>
+ <g
+ id="g7835"
+ transform="translate(152,-17)">
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="200"
+ y="117.36218"
+ id="text6168"><tspan
+ sodipodi:role="line"
+ id="tspan6170"
+ x="200"
+ y="117.36218">α</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="208"
+ y="119.36218"
+ id="text6172"><tspan
+ sodipodi:role="line"
+ id="tspan6174"
+ x="208"
+ y="119.36218">2</tspan></text>
+ </g>
+ <g
+ id="g7841"
+ transform="translate(-80,-5)">
+ <text
+ id="text6178"
+ y="200.36218"
+ x="197"
+ style="font-size:12px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="200.36218"
+ x="197"
+ id="tspan6180"
+ sodipodi:role="line">α</tspan></text>
+ <text
+ id="text6182"
+ y="202.36218"
+ x="205"
+ style="font-size:8px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="202.36218"
+ x="205"
+ id="tspan6184"
+ sodipodi:role="line">3</tspan></text>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="405"
+ y="302.36218"
+ id="text6194"><tspan
+ sodipodi:role="line"
+ id="tspan6196"
+ x="405"
+ y="302.36218">B1</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="405"
+ y="82.362183"
+ id="text6198"><tspan
+ sodipodi:role="line"
+ id="tspan6200"
+ x="405"
+ y="82.362183">B2</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="60"
+ y="192.36218"
+ id="text6202"><tspan
+ sodipodi:role="line"
+ id="tspan6204"
+ x="60"
+ y="192.36218">B3</tspan></text>
+ <path
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);marker-end:url(#Arrow2Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 90,272.36218 L 90,292.36218 L 110,292.36218"
+ id="path6206" />
+ <text
+ xml:space="preserve"
+ style="font-size:8px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="109.84116"
+ y="287.63474"
+ id="text7807"><tspan
+ sodipodi:role="line"
+ id="tspan7809"
+ x="109.84116"
+ y="287.63474">x</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="94.862816"
+ y="268.49576"
+ id="text7811"><tspan
+ sodipodi:role="line"
+ id="tspan7813"
+ x="94.862816"
+ y="268.49576">y</tspan></text>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="Notation"
+ style="display:inline">
+ <path
+ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2, 1;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 85,187.36218 L 395,77.362183 L 395,297.36218 L 85,187.36218 z"
+ id="path2427" />
+ <g
+ id="g3223"
+ transform="translate(30.710336,6.442031)">
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="200"
+ y="117.36218"
+ id="text3225"><tspan
+ sodipodi:role="line"
+ id="tspan3227"
+ x="200"
+ y="117.36218">b</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="208"
+ y="119.36218"
+ id="text3229"><tspan
+ sodipodi:role="line"
+ id="tspan3231"
+ x="208"
+ y="119.36218">2</tspan></text>
+ </g>
+ <g
+ transform="translate(35,52)"
+ id="g3233">
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="197"
+ y="200.36218"
+ id="text3235"><tspan
+ sodipodi:role="line"
+ id="tspan3237"
+ x="197"
+ y="200.36218">b</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="205"
+ y="202.36218"
+ id="text3239"><tspan
+ sodipodi:role="line"
+ id="tspan3241"
+ x="205"
+ y="202.36218">3</tspan></text>
+ </g>
+ <g
+ transform="translate(143,28)"
+ id="g3253">
+ <text
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="255"
+ y="162.36218"
+ id="text3255"><tspan
+ sodipodi:role="line"
+ id="tspan3257"
+ x="255"
+ y="162.36218">b</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="263"
+ y="164.36218"
+ id="text3259"><tspan
+ sodipodi:role="line"
+ id="tspan3261"
+ x="263"
+ y="164.36218">1</tspan></text>
+ </g>
+ <path
+ sodipodi:type="arc"
+ style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:url(#Arrow2Mstart);marker-mid:none;marker-end:url(#Arrow2Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path3339"
+ sodipodi:cx="395"
+ sodipodi:cy="77.362183"
+ sodipodi:rx="30"
+ sodipodi:ry="30"
+ d="M 371.60222,96.138332 A 30,30 0 0 1 367.10491,88.401385"
+ sodipodi:start="2.465344"
+ sodipodi:end="2.7647641"
+ sodipodi:open="true" />
+ <path
+ sodipodi:open="true"
+ sodipodi:end="2.3489533"
+ sodipodi:start="1.6405728"
+ d="M 392.9084,107.28918 A 30,30 0 0 1 373.94096,98.728437"
+ sodipodi:ry="30"
+ sodipodi:rx="30"
+ sodipodi:cy="77.362183"
+ sodipodi:cx="395"
+ id="path6820"
+ style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:url(#Arrow2Mstart);marker-mid:none;marker-end:url(#Arrow2Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ sodipodi:type="arc" />
+ <g
+ transform="translate(120,-45)"
+ id="g6854">
+ <text
+ sodipodi:linespacing="125%"
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="255"
+ y="162.36218"
+ id="text6856"><tspan
+ sodipodi:role="line"
+ id="tspan6864"
+ x="255"
+ y="162.36218">β</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8px;font-style:normal;font-weight:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="263"
+ y="164.36218"
+ id="text6860"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6866"
+ x="263"
+ y="164.36218">2</tspan></text>
+ </g>
+ <path
+ sodipodi:open="true"
+ sodipodi:end="2.746608"
+ sodipodi:start="2.3131503"
+ d="M 374.71927,99.46856 A 30,30 0 0 1 367.30993,88.906003"
+ sodipodi:ry="30"
+ sodipodi:rx="30"
+ sodipodi:cy="77.362183"
+ sodipodi:cx="395"
+ id="path6891"
+ style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:url(#Arrow2Mstart);marker-mid:none;marker-end:url(#Arrow2Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ sodipodi:type="arc"
+ transform="matrix(1,0,0,-1,0,374.72437)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:url(#Arrow2Mstart);marker-mid:none;marker-end:url(#Arrow2Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path6893"
+ sodipodi:cx="395"
+ sodipodi:cy="77.362183"
+ sodipodi:rx="30"
+ sodipodi:ry="30"
+ d="M 392.9084,107.28918 A 30,30 0 0 1 377.89384,102.00725"
+ sodipodi:start="1.6405728"
+ sodipodi:end="2.1775522"
+ sodipodi:open="true"
+ transform="matrix(1,0,0,-1,0,374.72437)" />
+ <g
+ id="g6910"
+ transform="translate(102,113)">
+ <text
+ id="text6912"
+ y="162.36218"
+ x="255"
+ style="font-size:12px;font-style:normal;font-weight:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ sodipodi:linespacing="125%"><tspan
+ y="162.36218"
+ x="255"
+ id="tspan6914"
+ sodipodi:role="line">β</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text6916"
+ y="164.36218"
+ x="263"
+ style="font-size:8px;font-style:normal;font-weight:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ id="tspan6918"
+ sodipodi:role="line"
+ x="263"
+ y="164.36218">1</tspan></text>
+ </g>
+ <path
+ transform="matrix(1,0,0,-1,-310,264.72437)"
+ sodipodi:end="6.3275228"
+ sodipodi:start="5.9954464"
+ d="M 423.76664,68.848638 A 30,30 0 0 1 424.97052,78.691872"
+ sodipodi:ry="30"
+ sodipodi:rx="30"
+ sodipodi:cy="77.362183"
+ sodipodi:cx="395"
+ id="path6930"
+ style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:url(#Arrow2Mstart);marker-mid:none;marker-end:url(#Arrow2Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ sodipodi:type="arc"
+ sodipodi:open="true" />
+ <path
+ sodipodi:open="true"
+ sodipodi:type="arc"
+ style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:url(#Arrow2Mstart);marker-mid:none;marker-end:url(#Arrow2Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path6932"
+ sodipodi:cx="395"
+ sodipodi:cy="77.362183"
+ sodipodi:rx="30"
+ sodipodi:ry="30"
+ d="M 424.82708,80.578589 A 30,30 0 0 1 423.36853,87.120603"
+ sodipodi:start="0.10742"
+ sodipodi:end="0.33130854"
+ transform="matrix(1,0,0,-1,-310,264.72437)" />
+ <g
+ transform="translate(-148,8)"
+ id="g6946">
+ <text
+ sodipodi:linespacing="125%"
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-weight:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="255"
+ y="162.36218"
+ id="text6948"><tspan
+ sodipodi:role="line"
+ id="tspan6950"
+ x="255"
+ y="162.36218">β</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8px;font-style:normal;font-weight:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="263"
+ y="164.36218"
+ id="text6952"
+ sodipodi:linespacing="125%"><tspan
+ y="164.36218"
+ x="263"
+ sodipodi:role="line"
+ id="tspan6954">3</tspan></text>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:8px;font-style:normal;font-weight:normal;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="332.43591"
+ y="125.3694"
+ id="text6996"><tspan
+ sodipodi:role="line"
+ id="tspan6998"
+ x="332.43591"
+ y="125.3694" /></text>
+ </g>
+</svg>
diff --git a/digital/beacon/triangle/doc/triangle.plot b/digital/beacon/triangle_robot/doc/triangle.plot
index 8a104b9b..8a104b9b 100644
--- a/digital/beacon/triangle/doc/triangle.plot
+++ b/digital/beacon/triangle_robot/doc/triangle.plot
diff --git a/digital/beacon/triangle/doc/triangle.py b/digital/beacon/triangle_robot/doc/triangle.py
index 0471a417..0471a417 100644
--- a/digital/beacon/triangle/doc/triangle.py
+++ b/digital/beacon/triangle_robot/doc/triangle.py
diff --git a/digital/beacon/triangle/doc/triangle_drawing.svg b/digital/beacon/triangle_robot/doc/triangle_drawing.svg
index 32ea9e5b..32ea9e5b 100644
--- a/digital/beacon/triangle/doc/triangle_drawing.svg
+++ b/digital/beacon/triangle_robot/doc/triangle_drawing.svg