Created
March 31, 2021 00:35
-
-
Save mirrornerror/db1f85b7ed6291365909c98120cf9c96 to your computer and use it in GitHub Desktop.
IK: 3-Link Arm with 3x2 Pseudo Inverse Jacobian Matrix
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "## 3-Link Arms : 3x2 Inverse Kinematics with Jacobian Matrix" | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2021-03-31T00:27:57.771697Z", | |
"end_time": "2021-03-31T00:27:57.780183Z" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "%matplotlib notebook\nimport numpy as np\nfrom numpy.linalg import inv, pinv, norm\nimport matplotlib.pyplot as plt", | |
"execution_count": 28, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2021-03-31T00:27:57.784790Z", | |
"end_time": "2021-03-31T00:27:57.799214Z" | |
}, | |
"code_folding": [], | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "# Forward Kinematics\n\ndef FK(L, TH, plot=False):\n x0 = 0\n x1 = x0 + L[0] * np.cos(TH[0])\n x2 = x1 + L[1] * np.cos(TH[0] + TH[1])\n x3 = x2 + L[2] * np.cos(TH[0] + TH[1] + TH[2])\n y0 = 0\n y1 = y0 + L[0] * np.sin(TH[0])\n y2 = y1 + L[1] * np.sin(TH[0] + TH[1])\n y3 = y2 + L[2] * np.sin(TH[0] + TH[1] + TH[2])\n X = [x0, x1, x2, x3]\n Y = [y0, y1, y2, y3]\n if plot:\n return X, Y\n else:\n return np.array([[x3, y3]])\n\ndef Plot(X, Y):\n fig = plt.figure(figsize=(5,5))\n ax = fig.add_subplot(111)\n ax.axis([-1,N+1,-1,N+1])\n ax.grid()\n ax.plot(X, Y)\n ax.scatter(X, Y)\n ax.plot(Target[0], Target[1], marker='x', ms=20, color='red')\n ax.text(X[0], Y[0]-0.4, 'Base', ha='center')\n ax.text(X[-1], Y[-1]+0.2, 'End Effector', ha='left')\n ax.text(Target[0], Target[1]-0.2, 'Target', ha='left', va='top', color='red')", | |
"execution_count": 29, | |
"outputs": [] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "## Plot the result of FK" | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2021-03-31T00:27:57.809442Z", | |
"end_time": "2021-03-31T00:27:57.878663Z" | |
}, | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "Target = np.array([2.0, 1.0]) # dummy target\nL = [1, 1, 1] # length of links\nTH = np.radians([45, 45, -45]) # angle at each joint\nN = len(L) # the number of links\n\nX, Y = FK(L, TH, plot=True)\nPlot(X, Y)\nprint('End-effector: x =',X[-1], ', y =', Y[-1])", | |
"execution_count": 30, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": "<IPython.core.display.Javascript object>", | |
"application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.get_websocket_type = function () {\n if (typeof WebSocket !== 'undefined') {\n return WebSocket;\n } else if (typeof MozWebSocket !== 'undefined') {\n return MozWebSocket;\n } else {\n alert(\n 'Your browser does not have WebSocket support. ' +\n 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n 'Firefox 4 and 5 are also supported but you ' +\n 'have to enable WebSockets in about:config.'\n );\n }\n};\n\nmpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n this.id = figure_id;\n\n this.ws = websocket;\n\n this.supports_binary = this.ws.binaryType !== undefined;\n\n if (!this.supports_binary) {\n var warnings = document.getElementById('mpl-warnings');\n if (warnings) {\n warnings.style.display = 'block';\n warnings.textContent =\n 'This browser does not support binary websocket messages. ' +\n 'Performance may be slow.';\n }\n }\n\n this.imageObj = new Image();\n\n this.context = undefined;\n this.message = undefined;\n this.canvas = undefined;\n this.rubberband_canvas = undefined;\n this.rubberband_context = undefined;\n this.format_dropdown = undefined;\n\n this.image_mode = 'full';\n\n this.root = document.createElement('div');\n this.root.setAttribute('style', 'display: inline-block');\n this._root_extra_style(this.root);\n\n parent_element.appendChild(this.root);\n\n this._init_header(this);\n this._init_canvas(this);\n this._init_toolbar(this);\n\n var fig = this;\n\n this.waiting = false;\n\n this.ws.onopen = function () {\n fig.send_message('supports_binary', { value: fig.supports_binary });\n fig.send_message('send_image_mode', {});\n if (fig.ratio !== 1) {\n fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n }\n fig.send_message('refresh', {});\n };\n\n this.imageObj.onload = function () {\n if (fig.image_mode === 'full') {\n // Full images could contain transparency (where diff images\n // almost always do), so we need to clear the canvas so that\n // there is no ghosting.\n fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n }\n fig.context.drawImage(fig.imageObj, 0, 0);\n };\n\n this.imageObj.onunload = function () {\n fig.ws.close();\n };\n\n this.ws.onmessage = this._make_on_message_function(this);\n\n this.ondownload = ondownload;\n};\n\nmpl.figure.prototype._init_header = function () {\n var titlebar = document.createElement('div');\n titlebar.classList =\n 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n var titletext = document.createElement('div');\n titletext.classList = 'ui-dialog-title';\n titletext.setAttribute(\n 'style',\n 'width: 100%; text-align: center; padding: 3px;'\n );\n titlebar.appendChild(titletext);\n this.root.appendChild(titlebar);\n this.header = titletext;\n};\n\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._init_canvas = function () {\n var fig = this;\n\n var canvas_div = (this.canvas_div = document.createElement('div'));\n canvas_div.setAttribute(\n 'style',\n 'border: 1px solid #ddd;' +\n 'box-sizing: content-box;' +\n 'clear: both;' +\n 'min-height: 1px;' +\n 'min-width: 1px;' +\n 'outline: 0;' +\n 'overflow: hidden;' +\n 'position: relative;' +\n 'resize: both;'\n );\n\n function on_keyboard_event_closure(name) {\n return function (event) {\n return fig.key_event(event, name);\n };\n }\n\n canvas_div.addEventListener(\n 'keydown',\n on_keyboard_event_closure('key_press')\n );\n canvas_div.addEventListener(\n 'keyup',\n on_keyboard_event_closure('key_release')\n );\n\n this._canvas_extra_style(canvas_div);\n this.root.appendChild(canvas_div);\n\n var canvas = (this.canvas = document.createElement('canvas'));\n canvas.classList.add('mpl-canvas');\n canvas.setAttribute('style', 'box-sizing: content-box;');\n\n this.context = canvas.getContext('2d');\n\n var backingStore =\n this.context.backingStorePixelRatio ||\n this.context.webkitBackingStorePixelRatio ||\n this.context.mozBackingStorePixelRatio ||\n this.context.msBackingStorePixelRatio ||\n this.context.oBackingStorePixelRatio ||\n this.context.backingStorePixelRatio ||\n 1;\n\n this.ratio = (window.devicePixelRatio || 1) / backingStore;\n if (this.ratio !== 1) {\n fig.send_message('set_dpi_ratio', { dpi_ratio: this.ratio });\n }\n\n var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n 'canvas'\n ));\n rubberband_canvas.setAttribute(\n 'style',\n 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n );\n\n var resizeObserver = new ResizeObserver(function (entries) {\n var nentries = entries.length;\n for (var i = 0; i < nentries; i++) {\n var entry = entries[i];\n var width, height;\n if (entry.contentBoxSize) {\n if (entry.contentBoxSize instanceof Array) {\n // Chrome 84 implements new version of spec.\n width = entry.contentBoxSize[0].inlineSize;\n height = entry.contentBoxSize[0].blockSize;\n } else {\n // Firefox implements old version of spec.\n width = entry.contentBoxSize.inlineSize;\n height = entry.contentBoxSize.blockSize;\n }\n } else {\n // Chrome <84 implements even older version of spec.\n width = entry.contentRect.width;\n height = entry.contentRect.height;\n }\n\n // Keep the size of the canvas and rubber band canvas in sync with\n // the canvas container.\n if (entry.devicePixelContentBoxSize) {\n // Chrome 84 implements new version of spec.\n canvas.setAttribute(\n 'width',\n entry.devicePixelContentBoxSize[0].inlineSize\n );\n canvas.setAttribute(\n 'height',\n entry.devicePixelContentBoxSize[0].blockSize\n );\n } else {\n canvas.setAttribute('width', width * fig.ratio);\n canvas.setAttribute('height', height * fig.ratio);\n }\n canvas.setAttribute(\n 'style',\n 'width: ' + width + 'px; height: ' + height + 'px;'\n );\n\n rubberband_canvas.setAttribute('width', width);\n rubberband_canvas.setAttribute('height', height);\n\n // And update the size in Python. We ignore the initial 0/0 size\n // that occurs as the element is placed into the DOM, which should\n // otherwise not happen due to the minimum size styling.\n if (width != 0 && height != 0) {\n fig.request_resize(width, height);\n }\n }\n });\n resizeObserver.observe(canvas_div);\n\n function on_mouse_event_closure(name) {\n return function (event) {\n return fig.mouse_event(event, name);\n };\n }\n\n rubberband_canvas.addEventListener(\n 'mousedown',\n on_mouse_event_closure('button_press')\n );\n rubberband_canvas.addEventListener(\n 'mouseup',\n on_mouse_event_closure('button_release')\n );\n // Throttle sequential mouse events to 1 every 20ms.\n rubberband_canvas.addEventListener(\n 'mousemove',\n on_mouse_event_closure('motion_notify')\n );\n\n rubberband_canvas.addEventListener(\n 'mouseenter',\n on_mouse_event_closure('figure_enter')\n );\n rubberband_canvas.addEventListener(\n 'mouseleave',\n on_mouse_event_closure('figure_leave')\n );\n\n canvas_div.addEventListener('wheel', function (event) {\n if (event.deltaY < 0) {\n event.step = 1;\n } else {\n event.step = -1;\n }\n on_mouse_event_closure('scroll')(event);\n });\n\n canvas_div.appendChild(canvas);\n canvas_div.appendChild(rubberband_canvas);\n\n this.rubberband_context = rubberband_canvas.getContext('2d');\n this.rubberband_context.strokeStyle = '#000000';\n\n this._resize_canvas = function (width, height, forward) {\n if (forward) {\n canvas_div.style.width = width + 'px';\n canvas_div.style.height = height + 'px';\n }\n };\n\n // Disable right mouse context menu.\n this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n event.preventDefault();\n return false;\n });\n\n function set_focus() {\n canvas.focus();\n canvas_div.focus();\n }\n\n window.setTimeout(set_focus, 100);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'mpl-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n continue;\n }\n\n var button = (fig.buttons[name] = document.createElement('button'));\n button.classList = 'mpl-widget';\n button.setAttribute('role', 'button');\n button.setAttribute('aria-disabled', 'false');\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n\n var icon_img = document.createElement('img');\n icon_img.src = '_images/' + image + '.png';\n icon_img.srcset = '_images/' + image + '_large.png 2x';\n icon_img.alt = tooltip;\n button.appendChild(icon_img);\n\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n var fmt_picker = document.createElement('select');\n fmt_picker.classList = 'mpl-widget';\n toolbar.appendChild(fmt_picker);\n this.format_dropdown = fmt_picker;\n\n for (var ind in mpl.extensions) {\n var fmt = mpl.extensions[ind];\n var option = document.createElement('option');\n option.selected = fmt === mpl.default_extension;\n option.innerHTML = fmt;\n fmt_picker.appendChild(option);\n }\n\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n};\n\nmpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n // which will in turn request a refresh of the image.\n this.send_message('resize', { width: x_pixels, height: y_pixels });\n};\n\nmpl.figure.prototype.send_message = function (type, properties) {\n properties['type'] = type;\n properties['figure_id'] = this.id;\n this.ws.send(JSON.stringify(properties));\n};\n\nmpl.figure.prototype.send_draw_message = function () {\n if (!this.waiting) {\n this.waiting = true;\n this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n var format_dropdown = fig.format_dropdown;\n var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n fig.ondownload(fig, format);\n};\n\nmpl.figure.prototype.handle_resize = function (fig, msg) {\n var size = msg['size'];\n if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n fig._resize_canvas(size[0], size[1], msg['forward']);\n fig.send_message('refresh', {});\n }\n};\n\nmpl.figure.prototype.handle_rubberband = function (fig, msg) {\n var x0 = msg['x0'] / fig.ratio;\n var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n var x1 = msg['x1'] / fig.ratio;\n var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n x0 = Math.floor(x0) + 0.5;\n y0 = Math.floor(y0) + 0.5;\n x1 = Math.floor(x1) + 0.5;\n y1 = Math.floor(y1) + 0.5;\n var min_x = Math.min(x0, x1);\n var min_y = Math.min(y0, y1);\n var width = Math.abs(x1 - x0);\n var height = Math.abs(y1 - y0);\n\n fig.rubberband_context.clearRect(\n 0,\n 0,\n fig.canvas.width / fig.ratio,\n fig.canvas.height / fig.ratio\n );\n\n fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n};\n\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n var cursor = msg['cursor'];\n switch (cursor) {\n case 0:\n cursor = 'pointer';\n break;\n case 1:\n cursor = 'default';\n break;\n case 2:\n cursor = 'crosshair';\n break;\n case 3:\n cursor = 'move';\n break;\n }\n fig.rubberband_canvas.style.cursor = cursor;\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n for (var key in msg) {\n if (!(key in fig.buttons)) {\n continue;\n }\n fig.buttons[key].disabled = !msg[key];\n fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n }\n};\n\nmpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n if (msg['mode'] === 'PAN') {\n fig.buttons['Pan'].classList.add('active');\n fig.buttons['Zoom'].classList.remove('active');\n } else if (msg['mode'] === 'ZOOM') {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.add('active');\n } else {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.remove('active');\n }\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Called whenever the canvas gets updated.\n this.send_message('ack', {});\n};\n\n// A function to construct a web socket function for onmessage handling.\n// Called in the figure constructor.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n /* FIXME: We get \"Resource interpreted as Image but\n * transferred with MIME type text/plain:\" errors on\n * Chrome. But how to set the MIME type? It doesn't seem\n * to be part of the websocket stream */\n evt.data.type = 'image/png';\n\n /* Free the memory for the previous frames */\n if (fig.imageObj.src) {\n (window.URL || window.webkitURL).revokeObjectURL(\n fig.imageObj.src\n );\n }\n\n fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n evt.data\n );\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n } else if (\n typeof evt.data === 'string' &&\n evt.data.slice(0, 21) === 'data:image/png;base64'\n ) {\n fig.imageObj.src = evt.data;\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n }\n\n var msg = JSON.parse(evt.data);\n var msg_type = msg['type'];\n\n // Call the \"handle_{type}\" callback, which takes\n // the figure and JSON message as its only arguments.\n try {\n var callback = fig['handle_' + msg_type];\n } catch (e) {\n console.log(\n \"No handler for the '\" + msg_type + \"' message type: \",\n msg\n );\n return;\n }\n\n if (callback) {\n try {\n // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n callback(fig, msg);\n } catch (e) {\n console.log(\n \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n e,\n e.stack,\n msg\n );\n }\n }\n };\n};\n\n// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.findpos = function (e) {\n //this section is from http://www.quirksmode.org/js/events_properties.html\n var targ;\n if (!e) {\n e = window.event;\n }\n if (e.target) {\n targ = e.target;\n } else if (e.srcElement) {\n targ = e.srcElement;\n }\n if (targ.nodeType === 3) {\n // defeat Safari bug\n targ = targ.parentNode;\n }\n\n // pageX,Y are the mouse positions relative to the document\n var boundingRect = targ.getBoundingClientRect();\n var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n\n return { x: x, y: y };\n};\n\n/*\n * return a copy of an object with only non-object keys\n * we need this to avoid circular references\n * http://stackoverflow.com/a/24161582/3208463\n */\nfunction simpleKeys(original) {\n return Object.keys(original).reduce(function (obj, key) {\n if (typeof original[key] !== 'object') {\n obj[key] = original[key];\n }\n return obj;\n }, {});\n}\n\nmpl.figure.prototype.mouse_event = function (event, name) {\n var canvas_pos = mpl.findpos(event);\n\n if (name === 'button_press') {\n this.canvas.focus();\n this.canvas_div.focus();\n }\n\n var x = canvas_pos.x * this.ratio;\n var y = canvas_pos.y * this.ratio;\n\n this.send_message(name, {\n x: x,\n y: y,\n button: event.button,\n step: event.step,\n guiEvent: simpleKeys(event),\n });\n\n /* This prevents the web browser from automatically changing to\n * the text insertion cursor when the button is pressed. We want\n * to control all of the cursor setting manually through the\n * 'cursor' event from matplotlib */\n event.preventDefault();\n return false;\n};\n\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.which === this._key) {\n return;\n } else {\n this._key = event.which;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.which !== 17) {\n value += 'ctrl+';\n }\n if (event.altKey && event.which !== 18) {\n value += 'alt+';\n }\n if (event.shiftKey && event.which !== 16) {\n value += 'shift+';\n }\n\n value += 'k';\n value += event.which.toString();\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.figure.prototype.toolbar_button_onclick = function (name) {\n if (name === 'download') {\n this.handle_save(this, null);\n } else {\n this.send_message('toolbar_button', { name: name });\n }\n};\n\nmpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n this.message.textContent = tooltip;\n};\nmpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar comm_websocket_adapter = function (comm) {\n // Create a \"websocket\"-like object which calls the given IPython comm\n // object with the appropriate methods. Currently this is a non binary\n // socket, so there is still some room for performance tuning.\n var ws = {};\n\n ws.close = function () {\n comm.close();\n };\n ws.send = function (m) {\n //console.log('sending', m);\n comm.send(m);\n };\n // Register the callback with on_msg.\n comm.on_msg(function (msg) {\n //console.log('receiving', msg['content']['data'], msg);\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(msg['content']['data']);\n });\n return ws;\n};\n\nmpl.mpl_figure_comm = function (comm, msg) {\n // This is the function which gets called when the mpl process\n // starts-up an IPython Comm through the \"matplotlib\" channel.\n\n var id = msg.content.data.id;\n // Get hold of the div created by the display call when the Comm\n // socket was opened in Python.\n var element = document.getElementById(id);\n var ws_proxy = comm_websocket_adapter(comm);\n\n function ondownload(figure, _format) {\n window.open(figure.canvas.toDataURL());\n }\n\n var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n\n // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n // web socket which is closed, not our websocket->open comm proxy.\n ws_proxy.onopen();\n\n fig.parent_element = element;\n fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.one(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\nmpl.figure.prototype.handle_close = function (fig, msg) {\n var width = fig.canvas.width / fig.ratio;\n fig.cell_info[0].output_area.element.off(\n 'cleared',\n fig._remove_fig_handler\n );\n\n // Update the output cell to use the data from the current canvas.\n fig.push_to_output();\n var dataURL = fig.canvas.toDataURL();\n // Re-enable the keyboard manager in IPython - without this line, in FF,\n // the notebook keyboard shortcuts fail.\n IPython.keyboard_manager.enable();\n fig.parent_element.innerHTML =\n '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.figure.prototype.push_to_output = function (_remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width / this.ratio;\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] =\n '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message('ack', {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () {\n fig.push_to_output();\n }, 1000);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'btn-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n var button;\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n continue;\n }\n\n button = fig.buttons[name] = document.createElement('button');\n button.classList = 'btn btn-default';\n button.href = '#';\n button.title = name;\n button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\nmpl.figure.prototype._remove_fig_handler = function (event) {\n var fig = event.data.fig;\n fig.close_ws(fig, {});\n};\n\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.figure.prototype._canvas_extra_style = function (el) {\n // this is important to make the div 'focusable\n el.setAttribute('tabindex', 0);\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n } else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n};\n\nmpl.figure.prototype._key_event_extra = function (event, _name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager) {\n manager = IPython.keyboard_manager;\n }\n\n // Check for shift+enter\n if (event.shiftKey && event.which === 13) {\n this.canvas_div.blur();\n // select the cell after this one\n var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n IPython.notebook.select(index + 1);\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.find_output_cell = function (html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i = 0; i < ncells; i++) {\n var cell = cells[i];\n if (cell.cell_type === 'code') {\n for (var j = 0; j < cell.output_area.outputs.length; j++) {\n var data = cell.output_area.outputs[j];\n if (data.data) {\n // IPython >= 3 moved mimebundle to data attribute of output\n data = data.data;\n }\n if (data['text/html'] === html_output) {\n return [cell, data, j];\n }\n }\n }\n }\n};\n\n// Register the function which deals with the matplotlib target/channel.\n// The kernel may be null if the page has been refreshed.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n" | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": "<IPython.core.display.HTML object>", | |
"text/html": "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+gAAAPoCAYAAABNo9TkAAAgAElEQVR4XuydB7QeVdWGzyUhhKZICz1IKFICgYROaBJAKQpIrwqIitIEsSs2EEQCypJuFAENEJogTZEmJVJDE6QEpAQQQYoRCPnXGbn5b8u9M983++x9Zj/fWq6lZObsvZ/3ZTxvzlc6Zs6cOTPwggAEIAABCEAAAhCAAAQgAAEIQECVQAcBXZU/xSEAAQhAAAIQgAAEIAABCEAAAgUBAjpGgAAEIAABCEAAAhCAAAQgAAEIGCBAQDcgAi1AAAIQgAAEIAABCEAAAhCAAAQI6HgAAhCAAAQgAAEIQAACEIAABCBggAAB3YAItAABCEAAAhCAAAQgAAEIQAACECCg4wEIQAACEIAABCAAAQhAAAIQgIABAgR0AyLQAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAgYIENANiEALEIAABCAAAQhAAAIQgAAEIAABAjoegAAEIAABCEAAAhCAAAQgAAEIGCBAQDcgAi1AAAIQgAAEIAABCEAAAhCAAAQI6HgAAhCAAAQgAAEIQAACEIAABCBggAAB3YAItAABCEAAAhCAAAQgAAEIQAACECCg4wEIQAACEIAABCAAAQhAAAIQgIABAgR0AyLQAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAgYIENANiEALEIAABCAAAQhAAAIQgAAEIAABAjoegAAEIAABCEAAAhCAAAQgAAEIGCBAQDcgAi1AAAIQgAAEIAABCEAAAhCAAAQI6HgAAhCAAAQgAAEIQAACEIAABCBggAAB3YAItAABCEAAAhCAAAQgAAEIQAACECCg4wEIQAACEIAABCAAAQhAAAIQgIABAgR0AyLQAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAgYIENANiEALEIAABCAAAQhAAAIQgAAEIAABAjoegAAEIAABCEAAAhCAAAQgAAEIGCBAQDcgAi1AAAIQgAAEIAABCEAAAhCAAAQI6HgAAhCAAAQgAAEIQAACEIAABCBggAAB3YAItAABCEAAAhCAAAQgAAEIQAACECCg4wEIQAACEIAABCAAAQhAAAIQgIABAgR0AyLQAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAgYIENANiEALEIAABCAAAQhAAAIQgAAEIAABAjoegAAEIAABCEAAAhCAAAQgAAEIGCBAQDcgAi1AAAIQgAAEIAABCEAAAhCAAAQI6HgAAhCAAAQgAAEIQAACEIAABCBggAAB3YAItAABCEAAAhCAAAQgAAEIQAACECCg4wEIQAACEIAABCAAAQhAAAIQgIABAgR0AyLQAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAgYIENANiEALEIAABCAAAQhAAAIQgAAEIAABAjoegAAEIAABCEAAAhCAAAQgAAEIGCBAQDcgAi1AAAIQgAAEIAABCEAAAhCAAAQI6HgAAhCAAAQgAAEIQAACEIAABCBggAAB3YAItAABCEAAAhCAAAQgAAEIQAACECCg4wEIQAACEIAABCAAAQhAAAIQgIABAgR0AyLQAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAgYIENANiEALEIAABCAAAQhAAAIQgAAEIAABAjoegAAEIAABCEAAAhCAAAQgAAEIGCBAQDcgAi1AAAIQgAAEIAABCEAAAhCAAAQI6HgAAhCAAAQgAAEIQAACEIAABCBggAAB3YAItAABCEAAAhCAAAQgAAEIQAACECCg4wEIQAACEIAABCAAAQhAAAIQgIABAgR0AyLQAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAgYIENANiEALEIAABCAAAQhAAAIQgAAEIAABAjoegAAEIAABCEAAAhCAAAQgAAEIGCBAQDcgAi1AAAIQgAAEIAABCEAAAhCAAAQI6HgAAhCAAAQgAAEIQAACEIAABCBggAAB3YAItAABCEAAAhCAAAQgAAEIQAACECCg4wEIQAACEIAABCAAAQhAAAIQgIABAgR0AyLQAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAgYIENANiEALEIAABCAAAQhAAAIQgAAEIAABAjoegAAEIAABCEAAAhCAAAQgAAEIGCBAQDcgAi1AAAIQgAAEIAABCEAAAhCAAAQI6HgAAhCAAAQgAAEIQAACEIAABCBggAAB3YAItAABCEAAAhCAAAQgAAEIQAACECCg4wEIQAACEIAABCAAAQhAAAIQgIABAgR0AyLQAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAgYIENANiEALEIAABCAAAQhAAAIQgAAEIAABAjoegAAEIAABCEAAAhCAAAQgAAEIGCBAQDcgAi1AAAIQgAAEIAABCEAAAhCAAAQI6HgAAhCAAAQgAAEIQAACEIAABCBggAAB3YAItAABCEAAAhCAAAQgAAEIQAACECCg4wEIQAACEIAABCAAAQhAAAIQgIABAgR0AyLQAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAgYIENANiEALEIAABCAAAQhAAAIQgAAEIAABAjoegAAEIAABCEAAAhCAAAQgAAEIGCBAQDcgAi1AAAIQgAAEIAABCEAAAhCAAAQI6HgAAhCAAAQgAAEIQAACEIAABCBggAAB3YAItAABCEAAAhCAAAQgAAEIQAACECCg4wEIQAACEIAABCAAAQhAAAIQgIABAgR0AyLQAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAgYIENANiEALEIAABCAAAQhAAAIQgAAEIAABAjoegAAEIAABCEAAAhCAAAQgAAEIGCBAQDcgAi1AAAIQgAAEIAABCEAAAhCAAAQI6HgAAhCAAAQgAAEIQAACEIAABCBggAAB3YAItAABCEAAAhCAAAQgAAEIQAACECCg4wEIQAACEIAABCAAAQhAAAIQgIABAgR0AyLQAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAgYIENANiEALEIAABCAAAQhAAAIQgAAEIAABAjoegAAEIAABCEAAAhCAAAQgAAEIGCBAQDcgAi1AAAIQgAAEIAABCEAAAhCAAAQI6HgAAhCAAAQgAAEIQAACEIAABCBggAAB3YAItAABCEAAAhCAAAQgAAEIQAACECCg4wEIQAACEIAABCAAAQhAAAIQgIABAgR0AyLQAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAgYIENANiEALEIAABCAAAQhAAAIQgAAEIAABAjoegAAEIAABCEAAAhCAAAQgAAEIGCBAQDcgAi1AAAIQgAAEIAABCEAAAhCAAAQI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EsBrMUGxW9UE8FrVCBkgJgG8FhMUu1VNgIBeNUIrAxDQrWDVOSgBXacutruqFNDr1z/11FNlzJgx0rx589StsbhIjY4DExLAawmBsXtqAngtNToOTEgAryUExu6pCRDQU6OzeiAB3SpeXYMT0HXpkVc3tQP697//fTnjjDPWlV67dq188sknMnHiRLn22mvl448/jj675JJL5LLLLkvdIouL1Og4MCEBvJYQGLunJoDXUqPjwIQE8FpCYOyemgABPTU6qwcS0K3i1TU4AV2XHnl1Uzugjx49Wi699NKypd944w3Zc889xSwMNtxwQ1m4cKG0bNkyVZssLlJh46AUBPBaCmgckooAXkuFjYNSEMBrKaBxSCoCBPRU2KwfREC3jlhPAQK6Hi3y7CRuQDc9HXXUUXLvvfdG7b3yyiuy8847p2qVxUUqbByUggBeSwGNQ1IRwGupsHFQCgJ4LQU0DklFgICeCpv1gwjo1hHrKUBA16NFnp0kCejnnXeeXH311VF7kydPln79+tVp9d1335UHHnhAzJjTp0+X+fPnR5936dJFBgwYED1k7uCDD47Owk+YMCH67KCDDpL1119/3TiLFy+W3/3ud/Lwww/LW2+9JcuXL5cOHTpI586dZdttt432P/LII6Mxy22rVq2S2267Te677z6ZNm2aLFq0SNq3by877LCDHHHEEfLf//3f0qZNmzwRU8shARayDuEHVhqvBSa4w+niNYfwAytNQNcpOAFdpy5WuiKgW8GqftAkAb32GfR58+bJpptuum5+7733nvTq1avifE888UT5/e9/L//85z8bBPQ333xTDjzwQPnwww+bHOf//u//5Mwzz2ywz8yZM+Xwww8Xczl+Y9vWW28tjzzyiJj/ZSs+ARayxddYywzxmhYlit8HXiu+xlpmSEDXokTdPgjoOnWx0hUB3QpW9YPGDejmbPbuu+8enf3ea6+9ZMqUKXXmNmPGDNlxxx1l2LBhMnTo0OiM9cYbbxw9ZO7tt9+Ozoq//vrr0TEXXnih9O/fv0FAN/e4v/jii9G97aeddpp885vfjP4IsGbNmii0m5rmzPgPf/jDBgHd/MFgt912i87amzPmp59+ehT2u3btKkuWLInO2F9//fWyYsWK6A8JL730kmy00Ubq9aHB6giwkK2OH0fHJ4DX4rNiz+oI4LXq+HF0fAIE9Pis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QwACEIAABCAAAQhAAAIQgIAOAgR0HTrQBQQgAAEIQAACEIAABCAAAQgEToCAHrgBmD4EIAABCEAAAhCAAAQgAAEI6CBAQNehA11AAAIQgAAEIAABCEAAAhCAQOAECOiBG4DpQwACEIAABCAAAQhAAAIQgIAOAgR0HTrQBQQgAAEIQAACEIAABCAAAQgEToCAHrgBmD4EIAABCEAAAhCAAAQgAAEI6CBAQNehA11AAAIQgAAEIAABCEAAAhCAQOAECOiBG4DpQwACEIAABCAAAQhAAAIQgIAOAgR0HTrQBQQgAAEIQAACEIAABCAAAQgEToCAHrgBmD4EIAABCEAAAhCAAAQgAAEI6CBAQNehA11AAAIQgAAEIAABCEAAAhCAQOAECOiBG4DpQwACEIAABCAAAQhAAAIQgIAOAgR0HTrQBQQgAAEIQAACEIAABCAAAQgEToCAHrgBmD4EIAABCEAAAhCAAAQgAAEI6CBAQNehA11AAAIQgAAEIAABCEAAAhCAQOAECOiBG4DpQwACEIAABCAAAQhAAAIQgIAOAgR0HTrQBQQgAAEIQAACEIAABCAAAQgEToCAHrgBmD4EIAABCEAAAhCAAAQgAAEI6CBAQNehA11AAAIQgAAEIAABCEAAAhCAQOAECOiBG4DpQwACEIAABCAAAQhAAAIQgIAOAgR0HTrQBQQgAAEIQAACEIAABCAAAQgEToCAHrgBmD4EIAABCEAAAhCAAAQgAAEI6CBAQNehA11AAAIQgAAEIAABCEAAAhCAQOAECOiBG4DpQwACEIAABCAAAQhAAAIQgIAOAgR0HTrQBQQgAAEIQAACEIAABCAAAQgEToCAHrgBmD4EIAABCEAAAhCAAAQgAAEI6CBAQNehA11AAAIQgAAEIAABCEAAAhCAQOAECOiBG4DpQwACEIAABCAAAQhAAAIQgIAOAgR0HTrQBQQgAAEIQAACEIAABCAAAQgEToCAHrgBmD4EIAABCEAAAhCAAAQgAFkRXMAAAAMKSURBVAEI6CBAQNehA11AAAIQgAAEIAABCEAAAhCAQOAECOiBG4DpQwACEIAABCAAAQhAAAIQgIAOAgR0HTrQBQQgAAEIQAACEIAABCAAAQgEToCAHrgBmD4EIAABCEAAAhCAAAQgAAEI6CBAQNehA11AAAIQgAAEIAABCEAAAhCAQOAECOiBG4DpQwACEIAABCAAAQhAAAIQgIAOAgR0HTrQBQQgAAEIQAACEIAABCAAAQgEToCAHrgBmD4EIAABCEAAAhCAAAQgAAEI6CBAQNehA11AAAIQgAAEIAABCEAAAhCAQOAECOiBG4DpQwACEIAABCAAAQhAAAIQgIAOAgR0HTrQBQQgAAEIQAACEIAABCAAAQgEToCAHrgBmD4EIAABCEAAAhCAAAQgAAEI6CBAQNehA11AAAIQgAAEIAABCEAAAhCAQOAECOiBG4DpQwACEIAABCAAAQhAAAIQgIAOAgR0HTrQBQQgAAEIQAACEIAABCAAAQgEToCAHrgBmD4EIAABCEAAAhCAAAQgAAEI6CBAQNehA11AAAIQgAAEIAABCEAAAhCAQOAECOiBG4DpQwACEIAABCAAAQhAAAIQgIAOAgR0HTrQBQQgAAEIQAACEIAABCAAAQgEToCAHrgBmD4EIAABCEAAAhCAAAQgAAEI6CBAQNehA11AAAIQgAAEIAABCEAAAhCAQOAECOiBG4DpQwACEIAABCAAAQhAAAIQgIAOAgR0HTrQBQQgAAEIQAACEIAABCAAAQgEToCAHrgBmD4EIAABCEAAAhCAAAQgAAEI6CBAQNehA11AAAIQgAAEIAABCEAAAhCAQOAECOiBG4DpQwACEIAABCAAAQhAAAIQgIAOAgR0HTrQBQQgAAEIQAACEIAABCAAAQgEToCAHrgBmD4EIAABCEAAAhCAAAQgAAEI6CBAQNehA11AAAIQgAAEIAABCEAAAhCAQOAECOiBG4DpQwACEIAABCAAAQhAAAIQgIAOAgR0HTrQBQQgAAEIQAACEIAABCAAAQgETuD/A0x6k5reNrOXAAAAAElFTkSuQmCC\" width=\"500\">" | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "stream", | |
"text": "End-effector: x = 1.4142135623730954 , y = 2.414213562373095\n", | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "## IK with 3x2 Pseudo-inverse Jacobian Matrix" | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2021-03-31T00:27:57.888094Z", | |
"end_time": "2021-03-31T00:27:58.107213Z" | |
}, | |
"code_folding": [], | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "# Inverse Kinematics with Jacobian Matrix\n\ndef Jacobian(L, TH): # returns 2x3 Jacobian Matrix\n # FK: x = L[0] * np.cos(TH[0]) + L[1] * np.cos(TH[0] + TH[1]) + L[2] * np.cos(TH[0] + TH[1] + TH[2])\n dx_dth1 = - L[0] * np.sin(TH[0]) - L[1] * np.sin(TH[0] + TH[1]) - L[2] * np.sin(TH[0] + TH[1] + TH[2])\n dx_dth2 = 0 - L[1] * np.sin(TH[0] + TH[1]) - L[2] * np.sin(TH[0] + TH[1] + TH[2])\n dx_dth3 = 0 - 0 - L[2] * np.sin(TH[0] + TH[1] + TH[2])\n \n # FK: y = L[0] * np.sin(TH[0]) + L[1] * np.sin(TH[0] + TH[1]) + L[2] * np.sin(TH[0] + TH[1] + TH[2])\n dy_dth1 = L[0] * np.cos(TH[0]) + L[1] * np.cos(TH[0] + TH[1]) + L[2] * np.cos(TH[0] + TH[1] + TH[2])\n dy_dth2 = 0 + L[1] * np.cos(TH[0] + TH[1]) + L[2] * np.cos(TH[0] + TH[1] + TH[2])\n dy_dth3 = 0 + 0 + L[2] * np.cos(TH[0] + TH[1] + TH[2])\n \n J = np.array([[dx_dth1, dx_dth2, dx_dth3],\n [dy_dth1, dy_dth2, dy_dth3]])\n return J\n\nTarget = np.array([2.0, 1.0]) # target vector to be specified\nL = np.array([1, 1, 1]) # lengh of each link\nTH = np.radians([45, 45, -45]) # angle of each joint\nN = len(L) # the number of links\n\nTN = norm(Target)\nif sum(L) - TN <= 0:\n Target = Target * sum(L) / TN # if not reachable to the target, the target vector will be overwritten as a reachable vector\n print('Target overwritten:', Target)\n\nscaler = 0.1 # scaler to get a smooth transition(but slower)\nloops = 0 # loop counter\nwhile True: # loops until End-Effector meets Target\n J = Jacobian(L, TH) # returns 2x3 Jacobian Matrix\n Err = Target - FK(L, TH) # error between Target vector and Current End-effector vector\n dTheta = pinv(J, rcond=1e-15) @ Err.T # Moore-Penrose Pseudo-inverse Matrix: J.T @ inv(J @ J.T)\n TH += dTheta[:, 0] * scaler # add delta thetas\n loops += 1\n\n ErrNorm = norm(Err)\n if ErrNorm < 1e-5: # if the error is very small, the loop will be terminated\n X, Y = FK(L, TH, plot=True)\n Plot(X, Y)\n print('Target : x =',Target[0], ', y =', Target[1])\n print('End-effector: x =',X[-1], ', y =', Y[-1])\n print('Error(< 1e-5):', ErrNorm)\n print('Loops:', loops)\n break\n\n if loops > 1000: # loop limit\n print('More than 1000 loops')\n break", | |
"execution_count": 31, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": "<IPython.core.display.Javascript object>", | |
"application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.get_websocket_type = function () {\n if (typeof WebSocket !== 'undefined') {\n return WebSocket;\n } else if (typeof MozWebSocket !== 'undefined') {\n return MozWebSocket;\n } else {\n alert(\n 'Your browser does not have WebSocket support. ' +\n 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n 'Firefox 4 and 5 are also supported but you ' +\n 'have to enable WebSockets in about:config.'\n );\n }\n};\n\nmpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n this.id = figure_id;\n\n this.ws = websocket;\n\n this.supports_binary = this.ws.binaryType !== undefined;\n\n if (!this.supports_binary) {\n var warnings = document.getElementById('mpl-warnings');\n if (warnings) {\n warnings.style.display = 'block';\n warnings.textContent =\n 'This browser does not support binary websocket messages. ' +\n 'Performance may be slow.';\n }\n }\n\n this.imageObj = new Image();\n\n this.context = undefined;\n this.message = undefined;\n this.canvas = undefined;\n this.rubberband_canvas = undefined;\n this.rubberband_context = undefined;\n this.format_dropdown = undefined;\n\n this.image_mode = 'full';\n\n this.root = document.createElement('div');\n this.root.setAttribute('style', 'display: inline-block');\n this._root_extra_style(this.root);\n\n parent_element.appendChild(this.root);\n\n this._init_header(this);\n this._init_canvas(this);\n this._init_toolbar(this);\n\n var fig = this;\n\n this.waiting = false;\n\n this.ws.onopen = function () {\n fig.send_message('supports_binary', { value: fig.supports_binary });\n fig.send_message('send_image_mode', {});\n if (fig.ratio !== 1) {\n fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n }\n fig.send_message('refresh', {});\n };\n\n this.imageObj.onload = function () {\n if (fig.image_mode === 'full') {\n // Full images could contain transparency (where diff images\n // almost always do), so we need to clear the canvas so that\n // there is no ghosting.\n fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n }\n fig.context.drawImage(fig.imageObj, 0, 0);\n };\n\n this.imageObj.onunload = function () {\n fig.ws.close();\n };\n\n this.ws.onmessage = this._make_on_message_function(this);\n\n this.ondownload = ondownload;\n};\n\nmpl.figure.prototype._init_header = function () {\n var titlebar = document.createElement('div');\n titlebar.classList =\n 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n var titletext = document.createElement('div');\n titletext.classList = 'ui-dialog-title';\n titletext.setAttribute(\n 'style',\n 'width: 100%; text-align: center; padding: 3px;'\n );\n titlebar.appendChild(titletext);\n this.root.appendChild(titlebar);\n this.header = titletext;\n};\n\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._init_canvas = function () {\n var fig = this;\n\n var canvas_div = (this.canvas_div = document.createElement('div'));\n canvas_div.setAttribute(\n 'style',\n 'border: 1px solid #ddd;' +\n 'box-sizing: content-box;' +\n 'clear: both;' +\n 'min-height: 1px;' +\n 'min-width: 1px;' +\n 'outline: 0;' +\n 'overflow: hidden;' +\n 'position: relative;' +\n 'resize: both;'\n );\n\n function on_keyboard_event_closure(name) {\n return function (event) {\n return fig.key_event(event, name);\n };\n }\n\n canvas_div.addEventListener(\n 'keydown',\n on_keyboard_event_closure('key_press')\n );\n canvas_div.addEventListener(\n 'keyup',\n on_keyboard_event_closure('key_release')\n );\n\n this._canvas_extra_style(canvas_div);\n this.root.appendChild(canvas_div);\n\n var canvas = (this.canvas = document.createElement('canvas'));\n canvas.classList.add('mpl-canvas');\n canvas.setAttribute('style', 'box-sizing: content-box;');\n\n this.context = canvas.getContext('2d');\n\n var backingStore =\n this.context.backingStorePixelRatio ||\n this.context.webkitBackingStorePixelRatio ||\n this.context.mozBackingStorePixelRatio ||\n this.context.msBackingStorePixelRatio ||\n this.context.oBackingStorePixelRatio ||\n this.context.backingStorePixelRatio ||\n 1;\n\n this.ratio = (window.devicePixelRatio || 1) / backingStore;\n if (this.ratio !== 1) {\n fig.send_message('set_dpi_ratio', { dpi_ratio: this.ratio });\n }\n\n var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n 'canvas'\n ));\n rubberband_canvas.setAttribute(\n 'style',\n 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n );\n\n var resizeObserver = new ResizeObserver(function (entries) {\n var nentries = entries.length;\n for (var i = 0; i < nentries; i++) {\n var entry = entries[i];\n var width, height;\n if (entry.contentBoxSize) {\n if (entry.contentBoxSize instanceof Array) {\n // Chrome 84 implements new version of spec.\n width = entry.contentBoxSize[0].inlineSize;\n height = entry.contentBoxSize[0].blockSize;\n } else {\n // Firefox implements old version of spec.\n width = entry.contentBoxSize.inlineSize;\n height = entry.contentBoxSize.blockSize;\n }\n } else {\n // Chrome <84 implements even older version of spec.\n width = entry.contentRect.width;\n height = entry.contentRect.height;\n }\n\n // Keep the size of the canvas and rubber band canvas in sync with\n // the canvas container.\n if (entry.devicePixelContentBoxSize) {\n // Chrome 84 implements new version of spec.\n canvas.setAttribute(\n 'width',\n entry.devicePixelContentBoxSize[0].inlineSize\n );\n canvas.setAttribute(\n 'height',\n entry.devicePixelContentBoxSize[0].blockSize\n );\n } else {\n canvas.setAttribute('width', width * fig.ratio);\n canvas.setAttribute('height', height * fig.ratio);\n }\n canvas.setAttribute(\n 'style',\n 'width: ' + width + 'px; height: ' + height + 'px;'\n );\n\n rubberband_canvas.setAttribute('width', width);\n rubberband_canvas.setAttribute('height', height);\n\n // And update the size in Python. We ignore the initial 0/0 size\n // that occurs as the element is placed into the DOM, which should\n // otherwise not happen due to the minimum size styling.\n if (width != 0 && height != 0) {\n fig.request_resize(width, height);\n }\n }\n });\n resizeObserver.observe(canvas_div);\n\n function on_mouse_event_closure(name) {\n return function (event) {\n return fig.mouse_event(event, name);\n };\n }\n\n rubberband_canvas.addEventListener(\n 'mousedown',\n on_mouse_event_closure('button_press')\n );\n rubberband_canvas.addEventListener(\n 'mouseup',\n on_mouse_event_closure('button_release')\n );\n // Throttle sequential mouse events to 1 every 20ms.\n rubberband_canvas.addEventListener(\n 'mousemove',\n on_mouse_event_closure('motion_notify')\n );\n\n rubberband_canvas.addEventListener(\n 'mouseenter',\n on_mouse_event_closure('figure_enter')\n );\n rubberband_canvas.addEventListener(\n 'mouseleave',\n on_mouse_event_closure('figure_leave')\n );\n\n canvas_div.addEventListener('wheel', function (event) {\n if (event.deltaY < 0) {\n event.step = 1;\n } else {\n event.step = -1;\n }\n on_mouse_event_closure('scroll')(event);\n });\n\n canvas_div.appendChild(canvas);\n canvas_div.appendChild(rubberband_canvas);\n\n this.rubberband_context = rubberband_canvas.getContext('2d');\n this.rubberband_context.strokeStyle = '#000000';\n\n this._resize_canvas = function (width, height, forward) {\n if (forward) {\n canvas_div.style.width = width + 'px';\n canvas_div.style.height = height + 'px';\n }\n };\n\n // Disable right mouse context menu.\n this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n event.preventDefault();\n return false;\n });\n\n function set_focus() {\n canvas.focus();\n canvas_div.focus();\n }\n\n window.setTimeout(set_focus, 100);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'mpl-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n continue;\n }\n\n var button = (fig.buttons[name] = document.createElement('button'));\n button.classList = 'mpl-widget';\n button.setAttribute('role', 'button');\n button.setAttribute('aria-disabled', 'false');\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n\n var icon_img = document.createElement('img');\n icon_img.src = '_images/' + image + '.png';\n icon_img.srcset = '_images/' + image + '_large.png 2x';\n icon_img.alt = tooltip;\n button.appendChild(icon_img);\n\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n var fmt_picker = document.createElement('select');\n fmt_picker.classList = 'mpl-widget';\n toolbar.appendChild(fmt_picker);\n this.format_dropdown = fmt_picker;\n\n for (var ind in mpl.extensions) {\n var fmt = mpl.extensions[ind];\n var option = document.createElement('option');\n option.selected = fmt === mpl.default_extension;\n option.innerHTML = fmt;\n fmt_picker.appendChild(option);\n }\n\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n};\n\nmpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n // which will in turn request a refresh of the image.\n this.send_message('resize', { width: x_pixels, height: y_pixels });\n};\n\nmpl.figure.prototype.send_message = function (type, properties) {\n properties['type'] = type;\n properties['figure_id'] = this.id;\n this.ws.send(JSON.stringify(properties));\n};\n\nmpl.figure.prototype.send_draw_message = function () {\n if (!this.waiting) {\n this.waiting = true;\n this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n var format_dropdown = fig.format_dropdown;\n var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n fig.ondownload(fig, format);\n};\n\nmpl.figure.prototype.handle_resize = function (fig, msg) {\n var size = msg['size'];\n if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n fig._resize_canvas(size[0], size[1], msg['forward']);\n fig.send_message('refresh', {});\n }\n};\n\nmpl.figure.prototype.handle_rubberband = function (fig, msg) {\n var x0 = msg['x0'] / fig.ratio;\n var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n var x1 = msg['x1'] / fig.ratio;\n var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n x0 = Math.floor(x0) + 0.5;\n y0 = Math.floor(y0) + 0.5;\n x1 = Math.floor(x1) + 0.5;\n y1 = Math.floor(y1) + 0.5;\n var min_x = Math.min(x0, x1);\n var min_y = Math.min(y0, y1);\n var width = Math.abs(x1 - x0);\n var height = Math.abs(y1 - y0);\n\n fig.rubberband_context.clearRect(\n 0,\n 0,\n fig.canvas.width / fig.ratio,\n fig.canvas.height / fig.ratio\n );\n\n fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n};\n\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n var cursor = msg['cursor'];\n switch (cursor) {\n case 0:\n cursor = 'pointer';\n break;\n case 1:\n cursor = 'default';\n break;\n case 2:\n cursor = 'crosshair';\n break;\n case 3:\n cursor = 'move';\n break;\n }\n fig.rubberband_canvas.style.cursor = cursor;\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n for (var key in msg) {\n if (!(key in fig.buttons)) {\n continue;\n }\n fig.buttons[key].disabled = !msg[key];\n fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n }\n};\n\nmpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n if (msg['mode'] === 'PAN') {\n fig.buttons['Pan'].classList.add('active');\n fig.buttons['Zoom'].classList.remove('active');\n } else if (msg['mode'] === 'ZOOM') {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.add('active');\n } else {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.remove('active');\n }\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Called whenever the canvas gets updated.\n this.send_message('ack', {});\n};\n\n// A function to construct a web socket function for onmessage handling.\n// Called in the figure constructor.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n /* FIXME: We get \"Resource interpreted as Image but\n * transferred with MIME type text/plain:\" errors on\n * Chrome. But how to set the MIME type? It doesn't seem\n * to be part of the websocket stream */\n evt.data.type = 'image/png';\n\n /* Free the memory for the previous frames */\n if (fig.imageObj.src) {\n (window.URL || window.webkitURL).revokeObjectURL(\n fig.imageObj.src\n );\n }\n\n fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n evt.data\n );\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n } else if (\n typeof evt.data === 'string' &&\n evt.data.slice(0, 21) === 'data:image/png;base64'\n ) {\n fig.imageObj.src = evt.data;\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n }\n\n var msg = JSON.parse(evt.data);\n var msg_type = msg['type'];\n\n // Call the \"handle_{type}\" callback, which takes\n // the figure and JSON message as its only arguments.\n try {\n var callback = fig['handle_' + msg_type];\n } catch (e) {\n console.log(\n \"No handler for the '\" + msg_type + \"' message type: \",\n msg\n );\n return;\n }\n\n if (callback) {\n try {\n // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n callback(fig, msg);\n } catch (e) {\n console.log(\n \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n e,\n e.stack,\n msg\n );\n }\n }\n };\n};\n\n// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.findpos = function (e) {\n //this section is from http://www.quirksmode.org/js/events_properties.html\n var targ;\n if (!e) {\n e = window.event;\n }\n if (e.target) {\n targ = e.target;\n } else if (e.srcElement) {\n targ = e.srcElement;\n }\n if (targ.nodeType === 3) {\n // defeat Safari bug\n targ = targ.parentNode;\n }\n\n // pageX,Y are the mouse positions relative to the document\n var boundingRect = targ.getBoundingClientRect();\n var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n\n return { x: x, y: y };\n};\n\n/*\n * return a copy of an object with only non-object keys\n * we need this to avoid circular references\n * http://stackoverflow.com/a/24161582/3208463\n */\nfunction simpleKeys(original) {\n return Object.keys(original).reduce(function (obj, key) {\n if (typeof original[key] !== 'object') {\n obj[key] = original[key];\n }\n return obj;\n }, {});\n}\n\nmpl.figure.prototype.mouse_event = function (event, name) {\n var canvas_pos = mpl.findpos(event);\n\n if (name === 'button_press') {\n this.canvas.focus();\n this.canvas_div.focus();\n }\n\n var x = canvas_pos.x * this.ratio;\n var y = canvas_pos.y * this.ratio;\n\n this.send_message(name, {\n x: x,\n y: y,\n button: event.button,\n step: event.step,\n guiEvent: simpleKeys(event),\n });\n\n /* This prevents the web browser from automatically changing to\n * the text insertion cursor when the button is pressed. We want\n * to control all of the cursor setting manually through the\n * 'cursor' event from matplotlib */\n event.preventDefault();\n return false;\n};\n\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.which === this._key) {\n return;\n } else {\n this._key = event.which;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.which !== 17) {\n value += 'ctrl+';\n }\n if (event.altKey && event.which !== 18) {\n value += 'alt+';\n }\n if (event.shiftKey && event.which !== 16) {\n value += 'shift+';\n }\n\n value += 'k';\n value += event.which.toString();\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.figure.prototype.toolbar_button_onclick = function (name) {\n if (name === 'download') {\n this.handle_save(this, null);\n } else {\n this.send_message('toolbar_button', { name: name });\n }\n};\n\nmpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n this.message.textContent = tooltip;\n};\nmpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar comm_websocket_adapter = function (comm) {\n // Create a \"websocket\"-like object which calls the given IPython comm\n // object with the appropriate methods. Currently this is a non binary\n // socket, so there is still some room for performance tuning.\n var ws = {};\n\n ws.close = function () {\n comm.close();\n };\n ws.send = function (m) {\n //console.log('sending', m);\n comm.send(m);\n };\n // Register the callback with on_msg.\n comm.on_msg(function (msg) {\n //console.log('receiving', msg['content']['data'], msg);\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(msg['content']['data']);\n });\n return ws;\n};\n\nmpl.mpl_figure_comm = function (comm, msg) {\n // This is the function which gets called when the mpl process\n // starts-up an IPython Comm through the \"matplotlib\" channel.\n\n var id = msg.content.data.id;\n // Get hold of the div created by the display call when the Comm\n // socket was opened in Python.\n var element = document.getElementById(id);\n var ws_proxy = comm_websocket_adapter(comm);\n\n function ondownload(figure, _format) {\n window.open(figure.canvas.toDataURL());\n }\n\n var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n\n // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n // web socket which is closed, not our websocket->open comm proxy.\n ws_proxy.onopen();\n\n fig.parent_element = element;\n fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.one(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\nmpl.figure.prototype.handle_close = function (fig, msg) {\n var width = fig.canvas.width / fig.ratio;\n fig.cell_info[0].output_area.element.off(\n 'cleared',\n fig._remove_fig_handler\n );\n\n // Update the output cell to use the data from the current canvas.\n fig.push_to_output();\n var dataURL = fig.canvas.toDataURL();\n // Re-enable the keyboard manager in IPython - without this line, in FF,\n // the notebook keyboard shortcuts fail.\n IPython.keyboard_manager.enable();\n fig.parent_element.innerHTML =\n '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.figure.prototype.push_to_output = function (_remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width / this.ratio;\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] =\n '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message('ack', {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () {\n fig.push_to_output();\n }, 1000);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'btn-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n var button;\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n continue;\n }\n\n button = fig.buttons[name] = document.createElement('button');\n button.classList = 'btn btn-default';\n button.href = '#';\n button.title = name;\n button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\nmpl.figure.prototype._remove_fig_handler = function (event) {\n var fig = event.data.fig;\n fig.close_ws(fig, {});\n};\n\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.figure.prototype._canvas_extra_style = function (el) {\n // this is important to make the div 'focusable\n el.setAttribute('tabindex', 0);\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n } else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n};\n\nmpl.figure.prototype._key_event_extra = function (event, _name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager) {\n manager = IPython.keyboard_manager;\n }\n\n // Check for shift+enter\n if (event.shiftKey && event.which === 13) {\n this.canvas_div.blur();\n // select the cell after this one\n var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n IPython.notebook.select(index + 1);\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.find_output_cell = function (html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i = 0; i < ncells; i++) {\n var cell = cells[i];\n if (cell.cell_type === 'code') {\n for (var j = 0; j < cell.output_area.outputs.length; j++) {\n var data = cell.output_area.outputs[j];\n if (data.data) {\n // IPython >= 3 moved mimebundle to data attribute of output\n data = data.data;\n }\n if (data['text/html'] === html_output) {\n return [cell, data, j];\n }\n }\n }\n }\n};\n\n// Register the function which deals with the matplotlib target/channel.\n// The kernel may be null if the page has been refreshed.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n" | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": "<IPython.core.display.HTML object>", | |
"text/html": "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+gAAAPoCAYAAABNo9TkAAAgAElEQVR4XuydB7RdZZmG//SQhBrSQw0tgUCA0Alt6CQgoKL0EZRxbMCAqCjFpYA4KDjqWBCjDDiDSEdpM3QRIqEXUUqAdAKEhBBCyqx/Y643yb333HPu+fb73fM9Zy3XGif7fOV5X/B/c87Zu8uyZcuWJV4QgAAEIAABCEAAAhCAAAQgAAEISAl0IaBL+dMcAhCAAAQgAAEIQAACEIAABCBQECCgYwQIQAACEIAABCAAAQhAAAIQgIADAgR0ByIwAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAg4IENAdiMAIEIAABCAAAQhAAAIQgAAEIAABAjoegAAEIAABCEAAAhCAAAQgAAEIOCBAQHcgAiNAAAIQgAAEIAABCEAAAhCAAAQI6HgAAhCAAAQgAAEIQAACEIAABCDggAAB3YEIjAABCEAAAhCAAAQgAAEIQAACECCg4wEIQAACEIAABCAAAQhAAAIQgIADAgR0ByIwAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAg4IENAdiMAIEIAABCAAAQhAAAIQgAAEIAABAjoegAAEIAABCEAAAhCAAAQgAAEIOCBAQHcgAiNAAAIQgAAEIAABCEAAAhCAAAQI6HgAAhCAAAQgAAEIQAACEIAABCDggAAB3YEIjAABCEAAAhCAAAQgAAEIQAACECCg4wEIQAACEIAABCAAAQhAAAIQgIADAgR0ByIwAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAg4IENAdiMAIEIAABCAAAQhAAAIQgAAEIAABAjoegAAEIAABCEAAAhCAAAQgAAEIOCBAQHcgAiNAAAIQgAAEIAABCEAAAhCAAAQI6HgAAhCAAAQgAAEIQAACEIAABCDggAAB3YEIjAABCEAAAhCAAAQgAAEIQAACECCg4wEIQAACEIAABCAAAQhAAAIQgIADAgR0ByIwAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAg4IENAdiMAIEIAABCAAAQhAAAIQgAAEIAABAjoegAAEIAABCEAAAhCAAAQgAAEIOCBAQHcgAiNAAAIQgAAEIAABCEAAAhCAAAQI6HgAAhCAAAQgAAEIQAACEIAABCDggAAB3YEIjAABCEAAAhCAAAQgAAEIQAACECCg4wEIQAACEIAABCAAAQhAAAIQgIADAgR0ByIwAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAg4IENAdiMAIEIAABCAAAQhAAAIQgAAEIAABAjoegAAEIAABCEAAAhCAAAQgAAEIOCBAQHcgAiNAAAIQgAAEIAABCEAAAhCAAAQI6HgAAhCAAAQgAAEIQAACEIAABCDggAAB3YEIjAABCEAAAhCAAAQgAAEIQAACECCg4wEIQAACEIAABCAAAQhAAAIQgIADAgR0ByIwAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAg4IENAdiMAIEIAABCAAAQhAAAIQgAAEIAABAjoegAAEIAABCEAAAhCAAAQgAAEIOCBAQHcgAiNAAAIQgAAEIAABCEAAAhCAAAQI6HgAAhCAAAQgAAEIQAACEIAABCDggAAB3YEIjAABCEAAAhCAAAQgAAEIQAACECCg4wEIQAACEIAABCAAAQhAAAIQgIADAgR0ByIwAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAg4IENAdiMAIEIAABCAAAQhAAAIQgAAEIAABAjoegAAEIAABCEAAAhCAAAQgAAEIOCBAQHcgAiNAAAIQgAAEIAABCEAAAhCAAAQI6HgAAhCAAAQgAAEIQAACEIAABCDggAAB3YEIjAABCEAAAhCAAAQgAAEIQAACECCg4wEIQAACEIAABCAAAQhAAAIQgIADAgR0ByIwAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAg4IENAdiMAIEIAABCAAAQhAAAIQgAAEIAABAjoegAAEIAABCEAAAhCAAAQgAAEIOCBAQHcgAiNAAAIQgAAEIAABCEAAAhCAAAQI6HgAAhCAAAQgAAEIQAACEIAABCDggAAB3YEIjAABCEAAAhCAAAQgAAEIQAACECCg4wEIQAACEIAABCAAAQhAAAIQgIADAgR0ByIwAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAg4IENAdiMAIEIAABCAAAQhAAAIQgAAEIAABAjoegAAEIAABCEAAAhCAAAQgAAEIOCBAQHcgAiNAAAIQgAAEIAABCEAAAhCAAAQI6HgAAhCAAAQgAAEIQAACEIAABCDggAAB3YEIjAABCEAAAhCAAAQgAAEIQAACECCg4wEIQAACEIAABCAAAQhAAAIQgIADAgR0ByIwAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAg4IENAdiMAIEIAABCAAAQhAAAIQgAAEIAABAjoegAAEIAABCEAAAhCAAAQgAAEIOCBAQHcgAiNAAAIQgAAEIAABCEAAAhCAAAQI6HgAAhCAAAQgAAEIQAACEIAABCDggAAB3YEIjAABCEAAAhCAAAQgAAEIQAACECCg4wEIQAACEIAABCAAAQhAAAIQgIADAgR0ByIwAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAg4IENAdiMAIEIAABCAAAQhAAAIQgAAEIAABAjoegAAEIAABCEAAAhCAAAQgAAEIOCBAQHcgAiNAAAIQgAAEIAABCEAAAhCAAAQI6HgAAhCAAAQgAAEIQAACEIAABCDggAAB3YEIjAABCEAAAhCAAAQgAAEIQAACECCg4wEIQAACEIAABCAAAQhAAAIQgIADAgR0ByIwAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAg4IENAdiMAIEIAABCAAAQhAAAIQgAAEIAABAjoegAAEIAABCEAAAhCAAAQgAAEIOCBAQHcgAiNAAAIQgAAEIAABCEAAAhCAAAQI6HgAAhCAAAQgAAEIQAACEIAABCDggAAB3YEIjAABCEAAAhCAAAQgAAEIQAACECCg4wEIQAACEIAABCAAAQhAAAIQgIADAgR0ByIwAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAg4IENAdiMAIEIAABCAAAQhAAAIQgAAEIAABAjoegAAEIAABCEAAAhCAAAQgAAEIOCBAQHcgAiNAAAIQgAAEIAABCEAAAhCAAAQI6HgAAhCAAAQgAAEIQAACEIAABCDggAAB3YEIjAABCEAAAhCAAAQgAAEIQAACECCg4wEIQAACEIAABCAAAQhAAAIQgIADAgR0ByIwAgQgAAEIQAACEIAABCAAAQhAgICOByAAAQhAAAIQgAAEIAABCEAAAg4IENAdiMAIEIAABCAAAQhAAAIQgAAEIAABAroDD3z5y19O3/3ud5smufvuu9Nee+3lYDJGgAAEIAABCEAAAhCAAAQgAIGyCBDQyyLdSp8nnngijR07Ni1evJiALtaC9hCAAAQgAAEIQAACEIAABJQECOhC+kuXLk0777xzmjRpUho4cGCaNWtWMQ2foAtFoTUEIAABCEAAAhCAAAQgAAERAQK6CHxue+mll6bTTjstbbHFFunwww9PF154IQFdqAetIQABCEAAAhCAAAQgAAEIKAkQ0EX0X3vttTRq1Kg0f/784hPze+65J51//vkEdJEetIUABCAAAQhAAAIQgAAEIKAmQEAXKTBhwoR0yy23pBNOOCFNnDgxnXfeeQR0kRa0hQAEIAABCEAAAhCAAAQg4IEAAV2gwjXXXJOOOuqotM4666Tnn38+DRgwgIAu0IGWEIAABCAAAQhAAAIQgAAEPBEgoJesxttvv51GjhyZZsyYkX7+85+nk08+uZiAT9BLFoJ2EIAABCAAAQhAAAIQgAAEnBEgoJcsyGc+85kimO+6667pgQceSF26dKlbQH/99dfb3GbhwoXFJ/aDBg0qPrXv3r17ydvTDgIQgAAEIAABCEAAAhDwQCA/5nn27NnFKKNHj069e/f2MFb4GQjoJVogB/I99tgjdevWLU2ePLn4B2H5qx6foC8P+yWuRCsIQAACEIAABCAAAQhAoJMTeOSRR9IOO+zQybdojPEJ6CXpuGjRojRmzJj03HPPpTPPPDNdfPHFK3QmoJckBG0gAAEIQAACEIAABCAAgRUIEND9GIKAXpIWywP4+uuvn5599tnUt2/fugf0Sl9xz492y1+tz68777wzbbDBBiVtT5toBN5///308MMPF2vvtNNOqVevXtEQsG9JBPBaSaBpk/AaJiiLAF4rizR9pkyZkvbbb78CxMsvv5w23HBDoDggQEAvQYT8u+9tttkm5U/Rb7zxxnTooYeu0rUen6BXWiUH+PXWW6+47IUXXkibbrpppbfw5xCoicB7772X7rjjjuK9+++/f1pttdVqqsObIFCJAF6rRIg/rxcBvFYvktSpRACvVSLEn9eLwF//+te02WabFeXyB3nDhw+vV2nqdIAAAb0D8Nr71lNOOSX97Gc/SxtvvHH69re/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\" width=\"500\">" | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "stream", | |
"text": "Target : x = 2.0 , y = 1.0\nEnd-effector: x = 1.999996388160604 , y = 1.0000075263118693\nError(< 1e-5): 9.275665366346972e-06\nLoops: 115\n", | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"start_time": "2021-03-31T00:27:58.114629Z", | |
"end_time": "2021-03-31T00:27:58.242476Z" | |
}, | |
"code_folding": [], | |
"trusted": true | |
}, | |
"cell_type": "code", | |
"source": "# Interactive Mode: Arm follows Mouse (IK)\n\nscaler = 0.5\n\ndef motion(event):\n global TH\n mx = event.xdata\n my = event.ydata\n Mouse.set_data(mx, my)\n \n Target = np.array([mx, my])\n TN = norm(Target)\n if sum(L) - TN < 0:\n Target = Target * sum(L) / TN\n \n Err = Target - FK(L, TH) # error between Target vector and current End-effector vector\n J = Jacobian(L, TH) # Jacobian Matrix\n Jpinv = pinv(J, rcond=1e-15) # Pseudo-inverse Jacobian Matrix: JT·inv(J·JT)\n dTheta = Jpinv @ Err.T * scaler # theta derivartives for the next motion\n TH += dTheta[:, 0]\n \n X, Y = FK(L, TH, plot=True)\n Line.set_data(X, Y)\n Dot.set_data(X, Y)\n plt.draw()\n\nfig = plt.figure(figsize=(5,5))\nax = fig.add_subplot(111)\nax.axis([-1,N,-1,N])\nax.grid()\n\nLine, = ax.plot([],[], linestyle='-', color='tab:blue')\nDot, = ax.plot([],[], marker='o', color='tab:blue')\nMouse, = ax.plot([],[], marker='x', ms=20, color='red')\n\nplt.connect('motion_notify_event', motion) #'axes_enter_event' 'motion_notify_event'\nplt.show()", | |
"execution_count": 32, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": "<IPython.core.display.Javascript object>", | |
"application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.get_websocket_type = function () {\n if (typeof WebSocket !== 'undefined') {\n return WebSocket;\n } else if (typeof MozWebSocket !== 'undefined') {\n return MozWebSocket;\n } else {\n alert(\n 'Your browser does not have WebSocket support. ' +\n 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n 'Firefox 4 and 5 are also supported but you ' +\n 'have to enable WebSockets in about:config.'\n );\n }\n};\n\nmpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n this.id = figure_id;\n\n this.ws = websocket;\n\n this.supports_binary = this.ws.binaryType !== undefined;\n\n if (!this.supports_binary) {\n var warnings = document.getElementById('mpl-warnings');\n if (warnings) {\n warnings.style.display = 'block';\n warnings.textContent =\n 'This browser does not support binary websocket messages. ' +\n 'Performance may be slow.';\n }\n }\n\n this.imageObj = new Image();\n\n this.context = undefined;\n this.message = undefined;\n this.canvas = undefined;\n this.rubberband_canvas = undefined;\n this.rubberband_context = undefined;\n this.format_dropdown = undefined;\n\n this.image_mode = 'full';\n\n this.root = document.createElement('div');\n this.root.setAttribute('style', 'display: inline-block');\n this._root_extra_style(this.root);\n\n parent_element.appendChild(this.root);\n\n this._init_header(this);\n this._init_canvas(this);\n this._init_toolbar(this);\n\n var fig = this;\n\n this.waiting = false;\n\n this.ws.onopen = function () {\n fig.send_message('supports_binary', { value: fig.supports_binary });\n fig.send_message('send_image_mode', {});\n if (fig.ratio !== 1) {\n fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n }\n fig.send_message('refresh', {});\n };\n\n this.imageObj.onload = function () {\n if (fig.image_mode === 'full') {\n // Full images could contain transparency (where diff images\n // almost always do), so we need to clear the canvas so that\n // there is no ghosting.\n fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n }\n fig.context.drawImage(fig.imageObj, 0, 0);\n };\n\n this.imageObj.onunload = function () {\n fig.ws.close();\n };\n\n this.ws.onmessage = this._make_on_message_function(this);\n\n this.ondownload = ondownload;\n};\n\nmpl.figure.prototype._init_header = function () {\n var titlebar = document.createElement('div');\n titlebar.classList =\n 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n var titletext = document.createElement('div');\n titletext.classList = 'ui-dialog-title';\n titletext.setAttribute(\n 'style',\n 'width: 100%; text-align: center; padding: 3px;'\n );\n titlebar.appendChild(titletext);\n this.root.appendChild(titlebar);\n this.header = titletext;\n};\n\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._init_canvas = function () {\n var fig = this;\n\n var canvas_div = (this.canvas_div = document.createElement('div'));\n canvas_div.setAttribute(\n 'style',\n 'border: 1px solid #ddd;' +\n 'box-sizing: content-box;' +\n 'clear: both;' +\n 'min-height: 1px;' +\n 'min-width: 1px;' +\n 'outline: 0;' +\n 'overflow: hidden;' +\n 'position: relative;' +\n 'resize: both;'\n );\n\n function on_keyboard_event_closure(name) {\n return function (event) {\n return fig.key_event(event, name);\n };\n }\n\n canvas_div.addEventListener(\n 'keydown',\n on_keyboard_event_closure('key_press')\n );\n canvas_div.addEventListener(\n 'keyup',\n on_keyboard_event_closure('key_release')\n );\n\n this._canvas_extra_style(canvas_div);\n this.root.appendChild(canvas_div);\n\n var canvas = (this.canvas = document.createElement('canvas'));\n canvas.classList.add('mpl-canvas');\n canvas.setAttribute('style', 'box-sizing: content-box;');\n\n this.context = canvas.getContext('2d');\n\n var backingStore =\n this.context.backingStorePixelRatio ||\n this.context.webkitBackingStorePixelRatio ||\n this.context.mozBackingStorePixelRatio ||\n this.context.msBackingStorePixelRatio ||\n this.context.oBackingStorePixelRatio ||\n this.context.backingStorePixelRatio ||\n 1;\n\n this.ratio = (window.devicePixelRatio || 1) / backingStore;\n if (this.ratio !== 1) {\n fig.send_message('set_dpi_ratio', { dpi_ratio: this.ratio });\n }\n\n var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n 'canvas'\n ));\n rubberband_canvas.setAttribute(\n 'style',\n 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n );\n\n var resizeObserver = new ResizeObserver(function (entries) {\n var nentries = entries.length;\n for (var i = 0; i < nentries; i++) {\n var entry = entries[i];\n var width, height;\n if (entry.contentBoxSize) {\n if (entry.contentBoxSize instanceof Array) {\n // Chrome 84 implements new version of spec.\n width = entry.contentBoxSize[0].inlineSize;\n height = entry.contentBoxSize[0].blockSize;\n } else {\n // Firefox implements old version of spec.\n width = entry.contentBoxSize.inlineSize;\n height = entry.contentBoxSize.blockSize;\n }\n } else {\n // Chrome <84 implements even older version of spec.\n width = entry.contentRect.width;\n height = entry.contentRect.height;\n }\n\n // Keep the size of the canvas and rubber band canvas in sync with\n // the canvas container.\n if (entry.devicePixelContentBoxSize) {\n // Chrome 84 implements new version of spec.\n canvas.setAttribute(\n 'width',\n entry.devicePixelContentBoxSize[0].inlineSize\n );\n canvas.setAttribute(\n 'height',\n entry.devicePixelContentBoxSize[0].blockSize\n );\n } else {\n canvas.setAttribute('width', width * fig.ratio);\n canvas.setAttribute('height', height * fig.ratio);\n }\n canvas.setAttribute(\n 'style',\n 'width: ' + width + 'px; height: ' + height + 'px;'\n );\n\n rubberband_canvas.setAttribute('width', width);\n rubberband_canvas.setAttribute('height', height);\n\n // And update the size in Python. We ignore the initial 0/0 size\n // that occurs as the element is placed into the DOM, which should\n // otherwise not happen due to the minimum size styling.\n if (width != 0 && height != 0) {\n fig.request_resize(width, height);\n }\n }\n });\n resizeObserver.observe(canvas_div);\n\n function on_mouse_event_closure(name) {\n return function (event) {\n return fig.mouse_event(event, name);\n };\n }\n\n rubberband_canvas.addEventListener(\n 'mousedown',\n on_mouse_event_closure('button_press')\n );\n rubberband_canvas.addEventListener(\n 'mouseup',\n on_mouse_event_closure('button_release')\n );\n // Throttle sequential mouse events to 1 every 20ms.\n rubberband_canvas.addEventListener(\n 'mousemove',\n on_mouse_event_closure('motion_notify')\n );\n\n rubberband_canvas.addEventListener(\n 'mouseenter',\n on_mouse_event_closure('figure_enter')\n );\n rubberband_canvas.addEventListener(\n 'mouseleave',\n on_mouse_event_closure('figure_leave')\n );\n\n canvas_div.addEventListener('wheel', function (event) {\n if (event.deltaY < 0) {\n event.step = 1;\n } else {\n event.step = -1;\n }\n on_mouse_event_closure('scroll')(event);\n });\n\n canvas_div.appendChild(canvas);\n canvas_div.appendChild(rubberband_canvas);\n\n this.rubberband_context = rubberband_canvas.getContext('2d');\n this.rubberband_context.strokeStyle = '#000000';\n\n this._resize_canvas = function (width, height, forward) {\n if (forward) {\n canvas_div.style.width = width + 'px';\n canvas_div.style.height = height + 'px';\n }\n };\n\n // Disable right mouse context menu.\n this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n event.preventDefault();\n return false;\n });\n\n function set_focus() {\n canvas.focus();\n canvas_div.focus();\n }\n\n window.setTimeout(set_focus, 100);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'mpl-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n continue;\n }\n\n var button = (fig.buttons[name] = document.createElement('button'));\n button.classList = 'mpl-widget';\n button.setAttribute('role', 'button');\n button.setAttribute('aria-disabled', 'false');\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n\n var icon_img = document.createElement('img');\n icon_img.src = '_images/' + image + '.png';\n icon_img.srcset = '_images/' + image + '_large.png 2x';\n icon_img.alt = tooltip;\n button.appendChild(icon_img);\n\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n var fmt_picker = document.createElement('select');\n fmt_picker.classList = 'mpl-widget';\n toolbar.appendChild(fmt_picker);\n this.format_dropdown = fmt_picker;\n\n for (var ind in mpl.extensions) {\n var fmt = mpl.extensions[ind];\n var option = document.createElement('option');\n option.selected = fmt === mpl.default_extension;\n option.innerHTML = fmt;\n fmt_picker.appendChild(option);\n }\n\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n};\n\nmpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n // which will in turn request a refresh of the image.\n this.send_message('resize', { width: x_pixels, height: y_pixels });\n};\n\nmpl.figure.prototype.send_message = function (type, properties) {\n properties['type'] = type;\n properties['figure_id'] = this.id;\n this.ws.send(JSON.stringify(properties));\n};\n\nmpl.figure.prototype.send_draw_message = function () {\n if (!this.waiting) {\n this.waiting = true;\n this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n var format_dropdown = fig.format_dropdown;\n var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n fig.ondownload(fig, format);\n};\n\nmpl.figure.prototype.handle_resize = function (fig, msg) {\n var size = msg['size'];\n if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n fig._resize_canvas(size[0], size[1], msg['forward']);\n fig.send_message('refresh', {});\n }\n};\n\nmpl.figure.prototype.handle_rubberband = function (fig, msg) {\n var x0 = msg['x0'] / fig.ratio;\n var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n var x1 = msg['x1'] / fig.ratio;\n var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n x0 = Math.floor(x0) + 0.5;\n y0 = Math.floor(y0) + 0.5;\n x1 = Math.floor(x1) + 0.5;\n y1 = Math.floor(y1) + 0.5;\n var min_x = Math.min(x0, x1);\n var min_y = Math.min(y0, y1);\n var width = Math.abs(x1 - x0);\n var height = Math.abs(y1 - y0);\n\n fig.rubberband_context.clearRect(\n 0,\n 0,\n fig.canvas.width / fig.ratio,\n fig.canvas.height / fig.ratio\n );\n\n fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n};\n\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n var cursor = msg['cursor'];\n switch (cursor) {\n case 0:\n cursor = 'pointer';\n break;\n case 1:\n cursor = 'default';\n break;\n case 2:\n cursor = 'crosshair';\n break;\n case 3:\n cursor = 'move';\n break;\n }\n fig.rubberband_canvas.style.cursor = cursor;\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n for (var key in msg) {\n if (!(key in fig.buttons)) {\n continue;\n }\n fig.buttons[key].disabled = !msg[key];\n fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n }\n};\n\nmpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n if (msg['mode'] === 'PAN') {\n fig.buttons['Pan'].classList.add('active');\n fig.buttons['Zoom'].classList.remove('active');\n } else if (msg['mode'] === 'ZOOM') {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.add('active');\n } else {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.remove('active');\n }\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Called whenever the canvas gets updated.\n this.send_message('ack', {});\n};\n\n// A function to construct a web socket function for onmessage handling.\n// Called in the figure constructor.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n /* FIXME: We get \"Resource interpreted as Image but\n * transferred with MIME type text/plain:\" errors on\n * Chrome. But how to set the MIME type? It doesn't seem\n * to be part of the websocket stream */\n evt.data.type = 'image/png';\n\n /* Free the memory for the previous frames */\n if (fig.imageObj.src) {\n (window.URL || window.webkitURL).revokeObjectURL(\n fig.imageObj.src\n );\n }\n\n fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n evt.data\n );\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n } else if (\n typeof evt.data === 'string' &&\n evt.data.slice(0, 21) === 'data:image/png;base64'\n ) {\n fig.imageObj.src = evt.data;\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n }\n\n var msg = JSON.parse(evt.data);\n var msg_type = msg['type'];\n\n // Call the \"handle_{type}\" callback, which takes\n // the figure and JSON message as its only arguments.\n try {\n var callback = fig['handle_' + msg_type];\n } catch (e) {\n console.log(\n \"No handler for the '\" + msg_type + \"' message type: \",\n msg\n );\n return;\n }\n\n if (callback) {\n try {\n // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n callback(fig, msg);\n } catch (e) {\n console.log(\n \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n e,\n e.stack,\n msg\n );\n }\n }\n };\n};\n\n// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.findpos = function (e) {\n //this section is from http://www.quirksmode.org/js/events_properties.html\n var targ;\n if (!e) {\n e = window.event;\n }\n if (e.target) {\n targ = e.target;\n } else if (e.srcElement) {\n targ = e.srcElement;\n }\n if (targ.nodeType === 3) {\n // defeat Safari bug\n targ = targ.parentNode;\n }\n\n // pageX,Y are the mouse positions relative to the document\n var boundingRect = targ.getBoundingClientRect();\n var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n\n return { x: x, y: y };\n};\n\n/*\n * return a copy of an object with only non-object keys\n * we need this to avoid circular references\n * http://stackoverflow.com/a/24161582/3208463\n */\nfunction simpleKeys(original) {\n return Object.keys(original).reduce(function (obj, key) {\n if (typeof original[key] !== 'object') {\n obj[key] = original[key];\n }\n return obj;\n }, {});\n}\n\nmpl.figure.prototype.mouse_event = function (event, name) {\n var canvas_pos = mpl.findpos(event);\n\n if (name === 'button_press') {\n this.canvas.focus();\n this.canvas_div.focus();\n }\n\n var x = canvas_pos.x * this.ratio;\n var y = canvas_pos.y * this.ratio;\n\n this.send_message(name, {\n x: x,\n y: y,\n button: event.button,\n step: event.step,\n guiEvent: simpleKeys(event),\n });\n\n /* This prevents the web browser from automatically changing to\n * the text insertion cursor when the button is pressed. We want\n * to control all of the cursor setting manually through the\n * 'cursor' event from matplotlib */\n event.preventDefault();\n return false;\n};\n\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.which === this._key) {\n return;\n } else {\n this._key = event.which;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.which !== 17) {\n value += 'ctrl+';\n }\n if (event.altKey && event.which !== 18) {\n value += 'alt+';\n }\n if (event.shiftKey && event.which !== 16) {\n value += 'shift+';\n }\n\n value += 'k';\n value += event.which.toString();\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.figure.prototype.toolbar_button_onclick = function (name) {\n if (name === 'download') {\n this.handle_save(this, null);\n } else {\n this.send_message('toolbar_button', { name: name });\n }\n};\n\nmpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n this.message.textContent = tooltip;\n};\nmpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar comm_websocket_adapter = function (comm) {\n // Create a \"websocket\"-like object which calls the given IPython comm\n // object with the appropriate methods. Currently this is a non binary\n // socket, so there is still some room for performance tuning.\n var ws = {};\n\n ws.close = function () {\n comm.close();\n };\n ws.send = function (m) {\n //console.log('sending', m);\n comm.send(m);\n };\n // Register the callback with on_msg.\n comm.on_msg(function (msg) {\n //console.log('receiving', msg['content']['data'], msg);\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(msg['content']['data']);\n });\n return ws;\n};\n\nmpl.mpl_figure_comm = function (comm, msg) {\n // This is the function which gets called when the mpl process\n // starts-up an IPython Comm through the \"matplotlib\" channel.\n\n var id = msg.content.data.id;\n // Get hold of the div created by the display call when the Comm\n // socket was opened in Python.\n var element = document.getElementById(id);\n var ws_proxy = comm_websocket_adapter(comm);\n\n function ondownload(figure, _format) {\n window.open(figure.canvas.toDataURL());\n }\n\n var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n\n // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n // web socket which is closed, not our websocket->open comm proxy.\n ws_proxy.onopen();\n\n fig.parent_element = element;\n fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.one(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\nmpl.figure.prototype.handle_close = function (fig, msg) {\n var width = fig.canvas.width / fig.ratio;\n fig.cell_info[0].output_area.element.off(\n 'cleared',\n fig._remove_fig_handler\n );\n\n // Update the output cell to use the data from the current canvas.\n fig.push_to_output();\n var dataURL = fig.canvas.toDataURL();\n // Re-enable the keyboard manager in IPython - without this line, in FF,\n // the notebook keyboard shortcuts fail.\n IPython.keyboard_manager.enable();\n fig.parent_element.innerHTML =\n '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.figure.prototype.push_to_output = function (_remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width / this.ratio;\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] =\n '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message('ack', {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () {\n fig.push_to_output();\n }, 1000);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'btn-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n var button;\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n continue;\n }\n\n button = fig.buttons[name] = document.createElement('button');\n button.classList = 'btn btn-default';\n button.href = '#';\n button.title = name;\n button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\nmpl.figure.prototype._remove_fig_handler = function (event) {\n var fig = event.data.fig;\n fig.close_ws(fig, {});\n};\n\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.figure.prototype._canvas_extra_style = function (el) {\n // this is important to make the div 'focusable\n el.setAttribute('tabindex', 0);\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n } else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n};\n\nmpl.figure.prototype._key_event_extra = function (event, _name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager) {\n manager = IPython.keyboard_manager;\n }\n\n // Check for shift+enter\n if (event.shiftKey && event.which === 13) {\n this.canvas_div.blur();\n // select the cell after this one\n var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n IPython.notebook.select(index + 1);\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.find_output_cell = function (html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i = 0; i < ncells; i++) {\n var cell = cells[i];\n if (cell.cell_type === 'code') {\n for (var j = 0; j < cell.output_area.outputs.length; j++) {\n var data = cell.output_area.outputs[j];\n if (data.data) {\n // IPython >= 3 moved mimebundle to data attribute of output\n data = data.data;\n }\n if (data['text/html'] === html_output) {\n return [cell, data, j];\n }\n }\n }\n }\n};\n\n// Register the function which deals with the matplotlib target/channel.\n// The kernel may be null if the page has been refreshed.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n" | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/plain": "<IPython.core.display.HTML object>", | |
"text/html": "<img src=\"data:,\" width=\"0\">" | |
}, | |
"metadata": {} | |
} | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"name": "python3", | |
"display_name": "Python 3", | |
"language": "python" | |
}, | |
"language_info": { | |
"name": "python", | |
"version": "3.8.5", | |
"mimetype": "text/x-python", | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"pygments_lexer": "ipython3", | |
"nbconvert_exporter": "python", | |
"file_extension": ".py" | |
}, | |
"gist": { | |
"id": "", | |
"data": { | |
"description": "IK: 3-Link Arm with 3x2 Pseudo Inverse Jacobian Matrix", | |
"public": true | |
} | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment