Skip to content

Instantly share code, notes, and snippets.

@mirrornerror
Last active April 7, 2021 08:08
Show Gist options
  • Save mirrornerror/675c168e62865063929be4f8293e88d4 to your computer and use it in GitHub Desktop.
Save mirrornerror/675c168e62865063929be4f8293e88d4 to your computer and use it in GitHub Desktop.
FK_IK/Jacobian_cross_product.ipynb
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"metadata": {},
"cell_type": "markdown",
"source": "# Inverse Kinematics: \n### Homogeneous Transformation Matrix and Jacobian Matrix by cross products "
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-04-05T05:36:42.555268Z",
"end_time": "2021-04-05T05:36:42.607444Z"
},
"trusted": true
},
"cell_type": "code",
"source": "%matplotlib notebook\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom numpy.linalg import inv, pinv, norm",
"execution_count": 130,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-04-05T09:29:25.201927Z",
"end_time": "2021-04-05T09:29:25.212599Z"
},
"trusted": true,
"code_folding": []
},
"cell_type": "code",
"source": "# 4x4 homogeneous transformation matrix\ndef H(L, TH):\n return np.array([[np.cos(TH), - np.sin(TH), 0, L],\n [np.sin(TH), np.cos(TH), 0, 0],\n [ 0, 0, 1, 0],\n [ 0, 0, 0, 1]])\n\n# forward kinematics returns 3x(N+1) matrix: N-joints vectors and End-effector vector\ndef FK(L, TH):\n N = len(L)\n T = H(0, TH[0])\n V = np.zeros(3)\n for i in range(N-1):\n T = T @ H(L[i], TH[i+1])\n V = np.c_[V, T[:3, -1]]\n EE = T @ np.array([[L[-1], 0, 0, 1]]).T\n V = np.c_[V, EE[:3, -1]]\n return V\n\n# plot function\ndef Plot(V):\n fig = plt.figure(figsize=(5,5))\n ax = fig.add_subplot(111)\n n = len(V[0])\n ax.axis('equal')\n ax.axis([-1, n, -1, n])\n ax.grid()\n ax.plot(V[0], V[1])\n ax.scatter(V[0], V[1])\n ax.plot(Target[0], Target[1], marker='x', ms=20, color='red')",
"execution_count": 160,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## FK with Homogeneous transformation matrix"
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-04-07T01:23:23.268567Z",
"end_time": "2021-04-07T01:23:23.324612Z"
},
"code_folding": [],
"trusted": true
},
"cell_type": "code",
"source": "N = 3 # the number of links\nL = [1] * N # length of each link\nTH = [np.pi / 2 / N] * N # theta at each joint\n\nTarget = np.array([3, 3, 0]) # x, y, z coords\nif norm(Target) > sum(L):\n Target = Target * sum(L) / norm(Target)\n print('Target overwritten:', Target)\n\nV = FK(L, TH) # V: all-joints and End-Effector vectors\nPlot(V)\nprint('Target :', Target)\nprint('End-Effector:', V[:, -1])",
"execution_count": 190,
"outputs": [
{
"output_type": "stream",
"text": "Target overwritten: [2.12132034 2.12132034 0. ]\n",
"name": "stdout"
},
{
"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+gAAAPoCAYAAABNo9TkAAAgAElEQVR4XuzdC+xvZ13n+7UtLZtLAW1h69gKUi6jWO0ZLrZCizrSJgKJQkRRKF6qTIYjGkaDxlG8HcOQYUCiJ6DoQVFIUKvHC8FKjrGARRAlFsQUW0oqYqEwQLFWoN0n/7/2stt9Wb/fbz3P9/us72snJo5d63t5fz5dfT7z/PfeBw4fPnx48gsBBBBAAAEEEEAAAQQQQAABBEIJHBDQQ/lrjgACCCCAAAIIIIAAAggggMA+AQGdERBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkAAQQQQAABBBBAAAEEEEAAgQQEBPQEIhgBAQQQQAABBBBAAAEEEEAAAQGdBxBAAAEEEEAAAQQQQAABBBBIQEBATyCCERBAAAEEEEAAAQQQQAABBBAQ0HkA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cMEavQgcy2vCeS8F6vSZ9V1bOlQvXa+OXENvOstrQ29o+CwEBPQsShw5h4DeSZenPOUp08UXXzw9/elPn0466aS7db3hhhumxz/+8dNVV121/8/2btuX/nF3Ab2T2NpMDhdM0IvA0bwmnPeiX6vPCb9rrcJ0q7q15Btq2xN6bahtDJuZgICeUx0BPZEuf/iHfzg99alP3Z/o+c9//vTzP//zi04noC+KU7HjEHC4YI9eBO7qtU999sD0zF96+3TNDf98xAgPPf0+0+u/79zp0P0O9hpNn5UROO53rXWIbl1/ZVqNvo7/ho6u4DjzC+g5tRLQE+ny6U9/ejr11FP3J3ryk5887QX2JX8J6EvSVOt4BBwu+KMXgTt77Zzznjh916+/WzjvBb9Yn2N+13qF5159iumacV3/Dc2oyjpnEtBz6iqgJ9Ll4x//+HTaaaftT7R3k/77v//7i04noC+KU7HjEHC4YI9eBG7z2ic/M02/eu39pms/dtMRrd2c91Ji/X2O+l3rHZp791u/rCk39N/QlLKscigBPaesAnoiXX73d393etrTnrY/0Q//8A9PL3nJSxadTkBfFKdiAjoPJCCwd5D9rT+8bPqF9540feTmA8J5Ak3WOsLdQtMrXjFNP/Ijd6z74hdP0wtf2H59Ib094+AOAnqwAIXaC+g5xRbQk+hy6623Tuedd970jne8Y3+id77zndNjHvOYRacT0BfFqZiAzgMJCHzwI5+YvuX/fqtwnkCLtY9w59D0jVdeOZ384z/eP5zf1lFIX7XdBPRVy5tqOQE9lRy3DyOgJ9Fl769Z+6Ef+qH9ab75m795uvTSSzeebC+AH+/Xhz/84elxj3vc/iNXXnnldNZZZ23cwwsIzCFw88037/9NBHu/LrjggungQX8w1xxuntmMwEdu/Nfp4te8a/rgx28+4sWHnHbv6dee839MDzr1npsV9DQCxyFw23ftYZdeOj3q13/99ic/+zM/M33uv/237uzu8dKXHvH/SRA1R/fFCzT039ACIidZce+vgD777LP3p7nuuuumM844I8lktccQ0BPo/2d/9mfTN3zDN0yf+9znpgc96EHT3/zN30yHDh3aeLIDB4788c7jFXj1q189nX766Rv38AICCCCQgcDe7zk/2o+1P+jg4en/fNQt0/1PyTClGdZG4K7h/L0XXzz9/b//1rSI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\" width=\"500\">"
},
"metadata": {}
},
{
"output_type": "stream",
"text": "Target : [2.12132034 2.12132034 0. ]\nEnd-Effector: [1.41421356 2.41421356 0. ]\n",
"name": "stdout"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## IK: 3xN Jacobian matrix by cross products"
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-04-05T05:43:18.300620Z",
"end_time": "2021-04-05T05:43:18.552754Z"
},
"trusted": true,
"code_folding": []
},
"cell_type": "code",
"source": "N = 5 # the number of links\nL = [1] * N # length of each link\nTH = [np.pi / 2 / N] * N # theta at each joint\n\nTarget = np.array([2, 2, 0]) # x, y, z\nif norm(Target) > sum(L):\n Target = Target * sum(L) / norm(Target)\n print('Target overwritten')\n \ndef Jacobian(V): # returns 3xN Jacobian matrix\n UV = np.array([0, 0, 1]) # z-axis unit vector\n J = []\n for i in range(N):\n # ith_J = UV x (End_effector_vector - ith_Joint_vector)\n J.append(np.cross(UV, V[:, -1] - V[:, i]))\n return np.array(J).T\n\nscaler = 0.1\nloop = 0\n\nwhile True:\n V = FK(L, TH)\n J = Jacobian(V)\n Error = Target - V[:, -1]\n if norm(Error) < 1e-4:\n print('Error Norm :', norm(Error))\n print('Target :', Target)\n print('End-Effector:', V[:, -1])\n print('Loop:', loop)\n Plot(V)\n break\n dTheta = pinv(J) @ Error * scaler\n TH += dTheta\n loop += 1\n if loop > 1000:\n print('over 1000 loops')\n break",
"execution_count": 139,
"outputs": [
{
"output_type": "stream",
"text": "Error Norm : 9.55066477281747e-05\nTarget : [2 2 0]\nEnd-Effector: [2.00003434 2.00008912 0. ]\nLoop: 93\n",
"name": "stdout"
},
{
"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,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8URpKwK6FKe1GMvPilvWDG8ylIMVuuy/vm7FJfy2kL65C/qm4Xx2eX/Qn752sPkovDgBfu4WZ1blK3BXxcRic+BtMV6VXhPQK9n40SwE9EJerrvuunbf+953PtEhhxzSZoFd+YuArqTprcXy8/JWdcObiuQwdWZ/5vzgE85qT/vQhhUX8VlIf8/+h9/ht7hvGs5n7z758y9tf/fbT771z6TzqwQBfu5KaFjTELhbE7bRvwhvoytY8wAE9DWjG/QLCeiD4l2s+Le//e22ww47zL9odkn/27/928UKrPKagC7FaS3G8rPiljXDmwzlIIX+4cIr24tO+dy89qbh+4SnHdke/orD5v9t9pfEvfCsD9whxN/22+Hf8ytPaE/c9db/u5tf4xPg5258B2udAHdrJTfu1+FtXP7LdCegL0NvuK8loA/HduHKH/zgB9vznve8+de9+tWvbm94wxsWrnFXX0BAl+K0FmP5WXHLmuFNhnKQQr/+7i+0M86/7Pbam4b0L7zoiPa/Dz68bf3209tv/5+33/7ux/+s+ux/eMieD27/48U/N8iMFF2cAD93izOr8hW4q2JisTnwthivSq8J6JVs/GgWAnoRLz/4wQ/aE5/4xHbuuefOJzrvvPPa4x73uIWmmwXwu/p16aWXtn322Wf+5Pzzz2+77rrrQvV5PB6BjRs33v7P9O2///5t3bp14w1D524CeOtGZX943fdvbAef8Ol28w9uWdH7pZ99/4ow/p11923323jt7W9ml/W/etKtf5Hcbb+2vMcW7e9/+8lt23vdyb+Tbv/OaMjPXe5nAHeZ7vCW6W029exfmNpzzz3n38DFF1/c1q9fn/vNTGhyAnoRmbN/Zu1Vr3rVfJrDDjusnX766QtPtsifgZz9W+s77rjjwj34AghAAAJTJ7D+fae3x572jjt8m/96xBHt3374u5ymzoDvDwIQgAAEpk9g9q9IHXPMMQT0YqoJ6AWEnHnmme0Zz3hGu+mmm9oDHvCA9s///M/tgQ984MKTEdAXRsYXQAACELgDgQ9/4x7tjce+eMXlfHZJP+Uv39V+aruVF3fwQQACEIAABFIJENBrmiOgj+zlX//1X+f/3vl3vvOddq973av9/d//fTvggAPWNBW/xX1N2CK+iN8+FqHpDkPira63i664rr3w1Fv/grhNfx312fe33/mxP3N+238/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QIAAAQIECBBw0G2AAAECBAgQIECAAAECBAgMBBz0QQkiECBAgAABAgQIECBAgAABB90GCBAgQIAAAQIECBAgQIDAQMBBH5QgAgECBAgQIECAAAECBAgQcNBtgAABAgQIECBAgAABAgQIDAQc9EEJIhAgQIAAAQIECBAgQIAAAQfdBggQIECAAAECBAgQIECAwEDAQR+UIAIBAgQIECBAgAABAgQIEHDQbYAAAQIECBAgQIAAAQIECAwEHPRBCSIQIECAAAECBAgQIECAAAEH3QYIECBAgAABAgQIECBAgMBAwEEflCACAQIECBAgQIAAAQIECBBw0G2AAAECBAgQIECAAAECBAgMBBz0QQkiECBAgAABAgQIECBAgAABB90GCBAgQIAAAQIECBAgQIDAQMBBH5QgAgECBAgQIECAAAECBAgQcNBtgAABAgQIECBAgAABAgQIDAQc9EEJIhAgQIAAAQIECBAgQIAAAQfdBggQIECAAAECBAgQIECAwEDAQR+UIAIBAgQIECBAgAABAgQIEHDQbYAAAQIECBAgQIAAAQIECAwEHPRBCSIQIECAAAECBAgQIECAAAEH3QYIECBAgAABAgQIECBAgMBAwEEflCACAQIECBAgQIAAAQIECBBw0G2AAAECBAgQIECAAAECBAgMBBz0QQkiECBAgAABAgQIECBAgAABB90GCBAgQIAAAQIECBAgQIDAQMBBH5QgAgECBAgQIECAAAECBAgQcNBtgAABAgQIECBAgAABAgQIDAQc9EEJIhAgQIAAAQIECBAgQIAAAQfdBggQIECAAAECBAgQIECAwEDAQR+UIAIBAgQIECBAgAABAgQIEHDQbYAAAQIECBAgQIAAAQIECAwEHPRBCSIQIECAAAECBAgQIECAAAEH3QYIECBAgAABAgQIECBAgMBAwEEflCACAQIECBAgQIAAAQIECBBw0G2AAAECBAgQIECAAAECBAgMBBz0QQkiECBAgAABAgQIECBAgAABB90GCBAgQIAAAQIECBAgQIDAQMBBH5QgAgECBAgQIECAAAECBAgQCNukMhH66DNOAAAAAElFTkSuQmCC\" width=\"500\">"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## IK Interactive mode: Arm follows Mouse"
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-04-05T05:41:52.063382Z",
"end_time": "2021-04-05T05:41:52.129118Z"
},
"code_folding": [],
"trusted": true
},
"cell_type": "code",
"source": "N = 5 # the number of links\nL = [1] * N # length of each link\nTH = [np.pi / 2 / N] * N # theta at each joint\nscaler = 0.2\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, 0]) # target: mouse coords\n if norm(Target) > sum(L): # overwrite the target coord if not reachable\n Target = Target * sum(L) / norm(Target)\n \n V = FK(L, TH) # V: Joints vectors from Forward Kinematiks\n Line.set_data(V[0], V[1])\n Dot.set_data(V[0], V[1])\n \n Error = Target - V[:, -1] # error between Target-vector and current End-effector-vector\n J = Jacobian(V) # 3xN Jacobian Matrix\n Jpinv = pinv(J) # Pseudo-inverse Jacobian Matrix: JT·inv(J·JT)\n dTheta = Jpinv @ Error * scaler # to get delta thetas from Inverse Kinematics\n TH += dTheta # delta thetas for the next motion\n\n plt.draw()\n\nfig = plt.figure(figsize=(5,5))\nax = fig.add_subplot(111)\nax.axis('equal')\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)\nplt.show()",
"execution_count": 134,
"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": "675c168e62865063929be4f8293e88d4",
"data": {
"description": "FK_IK/Jacobian_cross_product.ipynb",
"public": true
}
},
"_draft": {
"nbviewer_url": "https://gist.github.com/675c168e62865063929be4f8293e88d4"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment