diff --git a/calib/calib.nb b/calib/calib.nb new file mode 100644 index 0000000..a18f846 --- /dev/null +++ b/calib/calib.nb @@ -0,0 +1,860 @@ +(* Content-type: application/vnd.wolfram.mathematica *) + +(*** Wolfram Notebook File ***) +(* http://www.wolfram.com/nb *) + +(* CreatedBy='Mathematica 11.3' *) + +(*CacheID: 234*) +(* Internal cache information: +NotebookFileLineBreakTest +NotebookFileLineBreakTest +NotebookDataPosition[ 158, 7] +NotebookDataLength[ 38929, 850] +NotebookOptionsPosition[ 37210, 812] +NotebookOutlinePosition[ 37546, 827] +CellTagsIndexPosition[ 37503, 824] +WindowFrame->Normal*) + +(* Beginning of Notebook Content *) +Notebook[{ + +Cell[CellGroupData[{ +Cell[BoxData[ + RowBox[{"SetDirectory", "[", "\"\\"", + "]"}]], "Input", + CellChangeTimes->{{3.764181122949832*^9, 3.764181135056229*^9}}, + CellLabel->"In[1]:=",ExpressionUUID->"bb7c7b01-0cfa-4c90-a2db-09590ed14465"], + +Cell[BoxData["\<\"/home/alex/Programming/esp/uas-ugv\"\>"], "Output", + CellChangeTimes->{3.764181137613065*^9}, + CellLabel->"Out[1]=",ExpressionUUID->"d714e440-83e1-402e-946a-6ad01a10cf86"] +}, Open ]], + +Cell[BoxData[{ + RowBox[{ + RowBox[{"data", "=", + RowBox[{"Import", "[", + RowBox[{"\"\\"", ",", + RowBox[{"HeaderLines", "\[Rule]", "1"}]}], "]"}]}], + ";"}], "\[IndentingNewLine]", + RowBox[{ + RowBox[{"magdata", "=", + RowBox[{"data", "[", + RowBox[{"[", + RowBox[{"All", ",", + RowBox[{"7", ";;", "9"}]}], "]"}], "]"}]}], ";"}]}], "Input", + CellChangeTimes->{{3.764181138593279*^9, 3.764181180255095*^9}, { + 3.7641814517144814`*^9, 3.764181455934593*^9}, {3.764181490536357*^9, + 3.764181494963828*^9}, {3.764181657781171*^9, 3.7641816705271997`*^9}}, + CellLabel->"In[28]:=",ExpressionUUID->"9d982e0c-62ac-49c9-8fab-0efac1e57ee1"], + +Cell[BoxData[ + RowBox[{ + RowBox[{"plotdata", "[", "data_", "]"}], ":=", + RowBox[{"ListPlot", "[", + RowBox[{ + RowBox[{"{", + RowBox[{ + RowBox[{"data", "[", + RowBox[{"[", + RowBox[{"All", ",", + RowBox[{"1", ";;", "2"}]}], "]"}], "]"}], ",", + RowBox[{"data", "[", + RowBox[{"[", + RowBox[{"All", ",", + RowBox[{"2", ";;", "3"}]}], "]"}], "]"}], ",", + RowBox[{"Transpose", "[", + RowBox[{"{", + RowBox[{ + RowBox[{"data", "[", + RowBox[{"[", + RowBox[{"All", ",", "3"}], "]"}], "]"}], ",", + RowBox[{"data", "[", + RowBox[{"[", + RowBox[{"All", ",", "1"}], "]"}], "]"}]}], "}"}], "]"}]}], "}"}], + ",", + RowBox[{"AspectRatio", "\[Rule]", "1"}]}], "]"}]}]], "Input", + CellChangeTimes->{{3.764181183734476*^9, 3.764181194453432*^9}, { + 3.7641812278125753`*^9, 3.764181258624784*^9}, {3.764181292610927*^9, + 3.764181311588319*^9}, {3.764181372869302*^9, 3.764181404947816*^9}, { + 3.764181593568303*^9, 3.764181595326483*^9}, {3.764181673887734*^9, + 3.764181742499264*^9}}, + CellLabel->"In[30]:=",ExpressionUUID->"9e6d0196-dead-4dc5-9762-497e415abc3e"], + +Cell[CellGroupData[{ + +Cell[BoxData[ + RowBox[{"plotdata", "[", "magdata", "]"}]], "Input", + CellChangeTimes->{{3.764181745429572*^9, 3.7641817495884113`*^9}}, + CellLabel->"In[31]:=",ExpressionUUID->"55fc2693-bfc0-4284-878d-723d16de613e"], + +Cell[BoxData[ + GraphicsBox[{{}, {{}, + {RGBColor[0.368417, 0.506779, 0.709798], PointSize[0.004583333333333334], + AbsoluteThickness[1.6], PointBox[CompressedData[" +1:eJyl2XtQVNcZAHCC1geLr/hYRXBZWOVV3L0syGOBPewKRJwkNVqQWGoUTImP +gEmrxrIoYozSONaaQpuniVqNiSNkNKKCe0TRsGhQQ8EEdIVFxBaxlBgwiqmd +e777xznjfJNZ/5D5MbJ4zz3nex3t0rwXlnl6eHh4P/7r/1/zrW83VznG08zx +qoLkjFmU98n3nx67yzDyifYl9rvOh6NozbeHlkXoolBHBMzLzSz7Bc2Zdr+4 +SB0p2N579HelOeOo80/671wJuHfVDqb+I9uLJqR2nHwnLUrwz/28u5+99vF/ +9T/ZW6tbg1JXRzzRq/889qbqFO4uw+Lfbhzst+dVmSLSs8MFy88/kazs6dpw +vHQq6mjn1p7MsnvmLdu/KDRKZ+yY0xpViRfrHto92B/e8vucQtn3zZjnxjlO +r3TMgPdFeN/LPRjUp9fTy1/0aFQVuPf1tWVu0kXQi44ftHm9BsFvXlFbvnYF +06KhtTskdRDqS4V7t3rXe5D214OubhhUC9aMfvqTgjo9YfsEdY19hI9RMhK2 +DoLnZ9F67/qxbB1moZbfo4puPTGGLN8TLxjOH9G3Hjd4xaKG8+W/ZHJ5R1qA +235+hN/vR5ZNJrCPMK9xSvE/ZKuV53DX13TDiv6aYSTrz4fE/SXQJNie4zo9 +aQUhYSuHVfqrDKg/nnCoVXXKQoYeLjUZpfGCF2rG2Nauna08D+bDw3e1uxJm +EzluaAnvnzL7XPrBOLbfolHbDmtjZrpmksGrOnN7YIzguh0DE1eUh5IGyf+P +1c2S24Z4d9uqbjxWoEctn/tWO5xHzPJzDaezH//4hbpfCq7dvuhCw+AECv8f +zPLPedOX3wy41jAYKfjWVw59sTSWPlz94OauhGjUbL/R5at8WlZUxwiG8/Cr +bf+enJFvQs3Wi6y53/TWvfRYwSxPktxhvUV+zdFue/M/F9Z8d9ACcQ/16YVO +2pFmgThIee9MzQ9cNi+JROl6Kr6fE4Y6r+mG7dfpZgL5nPfmZ7b4LqpIgnxF +ML/X1TcvJUfH9n0i6iMXAiYsqtDS5wMeR+KSOMFQl/T87UTYyfIg1PL+DKJy +vuyz84Z8DfkXM8uHpGFu7bkqh1GwfP5DyYNbr1B/FUHN4o49tvtU9rrNFsGQ +f78KbqjydcSilvNWCIu7QYKzHniub5sUCnWMGfPAtiFd/bZAJX/whvPasie6 +NbXQgLrzD2e1U8vD6fYR507vy/7RzNt048TSlJxIiCcU853CiTdOVkfROccf ++Gp6jajl8x1O/1Xq1655JLntpR+EOo2JEmXrQnjD74Xzihlbb/n3+8G+Ri2v +Uzxh6+a2w+5fzdo9NIk888KVM5e8jILTw8YXfloWQNh+RB0zUJNzcK+Bsq+C +oc5nfQRq9vzs/WgpZqjf4JzwHm67fadhUMfibQxqyFtyHWwWPOaIpzU9O4GU +mK53HCvA3bK8aYrzrpmse8mjzZoQJ5j9O6g7UH/5bG/lgZJIwuK6YHk9p1Oo +0zGzOpX1BzrB8vuOUNYJM7xH2Ce8oW6Ceg0z1N29L4+6nmELobzZcyh1N2aW +D8zQt2Fm9R490nl+8Yt7jYLlfiOQyvtDg/qTStezha4w2mRqHT2q/j9m3pDf +YJ9jvj5t88aCOg17rltm3gvO3tYtqpAo5GnMrA9ifbqPYFZH06JL6wcipCEU +M9Ql0L/zZnFH2XeYnfsap7sMMyjkX95yXfCNGc4LZvm5QknT1KM1388xCV6V +d0w3PD8R4iNq+auV9WnBqD3OZlWXHExW+iveI5+z+b+xkxB4r5iXzHpqy80M +A4H5Am/o6+W+oNuMWV7fWXAu7LwbNyZd2W+bodTBmOEcQFxz11AnNr7b6bc/ +P0Yw5FPYJ5ghT5vmd1WdW24VLOdzo5IPMLN6TIkbmCFeQn3LG+YzULdihvPN +4rRgNk+hKZeHaIolA2oWJ2hqTPi6y2pJMFt/Cn0yZrbP7DMXPDpa5QgUzN6L +Ug9hhn3J6gPBkK/Yepoxe1/wSj6xJ5ayPp3yhjyxqe03Z7zrCWqYw0F84e1z +4O0NH/VblL4J8zv6XO1T45KVuRBmmGuw+kgwxHnI55i95sbvXukYxt6/VnD5 +Z3Xz07P9KItnqCFfc3WKYpXlDU3qagth/QjqUM/3r9dmJSt1OO/0ypuBITut +yue7azmv+CjrjRnyP5uHCYY+hZ1r1JBf2ecIfjG8/PzstGAau7i7eqBEQi3X +0/4U5mKY2bmlcn0WK/hix3urXu0IoDB/wSzXE5LSf/KGOvbDL1OGugyTKGZW +t1GWlwR3q7u3rGqOpHC+MMNchdVvdncN/RP7PuHN5njKucD81vzOzqnVJuXz +ecPvh/yDGepy6Msx5/qXXvR1hCj7lDeLF0SuO3So2TxC2Xe84R6ExV3UEAdY +f0B4w3wS6nPMQdKIz30dU55omN9CfYcZ7qvYvFcwPA/MrzBDXGbzOMEQnxZE +qze0HCOooc6X5yZJglnfR6GPwAz7AubSmFl9q9xT8GbzANraXPR6Ss4E1Gxe +boa8xBv220eHiourm5NQwzyCzVUFy/PeCKU+wLzE9eNaW1OCct/CG+Y5Cz9v +C+jPj0IdPHq3s99mZfXlN3be3SVT2u5csyr3FJihf4f7L95wv9nm/ahQUkej +PrB/B9U8GqfMYXizfcDd2zzZcM+QNfFA7Y2R8aihv4N46q4/bfk2Y1rHdFqi +jf175bYEyhvmj323WjbtS49HDfu97NC9ZEtgomCYe6xpf63KMywJNdzPy/U+ +EQz1BLv/Qf0/FoL/FA== + "]]}, + {RGBColor[0.880722, 0.611041, 0.142051], PointSize[0.004583333333333334], + AbsoluteThickness[1.6], PointBox[CompressedData[" +1:eJyl2XlQVEcaAHBUEhXIQURHwQGG4VBRmWFQjhGnEZ0RcHSIBgQ1HkCiaMpr +oxRhQECNkHWFNYHEY40Ro+K6AVcFETItxAs0HkvALMjheOAuagiiGEWX1Otv +qvK6rG+r4A9e/SiY4r3X/V0tW7Ly3YT+VlZWdr3ffr/GDLFNmRY9kdapG998 +o+YX06scXms7+dKFRs6VPx9J8HWfQLcOOnt6f9xvqOOdn2amS/yoFfsSu/kz +n3+bg/1om2Lh+xt67mowB+tunfo8fALdvPVoqkrZyRl+3795y4OY/C7UjRWN +XrrVvpbPF3t1ztu3bb/3pQ8Pr9n7q89L1CvL1b5RceNoY336Wm28AxF7xYO2 +tJN5TtTXLXJpTP5Q1MJ9VZlMHcc/zIu3Rw3PtWtpoVenz1uchff4XCNc2zWY +2fsiUyW1JRcvjKViXz36wMW22I+0Nd5PXpY3GfWl6seylR0KEnHkidP9K9M4 +p1uf2aaUeJE7bR2f7DwxA/XNtV7X03okZEiJzZKvrSM5bz/To/s2zoYMP5az +4aoE96ld77y9XTGCGIJyFxUWGDhHBFWfXlE9kTya+Vpj5yQ96i1lb5HEfZNI +e/aI1vs3QjkTn8aTCptAcuzOuYWxBSrUrouHF90KdyOwv/pq2AfCurMlmNmV +rmtWTnocJ+mzk8+NDvqrXA2mYnuveL3U1VZB4e8wW3+Xp1Yph9Dm/bUeZoUn +Z7gfiFOYhX0lI8mtP27KHRbMWVhv/oRdUfdcd9fclAcQto45X1a6flJRryRw +/331vdDejZriQ2YNkv5pcP5w1LAf/3ZCa21WDEPN4gBh+4Qz/D9C3HBH/cEm +txuXe/zYOvHm/Hz1s9vbg/3JhW3dQ5cXjUGd+JFjw/KKAMKunA1Z/x0evUpN +pDkbjeoSLep1T+s+7YoKJJ2xg294LIjgvPT1jnRpvT+p9TpZ5ZkY1mdvuiaZ +8qN5FGmXtG/+qN4P9ZXUgi12NVZ0qWvepZHVozlPcH9Q/CjMmzY5b9yQcsEF +NewDFjc4s3xFjiY8LbOrUaA2ficLGG+eTHLLdhtvRxPUs9wqTYOyg0iubpU8 +ITKE84Mvy7xPFXmRxebf1hvrglGzOsF08MA26vLCnjPk3/Qryd2+ygEE8+WI +M2fLq1Wv9LO7y6irLaFr7ZuzYvI9KObA9u/jkjZOoXP8JWkNJYTz+VGXy0dW +B9Jbj7pSLtWFoxbigBf9yT0p1HHfLM5Qt2jOrG75af5M1JA/uhp6C5qJvBv2 ++TfqUhWkdG5k5rI83CwPaWb4Z4UsGqDnDHVGq92LVKVEhzrs5LORLh0qCusD +83/ypDddXijpQOO9+5d73Pvs7qwBbU+McmLvNHZXQdh4zrBfg2tPLHaYqkUN +z1f+NNzVw6DnLOQVL2J1+2FTpLMBtbqlbIk23o/lB12fPf3da1VXbFSkIbFu +RPNDDWe2Hol560V52i9hqAO6K+MLCxTkc5+lsn720zgLdfFrBJ47ZuEqY/1L +uwmzkLcscZOILbyfAMrqaYpZuGqo9uoAl0ylgnO2uulWSYqGLtk9plk1OQR1 +0iKr1tDgILp3b1rGZyWhnF/GdJp9eoJo4ML2iu7sENQr61qM70VpLHFf7P2d +rTEZ7r4U6gPMkMdZXuTM9gkR/o9w1FHeQ1IP5bsR4f4jOUO99mtSbGrLpwbU +HR+80RRtHE0Px3yYsvDxTM6rQv9cX149hCav0adf1EWihj5NiM8G1KyOJwuG +HjzTMngSZ2F9uJA/rp9Xm/XtGtb/cR5JTA+bn0steQ4z9L1CPuxHxN7Z1hmp +jXcnvVnYUaVUUcxCf+VIXHrLicH50zmzPEnhfWKG/j3PVf515Wg9Z9Yv0bZv +ZOZIZ4Ia8i/MEcSG/QLPCXOd0/HKR2HqV5rFR8t+wSxcR9HrGU1OoYqxqKEP +gvwmNtR1B1evTK2aGIEa5gserp6tU/5h4AxzgjJTcmNJyizUwnp6YhKes4Ez +mzeRW+nn3fRXIlCz+EiEvDS1z67dcUd6YFUAgfsXG/pI2M+Y1bPbys8mhlLo +98WGfABzIsxCfTzeMq/D/Md9/UQjtjCv8CTCvhxDMQvx15dAnSk2y2ukKmyH +5tu4cNS6gHFJVyVKErt7197SLD1ndj9k58toaWDODNTj57w4Xl4tJ6Z48+lh +yw2coR7aIfc22dXgZvWBJX6LDXPHzrsNGfujZqCGvhTivdgZrfOr7GoIhX4X +M8SXu+erfTKVrpyPXXRzmFcss+RhzCzuEOtDDmrHfRrUrD4iyt7lZKzTc4Z8 +LswNDKiF9y8jY17Gvn/SgTfMoVSzY9MiTsxCLcRxDwr5X2zWj9CPkwaZDxi1 +qFk9T4X1RDjD58M+7KvheUMfhpnNwwjMxcQW4omPZb9i/qbUrE81e7N51zjO +Qh2ptPQ3mFm+JL3V1vzCAoJaqM8CyZ4jmZkV9SGcYf4Sn+vZ1M85FDX0n0K/ +6M8Z5lpsboC6dkPItQNGT3rn4x9kTkXjOMP+Wjyx3+bb0QrUELfhefXVbF5D +ip/9pbVYquXM6neiH3+WBhVORw2fD/2p2LBuYR6F+X7q0JZTFRNgzmDCDH0d +1BViC+cN7jTmaYJCG29NMM9eQGvsalwt8xqxWf1u6Ssxs/6AsHqZig31OdTV +/69Z3cUZ6jv4OWY277XMWcSG+RWcG2Fm8zia77h3z6H8d6jYMLeC/IIZ+tyU +6d1Nzc+DObPzFfrPh9ktaT061EI+H0jtD2sqFTZhqOFcoiBr/Qav9TrOcI5X +mLDcmDtMj7ro8IXZUXFS+p7yi9TKA5GcIY5JpdHyU0U61Bunbx45rziE5R0V +Z6gPWBxHDectbM7Cee7fW92erJpgiXeYhXX5LxPM5cRm9Q7JP9I1bYp8Mmo4 +/9pSYaDrErWcWdy29JOY4Txhh+185+VF4Zwh//QvjSmfm61Dzeo2y3wZM8TT +N/U/3xtoHNtnZ8sCvyrNCrb0tWILdeck2qCwyTi3PgQ1PPcvHVz25AzWcF53 +c015f+8Qy+djFup9Quf8cM99XrGSMzv/gbkn6v8BsP4njw== + "]]}, + {RGBColor[0.560181, 0.691569, 0.194885], PointSize[0.004583333333333334], + AbsoluteThickness[1.6], PointBox[CompressedData[" +1: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 +T2D+D0f2NRA= + "]]}, {}}, {}, {}, {}, {}}, + AspectRatio->1, + Axes->{True, True}, + AxesLabel->{None, None}, + AxesOrigin->{0, 0}, + DisplayFunction->Identity, + Frame->{{False, False}, {False, False}}, + FrameLabel->{{None, None}, {None, None}}, + FrameTicks->{{Automatic, Automatic}, {Automatic, Automatic}}, + GridLines->{None, None}, + GridLinesStyle->Directive[ + GrayLevel[0.5, 0.4]], + ImagePadding->All, + Method->{"CoordinatesToolOptions" -> {"DisplayFunction" -> ({ + (Identity[#]& )[ + Part[#, 1]], + (Identity[#]& )[ + Part[#, 2]]}& ), "CopiedValueFunction" -> ({ + (Identity[#]& )[ + Part[#, 1]], + (Identity[#]& )[ + Part[#, 2]]}& )}}, + PlotRange->{{-70.621246, 43.332359}, {-70.621246, 43.332359}}, + PlotRangeClipping->True, + PlotRangePadding->{{ + Scaled[0.02], + Scaled[0.02]}, { + Scaled[0.05], + Scaled[0.05]}}, + Ticks->{Automatic, Automatic}]], "Output", + CellChangeTimes->{3.764181749939802*^9}, + CellLabel->"Out[31]=",ExpressionUUID->"902da2ce-607d-4066-90c0-08d837866834"] +}, Open ]], + +Cell[CellGroupData[{ + +Cell[BoxData[ + RowBox[{"magavgs", "=", + RowBox[{"Mean", "[", "magdata", "]"}]}]], "Input", + CellChangeTimes->{{3.764181409889127*^9, 3.764181442609482*^9}, { + 3.764181514100668*^9, 3.7641815148825817`*^9}, {3.764181607119375*^9, + 3.764181607403371*^9}, {3.764181758111438*^9, 3.764181767887418*^9}}, + CellLabel->"In[32]:=",ExpressionUUID->"f29f83fe-0d9c-4ec9-a48d-4ac4733e0b37"], + +Cell[BoxData[ + RowBox[{"{", + RowBox[{"3.269470381679388`", ",", + RowBox[{"-", "1.1777647652671779`"}], ",", + RowBox[{"-", "27.38331706488549`"}]}], "}"}]], "Output", + CellChangeTimes->{{3.7641814300122833`*^9, 3.764181460376156*^9}, { + 3.7641814985945263`*^9, 3.764181515876246*^9}, 3.764181791217758*^9}, + CellLabel->"Out[32]=",ExpressionUUID->"b2979ec0-2228-4101-a551-ceafaf22282f"] +}, Open ]], + +Cell[CellGroupData[{ + +Cell[BoxData[ + RowBox[{"magmeds", "=", + RowBox[{"Median", "[", "magdata", "]"}]}]], "Input", + CellChangeTimes->{{3.764181613250167*^9, 3.764181618795424*^9}, { + 3.7641817603848677`*^9, 3.764181772489642*^9}}, + CellLabel->"In[33]:=",ExpressionUUID->"9c3fe212-89fa-46ec-bed5-0affe4811ced"], + +Cell[BoxData[ + RowBox[{"{", + RowBox[{ + RowBox[{"-", "1.49939`"}], ",", "0.749695`", ",", + RowBox[{"-", "21.141394`"}]}], "}"}]], "Output", + CellChangeTimes->{3.764181619514329*^9, 3.764181793290881*^9}, + CellLabel->"Out[33]=",ExpressionUUID->"ef485533-27f2-4451-90fc-eff443044e16"] +}, Open ]], + +Cell[CellGroupData[{ + +Cell[BoxData[{ + RowBox[{ + RowBox[{"magdata2", "=", + RowBox[{ + RowBox[{ + RowBox[{"#", "-", "magavgs"}], "&"}], "/@", "magdata"}]}], + ";"}], "\[IndentingNewLine]", + RowBox[{"plotdata", "[", "magdata2", "]"}]}], "Input", + CellChangeTimes->{{3.764181501987578*^9, 3.764181558842853*^9}, { + 3.764181623169281*^9, 3.764181639417089*^9}, {3.764181762202607*^9, + 3.7641818300440407`*^9}}, + CellLabel->"In[42]:=",ExpressionUUID->"bd9700b2-e7a8-4e50-89dd-94e26b677ce3"], + +Cell[BoxData[ + GraphicsBox[{{}, {{}, + {RGBColor[0.368417, 0.506779, 0.709798], PointSize[0.004583333333333334], + AbsoluteThickness[1.6], PointBox[CompressedData[" +1:eJyl2Wk4lGsfAHDLhFJZT2HGMpZhBoOZMWPGMLcl2lQUSTqVVJQlqhM5JaF0 +lOqto1NR0qsVLSQ1mNuR0mmzJSWJhBRFRZ0s7/t+uOfD81znuq/38mXm+n15 +Zp7nev73f6OHRPutVVJQUJj634//fVu7rIwJiDaBgjbbnVVMR0i0R6rzEWG+ +/j/6S5OW8iptGszJq11/dYiL9di9IFlW20zo3kvdM/6OQ/K/rXpi98QZwfKl +fi9Xa3KxvqLvYFc1ywBSdVQrtA15JP+/12tvzyj60KYLb+8bZ1Z7OPyjFwZz +u/cdwttE+S/TRTo60HpJEt9PzZrk400ut+tVFEGn4Za0a69nYL1yROK6rnRM +FvNpJPJ7zCcJzt+sbwSt8dKFpu4NrcbNgyTXhucecDM1g/z0jweGalUBzhX+ +a+6FLrGFe/yakpRnOZLM+/NM5teXHPi564HhgVd4/5xUGLwz3BF+HGswHjDi +kPyt76r33Ug7WB2RmO4Yy8R6qDWRev7WoGyDZ9aTvUU0kvMH47JSJEzgV7SZ +2tKthbVWaBw7qtkOeEbuVT3ZZUhyBDeG0lXaJ4mMOi/rHxZgTStkPJjfZgAv +9X9w+VDrQjKKv5A1t25eF4iwRvEVer/+ck+e+YTdkPu0jqOiCvI12V1lAgrW +dN/x1VNzKGC5z/ihiywlOFGbHxPuPK5tDwKPzBdrDglJrnb+e5fDYRegvclv +i4vUFus7j7xaDlDdwHCZR1rA0FSSE5ovJHxvdJffD8710KZ97Ul3oBy0ac0J +mRnJXg8Z7dxSAaBcoDQpWguxnnI0jcNfZgWMpym5hPqSHbBlpeZmhjkYWDsa +J5nEnbDReTezqae79b091kt6LCr0K6fJ4xHnpk+zhq9o68O0xIyiWnM7kv07 +7r5vU6ND9H9wTnOnrW+Ko8K0W+MvfK35JD8cHxFtnmUIjc41v/lpoxPWbPXr +Zp+dTeH+M8PNfb1CklE8xJbXzHieLcZ63fvpscfdByR/2BanbksRkZyT6ho/ +R5sLfhM9TjxNEU7Y5zMGYbCaG7gvqnepd7XGulMrXrbuAgAjv7xfN5jQJyM6 +XFHX8/EKCRiQcks+9VtBnEtm6yYs0xIDlM+JPq9oQm2dDsD2tkLpKoYJwHnR +iRt/ZBVTQW3MuEGgGsDaskeqv9jZCsYEnC7/7aYzydpnnu10yxJCjuJWS5k6 +C2v/g7B12142VHheL+jxzJQRjfI1yr84Nxs5lG0BJqBgZk+NKJtD8n7XoFeC +zeag8eTQblmPK9ZFUY177sZrQyu/2tCbfW4ko/x77stAxYksJ6zZpZd/Sr9t +BznbtoFBNQuSw9QfyyIW2UO14VzJZMpkgPPGvKy+j6osef4gGsXr6DPdF/cv +O2CdX1N4ZLIhBwbmPXzSka1C8pfIvWvdLwqgwhX9spooFsT53NSOjptKQmiZ +amScXcXB+p5t/t8bPTiwJgR0ZtfaT9hU6+F2u2QeFA+Wv/nRbAGIVvKuMaby +BRDFK864582ffKDzY48mYLxsb0gOZGGdvk/1Rm2KEKzQ/WNVzWHHCTs79G2p +5x1XsGHPlUo/Jx7Jd42/fAqh6oHe4Pzbp4ZFWA+kHlx/7h0XBtnkhNjUO5A8 +1Hi14tBBJ+hRJVoarqyBdZI0bnR9mgWcv+LuQ4GXMcQZ1W/beIG6B58ySLaq +yqm90k0Da06JPOeXCLAuGPZ/0VDqABp4j5gxSq4kBzD4IMhIBMJUFbsdF+Jt +2jp55ptLYhBgY/amUkNIcl2BVodUIAatFjO6Cp7gPSozL8mf5QB8cpV3NVi5 +knw1ZEfl/kZrmCyjBCsM22P9vexCmc1CMTQpcU3bUUYnWeNW2668l45w3tuz +7xoCLQHOoWyfUgP3DtmJI4/iCwbNSfacFyjuesWT12s4P7HxcIn6WQgKxvw6 +FptaQqKfPWAVTpXZgidv2TCcOR3rwkvhjyV+I7Lbg9UrV/sYAJzj1rYaHSnh +wCaDvBUv63gkO7acMbaWMqEs6+DB0UE61lM2VDClfAc4UrH0l8w6RZJRfjsa +PffbMy99iHMHq2VWSRQDZr5Qmva6aUxC9DS/EsulQzzYtqjQZ66MAXCm1GTe +CdMQQVpmrKRQ35hkzrSFkRn9lvD1z6Y6Xr99luHceLpq+dA7e3n/TrTi61N3 +Hy7kQ6MfY9LClwKs/SojrVtu20CUf4k2oGWcu1WpClG84GxyKdS98LkZKO5+ +dieWJiK5uL2Xrm7tDBhGX6sXtDpgvVE94k+/MDegnhMSN0nMwNpsx7B0qpqn +vL8ietl0tutQqwsIWKCxb4sOFeuFvuEqDRYsgOYLROtZmBpqRDgA88wI1+RT +CgBnhp6aWfd7DtCT2int/r1RRvSffy06vrLbGCR498TfSxEAnDU5cTRlmjZo +urligOYPJuyEHXRGFYMOhh5XUZmnhCSjfHrSxYDV9tQM4hyUPrbkedJMwLr1 +vXxSozvJkhH+2x9O9vJ8gHNvW/iWd/vNgNB7vZiVZoM1Oi9RfUs0ms8czE0p +32TBBDij+I5b+SnBuppL8v2jTxffZnJh2KR22qSVDlhPpxxY6trPguERU35Z +PItD8urixQ5FIjZsV+/X1z9tj3X0tc/XmQWaMLas9Bq0YJDcrLsNNPkYy+sh +nFG9zx5/1mq2zJxklK8au90LL1KUsa5e9sy7pEcMUy1dDdb7W0Gi0fwvxjvq +zjwewPryIZuk1Hp7+flCtMtqxk66vxt4XVNrX5hvhPXNHkWT5CgP0Nx8eKOW +jyHAmdkV9DS5lAfGKY/Uj6Vbk7zc8Fh8xOkpAOVznDcEL1rOiNeD6Tndm5/G +mpE8b2CH3VlnC1jhHX4zNEkba5Svv79iwkMfTSHR7B/aRvcfAxDbVlyWfoaN +tY/UsdVb6gGK6XM+fDalkxwfk2h6ud9Nfv2Jmuu1+1pivbr8eeOM8r9Pzpsb +uU4OJJ817+2kejjC7LDrhxOq7bFG+bXL5NSc3a5skh/NnvNI3MiGy4/cl24v +5WB9N25ZHcXfEtIzatuvscRYn4k+Ji1ewoI6J3tbnl8SkQwUHDevi2JCNH/B +OS5x94Z/XeTJ+0+i0Tx6Rlfd1JbtWhDnyC1HQwLe8eEhvb1NZ03NSc7LK90X +TnOCKL5wTli/PYwd7gRXcUq3ZYZByUSN+qfOaelrin35gOg9gVXmG/k8eM9S +tpTix8UatF9/N1NJIr8+0ej3Uf7BGe0vHsx16hAe4mH9lTJ6zxyYAdRvE602 +w+3ayfcvZAfm8sxVA0yxrpm3Q32txlOJUa96jtZrGsnzVcv7B1OHZZd8X27y +bdfEGvXn33QUn9zZpQeIRvNJVJ/jrMLLXq4SbfaPRvNbVN/hjPZVeS3BzUV0 +W5LR/aD5Fc4XhFZvr1N/Arb9nZV7goUko/PJI9tqlwEdYM04Hb13X/4M6Kss +fh17nuz7XvnJZ+hMyFTpq+rNcsQanWe5eQn1baajMpwN7jxKa8/iwrEr57hj ++jRAtNPRwaaRV4Yw9MLQhgUG+li7f86NOpehAq1algQvKNCDRKP3LUPn95QR +4IY1mkdsLjxmeMKAbI1Mi1/r1Nny+gDnC/7srUmHRfJ9C9FonsOPo1hs9eBh +Pe+e8FV8ixtIcvEZyZv5QUK0hmdRW7SzO5j27bpWtLotwBn172j/RTTabyq7 +tfxa5OmEdcarygca2sbyfQLRs590DygurpOh/IOzRyf7zbFvXJA4J7UqROCC +Nerv0Hk6UdOGY1fMiLKBYX3LT/KDxZBoNH+sKxpLMWM6Y43e963xerPhVzHJ +aB+5dnZKudtRgDXaz2+IYoEURwnJqJ4oGHXf4XzJHuv/AKD0a0A= + "]]}, + {RGBColor[0.880722, 0.611041, 0.142051], PointSize[0.004583333333333334], + AbsoluteThickness[1.6], PointBox[CompressedData[" +1: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 ++If9z3bXqDDzyPLuHd2WSP8HJp4FAQ== + "]]}, + {RGBColor[0.560181, 0.691569, 0.194885], PointSize[0.004583333333333334], + AbsoluteThickness[1.6], PointBox[CompressedData[" +1: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 +MuvZmmd2E+cJlP8LBXbRtQ== + "]]}, {}}, {}, {}, {}, {}}, + AspectRatio->1, + Axes->{True, True}, + AxesLabel->{None, None}, + AxesOrigin->{0, 0}, + DisplayFunction->Identity, + Frame->{{False, False}, {False, False}}, + FrameLabel->{{None, None}, {None, None}}, + FrameTicks->{{Automatic, Automatic}, {Automatic, Automatic}}, + GridLines->{None, None}, + GridLinesStyle->Directive[ + GrayLevel[0.5, 0.4]], + ImagePadding->All, + Method->{"CoordinatesToolOptions" -> {"DisplayFunction" -> ({ + (Identity[#]& )[ + Part[#, 1]], + (Identity[#]& )[ + Part[#, 2]]}& ), "CopiedValueFunction" -> ({ + (Identity[#]& )[ + Part[#, 1]], + (Identity[#]& )[ + Part[#, 2]]}& )}}, + PlotRange->{{-43.23792893511451, 40.062888618320606`}, {-43.23792893511451, + 40.062888618320606`}}, + PlotRangeClipping->True, + PlotRangePadding->{{ + Scaled[0.02], + Scaled[0.02]}, { + Scaled[0.05], + Scaled[0.05]}}, + Ticks->{Automatic, Automatic}]], "Output", + CellChangeTimes->{{3.764181801868524*^9, 3.764181830670013*^9}}, + CellLabel->"Out[43]=",ExpressionUUID->"95e60565-77ed-4935-ba0d-34c22a07a34b"] +}, Open ]], + +Cell[CellGroupData[{ + +Cell[BoxData[{ + RowBox[{ + RowBox[{"Norm", "/@", "magdata2"}], ";"}], "\[IndentingNewLine]", + RowBox[{"Histogram", "[", "%", "]"}]}], "Input", + CellChangeTimes->{{3.764181851587598*^9, 3.764181901887018*^9}}, + CellLabel->"In[48]:=",ExpressionUUID->"6e2382e3-be00-4738-b380-b67947d32194"], + +Cell[BoxData[ + GraphicsBox[{ + {RGBColor[0.987148, 0.8073604000000001, 0.49470040000000004`], EdgeForm[{ + Opacity[0.609], Thickness[Small]}], {}, + {RGBColor[0.987148, 0.8073604000000001, 0.49470040000000004`], EdgeForm[{ + Opacity[0.609], Thickness[Small]}], + TagBox[ + TooltipBox[ + TagBox[ + DynamicBox[{ + FEPrivate`If[ + CurrentValue["MouseOver"], + EdgeForm[{ + GrayLevel[0.5], + AbsoluteThickness[1.5], + Opacity[0.66]}], {}, {}], + RectangleBox[{24., 0}, {26., 3.}, "RoundingRadius" -> 0]}, + ImageSizeCache->{{21.350480384307446`, 51.85266394934132}, { + 85.14712719107074, 92.96535391600986}}], + StatusArea[#, 3]& , + TagBoxNote->"3"], + StyleBox["3", {}, StripOnInput -> False]], + Annotation[#, + Style[3, {}], "Tooltip"]& ], + TagBox[ + TooltipBox[ + TagBox[ + DynamicBox[{ + FEPrivate`If[ + CurrentValue["MouseOver"], + EdgeForm[{ + GrayLevel[0.5], + AbsoluteThickness[1.5], + Opacity[0.66]}], {}, {}], + RectangleBox[{26., 0}, {28., 44.}, "RoundingRadius" -> 0]}, + ImageSizeCache->{{51.35266394934132, + 81.85484751437514}, {-14.86863804976393, 92.96535391600986}}], + StatusArea[#, 44]& , + TagBoxNote->"44"], + StyleBox["44", {}, StripOnInput -> False]], + Annotation[#, + Style[44, {}], "Tooltip"]& ], + TagBox[ + TooltipBox[ + TagBox[ + DynamicBox[{ + FEPrivate`If[ + CurrentValue["MouseOver"], + EdgeForm[{ + GrayLevel[0.5], + AbsoluteThickness[1.5], + Opacity[0.66]}], {}, {}], + RectangleBox[{28., 0}, {30., 59.}, "RoundingRadius" -> 0]}, + ImageSizeCache->{{81.35484751437514, + 111.85703107940901`}, {-51.459771674459546`, 92.96535391600986}}], + StatusArea[#, 59]& , + TagBoxNote->"59"], + StyleBox["59", {}, StripOnInput -> False]], + Annotation[#, + Style[59, {}], "Tooltip"]& ], + TagBox[ + TooltipBox[ + TagBox[ + DynamicBox[{ + FEPrivate`If[ + CurrentValue["MouseOver"], + EdgeForm[{ + GrayLevel[0.5], + AbsoluteThickness[1.5], + Opacity[0.66]}], {}, {}], + RectangleBox[{30., 0}, {32., 70.}, "RoundingRadius" -> 0]}, + ImageSizeCache->{{111.35703107940901`, + 141.85921464444283`}, {-78.29326966590298, 92.96535391600986}}], + StatusArea[#, 70]& , + TagBoxNote->"70"], + StyleBox["70", {}, StripOnInput -> False]], + Annotation[#, + Style[70, {}], "Tooltip"]& ], + TagBox[ + TooltipBox[ + TagBox[ + DynamicBox[{ + FEPrivate`If[ + CurrentValue["MouseOver"], + EdgeForm[{ + GrayLevel[0.5], + AbsoluteThickness[1.5], + Opacity[0.66]}], {}, {}], + RectangleBox[{32., 0}, {34., 57.}, "RoundingRadius" -> 0]}, + ImageSizeCache->{{141.35921464444283`, + 171.86139820947665`}, {-46.580953857833464`, 92.96535391600986}}], + StatusArea[#, 57]& , + TagBoxNote->"57"], + StyleBox["57", {}, StripOnInput -> False]], + Annotation[#, + Style[57, {}], "Tooltip"]& ], + TagBox[ + TooltipBox[ + TagBox[ + DynamicBox[{ + FEPrivate`If[ + CurrentValue["MouseOver"], + EdgeForm[{ + GrayLevel[0.5], + AbsoluteThickness[1.5], + Opacity[0.66]}], {}, {}], + RectangleBox[{34., 0}, {36., 81.}, "RoundingRadius" -> 0]}, + ImageSizeCache->{{171.36139820947665`, + 201.86358177451052`}, {-105.12676765734642`, 92.96535391600986}}], + StatusArea[#, 81]& , + TagBoxNote->"81"], + StyleBox["81", {}, StripOnInput -> False]], + Annotation[#, + Style[81, {}], "Tooltip"]& ], + TagBox[ + TooltipBox[ + TagBox[ + DynamicBox[{ + FEPrivate`If[ + CurrentValue["MouseOver"], + EdgeForm[{ + GrayLevel[0.5], + AbsoluteThickness[1.5], + Opacity[0.66]}], {}, {}], + RectangleBox[{36., 0}, {38., 62.}, "RoundingRadius" -> 0]}, + ImageSizeCache->{{201.36358177451052`, + 231.8657653395444}, {-58.777998399398655`, 92.96535391600986}}], + StatusArea[#, 62]& , + TagBoxNote->"62"], + StyleBox["62", {}, StripOnInput -> False]], + Annotation[#, + Style[62, {}], "Tooltip"]& ], + TagBox[ + TooltipBox[ + TagBox[ + DynamicBox[{ + FEPrivate`If[ + CurrentValue["MouseOver"], + EdgeForm[{ + GrayLevel[0.5], + AbsoluteThickness[1.5], + Opacity[0.66]}], {}, {}], + RectangleBox[{38., 0}, {40., 80.}, "RoundingRadius" -> 0]}, + ImageSizeCache->{{231.3657653395444, + 261.86794890457816`}, {-102.6873587490334, 92.96535391600986}}], + StatusArea[#, 80]& , + TagBoxNote->"80"], + StyleBox["80", {}, StripOnInput -> False]], + Annotation[#, + Style[80, {}], "Tooltip"]& ], + TagBox[ + TooltipBox[ + TagBox[ + DynamicBox[{ + FEPrivate`If[ + CurrentValue["MouseOver"], + EdgeForm[{ + GrayLevel[0.5], + AbsoluteThickness[1.5], + Opacity[0.66]}], {}, {}], + RectangleBox[{40., 0}, {42., 40.}, "RoundingRadius" -> 0]}, + ImageSizeCache->{{261.36794890457816`, + 291.87013246961203`}, {-5.1110024165117665`, 92.96535391600986}}], + StatusArea[#, 40]& , + TagBoxNote->"40"], + StyleBox["40", {}, StripOnInput -> False]], + Annotation[#, + Style[40, {}], "Tooltip"]& ], + TagBox[ + TooltipBox[ + TagBox[ + DynamicBox[{ + FEPrivate`If[ + CurrentValue["MouseOver"], + EdgeForm[{ + GrayLevel[0.5], + AbsoluteThickness[1.5], + Opacity[0.66]}], {}, {}], + RectangleBox[{42., 0}, {44., 20.}, "RoundingRadius" -> 0]}, + ImageSizeCache->{{291.37013246961203`, 321.8723160346459}, { + 43.67717574974905, 92.96535391600986}}], + StatusArea[#, 20]& , + TagBoxNote->"20"], + StyleBox["20", {}, StripOnInput -> False]], + Annotation[#, + Style[20, {}], "Tooltip"]& ], + TagBox[ + TooltipBox[ + TagBox[ + DynamicBox[{ + FEPrivate`If[ + CurrentValue["MouseOver"], + EdgeForm[{ + GrayLevel[0.5], + AbsoluteThickness[1.5], + Opacity[0.66]}], {}, {}], + RectangleBox[{44., 0}, {46., 8.}, "RoundingRadius" -> 0]}, + ImageSizeCache->{{321.3723160346459, 351.8744995996798}, { + 72.95008264950553, 92.96535391600986}}], + StatusArea[#, 8]& , + TagBoxNote->"8"], + StyleBox["8", {}, StripOnInput -> False]], + Annotation[#, + Style[8, {}], + "Tooltip"]& ]}, {}, {}}, {{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}}}, + + AspectRatio->NCache[GoldenRatio^(-1), 0.6180339887498948], + Axes->{True, True}, + AxesLabel->{None, None}, + AxesOrigin->{23.56, 0}, + FrameLabel->{{None, None}, {None, None}}, + FrameTicks->{{Automatic, Automatic}, {Automatic, Automatic}}, + GridLines->{None, None}, + GridLinesStyle->Directive[ + GrayLevel[0.5, 0.4]], + PlotRange->{{24., 46.}, {All, All}}, + PlotRangePadding->{{ + Scaled[0.02], + Scaled[0.02]}, { + Scaled[0.02], + Scaled[0.05]}}, + Ticks->{Automatic, Automatic}]], "Output", + CellChangeTimes->{{3.764181855648719*^9, 3.764181902239205*^9}}, + CellLabel->"Out[49]=",ExpressionUUID->"23ec7069-7289-4ea8-840d-63776a63d3eb"] +}, Open ]] +}, +WindowSize->{808, 911}, +WindowMargins->{{Automatic, 634}, {118, Automatic}}, +FrontEndVersion->"11.3 for Linux x86 (64-bit) (March 6, 2018)", +StyleDefinitions->"Default.nb" +] +(* End of Notebook Content *) + +(* Internal cache information *) +(*CellTagsOutline +CellTagsIndex->{} +*) +(*CellTagsIndex +CellTagsIndex->{} +*) +(*NotebookFileOutline +Notebook[{ +Cell[CellGroupData[{ +Cell[580, 22, 253, 4, 31, "Input",ExpressionUUID->"bb7c7b01-0cfa-4c90-a2db-09590ed14465"], +Cell[836, 28, 189, 2, 35, "Output",ExpressionUUID->"d714e440-83e1-402e-946a-6ad01a10cf86"] +}, Open ]], +Cell[1040, 33, 694, 16, 55, "Input",ExpressionUUID->"9d982e0c-62ac-49c9-8fab-0efac1e57ee1"], +Cell[1737, 51, 1197, 31, 78, "Input",ExpressionUUID->"9e6d0196-dead-4dc5-9762-497e415abc3e"], +Cell[CellGroupData[{ +Cell[2959, 86, 214, 3, 31, "Input",ExpressionUUID->"55fc2693-bfc0-4284-878d-723d16de613e"], +Cell[3176, 91, 10583, 191, 377, "Output",ExpressionUUID->"902da2ce-607d-4066-90c0-08d837866834"] +}, Open ]], +Cell[CellGroupData[{ +Cell[13796, 287, 383, 6, 31, "Input",ExpressionUUID->"f29f83fe-0d9c-4ec9-a48d-4ac4733e0b37"], +Cell[14182, 295, 394, 7, 35, "Output",ExpressionUUID->"b2979ec0-2228-4101-a551-ceafaf22282f"] +}, Open ]], +Cell[CellGroupData[{ +Cell[14613, 307, 290, 5, 31, "Input",ExpressionUUID->"9c3fe212-89fa-46ec-bed5-0affe4811ced"], +Cell[14906, 314, 288, 6, 35, "Output",ExpressionUUID->"ef485533-27f2-4451-90fc-eff443044e16"] +}, Open ]], +Cell[CellGroupData[{ +Cell[15231, 325, 476, 11, 55, "Input",ExpressionUUID->"bd9700b2-e7a8-4e50-89dd-94e26b677ce3"], +Cell[15710, 338, 13359, 236, 377, "Output",ExpressionUUID->"95e60565-77ed-4935-ba0d-34c22a07a34b"] +}, Open ]], +Cell[CellGroupData[{ +Cell[29106, 579, 288, 5, 55, "Input",ExpressionUUID->"6e2382e3-be00-4738-b380-b67947d32194"], +Cell[29397, 586, 7797, 223, 243, "Output",ExpressionUUID->"23ec7069-7289-4ea8-840d-63776a63d3eb"] +}, Open ]] +} +] +*) + +(* End of internal cache information *) + diff --git a/calib/calib.py b/calib/calib.py index e01d308..8daee76 100755 --- a/calib/calib.py +++ b/calib/calib.py @@ -3,9 +3,9 @@ import serial import re import datetime -if __name__ == "__main__": +def capture_data(): num_re = r"([\-0-9\.]+)" - line_re = re.compile(r"inputs: acc=\({0}, {0}, {0}\) gyro=\({0}, {0}, {0}\) mag=\({0}, {0}, {0}\)".format(num_re)) + line_re = re.compile(r".*inputs: acc=\({0}, {0}, {0}\) gyro=\({0}, {0}, {0}\) mag=\({0}, {0}, {0}\)".format(num_re)) ser = serial.serial_for_url("hwgrep://", baudrate=115200, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, @@ -14,14 +14,27 @@ if __name__ == "__main__": timestr = datetime.datetime.now().strftime("%Y-%m-%d %H-%M-%S") fname = "UGVDATA_{}.csv".format(timestr) with open(fname, "w") as f: - f.write("AX,AY,AZ,GX,GY,GZ,MX,MY,MZ\n") - while True: - line = ser.read_until() - matches = line_re.match(line) - if not matches: - continue - nums = [str(numstr) for numstr in matches.groups()] - if len(nums) != 9: - continue - f.write(",".join(nums)) - f.write("\n") \ No newline at end of file + try: + f.write("AX,AY,AZ,GX,GY,GZ,MX,MY,MZ\n") + while True: + try: + line = ser.read_until().decode("utf-8") + except Exception as e: + print("line decode error: ", e) + continue + matches = line_re.match(line) + if not matches: + print("line did not match: ", line) + continue + nums = [str(numstr) for numstr in matches.groups()] + if len(nums) != 9: + continue + f.write(",".join(nums)) + f.write("\n") + except KeyboardInterrupt: + print("interrupt") + f.flush() + return + +if __name__ == "__main__": + capture_data() \ No newline at end of file diff --git a/calib/plot.sh b/calib/plot.sh new file mode 100755 index 0000000..1e5a62b --- /dev/null +++ b/calib/plot.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +file=$1 + +gnuplot -persist <setTimeout(10); mpu_bus_->begin(MPU_SDA, MPU_SCL, 100000); mpu_ = new mpud::MPU(*mpu_bus_); esp_err_t ret; - ret = mpu_->testConnection(); - if (ret != ESP_OK) { - uint8_t wai = mpu_->whoAmI(); - ESP_LOGE(TAG, "MPU not connected (whoAmI: %d)", wai); - return; - } - ret = mpu_->compassTestConnection(); - if (ret != ESP_OK) { - uint8_t wai = mpu_->compassWhoAmI(); - ESP_LOGW(TAG, "MPU compass not connected (whoAmI: %d)", wai); + int tries = 0; + for (; tries < 5; ++tries) { + mpu_->getInterruptStatus(); + ret = mpu_->testConnection(); + if (ret != ESP_OK) { + uint8_t wai = mpu_->whoAmI(); + ESP_LOGE(TAG, "MPU not connected (whoAmI: %#x)", wai); + vTaskDelay(pdMS_TO_TICKS(100)); + continue; + } + ret = mpu_->compassTestConnection(); + if (ret != ESP_OK) { + uint8_t wai = mpu_->compassWhoAmI(); + ESP_LOGW(TAG, "MPU compass not connected (whoAmI: %#x)", wai); + } + ret = mpu_->initialize(); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "MPU initialization error"); + continue; + } + break; } - ret = mpu_->initialize(); - if (ret != ESP_OK) { - ESP_LOGE(TAG, "MPU initialization error"); + if (tries == 5) { return; } // Calibrate(); @@ -86,27 +97,19 @@ void MPU::Calibrate() { void MPU::GetData(MpuData &data) { esp_err_t ret; - // uint8_t mxh, mxl, myh, myl, mzh, mzl, n; xSemaphoreTake(i2c_mutex, portMAX_DELAY); ret = mpu_->motion(&accel_, &gyro_); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "error reading MPU: %#x", ret); + } uint8_t compass_data[7]; mpu_->setAuxI2CBypass(true); - mpu_bus_->readBytes(mpud::COMPASS_I2CADDRESS, 0x03, 7, compass_data); - mpu_->setAuxI2CBypass(false); - // mpu_->compassReadByte(0x03, &mxl); - // mpu_->compassReadByte(0x04, &mxh); - // mpu_->compassReadByte(0x05, &myl); - // mpu_->compassReadByte(0x06, &myh); - // mpu_->compassReadByte(0x07, &mzl); - // mpu_->compassReadByte(0x08, &mzh); - // mpu_->compassReadByte(0x09, &n); - xSemaphoreGive(i2c_mutex); + ret = mpu_bus_->readBytes(mpud::COMPASS_I2CADDRESS, 0x03, 7, compass_data); if (ret != ESP_OK) { - ESP_LOGE(TAG, "error reading MPU"); + ESP_LOGE(TAG, "error reading MPU compass: %#x", ret); } - // int16_t mx = (static_cast(mxh) << 8) | static_cast(mxl); - // int16_t my = (static_cast(myh) << 8) | static_cast(myl); - // int16_t mz = (static_cast(mzh) << 8) | static_cast(mzl); + mpu_->setAuxI2CBypass(false); + xSemaphoreGive(i2c_mutex); int16_t mx = (static_cast(compass_data[1]) << 8) | static_cast(compass_data[0]); int16_t my = (static_cast(compass_data[3]) << 8) | @@ -117,7 +120,7 @@ void MPU::GetData(MpuData &data) { data.accel = mpud::accelGravity(accel_, MPU_ACCEL_FS); data.accel = ACCEL_MAT * (data.accel + ACCEL_OFFSET); data.gyro_rate = mpud::gyroDegPerSec(gyro_, MPU_GYRO_FS); - data.gyro_rate += GYRO_OFFSET; + data.gyro_rate = GYRO_MAT * (data.gyro_rate + GYRO_OFFSET); data.mag.x = ((float)mx) * MPU_MAG_TO_FLUX; data.mag.y = ((float)my) * MPU_MAG_TO_FLUX; data.mag.z = ((float)mz) * MPU_MAG_TO_FLUX; diff --git a/main/ugv_io_mpu.hh b/main/ugv_io_mpu.hh index 7e6be78..e4fb642 100644 --- a/main/ugv_io_mpu.hh +++ b/main/ugv_io_mpu.hh @@ -31,7 +31,7 @@ struct Mat3f { float zx, zy, zz; Vec3f operator*(const Vec3f& v) const { - return {xx * v.x + xy * v.y + xz + v.z, + return {xx * v.x + xy * v.y + xz * v.z, yx * v.x + yy * v.y + yz * v.z, zx * v.x + zy * v.y + zz * v.z}; }