User Tools

Site Tools


projects:gy-80

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
projects:gy-80 [2013/03/04 22:12]
mkucia [Phase IV]
projects:gy-80 [2013/03/04 22:13] (current)
mkucia [Source code]
Line 1: Line 1:
 +====== Sensor fusion ======
  
 +===== Overview =====
 +The aim of this project is to learn sensor fusion algorithms and implement them on ARM microcontroller.
 +==== GY-80 ====
 +GY-80 is a cheap sensor board. Available on Ebay and DealExtreme. \\
 +
 +{{:​projects:​gy-80.jpg?​350|http://​dx.com/​p/​gy-80-bmp085-9-axis-magnetic-acceleration-gyroscope-module-for-arduino-145912}}
 +
 +Board feature 4 sensors providing in total 10-dimensional information.
 +
 +^ Sensor ^ Description ^ I2C Address (8bit) ^
 +| [[http://​www.st.com/​st-web-ui/​static/​active/​en/​resource/​technical/​document/​datasheet/​CD00265057.pdf|L3G4200D]] | ST three-axis digital output gyroscope | 0x69 |
 +| [[http://​www.analog.com/​static/​imported-files/​data_sheets/​ADXL345.pdf|ADXL345]] | Analog.com 3axis Digital Accelerometer | 0x53 |
 +| [[http://​www51.honeywell.com/​aero/​common/​documents/​myaerospacecatalog-documents/​Defense_Brochures-documents/​HMC5883L_3-Axis_Digital_Compass_IC.pdf|HMC5883L]] | Honeywell Three-Axis Digital Compass | 0x1E |
 +| [[http://​www.bosch-sensortec.com/​content/​language1/​downloads/​BST-BMP085-DS000-05.pdf|BMP085]] | Bosh Digital Pressure Sensor | 0x77 |
 +===== Project assumptions =====
 +The purpose of this project is to provide sensor fusion solution using low-cost sensor board.
 +
 +
 +===== Phase I =====
 +
 +  * Build a I2C ↔ PClink
 +  * Set up sensors
 +  * Read data periodically
 +  * Plot the data
 +
 +<​html>​
 +<?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" ​   version="​1.1" ​   width="​308.83362" ​   height="​123.34399" ​   id="​svg2"> ​  <​defs ​     id="​defs4"​ />   <​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"​ />         <​dc:​title></​dc:​title> ​      </​cc:​Work> ​    </​rdf:​RDF> ​  </​metadata> ​  <​g ​     transform="​translate(-236.55353,​-229.71667)" ​     id="​layer1"> ​    <​rect ​       width="​68.185295" ​       height="​37.880722" ​       x="​247.55353" ​       y="​243.82584" ​       id="​rect3046" ​       style="​fill:#​0000ff;​fill-opacity:​0.56345179;​fill-rule:​evenodd;​stroke:#​000000;​stroke-width:​2;​stroke-linecap:​butt;​stroke-linejoin:​round;​stroke-miterlimit:​4;​stroke-opacity:​1;​stroke-dasharray:​none"​ />     <​rect ​       width="​68.185295" ​       height="​97.984833" ​       x="​356.45294" ​       y="​244.07584" ​       id="​rect3052" ​       style="​fill:#​ff0000;​fill-rule:​evenodd;​stroke:#​000000;​stroke-width:​2;​stroke-linecap:​butt;​stroke-linejoin:​round;​stroke-miterlimit:​4;​stroke-opacity:​1;​stroke-dasharray:​none"​ />     <​path ​       d="m 451.86259,​259.65721 -1.44809,​-0.83626 0,0.59655 -7.40156,0 1.44117,​-1.52261 c 0.12265,​-0.0983 0.28312,​-0.16727 0.44819,​-0.17109 0.6678,0 1.06437,​-1.8e-4 1.21034,​-4.1e-4 0.0989,​0.28191 0.36474,​0.48539 0.68071,​0.48539 0.39972,0 0.72411,​-0.32436 0.72411,​-0.72423 0,-0.40004 -0.32436,​-0.72429 -0.72411,​-0.72429 -0.31597,0 -0.58176,​0.20336 -0.68071,​0.48504 l -1.19616,​-2e-4 c -0.32418,0 -0.66389,​0.17787 -0.8801,​0.38638 0.006,​-0.006 0.0121,​-0.0128 -4e-4,​1.1e-4 -0.005,​0.005 -1.52903,​1.61528 -1.52903,​1.61528 -0.12239,​0.0982 -0.28278,​0.16669 -0.44774,​0.17063 l -0.8373,0 c -0.11098,​-0.55313 -0.59944,​-0.96988 -1.18536,​-0.96988 -0.66803,0 -1.20953,​0.54151 -1.20953,​1.20933 0,0.66803 0.5415,​1.20956 1.20953,​1.20956 0.58604,0 1.07449,​-0.41709 1.18548,​-0.97069 l 0.82263,0 c 0.002,0 0.004,​1.2e-4 0.006,0 l 1.8195,0 c 0.16464,​0.004 0.32483,​0.0728 0.4471,​0.1711 0,0 1.52411,​1.61001 1.52883,​1.61522 0.0122,​0.0129 0.006,0.006 1.1e-4,​1.1e-4 0.21622,​0.20849 0.55606,​0.38624 0.88031,​0.38624 l 1.15275,​-2e-4 0,0.48553 1.44846,0 0,-1.44832 -1.44846,0 0,0.4849 c 0,0 -0.30361,​-5e-4 -1.16687,​-5e-4 -0.16511,​-0.004 -0.32575,​-0.0727 -0.44835,​-0.17098 l -1.44148,​-1.5229 5.59152,0 0,0.5975 L 451.86259,​259.65721 Z" ​       id="​path1334"​ />     <​text ​       x="​268.34409" ​       y="​265.57367" ​       id="​text3866" ​       xml:​space="​preserve" ​       style="​font-size:​7.72295475px;​font-style:​normal;​font-weight:​normal;​line-height:​125%;​letter-spacing:​0px;​word-spacing:​0px;​fill:#​000000;​fill-opacity:​1;​stroke:​none;​font-family:​sans-serif"><​tspan ​         x="​268.34409" ​         y="​265.57367" ​         id="​tspan3868" ​         style="​font-style:​normal;​font-variant:​normal;​font-weight:​bold;​font-stretch:​normal;​fill:#​000000;​font-family:​Verdana;​-inkscape-font-specification:​Verdana">​GY-80</​tspan></​text> ​    <​path ​       d="m 347.32361,​269.49691 8.12932,​-9.83986 -8.12932,​-9.83986 0,5.67716 -22.45546,0 0,-5.67716 -8.12932,​9.83986 8.12932,​9.83986 0,-5.67716 L 347.32361,​263.81975 Z" ​       id="​path3887" ​       style="​fill:​none;​stroke:#​000000;​stroke-width:​1;​stroke-linecap:​round;​stroke-linejoin:​round;​stroke-miterlimit:​4;​stroke-opacity:​1;​stroke-dasharray:​none"​ />     <​text ​       x="​366.96191" ​       y="​290.33051" ​       id="​text3898" ​       xml:​space="​preserve" ​       style="​font-size:​7.72295475px;​font-style:​normal;​font-weight:​normal;​line-height:​125%;​letter-spacing:​0px;​word-spacing:​0px;​fill:#​000000;​fill-opacity:​1;​stroke:​none;​font-family:​sans-serif"><​tspan ​         x="​366.96191" ​         y="​290.33051" ​         id="​tspan3900" ​         style="​font-style:​normal;​font-variant:​normal;​font-weight:​bold;​font-stretch:​normal;​fill:#​000000;​font-family:​Verdana;​-inkscape-font-specification:​Verdana">​Stellaris</​tspan><​tspan ​         x="​366.96191" ​         y="​299.98419" ​         id="​tspan3902" ​         style="​font-style:​normal;​font-variant:​normal;​font-weight:​bold;​font-stretch:​normal;​fill:#​000000;​font-family:​Verdana;​-inkscape-font-specification:​Verdana">​Launchpad</​tspan></​text> ​    <​text ​       x="​330.93628" ​       y="​262.15964" ​       id="​text3916" ​       xml:​space="​preserve" ​       style="​font-size:​20px;​font-style:​normal;​font-weight:​normal;​line-height:​125%;​letter-spacing:​0px;​word-spacing:​0px;​fill:#​000000;​fill-opacity:​1;​stroke:​none;​font-family:​sans-serif"><​tspan ​         x="​330.93628" ​         y="​262.15964" ​         id="​tspan3918" ​         style="​font-size:​6.875px">​SPI</​tspan></​text> ​    <​path ​       d="m 456.57254,​269.4969 8.12931,​-9.83986 -8.12931,​-9.83986 0,5.67716 -22.45547,0 0,-5.67716 -8.12931,​9.83986 8.12931,​9.83986 0,-5.67716 L 456.57254,​263.81974 Z" ​       id="​path3924" ​       style="​fill:​none;​stroke:#​000000;​stroke-width:​1;​stroke-linecap:​round;​stroke-linejoin:​round;​stroke-miterlimit:​4;​stroke-opacity:​1;​stroke-dasharray:​none"​ />     <​rect ​       width="​68.185295" ​       height="​37.880722" ​       x="​466.20184" ​       y="​240.71667" ​       id="​rect3926" ​       style="​fill:#​ffffff;​fill-rule:​evenodd;​stroke:#​000000;​stroke-width:​2;​stroke-linecap:​butt;​stroke-linejoin:​round;​stroke-miterlimit:​4;​stroke-opacity:​1;​stroke-dasharray:​none"​ />     <​text ​       x="​494.48718" ​       y="​262.46454" ​       id="​text3928" ​       xml:​space="​preserve" ​       style="​font-size:​7.72295475px;​font-style:​normal;​font-weight:​normal;​line-height:​125%;​letter-spacing:​0px;​word-spacing:​0px;​fill:#​000000;​fill-opacity:​1;​stroke:​none;​font-family:​sans-serif"><​tspan ​         x="​494.48718" ​         y="​262.46454" ​         id="​tspan3930" ​         style="​font-style:​normal;​font-variant:​normal;​font-weight:​bold;​font-stretch:​normal;​fill:#​000000;​font-family:​Verdana;​-inkscape-font-specification:​Verdana">​PC</​tspan></​text> ​  </​g>​ </​svg>​
 +</​html>​
 +==== Launchpad connections ====
 +
 +  * Serial transmission parameters: ''​115200 8N1''​
 +
 +| 1.1 | GY-80 VCC_3.3V |
 +| 1.10 | GY-80 SDA |
 +| 1.9 | GY-80 SCL |
 +| GND | GY-80 GND |
 +
 +==== Source code ====
 +
 +    * [[:​projects:​gy-80:​Processing_GUI]]
 +==== Screenshots ====
 +{{:​projects:​gy-80_plotter.png?​direct|}}
 +
 +Notes:
 +  * Scaling is being adjusted in real time, shake sensor board to set maximum values so graph can be scaled to fit the window.
 +  * Keys ''​1''​ to ''​-''​ turn on/off plotting value
 +  * Key ''​c''​ clears the window
 +
 +===== Phase II =====
 +  * Implement 1D Kalman filter ​
 +
 +==== Screenshots ====
 +{{:​projects:​gy-80_kalman.png?​direct|}}
 +
 +Notes:
 +
 +  * Key ''​k''​ - toggles filtered graph
 +  * Key ''​m''​ - toggles measured value 
 +
 +==== Source code ====
 +
 +    * ARM code unchanged
 +    * [[:​projects:​gy-80:​Processing_GUI#​kalman]]
 +
 +===== Phase III =====
 +  * 2D Sensor fusion
 +
 +Following graph show angle measurement using accelerometer (red) and gyroscope (blue). Gyro clearly shows error-induced drift. ​
 +{{:​projects:​gy-80_drift.png?​direct|}}
 +==== Complementary filter ====
 +<​html>​
 +<?xml version="​1.0"​ encoding="​UTF-8"​ standalone="​no"?>​ <​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" ​   version="​1.2" ​   width="​590.6015" ​   height="​128.00433" ​   id="​svg2"> ​  <​defs ​     id="​defs4"> ​    <​marker ​       refX="​0" ​       refY="​0" ​       orient="​auto" ​       id="​marker4216" ​       style="​overflow:​visible"> ​      <​path ​         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" ​         transform="​matrix(-0.2,​0,​0,​-0.2,​-1.2,​0)" ​         id="​path3946" ​         style="​fill:#​4d4d4d;​fill-opacity:​1;​fill-rule:​evenodd;​stroke:#​4d4d4d;​stroke-width:​1pt;​stroke-opacity:​1"​ />     </​marker> ​    <​marker ​       refX="​0" ​       refY="​0" ​       orient="​auto" ​       id="​Arrow1Mend" ​       style="​overflow:​visible"> ​      <​path ​         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" ​         transform="​matrix(-0.4,​0,​0,​-0.4,​-4,​0)" ​         id="​path4202" ​         style="​fill:#​4d4d4d;​fill-opacity:​1;​fill-rule:​evenodd;​stroke:#​4d4d4d;​stroke-width:​1pt;​stroke-opacity:​1"​ />     </​marker> ​    <​marker ​       refX="​0" ​       refY="​0" ​       orient="​auto" ​       id="​Arrow1Lend" ​       style="​overflow:​visible"> ​      <​path ​         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" ​         transform="​matrix(-0.8,​0,​0,​-0.8,​-10,​0)" ​         id="​path3934" ​         style="​fill:#​4d4d4d;​fill-opacity:​1;​fill-rule:​evenodd;​stroke:#​4d4d4d;​stroke-width:​1pt;​stroke-opacity:​1"​ />     </​marker> ​    <​marker ​       refX="​0" ​       refY="​0" ​       orient="​auto" ​       id="​Arrow1Mstart" ​       style="​overflow:​visible"> ​      <​path ​         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" ​         transform="​matrix(0.4,​0,​0,​0.4,​4,​0)" ​         id="​path3970" ​         style="​fill:#​000000;​fill-opacity:​1;​fill-rule:​evenodd;​stroke:#​000000;​stroke-width:​1pt;​stroke-opacity:​1"​ />     </​marker> ​    <​marker ​       refX="​0" ​       refY="​0" ​       orient="​auto" ​       id="​marker5378" ​       style="​overflow:​visible"> ​      <​path ​         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" ​         transform="​matrix(-0.2,​0,​0,​-0.2,​-1.2,​0)" ​         id="​path5380" ​         style="​fill:#​000000;​fill-opacity:​1;​fill-rule:​evenodd;​stroke:#​000000;​stroke-width:​1pt;​stroke-opacity:​1"​ />     </​marker> ​    <​marker ​       refX="​0" ​       refY="​0" ​       orient="​auto" ​       id="​marker5314" ​       style="​overflow:​visible"> ​      <​path ​         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" ​         transform="​matrix(-0.2,​0,​0,​-0.2,​-1.2,​0)" ​         id="​path5316" ​         style="​fill:#​000000;​fill-opacity:​1;​fill-rule:​evenodd;​stroke:#​000000;​stroke-width:​1pt;​stroke-opacity:​1"​ />     </​marker> ​    <​marker ​       refX="​0" ​       refY="​0" ​       orient="​auto" ​       id="​marker5268" ​       style="​overflow:​visible"> ​      <​path ​         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" ​         transform="​matrix(0.2,​0,​0,​0.2,​1.2,​0)" ​         id="​path5270" ​         style="​fill:#​000000;​fill-opacity:​1;​fill-rule:​evenodd;​stroke:#​000000;​stroke-width:​1pt;​stroke-opacity:​1"​ />     </​marker> ​    <​marker ​       refX="​0" ​       refY="​0" ​       orient="​auto" ​       id="​Arrow1Send" ​       style="​overflow:​visible"> ​      <​path ​         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" ​         transform="​matrix(-0.2,​0,​0,​-0.2,​-1.2,​0)" ​         id="​path3979" ​         style="​fill:#​000000;​fill-opacity:​1;​fill-rule:​evenodd;​stroke:#​000000;​stroke-width:​1pt;​stroke-opacity:​1"​ />     </​marker> ​    <​marker ​       refX="​0" ​       refY="​0" ​       orient="​auto" ​       id="​marker4426" ​       style="​overflow:​visible"> ​      <​path ​         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" ​         transform="​matrix(-0.2,​0,​0,​-0.2,​-1.2,​0)" ​         id="​path4428" ​         style="​fill:#​000000;​fill-opacity:​1;​fill-rule:​evenodd;​stroke:#​000000;​stroke-width:​1pt;​stroke-opacity:​1"​ />     </​marker> ​    <​marker ​       refX="​0" ​       refY="​0" ​       orient="​auto" ​       id="​marker4306" ​       style="​overflow:​visible"> ​      <​path ​         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" ​         transform="​matrix(-0.8,​0,​0,​-0.8,​-10,​0)" ​         id="​path4308" ​         style="​fill:#​000000;​fill-opacity:​1;​fill-rule:​evenodd;​stroke:#​000000;​stroke-width:​1pt;​stroke-opacity:​1"​ />     </​marker> ​    <​marker ​       refX="​0" ​       refY="​0" ​       orient="​auto" ​       id="​marker4240" ​       style="​overflow:​visible"> ​      <​path ​         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" ​         transform="​matrix(0.2,​0,​0,​0.2,​1.2,​0)" ​         id="​path4242" ​         style="​fill:#​000000;​fill-opacity:​1;​fill-rule:​evenodd;​stroke:#​000000;​stroke-width:​1pt;​stroke-opacity:​1"​ />     </​marker> ​    <​marker ​       refX="​0" ​       refY="​0" ​       orient="​auto" ​       id="​Arrow1Sstart" ​       style="​overflow:​visible"> ​      <​path ​         d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" ​         transform="​matrix(0.2,​0,​0,​0.2,​1.2,​0)" ​         id="​path3976" ​         style="​fill:#​000000;​fill-opacity:​1;​fill-rule:​evenodd;​stroke:#​000000;​stroke-width:​1pt;​stroke-opacity:​1"​ />     </​marker> ​  </​defs> ​  <​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"​ />         <​dc:​title></​dc:​title> ​      </​cc:​Work> ​    </​rdf:​RDF> ​  </​metadata> ​  <​g ​     transform="​translate(-0.67397976,​-354.68845)" ​     id="​layer1"> ​    <​path ​       d="m 515.91803,​418.69061 67.87945,​0" ​       id="​path3940" ​       style="​fill:​none;​stroke:#​4d4d4d;​stroke-width:​4.88637638;​stroke-linecap:​round;​stroke-linejoin:​round;​stroke-miterlimit:​14.39999962;​stroke-opacity:​1;​stroke-dasharray:​none"​ />     <​path ​       d="m 108.72001,​383.78792 176.17548,​0" ​       id="​path3921" ​       style="​fill:​none;​stroke:#​4d4d4d;​stroke-width:​4.88637638;​stroke-linecap:​round;​stroke-linejoin:​round;​stroke-miterlimit:​14.39999962;​stroke-opacity:​1;​stroke-dasharray:​none"​ />     <​path ​       d="m 108.72001,​453.5933 36.56472,​0" ​       id="​path3923" ​       style="​fill:​none;​stroke:#​4d4d4d;​stroke-width:​4.88637638;​stroke-linecap:​round;​stroke-linejoin:​round;​stroke-miterlimit:​14.39999962;​stroke-opacity:​1;​stroke-dasharray:​none"​ />     <​path ​       d="m 248.33076,​453.5933 36.56471,​0" ​       id="​path3925" ​       style="​fill:​none;​stroke:#​4d4d4d;​stroke-width:​4.88637638;​stroke-linecap:​round;​stroke-linejoin:​round;​stroke-miterlimit:​14.39999962;​stroke-opacity:​1;​stroke-dasharray:​none"​ />     <​path ​       d="m 387.94154,​383.78792 49.86092,​34.90269 -49.86096,​34.90269" ​       id="​path3927" ​       style="​fill:​none;​stroke:#​4d4d4d;​stroke-width:​4.88637638;​stroke-linecap:​round;​stroke-linejoin:​round;​stroke-miterlimit:​14.39999962;​stroke-opacity:​1;​stroke-dasharray:​none"​ />     <​rect ​       width="​103.04603" ​       height="​48.198948" ​       x="​5.6739798" ​       y="​359.68845" ​       id="​rect3846" ​       style="​fill:#​cccccc;​fill-opacity:​1;​stroke:​none"​ />     <​text ​       x="​30.220692" ​       y="​369.74966" ​       id="​text3848" ​       xml:​space="​preserve" ​       style="​font-size:​10.17995071px;​font-style:​normal;​font-weight:​normal;​line-height:​125%;​letter-spacing:​0px;​word-spacing:​0px;​fill:#​000000;​fill-opacity:​1;​stroke:​none;​font-family:​Verdana;​-inkscape-font-specification:​Verdana"><​tspan ​         x="​30.220692" ​         y="​369.74966" ​         id="​tspan3850" ​         style="​font-size:​10.17995071px;​font-family:​Verdana;​-inkscape-font-specification:​Verdana">​Accelerometer</​tspan></​text> ​    <​rect ​       width="​103.04603" ​       height="​48.198948" ​       x="​5.6739798" ​       y="​429.49384" ​       id="​rect3852" ​       style="​fill:#​cccccc;​fill-opacity:​1;​stroke:​none"​ />     <​text ​       x="​50.953392" ​       y="​439.3761" ​       id="​text3854" ​       xml:​space="​preserve" ​       style="​font-size:​10.17995071px;​font-style:​normal;​font-weight:​normal;​line-height:​125%;​letter-spacing:​0px;​word-spacing:​0px;​fill:#​000000;​fill-opacity:​1;​stroke:​none;​font-family:​Verdana;​-inkscape-font-specification:​Verdana"><​tspan ​         x="​50.953392" ​         y="​439.3761" ​         id="​tspan3856" ​         style="​font-size:​10.17995071px;​font-family:​Verdana;​-inkscape-font-specification:​Verdana">​Gyroscope</​tspan></​text> ​    <​rect ​       width="​103.04603" ​       height="​48.198948" ​       x="​284.89548" ​       y="​359.68845" ​       id="​rect3858" ​       style="​fill:#​cccccc;​fill-opacity:​1;​stroke:​none"​ />     <​text ​       x="​337.785" ​       y="​369.43652" ​       id="​text3860" ​       xml:​space="​preserve" ​       style="​font-size:​10.17995071px;​font-style:​normal;​font-weight:​normal;​line-height:​125%;​letter-spacing:​0px;​word-spacing:​0px;​fill:#​000000;​fill-opacity:​1;​stroke:​none;​font-family:​Verdana;​-inkscape-font-specification:​Verdana"><​tspan ​         x="​337.785" ​         y="​369.43652" ​         id="​tspan3862" ​         style="​font-size:​10.17995071px;​font-family:​Verdana;​-inkscape-font-specification:​Verdana">​Low Pass </​tspan><​tspan ​         x="​337.785" ​         y="​382.16147" ​         id="​tspan3896" ​         style="​font-size:​10.17995071px;​font-family:​Verdana;​-inkscape-font-specification:​Verdana">​filter</​tspan></​text> ​    <​rect ​       width="​103.04603" ​       height="​48.198948" ​       x="​145.28473" ​       y="​429.49384" ​       id="​rect3864" ​       style="​fill:#​cccccc;​fill-opacity:​1;​stroke:​none"​ />     <​text ​       x="​188.74985" ​       y="​439.55505" ​       id="​text3866" ​       xml:​space="​preserve" ​       style="​font-size:​10.17995071px;​font-style:​normal;​font-weight:​normal;​line-height:​125%;​letter-spacing:​0px;​word-spacing:​0px;​fill:#​000000;​fill-opacity:​1;​stroke:​none;​font-family:​Verdana;​-inkscape-font-specification:​Verdana"><​tspan ​         x="​186.74985" ​         y="​439.55505" ​         id="​tspan3868" ​         style="​font-size:​10.17995071px;​font-family:​Verdana;​-inkscape-font-specification:​Verdana">​Integration</​tspan></​text> ​    <​g ​       transform="​matrix(0.16581277,​0,​0,​0.16581277,​337.30328,​349.24206)" ​       id="​layer1-0"> ​      <​path ​         d="m -240.65258,​203.78557 c 0,0 28.57143,​-61.42858 62.14286,0 33.57143,​61.42856 61.42857,​-1.07143 61.42857,​-1.07143" ​         id="​path2876" ​         style="​fill:​none;​stroke:#​000000;​stroke-width:​3;​stroke-linecap:​butt;​stroke-linejoin:​miter;​stroke-miterlimit:​4;​stroke-opacity:​1;​stroke-dasharray:​none"​ />       <​path ​         d="m -191.24442,​216.2328 21.41119,​-21.68926" ​         id="​path2878" ​         style="​fill:​none;​stroke:#​000000;​stroke-width:​3;​stroke-linecap:​butt;​stroke-linejoin:​miter;​stroke-miterlimit:​4;​stroke-opacity:​1;​stroke-dasharray:​none"​ />       <​path ​         d="m -240.0424,​249.87743 c 0,0 28.57143,​-61.42856 62.14286,0 33.57143,​61.42857 61.42857,​-1.07143 61.42857,​-1.07143" ​         id="​path2876-0" ​         style="​fill:​none;​stroke:#​000000;​stroke-width:​3;​stroke-linecap:​butt;​stroke-linejoin:​miter;​stroke-miterlimit:​4;​stroke-opacity:​1;​stroke-dasharray:​none"​ />       <​rect ​         width="​185.74904" ​         height="​185.1929" ​         x="​-271.0358" ​         y="​132.19884" ​         id="​rect2911" ​         style="​opacity:​0;​fill:#​0000ff;​fill-rule:​evenodd;​stroke:#​000000;​stroke-width:​1px;​stroke-linecap:​butt;​stroke-linejoin:​miter;​stroke-opacity:​1"​ />       <​rect ​         width="​185.59811" ​         height="​184.48582" ​         x="​-269.84805" ​         y="​135.61113" ​         id="​rect3707" ​         style="​fill:​none;​stroke:#​000000;​stroke-width:​3;​stroke-miterlimit:​4;​stroke-opacity:​1;​stroke-dasharray:​none"​ />     </​g> ​    <​text ​       x="​156.22107" ​       y="​463.87433" ​       id="​text3898" ​       xml:​space="​preserve" ​       style="​font-size:​23.26845932px;​font-style:​normal;​font-weight:​normal;​line-height:​125%;​letter-spacing:​0px;​word-spacing:​0px;​fill:#​000000;​fill-opacity:​1;​stroke:​none;​font-family:​sans-serif"><​tspan ​         x="​156.22107" ​         y="​463.87433" ​         id="​tspan3900">​∫</​tspan></​text> ​    <​rect ​       width="​103.04603" ​       height="​48.198948" ​       x="​284.89548" ​       y="​429.49384" ​       id="​rect3902" ​       style="​fill:#​cccccc;​fill-opacity:​1;​stroke:​none"​ />     <​text ​       x="​334.4248" ​       y="​439.55505" ​       id="​text3904" ​       xml:​space="​preserve" ​       style="​font-size:​10.17995071px;​font-style:​normal;​font-weight:​normal;​line-height:​125%;​letter-spacing:​0px;​word-spacing:​0px;​fill:#​000000;​fill-opacity:​1;​stroke:​none;​font-family:​Verdana;​-inkscape-font-specification:​Verdana"><​tspan ​         x="​334.4248" ​         y="​439.55505" ​         id="​tspan3906" ​         style="​font-size:​10.17995071px;​font-family:​Verdana;​-inkscape-font-specification:​Verdana">​High Pass </​tspan><​tspan ​         x="​334.4248" ​         y="​452.28" ​         id="​tspan3908" ​         style="​font-size:​10.17995071px;​font-family:​Verdana;​-inkscape-font-specification:​Verdana">​filter</​tspan></​text> ​    <​g ​       transform="​matrix(0.16581277,​0,​0,​0.16581277,​337.30328,​419.04744)" ​       id="​g3910"> ​      <​path ​         d="m -240.65258,​203.78557 c 0,0 28.57143,​-61.42858 62.14286,0 33.57143,​61.42856 61.42857,​-1.07143 61.42857,​-1.07143" ​         id="​path3912" ​         style="​fill:​none;​stroke:#​000000;​stroke-width:​3;​stroke-linecap:​butt;​stroke-linejoin:​miter;​stroke-miterlimit:​4;​stroke-opacity:​1;​stroke-dasharray:​none"​ />       <​path ​         d="m -191.24442,​251.31525 21.41119,​-21.68926" ​         id="​path3914" ​         style="​fill:​none;​stroke:#​000000;​stroke-width:​3;​stroke-linecap:​butt;​stroke-linejoin:​miter;​stroke-miterlimit:​4;​stroke-opacity:​1;​stroke-dasharray:​none"​ />       <​path ​         d="m -240.0424,​249.87743 c 0,0 28.57143,​-61.42856 62.14286,0 33.57143,​61.42857 61.42857,​-1.07143 61.42857,​-1.07143" ​         id="​path3916" ​         style="​fill:​none;​stroke:#​000000;​stroke-width:​3;​stroke-linecap:​butt;​stroke-linejoin:​miter;​stroke-miterlimit:​4;​stroke-opacity:​1;​stroke-dasharray:​none"​ />       <​rect ​         width="​185.74904" ​         height="​185.1929" ​         x="​-271.0358" ​         y="​132.19884" ​         id="​rect3918" ​         style="​opacity:​0;​fill:#​0000ff;​fill-rule:​evenodd;​stroke:#​000000;​stroke-width:​1px;​stroke-linecap:​butt;​stroke-linejoin:​miter;​stroke-opacity:​1"​ />       <​rect ​         width="​185.59811" ​         height="​184.48582" ​         x="​-269.84805" ​         y="​135.61113" ​         id="​rect3920" ​         style="​fill:​none;​stroke:#​000000;​stroke-width:​3;​stroke-miterlimit:​4;​stroke-opacity:​1;​stroke-dasharray:​none"​ />     </​g> ​    <​rect ​       width="​103.04603" ​       height="​48.198948" ​       x="​412.87201" ​       y="​394.59113" ​       id="​rect3922" ​       style="​fill:#​cccccc;​fill-opacity:​1;​stroke:​none"​ />     <​text ​       x="​466.86002" ​       y="​404.65234" ​       id="​text3924" ​       xml:​space="​preserve" ​       style="​font-size:​10.17995071px;​font-style:​normal;​font-weight:​normal;​line-height:​125%;​letter-spacing:​0px;​word-spacing:​0px;​fill:#​000000;​fill-opacity:​1;​stroke:​none;​font-family:​Verdana;​-inkscape-font-specification:​Verdana"><​tspan ​         x="​466.86002" ​         y="​404.65234" ​         id="​tspan3928" ​         style="​font-size:​10.17995071px;​font-family:​Verdana;​-inkscape-font-specification:​Verdana">​Combine</​tspan></​text> ​    <​flowRoot ​       id="​flowRoot3942" ​       xml:​space="​preserve" ​       style="​font-size:​40px;​font-style:​normal;​font-weight:​normal;​line-height:​125%;​letter-spacing:​0px;​word-spacing:​0px;​fill:#​000000;​fill-opacity:​1;​stroke:​none;​font-family:​sans-serif"><​flowRegion ​         id="​flowRegion3944"><​rect ​           width="​94.285713" ​           height="​40" ​           x="​747.14288" ​           y="​425.21933" ​           id="​rect3946"​ /></​flowRegion><​flowPara ​         id="​flowPara3948"​ /></​flowRoot> ​   <​text ​       x="​420.707" ​       y="​431.54776" ​       id="​text3952" ​       xml:​space="​preserve" ​       style="​font-size:​23.26845932px;​font-style:​normal;​font-weight:​normal;​line-height:​125%;​letter-spacing:​0px;​word-spacing:​0px;​fill:#​000000;​fill-opacity:​1;​stroke:​none;​font-family:​sans-serif"><​tspan ​         x="​420.707" ​         y="​431.54776" ​         id="​tspan3954">​Σ</​tspan></​text> ​    <​g ​       transform="​matrix(0.58171148,​0,​0,​0.58171148,​-109.87336,​156.35335)" ​       id="​g5258"> ​      <​path ​         d="m 226.09628,​377.95972 0,26.87761 -17.40435,​17.40435" ​         id="​path3956" ​         style="​fill:​none;​stroke:#​000000;​stroke-width:​1.5;​stroke-linecap:​butt;​stroke-linejoin:​miter;​stroke-miterlimit:​4;​stroke-opacity:​1;​stroke-dasharray:​none;​marker-start:​url(#​Arrow1Sstart);​marker-end:​url(#​Arrow1Send)"​ />       <​path ​         d="m 226.09628,​404.83733 19.94003,​0" ​         id="​path3958" ​         style="​fill:​none;​stroke:#​000000;​stroke-width:​1.5;​stroke-linecap:​butt;​stroke-linejoin:​miter;​stroke-miterlimit:​4;​stroke-opacity:​1;​stroke-dasharray:​none;​marker-end:​url(#​marker4426)"​ />     </​g> ​    <​g ​       transform="​matrix(0.58171148,​0,​0,​0.58171148,​-109.87336,​226.15873)" ​       id="​g5262"> ​      <​path ​         d="m 226.09628,​377.95972 0,26.87761 -17.40435,​17.40435" ​         id="​path5264" ​         style="​fill:​none;​stroke:#​000000;​stroke-width:​1;​stroke-linecap:​butt;​stroke-linejoin:​miter;​stroke-miterlimit:​4;​stroke-opacity:​1;​stroke-dasharray:​none"​ />       <​path ​         d="m 226.09628,​404.83733 19.94003,​0" ​         id="​path5266" ​         style="​fill:​none;​stroke:#​000000;​stroke-width:​1;​stroke-linecap:​butt;​stroke-linejoin:​miter;​stroke-miterlimit:​4;​stroke-opacity:​1;​stroke-dasharray:​none"​ />       <​path ​         d="m 49.498464,​544.37244 a 7.8571429,​7.8571429 0 1 1 11.327453,​-1.09071" ​         transform="​matrix(0.25389083,​0,​0,​0.54292706,​222.81255,​112.75886)" ​         id="​path5450" ​         style="​fill:​none;​stroke:#​000000;​stroke-width:​4.0401454;​stroke-linecap:​square;​stroke-linejoin:​round;​stroke-miterlimit:​4;​stroke-opacity:​1;​stroke-dasharray:​none"​ />       <​path ​         d="m 49.498464,​544.37244 a 7.8571429,​7.8571429 0 1 1 11.327453,​-1.09071" ​         transform="​matrix(-0.54292706,​0,​0,​0.28892633,​255.60056,​238.91937)" ​         id="​path5532" ​         style="​fill:​none;​stroke:#​000000;​stroke-width:​3.78727603;​stroke-linecap:​square;​stroke-linejoin:​round;​stroke-miterlimit:​4;​stroke-opacity:​1;​stroke-dasharray:​none"​ />       <​path ​         d="m 49.498464,​544.37244 a 7.8571429,​7.8571429 0 1 1 11.327453,​-1.09071" ​         transform="​matrix(-0.42533914,​-0.33742615,​-0.17956611,​0.22635025,​338.77061,​308.08723)" ​         id="​path5534" ​         style="​fill:​none;​stroke:#​000000;​stroke-width:​3.78727603;​stroke-linecap:​square;​stroke-linejoin:​round;​stroke-miterlimit:​4;​stroke-opacity:​1;​stroke-dasharray:​none"​ />     </​g> ​    <​text ​       x="​539.45557" ​       y="​411.70383" ​       id="​text3942" ​       xml:​space="​preserve" ​       style="​font-size:​23.26845932px;​font-style:​normal;​font-weight:​normal;​line-height:​125%;​letter-spacing:​0px;​word-spacing:​0px;​fill:#​000000;​fill-opacity:​1;​stroke:​none;​font-family:​sans-serif"><​tspan ​         x="​539.45557" ​         y="​411.70383" ​         id="​tspan3944" ​         style="​font-size:​14.5427866px;​font-style:​normal;​font-variant:​normal;​font-weight:​bold;​font-stretch:​normal;​font-family:​Verdana;​-inkscape-font-specification:​Verdana">​Angle</​tspan></​text> ​  </​g>​ </​svg> ​
 +</​html>​
 +
 +Complementary filter is a good alternative for small systems. http://​web.mit.edu/​scolton/​www/​filter.pdf
 +
 +==== Comparison ====
 +{{:​projects:​gy-80_kalmanvscomplf.png?​direct|}}
 +
 +Filters:
 +  * Red - Complementary
 +  * Green - Kalman
 +
 +While both methods provided unbiased value, the Kalman filter provided more stable readout. ​
 +Present-day MCUs provide sufficient power to use Kalman filter in real-time.
 +===== Phase IV =====
 +  * Build balancing robot.
 +
 +{{http://​www.youtube.com/​v/​CwFBXYt4UKg?​.swf?​420×315}}
 +
 +The robot consists of 5 parts: Tamiya gearbox, double H-bridge driver, Bluetooth wireless module, Stellaris launchpad board and GY-80 sensor board.
 +The power is provided externally.
 +
 +GY-80 board provides accelerometer and gyro sensor measurement at 100 [Hz] (UPS variable). Sensor data is then processed by kalman filter and feed into PI controller.
 +Control signal is driving PWM output driving motors H bridges. ​
 +
 +Notes:
 +  * The stability is good but not perfect
 +  * Kalman filter response was rally bad. I have boosted the response by multiplying angular acceleration value. Estimated angle value has overshot now but is fast enough.
 +  * Robot motors are powered externally. Wires are influencing robot stability.
 +  * Taller robot would be much better (bigger moment of inertia).
 +  * Both robot wheels are independent. Connected wheels would work much better reducing yaw.
 +
 +{{:​projects:​gy-80_balancer.zip|Source code}}
 +
 +{{:​projects:​gy-80_balancer.png?​nolink|}}
 +Robot operation. Red - accelerometer angle. Green - Gyro angular acceleration. Blue - estimated angle. Yellow - PI control signal.
 +===== References =====
 +
 +  * www.processing.org
 +  * [[http://​www.ti.com/​tool/​ek-lm4f120xl|TI Stellaris Launchpad]]
 +  * [[http://​www.cs.unc.edu/​~tracker/​ref/​s2001/​kalman/​index.html|An Introduction to the Kalman Filter]] - SIGGRAPH paper by Greg Welch and Gary Bishop
 +  * [[http://​web.mit.edu/​scolton/​www/​filter.pdf|The Balance Filter]] - MIT presentation by Shane Colton
 +  * [[http://​blog.tkjelectronics.dk/​2012/​09/​a-practical-approach-to-kalman-filter-and-how-to-implement-it/​|tkjelectronics blog]] - A practical approach to Kalman filter and how to implement it
 +  * [[wp>​kalman_filter|Kalman filter, wikipedia]]
projects/gy-80.txt · Last modified: 2013/03/04 22:13 by mkucia