{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Used tools:\n",
    "Force load: +-1N\n",
    "Sauter FC 10 Messgrät"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import statistics\n",
    "\n",
    "from sklearn.metrics import r2_score\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "determine the line: f-f0 = m(x-x0)\n",
    "\n",
    "A mean value from several measurements without actuation:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1827.3799999999999"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "zeros = [1833.28, 1833.12, 1833.09, 1810.03] \n",
    "zero_offset = np.mean(zeros)\n",
    "\n",
    "zero_offset"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "now read the forceload-bit for each known force to determine the slope"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "fit function1:=  \n",
      "-1.685 x + 1826\n",
      "fit function2:  \n",
      "-1.692 x + 1826\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Text(600, 3100, 'R²2 = 0.995')"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "##### Negative force means swimming forward\n",
    "force_1  = np.array([-0.16, -0.23, -0.31, -0.42, -0.52, -0.63, -0.70, -0.81, -0.90, -0.96, -1.01, 0.0, \n",
    "                     0.0, 0.09, 0.15, 0.21, 0.29, 0.36, 0.40, 0.49, 0.54, 0.60, 0.65, 0.74, 0.83, 0.89, 0.92, 1.02\n",
    "                    ])*1000\n",
    "force_2 =np.array([-1.00, -0.92, -0.85, -0.79, -0.66, -0.53, -0.46, -0.33, -0.2, -0.16, -0.06, 0.0,\n",
    "                   0.11, 0.21, 0.32, 0.40, 0.51, 0.61, 0.71, 0.89, 0.95, 1.00\n",
    "                \n",
    "])*1000\n",
    "\n",
    "Voltage_bit_1 = [2105.24, 2236.82, 2354.34, 2538.86, 2710.00, 2902.11, 3016.96, 3189.32, 3349.88, 3440.77, 3506.06, 1833.14\n",
    "                 , 1810.03, 1660.95, 1560.37, 1459.10, 1327.60, 1212.93, 1144.83, 988.87, 903.86, 802.08, 717.26,\n",
    "                 586.85, 486.31, 444.57, 426.24, 391.5\n",
    "                ]\n",
    "\n",
    "Voltage_bit_2 = [3499.14, 3379.91, 3262.70, 3163.68, 2952.41, 2733.85, 2607.57, 2388.63, 2171.71, 2101.73, 1932.56, 1833.99 \n",
    "                 ,1623.33, 1457.55,1276.42, 1133.46, 964.57, 794.25, 636.88, 445.67, 412.86, 396.31\n",
    "                ]\n",
    "\n",
    "coef1 = np.polyfit(force_1[:-3],Voltage_bit_1[:-3],1)\n",
    "poly1d_fn1 = np.poly1d(coef1) \n",
    "R2 = r2_score(Voltage_bit_1, poly1d_fn1(force_1))\n",
    "\n",
    "plt.plot(force_1,Voltage_bit_1, 'o', force_1, poly1d_fn1(force_1), '--k')\n",
    "print('fit function1:=',poly1d_fn1)\n",
    "plt.text(600,3300,r'R²1 = %0.3f'%R2)\n",
    "\n",
    "plt.scatter(force_1,Voltage_bit_1)\n",
    "#plt.scatter(force2,Voltage_bit2)\n",
    "\n",
    "plt.xlabel('Load[mN]')\n",
    "plt.ylabel('Voltage [bits]')\n",
    "#plt.savefig(\"calibration_1N.svg\", format=\"svg\")\n",
    "\n",
    "coef2 = np.polyfit(force_2[:-3],Voltage_bit_2[:-3],1)\n",
    "poly1d_fn2 = np.poly1d(coef2) \n",
    "plt.plot(force_2,Voltage_bit_2, 'o', force_2, poly1d_fn2(force_2), '--r')\n",
    "plt.scatter(force_2,Voltage_bit_2)\n",
    "print('fit function2:',poly1d_fn2)\n",
    "plt.xlabel('Load[mN]')\n",
    "plt.ylabel('Voltage [bits]')\n",
    "R22 = r2_score(Voltage_bit_2, poly1d_fn1(force_2))\n",
    "plt.text(600,3100,r'R²2 = %0.3f'%R22)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 -165.72106824925802 -160.0 -3.5756676557862654 5.721068249258025\n",
      "1 -243.8100890207716 -230.0 -6.004386530770266 13.810089020771613\n",
      "2 -313.55489614243334 -310.0 -1.1467406911075275 3.5548961424333356\n",
      "3 -423.0623145400594 -420.0 -0.72912250953795 3.06231454005939\n",
      "4 -524.6290801186943 -520.0 -0.8902077151335255 4.629080118694333\n",
      "5 -638.6409495548962 -630.0 -1.371579294427972 8.640949554896224\n",
      "6 -706.8011869436202 -700.0 -0.971598134802889 6.801186943620223\n",
      "7 -809.0919881305639 -810.0 0.11210023079458137 -0.908011869436109\n",
      "8 -904.379821958457 -900.0 -0.48664688427300007 4.379821958457001\n",
      "9 -958.320474777448 -960.0 0.17495054401583351 -1.6795252225520017\n",
      "10 -997.0682492581602 -1010.0 1.280371360578196 -12.931750741839778\n",
      "11 -4.237388724035667 0.0 inf 4.237388724035667\n",
      "12 9.477744807121677 0.0 -inf -9.477744807121677\n",
      "13 97.95252225519285 90.0 -8.836135839103163 -7.9525222551928465\n",
      "14 157.64391691394664 150.0 -5.09594460929776 -7.64391691394664\n",
      "15 217.74480712166178 210.0 -3.6880033912675136 -7.744807121661779\n",
      "16 295.786350148368 290.0 -1.9952931546096557 -5.786350148368001\n",
      "17 363.8397626112759 360.0 -1.0666007253544132 -3.839762611275887\n",
      "18 404.25519287833833 400.0 -1.0637982195845836 -4.255192878338335\n",
      "19 496.81305637982194 490.0 -1.3904196693514173 -6.813056379821944\n",
      "20 547.2640949554896 540.0 -1.3452027695351028 -7.264094955489554\n",
      "21 607.6676557863501 600.0 -1.2779426310583517 -7.66765578635011\n",
      "22 658.0059347181009 650.0 -1.2316822643232137 -8.005934718100889\n",
      "23 735.4005934718101 740.0 0.6215414227283633 4.599406528189888\n",
      "24 795.0682492581602 830.0 4.20864466769154 34.93175074183978\n",
      "25 819.839762611276 890.0 7.883172740306067 70.160237388724\n",
      "26 830.7181008902077 920.0 9.704554251064385 89.28189910979233\n",
      "27 851.3353115727002 1020.0 16.53575376738233 168.66468842729978\n",
      "maximum error = 13.810089020771613 1\n",
      "mean rel abs devia %= 1.7449129492805007\n",
      "mean error pos %= -2.017209714931335\n",
      "st_dev= 3.175652128547245\n",
      "6.293768545994112\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_41168/2806737494.py:8: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  error.append((force_1[i]-N[i])/(force_1[i])*100)\n"
     ]
    }
   ],
   "source": [
    "len(Voltage_bit_1)\n",
    "N = []\n",
    "error = []\n",
    "abserr = []\n",
    "for i,voltage in enumerate(Voltage_bit_1):\n",
    "    #print(Voltage_bit_1[i])\n",
    "    N.append((1826-Voltage_bit_1[i])/1.685)\n",
    "    error.append((force_1[i]-N[i])/(force_1[i])*100)\n",
    "    abserr.append((force_1[i]-N[i]))\n",
    "    print(i,N[i],force_1[i],error[i],abserr[i])\n",
    "    #print(error[i])\n",
    "#print('error =', error)\n",
    "print('maximum error =', np.max(np.abs(abserr[0:23])), np.argmax(abserr[0:23]))\n",
    "print('mean rel abs devia %=', np.mean(np.abs((error[0:11] + error[14:23]))))\n",
    "print('mean error pos %=', np.mean(error[14:23]))\n",
    "\n",
    "st_dev = statistics.pstdev(np.abs((abserr[0:11] + abserr[14:23])))\n",
    "#plt.plot(force_1[:23],np.abs(abserr[:23]), '*k')\n",
    "print('st_dev=',st_dev) \n",
    "print(np.median(np.abs((abserr[0:11] + abserr[14:23]))))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 -992.9614243323441 -1000.0 0.7038575667655892 -7.038575667655891\n",
      "1 -922.2017804154301 -920.0 -0.23932395819892474 2.2017804154301075\n",
      "2 -852.640949554896 -850.0 -0.3106999476348231 2.6409495548959967\n",
      "3 -793.8753709198812 -790.0 -0.4905532809976228 3.8753709198812203\n",
      "4 -668.4925816023738 -660.0 -1.2867547882384507 8.492581602373775\n",
      "5 -538.7833827893174 -530.0 -1.6572420357202724 8.783382789317443\n",
      "6 -463.83976261127606 -460.0 -0.8347310024513169 3.8397626112760577\n",
      "7 -333.90504451038584 -330.0 -1.183346821329041 3.905044510385835\n",
      "8 -205.1691394658754 -200.0 -2.5845697329376947 5.169139465875389\n",
      "9 -163.6379821958457 -160.0 -2.273738872403559 3.6379821958456944\n",
      "10 -63.24035608308602 -60.0 -5.4005934718100335 3.24035608308602\n",
      "11 -4.741839762611281 0.0 inf 4.741839762611281\n",
      "12 120.27893175074188 110.0 -9.344483409765342 -10.278931750741876\n",
      "13 218.66468842729972 210.0 -4.126042108237963 -8.664688427299723\n",
      "14 326.160237388724 320.0 -1.9250741839762497 -6.160237388723999\n",
      "15 411.0029673590504 400.0 -2.750741839762597 -11.002967359050388\n",
      "16 511.2344213649851 510.0 -0.24204340489904114 -1.23442136498511\n",
      "17 612.3145400593471 610.0 -0.37943279661428025 -2.3145400593471095\n",
      "18 705.7091988130563 710.0 0.6043381953441785 4.290801186943668\n",
      "19 819.186943620178 890.0 7.956523188744045 70.813056379822\n",
      "20 838.6587537091987 950.0 11.720131188505404 111.34124629080134\n",
      "maximum error = 8.783382789317443 5\n",
      "mean error neg %= -1.4143360313596498\n",
      "mean error pos %= -1.324323056313042\n",
      "21\n",
      "21\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_41168/1917229182.py:7: RuntimeWarning: divide by zero encountered in double_scalars\n",
      "  error.append((force_2[i]-N[i])/(force_2[i])*100)\n"
     ]
    }
   ],
   "source": [
    "N = []\n",
    "error = []\n",
    "abserr = []\n",
    "for i in range(21):\n",
    "    #print(Voltage_bit_1[i])\n",
    "    N.append((1826-Voltage_bit_2[i])/1.685)\n",
    "    error.append((force_2[i]-N[i])/(force_2[i])*100)\n",
    "    abserr.append((force_2[i]-N[i]))\n",
    "    print(i,N[i],force_2[i],error[i],abserr[i])\n",
    "\n",
    "print('maximum error =', np.max(abserr[0:18]), np.argmax(abserr[0:18]))\n",
    "print('mean error neg %=', np.mean(error[0:11]))\n",
    "print('mean error pos %=', np.mean(error[14:18]))\n",
    "\n",
    "\n",
    "\n",
    "print(len(force_2[:21]))\n",
    "print(len(error))\n",
    "\n",
    "#plt.plot(force_2[:21],error, '*k')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "the gradient m is obtained:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "m2= -0.592540955036598\n",
      "m= -0.5830843077435679\n",
      "Steigung=  \n",
      "-0.5933 x + 1083\n"
     ]
    }
   ],
   "source": [
    "m = (force_1[0]-force_1[18])/(Voltage_bit_1[0]-Voltage_bit_1[18]) # Steigung\n",
    "m2 = (force_2[9]-force_2[7])/(Voltage_bit_2[9]-Voltage_bit_2[7]) # Steigung\n",
    "print('m2=', m2)\n",
    "print('m=', m)\n",
    "\n",
    "print('slope=',np.poly1d(np.polyfit(Voltage_bit_1[:-3],force_1[:-3],1)))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "the slope shows the ratio between force voltage in mN and force in bit; forceloadm in uC is the measured average forceload in mN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.70385757,  0.23932396,  0.31069995,  0.49055328,  1.28675479,\n",
       "        1.65724204,  0.834731  ,  1.18334682,  2.58456973,  2.27373887,\n",
       "        5.40059347,  1.92507418,  2.75074184,  0.2420434 ,  0.3794328 ,\n",
       "        0.6043382 ,  7.95652319, 11.72013119])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.abs((error[0:11] + error[14:23]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
