{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The first step, and notably the most difficult, is to define the kinematic relationships (i.e. motion) among rigid bodies in the system. Here will we make use of `ReferenceFrame` objects to describe the four frames in the problem, set their orientations, and then construct vectors in the frames that position various important `Point`s. Finally, we will specify the linear and angular velocities of the frames and points using generalized speeds." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Setup" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, import the necessary functions from SymPy that will allow us to construct time varying vectors in the four reference frames." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from __future__ import print_function, division\n", "from sympy import symbols, simplify\n", "from sympy.physics.mechanics import dynamicsymbols, ReferenceFrame, Point" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "SymPy has a rich printing system. Here we initialize printing so that all of the mathematical equations are rendered in standard mathematical notation." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from sympy.physics.vector import init_vprinting\n", "init_vprinting(use_latex='mathjax')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The IPython notebook can display rich content. We will use the Image function to import some images for reference." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from IPython.display import Image" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Reference Frames and Orientation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Our first step is to define three reference frames, one each for the lower leg, upper leg, and torso. These reference frames hold the information that defines how each frame is oriented relative to each other in addition to their relative angular velocites and angular accelerations. We start by creating four reference frames for each frame in the system." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "inertial_frame = ReferenceFrame('I')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [], "source": [ "lower_leg_frame = ReferenceFrame('L')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercise" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Define an `upper_leg_frame` and a `torso_frame` with the names `U` and `T`, respectively." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Enter and run your answer here\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Solutions are provided with each exercise in case you get stuck:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# %load exercise_solutions/n03_kinematics_define-frame.py\n", "upper_leg_frame = ReferenceFrame('U')\n", "torso_frame = ReferenceFrame('T')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we need to specify how the frames are oriented with respect to each other. To do this, we need to define the three generalized coordinates, $\\theta_1(t)$, $\\theta_2(t)$, and $\\theta_3(t)$, for the ankle, knee, and hip angles which are time varying quantities." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [], "source": [ "theta1, theta2, theta3 = dynamicsymbols('theta1, theta2, theta3')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can start by setting the orientation of the lower leg relative to the inertial reference frame. We'd like the lower leg to rotate through the angle $\\theta_1$ relative to the inertial frame. $\\theta_1$ is the plantarflexion angle of the ankle. The `ReferenceFrame.orient()` method makes this easy. Simply give the base frame, `Axis` type of rotation, and a tuple containing the rotation angle, and the vector about which to rotate, in this case the Z unit vector of the inertial reference frame." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAI8AAADVCAYAAABudqMCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAewgAAHsIBbtB1PgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURB\nVHic7Z13eFRl1sB/J4UECDWA9CpNQEVQVFAEsaIuWLDtiuJqVKzr2sva27q7YkfXta/YsK3ts6Fi\nFxUUEZUunVCTQOr5/jjvTCaTaTeZmQw4v+eZZ+bOvPfedzInbzlVVJVkIyItgYlAG2Bn4AxVLUp6\nR9LUi4xk31BEmgMfA++o6jXALODaZPcjTf1JuvAAjwLPq+qP7ng+cFAD9CNNPUmq8IjIWcBRwAMB\nb+cC/UUkK5l9SVN/kiY8IpIBXAK8paprAz7qD+QALZLVlzTxIZkjz6FAT+CJoPf7AxtVtTCJfUkT\nB5IpPJOBjcCrQe/3A35KYj/SxImkrDPclHUgsAp4VkR8H+UAu1J7NEqzHZCskacrJij3quo43wN4\n3PXBPxqJMVhEXhSRPknqX5o6kCzh8QnB/KD3TwSWA68FvPcXoCMw0j2nSVGStT3u5p79wuO0zIcC\nt6pqhe99Vf2H+7yCNClNsoRnCVABLAx47xhgC/BgkvoQmQLpAgwANjNVP23o7mwPJGvamu3ulQkg\nIrmYzudPqroqSX2IxljgTeD+hu7I9kJSRh5VXS0iPwG9RGQecCvwoqq+mYz7x8jnwBXA6obuyPaC\nJMuqLiKDgHOw7fp7qjozSvtVwAmqOiMJ3UtTB5JmT1LV74Gzk3U/zxRId2B3YBNT9YOG7cz2QUNY\n1WOlEaYbShaHAi8B/0riPbdrUs6SLSIXAz2Ar4BTRGQE8JiqLmjYnqUJJuWEx6fnSZP6pPK0lSbF\nSbmRpwGZBswAtjVwP7YbkrZVT7PjkR55fBTIKCyiYylTNe2QHwPpNU81fTHhOaqhO7K9kCVCc+BU\nYLoqvzVwfxKGiGQCzYDmAQ//8Qm9GP3MgQ3Ywe2QLMym0x8QYErDdscbzkOxO+bK2tc9diKEcABN\nI11r2gJ4fBQ0So/FMZMFXA6sVyWirakhEZEWVAtHv4Dnnam7FlqBImAzsLltLlnF5ZQ2yqnlsJYm\nDDV2WyLkqdJgYb8udmtPYG9qCkr7KKduA37BnM2W4AQiymOLprea9SILQIShwJ1Aa8whPSm4dcge\nwCj3GAHkhWmuwDJMQOYDPwe8XqaqVQnvcJoa+LbqZZjPMCKMVuX9RNxMLGxiN6qFZX9qB/sp8D3m\nQBYoJL+o6tZE9AuAAvkzcC8wm6k6LGH32YHIAlBljggfYgJ0PsRHeJywDKBaWEZio1swPwIfuMeH\nqrouHvf3SBa2fkqmJX+7JlBJOAX7cY8UoZMqy+tyQRFphLl0Hg+MBtqGaPYz1cIyQ1XT3nvbIYHC\n8yomQE9FEhwRaaKqJUHvCTAc+CMwAWgVdNpCagpLnQQzTWrhFx5VKoELfcciiCo1diMiMhQ4ArjO\nHffFBOZkzAfHRxnwOvAK8IGqLk1Q/+PJ18D1mJtsmhioZRgVYQIWePcfVR6qfl8KgDuwkJn+wJ+w\nbbUPBT4FngSeU9UNie16moYmlGF0DDAM08g+5LbT/waOA8qx8JTA834GngKeUtVFie1uAknHbXkm\nlPBMAc4ABop8+gfgn1hqlEDWYv4vT6nql4ntYtIYiyWdmo05wqeJQi1LjipzgXfgW+CkJ6kpOAps\nBTZh4TM7iuCkqQNh/HlO/wT+tzds/QVbQOYBbwNfYur/Zaqa9rj7nRNSeFQfuR7beaRJE5awDggi\n5IgwSYQZIjRJZqcaiGnYLnJcQ3dkeyGsD7NzEluOTVkFgdv2NGkgwsijymbgMXd4flJ605AUyCgK\n5DEK5IaG7sr2QjS/uXuwHdYAEXZ0J820D7NHIkZPqPKzCM9jO65fk9OlNNsLUUNvVDk+GR1Js/0R\nU9yWCHlYhEWWKncltEcNxzqqHdDSxEBMEaMinI+ZLTYCnVUpTnTH0qQ+sQaaPI5FGrTERqA0aWKP\nVRfhPiwt3C9A3xC+PhmY8/w+2HS4AVgPzFXVJfHsdEIokNOwxE7fM1X3a+jubA94iVW/BzgJS7jd\nGCgRkdbA0cB4LPKheYjzykXkHuAGVd1Uz/4mEl/lnWYN3ZHthZiFR5WfROgAUgacKMLJmO9Pds2W\nUmWPKt+1szHnsj+KyLmq+nx8up6mofGYJUP2hPz7YOIgc3n2qX46LoDd5sLwX+GUhdClFFbkwFct\n4brD4bt9gHbANBFpoar/ju/XSNMQxLjbks5YUODxtpvdFXi8CF56G877Cg6MUivroe7w17NgSz6m\nsT5XVVMrWXaB3z97FVM1NbLSpzhRhUdEdgHewV9E5KoSuKkJFuJ7CTFn0no3H46+xAlQBbCvqn5V\n146naXgibtVdtMRHQEdbxxzyGlxwLVCK1QbdN/ZbjSmE6X+H3CJsunxKRFLH1aNAulAgh1IgHr7T\n75sI/jzSEgudyYeMKjj/YXjrVWi7CfgMKMbSsnhgTCFMftId9AFSKfNpuvaERyKNPFOwqUrh4gfh\nrq8DPnsZm7Le837LO7+B3X3RCWeJyFjv10iTCoQUHhE5CDjFjoa/D3d8G9SkGAvDaYaF6Xhk+jRo\n7ltkPyIioUKS06Q44Uae8+wpbwNMfzFMmw7A7cDp2DbcAz22wrX/AVEsk9fN3s5PkwrUEh4R6Qgc\nbkfDZ0K78jDnroTSdXCrwMDLoNkd0OdcuGK32G598c+w14fu4E8i0sZz7+NL2ofZIyHCjeVK4Gbb\nXX1wBYxcH/rUwmzY6yZYGCJlyug34b3p0W//Rls44mZQAa5W1fQItB1RY+Rx2S5Ot6NeP4QXHICj\nx4UWHID3D4X7gqNMQ3D4Wug92x2c44yrDUPah9kzwT/WaPwRosd9FPnUWXtF+FDg8eGxdeHkGe5F\nRyDSNRNN2ofZI8HCM8Gemm6Ea78Pf9qKHChuGfnSa2PcQV0wH7JK3cHhsZ2TJhUIFp497KnPXMiN\nkCCyYyk03hL50u3WxNaFFhXQ4yd3kBae7Qi/8LhUKgPsqPey6Kfu+Vnkz4/+OvLngeztG+UGi0go\nn6BksAHzX95+08QkmcCRpw/m5AUMjaGMwBOvQdswQrbfO3DZT6E/C8Vx8wL60zCZSKfqs0zVfkzV\n8Q1y/+2QQOEJ0M8cFcPI020bzL/FjKVtfoOWWy0z7nOF8JFHh68j1ziDKXgytqZpSAKdwVzy7rz1\n0LckZOtatKowYymvYm6cA4DvgDpkVu+8EH7dlToIj4iMAvZX1bpn9kj7MHsmcORx6512K+p4rVLg\nG6AKyMezxb3vQvdimBd9j4iMxBJxZovI37zdswZpH2aPBP5Ime6psp7XOwe4FRjo7dR9fMLTAr8g\nR8ZVPp4AHKuqVwPLReQSb/dNU1cChafCnqrqo+WtctcU8JoY4aTFzlAKFr4TCwtUdbKqlgM43+in\nvd03TV0JITxaXxOBz8dnAH7X1VjosRVa+6bMmIRHVVeGeK+u064vD3PafzlGAhfMbrqq18gDMA9Y\ngQnO3kAMBlIfXRdDYSf8ysrIiEgelnm+qXvMUdXZkc8Kw1T9GhOgNDESKDy+acvjQjckL2BTVwQT\nRyj6LYVvhwO7iEiOqpZGOaE9cAsw2N3vCiy8wzvpPMyeqcO0tSwH5kdzXP8emINt2T1UkdnHF5ac\nBQyK1lpVf1XVIZh6oL6kfZg94nHBvCwH9j8HDjkLFjWOcu2O2Bb6OmJOqHDcMvMjAmKcuhybPbRN\nEycCf1S35tEw09ayHDjodPjrK3DdCzD2VLOuh6UU88xrQw3tdSTal0ErX+GQwbGdk6ahCBQe999b\nEqZM41V7wz+fh8kL4dSlcPdzcPWeodsCUEj1+mN07F3q4pu6vIw8aRqAwAXzAnva3Aa2ZdR2yXji\nw5rHYwphTLSKyO9iI0g/zGG+1ta6Nn2Wwux9gEEikqmq9VFaeuF5rEx44kpR7mCEEJ6qTPioNRwc\nj1KNP2N6n9ZY2rYYGLbUfkcaA0OwkgWJZ6oWYqNlmhgJnLYWVL/8MkQozT29oOsl0P4qyL8Broq1\nCvI0bBt9NjHZu05dBFm+iI1DY7xH/SmQ/SiQBymQq5J2z+2cQOFZgn/HNT+E8Oy7Fg6bCau7wfoO\nsMVLIdcKzNb1l+hN88uhmy+p5GEe7lFfBgAFWF2xNDHgFx5VrcAECFgSQniGbIapn0GTKO6nIcnE\nRp2+xOTkPvQH92Ivl30sTQoSrH9xU9dqjxGgUfnYPQtwGlGt5if7NNMZwEH1ubGIdBGRHu51tojs\nKiLp8tdxIIzwrIt37PhCzOIOtkg/G3O9CMORa6DFWndQ53WPiFwDHACcICL3AzdihXRDWd7TPswe\nCU4r54RnU1soF8iug0dgSIqp6V2YA/wVuAFLmBCC/j/A56OAQ0VENNa0rQ7nJDZLVd8QkT2BGUBX\noDPwYa0TpuqzwLNe7vF7J3jkcQvVymz4ID/O9wpeK7XFRqAwjPGte9oTRkMtIoNEZCPmwlEGXCsi\nvsX2F6r6hns9BPhcVQtVdbaq3lO3r5AmkGDhmVf9cmaHON8rWEGYCfTGUvGGYPJPkOl2f2Gnrh+A\nfFXNcY8muPVUUBnL/bGEVACISO1EngVyGgWykQL5uNZnaUISLDyL8OcYnBtv4QkXznMoMLT22+3L\noMvPAW1qoUZl0HsVACJygogMdoIyGqv5jogMxGrDB5P2YfZIDeFR1SpMKwwsibfwLMOMrxr03rPA\nwdh6JAj/ln14HYIBj8Omq6uAF4EhIjLGvf+Cx2ulCUEoVwk3da1qH+d7rcG26r8EvNcbE9ZbsN1O\nEMf7hCcLzz7RnIT5FE1R1cmYwPymqn9Lor1shyaU8LhIz3UeRp4NWTBhDIwZX9NR7Ob+8LpPZ+SL\nXX+c6m07VOtxQigfj10JzXz2Jk9bdlUtVdUvVXWjO56nqpGiWNM+zB6JMPKUNoVvY5z/jz8CrvgC\n1uTDHQGuFHcdD5/4hHALZrVeg6Xn9bEnEXU+/X2jT2LtXFP1a6bqdekE3rETQXgA3gsYfd7Nh1NG\nQoWrNfHpLnCpc9gavAQGb4HFvWHP5fbeZy2hsCNMDJymXnPP71C99vEtaMNw8Bz3oquI7B7Dd/Ij\nQicRxohwmghTRHhfhHkiXC/ii1NzFEhHCuQAlwk+TQyEqj3xM/74q+864l9Ar82FZW1h//chQ6E8\nC5Y6u9Pt38LzHaEsF05fbO893ddi2GuELvvcMtZgu68u7ngk8D9CKgwvnAe3lUJFDpZ4qYa/sgid\nsbXTzsDumAG2F+YG0shdM8O9LgUuVeXuEN/7KOABzIHNk5D+XqklPKq6TUS+A/aAr3fBNLPAicvh\nxAi7lGkDodeP1Vrpr3pD75/Dt2c6cIF73RSLUa+t+SW/3K47fzDwB0wrDYAIA7EI1YlYRvpQI6lv\nhFkLnKhal9zRaUIRzjHdaWYX7gKbYqyMU5IDO7mR5d18+H4P2CeS8PxATcf1MYT199nfN9rsISK+\n0QpVflDlHHfu54RPsFAIjEgLTnwJJzyv21N5DtzbO7ZL3f2ehQv/6QC4cziUNoaJkYQHLNTFR3vC\nhtucNycgquIoABEyRBgnwoeYAnBfagtfFWaU7a9KtL6k8Ug44fkS//rkrRg8Buc3gVuGWPrcJ2fA\n2lYw9jUYVBTlxBmAq/73A3DRSbDLWTBxf/g+wBF/UBF0ckbbFkeLcC5mh3sJMz2EogjzYuyrytow\nbQJ5HvO3TpcCj5GwJZNE5Engj9ByNWy4OvJlbhgAz46AuVPh9n7w4GEwb0rkvIY+lo+Dm8baYLcC\nU0JnVAFVcPzz8N/3rd3546DTWDgTaBXqQkXYovtIzEh6uyq3R79/mroSSXhOAJ6xo/9dBWMjJKis\nFPjzCKjMgD2Ww3kLIDMGF4ovWsDESfBif1ggVjg5UNGcUQnnvg1T8kGHgmSGuMhvWP3Th7BiKycA\nR6v6pt4YKZD9gJOBZUxNJxOPhUjC0wrboWTChGnwbAIWm/3PhgefhZGToKyvLXuCrRQ5mDtQLbn5\nGvgn8LwqFSLkYJbzP6ryo+euFMhZ+LbqUzW9VY+BsGHAqroBZ4mGr6LGjXvn5fbQbbnLMj/N1DCB\n/u5NMcVzD+D//L2yak2jikH2VeUZVZ/TPp2Ag+okOGnqRLQYcrdlX9o3huQGHnmxHxzkszX9Bqw2\n37AszEf+QWA58AiwsAJ4H6ZPtSrcM5piikU/qixUTcddJZNowvOqPVVmwZUj4nvrkkbQrMxdX+CZ\nmWYz/Qr4Avgj0HQD5L4Nb7wHPANHfQNNfLqhP8S3P2kfZq/EUqB2BjASmq+DdVfGz6/5ql3h+86w\nMQ++3tsiVSsbw/UCV67FSlR+BZP3hObb4FYX9z50IswaASxR1e7x6UuauhBL6hNnB9rcBq6NNUo0\nBg5dBq+Ng5kHwtZmUNoEKgQeUsy/eSVQBTN2hz8HKPjG+JIndHOVl9M0ELEIzyvAUns5zatDVgT2\n2wBd59dWCm9SUxhyoFnxh/wEvQKSD0yeBxm+RXL8alWkfZg9E1V4nNedy5a1uD+8EEf31I/ug9wt\nTino2CTwd+D0vWFLm9rZObqUQlefm0c8C52kfZg9Emvyyofxpx75h4dcO9Hotg1WXwaDP4VGW02I\nMiphXiVcsg1emhv6vKG+iNIRIpL+sRuImCzmqrpeRP4LnA6z9oFF0y31bTzIq4SvHwcet11XpmJ+\nPqsIGxB48vfwwgQgG3Nj9ZBxNU288JI21y2cy3Pg8gQVF/GbNJZhgtMEUzsHMW5VQDhyvDJpfItV\na/5PnK63wxN1q16jsX/b3nINrLs6NvtVnRmORUAsA26r/fG+J8Jno4Hlqto5gf1IEwavCbtdmO7G\ndmZJTygrMJtFL6B77Y8P9q17OolIjAkzI5D2YfaMV+F5Gf+2/fGD492ZIBZRre0NkWblvPkBGcTi\nses6CvgA+HccrvW7wJPwuG37FDta0t/ishKK8+WhD7Y4DiC/HLr7Ij2SmUEsjaMudSbuxx93fs8x\ntkNKGF8Dj2JlAULsvIb5pq59RWSnBPYjTQg8C4/LPuGKoq3uBhcPiXOfAqnA3EIqMOVdkGrhdF+J\ngkzS7qNJp64Vbh4Hn9/M4+OhpL6VcqJxCnAHFl0awKj10PlXd3BSPe+R9mH2SJ1+dLf2udKONraD\nsxJdk7MRYSNLR33hXgwTkV51vsNULWSqfsdUnR+9cRqo+8iDqr6C39PwxSNhVaM49SkUPhfY7kDP\nmh9d8bWZNID6jD7pPMyeqe90c5k9lbSAM8fUuzfhCdy2D6/5Uf9i6OVLhlCfqSudh9kj9RIeVZ2J\nP3nB24fCvKZx6FM4XsF0MM/U/ugw39TVT0TSBU+SRDwWulcCVVDWGM5OpL5lLuafWkEtnc9V30G2\nLwdhfRfOaWKk3sKjqj8AT9jRzNHwcciIvDjRGov6u4Ua2/Z25TDgW3dwgpe67AFswTLg17XA7e8O\nT4bRsBcR6YqlYsmx9cf8uxNkNM3DtuzZmPX7s+qPbhwA117oDkar6gcJuH+aAOKin1HVpfgt3wsG\nwolxdFetQRE2dUGtbfsl8wIiK9JTVxKIp3LvRvxb9+nHwONdIrauOz57V3csItCRWwWDv3IHJ4hI\nS09XLZBTKJBVFMi7cejj74K4CY9THJ4EbLQ4r4vOTJDuZxmm93kAf5UeH3+dgZkr8rBttxeaADth\nNVHTxEBczQqqugT/j7ahPRx2cjyvH8A04BtqZlXFPAx39hlLzxORoF1ZmngSd5uUqj6HxQgD3+0L\nR46N9z0cOwPnYilVAjjTF9jeCcuYkSZBJMqgeS7+9c//xsHkYQm4R2+soMkB1Ni2XzIf2jmHNS72\ncL20D7NH4rJVD3lhkXwsT+DOFqR32132w8aNCNv2ycPg/j+7g4NUNb0ITgAJEx4AEdkZE6B8yCmB\nx2+H4+OphJsIjAAWAwEJmYoyof1tUNwSeEtVo2u+C6Qj5rFYxFT9Oo59rBcuyZaXBOarVfWyRPUn\nkIT64ajqr5hv8DaLRT/9IsuUGjfex8wWr9Z8O68SDvJZ4g8VkVic9VPOh9kFNPpyQ18PXAichWWR\nnYjV1piMFb67EzMej09W/xLtxIWqfoqla6u0keDYv8ReliAqy4C7gO9rf3THR5Bd6g4ujdP9ks0f\ngCtV9V+qukhVNzpPzr7YTvM/qlqsquucmeh2amTwTywJFx4AVZ2Ofwu/qR0cchEsaBynywuwK/Zf\nGaAY7F0Ce/tqXJwsIv3idL9kcgAW6u3H1Q8bDsz2FWUJoBEkL2VwUoQHQFUfwT8CrO0Co86Fwnjo\nYQQb2QZgf+wAprzpRp9MAjLH1+kmIj1EJN5lpCLdLw/4xVd8LoChWM69GSFOaw/MSnDX/CRNeABU\n9e/YDglY1gf2KYiD/3MV1X/IkdRw1xi8BUb6dlrHRil8EtKHWURai8hU4G5VXVXPvsaMqhapaqhU\nwL50erVKLajqz6o6LbE9qyahu62wNxV5GHBb6d0+g1mP1tMKH7htfxyYWf3RgsYw4DZbsPO6qh4R\nYx9zgEuwxWhToI+qNnjKORF5AzgEaOOSjjYYSR15AjgLK90IzN4HDphQz+sVYSqB76jlj9NrKxzy\nljsYKyL7hLxCgexLgdxVdaZcKiITse3/ldg64uYUEZxMTDXxvVfBEZEBInJWXPvTECMP+P+zX8df\n/nHsy/A/b4m3gy5J2MIlqxpBr1uhpDnwvqrWdhkpkLOmLeCBc2dSUVhKJZbsCSzY0GWkZx2Wm3pd\nwOufgDedXS+huPrwX2KlLy+M1j7gvEzMlaVYVUdGax/zdRtKeMC/KHwffzzW+Bdg+tv1uGQGtm7p\nRC3dz0mj4ZkT3cGBqupz7UBEBnVswiubyuhRHLw8jZ2fsEIsbwIfqWpplPaeEZG/YmnTxqvqyx7O\nOxurPX+gqnaKV38aatoCbFGIJSlw+ZhfOhaOqU8ChV2xKXEsEKSMfOCjgHqltwCISCcReRH4cEVJ\nvQQHoB9wEZZxfL2IPCoiPaOc45WR2Oj6UbSGPlwsWyXmxtJRROKWT7tBhQdAVddhXoHO7jX9OCt2\nWyfmYLW1Mqi1bW9RARN8ZSqHichVwFPA3kBZbiZbWjbyu3hUYtNVKVZnvgL70WZhiR4exaJGvnaf\nBdMEK6QxX0T+LSLd6/h9/Di/7P2w9c76GM8RTL/2CNVVpXeub1/812/IaSsQEemAbbn72DsnPAPP\nvB/hlHAcjMVeFWO7pYAECdsyoNN1sL4DJqwDAstkux+oFba7ao4luGwR9HoD8JiqlrtzWmDF4g7B\nbFChPCjLMYG7UVV/q8N3QkSGYMJ6t6peEK29O+dUTJn4rYi0xcpzHuOUtvUmxip+iUdVV4rIKEyA\nesO0E62W6dNeHdlnYtPWPGwE2FT9UW4V/PkluOMcTMU/iQANrqpWYSNXzGUIVHUTtnN8EUBEBmLT\n1ylU/32zsaiPE0RkYqzrFfeD9wQ6Y7UVAHqIyDBgvar+EuHcDsARwCoR8RlWSzFXlriQMiOPDxHp\niF+AUJj4JDzmNTdyDvaHCkOny2FFL2xbv7OqbqVATsGMi3OYqvWOfnUeBddirrmBJXsUs0FdHTjq\nhbnGCGxaLcemxypMILPdew/6RsAQ594KBG8+pgBfquoZnr9QqHukmvCALWQxDWovKz15ziNw7xfR\nzgsiC1Plr8J0NgH8ow/89RJ3cLmq3h5QMukHpmrcqvw4m9r1QLAu6z3gBLfmiysiciywTlVnBL3/\nBNBVVQ+Ix30afMEcClVdjqWSWw4q8MAkuNxrDaxJwOmETDl38c/Qy2eJv9zVFvORV7u9d0TkSABV\n/UlVj8cqsRQHNDkQ+Cae4dFijMamzY+DPsvGNgL94uXbnZLCA+A0ugcCq6EqA+4sgJu81Jr43D3v\nRq1tO8B1021UoyVwOVbvAiR0DUoviMj1wGQR+YfvPVV9GhiGf1cJ2OL6/0QkXuuQI7HF+2dY3alA\n/ogtmB8CbojHlj0lp61ARGQQ5qSVD1ll8Pd/wYW/RjsP0zjfjAnFW/jNIYHsdjrM2RvYum4i/83P\n4TTMk7BFPfp7ObaYfUhETgF6qerfAj7Pw7bOgdPYr8A+iZjCEkmDjTwikhGL9Kvq99g2eBNUNILL\nzodHusVwC8W01xWEqDFp/P0VVwSl8aZS/oD9PbZyhtSpuo8LNPxWVR9yfX8CmOn8uX3fp8hNY08G\nnLoz8JqIxMvHKSk0lFU9A9sidwbGqWrUUgQisi+mvW0KTTbBl9fBgGilt3Mww+aW8E2Gn5Cb+emB\nm0+D7AxAUYSnmap/iu3b1A237ngDm2Z8TAeOcyqDlCfpI48TnPuw7fhNwKPOSBoR5846HqiyZFIT\nYgkoLMUEJ5vaawDH/a+P7pRVluX7SwhCyPR13oiWqcNtsY/GPAF8HA1EKUOeOjTEtHU68JyqPqmq\nH2Mx7ufFcqKqvgO4ReiPQ+G8MAJRgyaYr88ZmGIwiN22nDcgf2VQPuDmnC/NY+lTKETkHmCziNwU\nqZ2qbsF2g4EW+StEJJZpucFJuvCo6sOB6U9Uda6q3unhEtfgqrnBwydbbfaIlFD944TM3rFfhy3B\nSRGy2BYq63x0nLliMmbiuCCGEWglMA7bRgPk4ve2TG1SdqseDufq8Ceg3LwDzxkXw2k+G1mtbfvY\nLq+3y5Sq4AV1LlK3NC3OXPECtmB/LJb1i6p+h22hfUxw2uWUpkGER0RaisidInKHiPfpwf2x77Wj\nb4fDU9Gq3nyPOW6VA10DPzit76O7Ncooa0KAI1l5JapKndMDq+oEoJWqxjQdO67BjK4+7nJW8ZSl\nId1QL8as3pPqeI2bgA2mgb722ChtFSvUfikWk+5neIdP9qoio7y8KrvM997cjQhC27pu2cE/Anlp\nXwhcF/DWECywL2VpKOFZFuZ1zDifFrcgXTTA0spFZCm2/snBPA3JzynMbpa9peVpHzxao57XQ/Pg\npcVULi3xPnU5J7DFIlIoIl5jqO7Hn1kfsH+ylKWhhOe/mO3qQFUNofmNZqU6fgAAEAFJREFUmXvx\n52eeGktUxB7YYvRsqMw4pMtDvca/feGTT/26qdHrS6syt/rdujIqj3uHzId/CnYoi4mbMH1Ua0zH\nFDMuRuuugLeGpfLOK+XNE9EQkdPwp0U5+xEYsAZW5MHaPCjMg415sDkPtuRBeWvI6WbuOusUqgSy\nSqFx8e75Ra1eOUSlax78bVbPH26YtXAgNt2NVdU3PfbpVMz5a4mqdvd4bj7mCeDzBbrUxbulHEl3\nBhORzlRvZfOAp1X1vTBtu2B+yW3cIz/gdeCxAgIPToK8DdC4CJoUQV4RNC+CthugzzJoUwQHHQqd\nu0KLn6H5FKvbBV8dnX1/llRkA3RvNmQurOkIRa2BJ0Rkd2fpTziqWigi72MekWA2sLTwOKqw4fxc\nzHj5JdW1JYIZgykQ1wU8lmNZI9bhhhDM/fNWWzz/7RFzuQhLmbt3F6qdqnxmCQCyMnLL4ZaH4MJL\noaoN8IyIjIrmvBVHnqNaeIaKSE9VXZike8dMQygJV6jqxcCCGNo+qqp7qOrBqnqSqp6vqter6n2q\n+qyqvuu27f+kuoDckZGuiTnJP47tvEp8b1ZVFz9xnLcAjnzJHexHPWPdPfISNR3ro+0mG4SGVBLG\n7b9YVcvwa2WX9IMpkSIEFPNzLoWqxvBJb/jn+LLK6sXtos3rBsD7veDp96CnryjKFSJSr7qqItJG\nRK4XkYvd82Ei8lcRmSIiuQHfZz3mhuIjJYvmpowDfBx4GAsPbg93HQkX/Ct805VNYc1F0K8rLBaY\nR6ZUK4JXlmweDM8Mhue2wXGz4N4tUNwMeFJEBqnqmjr28WrM7XWbiHyH+Rqdi2V2bU9Nd9kfqS7M\nW0OxmSpsd+aJcLikR85GtngXuC9MwN3MbnDLNbChG+QIHEimZFaIVGuYM0Tc68pcKBwOBzSz5Rnt\nMGVjWETkBvxJHGgjIo+5EScb+LcTnAzMh+dJVa1S1d1VdXHQpQJDdNLCEwsicryIXBBothCRvm7n\nFY0HsQU08K8Qa5/HRsCTl8G2fHjPCUh7hrU76aOsjOqczod0bvHV6I793uya13p+pmRUQAdgoO/j\n8SJyZoQ+fIHVnz8aOA14B9iqquUuexfA7tioHzKXjjNLBCpPd4qX33E8SSnhEZHJwELMdeLUgI/u\nxrwJI6KqxfhdNhYMhIe7V3/6z/HwyUSoys7KyCgbvlPe+21y1y0HWLC5b41RKkOkqmuz/LWjO/X/\n4rieQ54f2LrTV42z9t1MtXvz/S4IL1QfXneL+ZdU9XlVfVpVi0WkkVSXsTwAmOXWaojIiUGX6YOp\nMvxdwhznUoqGcAZr44LQfH+cXURksHu9VVW/wuw6S1z7xsD+hEhmFIb7ABeOe6fTOr++C8w7DCAv\nO2f94V0G/a93y52W75o/Z85u+bM/G9P53U9UJaS2NDerUfnQtt3nHd9z2Mtdmh7qUwFkAh/7F9Bn\nyK6cLXtxfUT3i2OA/zgf5hGYMzoBAXmBbMSc8gPxj7wi0jrCfZJGQ4w8XTCHsA+xOl3tcDoNVf2P\niLTBXCd8u43hQGGk6MhAnIOVWyz/vBvc3xfemARITmZWyeFdBv1f69y8IoCueUvXDm7z7S/ZGeWV\nZVWNqkoqYGu4ZAciHNj54M9zM9v4XF8bA6+LyOlsYi5V/IUVbKJA3uRMOZlzJThi4xVMf3MK5lLy\njIhcBFSpanD1wg34gx79dHZ+33/B0ug1OClnnhCRk4CzVXU/d3wz0E1V/+jhGs2xkasl9NwEo1sA\nun/73u/2bNFuZWDbovK83BkrivfdWPb3zqpzAeicl1c8qNWEz3s133Vt8LVnF77V67vCtwJLdGub\nXC7+ZRxPkMMzCCMxxeNWLNT5NeBVHmIGHv7YIlKI2cd8nA+cg+3KOqlqScgTk0gqCs/lQBdVneyi\nK74D7lBVT/mRReQ6wIW8HEOPZr3njuzYt9YC9Zt1b/aZU/j83sF5oQR4/iA4pkfwGXVmDTAL4Ukq\neJt/R850ISJr8MWSGZsxj4BLVfXuuPWqHqSi8LTBYrm/wVaoN2Dx5J7U8y4KdB2QkZXRq+zEXlc8\nl5mRWcOrr6RiQ86LCy8/ulLLs0MJT6scWHQiNI9v4acKIANhBpVcysMabse1GpvSA/kN6BkuPj3Z\npNpuqxEwVFVPV9X7sIXpw3W06/THfb+KqoXZxRWFtSI0lhXNblupZbUEB+yd9aXwZa2Jq86sxRIr\nPIFyOKWMDSc4juDV10YsoXdKCA6knoZ5KLbLeEssq9ZYwjitx0DA9ldl3sZ3eg5rd/LcwAZF5eui\nlvJ+aN6e85YWDaqRJPPT1e/1X168pGPbXNY+MYr/LtpC3hVfcsxhXWg5oSc0zgKFYjEj8Eps8f93\npmpUe14AwUKyHktGlTKkmvB8BrwqlrVzPVaxJkLAXmjEEjhOAGiaxcbiClou2TJr52Dhyc/tFjWj\n6Iay4Ys+XrVbjTDgD1fObb9o85KOrXMoB37o0Qzu3pf27Rozds1WeG4hvLqE9b8WMW72Gv3Ga/8d\ngba/CuACTbE1RkpNW2r8U1UfVNXnvPoBB3Agbr2w905W96ukYkOLZUXf1SgB2Tlvt3VNs1qHvUez\n7LbrOzYZUCvRU2VVeSZAhjittNC1XWO2FJXztyPe4qNTZ8D0RXSZs5aPROTMOmqHAyvvrFDV/9Xh\nGgklpYQnjowGyM2k6KlRvJ6bSRHATxvf7xPYKEsaVQ1vf9rHjTKb1tr25mTmFe/X4cyPMySr1n97\nYeni9gAtc5wyUlkKvJeXzYovx/PkGf15NEsoxxShU4HFInKFR+Web523nhTR6wSzowrPbgCdm7Kw\nfRPKhrXjE4AVJXN7bixbUSO5QsemA9eP637Tq71b7DcnP7f78ja5PZb3aTHyu/E9bn21XeOda41K\nv26a2bG4fH1LgJEdCDklPbQfnz56ALd0bOr3WeqIZWBdJiIPiMjwaMGAVCcjn6eqMyO2bCBSbqse\nD0RkBdDhwE688e5YXvpkFS33f43bqpTMTk0H/npQ54s/rct115cuy3tz6S1jy6u25TTJYvM3R3NN\n35ZEVNbdO5de987lkJ83srtCYBzWaixX9MvAexqUt9kpS58CBqvq7Lr0N9HscCOPWBLIDgADW5ll\nenh7Ng7OtzKSy4t/2HnW2udDxKxH5pdNH3d6c+mth5dXbcvJECpv3pMHogkOwLkDWPDTBO5/5RCu\n3qsdHzbKwJcRZCcsfv51YK2IPCci54vICGf/2gC8nKqCAzvgyCMiB2GhL7x8CFf/oRurAZYUkTtk\nOpcXbrOYrbaNey0b0ua4b9s36Rtcs6oGi7d81W7+xg/6riyZ1wNAoOq0vjz5yEjqNJVsKiNryvf0\nfX0Zg+euZ7fiCoLj5MG2+MswX+1PsMyu84BFSfSjjsqOKDyTcKW5iydR0CSr2k/nveXk/+FtLq/+\nwUQ7NOm3ePc24+bs1LiPf31TUrEh54f1b/VavOWr3iUVG/yJFPKy2XDDUB6+aBAxGWmjUanIwz/R\n/YWF7P7Degas3UanKo2oPinFirHNxpUq0AasfLMjCs/ZwP0ZQkXlGf7cxX4WbaHxWR9z8AcrOKi8\nyl+chKyMnLLGmc2LKrQse1vllqaqVf4pPSeTkj3a8PnD+/PagFZESyhVZ4rKyXxxER0/Wkm3HzfS\ndckWuq3ZSpdKJdxWvxxzgLuhIVLS7dDCs+lUzs3LDu1oP7uQZud9wmGfruaAcD9Olzx+PqIrH984\nlFn5ubU0vkmhvAr5YAX5M1fR4ccNtF9cRIcFm+i7sayG3WszcJWq3pvMvu2IwrM3rsb63fty23kD\nI4f4zFpL8+cW0mvOejqv3UarZlmUtMphy2l9+fbIbtTV0T3hPL+QjnfMZsystQzX6o3PvZgmOilp\n6XZE4WmE+dHk7tWWD78Yn1r2oHjzwiI6TJ7Jn9ds9TvJvwSc5AICEsoOt1V3fsFPA3y5lv3v+j5+\nVV5SkWN7sPLro7mjZ3NftjTGYyqAhLPDjTzg9/GdB7RrlcOqBSdwfauckKWNdhhKKsjYeRqXrSyh\nJ/CNqoZ00I8nO9zIA/6IywsANpTS/qi3OaaBu5RwmmRRtUsrX9E7miXjnjuk8AColYh+A2DmKsb0\nfpbz5m6IT12JVOW3YtOsA1HzWseDHXLa8iFWfuklXA7mptlsvH4ID1+8K14zdsVMpSKby8gsqiCz\nqIysogqySirILK4gc1sFmSUVZO3ZlvWxmDa8MOlDRjw2n1Oc/exGVb02ntcPxQ4tPODPtH4b8Bf3\nlu7UmCWD2zDnuJ7MntSXpV6ut6GUrI9WkT+nkDa/biZ/eTH5q7fSZv028jeW0aakgpjqVjTLprBj\nU5b2aMay3fNZenBnlo3qSEzlHwO5by49p/zA4b9sMk8CLDFUf1WNaHaJBzu88PgQkSOAxwhKpZuV\nQVleNhuaZ7OhVQ4bMoXK0kpySqvIKa+kUVkVOWVVNKqoolFZFblbK8ijpnU8buRkUtwml5Vtc1nT\nqSlrejVnzW75rB7ZgbUtG9mCf902sl9bSucv1tDtyzXsurSIfgGXmA8cpkmqAf+7ER4AEdkJqz86\nFgv5zY14QnQqsYiGxQGPlVgCqTLMfFAWdFwOdMPi1Qe757bUj7VYFb976+F96ZmUEx4XqxXfYJfQ\nNMaiUXfGnLU6uUcWtuAscY+t7lHsHsuwzKpLMYeteKgAOmDp8wZhcfo93COS52Eplgl/Gub3k3Cl\nYDCpKDyPkeL5h9MYO+xWPU3iScWRpwPU2rHshTmS52KO4RPx5+EJyfFYqLFgKeTOJWK1Y66lOs7r\nCeDWCG1zsUK2e2OxgdcQsoqgn53cNbti0+CZhMnL4xiE+SM1w6bFU7AknuEYi0XYZrrrngkR1QAX\nuTZg9b2uAcIZUrOwvNC+2Llb3XcxVDWlH9jCthj7oeYB7aO0P9P9MRQrD5kbpf29rq0C/4rStjHw\nrmtbBUyK0r4j5rylWN2vEVHa74lFhiq2+O4epf0J2JpLsYK0eVHa3xzwXf8DZERom43pyHztL6zV\npqGFI8qXHQkUJVBw7vEoOO8kUHCGYn7LiRKcm+IpOCktPHUQnDMSKDi5mF+0F8GZn0DBOd6j4Nzo\nUXCmRxOclBUeLBOYF8H5s0fBuTuBgtPBo+AM8Sg4E1JBcFJSeOogOKd7FJwpHgXnbY+C85NHwVnv\nUXDKPQjODR4EJwtb+MckOCknPFim9UQKzl0pJDh7eBSc4zwKzvUeBecFPAhOSgkPluRxiwfBmZRg\nwXnLg+C0TzHBuS7RgpMywuO+wC8eBKcDpstQLH4pJ0r7kbEKjmt/gWtbCZwWQ/tHPQiOYFnPFKsV\n1i1K+5ZUr4liEZzBrt+K6YskSvuJdRGclBEe9yX6YUmQIgpOQPtDsTjviCNOQPsLYxEc1zYD+He0\nESegfZ4T4oiCE9C+O1ZXvnuM7Ue460cUnID2k1z/w444Qe3/5VVwVJX/B3lv5yExMDTVAAAAAElF\nTkSuQmCC\n", "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Image('figures/ankle_joint.png')" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [], "source": [ "lower_leg_frame.orient(inertial_frame, 'Axis', (theta1, inertial_frame.z))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We now can see that the direction cosine matrix relating the two reference frames has been set on both frames." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{matrix}\\operatorname{cos}\\left(\\theta_{1}\\right) & \\operatorname{sin}\\left(\\theta_{1}\\right) & 0\\\\- \\operatorname{sin}\\left(\\theta_{1}\\right) & \\operatorname{cos}\\left(\\theta_{1}\\right) & 0\\\\0 & 0 & 1\\end{matrix}\\right]$$" ], "text/plain": [ "⎡cos(θ₁) sin(θ₁) 0⎤\n", "⎢ ⎥\n", "⎢-sin(θ₁) cos(θ₁) 0⎥\n", "⎢ ⎥\n", "⎣ 0 0 1⎦" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lower_leg_frame.dcm(inertial_frame)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{matrix}\\operatorname{cos}\\left(\\theta_{1}\\right) & - \\operatorname{sin}\\left(\\theta_{1}\\right) & 0\\\\\\operatorname{sin}\\left(\\theta_{1}\\right) & \\operatorname{cos}\\left(\\theta_{1}\\right) & 0\\\\0 & 0 & 1\\end{matrix}\\right]$$" ], "text/plain": [ "⎡cos(θ₁) -sin(θ₁) 0⎤\n", "⎢ ⎥\n", "⎢sin(θ₁) cos(θ₁) 0⎥\n", "⎢ ⎥\n", "⎣ 0 0 1⎦" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "inertial_frame.dcm(lower_leg_frame)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can rotate the upper leg relative to the lower leg through the knee flexion angle, $\\theta_2$, in a similar fashion. " ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nLoEAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Image('figures/knee_joint.png')" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [], "source": [ "upper_leg_frame.orient(lower_leg_frame, 'Axis', (theta2, lower_leg_frame.z))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we have two reference frames chained, we can show the direction cosine matrices of the uppper leg (one end of the chain) to the inertial reference frame (the other end of the chain)." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{matrix}- \\operatorname{sin}\\left(\\theta_{1}\\right) \\operatorname{sin}\\left(\\theta_{2}\\right) + \\operatorname{cos}\\left(\\theta_{1}\\right) \\operatorname{cos}\\left(\\theta_{2}\\right) & \\operatorname{sin}\\left(\\theta_{1}\\right) \\operatorname{cos}\\left(\\theta_{2}\\right) + \\operatorname{sin}\\left(\\theta_{2}\\right) \\operatorname{cos}\\left(\\theta_{1}\\right) & 0\\\\- \\operatorname{sin}\\left(\\theta_{1}\\right) \\operatorname{cos}\\left(\\theta_{2}\\right) - \\operatorname{sin}\\left(\\theta_{2}\\right) \\operatorname{cos}\\left(\\theta_{1}\\right) & - \\operatorname{sin}\\left(\\theta_{1}\\right) \\operatorname{sin}\\left(\\theta_{2}\\right) + \\operatorname{cos}\\left(\\theta_{1}\\right) \\operatorname{cos}\\left(\\theta_{2}\\right) & 0\\\\0 & 0 & 1\\end{matrix}\\right]$$" ], "text/plain": [ "⎡-sin(θ₁)⋅sin(θ₂) + cos(θ₁)⋅cos(θ₂) sin(θ₁)⋅cos(θ₂) + sin(θ₂)⋅cos(θ₁) 0⎤\n", "⎢ ⎥\n", "⎢-sin(θ₁)⋅cos(θ₂) - sin(θ₂)⋅cos(θ₁) -sin(θ₁)⋅sin(θ₂) + cos(θ₁)⋅cos(θ₂) 0⎥\n", "⎢ ⎥\n", "⎣ 0 0 1⎦" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "upper_leg_frame.dcm(inertial_frame)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice that thedirection cosine matrix isn't in its simplest form. We can be simplified with using the `simplify()` function." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{matrix}\\operatorname{cos}\\left(\\theta_{1} + \\theta_{2}\\right) & \\operatorname{sin}\\left(\\theta_{1} + \\theta_{2}\\right) & 0\\\\- \\operatorname{sin}\\left(\\theta_{1} + \\theta_{2}\\right) & \\operatorname{cos}\\left(\\theta_{1} + \\theta_{2}\\right) & 0\\\\0 & 0 & 1\\end{matrix}\\right]$$" ], "text/plain": [ "⎡cos(θ₁ + θ₂) sin(θ₁ + θ₂) 0⎤\n", "⎢ ⎥\n", "⎢-sin(θ₁ + θ₂) cos(θ₁ + θ₂) 0⎥\n", "⎢ ⎥\n", "⎣ 0 0 1⎦" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "simplify(upper_leg_frame.dcm(inertial_frame))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercise" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now as an excercise, rotate the torso reference frame relative to the upper leg through the hip extension angle, $\\theta_3$, and show the simplified direction cosine matrix of the torso with respect to the inertial reference frame." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAANIAAAFaCAYAAABrDQNDAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAewgAAHsIBbtB1PgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURB\nVHic7J13fFRl9oefk54QCCH03nsRkCYioIiKYsG2uFbsawcb6k9XrGvvDWV1LawFZLGAijRFpCi9\nS4cQOoGQnpzfH++dzCSZJNMnCff5fELmzty59yTMyfu+5z3ne0RVCTYiUgPoAZwE9AS6ATWBWOsr\nBhBgLbDc5WutquYG3UAbGz+RYDmSiLQBrgAuBboAET5c5jjwFvCiqu4NoHk2NgEloI4kIg2Ay4G/\nA31Lvh4BBXVgTxPYWQOyoiEvCgpiIB9gOzROheZHoB5mhHKQBUwEnlPV3QEz2MYmQATEkUSkG/A0\ncA4Q6Xg+AgpawdqBsPw02D4KdidbTlMe2yHuK2j+KZyyAgYUOkezXOA94H5VzfLbcBubAOGXI4lI\nQ+AJYAzOD7s2g01DYPED8EcXyPDHwFmQ8jCcsxQGFkKU9fQfwIWqusufa9vYBAqfHElEEoBxwP1A\nIkAsZJ4JPzwIvw2EI4E1E36B5DvgohUwwHpqL3CRqi4M9L1sbLzFa0cSkQuBN4AmYKZvA2Duu/Ct\nv6OPJ1wOZ3wJl6kZAY8DA1V1RbDva2NTHl45kog8AkzACgR0gj+fhynnwr4g2eeWJ6DLE3BLHsQB\nO4C+dlTPJpx45EgiEgtMwoSzqQmHJsDEu+GvINtXJg9Bj2fhNjVOvRAYYu852YSLCh1JROoD07DW\nJo1h87fwZk84FgL7ymUkjPgWLrIOb1PVt8JqkM0JS7mOJCJdgO+AFgA9YOEc+I8nIexQ0Qzu3wXt\ngFSgrR0WtwkHZWYbiEgdLCcS0PNh6nKYVJmcCGAcTLUeNgb+EU5bbE5c3I5IIiLAt8AIQO+Eia/C\nklAb5ylt4c7NJn/vANBKVYMePbSxcaWsEWk8xokYAj9UZicCeMSs4RSoC9wVZnNsTkBKjUgiMhT4\nCYhsBhs3wotxUBgW67ygC9y8Fk7GbAa3VtXD4bbJ5sSh2IgkIo2AyUBkAqRPgfeqghMBPAH/w4xK\ntYEbw2yOzQlGyand/UADgcJ/wsQ+kB4Gm3xiFKS1hVXW4W0iElnuG2xsAkiRI1nFd9cB9IIF98GG\nsFnlI9fAz9bD5jj3l2xsgo7riHQ1kAQw1vmBrFI8AmvrmP0ksIMONiHE1ZFuB2gOG66AKls8dy7M\nth6eKiK9wmqMzQlDBICInAF0Bri8io5GDp6DhbEmKxzMms/GJug4RqSbAWrCwQlQpUsSGkLuIJhr\nHV4uIgPDaY/NiYHDkQYA9IQ/qkq4uzzeh5kJzojjayLii/CKjY3HRFg5dU0BupranipPC8geDV9b\nh72Ae8Jpj031JwKjNwfAabAzjLYElHfht0awxTp8VkQGhdUgm2pNkSNFQt4FkBZmewJGJOin8G6c\nKX+PAr6wMjdsbAJOBEb9lLqwuzqsj1wZCoceg3fF/FwNgfkiMjjcdtlUPyKA7gBNq9G0zpUHYf1F\nzpqltsAcEZkiIiNFJDqcttlUHyIwSZ7UDYKEVmVhCvxwH7xVw/yMAowCpgOpIvKEiNQOr4U2VZ0I\noAAg30UhtTryHCxbAY+eBd8kwX7r6brAI8A2EbkpjObZVHEisNZFBb6J3Fcp2kDWTJh+BB56DZ7t\nZBRbFZNj+I6InBdmE22qKEUjUkE1H5FKcgdsXgvv/Bf+mQiHMVO+a8Nslk0V5YR1JAcXQFoNOGod\n2uFxG584oaZ2JVkGNTvDnXstuTHg32E1yKbKEoFVv3MQ6oTZlpDyDHQ6FR7bapqggcl6/zScNtlU\nXSKApQCpzr/K1ZpsiDgTLnwY7sk0QYZCTGuas2xxSRtfKXKkTEhaYO0pVWfuhn6z4FxLMzwVOF1V\nH1XVgnDbZlN1icBFs+7bE2BUynE2K1Ogl6rOC6c9NtWDCFVNBfYALDsBHCnJ9KMFMyJdFU5bbKoP\njkjdUoDV0CmMtoSE5+GPJs52NE+ISO+wGmRTLXA40kyA3dD2HWgVRnuCTjTou/DvWMjENCqbZnVj\nt7HxGYcjfYgRoOc1ODts1oSIc2HfY/BOhInYNQVeD7dNNlWbCABVzQTeAlgPPb+HemG1KgSMh3XD\n4Hvr8FIR6R9Wg2yqNK7ZDG8AWQoyAYaHy6BQ8g78GGGlSAGnhdUYmypNkSOp6n7gI4A/YODPkBI2\nq0JIofN3cCishthUaUrm170I5OZD9FVwc0Y1T2R91pTZi3W4MJy22FRtijmSqv4FjAPYA61GwMVh\nsSpE/GLpVQCrVXVNWI2xqdKUyvhW1TewNA5+gTMfgJ4htypEHHAGVVaH1RCbKk9ZpRPXA9sAXoVr\nZ1XT9VIrp+7dKBEZEVZjbKo0bh1JVY8AlwN5OZBwGdy9yGr5Up0YC7Mt3bsYYKqIXBJum2yqJmUW\n86nqYmAswGFoeA7cu7CaZYdfDqlvwCsxJv8uFiMieXO47bKpepRqxlzqBJH7gOcAasPe7+GFAdVM\nuusTaHor3JkByZiWMG1UdW+47bKpOlRYXq6qz2ONTEegwQi4r7rVLV0Juz6Gl6yUoRrAo+G2yaZq\n4ZFOg6q+jNVK8gjUPxfu/6qaCYVcWLyZc49yT7axKYHHgieq+hpwG6DpUO/vMP5hS+64GnIw3AbY\nVC28Ug5S1beA0UBmLsQ/A7dfAOcEx7TQkwkJ1kM7XcjGK7yW4FLVz4FTgR0KMh1GdYOb9kGVFqT/\nCJqlQhvrcFdYjbGpclQYtSvzjSL1gK+wsqaTYN9dMPnxKpQlkAfyJrSZCr0WwpB888fgKNDejtrZ\neIPPjgRgtUV5FbjV8VwHWPYGfD6skq4zNkP8W9BpHnRbCz2yoKbLy5nADao6OVz22VRN/HKkoouI\nnIWpZ2oLEAV5Z8N3k2FmorPeJ2wchOibYchiOGk3tC0sPaXNwJTbj7cSd21svCIgjgQgIrHAg9ZX\nHEAKpD4JH94CWwNyEx94E1o/DNenQ/0SL20FvrW+5qlqTuits6kuBMyRii4o0gajgXAOmNFpPLw9\nwblHEzI2QEJvePy4cwN5LsZxvlPV9e7eIyLxwNVAY6ArcKeq7g6FvTZVl4AL56vqZlUdAVwJHM6H\n6KfgtvFh2OS8AUZaTlQIXKqqQ1X1xXKcKBr4Cdikqo8BXwMvh85im6pK0DpQqOqnmIjenkKIfBnG\nzAuxUP9maG09nKaqX3nwlheBlao62zreAJweFONsqhVBbeWiqquBs4DsHEi4Gq4rcJZ2B5U8kP3Q\nxDpcUu7JgIhcANxBcWmuWCDF1r2zqYig90RS1VXAeIAd0PGyECkUzYR6+cYRAFZ48JYHgKWqus7l\nuQ7W92ovT2bjH6FqLvYqZu3BNLjwY2gW7BtmFM+0yCjvXBE5CRgA/KfESx0wYvtbSr3JxsaFkDiS\nmtDgtcChQoi6B244GOSUopOK10xV5Li3AnlAyY3Y9kCqJaBpY1MmIWt3aXW9uAngIDS+KciL+E5w\nPBLyrcPmFZw+DON474vINOtrOjACE3DwC0GiBYnx9zo2lZeQ9o1V1SnAdIAZcFaqcw0TFOpY7Wow\njuIWayO5JfBfVb3Q8QW8hBk1/+dybi8RuVpEbhORx0Tk3IpsEGQepuq2WkubneiEowHzY4BmQc3b\nYUgwb9TPalcDDCkn8tYO83tYV+L5KzC5d/+Boo3a8cAnqvom8BlGMKUL5ZMDbKISpErZBI+QO5Kq\nLgemAcwM8qh0qzPsHQlcVsZpjjY2RY4kIjHAJZhRyrHWqoWZKtawjlMxG72nlGeDosMV7aLoF97/\nBDZVhXCMSAD/xBqV/gFDg3WTEbDfpanYvSIS5+a07dZ312yHszAO/rzjCVXdq6qjVfWY9dRFmLql\nqZ7YIsgJ1TX+RCMsjqSqK7E+gD8EeVS6w7nGaQ7c6eaUdUAuEA8gIpEY8ZNb3aUSiUh/EXkZuB3T\ng7bcchFBeguyH0gVpFprqZ/IhGtEAngCIBsSn3ZqcAecB2B9K3Doeo8vuVZS1TxMMmtn66lHgCWq\nWnJPyXH+78B9mBy8H0SkYwUm7AHqYv5YtK7gXJsqStgcSVVXYGUc/Ah9gnmvR8zop5gE1snWqOPK\ntcA5IvIYMFdV/1He9VQ13yq5j8JMU8s+F03FuadV7Xv0nqiEc0QC+C/AZuiywSk8EnDGwI7h8J11\nOBSY4Pq6qu5R1dtV9XFVnefuGiLytIiUHKW24ZlzOAIZncs9y6bKUikcqRCinoWgdhf/Fqa3dH6g\nx3uyB1SCo8BOx4EVDj8HeMGD976BSYj9xst72lQRAl7Y57UBIguB/i1g3TazCRo0VkHiKfCoJU18\nCBMs2F7R+yw7IzHOkIZZ89TF5OB9qqr2HtEJTmVwpLuAVwR0EdzXB9KDeb83ofWdcH+h2VtaApyq\nqrnBvKcgtTDd4tsp+lQw72UTHsI9tQP4AihUkFcD29QsBaO/V4zbYMtl5p5gghwfuwk+BJoU4HPg\nSUGaBvleNmEg7I6kqnuwondrnFkG/tIEOBPY4e7FyTC7OyyyDi8DPhCRoBQcikgCUTSlAEcGuR1w\nqIaE3ZEs/gTYVXGWtqfsxgQy3DoSwAL4dztnwd81wFv+3lREIkWku4jcICLvichy4CgFzGdpUQaF\n7UjVkKhwG2CxHOAQNEqHqCRn+YM/xGKK9XpgyscLXV9MhIJF8E5vuH0rdAFuEZEsVR3r6Q1EpCXQ\n1+WrN+7D+Pks5AD9yKOathE90aksjrQMoBAip0DjMeWMJF4QhxH8j8A4Sik5sGTI/x3ePBnu3mmK\n+O4RkUxVfcTdBUWkNybk3R/jOGWVoG/FTB0XW19/cjexQIaigfgjYVPJqCyOtAKTeSALoHmAHCkd\n4zw9MEEHt7p69SFvAbzWF+5NM3VJD1u65o68vNOB84GROMVUXDmE02EWA4tVdb+b87L8+FlsKjmV\nwpFUNUNENgHt1wVWz+FXjCN1BxIpQ7vhc2hxBOqmQOpBIwx5E3AppklzjRKnrwLmYJxmkacSx4LU\nx6zbugJdFLfOZlNFqRSOZLESaL8nsJ0AV2LqhtZh9o2KkQ0RZ8Dlf0C/WMiKKz5qJFvfC4D5mBqq\n6aq6zUdbDgODML/zzoDbVCSbqkllcqQ8gIgSQQE/KcRU5Jbie6h3KTyQaQr2JAdqHDXZCkRBbgFE\nq9Hgi8SE5Y8CPrd6UTRPkE2Y3DzbkaoZlSX8DVY9UFRgInYlScToNjQB+DsMHQ3jMiEJS7BSoLAG\nHBkNk9Phjk/g8TbOdVVL4N9AmohMEpHTRcSX391a67sdAq9mVKYRKQ6M6H4Qrn070OYw/DIMZD10\nqwlHIqBAQRIhPRGO1YDj6ZAwF1KugN1XwGsvQvuXYJTVza8WcJ31tVtEPsNoOKz00I7vMKPaj0H4\nGW3CSNhz7RyIyG/AgJNg4TKYFODLD8aI+mcB92IqYr1iEjT/EPr/AX2tkcyVNZi0oy/KEui3qd5U\nCkeyct3SgRrnwbRvnLVDgSIeI5AfjZmi/ebrhbIh4gXoOAX6r4FeeaXL5FfidKpNri8IEoFRb+0I\nzFTUDolXEyrLGqkLVpi5X3CakmVhpLmOYULaPhMHhY/A2mUwaQeMvQPeaw/LXcQouwNPAhtF5E8R\nuVdEkpxvZw2mYrebP3bYVC4qy4h0AzAR0I1wdzsIhkRwIsahglI7tBXi/wUn/Qwnb4HOhcXXn0eB\nN4FXUH7HRAGvU/TDYNhiE3oqy4g0CKA27AuSE4HZjC3ArG/aBvrirSDrHVi4CV5fD+Ouhw8t0RXF\nBCnGA9tYU7Q+syN31YiwO5KIJGA04ujsVPsJFr2A54CbCWKfpnaQ+T4s2AKvfAqPd4XFYva04vne\nahVzJLiCLzahJeyOBIwCagKM8SMI4CGOdJ7amHVZ0LkCdq+Cif+D/2sB63kTkyTUgP4iclUobLAJ\nPpXBka4F0wH9eqfqabA4inOTtVT1bDAZCfs2w0ujtzM5ag255BIHfCQiHpdt2FRewupIItIMS7J4\ncPBHIwe/Wt9b4Sb/LphEgk6KY26nOSyLmk8unRDgRRF5JpR22ASecGc2XAVECBTeD7+H6J4rMYV+\nqwlsXp9HxGVTuLkvHfMTiKnVjwNH11EXeFBEUlT1plDbYxMYwj21uwagNaztF2T1IBcKMc5USOkM\nhZBQbz+pAL0vZWkLp9bejSJiKwxVUcLmSCIyAFOVynmwIMS3jwbuwkTw2oT43jTZbRqgpbWi/gp4\nraUzmfUhEbk51PbY+E84R6RrAWIh8/886zoeSPIw2goRhDjoANB1Ndua7mJT6y3sSIL82fBOihFs\nAXhTREaG2iYb/whLZoPVp2gPULsvzFsEn4TcCONA12A66o2zvoeNOVDnPHjISojNALqoaiBK7m1C\nQLhGpPMxezlcHbpoXUmWANmYpNNeob55ZgIRX11Co62tTB3WUDj0Crxh5ewlAu+G2iYb3wmXI10N\nUBv23mb0s8NBDvAl8AqhixgWUW8/z1/6JRPeuYWi/ko3wrZz4Fvr8GwRuTrUdtn4RsgdyWr0dRbA\nqeEbjRzMx5kPF1KSD7MPYG3n4hoVk2FmXed66eVymkjbVCLCMSJdAUQJ6L1hGAnc0BW4GzPdDBmN\n9pjI3Y7mNHZ9PhEKJsBHYpy7DqYNp00lJxyOdDVAC1g/2GjChZummLy7QYTw99Fqq9lLSmtYWjXp\nVth6MvxiHV4pIiUlwWwqGSHNbBCR7lj9Ys8J/7TOwUJM9rkjkdWtkGSgueYjVjZMI73/78ahSnIP\nzL4CTsOUYIwG3g+FXTa+EdLwt4i8AIyLhuwdMK6hD9oJQeJ2jJDkn8DbYbaliKbwwG5TO/WHqp4c\nbntsyibUU7tzAbrAskrkRGCCDouAn0N50xveZ+DABfxt4o20dPf6ecYugN4i0jV0ltl4S8gcydIt\n6ADQCzaG6r4eshIzdQqpXd+ex9DfTuGMH4fTzt3rdxSfZtoaD5WYUI5IJ2NVpZ4Dm0N4X0+JxnSY\nuCZUN2yYZtZHW1u5l2nuAhmxztL71qGyy8Z7QulIfcHk1l1kGhpXNpKBGzGpQyFJZG2x3YTA9zQq\nHgJ3pTZmvwnbkSo1oXSkrgANYEdkGDZAPWAfzqldSBJZO68lNS6bjIRMjpd1Tj1wdK2wHakSE0pH\nqgEQZ/LbKiuOco4+lBZ+DDjPjGdFVjz3bGrH62Wd08gekaoEoXSkWIDo4Gh7B4qlGF2HP7G0yENB\ndhwRB1OIdvdaS6cjNRURv8QtbYJHKB0pDiq9I+UC92O0x0NSsdt5LbcmZvDmXa8y0N3rrZ3ZHxGE\noQjRxjNC6UgxAJFh0EnwkgLM6DkQCEXCqBZEErWltfvIXXs44nLorvWmTSUglI60H+CQsxNeZeY+\nTAXv4GDfqPkOEwJPbew+cte7uCOVGd2zCS+hdKS/AA5B/WDeJA/kPdxnCnjBUut7f4Is2dVhgwmB\n76/nfkRqAdkxzpactiNVUkKZtPoXwFFIyYDIxCCI2eeBDICrd0GzbfDN075rQTgSWWvizMELCiO/\nYcuaLnzf9q+y99YS4fAh05rGdqRKSihHpE0AChFzICXQF88DOQ1GD4ZVW+Dpn6HbE77LEqdj0nNy\nsErig8WwWRycNYyv37mFhWWdk2QaOYO9Rqq0hHxqB/BrED4QH0KLq2Hhi/BnAhQugk82Qd0C38Xy\nJ2NEUWYHzkr3fHA9La77N4PeuYVW7l6v43SkTsG2xcY3Ql1GsRtofCrM+gU+D9mN/SMe0+18Z7Bu\n0G4Td/zVlu6D5/HD3CF8VfL1f0D/t+F667B9yU6ANuEn1GUU8wA2WFngVYDewPNAUKWEm+4ykbtd\nTd2vgcbBigjnmnJUMG2x8Y2wONIBaLrJCDQGlGyIiINXp0LDAF1yJ2ZPqSFBaE7moP1G40j767l3\npDaQ1dIpbXxRsOyw8Z1QO9JcAAWZhPsaHH94H1rlBNZB92EFScB95kEgOHmpCYHnxBJ/ONl9JHWQ\nM3LYV0TsoEMlI6SOpKobMAqr/AA9A339b4PTPMzRBqYrQfp9jZ7MzsV9uTc7jruSDxc1dS7GXbDc\nUhYS4Mpg2GHjO+FQEZoMsApO3h6gxNACkIegxyw4GyATog5C9EGI9iNq5+AP4N+Y4EhQ0psSMyjo\ns6T83L6ecKydqeQFuMeSfbapJITDkd4HyIfYxwhMH9WmMP4FuLHAVLkyBh5oDC82hhcnQQs/L5+D\nUTw6hSCMog5GfsO59fbzz/O+NboW7rgTvrceNgDGBMsWG+8JuSOp6josKa4frG7m/rIHnp4I/3Ic\n/xeeyoE7c+DOG2FbAG4Rjdn7+gdWK5pAc6gONQ/UpcnmNjQv65zbYEtz2GAd3ici4W4UZ2MRLu3v\n9wHSoNVnVWO3Pg8re50gdURvs9msHfc2KD8N6AaYYT1siVGttakEhMuRvsAU0PFWgEalEOAQ+69J\nEELQPZeZEHh6EvXTk8rOgfw/WNPA2bT6AREJd9dFG8LkSKp6HPgvwB/Q73D4e9l6wmrru2CCGh3L\nOddrzp5JavuNLD99NjOO1C7/9/F351qpM3BZIO2w8Y1w/jV7HyAbEv8ZpEX8R9DsYeju+lxqYLQY\nBLNeCpgmd6d1HN/QgTd/OpNpLbaXr2vxHCyrC7usw/+zR6XwE7b/AFVdghXOnR6A6V2cS1lGgfVz\nzYZW88xfbQCugiF3wmlN4EFHWHwrxDeEhzMr/l1sp3j4Ow641V+7XdnchvhX7qbth9eWHXAAiAS9\nDqZbh/aoVAkI91+y9wG2QcePoJk/FzoX9kZZehDLoB7ACmg7zJqSzYKUAogYB0v2QvOD1nTyPWif\nDzEJFe8RZVBcb0IwofWz/LHbldGTueSel3ngpbEMr+jcZ2B5PWci7f8FygYb3wi3I30EHABkAlzs\nz4USoWAMfBwPx16Hv3eBm/Mg+n6rY3gjyHkf5v4bOjeDTfUtp5gLXdp5JlWcAaWyDmKBEVD+COIp\nLq1eKizgiwS9Er6zDjuLyJBA2GDjG2F1JFU9CjwNsAW6/MvPBfy7sDATxn4GL7wBX66Bdx0jTRfI\nSIDC36BrL8u5ADZB+37OvZnyyMKMQq51J46w+J0EYO3VbZUJgR9OpmFedMUh9gmwPMGKfmLC8jZh\nItwjEsBbwA6AVwJUIjAS9g0to4nZVuhwvuVIy6DmIWj8d2dianmo9eXa/TwGeAOT1T7ST7MZOseM\nSPlRRP90JnUrOj8RCgY4cwFHiUg9f22w8Y2wO5Kq5gCPgdmgHRfkDuNNYOuP0PYjaPY3uCYJ9vXx\nXMMuH7PmcnWmnsA3wDT8/H0OXMCRJx/hpfmncf+I74ukisvlQZhvJbPGYJSPbMJA2B3J4mOsUWIS\njPIgguYzK+GtXrA7ByJzIeYU7/rY7ge+hmL6Cn0wKUT5BCCp9eGnWDfol6LS8goZBgdbmYbSEOQC\nRJuyqRSOpKoFwMMAR6DBrUESsT8NLrsSzhgHG2tCXibU+NyZcuMJ8zA1SgtcnkvAaucZCMY/Q4/u\nK7mhvOTVkox02tNWRGyloTBQKRwJQFWnYY0OU2DkPtxrYftDMhyLhfz7oee7MOBdmOilLNgi6/s2\nTLTRwdBA2biuE41WdaPfn72KbySXx3mw1eUwYE5t4zmVxpEsxgMch9o3wrBAX/x/MONO+PNWWD8X\nvrrQ+z5NrhG7eS6P2wJJfhsIdF5rIncHU4oJRsZiJMxaYooXi3XLGAYHXRqS2Y4UBkKqIuQJIjIT\nOCsasn+GRwfh+XohxNQGnsOZCT4FmOnlNRpgNnVrYaSca2cmUHdLa1o3TIOUg+SLUogR91fMNDIT\neJMSXQ+bw307TYnHl6pqZzqEmMo2IgHcBeTkQdyNMDrcxpTDEYrvP/mi6bAPM7UcghmB+yZk0rrr\naqh7AESJwkTjEjGZGBuBR3DTOrSZM8vBHpHCQKVzJEvX4VmADdDzwcr9wZjv8rgh3lfjKsYZZ0O5\n4e5sTIj9JZxTuGJ0cjpSWxFJ9NIOGz+pdI5k8QxW2s6bMHpnCLrn+chynAL37ILh90PPl6D9wfKD\nJREYTfF/YHTzRuO+hYxa138b+Kk8Q051OpKA54EKm8BQ6dZIDkTkdOBngEquzHrVZDjtU6AZFH4F\naYcsp2gFa3+Dt+s7k12bYbQf+mEKBN2hgByvAX/0JuO0+TxI8Q1gt6RBTCOzdgK4TlU/9OeHsvGO\nyjoioaqzgU8AFsDpkwKUGBpozoLEPZh519sQ0RJyCyGyECK3mITYpwvgTOBR62sYpZ1IMSPwn0Bh\nbgw5d74GZ88slZJUJg2dAQkIYdtOG0OldSSLscBhhYiH4OrsSmbvA9AzBraPhYOO0F2yVcIBpvNG\nJtSeYOqF3JWJHMDUFT2EWf90BA7/eirvTRoDWfHUXNfJ8+LBSOeemO1IIaZSfTBLoqr7gQcA9kKL\nawK48RkIpsHAqSYz4hfHc3ElqmbzgXeLvy0bk4nwPMaBvsE4VF9gCfB/H/xKirxjRpcfznLfgMwd\nkc4ppO1IIaYqaCW8D1wDDPwaLvoRVgwvnlUQFg5CdAJkRpvp1ELgAkAiccaqwbxobYQ5ZMj+xEzD\nSrIQWHgtDNqSS6Nm77Kx+WR2jNzNbk9tioK8XNM9o7IGZ6otld6RVFVF5GZgaR7EXQc3bILnPKho\nDSpTofEm6NTQ7OtQD3LizN5XUWFQHhw5AuueNG1hXqromjfDgEyIXQifsRwugHNegW6vw2JPbIp0\nFh7aI1KIqfSOBKCqa0TkPuD1VGhzIZz/oylbCBunwoEsqHnc6ui3F7NzGgN6tqmmfRPYnAfyElzn\nyTXHwooO1j7Rl5fSmCthy37qc4NnNrlM7ewRKcRU6jWSK6r6BmY9wSwY8UKQFE89pRMclxKjoppj\nwUTlsgDGQp+uTk28cungstn68xm0mH4+o365zPNM+Ch7RAobVcaRLMYAexTkcbhhXQDlsHzhXPgm\nwsWZCqEwx1mZe+ocqDMT+k0sngFRLqsg8WYY0GeJqZY9VpM6qY09G2FcGLl9wAAAIABJREFUpnYB\nz5y3KZ8q5UiqegC4CtAMSD4bbsmAyHDZMxVmNoWNLt30OAibMoD34JRbYPQk+CTOi/Xcq9DjSxhx\nzgzSsDZnvzvXs8idiyNViSl7daJKORKAqv4MTADYAR1PM44VFiJBt8OLt8CkOpAmUPgu1P8bbF4D\nU9fCW95mr/9u9XhqnEpOUjoHktLZf6Au8R7a43Boe0QKMVX1L9fjmD60f1sGA8+HfdOdMr4h501Y\n/Kb7yFoExWuYyuVHqPsXdHEoA6U15JG4bM9HM5eRsar+v1ZZqtyIBCYkjomELQT4Bi68B04Or1XF\niMUkor4A1Kno5M0QfyGcPQoeyIGEbKhxAZxzeTZnXQGnl9UOsyRR9ogUNqqkIwGoajZmE3QrIK/D\nGH918QJILiYDuyYmSbVcUiEuG2LqmPokFCQHorecRNMpj3Nhm81GZakiIu0RKWxUWUeCohSic4Ej\nBRD9CNwR7rC4hWI1U8MU/JUr9jgIDs+E6Z2tQsF4yJgJ028YzJzcR4k/Urv8Vi8O7GBD+KjSjgRF\nHQDPAI7kQ8x4uPPlIHRM94EFGIeqi48j5fAfjX6DChHfneu2XqkYsc5M8QrPtQksVd6RAFT1T2A4\nkJ4PsQ/AXa8aQZJwcghT+fopPrbf7LSO4wmZJvCwqF/FeuDNTIIFQEcRCXhXQZuyqTZTAFVdIiJn\nAz/kQa374K5IeOV2N/oGIeS//l5g+I/8FFlAwfAfi7r0lUkn2PONeVgDU79V4XtsAkO1cSQAVf1d\nRM7BOFPiOONML99aXPct1DTH9H/aRnFhSY/YeBEtRsMv51qBiAyIvB/6pEP8dbAyA6KnQMcekDoA\nMxW06ITtSCGjWkztXFHV3zCtVo7nQvzdcM97Rg8uXAzCqASdUdGJdUyyK3kuSaf7o6i/6Xrq3fSe\nif6NgItHw4YHYcnFcN8bMOB2WPYkXDMIDrjsJXV2cwubIFHtHAlAVX/BRPMycyH+TrjnA+8VfgKF\no1tEMyool78c1kRBXgbUfgXavgptcxOI/8/7XDlpDFdOiaTRRbBsEBzOhMijkPIUzO4FR5+B91Mg\nv7ZzndQpqD+VTTGqpSMBqKqj1UpWDiTcBmM/DI/uw3ac/V7LbfF5Aex9DZ4fBLNegIunwUn/as5E\ngIJIouPOpuAeqwXNF9AmCfb1g/RoUMf0tYFTPdZ2pBBSbR0JigRULgCycyDhFhjrb4tNH/kV80H/\nq6ITb4Wt8+GLXfCvOfDVzavZGptjyit+PdWZvLoY2rVyCaRMNbp6NKeoorabiNh1SSGiWjsSgKr+\nBFwE5ORAjVtg7Mehd6bZmM6Eiyo60R0pB9kD6NfzGXiG1fZmNXRva2nZvQct51k/06WwwnpbLQLQ\n/MzGMyqtrl2gsaJ5XwOxcZAxEV680jnlChWtgNZYen2eMm8wdTpsIOP1NDouhHYxkDcKVr4Hp7WA\ntFjI/8w4KwApMOEQNAKmq+oFAf4ZbNxwwjgSgIicC0wFYuIg4wN44Qo8Fxfxk3bA/ZhshwcpozVn\nIBgJI741o3Ae0Niq47IJItV+aueKqn6H6Z6emw2JN8C4z6k4YyBA/AUcxOTdVZjI6sqXl9K4zWbu\nrnuAxz05/24zhVRMFvjl3hpq4z0nlCMBqOq3wKVAXhbUvA7u/TI0zqQ4N2QrTGR1JSGT/C2t6XIw\nhca/DCK5ovPPgINNnYGNsBU+nkiccI4EoKrTcXGma2HcV3guxOgHjkTWIxj5O48442cORBSazO65\nQzxz+jOcfW77iUhlyIiv1pyQjgSgqv/DTHvyMqHWNXCvI4QcRA5h1kf/Ao55+qa4bAqTD5sUoVXd\nPHP4h+EPl7KKK7011MY7TlhHAlDVr4G/AfmZUOtauGdRgFpYlsMhzLSuA16oIJ20nOU9l/Fbt1XF\n8unKpB1ktoOV1uGVdjZ4cDmhonZlISKXAZOBiPqwYyk818zDLhA+8jAm/++/eBkK94YHoOdzpgcT\nwGlW6pRNEDihRyQHqvoFcC/APmg+FG4OcucLRza6x+KPBZHIrGGkPPY4XT19z0OwKhaOW4fXemGf\njZfYjmShqi8DbwBshm6D4Yog3s4xMjTFw2Tary6h0Zk/8eyER7lrVTfPAhVJkN/LmU1xpYg08cFW\nGw+wHak4d2PJIi+GwaPh9CDdZyfOWiGPImrDf2Sf1eGcH4d7Hq5/An60SitiMBvCNkHAdiQXVLUA\nI6P1J8CXcGkQOwV+hlkrldsb1kHyYfJrHTXtbFb08DxUfwYcPMkZCr9RRGw9hyBgO1IJVPU4Zo8p\nvQCixsLN24MjSr8FU/XqEN2vkHr7TYnE5jbe7Xk9Ad9bgv/xWGtBm8BiR+3KQEQuBb4A6AaLVpqG\nZ4GmJ2YvKw14paKTJ42heX4UEWf9QFqL7WR7c6OTYMwKGIAJPrS08+8Ciz0ilYGqfgm8DbAK+o3x\nIsLmBdlACqYsvEJF1jGT2HHTe2zz1okA/mlGJcXsXd3j7fttysd2pPIZi1Xf8zH8bYHVVCyArMe0\n8fQokXVDBxKGzOWSdpu4Y2cz75qJXQhpnWGpdXi7iAT6ZzmhsR2pHCxZ5L8BufkQe4tZOwX0FjgT\nWSt0pJrHKJg3mOF/taX7jHO8zw18GL6z7lkLuMvb99uUje1IFaCq64GXAVZD3yCouC7AtPF8oaIT\nG6eSk5hh2sQsPdn7jPXRsLsjLLMO7xIRj4IcNhVjO5JnPAmmg94zMDrPixIIDziMGSk8KvSrt9/k\n2m1q51u2+gPmXgDJwB2+XMOmNLYjeYCqZmBtZu6HZmNgcIBvEQucDzxFBeUVbTazrdEettbbT7ov\nN7oWdrR1JrPeLyJ1fbmOTXHs8LcXiMivwMBEOLwXHkzwoqVlBUQCz2P2k4KayArwCTS9Gh5VM7K+\npqr2eslP7BHJOx4DyIDkBwLb2KwA+N16PLDCkyORn88gJTPBt/+/K2GXS7bDrSLSxpfr2DixHckL\nrP61KwG+hDMDfHmPFFm3tyAuPovXhs3i2amjfC+RfxWmRRlxlGjgGV+vY2OwHcl7XgHYCy1fCWzr\nmFRMH9qvKaeBc4vtZEflkwewuK/v5fGD4PBgZ57fpSLSz9dr2diO5AufYXWGeMf0ZAokEzFNpcst\nQ697wETuNnTwT7RlIsyMs4T7MWs0Gx+xHclLVDUHK3VoI5y0ygsREw+ph9Gk61nWCQ3TTPLqzmb+\nOVIryLrQKhsBBomILSbpI7Yj+cZnYJomv2aaLgeSCzFtaYaVdcLoyfx+40T+/djj/M/fm02EeUnW\nCAs8KyLVqmdWqLDD3z4iImuAzh1g2Xp4K4CX7oTJ8VPgEZwf8qAxFnq/DLdYh7eq6jvBvmd1wx6R\nfOdrgM3Q+aCJfAWK9TgVWd2GwvOikZvfZcCwWVy0YKD/ibQvwR+NTH0UwD9FJNDT1WqP7Ui+Mw0g\nH2Jf9bFreRkoJhSehnGoUkTnoR9ey+ifz2DENyMD043wAfjSetgAuC8Q1zyRsB3JR1R1KVY3i5+h\nS4AvPwP4P2B+WSekHDQBh7WdAyO3fBf81cGZ0DpOREKhPFttsB3JP34D2GXUgAKJow9sQ6C/uxMa\n7DUh8O0tAie1/C+YEmHSnmqAZ4L9NgbbkfxjNcA+CIbMVUfgCeAa3CiyttjOnqh8cghgJvoFsLev\ncxQcIyJ2Q2cPsR3JP1YBZENiEKSO/8JslkYBpbIOPrqGWdlx3LGiR2C1JN6C6dGmBD4So1Fu4wG2\nI/nHaseDHwM/vcvHmVhaSi8iKZ38yAIUTBQvUDftCceGw0zr8DwRCXTJSLXEdiT/2AKmUfLy4Ezv\nHImskbiZ3jXfwX0xubzxzHgCOgV7H36qYVrPADxvC/BXjO1IfqCqhVgNkQ95qE3nJanAPzHlG8dL\nvpgdR3xeNLGrugW2UVpDyL2MoqyJPvjZ9U9EhlT3vSnbkfyn0PonWL9LR4/bJpTY+G2w14TAt7YK\nfJO0d2FBivPeT4tIjDfvF8NFIrIWOMOqMq622I7kP8F2JIBxmJGpWDFh010mBL6nUeBbd0aD/gOm\nWIetgNs8eZ+IRIrI1ZiOG5Mxv5dqH0q3Hcl/FILuSA5V1GJBh2Gz2HDafH68eEpwStMnwKoWJmUJ\nTOpQmQ4rIrEicjuwA9PVowWQhXHAYEg+VyrspFU/EZEVQPf+MHchfBqk27TBtMwEI7wf9ERWB9Og\n4SXwWIEJw09R1UtcXxeRGpguHg9hHKasPyh7gc3W11/W959VNS1oxocQe0TynwgACZwQijs2Y3Lv\nALq5vvDRNTS76T1O+X4E9YJx4wshbbgpNgS4WETOAxCRZBH5F7ANk6WeQPmfpwYYEcyrMFO9T4Dd\nIvKziNwgIhV2a6/M2COSn4jIMSBxFHw5BX4M4q06YSJ3O1yfTDnIhEN1aHTlJ3z68VXMDcaN0yGq\nFTx22KQs7cSMvHdiZMSyqNiJPCEP+AH4GPjKiogGBBFJwUgE1MVMxY9j7E2wTsmx7u8aWfxAVb/y\n9B52EZcfWImdiQDtgj/dWufyOBrzH0+9/aQdqkMjb1u9eEMS5D8MH99rWsI0wzQta4HZhG5mPR6O\ncfZEnFM8R95eASbwcBwzTW2DUax13Z+KBs6zvpaJyF0B7Hl7nWXrvcCfqqoiEonZXhCgraoeFZF4\n67xJ4F0Ax57a+UdRt72eoVm3dMdkhd/keMIRuUttHPjInSvjYGNvp075XUAzVV2uqt+o6huqer6q\ntlPVRqqarKpJmN9PP8w+1FLgDVUdoaodMA44Dqewvys9gfki8rmIBKLR26nARar6hzqnYM2A+sD3\nqnoUQFWzVHUTRltwvftLucd2JP9wOJIOg/0huF8URqqrO1ZuX5vNZu10ODk4ayRXPoav4o0wSyQw\nUUTKLWhU1f2qukxVp6vqW6q6weW13ar6kqr2wYxOj2KCEK5cBqwXkcd9LYEXkXbA76p6pMRLQ6zv\nc928LQEvHcleI/mBiDwP3JsIh4+Fpj+rqyLrFGDmpnYkrGtJUtQcav2VT7t90DIPYgshyvqKLoRI\n63uUQmQE5CfCnmRIrQd72sH2QSZoUCG3Qb+34Abr8FlVHR+oH85yltswe2YlK39nAZeoqldSzSJy\nDWbU2V/i+Q8xmfWtVHVbidduAd5VL5zDdiQ/EJEZwNmtYM0WDzruBYjLMOKUaZNh+jI4/Qi0VD/X\nuzVhZ3eYfTEsqmmtv8qiA9y+EXpg1kBnqupsf+5dEkuP/EngRorPmlYD56rqDrdv9O4e2wBUtaW/\n1wLbkfxCRHYDjYfAD3PA4wiPnzTeA6M+gwbrTRSNJc/AniHQ9TUKus7gQFQsWRGRFEgEhRGRFEgk\nBRERFDge52cTl3WU2jnHScrLJhF1Lvqj4Hg7mHc1zKxrInKlWAWJA+Cx42bUSAW6q6rbsnh/EJGT\nMIpNnVyeTgPOU9U//LhuS0zmxUeqeq0fJhZhR+18xAqpNgbobCWuBpu9kPAKXHbApbQ9NpEjR4Yh\n+04m6Ths6BnrdvFeJgX5RKZtoNneDXTKOkq9fKixDkY8BgP7w5S/w+8RVvaGg26Q8TBMesi00GwM\nfICREQsoqrpcRE4BpgJDracbAvNE5FJVneHjpR3XmlfeSZYjD8REHWOBjao6Q0TqAaOBXEy0McMO\nNvhOkZ7dQEu7IZisgbrPwIMHoEssMCKarCcTSB9wPt83KDTJpfsaeF9cGBlFQZMubOs1ihmdzuD7\nWvXNPlUuJM2HMQ/AAwvcaJGPh3VDnPtmF4jIrX78eGViBQnOxuwvOagBfCEindy/q0KGWN/nVnDe\nCkxx5dsYzfdZlk37MXteb2Mc7L+2I/lOd4AIyD/fmXUQFH6Hpm/CQ8cxe0X1W7L2/EKiG2SS1Gk9\nLRrtMb2SDtT1r0q3TjMOdBvB3A6D+SE20eiPH4E2H8IjT8OVe0rURH0DXzeA7dbhi8EqTVfVXFW9\nGpjg8nQiMNXHroNDgB2qurWC+ypmz2uTqs5RVde1Yyvr+39UNct2JN9pApAI6YlOsZKAswsSP4Xb\n86CmRFDYvBe/Nh/C0rSGJsrWegtt22zmUKut7Oq8tuhD7Rd1W7G318V826QbiyKjjC7EVhj8Atx9\nBGcT6EQomAjvRZnMgHjgPyIStM+Uqj4GvObyVEfg395cQ0RaYUbYuR6+ZUgZ5w4G1qjqPrD3kfyh\nPkANOBqsG+RCxOtwczakANqqL/ObdTdCjhvbmz2X2kdoMHQOuY9OYPYt7+DzArwkEYK27M2GnqOY\nltzU3OsotHwObsl1+dyMhH1XwBfWYW/g6kDZUAbjKC5TdrGIeKPDN8T6PreiE61Mh35lnDsYmOM4\nsB3Jd+oD1MS3FpSe8D6cecgSn2zQnhWNOjrz7La3YN+R2uzb2oo1edEUZMcRubordXY2C6yof2wC\nOZ2H8Vud5mwA2A9dnzOJp0VMgl9cpnhPWxnhQUFV8zFbALtdnn5GRAZ5eAmHpnq5gQaLUzDpUCeL\nyLMuX68CA3BxMNuRfKceQFKQRqRUSFxlxPSpUYe0NqcU9X0tYtqFzJw3mD/Sk8h8+iFOf3Ec5/1w\nVkB7NhXRcSiLatYz0cntcOqrMNLxWiToeJNWA2Yd96C7awQKVd0LXIyJmlkmlN2WRkTOFpExIvIE\nzrL560Tk4goCFkOAzao6VlUfdHxhOngotiMFhPoAdYI0In0M5+VDAoK27MOSstRHah4jru9iOrfb\nZDZR99UPuCwYACLQZTjz45NMKtRqOP+/Rs8BMEqtXWGJdThORJoFww4HqroIU77hoJ+IjCjj9CiM\nmMtizB+A8zA5fkL5PjAE92q3Q4BVrntntiP5TqL1j9tNS39YBfU2W53Tk5uwuXajsjv4nTafU+qv\n5eTEV0jhftg9lfrbDwZFiIXIaAq6nMXsmHgzCs+HK3a4iL68Bl9Z7TTjgWeDYUMJXgeTtGvhtqRd\nVb9V1alWgu0MVf1OVf+nql+p6hp37xGRBKAv7qeAQ3BZH4HtSP6QDZAT2E4UAEyBCxSiIiLJb9Wv\nSI/bLW8lcagzMP0bavA8ZD5I/JPfcf6UP52Z6YEkNoGcdoOYh6B5kPg+XOl4bSgcOsOpiTc62O00\nVTWb4g57soiMLOt8T7FC6tdi1kepLs/HWBvEfYGdrom0tiP5jsORvFLXqYg0SNhjol+ktGR9fM2y\nR7wdh0h8aiudS6ad5xcS+e1K+i/cHJwapdqNOVy/jVGZ3QO9PncRZfkQZiaaHriCKfkINu/h8mEn\nMEIrZ2FG1uuBdi6lHP0wFcq3YGqrejveYKcI+U4WBH5E+g76Flr/L406s6m8c6evoHNeQdn/h9+u\noseANsWmPgGj9QBWpu+hec5xas+HKwbC+qaQ0RByh8PPU+ESYLiIJKtqmVNTf1HVbBF5BjPNA+gp\nIqepapmdPDy4ptu8SavQ0G2xoT0i+U4WQG6AR6R1JuRKQm321Uwpvylz6hFSynt9/zHqBCsnOTKS\nwtYD+A1Bc6Hm+yb3DIDbTdBBMX9kRgXHgmJMpHgn+LNCcM9i2I7kO44RKWCOtAwaplupJ3VblSpy\nK0VsVFH41y3RkeRVJDackeP7rKROUw7UbcVagN3Qd5qVNjUUDjV2dgD0S6XVE6wG2bNcnjoz2Pcs\nie1IvrMP4HDpAjSfmWM2+YiIJL9Rx4oL7VrVLb+8vWly+a+npZPw2HRGfLrI90ZpbU9heUy8GTln\nw98yrWlpX1hunTIkRA2eXYVneotInRDcswjbkXxnK8Bho0wTEPZBa4DEuuyKiiW/ovMv6c26pHj3\n07+YSPKu6l92ScXeo8S/9wv9bxvK3Kw8oj9fik+Z1JFRFDTvxWKALKj3gRFBobszIz4ak/gZbFwd\nKQI4PQT3LHZDG9/YCnAMUvIC1Owrw2i/EV/Ls03ehBjyHzybH9rUK14PFdOFvJtGMatpcmnhfQdT\n/6TLbUNZ0LouR284leVRERQs3W42mb2lQTt2O7Ie1sCITZA8sHhGfCB77LrFqpp11VkYHux7umJH\n7XxnK0AhRP4KyUPhkD8XS4eYHGuaGJfkedpRwyQyHzmXOelZxPy1j6SmyWQ0qFXxJvGtQ4qPVhf3\nYqP3Vjtp3Z+lK7+jSUEhsZ/CpQ/DxCjIyzcjUkec3S2CyY84nTakfZ3sEcl3impZ/gjA9G6tGY0E\nICHZ+/y9pHhye7dgf4NaZGXFE3mojrPcIRQkpnCsXmvTeG039JkD7RKdf1wahsgM13zEYPSrKhN7\nRPKdrZiuelGLTX2LX3/Rd1jTOoDEFN8TYd/6B32W9KFTt1X8NfYl0yzawTMzGJyRQ3xeAVEJMWT/\nc6SJdC3ZRv1vV9IjN5+o3AKiB7dnzfk92OztvVv1Y9WhnbTJz6HGTPibOEvUgynn7IprcKWGiMSr\nasBTuNxhj0g+YoVcfwdYhm8LdVf2WY4UGU12TFz5Kj7lkZhhMi721yudvDqgNZtVkf3HqJOe5Sy3\naF6HY71bsDXtKPUOHad2Zq5vIf2oaAqadOVPgGPQTJ1dKIJW+FiCvSWOfVrz+YLtSP7xE8B26JBh\nUvl95rDlSDEJ5W/CVkTjVBOoOFSntCMN6cCutvWLpdMA0KAWWef34K/4GOOEft2/K9sc4fBCp5a2\n7Ug25TILIA9i3/UzxHvcVMESHV92pM0Tmu8wjpQbQ8yeRkUi8SEjQtCGHVmpQIZz6RCq1i0lAz4B\n25qoCNuR/GMxVmHfD/jXELnQGtEiIvz7691yG8eGzmHZVR8zJym9/MyHYNGkG1uyY8l0WRiVmzMY\nQEqWj2SG6L62I/mDVfY8B2CZUR71/VqOPksR/i3MY3IpvPo/rDp9NjsTMive1A0GERFofqNiQixB\n1yW3KJl76NeWhDfYjuQ/XwAcgKZP+jEqOUYkfx0JYG1nkiePpvP3I0ymhCtl7RwfPE5sTl7pkHl2\nHpGfLKLL67Ppu/OwU45r7gaarthZ9tRpuxT7OcZ4Y78flLQn4OqvZWE7kv98gdX86wMjZOgT6nAk\n8d+Rfu9Pix+Hc/LCAbQr+VpKolmD5eYXL/+Ys56WhZZ0cUGh83MxeTFdz+nKX3kFRP2yiRaO579f\nzUl7jpYttLIuDddS89NEZKAfP5KnlByRbEeqKljTu5cBtkGnSW5UST26ToCmdgAOwch99SmVuNm/\nNbtqxnE8M5f4zxbTeck26r89j5PTs4hPqWFKEf7YTttPfqcrQNcm7EmpQc7WAzRqU89MlQ4dJ/bA\nMZJ7NSsVJQNg416S0rOoBUBsUfDkBnfnBhhX4Zcj1hZFSLAdKTC8j1UP85KPo1Igp3bNdhZF7qIP\nJxefrtWvSfZTFzL9xkH8pIr8sZ1mrepy4PpTWd6jGVv7tmJt58Zsj4ky66s+Ldm3cS9J2fnE9mxm\nNjz/3EGD2gkcrV9GKtL0FcYJiSSfPiy0nr5IRIKdbeE66i0O8r2KYWc2BABVzRCRt4GH1sDJz8L8\nB71sVEUAR6TWW0wkURSdM5QWo6YWz7qoGUfeKW3Yc0qJ6tmr+psUn5Is3U6T5smkxUQZ29btoWHL\nFPch7SXbqL8m1doKOIU5XMMifmUYpjHa2QQp505EBKsMxWJBWecGA3tEChwvYvUkfQrGbMC7PRxH\nV3Qt9P//JCGT/NgcclWQRf1Kr5O8JSaKgvgYcgDW7SF5TSqtOjQsPa07kknM5MXWhzmRw3zK/7ie\n7SQVdTMcXfI9AaQjxddIvwbxXqWwHSlAqOohTAc4zYDki7yU7o2wmntpgX8ZEgBHaxGjVnjucDJJ\nvwzyL4Hz/O5salaHQ5MX03nFLhrmFxLVu0XxEeloFjHPzODMw5lWRsXN/JdmxvnoXZRpPjKIKqyu\nU+p8YFGQ7uMW25ECiKrOwgo8rIPeN1r6C54QYaXRFBb670ib2lE7N8bky+VFE/XNSHr6eq1Dx4n9\naCE9Lj+ZdaP7snbvUZLO6MiyuonOdKJj2UQ/PYNh+45ZI8JZfMMLJucOgKuKHCkBF4XWAHOTy+P5\nqupXhoi32I4UeB7C9NXhIxj9nYf5XoEckQ4nFyWLOo6TdjXFp5Fg20Fq7T1KbVX4eR3Ns/KIubwP\n6xyvZ1hOtPeotYdzBt8zk+nFLnItO6hdlJkdcDEUERlM8eLBiYG+R0XYjhRgrJDr34HsPIi7Au75\nBZIrel8gR6S0hlbo2SI/isivLnE2RvOGXs3Zf1o7Nk5bTrs29Tn84NnMjxBTHnEgg7inZjAsLd3K\nXBjCTGbxtdsLdTE6eASn4O5ml8cHMB3+QortSEHAksG9Hig8CnXPh3uXUL4md9GIFABHSm1cWpBl\nfUeapyf5Vh5xWnt2X9STTS1d5MFWp1Ln8W84t8iJBvETc5hS5kVOMd0sgPp+dNorhYg0xgjqO/hI\nVUOeY2g7UpBQ1c8w83Y9AvXPhrErSidVFlE0IhX4/39yqE7xEQkgL5roqaP8r5sCmLmalq/O4pyM\nHGogKOcxjflFPZLccw2bcBb6nRYIOyyewymJVohRXg05tiMFEVX9ALgT4BA0HgZj1+F+rRJvdbXI\ny/a/v9GxmtSIyi+esBqVT/7v/emcG+P7/3l+IfLufHp/vpTT8guJJIYsxvMG3/BdhW/uQgZ1i2qh\nAjK9s3oi/d3lqUmq6lelsq/YjhRkVPUN4D4wia0D4OGPoVTLk0ZWvl7OcZIK8n2f3qlAdhxxLbcV\n32y94jN+bZjGgRnnlE5k9YQVO6k7firn/b7F0sBLJo3PeZqnSvdtKpN2RdM7v0ckEYnEKVMMpm3L\nQ/5e11dsRwoBqvoClqB8OtQbA+P/Af1dz2ltORKKpKf5Ljq5rz7xtY+Qfs/L/CJaNJXicDJxjz/G\nTykHvavRycgm+vXZ9H31Z845kGEFTdqzgj94mgu9LNjrX5Rh0URE/NW6e4TipSv/tLqNhwXbkUKE\nqj6JaRmZmQ/Rb8P1p8BoR4n6ybDTkd1wbH/pZFNPOVKb2H+8xdwGNU97AAAQ9UlEQVSETPITM5xO\ns6eRcc5Tfy1dau6OQkVmrqHlg19zwZ876KggxHOMW/mADbxBKx/6Ql1VLFXJ51FJRP4GPOby1Frg\nTV+vFwjsXLsQoqqfiMhyYArQfiGc3gFafAAfnA37EyDtODTOPEQKPlaVdtjAEcfjlIMcOVbTrMn2\nNKo4BA+Qm0/EjNW0nruRrkcyXYIWPVnAp3xJJz9K4XtyjNrs4wj1gV5435E8Eehqvc9RWpUJXGll\n4YcN25FCjKquFpE+mA/DqFRocx5MGAI/9oFdx6FxVrrvI5IrjfZweFtLkx50OLl0JM+V47lETV9O\n+wWb6Xw8xyVPMIXdPMBk7ita3/hHE7a7OJLHiMjzmNqv/+FUJ1LgGlUttxlbKLAdKQyo6lFMW/ux\nwIQCqPEzjFgI2X2A9hkkFxYiERH41ZSlYZpTHy8zgfiCSCSywHnNnHwif9tM4yXbaPHXPprlFbgU\n+zViC1czg6dYQaR/dhSjLTtYQx+gh4hEqGq52e5WVvdHmMzuqyieKTKhrF5GocZ2pDCiqi+JyOeY\n9o1/z4S4ecDaQiKP/UnH03uyITrS97KKJrudGuKFEUTsaE6iLIU1qdRbm0rjv/bRLLegRKO01qzm\nVmZwr3+Cl2VyMjusQooaQAdwphuVREQiMKPQhZh9NtcN5S8JTHe+gCAarE5UNl5h9Vt9HZdO4bFR\n5HRsyPYBbdjWpyV7Hak5FVGoyKHjxG6Po9YbHzuzomMuIjd3mpvshmTS6MsSbmAJlwSnw18Rq0ik\nu0nsxaxtPnV3mtUK5n/AMEr3oPoIuFFVfRbSDDS2I1UirGnMciidFxcVQUFSAkdTanC0biJHU2pw\nPDOP6GNZxGfkEJeRQ/zxXOKyconLyiNOLf0F0qFodTQOeMl6XJt99GYp17CUq4p3swg6tfgXx6gD\nvKaqd5V8WUSigfmYpsf/396dB1tdn3ccf/1Y7gUU2QQUSVhEDeIGiGmD1upY0041TlqSYmJa6yRq\nTROXTqrtuFVim9RYo457rUsVnVjjgkaightiFJTggriAohEBAbmAbBfut398zzl35d5zzl045/B7\nz5y559z5bTP3fs7zfJ/vszSNLP80hNAVs2kLInXtSogQQkiS5HZcq5s6kzzvDeNt0m97ne5rNhqw\nZqMB77bYKWEnvKd+ZPC3fIqHfdsSX81rdEy1uHm8Viyl75hv3S9ZapGBGle0giRJ+uENzTet63BZ\nZhuh5EiFVHrMBHW6mextL5julw401yifGGyVwT43xAYDdbfNHtbbw3p9rdfPegOst7f1hlrvS9Yb\n7QRMtBxVEj/xpn3ybhy5VVzL/Fh0r74QMwhWiYPEVmMjlmV+5sdYSy1yJI5IkqRXCGELJEnSB89i\neAtnBZyfJMkPxe2D+/FSCKGr2iG3SuralSBJkizBaBPNMd9dLR5UK9GzDQuxXLV/dq5NDtAX9yLY\noZeN/ts1TvVJPo+DkWICbn/Nv3x3iPN0u4nCWyPOj31GFFpzrjXGeS7MfJocQpibJElfcWL4WI3X\nREH9oOUNYlOT34oDDN5uK+rXVaQWqTR5Aj+0ONONpyXaEtEsg5zlNFdb6BQH+BC/wWrdbdLPaS6x\n0i+clxv63Eds5D9UnGc0tMGrtfKL7mKz/OyG6FpxfdOyiOBUy1ygTuxP8UdJkiwSS8PHiGLZIO4V\nvY6HxEYmC7pqREsxpBapBEmS5CTMANNdnqflqGeHxDj/4Bb3O1Yv/JsPxXhgw3/vPW231jI9DdFK\niUcebBD/2Z/MvG+bwS6z2nBMF8W6h+jWPYd5IYQua+7YEaQWqTR5TnSZunvCmIKFNM04Eyx2rLXi\n3zhoqVtxrR5etr+j875y9ls3EQsRt2EuHqXAkTBDrMgIaWQIoSu6sHYqqZBKkBDChiRJXsd4Cx0g\nCit/XjHKGbmGI9vFNcZAm2nULrJOdCIbCymI7tkKcd5Q9udIsXHJFnECxyNYoNhI3n5WWgTtbxdW\nCqRCKl3mYLwPGrXhzY+FxrnUcJdnRsSM1sMI/KLBMTts9aot6qzDa+oFs4pmEwP3xT9iibhmKXgs\nZjNG5/riDU6SZEAI4fNWjy9xUiGVLnPwIxsM8qL+JtdndbfJdj293SAp9C30F3wuESNeM7HRX/u6\nyRbTaARLUxKxQ8/lsjNabzbK2fXDqIviiEa1TAfq4j50HU1aj1S61HcK/VWB7s8h3tJ0qsU2W/Fz\nPIaNaiUWOsiUNtdfQQxlRxGd4Jsudrqzmm+mFsQxGhbhtbRvVFakQipRQgjLyXzrzyvQvbvZTE0n\n/+1Qh/dlgwLf9nUnmKdfAcPI/sLJ9rbepy632HDnO7Kg52rIgY3qmtoTMSwJUiGVNtEqvV+gRTrA\nJj92u262ywYDEgm+YZUzTDbVZlVuzk2KaJuZBptgmfvN0lPwnAfU6KWmyOVBT0FP2bErrdZKlQPp\nPlIJkyTJmbhFos4HzjWiwBDzDEN831nW2FcPdU5SbS/8iaudXvC0jI5nT1f5Qn9cHEK4clc/TntI\ngw2lTbRIQTd3298l3iro7JOtstK0zKceYl+DbppH5Vpni25WqlKtrlme3ud6WKXKaJvbzLZoSpUt\nGQcvde1SOpW3ZQcKzykiDN6Y7epHQe6T1xn/YawebtLbLUa63ukNJj5M8Pe6ucVAN/mKa/2+CPes\nKmdh293Lb1eTCqmECdHvjgOzFrdbSPAxPkF+GdPne8dLLlLdQguvme7xXfe162nqe0Pkl1ZUwqSu\nXekzBydbbrRNuunTrol+NxV0dC91JqnRx3pbmwxOG6LWYe2spv0iZ8U6tyq3C0gtUukT10nbVbmn\nuEHPLbDrXanlqtXmugEV1miyBEmFVPrMl937eardeWn74Fqx4LyzByO3TuM1VWqRUjqXzIiSeeDN\ndq+TPhfrjhKxdKF91LWQUd6QLQ3+v3ZI1DY4/r1GY27K3iKla6TyYA6O8VG7hbRVFNMAMRH1o7zO\nappulOW5nVjIJXo7y58bosbbRvozC7xrqD8Y6hzPOMNHllWWkFKLVB7EddIme3k8v1GarZD9p903\n7zOGZfLxVjdo7l+jh/kNZtMubzBu8zzHu8rTpputh+0edKyHzVRtm88yQYsVOSF9EUIo+6hdKqTy\nYK5sqs9D7V4nPS92b3gl7zMuM8NeVnvTRJNNdYJvOtT5zvVA7pjvOd/fZuYeXeAl4zMh7Y+McHzm\nXi+6z4WZjIrPcmuksrdGpK5dWRBCWJckyQJMMMfhsntLxTG/7UOaMMWnpvgX8/Qzw5f1VOd2T+gp\nWOE2e9pqL9sclckQPy6zifyxap8Z7qQW6pfW5ixS2QcaSIVUTjyICZY4xHLVhuUSPgulSmxAuR8e\np4Ds70lqTMoNVY5c38Sy1Upc4VDTvO5OY1Tb5JRMEd8ZjvYzLxui1rrcdIyKsEipa1c+xEHH2/V0\nlUPbcZ0qcQr4SbR7vdWcJw12valmGWSmQ+1pneWqTTPOZlWGZPL8Ps3tibWvQLBESIVUJoQQ3iGT\ntPpkrndqMWxUn5KTX85dIfylVS5yt4eMcY9H3OsGl5hkoM3uMxv8xmCbc4mq+ZdylDCpa1dePIhx\n3nOoNXoaVGAWdz0rxIzr/CN3hXBRgxKNUTY7sUG1Lzym4djLihBSapHKizgLqFa1/2yleWTbrBAT\nV3t3xEMVzILcQOgPQwjpGimlawkhvCE7EnNmYRPvmvAAzpEVZlezNGeRKsIakQqpHIlBh8UOL7rM\nO/bq3jU9s1eoyjSGJBVSyi4kCmmb3q42tshrVOMnYvJqx0fuWuMeIzM9v0mFlLKrCCHMl+1D91jR\n0but4vyhvjojctcaL+Tcus1Y2KX37kRSIZUnvwaLHGFT0X/DwnPuOoLFuUDD/FIaXdleUiGVJ9G9\n22oP/+UrRV4jK6Sus0i1Eh9XXqCBVEjlylzZHLUZRUfv3sBscQZR13CrUQ02Yp/psvt2AamQypBM\nU5To3r1hQqOCufyZh/vEiRJdw0MOz7zbKBVSSokQ3bvN+rquqNKKRHTrJtKksUlnsTAnpCdDCMUm\n3ZYkqZDKl+fJTKj4rYOLvMalOFucfdS5zDLIavtlPs3o9Pt1MamQypTMNO9nwZtF7ScFcjOKOj/g\ncHvOGtWJ5RsVRSqk8uZZsNJIyxqUeudPtqiu80Pgv3NY9l0I4bNWjy1DUiGVN7NAnW5udWAR52dD\n4O3vKNQay/SyzEGZTxXn1pGWUZQ1IYQ3kyRZiaGec7DCQ9kviNG7lW0d2C6uc7C63P9aRQoptUjl\nTyyWW1zUOulz0b3r3ATW2bn10dIQQmETNcqEVEjlz9NgjWHmNeoVly9/gwswqiMfKketxOLc+qgi\nrRGpkCqBWbl3dxaVLnQIxopJrB3Pjfa3JddrPBVSSmkSQlhGpt3VS0XtJ2Ujd50TAn8k59bViHtf\nFUkqpMogunfvFbVO6tws8IU5t25mJWV7NyUVUmXwKNhogLsKdtE+xDs6oy3WTIOtNSzzqWLdOtLw\nd6UwG5vQx68c7u98XMC5r2VeHc8dOWu0A090yj1KhNQiVQAhhC2yQYfXcmuSQuguunZ7dOBj8XLu\nWV4MIazt0GuXGKmQKofoOq0woogw+BWZVzEibJklevs4l23xaIddt0RJhVQ5PC4moiZuzLlU+bIq\n87PjInfXG6dO98ynil4fkQqpYgghLJct0ptbsGXp+BD4M7lneDeE8G6HXbdESYVUWcRv/qXGWqNn\nAed1bAh8i27eyTX6r3hrRCqkSuMxxAnovyxoT2kRbsWNHfIUNxttay5w8ViHXLPESYVUWbwq66Y9\nWdA6abWYBd4xQ79m5O5do31D0cqGVEgVRKYpSrQAr5toY26xnw9fxXcour1XPfXZDE9VcjZDQ1Ih\nVR7TwRZ7mpanVZqnn0udYqrjTPVXLmwwZLlQZhlkTa43Q8WVlO+MJH6JpVQKSZIkWIqRDrLA4jbW\nPdOMc6UfNFjTRMZ43StuMqCA0ZjwXceZ7jtiKH7fEELnFg2WCKlFqjAy7t1d4D2HeStXwtCcefr5\nd99vJiJ432Gm+EbBD1Dfm2H+7iIiUiFVKncjqNPdlY7a6VE/d1SDWqHmzPGndhTQfHK56ga9GXYb\nt45USBVJCGGp2I+B2b620wOX5OYUtcw2vT1jYN43/qnxduT2r3aLsHeWVEiVyx1gpRGu3Mme0kA1\nrV4hUedgG/O+48OOz7xbGEJ4Ne/zKoBUSJXLdDLlFDftZK1zokWtXmG49w2TX2vhW430aa7vww35\nPmSlkAqpQgkhbMPPwCfGuKSFUPiFFjsy4wI2pYdtrnZv3je8zomZd+so4LwKIRVSZXO77HS/q53u\nJf2bHfE7/2uq++wp1gt1t90ob/k/V/iW5Xnd5UeO8pZJmU93hBA2dcTDlxPpPlKFkyTJ0WJr4+6G\ne8/vXWOQlrMNFuhrtM36FbB39Gv7mOpitarF/auJIYR1HfDoZUVqkSqcEMIcXAb+4AAHu8jTBrV4\n8HgbChLRS/o709kZEW3BlN1RRKQWabcgSZJuuBPfA9W+8K9uc6niup7ukDjDMe43xTa9M789M4Rw\nW0c8bzmSCmk3IkmSc3ANqhAMs9SxXvFP5ptofZsXeNog9zrYU77mE2Myv63FT0MIV3Tek5c+qZB2\nM5IkOQoP4Mv1v1RnmKUGWmOAGnurUWW79frYoI8N9vCBMWoMaXK5V/CDEELXzaEtUVIh7YYkSdIf\np+FU/DEFzaANWIj/wQ0hhM5twF8mpELazUmSZASmYoI4Jyn76i7uCWVfH+FJscZoRctX2335f8Pl\nEe0mVhdaAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Image('figures/hip_joint.png')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$\\left[\\begin{matrix}\\operatorname{cos}\\left(\\theta_{1} + \\theta_{2} + \\theta_{3}\\right) & \\operatorname{sin}\\left(\\theta_{1} + \\theta_{2} + \\theta_{3}\\right) & 0\\\\- \\operatorname{sin}\\left(\\theta_{1} + \\theta_{2} + \\theta_{3}\\right) & \\operatorname{cos}\\left(\\theta_{1} + \\theta_{2} + \\theta_{3}\\right) & 0\\\\0 & 0 & 1\\end{matrix}\\right]$$" ], "text/plain": [ "⎡cos(θ₁ + θ₂ + θ₃) sin(θ₁ + θ₂ + θ₃) 0⎤\n", "⎢ ⎥\n", "⎢-sin(θ₁ + θ₂ + θ₃) cos(θ₁ + θ₂ + θ₃) 0⎥\n", "⎢ ⎥\n", "⎣ 0 0 1⎦" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# %load exercise_solutions/n03_kinematics_rotate-frame.py\n", "torso_frame.orient(upper_leg_frame, 'Axis', (theta3, upper_leg_frame.z))\n", "simplify(torso_frame.dcm(inertial_frame))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Point and Locations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To derive the equations of motion of a system we need to have defined the velocities of the mass centers of each rigid body. We will first define points that locate the joints: ankle, knee, and hip to simplify the mass centers of the lower leg, upper leg, and torso." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Joints" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The ankle will be our based point and all other point will be defined with respect to the ankle. The ankle will be considered fixed in the inertial reference frame, i.e. $^I\\mathbf{v}^A=0$" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [], "source": [ "ankle = Point('A')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The knee is defined with respect to the ankle with a vector that is the length from the ankle to the knee, $l_L$, in the direction of the lower leg $\\hat{\\mathbf{l}}_y$ unit vector. We need the constant length and a new point $K$." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [], "source": [ "lower_leg_length = symbols('l_L')" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [], "source": [ "knee = Point('K')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The position is set with the `Point.set_pos()` method, giving the reference point and the vector." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [], "source": [ "knee.set_pos(ankle, lower_leg_length * lower_leg_frame.y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The position from any other point can then be found using the `Point.pos_from()` method." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$l_{L}\\mathbf{\\hat{l}_y}$$" ], "text/plain": [ "l_L l_y" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "knee.pos_from(ankle)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is also possible to express the returned vector in another reference frame. For example, you may want to know the position of the knee in the coordinates of the inertial reference frame." ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$- l_{L} \\operatorname{sin}\\left(\\theta_{1}\\right)\\mathbf{\\hat{i}_x} + l_{L} \\operatorname{cos}\\left(\\theta_{1}\\right)\\mathbf{\\hat{i}_y}$$" ], "text/plain": [ "- l_L⋅sin(θ₁) i_x + l_L⋅cos(θ₁) i_y" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "knee.pos_from(ankle).express(inertial_frame).simplify()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In a similar fashion the hip is defined with respect to the knee." ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$l_{U}\\mathbf{\\hat{u}_y} + l_{L}\\mathbf{\\hat{l}_y}$$" ], "text/plain": [ "l_U u_y + l_L l_y" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "upper_leg_length = symbols('l_U')\n", "hip = Point('H')\n", "hip.set_pos(knee, upper_leg_length * upper_leg_frame.y)\n", "hip.pos_from(ankle)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The vector from the ankle to the hip point can be expressed in the inertial reference frame with:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$(- l_{L} \\operatorname{sin}\\left(\\theta_{1}\\right) - l_{U} \\operatorname{sin}\\left(\\theta_{1} + \\theta_{2}\\right))\\mathbf{\\hat{i}_x} + (l_{L} \\operatorname{cos}\\left(\\theta_{1}\\right) + l_{U} \\operatorname{cos}\\left(\\theta_{1} + \\theta_{2}\\right))\\mathbf{\\hat{i}_y}$$" ], "text/plain": [ "(-l_L⋅sin(θ₁) - l_U⋅sin(θ₁ + θ₂)) i_x + (l_L⋅cos(θ₁) + l_U⋅cos(θ₁ + θ₂)) i_y" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hip.pos_from(ankle).express(inertial_frame).simplify()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Center of mass locations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The mass centers of the three bodies can be located in a similar fashion. The distances $d_L,d_U,d_T$ locate the mass centers relative to the distal end of the body segments. First define some new symbols:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now define the point $L_o$ and set the position of the `lower_leg_mass_center`." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Position the `upper_leg_mass_center` ($U_o$)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Position the `torso_mass_center` ($T_o$)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$d_{T}\\mathbf{\\hat{t}_y} + l_{U}\\mathbf{\\hat{u}_y} + l_{L}\\mathbf{\\hat{l}_y}$$" ], "text/plain": [ "d_T t_y + l_U u_y + l_L l_y" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# %load exercise_solutions/n03_kinematics_define-com.py\n", "lower_leg_com_length, upper_leg_com_length, torso_com_length = symbols('d_L, d_U, d_T')\n", "\n", "lower_leg_mass_center = Point('L_o')\n", "lower_leg_mass_center.set_pos(ankle, lower_leg_com_length * lower_leg_frame.y)\n", "lower_leg_mass_center.pos_from(ankle)\n", "\n", "upper_leg_mass_center = Point('U_o')\n", "upper_leg_mass_center.set_pos(knee, upper_leg_com_length * upper_leg_frame.y)\n", "upper_leg_mass_center.pos_from(ankle)\n", "\n", "torso_mass_center = Point('T_o')\n", "torso_mass_center.set_pos(hip, torso_com_length * torso_frame.y)\n", "torso_mass_center.pos_from(ankle)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Kinematical Differential Equations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "At this point, we are going to select three generalized speeds, $\\omega_1$, $\\omega_2$, and $\\omega_3$, (the angular velocities of the joints) so that the time derivative of the generalized coordinates are equal to the genearlized speeds. These relationships are called the kinematical differential equations and allow for the remaining equations of motion to easily be derived in first order form. This step is explicit when using Kane's method, which we are going to use. First create the time varying symbols:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [], "source": [ "omega1, omega2, omega3 = dynamicsymbols('omega1, omega2, omega3')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To enforce the relationships: $\\omega_n = \\dot{\\theta}_n$ we define these three equations $\\omega_n - \\dot{\\theta}_n = 0$: " ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$\\left [ \\omega_{1} - \\dot{\\theta}_{1}, \\quad \\omega_{2} - \\dot{\\theta}_{2}, \\quad \\omega_{3} - \\dot{\\theta}_{3}\\right ]$$" ], "text/plain": [ "[ω₁ - θ₁̇, ω₂ - θ₂̇, ω₃ - θ₃̇]" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "kinematical_differential_equations = [omega1 - theta1.diff(),\n", " omega2 - theta2.diff(),\n", " omega3 - theta3.diff()]\n", "kinematical_differential_equations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Angular Velocities" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can use the generalized speeds to define the angular velocities of the reference frames. Due to our definitions of rotations these are simply $\\omega_n \\hat{\\mathbf{k}}$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hint: Remember how we located the joint centers and center of mass locations. The syntax is very similar here." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Set the angular velocity of the `lower_leg_frame`." ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "outputs": [], "source": [ "lower_leg_frame.set_ang_vel(inertial_frame,omega1*inertial_frame.z)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$\\omega_{1}\\mathbf{\\hat{i}_z}$$" ], "text/plain": [ "ω₁ i_z" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lower_leg_frame.ang_vel_in(inertial_frame)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Set the angular velocity of the `upper_leg_frame`." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Set the angular velocity of the `torso_frame`." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$(\\omega_{1} + \\omega_{2} + \\omega_{3})\\mathbf{\\hat{i}_z}$$" ], "text/plain": [ "(ω₁ + ω₂ + ω₃) i_z" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# %load exercise_solutions/n03_kinematics_define-angular-velocity.py\n", "lower_leg_frame.set_ang_vel(inertial_frame, omega1 * inertial_frame.z)\n", "lower_leg_frame.ang_vel_in(inertial_frame)\n", "\n", "upper_leg_frame.set_ang_vel(lower_leg_frame, omega2 * inertial_frame.z)\n", "upper_leg_frame.ang_vel_in(inertial_frame)\n", "\n", "torso_frame.set_ang_vel(upper_leg_frame, omega3 * inertial_frame.z)\n", "torso_frame.ang_vel_in(inertial_frame)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Linear Velocities" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, the linear velocities of the mass centers are needed. Starting at the ankle which has a velocity of 0." ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [], "source": [ "ankle.set_vel(inertial_frame, 0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Working our way up the chain we can make use of the fact that the joint points are located on two rigid bodies. Any fixed point in a reference frame can be computed if the linear velocity of another point on that frame is known and the frame's angular velocity is known.\n", "\n", "$$^I\\mathbf{v}^{P_2} = ^I\\mathbf{v}^{P_1} + ^I\\omega^A \\times \\mathbf{r}^{\\frac{P_2}{P_1}}$$\n", "\n", "The `Point.v2pt_theory()` method makes it easy to do this calculation." ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$- d_{L} \\omega_{1}\\mathbf{\\hat{l}_x}$$" ], "text/plain": [ "- d_L⋅ω₁ l_x" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lower_leg_mass_center.v2pt_theory(ankle, inertial_frame, lower_leg_frame)\n", "lower_leg_mass_center.vel(inertial_frame)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$- l_{L} \\omega_{1}\\mathbf{\\hat{l}_x}$$" ], "text/plain": [ "- l_L⋅ω₁ l_x" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "knee.v2pt_theory(ankle, inertial_frame, lower_leg_frame)\n", "knee.vel(inertial_frame)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$- l_{L} \\omega_{1}\\mathbf{\\hat{l}_x} - d_{U} \\left(\\omega_{1} + \\omega_{2}\\right)\\mathbf{\\hat{u}_x}$$" ], "text/plain": [ "- l_L⋅ω₁ l_x - d_U⋅(ω₁ + ω₂) u_x" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "upper_leg_mass_center.v2pt_theory(knee, inertial_frame, upper_leg_frame)\n", "upper_leg_mass_center.vel(inertial_frame)" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$- l_{L} \\omega_{1}\\mathbf{\\hat{l}_x} - l_{U} \\left(\\omega_{1} + \\omega_{2}\\right)\\mathbf{\\hat{u}_x}$$" ], "text/plain": [ "- l_L⋅ω₁ l_x - l_U⋅(ω₁ + ω₂) u_x" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hip.v2pt_theory(knee, inertial_frame, upper_leg_frame)\n", "hip.vel(inertial_frame)" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "$$- l_{L} \\omega_{1}\\mathbf{\\hat{l}_x} - l_{U} \\left(\\omega_{1} + \\omega_{2}\\right)\\mathbf{\\hat{u}_x} - d_{T} \\left(\\omega_{1} + \\omega_{2} + \\omega_{3}\\right)\\mathbf{\\hat{t}_x}$$" ], "text/plain": [ "- l_L⋅ω₁ l_x - l_U⋅(ω₁ + ω₂) u_x - d_T⋅(ω₁ + ω₂ + ω₃) t_x" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "torso_mass_center.v2pt_theory(hip, inertial_frame, torso_frame)\n", "torso_mass_center.vel(inertial_frame)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.5.1" } }, "nbformat": 4, "nbformat_minor": 0 }