{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# ICP #\n", "This notebook is all about ICP and it's different implementations. It should be visual and self - descriptive.\n", "\n", "## Contents:\n", "* [Overview](#Overview)\n", "* [ICP based on SVD](#ICP-based-on-SVD)\n", "* [Non linear Least squares based ICP](#Non-linear-Least-squares-based-ICP)\n", "* [Using point to plane metric with Least Squares ICP](#Using-point-to-plane-metric-with-Least-Squares-ICP)\n", "* [Dealing with outliers](#Dealing-with-outliers)\n", "\n", "## Overview\n", "Having two scans $P = \\{p_i\\}$ and $Q = \\{q_i\\}$ we want to find a transformation (rotation $R$ and translation $t$) to apply to $P$ to match $Q$ as good as possible. In the remainder of this notebook we will try to define what does \"as good as possible mean\" as well as ways to find such a transformation." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sys\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from matplotlib import animation, rc\n", "from math import sin, cos, atan2, pi\n", "from IPython.display import display, Math, Latex, Markdown, HTML" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The way we will plot the data" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def plot_data(data_1, data_2, label_1, label_2, markersize_1=8, markersize_2=8):\n", " fig = plt.figure(figsize=(10, 6))\n", " ax = fig.add_subplot(111)\n", " ax.axis('equal')\n", " if data_1 is not None:\n", " x_p, y_p = data_1\n", " ax.plot(x_p, y_p, color='#336699', markersize=markersize_1, marker='o', linestyle=\":\", label=label_1)\n", " if data_2 is not None:\n", " x_q, y_q = data_2\n", " ax.plot(x_q, y_q, color='orangered', markersize=markersize_2, marker='o', linestyle=\":\", label=label_2)\n", " ax.legend()\n", " return ax\n", "\n", "def plot_values(values, label):\n", " fig = plt.figure(figsize=(10, 4))\n", " ax = fig.add_subplot(111)\n", " ax.plot(values, label=label)\n", " ax.legend()\n", " ax.grid(True)\n", " plt.show()\n", " \n", "def animate_results(P_values, Q, corresp_values, xlim, ylim):\n", " \"\"\"A function used to animate the iterative processes we use.\"\"\"\n", " fig = plt.figure(figsize=(10, 6))\n", " anim_ax = fig.add_subplot(111)\n", " anim_ax.set(xlim=xlim, ylim=ylim)\n", " anim_ax.set_aspect('equal')\n", " plt.close()\n", " x_q, y_q = Q\n", " # draw initial correspondeces\n", " corresp_lines = []\n", " for i, j in correspondences:\n", " corresp_lines.append(anim_ax.plot([], [], 'grey')[0])\n", " # Prepare Q data.\n", " Q_line, = anim_ax.plot(x_q, y_q, 'o', color='orangered')\n", " # prepare empty line for moved data\n", " P_line, = anim_ax.plot([], [], 'o', color='#336699')\n", "\n", " def animate(i):\n", " P_inc = P_values[i]\n", " x_p, y_p = P_inc\n", " P_line.set_data(x_p, y_p)\n", " draw_inc_corresp(P_inc, Q, corresp_values[i])\n", " return (P_line,)\n", " \n", " def draw_inc_corresp(points_from, points_to, correspondences):\n", " for corr_idx, (i, j) in enumerate(correspondences):\n", " x = [points_from[0, i], points_to[0, j]]\n", " y = [points_from[1, i], points_to[1, j]]\n", " corresp_lines[corr_idx].set_data(x, y)\n", " \n", " anim = animation.FuncAnimation(fig, animate,\n", " frames=len(P_values), \n", " interval=500, \n", " blit=True)\n", " return HTML(anim.to_jshtml())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Generate example data\n", "Thoughout this notebook we will be working wigh generated data that looks like this:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-04-18T23:08:42.663499\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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b+03FPxjYr611VXO+X9b4bx+946w13/44YftD3/4w3bPjxo1yq5bt85++umn9qKLLgr42pycnJavt27dao0x9q233gp4fMmSJXbKlCnWWmuvvPJK+/rrr1trrd22bZs96aST2r33/fffb6+99lprrbUVFRU2MzPTrlmzxvm2du+21lrb0NBgx44daysqKqy11h5zzDG2qqqq5T2CndcZ7f68rLWSym2QnIaGnABc6eyRxyQ6BCA6Nbs7d7yDjjzySL344osRnXvMMcfo9NNPD3veK6+8oo0bN7Y8rqmpUW1t7SEjWKtXr9YNN9wgSRo5cqRGjhzZcmzx4sWaO3euGhoatGPHDm3cuPGQ49Ge15VIpAC40u6aOm3/fK9GHDcg0aEAh7rvrwe/7pZ18PETP3JqooLp3U/K63/o6w87IuzlCgoKtHTp0kOeq6mp0WeffaYTTzwx4rAlKScn55DHxpiWr73eg1OSTU1Nevvtt+XxRN+/bevWrbrvvvu0Zs0a9e3bV1OnTj3kvaM9r6tRIwXAdeq8Pt36xCu6ds7zGjN9rs6fuUBPrChXndeX6NCA4C75vpQdJPHI9kiXzOjQ25533nmqq6vTggULJEmNjY2aOXOmrr/+evXo0SPka7OysuTzBf93M2DAAG3atElNTU1atmxZy/PFxcX69a9/3fJ4/fr17V57zjnn6Nlnn5UkbdiwQe+9954kJ8nLyclRXl6edu7cqT//+c8tr+nVq5f27t0b9rx4IpEC4Cp1Xp+mzlmu9z/eJUmykqprvZpfVqGpc5aTTCF5TbpJGnh8+2Qq2+M8P+mmDr2tMUbLli3T0qVLNXToUPXr108ZGRn6yU9+Iknavn27Lr744oCvnTZtmkaOHKmrr7464PG7775bl1xyib72ta9p4MCBLc//6le/Unl5uUaOHKmCggI9/vjj7V47Y8YM1dbWatiwYfrZz36mU089VZJUWFioU045RSeddJKuuuoqnXnmmYfEc+GFF+rcc88NeV48GaeGKr6KiopsuF4RANART6wo1/yyioAbGGdnZWpKcSEbFyOuNm3apGHDhkV28v5aZ3Xeysecmqje/ZyRqEk3ST1yw78+An/729905ZVXatmyZRo9enRM3tNNAv15GWPWWmsD/uCgRgqAqyxZtTFgEiVJ9b5GLV21kUQKyatHrjTlDueji3zta1/T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\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "# initialize pertrubation rotation\n", "angle = pi / 4\n", "R_true = np.array([[cos(angle), -sin(angle)], \n", " [sin(angle), cos(angle)]])\n", "t_true = np.array([[-2], [5]])\n", "\n", "# Generate data as a list of 2d points\n", "num_points = 30\n", "true_data = np.zeros((2, num_points))\n", "true_data[0, :] = range(0, num_points)\n", "true_data[1, :] = 0.2 * true_data[0, :] * np.sin(0.5 * true_data[0, :]) \n", "# Move the data\n", "moved_data = R_true.dot(true_data) + t_true\n", "\n", "# Assign to variables we use in formulas.\n", "Q = true_data\n", "P = moved_data\n", "\n", "plot_data(moved_data, true_data, \"P: moved data\", \"Q: true data\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Correspondences computation\n", "We compute correspondences from $P$ to $Q$, i.e. for every $p_i$ we search the closest $q_j$ to it." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def get_correspondence_indices(P, Q):\n", " \"\"\"For each point in P find closest one in Q.\"\"\"\n", " p_size = P.shape[1]\n", " q_size = Q.shape[1]\n", " correspondences = []\n", " for i in range(p_size):\n", " p_point = P[:, i]\n", " min_dist = sys.maxsize\n", " chosen_idx = -1\n", " for j in range(q_size):\n", " q_point = Q[:, j]\n", " dist = np.linalg.norm(q_point - p_point)\n", " if dist < min_dist:\n", " min_dist = dist\n", " chosen_idx = j\n", " correspondences.append((i, chosen_idx))\n", " return correspondences\n", "\n", "def draw_correspondeces(P, Q, correspondences, ax):\n", " label_added = False\n", " for i, j in correspondences:\n", " x = [P[0, i], Q[0, j]]\n", " y = [P[1, i], Q[1, j]]\n", " if not label_added:\n", " ax.plot(x, y, color='grey', label='correpondences')\n", " label_added = True\n", " else:\n", " ax.plot(x, y, color='grey')\n", " ax.legend()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ICP based on SVD\n", "\n", "Tldr version. If the scans would match exactly, their cross-covariance would be identity. Therefore, we can iteratively optimize their cross-covariance to be as close as possible to an identity matrix by applying transformations to $P$. Let's dive into details. \n", "\n", "### Single iteration\n", "In a single iteration we assume that the correspondences are known. We can compute the cross-covariance between the corresponding points. Let $C = \\{\\{i,j\\}:p_i \\leftrightarrow q_j\\}$ be a set of all correspondences, also $|C| = N$. Then, the cross-covariance $K$ is computed as:\n", "\n", "\\begin{eqnarray}\n", "K &=& E [(q_i - \\mu_Q)(p_i - \\mu_P)^T] \\\\\n", "&=& \\frac{1}{N}\\sum_{\\{i,j\\} \\in C}{(q_i - \\mu_Q)(p_i - \\mu_P)^T} \\\\\n", "&\\sim& \\sum_{\\{i,j\\} \\in C}{(q_i - \\mu_Q)(p_i - \\mu_P)^T}\n", "\\end{eqnarray}\n", "\n", "Each point has two dimentions, that is $p_i, q_j \\in {\\rm I\\!R}^2$, thus cross-covariance has the form of (we drop indices $i$ and $j$ for notation simplicity):\n", "\n", "\\begin{equation}\n", "K =\n", " \\begin{bmatrix}\n", " cov(p_x, q_x) & cov(p_x, q_y) \\\\\n", " cov(p_y, q_x) & cov(p_y, q_y)\n", " \\end{bmatrix}\n", "\\end{equation}\n", "\n", "-----\n", "**Intuition:** Intuitevely, cross-covariance tells us how a coordinate of point $q$ changes with the change of $p$ coorinate, i.e. $cov(p_x, q_x)$ tells us how the $x$ coordinate of $q$ will change with the change in $x$ coordinate of $p$ given that the points are corresponding. Ideal cross-covariance matrix is an identity matrix, i.e., we want the $x$ coordinates to be ideally correlated between the scans $P$ and $Q$, while there should be no correlation between the $x$ coorinate of points from $P$ to the $y$ coordinate of points in $Q$. \n", "In our case, however, the position of $P$ is derived from the position of $Q$ through some rotation $R$ and translation $t$. Therefore, whenever we would move the scan $Q$, scan $P$ would move in a related way, but pertrubed through the rotation and translation applied, making the cross-covariance matrix non-identity.\n", "\n", "----\n", "\n", "Knowing the cross-covariance we can compute its SVD decomposition:\n", "\n", "\\begin{equation}\n", "\\mathrm{SVD}(K) = USV^T\n", "\\end{equation}\n", "\n", "The SVD decomposition gives us how to rotate our data to align it with its prominent direction with $UV^T$ and how to scale it with its singular values $S$. Therefore:\n", "\n", "\\begin{eqnarray}\n", "R &=& UV^T \\\\\n", "t &=& \\mu_Q - R \\mu_P\n", "\\end{eqnarray}\n", "\n", "#### Let's try this out: ####" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Make data centered" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-04-18T23:08:43.288061\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAFoCAYAAACL9IXsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABHfElEQVR4nO3deXxU1fnH8c9JSBhICLuAoKKIaFCCEnBpFRcIVhFRiWgrgtafqFX7c0FsraLtz7Zqrba2rrWCuAOKilqjVsANNShBCC6IoChCAJOYZcgkOb8/bhJIMjPZZubO8n2/XrySufdm7kMukIdznvMcY61FREREREInye0AREREROKNEiwRERGREFOCJSIiIhJiSrBEREREQkwJloiIiEiIKcESERERCbGQJFjGmH8bY7YZY9bscexmY8y3xphVdb9OCcW9RERERKJdqEaw5gIn+zl+l7V2ZN2vl0N0LxEREZGoFpIEy1q7HNgZivcSERERiXWdwvz+lxtjzgfygWustT8Eu7hPnz528ODBYQ5JREREpONWrly53Vrb1985E6qtcowxg4El1tpD6173A7YDFvgDMMBae6Gfr7sYuBhg3333HbVp06aQxCMiIiISTsaYldbabH/nwraK0Fq71VpbY62tBR4CxgS47kFrbba1NrtvX79JoIiIiEhMCVuCZYwZsMfLM4A1ga4VERERiSchqcEyxjwJHA/0McZsBuYAxxtjRuJMEW4EZobiXiIiIiLRLiQJlrX2XD+HHw7Fe4uIiISSz+dj8+bNeL1et0ORGOHxeBg0aBApKSmt/ppwryIUERGJKps3b6Zbt24MHjwYY4zb4UiUs9ayY8cONm/ezP7779/qr9NWOSIiklC8Xi+9e/dWciWtYoyhd+/ebR7xVIIlIiIJR8mVtEV7/rwowRIREQmgwuvjgRfyGXfNo4ye+SDjrnmUB17Ip8Lr69D7GmM477zzGl5XV1fTt29fJk6c2NGQgxo8eDDbt28Pes3cuXO5/PLLg16zdOlS3n333VCG1mqrVq3i5ZfDt/ve8ccfT35+foffRzVYIiLiV4XXx/y8AhYsK6SkzEv3dA+5YzOZlpNFV0/ri31jVYXXx4zbFrO5qJQqXw0AxWVe5uUV8MbHXzF39uR2fx/S0tJYs2YNlZWVdOnShddee42BAweGMvywWrp0Kenp6RxzzDERv/eqVavIz8/nlFNOafXXVFdX06lTZFMejWCJiEgz9cnFvLwCisu8WHYnFzNuW9zhEZxYMD+voFFyVa/KV8PmolLm5xV06P1POeUUXnrpJQCefPJJzj1394L8nTt3MnnyZEaMGMFRRx3F6tWrqa2tZfDgwRQXFzdcN3ToULZu3UpRURFnnXUWo0ePZvTo0bzzzjsA7Nixg5ycHIYPH85FF11EoN1bHnnkEQ466CDGjBnT8LUAL774IkceeSSHH34448aNY+vWrWzcuJH777+fu+66i5EjR/LWW2/5va6pmpoarr32Wg499FBGjBjBPffcA8DKlSsZO3Yso0aNYsKECWzZsgVwRpJmz57NmDFjOOigg3jrrbeoqqripptu4umnn2bkyJE8/fTTlJeXc+GFFzJmzBgOP/xwnn/+ecAZiZs0aRInnngiJ510UsDrKisrOeecczjkkEM444wzqKysbO8jbUQJloiINBPu5CKaXHzni7z47mcAVNfUcvGdL/Lyii9YsKyw2e+/XpWvhoXLCiku83LxnS+yvMDZ5m17SUWr73vOOefw1FNP4fV6Wb16NUceeWTDuTlz5nD44YezevVq/vjHP3L++eeTlJTE6aefznPPPQfA+++/z3777Ue/fv349a9/zVVXXcWHH37IokWLuOiiiwC45ZZb+OlPf8ratWs544wz+Prrr5vFsWXLFubMmcM777zD22+/TWFhYcO5n/70p6xYsYKPP/6Yc845h9tvv53BgwdzySWXcNVVV7Fq1SqOPfZYv9c19eCDD7Jx40ZWrVrF6tWr+cUvfoHP5+OKK65g4cKFrFy5kgsvvJAbbrih4Wuqq6v54IMPuPvuu7nllltITU3l97//PVOnTmXVqlVMnTqVW2+9lRNPPJEPPviAN998k1mzZlFeXg7ARx99xMKFC1m2bFnA6+677z66du3KunXruOWWW1i5cmWrn2EwmiIUEZFmWpNczJzkdwu2uFFSFnzVWHF5x/pojRgxgo0bN/Lkk082m+56++23WbRoEQAnnngiO3bsoLS0lKlTp/L73/+eCy64gKeeeoqpU6cC8PrrrzdKjEpLSykrK2P58uU8++yzAJx66qn07NmzWRzvv/8+xx9/PPXb1U2dOpXPP/8ccFpaTJ06lS1btlBVVRWwTUFrrnv99de55JJLGqbqevXqxZo1a1izZg3j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\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "def center_data(data, exclude_indices=[]):\n", " reduced_data = np.delete(data, exclude_indices, axis=1)\n", " center = np.array([reduced_data.mean(axis=1)]).T\n", " return center, data - center\n", "\n", "center_of_P, P_centered = center_data(P)\n", "center_of_Q, Q_centered = center_data(Q)\n", "ax = plot_data(P_centered, Q_centered,\n", " label_1='Moved data centered',\n", " label_2='True data centered')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Compute correspondences" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-04-18T23:08:43.777471\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "correspondences = get_correspondence_indices(P_centered, Q_centered)\n", "ax = plot_data(P_centered, Q_centered,\n", " label_1='P centered',\n", " label_2='Q centered')\n", "draw_correspondeces(P_centered, Q_centered, correspondences, ax)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Compute cross covariance" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[[1113.97274605 1153.71870122]\n [ 367.39948556 478.81890396]]\n" ] } ], "source": [ "def compute_cross_covariance(P, Q, correspondences, kernel=lambda diff: 1.0):\n", " cov = np.zeros((2, 2))\n", " exclude_indices = []\n", " for i, j in correspondences:\n", " p_point = P[:, [i]]\n", " q_point = Q[:, [j]]\n", " weight = kernel(p_point - q_point)\n", " if weight < 0.01: exclude_indices.append(i)\n", " cov += weight * q_point.dot(p_point.T)\n", " return cov, exclude_indices\n", "\n", "cov, _ = compute_cross_covariance(P_centered, Q_centered, correspondences)\n", "print(cov)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Find $R$ and $t$ from SVD decomposition\n", "Here we find SVD decomposition of the cross covariance matrix and apply the rotation to $Q$" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[1712.35558954 63.95608054]\nR_found =\n [[ 0.89668479 0.44266962]\n [-0.44266962 0.89668479]]\nt_found =\n [[ 0.4278782 ]\n [-10.01055887]]\n" ] } ], "source": [ "U, S, V_T = np.linalg.svd(cov)\n", "print(S)\n", "R_found = U.dot(V_T)\n", "t_found = center_of_Q - R_found.dot(center_of_P)\n", "print(\"R_found =\\n\", R_found)\n", "print(\"t_found =\\n\", t_found)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Apply a single correction to $P$ and visualize the result\n", "This is the result after just one iteration. Because our correspondences are not optimal, it is not a complete match." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "[[ 0.4278782 ]\n [-10.01055887]]\n[[ 0.89668479 0.44266962]\n [-0.44266962 0.89668479]]\n" ] }, { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-04-18T23:08:44.475427\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlsAAAFlCAYAAADcXS0xAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABU/0lEQVR4nO3dd3xV9f3H8dc3IcnNIGFF2YKIKCJBi3ugiNFaBKqAE9GfLbiqbSliqy2Oah11V1FaLYiToYjUEXGgqCggBBRUUECCIGEkIeOS9f39cRII5N6bcffN+/l45JF7xj3nk+uV+7nf8fkaay0iIiIiEhxx4Q5AREREJJYp2RIREREJIiVbIiIiIkGkZEtEREQkiJRsiYiIiASRki0RERGRIGoV7gB86dChg+3Ro0e4wxARERFp0LJly7ZbazMP3B/RyVaPHj1YunRpuMMQERERaZAxZqOn/epGFBEREQkiJVsiIiIiQaRkS0RERCSIInrMlicVFRXk5eXhdrvDHUrMc7lcdO3alYSEhHCHIiIiErWiLtnKy8ujdevW9OjRA2NMuMOJWdZaduzYQV5eHj179gx3OCIiIlEr6roR3W437du3V6IVZMYY2rdvrxZEERERP0VdsgUo0QoRvc4iIiL+i8pkq7FK3RU8PW8pQyY8x3HjpzJkwnM8PW8ppe4Kv64bHx/PgAED6NevH6NGjaK0tDRAEQfGPffc0+TnTJs2jRtuuCEI0YiIiLRsMZtslboruPK+uUzPyaWg2I0FCordTM/J5cr75vqVcCUnJ7NixQq++uorEhMTeeqppwIWd2Vlpc/txmhOsiUiIiLBEbPJ1oycXPLyiyivqNpvf3lFFXn5RczIyQ3IfU477TTWrVtXb//bb7/NscceS1ZWFmeddRYAO3fuZMSIEfTv358TTzyRlStXAnD77bczZswYTjnlFMaMGVNvOz8/nwsvvJDjjjuO4447jk8++QSA4uJirrrqKo4++mj69+/PnDlzuOWWWygrK2PAgAFcdtllADz//PMcf/zxDBgwgPHjx1NV5bwm//3vfzn88MM5/vjj915TREREAivqk61xD77BG59+C0BlVTXjHnyDNxevZdbC1fUSrVrlFVXMXriagmI34x58g49yner62wub1h1YWVnJW2+9xdFHH73f/vz8fH77298yZ84ccnNzmTVrFgCTJ0/mmGOOYeXKldxzzz1cccUVe5+zevVqFixYwEsvvVRv+6abbuIPf/gDS5YsYc6cOfzmN78B4K677iIjI4NVq1axcuVKBg8ezL333ru35e2FF15gzZo1vPLKK3zyySesWLGC+Ph4XnjhBbZs2cLkyZP55JNPWLRoEatXr27S3y4iIiKNE3WlHxqrsNj3LLqCkubPsqttOQKnZevqq6/e7/jixYs5/fTT95ZMaNeuHQCLFi1izpw5AAwePJgdO3ZQVFQEwLBhw0hOTt57jbrbCxYs2C8ZKioqori4mAULFvDyyy/v3d+2bdt6sb733nssW7aM4447bm/sBx10EJ9//jlnnHEGmZnOepkXXXQR3333XbNfExEREfEs6pOtqRPO3/u4VXzc3u2HZn1GgY+Eq02qizZprv2e3yEjpVH3rG05CqTU1FSv29XV1SxevBiXy9Xk61prGTt2LP/4xz/22z937txmxSkiIiJNE/XdiN6MGtSXxIR4j8cSE+IZOahv0O594okn8tFHH7F+/XrAGasFTivYCy+8AMCHH35Ihw4dSE9Pb/B62dnZPP7443u3axO9s88+myeeeGLv/l27dgGQkJBARYUzAeCss85i9uzZbNu2bW8sGzdu5IQTTmDhwoXs2LGDioqKvV2dIiIiElgxm2yNyc6ia2Z6vYQrMSGerpnpjMnOCtq9MzMzmTp1KhdccAFZWVlcdNFFgDMQftmyZfTv359bbrmF6dOnN+p6jz32GEuXLqV///707dt37+zH2267jV27dtGvXz+ysrL44IMPABg3bhz9+/fnsssuo2/fvvz9738nOzub/v37c/bZZ7NlyxY6derE7bffzkknncQpp5zCkUceGZwXQ0REpIUz1tpwx+DVwIED7dKlS/fbt2bNmkYnBqXuCmbk5DqD4UvctEl1MXJQX8ZkZ5Hi0np/jdGU11tERKQlM8Yss9YOPHB/1I/Z8iXFlcD4YQMZP6ze3y0iIiISEjHbjSgiIiISCZRsiYiIiASRki0RERGRIFKyJSIiIhJESrZEREREgii2k62yYpg+GUZlwjlxzu/pk539fsjLy2P48OH07t2bQw89lBtuuIE9e/YEKGgRERGJJbGbbJUVw40nwqz7oXA7WOv8nnW/s7+ZCZe1lgsuuIARI0awdu1a1q5dS1lZGTfffHOA/wARERGJBbGbbM18ALZ8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\n" }, "metadata": { "needs_background": "light" } }, { "output_type": "stream", "name": "stdout", "text": [ "Squared diff: (P_corrected - Q) = 16.052894296516953\n" ] } ], "source": [ "print(t_found)\n", "print(R_found)\n", "P_corrected = R_found.dot(P) + t_found\n", "ax = plot_data(P_corrected, Q, label_1='P corrected', label_2='Q')\n", "plt.show()\n", "print(\"Squared diff: (P_corrected - Q) = \", np.linalg.norm(P_corrected - Q))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Let's make it iterative\n", "If we would know the correct correspondences from the start, we would be able to get the optimal solution in a single iteration. This is rarely the case and we need to iterate. That consists of the following steps:\n", "1. Make data centered by subtracting the mean\n", "2. Find correspondences for each point in $P$\n", "3. Perform a single iteration by computing the cross-covariance matrix and performing the SVD\n", "4. Apply the found rotation to $P$\n", "5. Repeat until correspondences don't change\n", "6. Apply the found rotation to the mean vector of $P$ and uncenter $P$ with it.\n", "\n", "### Working example\n", "As we want to work with centered data and we will be iteratively centering the data, searching for rotation on centered data and uncentering the data at the end of each iteration. It is not the most elegant or efficient way, but it allows us to visualize the clouds nicer." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-04-18T23:08:44.997894\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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\n" }, "metadata": { "needs_background": "light" } }, { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-04-18T23:08:45.289717\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlsAAAFlCAYAAADcXS0xAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABM2UlEQVR4nO3deXiU1d3/8feZzCSTkBWSsGPADUTBBRUruFYUimJVrLaFam3Rtopb3Wof29r6a7UuFWyl1GqFurRiFR6VGqiKxUdUXEDBKFtA9oRAQpZJZnKf3x/JDCFkn5lMkvm8rsuLmXtuZr6MA/nMuc/5HmOtRURERESiwxXrAkRERER6MoUtERERkShS2BIRERGJIoUtERERkShS2BIRERGJIoUtERERkShyx7qAlmRnZ9u8vLxYlyEiIiLSqg8//LDYWpvT+HiXDlt5eXmsXLky1mWIiIiItMoYs7mp47qMKCIiIhJFClsiIiIiUaSwJSIiIhJFXXrOloiIiHQdfr+frVu34vP5Wj3XWsu6HfvZuHM/Pn8tXk8Cw/qlcWT/NIwxnVBt9Hi9XgYNGoTH42nT+QpbIiIi0iZbt24lLS2NvLy8ZgNToNZh4fIC5uWvoqSsioDjEAg4uN0u3C4XvdOTmT5hNFPGDced0P0usFlr2bNnD1u3bmXo0KFt+j0KWyIiItImPp+vxaBV6fMzc/ZiCrYU46sJHPSYP+Dgx2Fb8X4eWbCCxe+vZ9YNE0nxtm10qKswxtCnTx+Kiora/Hu6X6QUERGRmGlpRGvm7MWsLSw6JGg15qsJsKZwNzNnLyZQ60SjzKhq72VQhS0REREJ28LlBRRsKaYmUNum8/0Bh4ItxSx8p6Bdr5OQkMDxxx/Psccey9SpU6msrDzknBdeeIERI0Zw9tlns3LlSmbOnNmu12goLy+P4uLiDv9+UNgSERGRMFlrmZe/qtURrcZ8NQHmvb4Ka22bf09ycjKffPIJn332GYmJicyZM+eQc/7617/yl7/8hTfffJMxY8Ywa9asdtUVaQpbIiIiEpbVG3dRUlbVod9bUlbF6o27OvR7x48fz/r16w86du+997J8+XKuueYabrvtNt566y0mT54MwC9/+Uu+//3vc9ZZZzFs2LCDQtjFF1/MSSedxMiRI5k7d26H6mmOJsiLiIhIh8x46H+58LSj2F9Z0+G5VzWBWtYWFjEwO53sjJQ2/75AIMDixYu54IILDjp+zz338MYbb/Dggw8yZswY3nrrrYMeLygo4M0332T//v0cffTR/OhHP8Lj8fDkk0/Su3dvqqqqOPnkk7n00kvp06dPh/5MjSlsiYiISFgqq/0dDlu1jqXC52/z+VVVVRx//PFA3cjWNddc067X+8Y3vkFSUhJJSUnk5uaya9cuBg0axKxZs3jppZcA+Oqrr1i3bp3CloiIiMTW3FsvBODZpZ/idrvwB9ofuDxuF728njaPagXnbHVUUlJS6HZCQgKBQIC33nqLpUuX8u6775KSksJZZ53VpsatbaU5WyIiIhKWkUNzcLs6FincLhfH5OVEuKL2KS0tJSsri5SUFAoKClixYkVEn19hS0RERMIyalhfeqcnd+j39k5PZtSwvhGuqH0uuOACAoEAI0aM4M4772Ts2LERfX7TnuWWnW3MmDF25cqVsS5DREREgM8//5wRI0Y0+diLy9byyIIV7Wr/4E10c/PUsVx6xjGRKrHTNPVeGGM+tNaOaXyuRrZEREQkbFPGDWf4kGw87rZFi0S3ixFDsply+vAoVxZ7ClsiIiISNneCi1k3TGRkXi7exJbX33kT3YzMy+XRGyZ2y82o20urEUVERCQiUrwe5twymYXvFDDv9VWUlFURcBwCAQe324Xb5aJ3ejLTzx/NlNOHx0XQAoUtERERiSB3gotLzziGS8aPYPXGXawtLKLC56eX18PIvFyOG5bb7o2cuzuFLREREYk4YwyjD+/H6MP7xbqUmIuP8TsRERGRGFHYEhERkcirKoenfwFTc+B8V92vT/+i7ngYtm7dypQpUzjyyCMZNmwY119/PdXV1REqOjoUtkRERCSyqsph5lh44QEoLQZr63594YG64x0MXNZaLrnkEi6++GLWrVvHunXrqKqq4vbbb4/wHyCyFLZEREQksv75e9ixAWoa7S9Y46s7/s/fd+hp33jjDbxeL1dffTVQt7fhI488wrx58ygvD2/ELJoUtkRERKRjfnoW5P+t7nbAX3d/6d/hlT8dGrSCanzwyuN1I10/PQve/d+64yU7W325NWvWcNJJJx10LD09nby8PNavX9/RP0XUKWyJiIhIZJXtCe/xHkatH0RERKRjHnzrwG2358D9P99cN3LVnPQ+kJF98O/v3XqLiGOOOYYFCxYcdKysrIydO3dy9NFHt7nszqaRLREREYmsyT+GRG/TjyV6YfKPOvS05557LpWVlcybNw+A2tpabr31Vq6//nqSk5M7Wm3UKWyJiIhIZF1+G/Q//NDAleitO375bR16WmMML730EgsWLODII4+kT58+uFwu7r777ggUHT0KWyIiIhJZyakwawVMvR0ycsC46n6denvd8eTUDj/14MGDWbRoEevWreO1117j3//+Nx999FEEi488zdkSERGRyEtOhe/9qu6/KPna177G5s2bo/b8kaKRLREREZEoUtgSERERiSKFLREREWkza22sS4i59r4HClsiIiLSJl6vlz179sR14LLWsmfPHrzeZlpbNCHsCfLGmKOBfzQ4NAy4x1r7hwbnnAUsBDbVH/qXtfbecF9bREREOs+gQYPYunUrRUVFsS4lprxeL4MGDWrz+WGHLWvtF8DxAMaYBGAb8FITp/7XWjs53NcTERGR2PB4PAwdOjTWZXQ7kb6MeC6wwVrb9ddhioiIiHSCSIetK4DnmnnsNGPMKmPMYmPMyAi/roiIiEiXFLGwZYxJBC4CXmji4Y+Aw6y1o4HZwMstPM8MY8xKY8zKeL8mLCIiIt1fJEe2JgIfWWt3NX7AWltmrS2vv/0a4DHGZDf1JNbaudbaMdbaMTk5OREsT0RERKTzRTJsXUkzlxCNMf2MMab+9in1r7sngq8tIiIi0iVFZG9EY0wv4Dzg2gbHrgOw1s4BLgN+ZIwJAFXAFTaem3SIiIhI3IhI2LLWVgB9Gh2b0+D2Y8BjkXgtERERke5EHeRFREREokhhS0RERCSKFLZEREREokhhS0RERCSKFLZEREREokhhS0RERCSKFLZEREREokhhS0RERCSKFLZEREREokhhS0RERCSKFLZEREREokhhS0RERCSKFLZEREREokhhS0RERCSKFLZEREREokhhS0RERCSKFLZEREREokhhS0RERCSKFLZEREREokhhS0RERCSKFLZEREREosgd6wJEREREGrLWsnrjLtZsKqKy2k9KkoeRQ3MYNawvxphYl9duClsiIiLSJQRqHRYuL2Be/ipKyqoIOA6BgIPb7cLtctE7PZnpE0YzZdxw3And5+KcwpaIiIjEXKXPz8zZiynYUoyvJnDQY/6Agx+HbcX7eWTBCha/v55ZN0wkxetp9vm60uiYwpaIiIjEVKDWYebs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XwNeC+e1RERERLojtccVERERiSKFLREREZEoUtgSERERiSKFLREREZEoUtgSERERiSKFLREREZEoUtgSERERiSKFLREREZEoUtgSERERiSKFLREREZEoUtgSERERiSKFLREREZEoUtgSERERiSKFLREREZEoUtgSERERiSKFLREREZEoUtgSERERiSKFLREREZEoUtgSERERiSKFLREREZEoUtgSERERiSKFLREREZEoUtgSERERiSKFLREREZEoUtgSERERiSKFLREREZEoUtgSERERiSKFLREREZEoUtgSERERiSKFLREREZEoUtgSERERiSKFLREREZEoUtgSERERiSKFLREREZEoUtgSERERiSJ3OL/ZGPMP4Oj6u5nAPmvt8U2cVwjsB2qBgLV2TDivKyIiItJdhBW2rLXfCt42xjwElLZw+tnW2uJwXk9ERESkuwkrbAUZYwxwOXBOJJ5PREREpKeI1Jyt8cAua+26Zh63QL4x5kNjzIyWnsgYM8MYs9IYs7KoqChC5YmIiIjERqsjW8aYpUC/Jh6621q7sP72lcBzLTzNOGvtNmNMLrDEGFNgrX27qROttXOBuQBjxoyxrdUnIiIi0pW1GrastV9v6XFjjBu4BDiphefYVv/rbmPMS8ApQJNhS0RERKQnicRlxK8DBdbarU09aIzpZYxJC94GJgCfReB1RURERLq8SIStK2h0CdEYM8AY81r93b7AcmPMKuB94FVr7b8j8LoiIiIiXV7YqxGttVc1cWw7MKn+9kZgdLivIyIiItIdqYO8iIiISBQpbImIiIhEkcKWiIiISBQpbImIiIhEkcKWiIiISBQpbImIiIhEkcKWiIiISBQpbImIiIhEkcKWiIiISBQpbImIiIhEkcKWiIiISBQpbImIiIhEkcKWiIiISBQpbImIiIhEkcKWiIiISBQpbImIiIhEkbHWxrqGZhljioDNUX6ZbKA4yq8Rr/TeRpfe3+jRextden+jR+9tdLX2/h5mrc1pfLBLh63OYIxZaa0dE+s6eiK9t9Gl9zd69N5Gl97f6NF7G10dfX91GVFEREQkihS2RERERKJIYQvmxrqAHkzvbXTp/Y0evbfRpfc3evTeRleH3t+4n7MlIiIiEk0a2RIRERGJorgNW8aYC4wxXxhj1htj7ox1PT2NMabQGPOpMeYTY8zKWNfT3RljnjTG7DbGfNbgWG9jzBJjzLr6X7NiWWN31cx7+0tjzLb6z+8nxphJsayxuzLGDDbGvGmMWWuMWWOMubH+uD67EdDC+6vPb5iMMV5jzPvGmFX17+2v6o8PNca8V58d/mGMSWzT88XjZURjTALwJXAesBX4ALjSWrs2poX1IMaYQmCMtVb9XiLAGHMGUA7Ms9YeW3/sAaDEWvu7+i8MWdbaO2JZZ3fUzHv7S6DcWvtgLGvr7owx/YH+1tqPjDFpwIfAxcBV6LMbthbe38vR5zcsxhgD9LLWlhtjPMBy4EbgFuBf1trnjTFzgFXW2sdbe754Hdk6BVhvrd1ora0BngemxLgmkWZZa98GShodngI8XX/7aer+kZV2aua9lQiw1u6w1n5Uf3s/8DkwEH12I6KF91fCZOuU19/11P9ngXOABfXH2/zZjdewNRD4qsH9regDGmkWyDfGfGiMmRHrYnqovtbaHfW3dwJ9Y1lMD3S9MWZ1/WVGXeYKkzEmDzgBeA99diOu0fsL+vyGzRiTYIz5BNgNLAE2APustYH6U9qcHeI1bEn0jbPWnghMBH5Sf6lGosTWzQeIvzkB0fM4cDhwPLADeCim1XRzxphU4EXgJmttWcPH9NkNXxPvrz6/EWCtrbXWHg8Mou6K2PCOPle8hq1twOAG9wfVH5MIsdZuq/91N/ASdR9Uiaxd9XM2gnM3dse4nh7DWrur/h9aB/gL+vx2WP18lxeBZ6y1/6o/rM9uhDT1/urzG1nW2n3Am8BpQKYxxl3/UJuzQ7yGrQ+AI+tXFSQCVwCLYlxTj2GM6VU/WRNjTC9gAvBZy79LOmAR8L36298DFsawlh4lGATqfRN9fjukfpLxX4HPrbUPN3hIn90IaO791ec3fMaYHGNMZv3tZOoW1H1OXei6rP60Nn9243I1IkD9Utg/AAnAk9ba+2JbUc9hjBlG3WgWgBt4Vu9veIwxzwFnUbfj/C7gF8DLwD+BIcBm4HJrrSZ6t1Mz7+1Z1F2CsUAhcG2DOUbSRsaYccB/gU8Bp/7wz6ibV6TPbphaeH+vRJ/fsBhjRlE3AT6BuoGpf1pr763/+fY80Bv4GPiutba61eeL17AlIiIi0hni9TKiiIiISKdQ2BIRERGJIoUtERERkShS2BIRERGJIoUtERERkShS2BIRERGJIoUtERERkShS2BIRERGJov8PDvA5DmRLZiIAAAAASUVORK5CYII=\n" }, "metadata": { "needs_background": "light" } }, { "output_type": "stream", "name": "stdout", "text": [ "[37.7609616179743, 16.052894296516953, 4.747691495229575, 0.6307436032154958, 2.6418496970390133e-14, 2.6417913757437442e-14, 2.6105561201727387e-14, 4.026252155082058e-14, 5.0457972328602515e-14, 3.389128540242614e-14]\n" ] } ], "source": [ "def icp_svd(P, Q, iterations=10, kernel=lambda diff: 1.0):\n", " \"\"\"Perform ICP using SVD.\"\"\"\n", " center_of_Q, Q_centered = center_data(Q)\n", " norm_values = []\n", " P_values = [P.copy()]\n", " P_copy = P.copy()\n", " corresp_values = []\n", " exclude_indices = []\n", " for i in range(iterations):\n", " center_of_P, P_centered = center_data(P_copy, exclude_indices=exclude_indices)\n", " correspondences = get_correspondence_indices(P_centered, Q_centered)\n", " corresp_values.append(correspondences)\n", " norm_values.append(np.linalg.norm(P_centered - Q_centered))\n", " cov, exclude_indices = compute_cross_covariance(P_centered, Q_centered, correspondences, kernel)\n", " U, S, V_T = np.linalg.svd(cov)\n", " R = U.dot(V_T) \n", " t = center_of_Q - R.dot(center_of_P) \n", " P_copy = R.dot(P_copy) + t\n", " P_values.append(P_copy)\n", " corresp_values.append(corresp_values[-1])\n", " return P_values, norm_values, corresp_values\n", "\n", "P_values, norm_values, corresp_values = icp_svd(P, Q)\n", "plot_values(norm_values, label=\"Squared diff P->Q\")\n", "ax = plot_data(P_values[-1], Q, label_1='P final', label_2='Q', markersize_1=15)\n", "plt.show()\n", "print(norm_values)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ], "text/html": "\n\n\n\n\n\n
\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n
\n
\n
\n\n\n\n" }, "metadata": {}, "execution_count": 11 } ], "source": [ "animate_results(P_values, Q, corresp_values, xlim=(-5, 35), ylim=(-5, 35))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$\\newcommand{\\b}[1]{\\boldsymbol{\\mathrm{#1}}}$\n", "$\\newcommand{\\R}{\\boldsymbol{\\mathrm{R}}}$\n", "$\\newcommand{\\x}{\\boldsymbol{\\mathrm{x}}}$\n", "$\\newcommand{\\h}{\\boldsymbol{\\mathrm{h}}}$\n", "$\\newcommand{\\p}{\\boldsymbol{\\mathrm{p}}}$\n", "$\\newcommand{\\q}{\\boldsymbol{\\mathrm{q}}}$\n", "$\\newcommand{\\t}{\\boldsymbol{\\mathrm{t}}}$\n", "$\\newcommand{\\J}{\\boldsymbol{\\mathrm{J}}}$\n", "$\\newcommand{\\H}{\\boldsymbol{\\mathrm{H}}}$\n", "$\\newcommand{\\E}{\\boldsymbol{\\mathrm{E}}}$\n", "$\\newcommand{\\e}{\\boldsymbol{\\mathrm{e}}}$\n", "$\\newcommand{\\n}{\\boldsymbol{\\mathrm{n}}}$\n", "$\\DeclareMathOperator*{\\argmin}{arg\\,min}$\n", "$\\newcommand{\\norm}[1]{\\left\\lVert#1\\right\\rVert}$\n", "# Non-linear Least-squares based ICP #\n", "We can alternatively treat every iteration of ICP as a least squares minimization problem. The function we want to minimize is the squared sum of distances between the points of the scans:\n", "\n", "\\begin{equation}\n", "E = \\sum_i[\\R\\p_i + \\t - \\q_i]^2 \\rightarrow \\mathrm{min} \n", "\\end{equation}\n", "\n", "To minimize this function we update the pose $\\b{R}$, $\\b{t}$ (or alternatively represented as a vector $\\b{x} = [x, y, \\theta]^T$) to which we need to move scan $P$ to overlap it with a query scan $Q$. It is a non-linear function because of the rotation.\n", "\n", "## Correspondeces ##\n", "We look for correspondeces **without** moving the data to ensure zero-mean. Therefore the correspondences look worse than in SVD case, where we first ensured that both scans are zero-mean." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-04-18T23:08:47.265756\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlIAAAFlCAYAAAAgSAb7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAB60klEQVR4nO3deXxU9b34/9dn9sm+EsjCJsi+SQAVEBANblXbira3Rexya9vb5ba22vZ+79X2295729u937bq/bVFrd20rbV2EdywbiAIiICyL2HLRvZMZvv8/jg5JzPJzGQyCSSZvJ+PBw+SM2fOnAyQvHm/35/3R2mtEUIIIYQQ/Wcb6hsQQgghhBipJJASQgghhEiRBFJCCCGEECmSQEoIIYQQIkUSSAkhhBBCpEgCKSGEEEKIFDmG4kWLior0xIkTh+KlhRBCCCH6Zfv27XVa6+JYjw1JIDVx4kS2bds2FC8thBBCCNEvSqlj8R6T0p4QQgghRIokkBJCCCGESJEEUkIIIYQQKUq6R0op5QFeBNxdz3tca32vUmoS8BugENgOrNNa+8/HzQohhBDDTSAQoLq6Gp/PN9S3IgbI4/FQXl6O0+lM+jn9aTbvBK7UWrcqpZzAS0qpvwGfB76ntf6NUup+4CPAT/tz40IIIcRIVV1dTXZ2NhMnTkQpNdS3I1Kktaa+vp7q6momTZqU9POSLu1pQ2vXp86uXxq4Eni86/hDwM1Jv7oQQggxwvl8PgoLCyWIGuGUUhQWFvY7s9ivHimllF0ptROoATYBh4BGrXWw65RqoKxfdyCEEEKMcBJEpYdU/hz7FUhprUNa6/lAObAYmJ7sc5VSH1NKbVNKbautre3fXQohhBBpoN0X4IEnt3HVXQ+z6M4Huequh3ngyW20+wIDuq5Sig9+8IPW58FgkOLiYm644YaB3nJCEydOpK6uLuE5GzZs4FOf+lTCc1544QVeeeWVwby1CyalgZxa60al1PPAZUCeUsrRlZUqB07Gec6DwIMAlZWVOsX7FUKIlLT7AjyycRePbd5LU6uP3CwPa1fMZF3VPDI8yTeWCpGqdl+AO775BNW1zfgDIQAaW308tHEXz+44woZ7bk7572JmZiZvvfUWHR0deL1eNm3aRFnZyCkQvfDCC2RlZXH55ZcP9a30W9IZKaVUsVIqr+tjL3A1sA94Hril67T1wJ8G+R6FEGJAzB9gD23cRWOrD033D7A7vvnEgLMBQiTjkY27ooIokz8Qorq2mUc27hrQ9a+77jr+8pe/APDrX/+a97///dZjDQ0N3HzzzcydO5dLL72UN998k3A4zMSJE2lsbLTOmzp1KmfPnqW2tpb3vve9LFq0iEWLFvHyyy8DUF9fT1VVFbNmzeKjH/0oWsfOi/ziF7/g4osvZvHixdZzAf785z+zZMkSFixYwFVXXcXZs2c5evQo999/P9/73veYP38+//jHP2KeN1z1p7Q3DnheKfUm8DqwSWv9FHAP8Hml1EGMEQg/G/zbFEKI1J3vH2BCRPrYd/7Mn195B4BgKMzHvvNn/vraAR7bvLfX30GTPxDi8c17aWz18bHv/JkXdxk7ktQ1tSf9uu973/v4zW9+g8/n480332TJkiXWY/feey8LFizgzTff5D//8z+5/fbbsdls3HTTTfzxj38EYMuWLUyYMIGSkhI++9nP8rnPfY7XX3+d3//+93z0ox8F4Ktf/SrLli1jz549vPvd7+b48eO97uP06dPce++9vPzyy7z00kvs3bvXemzZsmW89tpr7Nixg/e9731861vfYuLEiXz84x/nc5/7HDt37mT58uUxzxuuki7taa3fBBbEOH4Yo19KCCGGpcgfYBn2IFmOIDWdHqD7B9idN1YO5S2KUaCpNfFqsMa2gc2hmjt3LkePHuXXv/411113XdRjL730Er///e8BuPLKK6mvr6e5uZnbbruNr33ta3zoQx/iN7/5DbfddhsAzzzzTFQA1NzcTGtrKy+++CJ/+MMfALj++uvJz8/vdR9btmxh5cqVFBcbe/zedttt7N+/HzBGRdx2222cPn0av98fd8xAsucNBzLZXAiR9iJ/gJVndLCk8BzG9BbDQH+ACRHpwbvexbsunwaAw27jwbvexXWXTiU3y5PweXmZHvKyPDx417u4Yt4EAIpyM/r12jfeeCNf+MIXosp6iVx22WUcPHiQ2tpannjiCd7znvcAEA6Hee2119i5cyc7d+7k5MmTZGVl9eteYvn0pz/Npz71KXbv3s0DDzwQd9RAsucNBxJICSHSXuQPsGDYWN7sUN2BVF5m4h9wQgyGtStm4nLaYz7mctq5ZcXMAb/Ghz/8Ye69917mzJkTdXz58uU8+uijgNHYXVRURE5ODkop3v3ud/P5z3+eGTNm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\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "correspondences = get_correspondence_indices(P, Q)\n", "ax = plot_data(P, Q, \"Moved data\", \"True data\")\n", "draw_correspondeces(P, Q, correspondences, ax)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Minimization ##\n", "We define $\\p_i \\in P$ to be points we want to match against $\\q_j \\in Q$. By \"matching\" we mean finding pose $\\b{x} = [x, y, \\theta]^T$ that minimizes the sum of squared lengths of the correspondences. Pose $\\x$ can alternatively be resresented by a rotation matrix $\\R = \n", "\\begin{bmatrix}\n", " \\cos\\theta & - \\sin\\theta \\\\\n", " \\sin\\theta & \\cos\\theta\n", "\\end{bmatrix}$ and a translation vector $\\t = [x, y]^T$. We will keep using these representations interchangibly throughtout these notes. \n", "\n", "We will further use the following notation: $\\h_i(\\x) = \\R_\\theta \\p_i + \\t$ to denote the points from scan $P$ transformed with $\\R$ and $\\t$. Additionally, we define error function $\\e$ to be: \n", "\n", "\\begin{eqnarray}\n", "\\e(\\x) &=& \\sum_{\\{i,j\\}\\in C}{\\e_{i,j}(\\x)},\\\\\n", "\\e_{i,j}(\\x) &=& \\h_i(\\x) - \\q_j = \\R_\\theta \\p_i + \\t - \\q_j\n", "\\end{eqnarray}\n", "\n", "\n", "This allows us to formulate the minimization problem as follows:\n", "\n", "\\begin{eqnarray}\n", "\\b{x}_{query} \n", "&=& \\argmin_{\\x}\\{\\E(\\x)\\} \\\\\n", "&=& \\argmin_{\\x}\\{\\sum_{\\{i, j\\} \\in C}{\\norm{\\e_{i,j}(\\x)}^2}\\} \\\\ \n", "&=& \\argmin_{\\x}\\{\\sum_{\\{i, j\\} \\in C}{\\norm{\\b{h}_i(\\x) - \\q_j}^2}\\}\n", "\\end{eqnarray}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Gauss Newton Method ###\n", "We will be using Gauss Newton method for computing the least squares solution of our non-linear problem. We therefore linearize our function in the vicinity of $\\x$. Solving non-linear least squares is equivalent to solving the following system of equations:\n", "\n", "\\begin{equation}\n", "\\H \\Delta \\x = - \\E^\\prime(\\x),\n", "\\end{equation}\n", "\n", "where $\\Delta \\x$ is the increment of the argument ($[\\Delta x, \\Delta y, \\Delta \\theta]$ in our case), $\\H$ is the Hessian of $\\E$ and $\\E^\\prime(\\x)$ is the derivative over the function we are trying to minimize. \n", "We compute the gradient $\\E^\\prime(\\x)$ as follows:\n", "\n", "\\begin{equation}\n", "\\E^\\prime(\\x) = \\J(\\x) \\e(\\x)\n", "\\end{equation}\n", "\n", "In Gauss-Newton method we linearize the function around the considered point, which allows us to compute the Hessian as simple as: $\\H = \\J(\\x)^T \\J(\\x)$\n", "\n", "#### Jacobian ####\n", "Both the Hessian and the gradient require the computation of a Jacobian. To compute a Jacobian we need a derivative of a rotation matrix:\n", "\n", "\\begin{equation}\n", "\\R_\\theta^\\prime\n", "=\\frac{\\partial}{\\partial \\theta}\n", " \\begin{bmatrix}\n", " \\cos\\theta & - \\sin\\theta \\\\\n", " \\sin\\theta & \\cos\\theta\n", " \\end{bmatrix}\n", "=\\begin{bmatrix}\n", " -\\sin\\theta & - \\cos\\theta \\\\\n", " \\cos\\theta & -\\sin\\theta\n", " \\end{bmatrix}\n", "\\end{equation}" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "def dR(theta):\n", " return np.array([[-sin(theta), -cos(theta)],\n", " [cos(theta), -sin(theta)]])\n", "\n", "def R(theta):\n", " return np.array([[cos(theta), -sin(theta)],\n", " [sin(theta), cos(theta)]])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we have everything to compute the Jacobian $\\b{J}$ as follows:\n", "\n", "\\begin{eqnarray}\n", "\\b{J} = \\frac{\\partial \\e_{i,j}(\\x)}{\\partial \\x} = \\frac{\\partial \\h_i(\\x)}{\\partial \\x} \n", "&=& \\Big(\\frac{\\partial \\h_i(\\x)}{\\partial x}, \\frac{\\partial \\h_i(\\x)}{\\partial y}, \\frac{\\partial \\h_i(\\x)}{\\partial \\theta}\\Big) \\\\ \n", "&=&\\Big(\\b{I}, \\R_\\theta^\\prime \\p_i \\Big) \\\\ \n", "&=&\n", "\\begin{bmatrix}\n", " 1 & 0 & -\\sin\\theta\\ p_i^x - \\cos\\theta\\ p_i^y \\\\\n", " 0 & 1 & \\cos\\theta\\ p_i^x - \\sin\\theta\\ p_i^y\n", "\\end{bmatrix}\n", "\\end{eqnarray}" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "def jacobian(x, p_point):\n", " theta = x[2]\n", " J = np.zeros((2, 3))\n", " J[0:2, 0:2] = np.identity(2)\n", " J[0:2, [2]] = dR(0).dot(p_point)\n", " return J\n", "\n", "def error(x, p_point, q_point):\n", " rotation = R(x[2])\n", " translation = x[0:2]\n", " prediction = rotation.dot(p_point) + translation\n", " return prediction - q_point" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solving the Least Squares problem\n", "Now that we know how to compute the Jacobian, we can compute the system of equations, solving which delivers the solution to our problem. We initialize Hessian $\\H$ and gradient $\\b{g}$ by zeros:\n", "\n", "\\begin{equation}\n", "\\b{H} = \n", "\\begin{bmatrix}\n", " 0 & 0 & 0 \\\\\n", " 0 & 0 & 0 \\\\\n", " 0 & 0 & 0\n", "\\end{bmatrix}, \\ \n", "\\b{g} = \n", "\\begin{bmatrix}\n", " 0 \\\\\n", " 0 \\\\\n", " 0\n", "\\end{bmatrix} \\ \n", "\\end{equation}\n", "\n", "We now need to construct a system of equations solving which would give us the relative pose. **For every corresponding pair of points** do the following:\n", "\n", "\\begin{eqnarray}\n", "\\H &\\rightarrow& \\b{H} + \\J^T \\J \\\\\n", "\\b{g} &\\rightarrow& \\b{g} + \\J^T \\e\n", "\\end{eqnarray}\n", "\n", "Now that the system of equation is ready, we can find the $\\Delta\\b{x}$ - the solution to the least squares problem:\n", "\n", "\\begin{equation}\n", "\\H \\Delta\\x = -\\b{g} \\Longrightarrow \\Delta\\x = -\\b{H}^{-1}\\b{g}\n", "\\end{equation}\n", "\n", "This can be solved without actually inverting the matrix in reality." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-04-18T23:08:48.070873\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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\n" }, "metadata": { "needs_background": "light" } }, { "output_type": "stream", "name": "stdout", "text": [ "[279.8595127207585, 135.53670591984252, 148.41156916870492, 138.13600690872124, 164.7628216353993, 162.60937583974695, 172.09657147196538, 161.58393072081944, 125.08676568660141, 74.1879508877521, 54.070226670322775, 41.64904459515214, 19.71413517969046, 9.258599804821097, 8.77264288232226, 4.1720680989042, 1.2769314893000516, 0.16280347501872677, 0.014198093772482398, 0.0012239475378550792, 0.00010514834808173084, 9.024084124479632e-06, 7.742391050343611e-07, 6.64216039416419e-08, 5.69813281717628e-09, 4.888240241032962e-10, 4.193450943848659e-11, 3.597413162964382e-12, 3.0860929402579883e-13, 2.647449094019942e-14]\n" ] } ], "source": [ "def prepare_system(x, P, Q, correspondences, kernel=lambda distance: 1.0):\n", " H = np.zeros((3, 3))\n", " g = np.zeros((3, 1))\n", " chi = 0\n", " for i, j in correspondences:\n", " p_point = P[:, [i]]\n", " q_point = Q[:, [j]]\n", " e = error(x, p_point, q_point)\n", " weight = kernel(e) # Please ignore this weight until you reach the end of the notebook.\n", " J = jacobian(x, p_point)\n", " H += weight * J.T.dot(J)\n", " g += weight * J.T.dot(e)\n", " chi += e.T * e\n", " return H, g, chi\n", "\n", "def icp_least_squares(P, Q, iterations=30, kernel=lambda distance: 1.0):\n", " x = np.zeros((3, 1))\n", " chi_values = []\n", " x_values = [x.copy()] # Initial value for transformation.\n", " P_values = [P.copy()]\n", " P_copy = P.copy()\n", " corresp_values = []\n", " for i in range(iterations):\n", " rot = R(x[2])\n", " t = x[0:2]\n", " correspondences = get_correspondence_indices(P_copy, Q)\n", " corresp_values.append(correspondences)\n", " H, g, chi = prepare_system(x, P, Q, correspondences, kernel)\n", " dx = np.linalg.lstsq(H, -g, rcond=None)[0]\n", " x += dx\n", " x[2] = atan2(sin(x[2]), cos(x[2])) # normalize angle\n", " chi_values.append(chi.item(0))\n", " x_values.append(x.copy())\n", " rot = R(x[2])\n", " t = x[0:2]\n", " P_copy = rot.dot(P.copy()) + t\n", " P_values.append(P_copy)\n", " corresp_values.append(corresp_values[-1])\n", " return P_values, chi_values, corresp_values\n", "\n", "P_values, chi_values, corresp_values = icp_least_squares(P, Q)\n", "plot_values(chi_values, label=\"chi^2\")\n", "print(chi_values)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "### Animate the result" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ], "text/html": "\n\n\n\n\n\n
\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n
\n
\n
\n\n\n\n" }, "metadata": {}, "execution_count": 16 } ], "source": [ "animate_results(P_values, Q, corresp_values, xlim=(-10, 35), ylim=(-10, 30))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Using point to plane metric with Least Squares ICP\n", "Point to point metric used before is not really the most optimal as can be seen above. It takes quite some iterations for the solution to converge. There is another metric which seems to work better. It is called \"point to plane\" metric. The idea here is that we still find the closest point, but the error is defined as a projection of the error onto the direction of the normal shot from the found point.\n", "\n", "To start, we need to compute the normals of the resulting cloud.\n", "\n", "The normal in this 2D case is simple to compute. For a vector $v = [x, y]^\\top$ the normal is a vector $n_v = [-y, x]^\\top$ as can be shown geometrically. " ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-04-18T23:08:51.891538\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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iBcp2RIRERHxIiVbIiIiIl6kZEtERETEi5RsiYiIiHiRki0RERERL1KyJSIiIuJFSrZEREREvEjJloiIiIgXKdkSERER8SIlWyIiIiJepGRLRERExIuUbImIiIh4kZItERERES9SsiUiIiLiRUq2RERERLxIyZaIiIiIFynZEhEREfEiJVsiIiIiXqRkS0RERMSLlGyJiIiIeJGSLREREREvUrIlIiIi4kVKtkRERES8SMmWiIiIiBcp2RIRERHxIiVbIiIiIl6kZEtERETEi5RsiYiIiHiRki0RERERL1KyJSIiIuJFSrZEREREvEjJloiIiIgXKdkSERER8SIlWyIiIiJeFOTOzcaYuUBf124r4LS19tIqrjsIZAElQLG1Ns6d54qIiIg0Fm4lW9baSWXbxph/ABnnuXyktTbVneeJiIiINDZuJVtljDEGmAhc74nyRERERJoKT/XZugY4Ya3dW815C3xmjNlijJnmoWeKiIiI+L0aa7aMMSuBDlWc+r219iPX9j3Ae+cpZri19qgxph2wwhjznbV2TTXPmwZMA+jatWtN4YmIiIj4NWOtda8AY4KAo8Bga21SLa7/E5Btrf17TdfGxcXZ+Ph4t+ITERERaQjGmC1VDQL0RDPiKOC76hItY0xLY0xk2TYwGtjpgeeKiIiI+D1PJFt3c1YTojGmkzFmmWu3PbDOGLMd2AR8bK391APPFREREfF7bo9GtNbeX8WxY8DNru39wCXuPkdERESkMdIM8iIiIiJepGRLRERExIuUbImIiIh4kZItERERES9SsiUiIiLiRUq2RERERLxIyZaIiIiIFynZEhEREfEiJVsiIiIiXuT2QtTeZIxJAQ55+TFtgVQvP6O50nvrXXp/vUfvrXfp/fUevbfeVdP7281aG3v2Qb9OthqCMSa+qhW6xX16b71L76/36L31Lr2/3qP31rvq+/6qGVFERETEi5RsiYiIiHiRki2Y4esAmjC9t96l99d79N56l95f79F76131en+bfZ8tEREREW9SzZaIiIiIFzXbZMsYM9YYs8cYk2iM+Y2v42lqjDEHjTEJxphtxph4X8fT2BljZhpjThpjdlY41sYYs8IYs9f12tqXMTZW1by3fzLGHHV9frcZY272ZYyNlTHmAmPMamPMbmPMLmPMz1zH9dn1gPO8v/r8uskYE2aM2WSM2e56b591He9hjNnoyh3mGmNCalVec2xGNMYEAt8DNwJJwGbgHmvtbp8G1oQYYw4CcdZazffiAcaYa4Fs4B1r7UDXseeAU9ba/3V9YWhtrf21L+NsjKp5b/8EZFtr/+7L2Bo7Y0xHoKO1dqsxJhLYAtwO3I8+u247z/s7EX1+3WKMMUBLa222MSYYWAf8DPgF8KG19n1jzL+B7dba12oqr7nWbA0FEq21+621hcD7wG0+jkmkWtbaNcCpsw7fBsxybc/C+UdW6qia91Y8wFqbbK3d6trOAr4FOqPPrkec5/0VN1lHtms32PVjgeuB+a7jtf7sNtdkqzNwpMJ+EvqAepoFPjPGbDHGTPN1ME1Ue2ttsmv7ONDel8E0QY8bY3a4mhnVzOUmY0x34DJgI/rsetxZ7y/o8+s2Y0ygMWYbcBJYAewDTltri12X1Dp3aK7JlnjfcGvt5cBNwGOuphrxEuv0B2h+fQK85zWgF3ApkAz8w6fRNHLGmAhgAfBza21mxXP67LqvivdXn18PsNaWWGsvBbrgtIhdVN+ymmuydRS4oMJ+F9cx8RBr7VHX60lgIc4HVTzrhKvPRlnfjZM+jqfJsNaecP1DWwq8gT6/9ebq77IAmGOt/dB1WJ9dD6nq/dXn17OstaeB1cCVQCtjTJDrVK1zh+aabG0G+rhGFYQAdwOLfRxTk2GMaenqrIkxpiUwGth5/rukHhYDU13bU4GPfBhLk1KWCLjcgT6/9eLqZPwm8K219p8VTumz6wHVvb/6/LrPGBNrjGnl2g7HGVD3LU7SdZfrslp/dpvlaEQA11DYF4FAYKa19q++jajpMMb0xKnNAggC/qv31z3GmPeAETgrzp8AngEWAR8AXYFDwERrrTp611E17+0InCYYCxwEflKhj5HUkjFmOLAWSABKXYd/h9OvSJ9dN53n/b0HfX7dYoy5GKcDfCBOxdQH1to/u/6+vQ+0Ab4BJltrC2osr7kmWyIiIiINobk2I4qIiIg0CCVbIiIiIl6kZEtERETEi5RsiYiIiHiRki0RERERL1KyJSIiIuJFSrZEREREvEjJloiIiIgX/X9NQVVmT9wlzgAAAABJRU5ErkJggg==\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "def compute_normals(points, step=1):\n", " normals = [np.array([[0, 0]])]\n", " normals_at_points = []\n", " for i in range(step, points.shape[1] - step):\n", " prev_point = points[:, i - step]\n", " next_point = points[:, i + step]\n", " curr_point = points[:, i]\n", " dx = next_point[0] - prev_point[0] \n", " dy = next_point[1] - prev_point[1]\n", " normal = np.array([[0, 0],[-dy, dx]])\n", " normal = normal / np.linalg.norm(normal)\n", " normals.append(normal[[1], :]) \n", " normals_at_points.append(normal + curr_point)\n", " normals.append(np.array([[0, 0]]))\n", " return normals, normals_at_points\n", "\n", "def plot_normals(normals, ax):\n", " label_added = False\n", " for normal in normals:\n", " if not label_added:\n", " ax.plot(normal[:,0], normal[:,1], color='grey', label='normals')\n", " label_added = True\n", " else:\n", " ax.plot(normal[:,0], normal[:,1], color='grey')\n", " ax.legend()\n", " return ax\n", "\n", "Q_normals, Q_normals_to_draw = compute_normals(Q)\n", "ax = plot_data(None, Q, None, 'Q')\n", "ax = plot_normals(Q_normals_to_draw, ax)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Point to plane error metric\n", "\n", "The error that we minimize is different. Before we minimized the Euclidean error between the 2 points, now we minimize this error projected onto the normal vector of one of the points.\n", "\n", "\\begin{equation}\n", "E = \\sum_i (\\n_i \\cdot (\\R_\\theta \\p_i + \\t - \\q_j))^2 \\rightarrow \\mathrm{min},\n", "\\end{equation}\n", "\n", "here $\\n_i$ is the normal direction at the point $\\q_i$. This leads to a changed jacobian that is not $2 \\times 3$ as before, but $1 \\times 3$.\n", "\n", "## Point to plane Jacobian" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "", "text/latex": "Point to point Jacobian: " }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": "⎡1 0 -pₓ⋅sin(\\theta) - p_y⋅cos(\\theta)⎤\n⎢ ⎥\n⎣0 1 pₓ⋅cos(\\theta) - p_y⋅sin(\\theta) ⎦", "text/latex": "$\\displaystyle \\left[\\begin{matrix}1 & 0 & - p_{x} \\sin{\\left(\\theta \\right)} - p_{y} \\cos{\\left(\\theta \\right)}\\\\0 & 1 & p_{x} \\cos{\\left(\\theta \\right)} - p_{y} \\sin{\\left(\\theta \\right)}\\end{matrix}\\right]$" }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": "", "text/latex": "Point to plane Jacobian: " }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": "[nₓ n_y nₓ⋅(-pₓ⋅sin(\\theta) - p_y⋅cos(\\theta)) + n_y⋅(pₓ⋅cos(\\theta) - p_y⋅s\nin(\\theta))]", "text/latex": "$\\displaystyle \\left[\\begin{matrix}n_{x} & n_{y} & n_{x} \\left(- p_{x} \\sin{\\left(\\theta \\right)} - p_{y} \\cos{\\left(\\theta \\right)}\\right) + n_{y} \\left(p_{x} \\cos{\\left(\\theta \\right)} - p_{y} \\sin{\\left(\\theta \\right)}\\right)\\end{matrix}\\right]$" }, "metadata": {} } ], "source": [ "from sympy import init_printing, symbols, Matrix, cos as s_cos, sin as s_sin, diff\n", "init_printing(use_unicode = True)\n", "\n", "def RotationMatrix(angle):\n", " return Matrix([[s_cos(angle) , -s_sin(angle)], [s_sin(angle), s_cos(angle)]])\n", "\n", "x, y, theta, n_x, n_y, p_x, p_y = symbols('x, y, \\\\theta, n_x, n_y, p_x, p_y')\n", "t = Matrix([[x], [y]])\n", "X = Matrix([x,y,theta])\n", "n = Matrix([[n_x],[n_y]])\n", "p = Matrix([[p_x], [p_y]])\n", "\n", "error_point = RotationMatrix(theta) * p + t\n", "error_normal = n.dot(RotationMatrix(theta) * p + t)\n", "\n", "display()\n", "J_point = diff(error_point, X).reshape(3,2).transpose()\n", "J_normal = diff(error_normal, X).reshape(3,1).transpose()\n", "display(Latex(\"Point to point Jacobian: \"), J_point)\n", "display(Latex(\"Point to plane Jacobian: \"), J_normal)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Faster convergence\n", "\n", "This changes very little in the optimization procedure, but the convergence rate is much better." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-04-18T23:08:53.808042\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "def prepare_system_normals(x, P, Q, correspondences, Q_normals):\n", " H = np.zeros((3, 3))\n", " g = np.zeros((3, 1))\n", " chi = 0\n", " for i, j in correspondences:\n", " p_point = P[:, [i]]\n", " q_point = Q[:, [j]]\n", " normal = Q_normals[j]\n", " e = normal.dot(error(x, p_point, q_point))\n", " J = normal.dot(jacobian(x, p_point))\n", " H += J.T.dot(J)\n", " g += J.T.dot(e)\n", " chi += e.T * e\n", " return H, g, chi\n", "\n", "def icp_normal(P, Q, Q_normals, iterations=20):\n", " x = np.zeros((3, 1))\n", " chi_values = []\n", " x_values = [x.copy()] # Initial value for transformation.\n", " P_values = [P.copy()]\n", " P_latest = P.copy()\n", " corresp_values = []\n", " for i in range(iterations):\n", " rot = R(x[2])\n", " t = x[0:2]\n", " correspondences = get_correspondence_indices(P_latest, Q)\n", " corresp_values.append(correspondences)\n", " H, g, chi = prepare_system_normals(x, P, Q, correspondences, Q_normals)\n", " dx = np.linalg.lstsq(H, -g, rcond=None)[0]\n", " x += dx\n", " x[2] = atan2(sin(x[2]), cos(x[2])) # normalize angle\n", " chi_values.append(chi.item(0)) # add error to list of errors\n", " x_values.append(x.copy())\n", " rot = R(x[2])\n", " t = x[0:2]\n", " P_latest = rot.dot(P.copy()) + t\n", " P_values.append(P_latest)\n", " corresp_values.append(corresp_values[-1])\n", " return P_values, chi_values, corresp_values\n", "\n", "P_values, chi_values, corresp_values = icp_normal(P, Q, Q_normals)\n", "plot_values(chi_values, label=\"chi^2\")" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ], "text/html": "\n\n\n\n\n\n
\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n
\n
\n
\n\n\n\n" }, "metadata": {}, "execution_count": 20 } ], "source": [ "animate_results(P_values, Q, corresp_values, xlim=(-10, 35), ylim=(-10, 20))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Dealing with outliers\n", "If we corrupt our data, it gets harder for all of these algorithms to reason about it. \n", "\n", "Let's say, there is a couple pretty bad outliers in the $P$ data:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "# Introduce an outlier.\n", "P_outliers = P.copy()\n", "P_outliers[:, 10] = np.array([-10, 30])\n", "P_outliers[:, 20] = np.array([0, 40])" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "center_of_P_outliers = np.array([P_outliers.mean(axis=1)]).T\n", "center_of_Q = np.array([Q.mean(axis=1)]).T\n", "P_centered_outliers = P_outliers - center_of_P_outliers\n", "Q_centered = Q - center_of_Q" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "scrolled": false }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-04-18T23:08:56.742404\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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lJHflMMUQrQwixcv5tFHH23qYdRbgwMsVVVTVFXdf/XjAuAY0BqYAiy5etoSYGpDn0sI0fz07t0bjUZDUlISAEN7tWXVCwkM7d0WgCKTmaf++w3vfC417oRoKa4vBlpZcVBRPbfmYCmK0gHoB+wColRVTbl6KBWIquKaBYqi7FUUZW9GRoY7hyOEaAR+fn507dqVpKQk7HY7iqLQMcaREVBqseJn8OKfj03g9/cOb+KRCnFzWrp0KXFxcRiNRubOncu5c+cYNWoUcXFxjB49mgsXLgAwf/58fvGLXzB48GCefvrpCp+fPn2aCRMmMGDAAIYPH05ycnK56+Lj4+nWrRtffPEFACaTiZ///Of06dOHfv36udrcLF68mGnTpjFhwgS6du3K008/7RrrBx98QLdu3Rg0aBA//fST6/GMjAymT5/OwIEDGThwoOvYCy+8wP3338/IkSPp1KkTb775ZpWvu7r7bN26lb59+9K3b1/69etXrt1Pfbmt0KiiKP7Ap8CvVFXNV5RrNXBUVVUVRam0ZLyqqouAReCo5O6u8QghGk9cXBzHjx/n7NmzdO7cGYCvdp7kn5/uZOXzCfTp5Pj9ymqzk1dkIixQCpCKm8uGDRtITU116z2jo6OZMGFCteccOXKEF198ke3btxMeHk52djbz5s1z/fnf//7H448/ztq1awG4dOkS27dvR6vVMn/+/HKfjx49mrfffpuuXbuya9cuHnnkEb799lsAzp07x+7duzl9+jS33347p06d4t///jeKonDo0CGSk5MZN24cJ06cAODgwYMcOHAAb29vunfvzmOPPYZOp+P5559n3759BAUFcfvtt9OvXz8AnnjiCX79619z6623cuHCBcaPH8+xY8cASE5O5rvvvqOgoIDu3bvz8MMPc+LEiQqvu7r7vPbaa/z73/9m2LBhFBYWYjBU0RuyDtwSYCmKoscRXC1XVXXN1YfTFEWJUVU1RVGUGEC2Eglxg+rWrRsGg4HExERXgNWzfTi39GqLzW53nffU25vIyivhf89MQaeVTcxCeNq3335LQkIC4eGO3b2hoaHs2LGDNWscP6rnzp1bbgYpISEBrVZb4fPCwkK2b99OQkKC61hpaanr45kzZ6LRaOjatSudOnUiOTmZbdu28dhjjwHQo0cP2rdv7wqwRo8eTVCQo/tDbGws58+fJzMzk5EjRxIREQHArFmzXOdv3ryZo0ePup4vPz+fwkJHCZhJkybh7e2Nt7c3kZGRpKWlVfq6q7vPsGHD+M1vfsO9997LtGnTaNOmTf3f9KsaHGApjqmq94Fjqqq+UebQemAe8MrVv6vvECmEaLF0Oh29evUiMTGR0tJSvL296RgTwgvzR5Y7b8qwHpjMVqnyLm46Nc00NRd+fn6Vfm632wkODubgwYOVXld21aqyz6/n7e3t+lir1daY42W329m5c2elM0t1uVdV93n22WeZNGkSX331FcOGDWPjxo306NGj2jHVxB2/Qg4D5gKjFEU5ePXPHTgCq7GKopwExlz9XAhxg+rbty9Wq9U1be90OTOfz350PDaybwcmDOqCoig0p0bzQtyoRo0axapVq8jKygIgOzuboUOHsmLFCgCWL1/O8OE150cGBgbSsWNHVq1aBYCqquXKs6xatQq73c7p06c5c+YM3bt3Z/jw4SxfvhyAEydOcOHCBbp3717lcwwePJitW7eSlZWFxWJxPRfAuHHjeOutt1yfVxXoVfe6q7vP6dOn6dOnD8888wwDBw505Zc1hDt2EW5TVVVRVTVOVdW+V/98papqlqqqo1VV7aqq6hhVVbMbPFohRLPVunVrQkNDy33TBVj1/VHeWLWD3EKT67HvD57jF298gdlia+xhCnFT6dWrF8899xy33XYbRqOR3/zmN7z11lt88MEHxMXFsWzZMv75z3/W6l7Lly/n/fffx2g00qtXL9atu7Yw1a5dOwYNGsTEiRN5++23MRgMPPLII9jtdvr06cOsWbNYvHhxudmm68XExPDCCy9wyy23MGzYMHr27Ok69uabb7J3717i4uKIjY3l7bffrvPrru4+//jHP+jduzdxcXHo9XomTpxYq/ekOkpz+i0yPj5e3btXtnIL0VL98MMPfPfddzzxxBMEBwcDkF9UislsJTLk2tLDtkMXeO/L/fztF2OJCPar4m5CtGzHjh0rFyTcqObPn8+dd97JjBkzmnooHlXZv6eiKPtUVY2v7HzJMhVCuE1cXBwAhw4dcj0W6OftCq5KLY7ciFv7tON/T0+R4EoIccOSAEsI4TbBwcG0b9+exMTECjlWr368jUf/8ZXrcY1GoaTUwjuf78VkliKGQrRUixcvvuFnr+pDAiwhhFsZjUaysrK4cuVKucd7tosgvnsrbPZrgdex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\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "correspondences = get_correspondence_indices(P_centered_outliers, Q_centered)\n", "ax = plot_data(P_centered_outliers, Q_centered,\n", " label_1='P centered',\n", " label_2='Q centered')\n", "draw_correspondeces(P_centered_outliers, Q_centered, correspondences, ax)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## We cannot just run our methods without modification\n", "If we try to run any of the methods above without modification, they will fail as the outliers will \"drag\" the solution away from the one that looks visually the best. That is because the outliers generate quite a big error that becomes part of the optimization process, which tries to satisfy these new constraints.\n", "\n", "#### Let's see what will happen if we just use the vanilla point-to-point ICP" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "scrolled": false }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-04-18T23:08:57.492605\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlYAAAD5CAYAAADlcHsNAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAxiUlEQVR4nO3deXiU9bn/8fedZLJvJIGwBExYFNlkiYgbJmqtWwXrUrG12NZiW62o9Vf1nJ7W9mhra+tutXhsq62ainupG1VSBEHLpqzKKibsYU1C9u/vj3nASIFMMjOZJPN5XVeumXm2ued2TD48y/cx5xwiIiIiEryYSBcgIiIi0lUoWImIiIiEiIKViIiISIgoWImIiIiEiIKViIiISIgoWImIiIiESFygC5pZLLAAKHfOXWhmBUAJkA0sBK5yztWZWQLwFDAGqAC+5pzbcLRt5+TkuPz8/LZ9glaoqqoiJSUl7O8TjdTb8FFvw0v9DR/1NrzU3/BpqbcLFy7c4Zzrfrh5AQcrYCqwEkj3Xv8auM85V2JmjwHfAR71Hnc55waa2RXecl872obz8/NZsGBBK0ppm9LSUoqKisL+PtFIvQ0f9Ta81N/wUW/DS/0Nn5Z6a2afHmleQIcCzSwPuAD4P++1AWcCz3uLPAlM9J5P8F7jzT/LW15ERESkS7NARl43s+eBXwFpwC3A1cB859xAb35f4HXn3DAzWwac65wr8+atBU5yzu04ZJtTgCkAubm5Y0pKSkL2oY6ksrKS1NTUsL9PNFJvw0e9DS/1N3zU2/BSf8Onpd4WFxcvdM4VHm5ei4cCzexCYJtzbqGZFbW1yEM556YB0wAKCwtde+zO1G7T8FFvw0e9DS/1N3zU2/BSf8MnmN4Gco7VqcBFZnY+kIj/HKsHgEwzi3PONQB5QLm3fDnQFygzszggA/9J7CIiItKJ1NfXU1ZWRk1NTaRLaVcZGRmsXLmSxMRE8vLy8Pl8Aa/bYrByzt0O3A7g7bG6xTn3dTObDlyK/8rAycAr3iqveq/nefPfcbrTs4iISKdTVlZGWloa+fn5RNPp0vv27SM1NZWKigrKysooKCgIeN1gxrG6FbjZzNbgH3LhCW/6E0C2N/1m4LYg3kNEREQipKamhuzs7KgKVQeYGdnZ2a3eW9ea4RZwzpUCpd7zdcDYwyxTA1zWqipERESkQ4rGUHVAWz57q4JVZ7V5z36efX8jveubIl2KiIiIdGFRcUubqtpGHnxnDev2KFiJiIh0ZldffTXPP//8f0zftGkTl1566Rembd68mYEDBzJ69Gj27dt3cHp1dTUXXHABgwcPZujQodx2W+jOWoqKYNUvK5kYg61VClYiIiJdUe/evb8QuPbt28fEiRP59a9/zeTJk7n00kupr68/OP+WW25h1apVLF68mLlz5/L666+HpI6oCFbxcTH06ZbE1moFKxERkc7kqaeeYsSIEZxwwglcddVVAMyePZtTTjmF/v37HwxTGzZsYNiwYYB/mIhJkyZx6623cskllzB16lQuuugivvvd7wKQnJxMcXExAPHx8YwePZqysrKQ1BsV51gBFOSksnGLhtMSERFpi5//fTkrNu0N6TaH9E7nZ18ZesT5y5cv58477+S9994jJyeHnTt3cvPNN7N582bmzJnDqlWruOiii/7jEKDP52PGjBlfmHbdddcd9j12797N3//+d6ZOnRr8ByJK9lgBFGQns7W6CQ2pJSIi0jm88847XHbZZeTk5ACQlZUFwMSJE4mJiWHIkCFs3bq1zdtvaGhg0qRJ3HDDDfTv3z8kNUfRHqsU9jfAjso6uqclRLocERGRTuVoe5baW0LC53/Hg9lhMmXKFAYNGsSNN94Ygqr8omaPVX5OCgAbKqoiXImIiIgE4swzz2T69OlUVPhP5dm5c2fItv2Tn/yEPXv2cP/994dsmxBFe6z65/jvUr1+RxUn5mdFuBoRERFpydChQ/nv//5vzjjjDGJjYxk1alRItltWVsZdd93F4MGDGT16NADXX38911xzTdDbjppg1TszkVjzBysRERHpHCZPnszkyZOPOL+yshKA/Px8li1bFtA28/LywnbOddQcCoyLjaFHsrFBwUpERETCJGqCFUBucoz2WImIiEjYRFWw6plibKiooqlJQy6IiIgEIpqHKWrLZ4+qYJWbHENNfRNb9tZEuhQREZEOLzExkYqKiqgMV845KioqSExMbNV6UXPyOkBuij9HbthRRe/MpAhXIyIi0rHl5eVRVlbG9u3bI11Ku6qpqSExMZHExETy8vJatW5UBaueKQbAuh1VnDIwJ8LViIiIdGw+n4+CgoJIl9HuSktL2zy0Q1QdCsxMMBJ9MboyUERERMIiqoJVjBn52Sm6MlBERETCIqqCFfjv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\n" }, "metadata": { "needs_background": "light" } }, { "output_type": "execute_result", "data": { "text/plain": [ "" ], "text/html": "\n\n\n\n\n\n
\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n
\n
\n
\n\n\n\n" }, "metadata": {}, "execution_count": 24 } ], "source": [ "P_values, chi_values, corresp_values = icp_least_squares(P_outliers, Q)\n", "plot_values(chi_values, label=\"chi^2\")\n", "animate_results(P_values, Q, corresp_values, xlim=(-5, 35), ylim=(-10, 30))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### What about the point-to-plane ICP?" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "scrolled": false }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-04-18T23:09:01.072325\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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\n" }, "metadata": { "needs_background": "light" } }, { "output_type": "execute_result", "data": { "text/plain": [ "" ], "text/html": "\n\n\n\n\n\n
\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n
\n
\n
\n\n\n\n" }, "metadata": {}, "execution_count": 25 } ], "source": [ "P_values, chi_values, corresp_values = icp_normal(P_outliers, Q, Q_normals, iterations=30)\n", "plot_values(chi_values, label=\"chi^2\")\n", "animate_results(P_values, Q, corresp_values, xlim=(-5, 35), ylim=(-10, 30))" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-04-18T23:09:05.313241\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlkAAAD7CAYAAABZs4GLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAtrklEQVR4nO3deXxU9b3/8ddnZrKwhLAHJGgCqCC7BkTjEtTihtjeuuBWkCrV0l7b2mq9/f1q29vea3v9XbdKKyJq1YrWWmu1arUyKpsIihu4sEQMKJuyBMk6n98fGWiAxExIJieTvJ+PRx4z58z5znmHr+jbc86cMXdHRERERJpXKOgAIiIiIm2RSpaIiIhIEqhkiYiIiCSBSpaIiIhIEqhkiYiIiCSBSpaIiIhIEkQS2cjMioGdQDVQ5e4FZvY/wDlABbAauNzdtyUytlmSi4iIiLRilsh9suJFqcDdt9RaNwF40d2rzOzXAO5+fSJjRURERNq6hI5k1cXd/1FrcTFwXtPj1OjZs6fn5eU119vVadeuXXTq1Cmp+5Dk0hymNs1f6tMcpj7NYfNYtmzZFnfvtf/6REuWA/8wMwfucvdZ+70+DXjkIMcCYGbTgekAOTk53HzzzQlGOzilpaV07tw5qfuQ5NIcpjbNX+rTHKY+zWHzGD9+/Ed1rU/0dGE/d19vZr2B54HvuvvL8dd+AhQA/+Z1vNmXja1PQUGBL126tMFcTRGNRikqKkrqPiS5NIepTfOX+jSHqU9z2DzMbFld15wn9OlCd18ff9wE/AUYG3/TqcBE4JK6CtaXjRURERFpyxosWWbWycyy9jwHJgDvmNkZwHXAJHf/ojFjmyu8iIiISGuVyDVZOcBfzGzP9n9092fNbBWQATwff22xu19lZocAs939rPrGJuH3EBERabMqKyspKSmhrKysWd83OzublStXNut7tmWZmZnk5uaSlpaW0PYNlix3XwOMrGP9oHq23wCc9WVjRUREJHElJSVkZWWRl5dH/MBFs9i5cydZWVnN9n5tmbuzdetWSkpKyM/PT2iM7vguIiLSypWVldGjR49mLVjSOGZGjx49GnU0USVLREQkBahgBa+xc9DuSlYs5jz62se8+klV0FFERESkDWt3JcsM5r62jkffr6CyOhZ0HBERkZRgZlx77bV7l2+++WZ+9rOfBReoHkVFRST7XpuJaocly5gxfhBby5wnl28IOo6IiEhKyMjI4PHHH2fLloP7KuKqqvZ3BqndlSyAUwb3pn9WiJnRVcRiDd/xXkREpL2LRCJMnz6dW2655YDXiouLOeWUUxgxYgSnnnoq69atA2Dq1KlcddVVHHvssVx33XVMnTqVq6++mnHjxjFgwACi0SjTpk1jyJAhTJ069YD3ffbZZzn//PP3LkejUSZOnAjA1VdfTUFBAUOHDuXGG2+sM3Ptrwx67LHH9u5j8+bNfP3rX2fMmDGMGTOGBQsWAPDSSy8xatQoRo0axejRo9m5c+dB/VntcdBfEJ3KzIyzB6Tx+zd38dy7n3Lm8L5BRxIREUnIz//2Lis27GiW96quriYcDnPUIV248ZyhDW4/Y8YMRowYwXXXXbfP+u9+97tMmTKFKVOmMGfOHP793/+dJ554Aqi5/cTChQsJh8NMnTqVzz//nEWLFvHkk08yadIkFixYwOzZsxkzZgzLly9n1KhRe9/3tNNOY/r06Xu/yPqRRx5h8uTJAPzqV7+ie/fuVFdXc+qpp/LWW28xYsSIhH7va665hu9///uccMIJrFu3jtNPP52VK1dy8803c+edd1JYWEhpaSmZmZmJ/UHWo10eyQIY2ydMXo+O3BldRSLf3ygiItLedenShW984xvcfvvt+6xftGgRF198MQCXXXYZ8+fP3/va+eefTzgc3rt8zjnnYGYMHz6cnJwchg8fTigUYujQoRQXF+/zvpFIhDPOOIO//e1vVFVV8fTTT3PuuecC8Oijj3L00UczevRo3n33XVasWJHw7/HCCy/wne98h1GjRjFp0iR27NhBaWkphYWF/OAHP+D2229n27ZtRCJNOxbVLo9kAYTMuLpoANf/+W1e/nALJx/RK+hIIiIiDUrkiFOiDuZmpN/73vc4+uijufzyyxPavlOnTvssZ2RkABAKhfY+37Nc13VbkydP5re//S3du3enoKCArKws1q5dy80338xrr71Gt27dmDp1ap33r6p9y4Xar8diMRYvXnzAkaof//jHnH322fz973+nsLCQ5557jsGDByf0e9al3R7JAvja6Fz6Zmdy57xVQUcRERFJCd27d+eCCy7gnnvu2bvu+OOPZ+7cuQA89NBDnHjiic22v5NPPpnXX3+du+++e++pwh07dtCpUyeys7PZuHEjzzzzTJ1jc3JyWLly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\n" }, "metadata": { "needs_background": "light" } }, { "output_type": "execute_result", "data": { "text/plain": [ "" ], "text/html": "\n\n\n\n\n\n
\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n
\n
\n
\n\n\n\n" }, "metadata": {}, "execution_count": 26 } ], "source": [ "P_values, norm_values, corresp_values = icp_svd(P_outliers, Q)\n", "plot_values(norm_values, label=\"Norm values\")\n", "animate_results(P_values, Q, corresp_values, xlim=(-5, 35), ylim=(-10, 30))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### All three methods fail without an adaptation\n", "As we can see, all methods failed to converge to a good-looking solution just as we have predicted. So what can we do about it?\n", "\n", "## Robust kernels to give outliers less weight\n", "There is a notion of \"robust kernels\" that are usually used for dealing with outliers. The idea is simple: we want to reduce the influence of the data that we deem \"bad\" on the final solution. There is a lot of different kernels that one might use and looking at all of them is beyong the scope of this notebook.\n", "\n", "#### Let's see them in practice\n", "In this example, I will use an extremely simple kernel (not the best in general, but quite good for the sake of example). The kernel takes in the value of an error and returns a weight of $1$ if the error is below threshold and $0$ if it is above. Basically, it is a way of saying \"I don't care about anything that is way too far away\". Usually a less strict version of the kernel is used, but the idea is similar." ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "scrolled": false }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-04-18T23:09:07.233613\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "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\n" }, "metadata": { "needs_background": "light" } }, { "output_type": "execute_result", "data": { "text/plain": [ "" ], "text/html": "\n\n\n\n\n\n
\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n
\n
\n
\n\n\n\n" }, "metadata": {}, "execution_count": 27 } ], "source": [ "from functools import partial\n", "def kernel(threshold, error):\n", " if np.linalg.norm(error) < threshold:\n", " return 1.0\n", " return 0.0\n", "\n", "P_values, chi_values, corresp_values = icp_least_squares(\n", " P_outliers, Q, kernel=partial(kernel, 10))\n", "plot_values(chi_values, label=\"chi^2\")\n", "animate_results(P_values, Q, corresp_values, xlim=(-5, 35), ylim=(-10, 30))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Yay!\n", "We can see that our trick has worked! The kernel downweighted the outliers and while they still have a correspondence, because they generate way too big of an error we disregard them in the optimization." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Can we remove outliers using ICP based on SVD?\n", "Yes and no. SVD-based ICP has two steps: centering the data using its mean and optimizing the rotation. Let's looks at both starting with the rotational part.\n", "\n", "#### Rotational part\n", "It is relatively simple to remove the outliers during the rotation optimization. Each point contributes to the update of the cross-covariance matrix. We can weight this contribution based on the provided kernel. With the kernel presented above we can exclude points that are too far apart from contributing to the update of the cross-covariance matrix, thus, removing them from the optimization. \n", "\n", "#### Translational part\n", "This is the tricky part. As centering the data happens *before* we estimate correspondences and we define the outliers by the length of the correspondence, there is no way to know which of the data points are outliers. If we do nothing about it, we will *always* have a drift after the optimization. I don't know a nice solution to this, but we can apply a hacky one. We could do the following:\n", "- Find the first mean as if there were no outliers\n", "- While performing rotation on that iteration, mark the points that are outliers (now we have correspondences and can do this)\n", "- Apply the found rotation and translation\n", "- Repeat the procedure excluding the marked outlier points from computing the mean.\n", "\n", "#### Let's see how this trick performs:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "
", "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-04-18T23:09:10.304225\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlAAAAD4CAYAAAAjMtjvAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAnNUlEQVR4nO3deXxV9bnv8c+TgQSSEEAkYLYKFQuKQCaUitQEWycQldTW2lqxx3LqbZW2tlrvOfd4es7pbXvrbRXraUsdbgdPo4fBKorWVlPFmTApBAcENYAylCkMgSTP/SMbDBjI3rB31l473/frxSt7TXt9w/MqffyttX7L3B0RERERiV1G0AFEREREwkYNlIiIiEic1ECJiIiIxEkNlIiIiEic1ECJiIiIxCmrK0/Wv39/Hzx4cFLPsXPnTvLy8pJ6Dkku1TD8VMNwU/3CTzVMjLq6uk3ufnxH27q0gRo8eDALFy5M6jlqa2uprKxM6jkkuVTD8FMNw031Cz/VMDHM7N3DbdMlPBEREZE4qYESERERiVNMl/DMbA2wA2gBmt29wsx+ClwC7AVWAde6+9Yk5RQRERFJGfHcA1Xl7pvaLT8F3OruzWb2E+BW4JaEphMREUlj+/bto6GhgT179iT0ewsLC6mvr0/od6az3NxcIpEI2dnZMR9z1DeRu/uf2y2+BHzuaL9LRESkO2poaKCgoIDBgwdjZgn73h07dlBQUJCw70tn7s7mzZtpaGhgyJAhMR9nsbxM2MxWA1sAB37t7jMP2f4o8KC7/6GDY6cB0wCKiorKa2pqYg53NBobG8nPz0/qOSS5VMPwUw3DTfXrOoWFhZxyyikJbZ4AWlpayMzMTOh3pjN3Z9WqVWzbtu2g9VVVVXXuXtHRMbGOQJ3j7mvNbADwlJmtdPdnAczsn4Bm4IHDhJoJzASoqKjwZD9WqUc3w081DD/VMNxUv65TX19P7969E/69GoGKX25uLqWlpTHvH9NTeO6+NvpzAzAXOBPAzKYCk4AveSxDWUm2rGErD72xlxSIIiIiImms0wbKzPLMrGD/Z+B84HUzuxC4GZjs7ruSGzM2y9dt5/HV+1jWsK3znUVERAQz46abbjqwfPvtt/Ov//qvwQU6jMrKyqRPxh2PWEagioAFZrYUeAV4zN2fAH4BFNB2SW+Jmf0qiTljMnHUILIzYPaihqCjiIiIhEJOTg5z5sxh06ZNne/cgebm5gQnCodOGyh3f8fdR0f/jHD3H0bXD3X3E929JPrn68mPe2S9c7MpG5DJI0vX0dTcEnQcERGRlJeVlcW0adP4+c9//rFta9asYcKECYwaNYrzzjuP9957D4CpU6fy9a9/nbPOOoubb76ZqVOncv311zN27Fg+8YlPUFtby1e/+lVOO+00pk6d+rHvfeKJJ7jiiisOLNfW1jJp0iQArr/+eioqKhgxYgS33XZbh5nbP+Qwa9asA+fYuHEj1dXVjBkzhjFjxvD8888D8Le//Y2SkhJKSkooLS1lx44dR/V31V6XvguvK4wrzuLlD5p4ZuUGLjxjUNBxREREYvKDR5ezYt32hHzX/qfwTj+hN7ddMqLT/b/xjW8watQobr755oPW33DDDVxzzTVcc8013Hfffdx44408/PDDQNsUDC+88AKZmZlMnTqVLVu28OKLL/LII48wefJknn/+ee655x7GjBnDkiVLKCkpOfC9n/nMZ5g2bdqBlx4/+OCDXHnllQD88Ic/pF+/frS0tHDeeeexbNkyRo0aFdPvPX36dL797W9zzjnn8N5773HBBRdQX1/P7bffzt133824ceNobGwkNzc3tr/II0i7V7mc0T+TAQU5zKpbG3QUERGRUOjduzdf+cpXmDFjxkHrX3zxRa666ioArr76ahYsWHBg2xVXXHHQVAmXXHIJZsbIkSMpKipi5MiRZGRkMGLECNasWXPQ92ZlZXHhhRfy6KOP0tzczGOPPcall14KwEMPPURZWRmlpaUsX76cFStWxPx7/OUvf+Gb3/wmJSUlTJ48me3bt9PY2Mi4ceP4zne+w4wZM9i6dStZWcc+fpR2I1AZZlxeWsy9C1azubGJ4/Jzgo4kIiLSqVhGimJ1NNMYfOtb36KsrIxrr702pv3z8vIOWs7Jafv/24yMjAOf9y93dJ/UlVdeyS9+8Qv69etHRUUFBQUFrF69mttvv51XX32Vvn37MnXq1A5naW8/b1b77a2trbz00ksfG2H6/ve/z8SJE3n88ccZN24cTz75JMOHD4/p9zyctBuBAphSFqG51Xlk6bqgo4iIiIRCv379+PznP8+99957YN3ZZ5/N/gmwH3jgAcaPH5+w85177rksWrSI3/zmNwcu323fvp28vDwKCwv58MMPmT9/fofHFhUVUV9fT2tr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\n" }, "metadata": { "needs_background": "light" } }, { "output_type": "execute_result", "data": { "text/plain": [ "" ], "text/html": "\n\n\n\n\n\n
\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n
\n
\n
\n\n\n\n" }, "metadata": {}, "execution_count": 28 } ], "source": [ "P_values, norm_values, corresp_values = icp_svd(P_outliers, Q, kernel=partial(kernel, 10))\n", "plot_values(norm_values, label=\"Norm values\")\n", "animate_results(P_values, Q, corresp_values, xlim=(-5, 35), ylim=(-10, 30))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Yay again!\n", "We can see that this trick works too! Only the first translation is affected by the outliers and the method converges to a relatively good solution." ] } ], "metadata": { "kernelspec": { "name": "python3", "display_name": "Python 3.8.5 64-bit", "metadata": { "interpreter": { "hash": "767d51c1340bd893661ea55ea3124f6de3c7a262a8b4abca0554b478b1e2ff90" } } }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5-final" } }, "nbformat": 4, "nbformat_minor": 2 }