{ "cells": [ { "cell_type": "markdown", "id": "fa4f0e49", "metadata": {}, "source": [ "\"Open" ] }, { "cell_type": "markdown", "id": "d4f185c5", "metadata": {}, "source": [ "# Pose2 iSAM\n", "\n", "The previous \"PoseSLAM\" example optimized everything in batch. One of the key features of GTSAM is that we can do incremental inference using the iSAM algorithm, as illustrated below." ] }, { "cell_type": "code", "execution_count": 1, "id": "e83de82d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "%pip -q install gtbook # also installs latest gtsam pre-release" ] }, { "cell_type": "code", "execution_count": 1, "id": "91f6cdce", "metadata": {}, "outputs": [], "source": [ "import math\n", "\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "import gtsam\n", "import gtsam.utils.plot as gtsam_plot" ] }, { "cell_type": "code", "execution_count": 2, "id": "9e0495c8", "metadata": {}, "outputs": [], "source": [ "def report_on_progress(graph: gtsam.NonlinearFactorGraph, current_estimate: gtsam.Values,\n", " key: int):\n", " \"\"\"Print and plot incremental progress of the robot for 2D Pose SLAM using iSAM2.\"\"\"\n", "\n", " # Print the current estimates computed using iSAM2.\n", " print(\"*\"*50 + f\"\\nInference after State {key+1}:\\n\")\n", " # print(current_estimate)\n", "\n", " # Compute the marginals for all states in the graph.\n", " marginals = gtsam.Marginals(graph, current_estimate)\n", "\n", " # Plot the newly updated iSAM2 inference.\n", " fig = plt.figure(0)\n", " axes = fig.gca()\n", " plt.cla()\n", "\n", " i = 1\n", " while current_estimate.exists(i):\n", " gtsam_plot.plot_pose2(0, current_estimate.atPose2(i), 0.5, marginals.marginalCovariance(i))\n", " i += 1\n", "\n", " plt.axis('equal')\n", " axes.set_xlim(-1, 5)\n", " axes.set_ylim(-1, 3)\n", " plt.pause(1)" ] }, { "cell_type": "code", "execution_count": 3, "id": "53880d30", "metadata": {}, "outputs": [], "source": [ "def determine_loop_closure(odom: np.ndarray, current_estimate: gtsam.Values,\n", " key: int, xy_tol=0.6, theta_tol=17) -> int:\n", " \"\"\"Simple brute force approach which iterates through previous states\n", " and checks for loop closure.\n", "\n", " Args:\n", " odom: Vector representing noisy odometry (x, y, theta) measurement in the body frame.\n", " current_estimate: The current estimates computed by iSAM2.\n", " key: Key corresponding to the current state estimate of the robot.\n", " xy_tol: Optional argument for the x-y measurement tolerance, in meters.\n", " theta_tol: Optional argument for the theta measurement tolerance, in degrees.\n", " Returns:\n", " k: The key of the state which is helping add the loop closure constraint.\n", " If loop closure is not found, then None is returned.\n", " \"\"\"\n", " if current_estimate:\n", " prev_est = current_estimate.atPose2(key+1)\n", " rotated_odom = prev_est.rotation().matrix() @ odom[:2]\n", " curr_xy = np.array([prev_est.x() + rotated_odom[0],\n", " prev_est.y() + rotated_odom[1]])\n", " curr_theta = prev_est.theta() + odom[2]\n", " for k in range(1, key+1):\n", " pose_xy = np.array([current_estimate.atPose2(k).x(),\n", " current_estimate.atPose2(k).y()])\n", " pose_theta = current_estimate.atPose2(k).theta()\n", " if (abs(pose_xy - curr_xy) <= xy_tol).all() and \\\n", " (abs(pose_theta - curr_theta) <= theta_tol*np.pi/180):\n", " return k\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "36ebc7b4", "metadata": {}, "outputs": [], "source": [ "# Declare the 2D translational standard deviations of the prior factor's Gaussian model, in meters.\n", "prior_xy_sigma = 0.3\n", "\n", "# Declare the 2D rotational standard deviation of the prior factor's Gaussian model, in degrees.\n", "prior_theta_sigma = 5\n", "\n", "# Declare the 2D translational standard deviations of the odometry factor's Gaussian model, in meters.\n", "odometry_xy_sigma = 0.2\n", "\n", "# Declare the 2D rotational standard deviation of the odometry factor's Gaussian model, in degrees.\n", "odometry_theta_sigma = 5\n", "\n", "# Although this example only uses linear measurements and Gaussian noise models, it is important\n", "# to note that iSAM2 can be utilized to its full potential during nonlinear optimization. This example\n", "# simply showcases how iSAM2 may be applied to a Pose2 SLAM problem.\n", "PRIOR_NOISE = gtsam.noiseModel.Diagonal.Sigmas(np.array([prior_xy_sigma,\n", " prior_xy_sigma,\n", " prior_theta_sigma*np.pi/180]))\n", "ODOMETRY_NOISE = gtsam.noiseModel.Diagonal.Sigmas(np.array([odometry_xy_sigma,\n", " odometry_xy_sigma,\n", " odometry_theta_sigma*np.pi/180]))" ] }, { "cell_type": "code", "execution_count": 5, "id": "c8e7c913", "metadata": {}, "outputs": [], "source": [ "# Create the ground truth odometry measurements of the robot during the trajectory.\n", "true_odometry = [(2, 0, 0),\n", " (2, 0, math.pi/2),\n", " (2, 0, math.pi/2),\n", " (2, 0, math.pi/2),\n", " (2, 0, math.pi/2)]\n", "\n", "# Corrupt the odometry measurements with gaussian noise to create noisy odometry measurements.\n", "odometry_measurements = [np.random.multivariate_normal(true_odom, ODOMETRY_NOISE.covariance())\n", " for true_odom in true_odometry]\n" ] }, { "cell_type": "code", "execution_count": 6, "id": "2ce8d709", "metadata": {}, "outputs": [], "source": [ "# Create iSAM2 parameters which can adjust the threshold necessary to force relinearization and how many\n", "# update calls are required to perform the relinearization.\n", "parameters = gtsam.ISAM2Params()\n", "parameters.setRelinearizeThreshold(0.1)\n", "parameters.relinearizeSkip = 1\n", "isam = gtsam.ISAM2(parameters)" ] }, { "cell_type": "markdown", "id": "2a0eb448", "metadata": {}, "source": [ "Perform 2D SLAM given the ground truth changes in pose as well as\n", "simple loop closure detection:" ] }, { "cell_type": "code", "execution_count": 7, "id": "c2defb05", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "**************************************************\n", "Inference after State 1:\n", "\n" ] }, { "data": { "image/png": "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uTMffPDBca9LJDRtaUildeDAAfr3709mZiZPP/00VapUOa6fNyvpxpJHV7VqVcaMGcP3vvc9LrvsMv75z3/SpEmJdzAWSUsqDamUiouLue666zAznnnmmeMujBN14403smPHDnr16sXixYupU6dOStcvUlbaPSWV0r333stnn33GtGnTyMgIM+HByJEj+cEPfsCVV17J/v37g2QQOV4qDal08vLyGD9+PM8++ywnnXTSsX8gScyMP/3pT5x66qnceuutwXKIHA+VhlQqxcXFDBkyhIceeojGjRsnZJmxG0yWTZUqVZg0aRKzZs3irbfeSkgekWRSaUil8uSTT1K7dm0GDRp0wssyjv9AeEnq1KnDAw88wM0330xxcXFClimSLEFLw8x6mNlaM1tvZneW8H43M9tpZgXxr9+EyCkVw8GDB7nnnnsYPXp0mc58SqZBgwZRq1YtHn/88dBRRI4q2NlTZlYFGAtcBhQCy81slru/d9jQN9y9d8oDSoUzb948mjVrRocOHUJHOYKZMXbsWC6++GKuvfZaTjnllNCRREoUckujE7De3Te6+5fA80DfgHnS3vD5wxk+f3joGOXWpEmTuP7660PHKFWbNm244IILePFF3QlQ0lfI0mgCfHzI88L4a4c7z8xWmNk8M2td2sLMbKiZ5ZlZ3rZt2xKdNS0UfFpAwacFoWOUS5999hmLFi1iwIABCV921CvCo8jNzeUvf/lLwpYnkmghS6OkncqH/+t7G2jm7u2APwMvlbYwd5/g7jnunpOZmZm4lFIhPPfcc/Tr1y+hu32ScVykV69erFu3TlOMSNoKWRqFwBmHPD8d2HzoAHf/wt2L4o/nAhlm1iB1EaWiePPNN7n00ktDxzimjIwMrr32Wp566qnQUURKFLI0lgMtzOxMM6sGDCR2w6dvmFkji/85Z2adiOXdnvKkUu6tWLGCdu3ahY4RyU9/+lNmz54dOoZIiYKdPeXuB83sFuBVoAowyd1Xm9lN8ffHA1cBPzOzg8BeYKCfyJVUUint2bOHjz76iHPOOSd0lEiys7PZuHEju3btonbt2qHjiHxL0AkL47uc5h722vhDHj8KPJrqXFKxrFq1irPPPjtpc0wl+u+YatWqce655/LOO+9w4YUXJnTZIidKV4RLhffBBx8kZSsjUVeEl6RVq1a8//77SVu+SFmpNKTCKy4u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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "**************************************************\n", "Inference after State 2:\n", "\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY0AAAEGCAYAAACZ0MnKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAoN0lEQVR4nO3de5zOdf7/8ccr5xn6SqOUs5JSOU5UazdSQiq2ovVtySGJjir1YztspS0ptnJItNrVAd+Ilg5IETnMSHLKTiKiDLU0zofX74+5prUafIzruj5zzTzvt9vc5jq85/1+Xaud57w/n/fn/TF3R0REJIiTwi5AREQSh0JDREQCU2iIiEhgCg0REQlMoSEiIoEVDbuAWEhJSfFq1aqFXYaISMJIT0/f4u7lj9WuQIZGtWrVSEtLC7sMEZGEYWbrgrTT4SkREQlMoSEiIoEpNEREJDCFhoiIBKbQEBGRwBQaIiISmEJDREQCU2iIiEhgCg0REQlMoSEiIoEpNEREJDCFhoiIBKbQEBGRwBQaIiISmEJDREQCU2iIiEhgCg0REQlMoSEiIoEpNEREJDCFhoiIBBZaaJhZZTObZWYrzWy5md2dS5umZrbNzJZEvh4Jo1YREclWNMSx9wP3uftiMysDpJvZdHdfcVi7Oe7eJoT6RETkMKHNNNx9k7svjjz+GVgJVAyrHhERObZ8cU7DzKoB9YEFubx9iZl9YWbvmdn5R+mjh5mlmVlaZmZmrEoVESnUQg8NMysNvA3c4+7bD3t7MVDV3esCLwLvHKkfdx/p7qnunlq+fPmY1SsiUpiFGhpmVozswHjd3Sce/r67b3f3rMjjaUAxM0uJc5kiIhIR5uopA0YDK939+SO0qRBph5k1IrverfGrUkREDhXm6qnfAH8EvjSzJZHX+gFVANx9BHADcLuZ7Qd2ATe5u4dQq4iIEGJouPungB2jzUvAS/GpSEREjiX0E+EiIpI4FBoiIhKYQkNERAJTaIiISGAKDRERCUyhISIigSk0REQkMIWGiIgEptAQEZHAFBoiIhKYQkNERAJTaIiISGAKDRERCUyhISIigSk0REQkMIWGiIgEptAQEZHAFBoiIhKYQkNERAILLTTMrLKZzTKzlWa23MzuzqWNmdkLZpZhZkvNrEEYtYqISLaiIY69H7jP3RebWRkg3cymu/uKQ9q0AmpGvhoDwyPfRUQkBKHNNNx9k7svjjz+GVgJVDys2XXA3z3bfKCsmZ0R51JFRCQiX5zTMLNqQH1gwWFvVQTWH/J8A78Olpw+ephZmpmlZWZmxqROEZHCLvTQMLPSwNvAPe6+/fC3c/kRz60fdx/p7qnunlq+fPlolykiIoQcGmZWjOzAeN3dJ+bSZANQ+ZDnlYCN8ahNRER+LczVUwaMBla6+/NHaDYF6BRZRXUxsM3dN8WtSBER+S9hrp76DfBH4EszWxJ5rR9QBcDdRwDTgNZABrAT6BL/MkVEJEdooeHun5L7OYtD2zjQOz4ViYjIsYR+IlxERBKHQkNERAJTaIiISGAKDRERCUyhISIigSk0REQkMIWGiIgEptAQEZHAFBoiIhKYQkNERAJTaIiISGAKDRERCUyhISIigSk0REQkMIWGiIgEptAQEZHAFBoiIhKYQkNERAJTaIiISGChhoaZvWpmm81s2RHeb2pm28xsSeTrkXjXKCIi/1E05PHHAC8Bfz9Kmznu3iY+5YiIyNGEOtNw99nAj2HWICIiwSXCOY1LzOwLM3vPzM4/UiMz62FmaWaWlpmZGc/6REQKjfweGouBqu5eF3gReOdIDd19pLununtq+fLl41WfiEihkq9Dw923u3tW5PE0oJiZpYRclohIoZWvQ8PMKpiZRR43IrvereFWJSJSeIW6esrM3gSaAilmtgF4FCgG4O4jgBuA281sP7ALuMndPaRyRUQKvVBDw93/cIz3XyJ7Sa6IiOQD+frwlIiI5C8KDRERCUyhISIigSk0REQkMIWGiIgEptAQEZHAFBoiIhKYQkNERAJTaIiISGAKDRERCeyYoWFmN5pZmcjjP5nZRDNrEPvSREQkvwky03jY3X82sybAVcBrwPDYliUiIvlRkA0LD0S+Xw0Md/fJZvZY7EoSETlx+/btY/Xq1Xz77bd8//337Nixg8qVK1O9enWqVavGySefHHaJCSlIaHxnZi8DVwDPmFkJdC5ERPKhLVu2MHr0aMaPH8/KlSupVKkS1atXp0KFCiQlJfH+++/zzTffsHbtWkqWLMm5555Lx44d6dixI6ecckrY5SeEIKHRHmgJDHL3f5vZGcADsS1LRCS49PR0XnrpJd555x3atWvHkCFDaNCgAcnJybm2d3cyMzNZvHgxY8aMoX///lxzzTXceuut/Pa3vyVy7zfJhR3pnkZmdrK7bzezcrm97+4/xrSyE5CamuppaWlhlyEiMZaRkUHXrl1Zt24dvXr1olu3bqSkHP8dobds2cLYsWN55ZVXMDNGjRrFxRdfHIOK8y8zS3f31GO1O9phpjci39OBtMj39EOei4iE5v/+7/+49NJLufHGG1mzZg0PPvhgngIDICUlhXvuuYdly5bx6KOP0rZtW/r168eePXuiXHXiO+JMI5FppiFScO3Zs4f777+fadOmMX78eBo2bBj1MX744Qd69uzJ119/zWuvvUb9+vWjPkZ+E42ZRk5H3Q57XsTMHj2R4kRE8mLz5s00adKE7777jvT09JgEBsDpp5/OxIkTeeCBB7jqqqt44YUXYjJOIgqyCqq5mU0zszPM7EJgPlAmGoOb2atmttnMlh3hfTOzF8wsw8yW6qJCkcJr9+7dtG3blubNm/P2229TtmzZ4+vg2WchORkOHDh2W8DM+OMf/8iiRYsYOnQojz/+OAXxyMzxOubqKXfvaGYdgC+BncAf3H1ulMYfA7wE/P0I77cCaka+GpN9UWHjKI0tIgnC3enWrRuVK1fmqaeeytvqppNOgp07s7/KBP+7t2rVqnzyySdceeWV7NmzhwEDBhz/2AVIkMNTNYG7gbeBtcAfzSwpGoO7+2zgaKuwrgP+7tnmA2UjS35FpBB58sknycjIYMyYMZx0Uh4vE8tZfrtjx3H/aIUKFZg1axaTJk1i0KBBeRu/gAhynca7QG93n2nZ8d4HWAScH9PKslUE1h/yfEPktU2HNzSzHkAPgCpVqsShNBGJh3HjxjFq1CgWLFhAqVKl8t5R6dLZ37Oy8vTjKSkpfPjhhzRp0oSUlBRuueWWvNeSwIKERiN33w7g2Qf0njOzKbEt6xe5zUFzPajo7iOBkZC9eiqWRYlIfGzatInevXszY8YMKlSocGKd5cw08hgaAJUqVeL999+nSZMmNG7cmPPOO+/EakpAQc5pbDezC4DaQMlD3vpXzKr6jw1A5UOeVwI2xmFcEckHHnzwQbp37069evVOvLOcmUYeDk8d6txzz+XJJ5+kc+fOzJs3j6JFg/ztXXAEOafxKPBi5KsZMBC4NsZ15ZgCdIqsoroY2Obuvzo0JSIFz/z58/noo4/405/+FJ0OozDTyHHbbbdRtmxZnnnmmRPuK9EEicgbgLrA5+7excxOB0ZFY3AzexNoCqSY2QbgUaAYgLuPAKYBrYEMsldudYnGuCKS//Xv35/HHnuM0jkzhBMVpZkGZC/HHT16NA0aNKBNmzbUrVv3hPtMFEFCY5e7HzSz/WZ2MrAZqBGNwd39D8d434He0RhLRBLHxx9/zNq1a+ncuXP0Oo3iTAOgcuXKPPvss3Tq1IlFixZRvHjxqPSb3wVZu5ZmZmWBV8jed2oxsDCWRYlI4fb000/zpz/9iWLFikWv0yjONHJ07tyZihUrMnx44bkv3TFDw917ufu/I4eLrgQ6u7sOE4lITGRmZvLZZ5/RoUOH6HYc5ZkGZB+meuyxx3j++efZt29f1PrNz47rKhl3X+vuS2NVjIjIpEmTaNmyJUlJUbmG+D9y+otiaAA0atSIGjVqMG7cuKj2m1/pDnwix2nvgb0M/mww6RvTwy6lQJowYQLt27ePfscnnZQ924ji4akcDz74IAMHDiwUe1MdMTQimxRWi2MtIglhz/499PmwDx+v/TjsUgqczMxMFi5cSKtWrWIzQHJy1GcaAFdddRUnnXQS7733XtT7zm+ONtMYA3xoZv3NLIpno0REcjdp0iRatWoV/UNTOUqXjslMw8zo27cvAwcOjHrf+c0RQ8PdxwP1gZPJXkF1v5n1yfmKW4UiUmhMnjyZ66+/PnYDxGimAdC+fXtWr17NV199FZP+84tjXaexD9gBlCD7HhoHY16RSD6yY8cO0tPTSU9PZ/Xq1axdu5aDRQ9CKrz55pusfm011atXp2nTpjRs2DC6S0QLoS+//JLU1GPePC7vYjTTAChatCht2rRh2rRp1KpVKyZj5AdHO6fRElgCJAEN3P1Rd/9zzle8ChSJt4MHD/Lee+9xzTXXcNppp9G3b1/WrFnD+eefT+/evenWPftmlmfXPJv69evz/fff07NnT1JSUmjVqhVDhgxh+/btIX+KxLN9+3a2bt1K1apVYzdIDGcaAFdffTVTp06NWf/5wdFmGv2BG919ebyKEQnTtm3bGDlyJMOHD+eUU06hd+/ejBs37lfH17P2ZsESSE1NpeelPX95fevWrcyePZvx48czYMAAevfuzV133UW5cuXi/EkS06pVq6hVq1be75cRROnS8MMPMeu+efPm3Hzzzfz888+UOY4bPSWSo53T+K0CQwqLmTNnUqdOHT7//HPeeust0tLS6Nq163GdkD311FNp164db775JvPmzWP9+vXUrFmT/v37s2vXrhhWXzCsXLky9luNx2jJbY7SpUtzySWXMGPGjJiNETZdpyGF2s6dO7n77rvp3LkzL7/8Mm+88QaNGjXK2+1ED1GzZk1Gjx7N4sWL+de//sVFF13E0qW6LvZoVqxYQe3atWM7SOnSMT08BQX/EJVCQwqtb7/9loYNG5KZmcnSpUtp2bJl1MeoWrUq48aN44EHHqB58+a8+eabUR+joFixYkXCzzQgOzQK8vUaCg0plDZt2kTz5s3p0aMHb7zxRp7OOwS9+tfM6Ny5MzNnzqRfv348/vjjxz1WYbBly5YTvzvfseSsnjoYu4WgZ511Frt27SIzMzNmY4RJoSGFTmZmJldccQVdunTh3nvvPe6ft1zvQnxsderUYcGCBYwdO7ZQ7Yoa1IEDByhSpEhsB8nZ6XbnzpgNYWacd955rFixImZjhEmhIYXK9u3badGiBe3ataNfv35xH/+0007jvffe44knnmDy5MlxHz8/O3jwYOxDI2en2xgfoqpdu7ZCQ6QguPfee6lfvz5PPPFEaDWcddZZTJkyhVtvvZV58+aFVkd+c+DAgdgut4X/zDRifDL8nHPOISMjI6ZjhEWhIYXG1KlT+eijj/jrX/96wqujTlRqaipjxoyhQ4cOZMX4F1iiiMvhqTjNNCpXrsz69etjOkZYFBpSKOzatYs777yTkSNHRu2iK+fEtsFu3bo1zZo1C3XWk5/E+vCUu7MrqRhbkmDP9h9jNg4U7NAIco/wmIlsVfJXoAgwyt2fPuz9psBk4JvISxPdXUtP5Lg9//zz1K9fnyuvvPKE+4rmLGXgwIFceOGF3HLLLbFfbprPHTx4EDPL/uW+fxc79u4ga28WWXuz2LEv+3HOaznPj/jaEdof9IPQFz7cNJ8raRqzz1KxYkU2btwYs/7DFFpomFkRYCjZt5DdACwysynufvjZoznu3ibuBUqBsW/fPl588UU++eSTsEv5lQoVKvDwww9z5513Mn369NAPm8Xb5h2bafGPFmTtzeLbtt9y0aSL2P1/u49rFleiSAlKFy9N6eKlSS6enP29WDKVT66c/bzYIa/vOUjpZas5p/ZvY/ipoEiRIhyM4bLeMIU502gEZLj7GgAzewu4DiiYSw6i4J737wFgSMshodaRaP75z39yzjnn5NudR3v16sWIESOYNWsWl19+edjlxFXJoiWpVrYaycWTYQ3UPK0mF9W9iORiybkGweHPk4snU/Sk4/w1FqP7Ox0qLif1QxJmaFQEDj3otwFonEu7S8zsC2AjcP+R9sMysx5AD4AqVapEudT8Ycn3S8IuISGNGjWK7t27h13GERUtWpTbbruNMWPGFLrQOLnEybxz0zsA9J3fl3K7y/FQs4fCLSoK4nJSPyRhRmFu8/DD56SLgaruXhd4EXjnSJ25+0h3T3X31PLly0evSklo69ev57PPPuOGG26Iet/RvB90x44dmTJlSqHeUr169ep8/fXXYZcRFXG55iQkYYbGBqDyIc8rkT2b+IW7b3f3rMjjaUAxM0uJX4mS6CZPnkzbtm2jevvQvF4RfjTly5enWbNmTJgwIep9J4rzzjuPlStXhl1GVBTkw1NhfqpFQE0zq25mxYGbgCmHNjCzChY5M2hmjciud2vcK5WEtWTJEho1ahR2GYHccsstvPbaa2GXEZqcq6ijOYMLiw5PxYC77wfuAD4AVgLj3X25mfU0s5w729wALIuc03gBuMkLwn9REjdLliyhXr16YZcRSIsWLUhPT2f37t1hlxKK8uXLU6RIEb777ruwSzlhWVlZUZ3d5iehzp/cfZq7n+PuZ7n7gMhrI9x9ROTxS+5+vrvXdfeL3V17Lkhg+/btY+XKldSpUyfsUgIpVaoUtWrVYsmSJWGXEgozo3nz5nzwwQdhl3LCcu5CWBAVzINuIsBXX31FlSpVYvYX34leEZ6bBg0aFNrQgOyr5AvCDYzickOpkCg0pMD64YcfOOOMM6LebywvwKtVqxarV6+OWf/5XatWrZg5cyZ79uwJu5QTEpdb14ZEoZEANm/ezEcffcSWLVvIzMzk3XffZd68edro7hjcPeGusD777LML7O6oQZQvX57zzjuPTz/9NOxSTkhBnmmEuveU5G7btm2MHTuWGTNmkJaWRlZWFnXq1OH7i77HzBg5eyTff/89y5cvp1q1aqSmptK2bVuuvfZaihbVP2mOmIXG/v3Z36dNhXe25AyWWwHH/Vq9tWvpunQp3H33r9v97/9CgqwEOxE599hu3rx52KXkya5du9iwYQNnnXVW2KXEhH7D5CNLly5l6NChjB8/nhYtWnDTTTcxaNAgatSogZnRdExTAN599l0g+0Tv8uXLWbBgAYMHD+auu+6iR48e9OjRI/a3zUwAMQuNAwdI2gtFP1sIiz7/z+u5jXWcr1Xav5/ye/bAa6/9ul3jxoUiNFq3bk3Hjh157rnnEm6mCNmHpmrUqEGxYsXCLiUmFBr5wI4dO+jXrx/jx4+nV69erFixItCx+GLFilGvXj3q1avHbbfdxtKlSxk2bBgXXnghTz31FN27d0/I/9NFUyxWaJdM/h92DIjNyu8Pp05l6NChTJs2LSb9J4L69evj7syePZvLLrss7HKO29SpU7niiivCLiNmdE4jZHPmzKFu3bps3bqV5cuX8/DDD+f55G2dOnV+2fju5Zdf5qqrruLbb7+NcsWJ44wzzki47akT8TxMtJ100kncf//9PPPMM2GXkifjx4+nffv2YZcRMwqNEL366qu0b9+e5557jrFjx1KuXLmo9HvBBRcwf/58mjZtSuPGjUlPT49Kv4nm7LPP5ptvvuHAgQNhlxLYzp07KVmyZNhlhK5Tp058/vnnLF26NOxSjsuqVav48ccfufTSS8MuJWYUGiEZMWIEf/7zn/nkk0+47rrrot5/0aJF6devH8OHD6dVq1YsXLgw6mPkd6VKleLMM89MqCWsy5Yt44ILLgi7jNCVLFmSu+++m4EDB4ZdynGZMGECN9xwQ4HddwoUGqEYN24cTz75JLNmzeKcc86J6Vht27bl1Vdf5dprr2XVqlUxHSs/atSoUUIF5ueff54w257EWs+ePXnvvfdYt25d2KUENn78eG688cawy4gphUacrVu3jjvuuIOpU6dSo0aNuIzZpk0bHnvsMW6++Wb25ywXLSQuvvhiZs+eHXYZgSXSXlmxVrZsWbp168agQYPCLiWQZcuWFfhDU6DQiCt359Zbb6VPnz7UrVs3rmPfdtttnHrqqQk33T9R119/Pe+88w67du0Ku5Rj2rp1Kz///DPVqlULu5R847777mP8+PEJMVt86qmn6N27d4E+NAUKjbgaPXo0P/30Ew888EDcxzYzXnnlFQYPHszy5bne/LBAqlSpEqmpqUyePDnsUo7p3Xff5Xe/+12hXz11qNNPP50XXniBzp075+vgX7FiBTNnzuTOO+8Mu5SYU2jEyYEDB3j88ccZNmxYaFdtV6lShb59+/L000+HMn5YbrnlFv72t7+FXcYxjRo1im7duoVdRr7ToUMHLrzwQh5++OGwSzmi/v37c//991OmTJmwS4k5hUacTJ06lYoVK3LRRReFWke3bt345z//SWZmZqh1xFPbtm1ZtGgR69evP3bjkKxatYqvv/6a1q1bh11KvjRs2DBef/115syZE3Ypv/Lhhx/y5ZdfFopZBig04mbo0KH06tUr7DIoV64c7dq1Y/To0WGXEjelSpWie/fuPPLII2GXckSjR4+mc+fOBXbriROVkpLC8OHD6dKlS77aqHPPnj3cddddDB48uNBcX6PQiIPNmzezYMGCfLMUr3v37owdOzbsMuLq4YcfZvr06cydOzfsUn7lxx9/5LXXXtOhqWNo27Ytl19+OR06dGDfvn1hl4O706NHD+rUqUObNm3CLiduFBpxkJaWRmpqar75SyQ1NZU1a9bkq7/YYq1MmTIMGjSI3r1757tlx4888gg33ngjNWvWDLuUfG/o0KGYGV27duXgwYOh1vL000+zfPly/va3vxWqxQsKjThIT0+nYcOGYZfxi+LFi3PBBRcUujvEdejQgXLlyjF06NCwS/nFwoULmTBhAo8//njYpSSEYsWKMX78eNauXUvPnj1DC463336b4cOHM2XKFJKTk0OpISyhhoaZtTSzr8wsw8weyuV9M7MXIu8vNbMGYdR5ovJbaAA0bNiw0O1JZWYMHz6cAQMG8NFHH4VdDrt27aJTp068+OKLnHrqqWGXkzCSkpKYNm0aq1evpnPnznGfOaalpXH77bczefJkzjzzzLiOnR+EFhpmVgQYCrQCagN/MLPDb3XVCqgZ+eoBDI9rkVGyYcMGqlevHnYZ/6VGjRps2LAh7DLirlatWowbN46bbrop1M3w9u/fT6dOnWjYsGGB3hE1VsqUKcO0adPYsmULLVu2jNtuzu+++y5XX301I0eOpH79+nEZM78J834ajYAMd18DYGZvAdcBKw5pcx3wd8++KcJ8MytrZme4+6b4l5t3u3fvjs75jIwMyMqCpk1PuKs/fPcdu3buhEWLjt6wXj0YMuSEx8tPmjVrxgsvvMDVV1/N3LlzqVKlSlzHP3jwIF27dmX79u0JcdFhfpWUlMS7777LwIEDadiwIc8++yydO3eOyfmFffv20a9fP8aNG8ekSZMK/FYhRxPm4amKwKEL5zdEXjveNgCYWQ8zSzOztPx2DYKZReVmQPUOlKdeVukoVET2LUYL0cm7w910003ce++9XHHFFXHdBdfd6dWrF+vWrWPSpEn5ZnFEosrZzXnGjBkMGTKEa6+9lk2bovs35fr162natCnLly9n8eLFhTowINyZRm6/sQ7/zRqkTfaL7iOBkQCpqamxua1aHiUlJbFjx44T7mfIXz4/dqOA/v7UU2zbti1hb3QTDX369KF06dI0adKEMWPGxPzCuu3bt3PHHXewevVqpk+fTlJSUkzHK0zq1q3LwoULeeKJJ365k2XXrl1PaB+v9evXM2LECF555RX69OlD3759C/y+UkGE+b/ABqDyIc8rAYffZi1Im3yvZs2arFy5Muwy/svKlStjvi17IujRowcTJ06kZ8+e3HPPPezevTsm48yaNYs6deqQlJTEjBkzCsV2E/FWvHhxnnjiCWbNmsW2bdtITU3lqquuYsKECezduzdQH+7OrFmzuP7666lbty5ZWVl8+umnPPTQQwqMCIvFPZQDDWxWFFgNNAe+AxYBHd19+SFtrgbuAFoDjYEX3L3RsfpOTU31tLS0mNSdF4MHDyYjIyNfLfWsXbs2b7zxhrbhjvjxxx+5/fbbmT9/Pn379qVbt25ROXT0008/8fjjjzNhwgReeeUVWrVqFYVqJYjdu3czceJERo0axdKlS7nwwgupXr061atXp1q1alStWpVdu3bx/fffs27dOr744gvS09NJTk7mjjvu4Oabby5U4W5m6e6eesx2YYUGgJm1BoYARYBX3X2AmfUEcPcRln1G6yWgJbAT6OLux0yD/BYac+bM4f7772fBggVhlwLAzz//TIUKFfj3v/+tbSsOs2DBAgYMGEBaWhr33XcfPXr0yNMvjrS0NIYNG8akSZP4/e9/z8CBA7WsNkQbNmxg1apVrF27lm+++Ya1a9eybt06kpKSOP3006lcuTJ16tShbt26nHvuuYXqYr0cCREasZLfQiMrK4uKFSuSkZFB+fLlwy6HyZMn89xzzyXUzYnibcmSJTz11FNMmzaN+vXr07RpU5o2bcoll1zyq3MR7s4PP/zA0qVLmT9//i8bQvbs2ZOuXbvmi39zkWNRaOSj0ADo0qUL5557Lg8++GDYpdCyZUs6duxIp06dwi4l39uxYwfz5s3j448/5uOPP2ZRZIlyUlISpUqVolSpUmRmZlKyZEnOP/98GjduTLNmzbjyyispUqRIyNWLBKfQyGehsWjRItq3b09GRkaov0wyMjK45JJLWL9+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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "**************************************************\n", "Inference after State 3:\n", "\n" ] }, { "data": { "image/png": "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oKAgGjZsSMOGDXnyySdJTExkzJgx3Hzzzbz33ns8/vjjPvk/nSu5Y4Z2yeBypA91z8zvxfPmMXr0aObPn++W8/uCRo0aYYxhxYoV3H333bbj5Nu8efO45557bMdwGx3TsGzlypVERERw/Phxtm3bxmuvvVbgwdvw8PA/Fr775z//ScuWLdm3b5+LE/uOKlWq+Nzy1L44DuNqRYoU4aWXXuLDDz+0HaVApk2bRufOnW3HcBstGhZNnDiRzp078/HHHzN58mQqVKjgkvM2aNCAtWvXEhUVxa233kpCQoJLzutrrr/+en755RfOnz9vO4rTMjIyKFmypO0Y1nXv3p1NmzaRmJhoO0q+7Ny5kxMnTnDHHXfYjuI2WjQs+fzzz3nrrbf48ccfadeuncvPX6xYMQYPHszYsWNp3bo169evd3kb3q5UqVJce+21PjWFdevWrTRo0MB2DOtKlizJc889x7Bhw2xHyZfp06fz0EMP+e26U6BFw4qpU6fy7rvvEhcXR926dd3aVvv27Zk4cSJt27Zl586dbm3LGzVt2tSnCuamTZt8ZtkTd+vTpw8LFixg7969tqM4bdq0aXTq1Ml2DLfSouFhe/fu5emnn2bevHnUrl3bI23ef//9vPnmmzzyyCNk5U4XDRC33XYbK1assB3Dab60Vpa7lS9fnt69ezN8+HDbUZyydetWv780BVo0PMoYwxNPPMELL7xARESER9t+8sknufrqq32uu19YHTt2ZPbs2WRmZtqOckXHjx/n1KlThIWF2Y7iNV588UWmTZvmE73F9957j379+vn1pSnQouFREyZM4LfffuPll1/2eNsiwhdffMGIESPYti3PzQ/9UrVq1YiMjGTOnDm2o1zRd999x1133RXws6cuVKlSJT799FN69Ojh1YV/+/btLF26lGeeecZ2FLfTouEh58+f5+2332bMmDHW7tquUaMGAwYM4IMPPrDSvi2PPfYY//rXv2zHuKLx48fTu3dv2zG8TpcuXbj55pt57bXXbEe5pCFDhvDSSy9RpkwZ21HcTouGh8ybN4+qVatyyy23WM3Ru3dvvv/+e44ePWo1hye1b9+eDRs2sH///isfbMnOnTv573//S5s2bWxH8Upjxozh66+/ZuXKlbaj/MXixYv5+eefA6KXAVo0PGb06NH07dvXdgwqVKhAhw4dmDBhgu0oHlOqVCkef/xxXn/9ddtRLmnChAn06NHDb5eeKKzQ0FDGjh1Lz549vWqhzjNnzvDss88yYsSIgLm/RouGBxw5coR169Z5zVS8xx9/nMmTJ9uO4VGvvfYaP/zwA6tWrbId5S9OnDjBl19+qZemrqB9+/Y0b96cLl26cO7cOdtxMMYQGxtLeHg4999/v+04HqNFwwPi4+OJjIz0mr9EIiMj2bNnj1f9xeZuZcqUYfjw4fTr18/rph2//vrrdOrUiTp16tiO4vVGjx6NiNCrVy+ys7OtZvnggw/Ytm0b//rXvwJq8oIWDQ9ISEigSZMmtmP8oXjx4jRo0CDgdojr0qULFSpUYPTo0baj/GH9+vVMnz6dt99+23YUnxAUFMS0adNITk6mT58+1grHjBkzGDt2LHPnziU4ONhKBlusFg0RaSUiu0QkSUReyeN9EZFPHe8nikhjGzkLy9uKBkCTJk0Cbk0qEWHs2LEMHTqUZcuW2Y5DZmYm3bt357PPPuPqq6+2HcdnlC5dmvnz57N792569Ojh8Z5jfHw8Tz31FHPmzOHaa6/1aNvewFrREJGiwGigNVAfeFhELt7qqjVQx/EVC4z1aEgXSUlJoVatWrZj/I/atWuTkpJiO4bH1atXj6lTp9K1a1eri+FlZWXRvXt3mjRp4tcrorpLmTJlmD9/PseOHaNVq1YeW835u+++47777mPcuHE0atTII216G5v7aTQFkowxewBE5FugHbD9gmPaAV+ZnE0R1opIeRGpYow55Pm4BXf69GnXjGckJUFaGkRFFfpUDx84QGZGBmzYcPkDGzaEkSML3Z43iY6O5tNPP+W+++5j1apV1KhRw6PtZ2dn06tXL1JTU33ipkNvVbp0ab777juGDRtGkyZN+Oijj+jRo4dbxhfOnTvH4MGDmTp1KrNmzfL7pUIux+blqarAhRPnUxyv5fcYAEQkVkTiRSTe2+5BEBGXbAbU8HxFGqaFuCAROVuMBtDg3cW6du3K888/zz333OPRVXCNMfTt25e9e/cya9Ysr5kc4atyV3NesmQJI0eOpG3bthw65Nq/Kffv309UVBTbtm1j48aNAV0wwG5PI6/fWBf/ZnXmmJwXjRkHjAOIjIx0z7ZqBVS6dGnS09MLfZ6R72+68kFO+uq99zh58qTPbnTjCi+88AIhISE0a9aMSZMmuf3GutTUVJ5++ml2797NDz/8QOnSpd3aXiCJiIhg/fr1vPPOO3/sZNmrV69CreO1f/9+Pv/8c7744gteeOEFBgwY4PfrSjnD5j+BFKD6Bc+rARdvs+bMMV6vTp067Nixw3aM/7Fjxw63L8vuC2JjY5k5cyZ9+vShf//+nD592i3txMXFER4eTunSpVmyZElALDfhacWLF+edd94hLi6OkydPEhkZScuWLZk+fTpnz5516hzGGOLi4ujYsSMRERGkpaXx008/8corr2jBcBB37KHsVMMixYDdQAvgALAB6GaM2XbBMfcBTwNtgFuBT40xTa907sjISBMfH++W3AUxYsQIkpKSvGqqZ/369fnmm290GW6HEydO8NRTT7F27VoGDBhA7969XXLp6LfffuPtt99m+vTpfPHFF7Ru3doFaZUzTp8+zcyZMxk/fjyJiYncfPPN1KpVi1q1ahEWFkbNmjXJzMzk8OHD7N27ly1btpCQkEBwcDBPP/00jzzySEAVdxFJMMZEXvE4W0UDQETaACOBosBEY8xQEekDYIz5XHJGtEYBrYAMoKcx5orVwNuKxsqVK3nppZdYt26d7SgAnDp1isqVK/P777/rshUXWbduHUOHDiU+Pp4XX3yR2NjYAv3iiI+PZ8yYMcyaNYsHH3yQYcOG6bRai1JSUti5cyfJycn88ssvJCcns3fvXkqXLk2lSpWoXr064eHhREREcMMNNwTUzXq5fKJouIu3FY20tDSqVq1KUlISFStWtB2HOXPm8PHHH/vU5kSetnnzZt577z3mz59Po0aNiIqKIioqittvv/0vYxHGGH799VcSExNZu3btHwtC9unTh169ennFv3OlrkSLhhcVDYCePXtyww03MHDgQNtRaNWqFd26daN79+62o3i99PR0Vq9ezfLly1m+fDkbHFOUS5cuTalSpShVqhRHjx6lZMmS3HTTTdx6661ER0dz7733UrRoUcvplXKeFg0vKxobNmygc+fOJCUlWf1lkpSUxO23387+/ft1umcBGGM4e/YsGRkZZGZmkpGRwdVXX81VV11lO5pSheJs0dDpAB5yyy23EBoaysyZM63mGDFiBD179tSCUUAiQokSJbjqqqu49tpruf7667VgqIBi8z6NgDN8+HC6detGixYtqFChgsfbX7VqFbNmzbK6fIZSyrdpT8OD7r77bjp27Ej//v093nZGRgY9e/Zk9OjRhIaGerx9pZR/0KLhYe+//z6rVq3i22+/9VibxhheeOEFIiMj6dChg8faVUr5H7085WHBwcHMnDmTmJgYypcvT6tWrdzanjGGN954g3Xr1hEXF+fWtpRS/k97GhZEREQwa9YsunfvzqxZs9zWjjGGgQMHMnPmTBYtWkT58uXd1pZSKjBo0bDkjjvuYOHChTz99NO8+OKLZGRkuPT8+/fvp3Xr1qxcuZIff/yRa665xqXnV0oFJi0aFjVu3JgtW7Zw8OBBGjZsyKpVqwp9TmMMEyZMoHHjxjRr1owVK1bo8hVKKZfRMQ3LQkNDmTJlCjNnzqRTp07cdNNN9O3blwceeIBixZz/13Py5En+7//+jzFjxhAcHMzSpUsJDw93Y3KlVCDSO8K9yJkzZ5gxYwZjxoxh7969tG3bliZNmtCkSRPq16//P4sLpqWlsXnzZhISEli/fj3z588nJiaGvn37ctdddwXkgmtKqYLTZUR8sGhcKDExkaVLl5KQkEBCQgJ79uyhVKlSBAUFcebMGbKysmjQoMEfRaVNmzYBucm9Uso1nC0aennKS4WHh//P5aUzZ86QkZHBuXPnKFGiBMHBwfm6fKWUUq6gv3V8RIkSJShRooTtGEqpAKezp5RSSjlNi4ZSSimnadFQSinlNC0aSimlnGZlIFxEKgBTgTAgGehsjPktj+OSgVPAeSDLmelgSiml3MdWT+MVYKkxpg6w1PH8UqKNMQ21YCillH22ikY74EvH4y+B9pZyKKWUygdbRaOSMeYQgOP7pZZgNcBiEUkQkdjLnVBEYkUkXkTijx496uK4SimlwI1jGiKyBKicx1tD8nGaO40xB0XkGuAHEdlpjFmR14HGmHHAOMhZRiTfgZVSSl2R24qGMeaeS70nIr+KSBVjzCERqQIcucQ5Djq+HxGRWUBTIM+ioZRSyv1sXZ6aC/RwPO4BzLn4ABEJFpEyuY+BGGCrxxIqpZT6C1tF4wPgXhH5D3Cv4zkicq2IzHccUwn4SUS2AOuBecaYhVbSKqWUAizdp2GMOQ60yOP1g0Abx+M9QISHoymllLoMvSNcKaWU07RoKKWUcpoWDaWUUk7ToqGUUsppWjSUUko5TYuGUkopp2nRUEop5TQtGkoppZymRUMppZTTtGgopZRymhYNpZRSTtOioZRSymlaNJRSSjlNi4ZSSimnadFQSinlNC0aSimlnKZFQymllNO0aCillHKaFg2llFJOE2OM7QwuJyKngF22c7hJKHDMdgg30s/n2/Tz+a56xpgyVzqomCeSWLDLGBNpO4Q7iEi8v3420M/n6/Tz+S4RiXfmOL08pZRSymlaNJRSSjnNX4vGONsB3MifPxvo5/N1+vl8l1OfzS8HwpVSSrmHv/Y0lFJKuYEWDaWUUk7zy6IhIp1EZJuIZIuI30yPE5FWIrJLRJJE5BXbeVxJRCaKyBER2Wo7izuISHURiRORHY7/Np+znclVRKSkiKwXkS2Oz/aW7UzuICJFRWSTiHxvO4uriUiyiPwsIpuvNPXWL4sGsBV4EFhhO4iriEhRYDTQGqgPPCwi9e2mcqlJQCvbIdwoC3jRGHMjcBvQz4/+/Z0BmhtjIoCGQCsRuc1uJLd4DthhO4QbRRtjGl7pPhS/LBrGmB3GGH+7I7wpkGSM2WOMOQt8C7SznMlljDErgBO2c7iLMeaQMWaj4/Epcn75VLWbyjVMjjTH0yDHl1/NsBGRasB9wHjbWWzzy6Lhp6oC+y94noKf/NIJNCISBjQC1lmO4jKOSzebgSPAD8YYv/lsDiOBAUC25RzuYoDFIpIgIrGXO9BnlxERkSVA5TzeGmKMmePpPB4gebzmV3/NBQIRCQFmAP2NMam287iKMeY80FBEygOzRKSBMcYvxqdE5H7giDEmQUSiLMdxlzuNMQdF5BrgBxHZ6ej9/4XPFg1jzD22M3hYClD9gufVgIOWsqgCEJEgcgrG18aYmbbzuIMx5ncRWU7O+JRfFA3gTqCtiLQBSgJlRWSyMeYRy7lcxhhz0PH9iIjMIudyeJ5FQy9P+Y4NQB0RqSUixYGuwFzLmZSTRESACcAOY8wntvO4kohUdPQwEJFSwD3ATquhXMgYM8gYU80YE0bO/3fL/KlgiEiwiJTJfQzEcJmC75dFQ0Q6iEgKcDswT0QW2c5UWMaYLOBpYBE5g6jTjDHb7KZyHRGZAqwB6olIioj0tp3Jxe4EHgWaO6Y1bnb85eoPqgBxIpJIzh83Pxhj/G5aqh+rBPwkIluA9cA8Y8zCSx2sy4gopZRyml/2NJRSSrmHFg2llFJO06KhlFLKaVo0lFJKOU2LhlJKKadp0VAqnxwr1v4iIhUcz69yPK/pgnOvLnxCpdxHp9wqVQAiMgC43hgTKyL/BJKNMe/bzqWUu2lPQ6mCGQHcJiL9gWbAx3kdJCKzHYvAbctdCE5EaorIf0QkVESKiMhKEYlxvJfm+F5FRFY4bgLcKiJ/88zHUurytKehVAGJSEtgIRBjjPnhEsdUMMaccCyvsQG42xhzXEQeJ2d9pnXk9FiedByfZowJEZEXgZLGmKGOvVRKO5ZUV8oq7WkoVXCtgUNAg8sc86xjeYa15Cw4WQfAGDMeKAP0AV7K4+c2AD1F5E3gZi0Yylto0VCqAESkIXAvObvwPS8iVfI4Joqcxftud+xqt4mcVVIRkdLkrFQMEHLxzzqWpb4LOAD8n4h0d/mHUKoAtGgolU+OFWvHkrMnxj7gI2B4HoeWA34zxmSIyA3kFJhcHwJfA68DX+TRRk1y9nD4gpzVcRu79lMoVTBaNJTKvyeAfReMY4wBbhCRuy86biFQzLH66zvkXKLCcdwtwIfGmK+BsyLS86KfjQI2i8gmoCPwD7d8EqXySQfClVJKOU17GkoppZymRUMppZTTtGgopZRymhYNpZRSTtOioZRSymlaNJRSSjlNi4ZSSimn/T8cdyn3xcs9ngAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "**************************************************\n", "Inference after State 4:\n", "\n" ] }, { "data": { "image/png": "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k6hXrx7r16+3HcNpvrRWlrvly5ePHj16MHr0aNtRnLJ3716/75oCLRoeZYzhn//8JwMGDCA0NNSjbT/77LPcfffdPne5n1Ft2rThm2++ITEx0XaUOzp//jwXL14kODjYdhSv8fLLLzNnzhyfuFp877336Nu3r193TYEWDY+aOnUqf/zxBwMHDvR42yLCJ598wtixY9m375abH/qlEiVKEBYWxsKFC21HuaPFixfzyCOPZPrZUzcqXLgwH374IV26dPHqwr9//35Wr17NCy+8YDuK22nR8JDk5GTefvttJk2aZO2u7VKlSjFo0CBGjBhhpX1bunbtymeffWY7xh19+umn9OjRw3YMr9OhQweqVavG66+/bjvKbQ0dOpRXXnmF3Llz247idlo0PGTp0qUUL16c2rVrW83Ro0cPlixZwtmzZ63m8KRWrVqxfft2Tpw4ceeDLTl48CA//fQTzZo1sx3FK02aNIkvvviCDRs22I7yF9999x0//PBDprjKAC0aHjNx4kT69OljOwYFChSgdevWTJ061XYUj8mRIwc9e/bk3//+t+0otzV16lS6dOnit0tPZFTBggWZPHky3bp186qFOi9fvky/fv0YO3Zsprm/RouGB5w5c4atW7d6zVS8nj17MnPmTNsxPOr1119n5cqVbNy40XaUv/j999+ZMWOGdk3dQatWrahfvz4dOnTg6tWrtuNgjKFXr16EhITQokUL23E8RouGB0RFRREWFuY1v4mEhYVx9OhRr/qNzd1y587N6NGj6du3r9dNO/73v/9Nu3btqFChgu0oXm/ixImICN27dyclJcVqlhEjRrBv3z4+++yzTDV5QYuGB0RHR1OrVi3bMa7Lli0bVatWzXQ7xHXo0IECBQowceJE21Gu27ZtG3PnzuXtt9+2HcUnBAYGMmfOHGJiYujdu7e1wjFv3jwmT57MokWLCAoKspLBFqtFQ0SaiMghETkiIv+6xesiIh+mvr5HRGrayJlR3lY0AGrVqpXp1qQSESZPnsywYcNYs2aN7TgkJibSuXNnxo8fz9133207js/ImTMny5Yt4/Dhw3Tp0sXjV45RUVE899xzLFy4kGLFinm0bW9grWiISAAwEWgKVAaeEpGbt7pqClRI/egFTPZoSBc5efIkZcqUsR3jf5QtW5aTJ0/ajuFxlSpVYvbs2XTs2NHqYnhJSUl0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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "**************************************************\n", "Inference after State 5:\n", "\n" ] }, { "data": { "image/png": "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FLt27WL//v2k5U6D0PSZy7u+3EXlypVp3rw5ISEh+PrqTnl2JCUlcfToUSpVqmRdJxYWjTx58tC6dWsWLVpEv37ePbj0hkVDRNoB75G+lEewMSbRZamUslFaWhrh4eF88sknrFixgjp16lC/fn1q1apFx44dSUxN5KfYn7i92u0E+QWxY8cOBg0axL59+2jcuDFt27blsccey9HXXMiqvXv3Ur58eXLnznQ5vOyzsGhA+iGquXPn5tyiAYwE7jfG6KWqVI5w5swZJk2axKeffkrRokV56qmnmD17Nvnz//PyMecunYNYCA0NZVDjQVeeP3nyJGvWrGHOnDmMGTOGp556imeeeYZixYq5+J14nt27d1t7aArSh9w6cXLftTp27MjgwYO5dOmSNZMT3cTNzmk01YKhcorly5cTGBhITEwMs2bNIjIykscee+xfBeNmihcvTrdu3Zg5cybr168nPj6eatWqMXLkSC5cuGBhes+3f//+7F//21EW72kUK1aMsmXLev3QW52noXK0xMREhg4dSt++ffnss8+YMWMGDRo0uOXlrqtVq8bkyZOJjo5m9+7d1K9fn61bdV7sjaSkpFj/7dziogEQGBjo9X9nLRoqxzp48CAhISEcP36crVu3WjITuWLFisyePZvnnnuOli1bMnPmTKf34Q1y5cpFWprF42y0aDiFFg2VIx09epSWLVsyYMAAZsyYka3zDo4uUici9O3bl+XLl/Pyyy/z+uuvZ7kvb+fSomHh4oLVq1dn165dlrXvDiwcqqCUezp+/DitWrWiX79+DB8+PMu/L9e9CnHmAgMDiYiIoEmTJvj7+/Pkk09mqx1vJCKuKRrGQGoqWDRKq0qVKuzfv9+Stt2FFg2VoyQkJNCmTRu6devGyy+/7PL+S5YseWWNpTJlytClSxeXZ3BHuXLlsn558ctzaC5dsqxoVK5cmX379lnStrvQoqFylOHDhxMUFMQbb7xhW4aqVauycOFCOnTogL+/P40bN7Yti53iz8SzPn49l1IvsSFpAwfzHOSDjR9wKfUSl1IvkZyWfOX+tbebvpZ6/deSky5w6VU4fvY4RfJXtOQ9FS1alKSkJBITE7M08s6TaNFQOcbixYtZsWIFW7duveXRUbcqNDSUadOm8cADDxAXF0fBggVtzWOHTYc30Wtur7+fKAxrw9f+YxvfXL74+fhd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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.ion()\n", "\n", "# Create a Nonlinear factor graph as well as the data structure to hold state estimates.\n", "graph = gtsam.NonlinearFactorGraph()\n", "initial_estimate = gtsam.Values()\n", "\n", "# Add the prior factor to the factor graph, and poorly initialize the prior pose to demonstrate\n", "# iSAM2 incremental optimization.\n", "graph.push_back(gtsam.PriorFactorPose2(1, gtsam.Pose2(0, 0, 0), PRIOR_NOISE))\n", "initial_estimate.insert(1, gtsam.Pose2(0.5, 0.0, 0.2))\n", "\n", "# Initialize the current estimate which is used during the incremental inference loop.\n", "current_estimate = initial_estimate\n", "\n", "for i in range(len(true_odometry)):\n", "\n", " # Obtain the noisy odometry that is received by the robot and corrupted by gaussian noise.\n", " noisy_odom_x, noisy_odom_y, noisy_odom_theta = odometry_measurements[i]\n", "\n", " # Determine if there is loop closure based on the odometry measurement and the previous estimate of the state.\n", " loop = determine_loop_closure(odometry_measurements[i], current_estimate, i, xy_tol=0.8, theta_tol=25)\n", "\n", " # Add a binary factor in between two existing states if loop closure is detected.\n", " # Otherwise, add a binary factor between a newly observed state and the previous state.\n", " if loop:\n", " graph.push_back(gtsam.BetweenFactorPose2(i + 1, loop, \n", " gtsam.Pose2(noisy_odom_x, noisy_odom_y, noisy_odom_theta), ODOMETRY_NOISE))\n", " else:\n", " graph.push_back(gtsam.BetweenFactorPose2(i + 1, i + 2, \n", " gtsam.Pose2(noisy_odom_x, noisy_odom_y, noisy_odom_theta), ODOMETRY_NOISE))\n", "\n", " # Compute and insert the initialization estimate for the current pose using the noisy odometry measurement.\n", " computed_estimate = current_estimate.atPose2(i + 1).compose(gtsam.Pose2(noisy_odom_x,\n", " noisy_odom_y,\n", " noisy_odom_theta))\n", " initial_estimate.insert(i + 2, computed_estimate)\n", "\n", " # Perform incremental update to iSAM2's internal Bayes tree, optimizing only the affected variables.\n", " isam.update(graph, initial_estimate)\n", " current_estimate = isam.calculateEstimate()\n", "\n", " # Report all current state estimates from the iSAM2 optimzation.\n", " report_on_progress(graph, current_estimate, i)\n", " initial_estimate.clear()\n", "\n", "plt.ioff()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 8, "id": "efcabb53", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "X1 covariance:\n", "[[ 9.00000000e-02 -3.37968240e-18 -8.52247048e-18]\n", " [-3.37968240e-18 9.00000000e-02 3.89598651e-17]\n", " [-8.52247048e-18 3.89598651e-17 7.61543549e-03]]\n", "\n", "X2 covariance:\n", "[[ 0.13075722 -0.004233 -0.00240137]\n", " [-0.004233 0.1536633 0.0134241 ]\n", " [-0.00240137 0.0134241 0.01523087]]\n", "\n", "X3 covariance:\n", "[[0.29774845 0.01774521 0.04541913]\n", " [0.01774521 0.1639351 0.0042845 ]\n", " [0.04541913 0.0042845 0.02025829]]\n", "\n", "X4 covariance:\n", "[[ 0.2392119 -0.08432109 0.0352123 ]\n", " [-0.08432109 0.30169294 -0.04762872]\n", " [ 0.0352123 -0.04762872 0.02159453]]\n", "\n", "X5 covariance:\n", "[[ 0.18121778 0.01416991 -0.00702734]\n", " [ 0.01416991 0.23826225 -0.03958449]\n", " [-0.00702734 -0.03958449 0.020409 ]]\n", "\n" ] } ], "source": [ "# Print the final covariance matrix for each pose after completing inference on the trajectory.\n", "marginals = gtsam.Marginals(graph, current_estimate)\n", "i = 1\n", "for i in range(1, len(true_odometry)+1):\n", " print(f\"X{i} covariance:\\n{marginals.marginalCovariance(i)}\\n\")" ] } ], "metadata": { "interpreter": { "hash": "341996cd3f3db7b5e0d1eaea072c5502d80452314e72e6b77c40445f6e9ba101" }, "kernelspec": { "display_name": "Python 3.8.12 ('nbdev')", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.12" } }, "nbformat": 4, "nbformat_minor": 5 }