{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 確率ロボティクス2017第12回\n", "\n", "上田隆一\n", "\n", "2017年12月6日@千葉工業大学\n", "\n", "## 今日やること\n", "\n", "* SLAMとは何か\n", "* FastSLAM" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## SLAM\n", "\n", "* SLAM(simultaneous localization and mapping)\n", " * 自己位置推定と地図生成を同時に行う方法\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## SLAM問題\n", "\n", "* 次のような地図$m^*$とロボットの軌跡$x^*{0:t}$を求める問題\n", " * $m^*,x^*_{0:t} = \\text{argmax}_m P(m,x_{0:t} |u_{1:t}, z_{1:t})$\n", " * $x_{0:t}$: 行動のシーケンス$(x_0,x_1,x_2,...,x_t)$\n", " * $u_{1:t}$: センサ情報のシーケンス$(u_1,u_2,u_3,...,u_t)$\n", " * $z_{1:t}$: センサ情報のシーケンス$(z_1,z_2,z_3,...,z_t)$\n", " * (面倒なのでベクトルも細字で書いてます) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## SLAMの基本手続き\n", "\n", "* これで地図ができる (2次元の例, 距離センサを想定)\n", " * 最初のロボットの位置$x_0$(絶対座標)を$ (x,y,\\theta) = (0,0,0)$とする\n", " * 以下の繰り返し\n", " * センサで障害物の位置を計測\n", " * 障害物の位置を絶対座標に変換して記録\n", " * ロボットを動かしてロボットの座標を更新\n", "* 問題\n", " * 移動誤差、センサの雑音\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 確率を使わない実装\n", "\n", "* 日経Linux 2015年11月号の上田の記事より\n", "\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 誤差への対応\n", "\n", "* ベイズフィルタ\n", " * 主にオンラインSLAMで利用される\n", "* 最小二乗法\n", " * 主にオフラインSLAMで利用される\n", "* オンライン/オフライン\n", " * オンライン: ロボットが自己位置と地図を動いている途中に特定していく\n", " * オフライン: デッドレコニングとセンサ情報を全て記録しておいて後から地図と移動軌跡を特定" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## FastSLAM\n", "\n", "* オンラインSLAMの代表的な手法\n", "* MCL + 地図の推定\n", "* 1.0と2.0がある\n", " * 1.0をこれから実装\n", " * MCLのコードをコピーしながら作っていきましょう" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 地図のシミュレーション" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import numpy as np\n", "from copy import copy\n", "import math, random\n", "import matplotlib.pyplot as plt # for plotting data\n", "from matplotlib.patches import Ellipse # for drawing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### ランドマークのクラス\n", "\n", "* 変数\n", " * ランドマークの位置($\\boldsymbol{m}_i$)\n", "* メソッド\n", " * 描画\n", " * ロボット座標系でのランドマークの距離と方角を求める関数\n", " * 距離: $\\sqrt{(x_m - x_r)^2 + (y_m - y_r)^2}$\n", " * 方角: $\\text{atan2}(y_m - y_r,x_m - x_r) - \\theta_r$\n", " * ただし\n", " * ランドマークの位置: $\\boldsymbol{m}_i=(x_m,y_m)$\n", " * ロボットの真の姿勢: $\\boldsymbol{x}=(x_r,y_r,\\theta_r)$\n", " \n", "\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "class Landmark:\n", " def __init__(self,x,y):\n", " self.pos = np.array([[x],[y]])\n", " \n", " def draw(self):\n", " plt.scatter(xs,ys,s=300,marker=\"*\",label=\"landmarks\",color=\"orange\")\n", " \n", " def relative_pos(self,pose):\n", " x,y,theta = pose\n", " lx,ly = self.pos[0][0],self.pos[1][0]\n", " distance = math.sqrt((x -lx)**2 + (y-ly)**2)\n", " direction = math.atan2(ly-y, lx-x) - theta\n", " \n", " return (distance, direction,lx,ly) #lx, lyを返すのは描画のため" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 地図のクラス\n", "\n", "地図 = 複数のランドマークの座標の集合と考える\n", "\n", "$\\boldsymbol{m} = \\{\\boldsymbol{m}_i | i=1,2,3,\\dots,M\\}$\n", "\n", "* 変数\n", " * Landmarkのリスト\n", "* メソッド\n", " * ランドマークの座標の追加\n", " * 描画\n", " * ロボット座標系での複数のランドマークの位置(極座標)を返す関数" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "class Map():\n", " def __init__(self):\n", " self.landmarks = []\n", " \n", " def append_landmark(self,x,y):\n", " self.landmarks.append(Landmark(x,y))\n", " \n", " def draw(self):\n", " xs = [ e.pos[0] for e in self.landmarks]\n", " ys = [ e.pos[1] for e in self.landmarks]\n", " plt.scatter(xs,ys,s=300,marker=\"*\",label=\"landmarks\",color=\"orange\")\n", " \n", " \n", " def relative_landmark_positions(self,pose):\n", " positions = []\n", " for i,ln in enumerate(self.landmarks):\n", " distance,direction,lx,ly = ln.relative_pos(pose)\n", " positions.append([distance,direction,lx,ly,i])\n", " \n", " return positions\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 正解の地図$\\boldsymbol{m}^*$を作る" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nYHuSbUk2AnuAA70LkmzvOfw14NHBjShJOluLPudeVSeT7AXuA8aAD1XVkSS3AtNVdQDYm+Qq4Dng\n68D1Kzm0JOnM+nlBlao6CBycd+6WntvvGvBckqRl8BOqktQg4y5JDTLuktQg4y5JDTLuktQg4y5J\nDTLuktQg4y5JDTLuktQg4y5JDTLuktQg4y5JDTLuktQg4y5JDTLuktQg4y5JDTLuktQg4y5JDTLu\nktQg4y5JDTLuktQg4y5JDTLuktQg4y5JDTLuktQg4y5JDeor7kmuTvJIkpkkNy9w/aYkDyV5MMn9\nSS4b/KiSpH4tGvckY8BtwE5gB3Bdkh3zln0OmKqqVwP3Au8d9KCSpP7188j9cmCmqo5W1bPAfmB3\n74Kq+req+l738BCwebBjSpLORj9xvxR4suf4WPfc6bwT+MflDCVJWp7xQX6zJO8ApoA3nOb6jcCN\nAFu3bh3kXUuSevTzyP04sKXneHP33AskuQp4N7Crqp5Z6BtV1e1VNVVVUxMTE0uZV5LUh37ifhjY\nnmRbko3AHuBA74IkPw28n07Yvzb4MSVJZ2PRuFfVSWAvcB/wMHB3VR1JcmuSXd1lfwWcD9yT5PNJ\nDpzm20mShqCv59yr6iBwcN65W3puXzXguSRJy+AnVCWpQcZdkhpk3CWpQcZdkhpk3CWpQcZdkhpk\n3CWpQcZdkhpk3CWpQcZdkhpk3CWpQcZdkhpk3CWpQcZdkhpk3CWpQcZdkhpk3CWpQcZdkhpk3CWp\nQcZdkhpk3CWpQcZdkhpk3CWpQcZdkhpk3CWpQcZdkhrUV9yTXJ3kkSQzSW5e4PovJvnPJCeTXDv4\nMSVJZ2PRuCcZA24DdgI7gOuS7Ji37AngBmDfoAeUJJ298T7WXA7MVNVRgCT7gd3AQ88vqKrHutfm\nVmBGSdJZ6udpmUuBJ3uOj3XPnbUkNyaZTjI9Ozu7lG8hSerDUF9Qrarbq2qqqqYmJiaGedeStK70\nE/fjwJae483dc5KkVaqfuB8GtifZlmQjsAc4sLJjSZKWY9G4V9VJYC9wH/AwcHdVHUlya5JdAEl+\nLskx4M3A+5McWcmhJUln1s+7Zaiqg8DBeedu6bl9mM7TNZKkVcBPqEpSg4y7JDXIuEtSg4y7JDXI\nuEtSg4y7JDXIuEtSg4y7JDXIuEtSg4y7JDXIuEtSg4y7JDXIuEtSg4y7JDXIuEtSg4y7JDXIuEtS\n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\n0P8DiHkDMrb/WQQAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "m = Map()\n", "m.append_landmark(-0.5,0.0)\n", "m.append_landmark(0.5,0.0)\n", "m.append_landmark(0.0,0.5)\n", "\n", "m.draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ロボットのシミュレーション\n", "\n", "#### ロボットのクラス\n", "\n", "* 変数\n", " * 姿勢\n", "* メソッド\n", " * 描画\n", " * 観測\n", " * ロボット座標系での正確な座標を引数でとって雑音を混ぜて返す\n", " * 観測した方向に距離の10%のノイズ\n", " * 観測した方向と垂直な方向に$距離\\times\\sin(5[\\text{deg}])$のノイズ\n", " * SLAMに使われる変数\n", " * グローバル座標系での位置$\\boldsymbol{z} = (x_z,y_z)$\n", " * $\\boldsymbol{z}$の共分散行列$Q$\n", " * $Q$はノイズから計算される\n", " * 状態遷移関数\n", " * ロボットの移動後の座標を雑音付きで返す\n", " * MCLの実装を参考のこと" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "class Robot:\n", " def __init__(self,pose):\n", " self.pose = pose\n", " \n", " def draw(self):\n", " x,y,theta = self.pose\n", " plt.quiver([x],[y],[math.cos(theta)],[math.sin(theta)],color=\"red\",label=\"actual robot motion\")\n", " \n", " def observation(self,m):\n", " measurements = m.relative_landmark_positions(self.pose)\n", " observations = []\n", " \n", " for m in measurements:\n", " distance, direction,lx,ly, i = m\n", " # 方向の制限(cosの値が正)\n", " if (math.cos(direction) < 0.0): continue\n", " \n", " measured_distance = random.gauss(distance,distance*0.1) \n", " measured_direction = random.gauss(direction,5.0/180.0*math.pi)\n", " observations.append([measured_distance, measured_direction,lx,ly,i]) \n", " \n", " return observations\n", " \n", " def motion_model(self, pos, fw, rot):\n", " actual_fw = random.gauss(fw,fw/10) #標準偏差にしてfwの10%だけ移動距離に雑音を入れる\n", " dir_error = random.gauss(0.0, math.pi / 180.0 * 3.0) # 前進時にロボットの進路が曲がる雑音。標準偏差3[deg] \n", "\n", " px, py, pt = pos\n", "\n", " #前進させる\n", " x = px + actual_fw * math.cos(pt + dir_error)\n", " y = py + actual_fw * math.sin(pt + dir_error)\n", "\n", " #回転。回転角にもrotの10%だけ雑音を入れる\n", " t = pt + dir_error + random.gauss(rot,rot/10)\n", "\n", " return np.array([x,y,t])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### ロボットを環境に置いてみましょう" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nGAIAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "robot = Robot(np.array([0.1,0.2,math.pi*20.0/180]) )\n", "robot.draw()\n", "m.draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### ロボットとランドマークの位置関係、観測についてデバッグ\n", "\n", "と言ってもデバッグするのもコードが多くて大変ですが・・・" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0.40643900442307623, -0.81227921449315765, 0.5, 0.0, 1], [0.342408924892383, 1.5725801629814116, 0.0, 0.5, 2]]\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "### ここの区画のコードは消去してもSLAMが動きます ###\n", "observations = robot.observation(m)\n", "print(observations)\n", "\n", "fig = plt.figure(0,figsize=(8, 8))\n", "sp = fig.add_subplot(111, aspect='equal')\n", "sp.set_xlim(-1.0,1.0)\n", "sp.set_ylim(-0.5,1.5)\n", " \n", "for observation in observations:\n", " x,y,theta = robot.pose\n", " distance, direction,lx,ly, i = observation\n", " lx = distance*math.cos(theta + direction) + x\n", " ly = distance*math.sin(theta + direction) + y\n", " plt.plot([robot.pose[0], lx],[robot.pose[1], ly],color=\"pink\")\n", " \n", " c = math.cos(theta + direction)\n", " s = math.sin(theta + direction)\n", " rot = np.array([[c, -s],\n", " [s, c]])\n", " \n", " err_robot = np.array([[(distance*0.1)**2,0.0],\n", " [0.0,(distance*math.sin(5.0/180.0*math.pi))**2]])\n", " err_world = (rot).dot(err_robot).dot((rot).T)\n", " \n", " eig_vals,eig_vec = np.linalg.eig(err_world)\n", " v1 = eig_vals[0] * eig_vec[:,0]\n", " v2 = eig_vals[1] * eig_vec[:,1]\n", " v1_direction = math.atan2(v1[1],v1[0])\n", " \n", " elli = Ellipse([lx,ly],width=3*math.sqrt(np.linalg.norm(v1)),height=3*math.sqrt(np.linalg.norm(v2)),angle=v1_direction/3.14*180)\n", " elli.set_alpha(0.2)\n", " sp.add_artist(elli)\n", " \n", "robot.draw()\n", "m.draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### FastSLAMの実装\n", "\n", "#### ランドマークの推定結果の入れ物\n", "\n", "* ランドマークの位置$\\hat{\\boldsymbol{m}_i}$\n", "* 不確かさの共分散$\\Sigma_i$" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "class LandmarkEstimation():\n", " def __init__(self):\n", " self.pos = np.array([[0.0],[0.0]])\n", " self.cov = np.array([[1000000000.0**2,0.0],\n", " [0.0,1000000000.0**2]]) #最初は大きな共分散を持たせておく" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### パーティクル\n", "\n", "* 変数\n", " * 重み\n", " * ロボットの姿勢\n", " * 地図\n", "* メソッド\n", " * 動作をパーティクルに反映\n", " * MCLと同じ\n", " * 計測値をパーティクルに反映\n", " * 地図の更新\n", " * $K \\longleftarrow \\Sigma_i ( \\Sigma_i + Q_z)^{-1}$\n", " * $\\hat{m_i} \\longleftarrow \\hat{m_i} + K(\\boldsymbol{z} - \\hat{m_i})$\n", " * $\\Sigma_i \\longleftarrow (I-K)\\Sigma_i$\n", " * 重みの計算\n", " * MCLと同じ\n", " * 描画" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "class Particle():\n", " def __init__(self,pose,w):\n", " self.w = w\n", " self.pose = pose\n", " self.map = [LandmarkEstimation(),LandmarkEstimation(),LandmarkEstimation()] #数は3で既知とする\n", "\n", " def motion_update(self, fw, rot, robot):\n", " self.pose = robot.motion_model(self.pose, fw, rot)\n", " \n", " def measurement_update(self, measurement):\n", " x,y,theta = self.pose\n", " distance, direction,lx,ly,i = measurement\n", " ln = self.map[i]\n", " lx = distance*math.cos(theta + direction) + x\n", " ly = distance*math.sin(theta + direction) + y\n", "\n", " ## 地図の書き換え\n", " z = np.array([[lx],[ly]])\n", " \n", " c = math.cos(theta + direction)\n", " s = math.sin(theta + direction)\n", " rot = np.array([[c, -s],\n", " [s, c]])\n", " \n", " err_robot = np.array([[(distance*0.1)**2,0.0],\n", " [0.0,(distance*math.sin(5.0/180.0*math.pi))**2]])\n", " err_world = (rot).dot(err_robot).dot((rot).T) # Q\n", " \n", " K = ln.cov.dot(np.linalg.inv(ln.cov + err_world))\n", " # 初期値の誤差楕円が大きすぎると計算がおかしくなるのでカルマンゲインを下げる\n", " if K[0][0] > 0.99: K[0][0] = 0.9\n", " if K[1][1] > 0.99: K[1][1] = 0.9\n", " \n", " ln.pos += K.dot( z - ln.pos)\n", " ln.cov = (np.identity(2) - K).dot(ln.cov)\n", " \n", " ## 重みの更新\n", " delta = np.array([[x],[y]]) - np.array([[lx],[ly]])\n", " coef = 2*math.pi * math.sqrt(np.linalg.det(ln.cov))\n", " inexp = -0.5 * (delta.T.dot(np.linalg.inv(ln.cov))).dot(delta)\n", " self.w *= 1.0/coef * math.exp(inexp)\n", " \n", " def draw(self,i,robot=None):\n", " fig = plt.figure(i,figsize=(4, 4))\n", " sp = fig.add_subplot(111, aspect='equal')\n", " sp.set_xlim(-1.0,1.0)\n", " sp.set_ylim(-0.5,1.5)\n", " \n", " m.draw()\n", " \n", " x,y,theta = self.pose\n", " plt.quiver([x],[y],[math.cos(theta)],[math.sin(theta)],color=\"blue\",label=\"estm. robot pos\")\n", " \n", " if robot != None:\n", " rx,ry,rtheta = robot.pose\n", " plt.quiver([rx],[ry],[math.cos(rtheta)],[math.sin(rtheta)],color=\"red\",label=\"actual robot pos\")\n", " for e in self.map:\n", " eig_vals,eig_vec = np.linalg.eig(e.cov)\n", " v1 = eig_vals[0] * eig_vec[:,0]\n", " v2 = eig_vals[1] * eig_vec[:,1]\n", " v1_direction = math.atan2(v1[1],v1[0])\n", "\n", " x,y = e.pos\n", " elli = Ellipse([x,y],width=3*math.sqrt(np.linalg.norm(v1)),height=3*math.sqrt(np.linalg.norm(v2)),angle=v1_direction/3.14*180)\n", " elli.set_alpha(0.5)\n", "\n", " sp.add_artist(elli)\n", " plt.scatter(x,y,s=100,marker=\"*\",label=\"landmarks\",color=\"blue\") " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### FastSLAMクラス\n", "\n", "* 変数\n", " * パーティクル群\n", "* メソッド\n", " * 動作をパーティクルに反映\n", " * MCLと同じ\n", " * 計測値をパーティクルに反映\n", " * $P(\\boldsymbol{m},\\boldsymbol{x}|\\boldsymbol{z}) = \\eta P(\\boldsymbol{z}|\\boldsymbol{m},\\boldsymbol{x})P(\\boldsymbol{m},\\boldsymbol{x})$(ベイズの定理)\n", " * この式が上の各パーティクルの処理に分解できる(Rao-Blackwellization)\n", " * リサンプリング\n", " * MCLと同じ" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "import copy\n", " \n", "class FastSLAM():\n", " def __init__(self,pose):\n", " self.particles = [Particle(pose,1.0/100) for i in range(100)]\n", " \n", " def draw(self,robot=None):\n", " for (i,p) in enumerate(self.particles):\n", " p.draw(i,robot)\n", " if i > 3: return # たくさんあるパーティクルを全部描画すると大変なので3個だけ\n", " \n", " def motion_update(self, fw, rot, robot):\n", " for p in self.particles:\n", " p.motion_update(fw,rot, robot)\n", " \n", " def measurement_update(self, measurement):\n", " for p in self.particles:\n", " p.measurement_update(measurement)\n", " \n", " self.resampling()\n", " \n", " def resampling(self):\n", " num = len(self.particles) # numはパーティクルの個数\n", " ws = [e.w for e in self.particles] # 重みのリストを作る\n", " \n", " if sum(ws) < 1e-100: #重みの和がゼロに丸め込まれるとサンプリングできなくなるので小さな数を足しておく\n", " ws = [e + 1e-100 for e in ws]\n", " \n", " ps = random.choices(self.particles, weights=ws, k=num) # パーティクルのリストから、weightsのリストの重みに比例した確率で、num個選ぶ\n", " self.particles = [copy.deepcopy(e) for e in ps] # 選んだリストからパーティクルを取り出し、パーティクルの姿勢から重み1/numの新しいパーティクルを作成" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 実行\n", "\n", "#### 初期状態\n", "\n", "各ランドマークの推定の共分散が大きく、位置が定まっていない状態。" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nvJrniwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\nvJrniwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\nvJrniwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\nvJrniwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\nvJrniwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "robot.pose = np.array([0.0,0.0,0.0]) #ロボットの実際の姿勢\n", "slam = FastSLAM(robot.pose)\n", "slam.draw()\n", "\n", "### 青いのは画像からはみ出た誤差楕円の色です。 ###" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 50ステップ後のパーティクル\n", "\n", "原点が固定されていないので、推定された誤差楕円を平行、回転移動してどれくらい正確かを考えましょう。" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "50step後の地図\n" ] }, { "data": { "image/png": "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\nYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\nrkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAARUAAAD8CAYAAABZ0jAcAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAF0VJREFUeJzt3XuUFPWZxvHvy/QAw01BWIMXQCKJ\nwTWCzhIDnIjGGPS4mDUKSHajUY/m6klysonZrOM5RndJ8kcSY9ZICEfGBIi6JiFe16hEjaDMuFwE\nVxlBlBEFQQdRbjPz7h9VA+0wl2b611XdzfM5Z05X/6qq+63p4aG7qrpec3dERELplXYBIlJeFCoi\nEpRCRUSCUqiISFAKFREJSqEiIkEFCRUzm2dmW8zs+U7mTzGzJjNbEf/UZM2bamYvmlmDmV0Xoh4R\nSY+FOE/FzD4F7ARq3f3vO5g/BfiOu1/QbrwCeAn4DLAJWA5c6u5r8y5KRFIR5J2Kuz8BbO/BqhOA\nBndf7+57gUXAhSFqEpF0ZBJ8rk+a2UrgdaJ3LWuAY4HXspbZBHyio5XN7GrgaoD+/fufftJJJxW4\nXJHDV319/VvuPqwn6yYVKs8BI919p5mdD/wRGHMoD+Duc4A5ANXV1V5XVxe+ShEBwMw29nTdRI7+\nuPsOd98ZTz8AVJrZUKAROD5r0ePiMREpUYmEipl9yMwsnp4QP+82oh2zY8zsBDPrDcwEFidRk4gU\nRpCPP2a2EJgCDDWzTcANQCWAu/8KuBj4ipk1A7uAmR4ddmo2s68DDwMVwLx4X4uIlKggh5STpn0q\nIoVlZvXuXt2TdXVGrYgEpVARkaAUKiISlEJFRIJSqIhIUAoVEQlKoSIiQSlURCQohYqIBKVQEZGg\nFCoiEpRCRUSCUqiISFAKFREJSqEiIkEpVEQkKIWKiASlUBGRoJJqe/oFM1tlZqvN7GkzOzVr3ivx\n+Aoz0zUiRUpcqHcqdwBTu5i/ATjT3U8BfkjcvyfLWe4+rqfXxBSR4hHkavru/oSZjepi/tNZd5cR\n9fcRkTKUxj6VK4EHs+478D9mVh+3NhWREpZkL2XM7CyiUJmcNTzZ3RvN7O+AR8zs/+KG7+3X3d9L\necSIEYnUKyKHLrF3Kmb2cWAucKG7b2sbd/fG+HYL8AdgQkfru/scd6929+phw3rUN1pEEpBU29MR\nwL3Av7j7S1nj/c1sYNs0cC7Q4REkESkNSbU9rQGOAv4rbqncHB/pORr4QzyWARa4+0MhahKRdIQ6\n+nNpN/OvAq7qYHw9cOrBa4hIqdIZtSISlEJFRIJSqIhIUAoVEQlKoSIiQSlURCQohYqIBKVQEZGg\nFCoiEpRCRUSCUqiISFAKFREJSqEiIkEpVEQkKIWKiASlUBGRoBQqIhKUQkVEglKoiEhQSfVSNjO7\nxcwa4p7Kp2XNu8zM1sU/l4WoR0TSk1Qv5fOAMfHP1cBtAGY2hOjK+58g6vdzg5kNDlSTiKQgSKjE\nHQW3d7HIhUCtR5YBR5rZcOCzwCPuvt3d3wYeoetwEpEil9Q+lWOB17Lub4rHOhs/iJldbWZ1Zla3\ndevWghUqIvkpmR21ansqUhqSCpVG4Pis+8fFY52Ni0iJSipUFgNfjI8CnQE0uftm4GHgXDMbHO+g\nPTceE5ESlVQv5QeA84EG4H3gS/G87Wb2Q2B5/FA3untXO3xFpMgl1UvZga91Mm8eMC9EHSKSvpLZ\nUSsipUGhIiJBKVREJCiFiogEpVARkaAUKiISlEJFRIJSqIhIUAoVEQlKoSIiQSlURCQohYqIBKVQ\nEZGgFCoiEpRCRUSCUqiISFAKFREJSqEiIkGFans61cxejNuaXtfB/J+a2Yr45yUzeydrXkvWvMUh\n6hGR9OR9jVozqwB+CXyGqBnYcjNb7O5r25Zx929lLf8NYHzWQ+xy93H51iEixSHEO5UJQIO7r3f3\nvcAiojannbkUWBjgeUWkCIUIlUNpXToSOAF4LGu4b9zOdJmZfa6zJ1HbU5HSkPSO2pnAPe7ekjU2\n0t2rgVnAz8zswx2tqLanIqUhRKgcSuvSmbT76OPujfHtemAJH9zfIiIlJkSoLAfGmNkJZtabKDgO\nOopjZicBg4GlWWODzaxPPD0UmASsbb+uiJSOvI/+uHuzmX2dqAdyBTDP3deY2Y1Anbu3BcxMYFHc\nrbDNx4DbzayVKOBmZx81EpHSYx/8N14aqqurva6uLu0yRMqWmdXH+zoPmc6oFZGgFCoiEpRCRUSC\nUqiISFAKFREJSqEiIkEpVEQkKIWKiASlUBGRoBQqIhKUQkVEglKoiEhQChUpvNYWeP6m6FbKnkJF\nCm/rU7Dqenjrb2lXIglQqEjhbVwAGLyyIO1KJAEKFSksb4VX7wY8uvXWtCuSAlOoSGFtexZa90XT\nrXth2/J065GCU6hIYb2yEFp2RdMtu2CjWj6Vu7yvUQtR21Pg50TXqJ3r7rPbzb8c+AkHrrJ/q7vP\njeddBvx7PH6Tu88PUZMkaM92WHYFNO88eN5by6CtI4u3QMNceOf5g5fLDIAz5kGfIYWtVQoukban\nsd+7+9fbrTsEuAGoBhyoj9d9O9+6BJqaYOJEePppOOKIAj5R5UDI9IPGP3W/bMt78OajB4+PnAWV\ng8LXJolLo+1pts8Cj7j79jhIHgGmBqhJgPvug7Vr4f77C/xEvSph0gKYuAAy/cEqclvPKqJ3KBMX\nwqTfQa8gb5wlZUm2Pf28ma0ys3vMrK352KG0TFXb00M0f/4Hbwtu1KVw/moYNBYq+nW9bEW/aLnz\nV8GomcnUJ4lI6r+GPwML3X2PmV0DzAfOPpQHcPc5wByIWnSEL7H03XsvLFkSTTfTzPK3NjNgfAtP\n1h/NtddW7V9uyhS46KICFTHgBDivHpZ/Ldop29F+lkz/6OPOP/wyepcjZSVEqHTb9tTdt2XdnQv8\nOGvdKe3WXRKgpsPSvn1w223Q3Ax9jt1B31G7qAD8Q9v4xS+OAyCTgcmTC1xIr0qoGh4dQu5I6z6o\nOkaBUqYSaXtqZsOz7k4DXoinHwbOjdufDgbOjcekB2bMgJUrYfRoqGztvX+8dU+GqqpofOVKmD49\ngWI23PnBULGsAGndG82XspRU29NrzWwa0AxsBy6P191uZj8kCiaAG919e741Hc7GjoX6ehg6dAC2\n+xh69d3H3i2DqACee67AR4Ha7FgHu984cL+iCkZMh1fvOnDOyu7N8G4DDDwxgYIkSUH2qbj7A8AD\n7cZqsqa/D3y/k3XnAfNC1CGRJ5+Efv1g17sDaNkBGYOqqmj8ggsSKODVu6NzUnr1hb7D4Mw/w+BT\n4aRvwV//EXZvPXD6/skd/llICdMZtWWothZ27oTx46NzVMaPj+7X1iZUwIb50X6TEZfABS9EgQLR\n7QUvwIiLo49A63WeYzlSqJShdeugpgaWLoUJE6LbmppovOBam6F1D0xaBBNroyM92TL9YeKd0fzW\n3dHyUlbMvfSOzlZXV3tdXV3aZYiULTOrd/fqnqyrdyoiEpRCRUSCUqiISFAKFREJSqEiIkEpVEQk\nKIWKiASlUBGRoBQqIhKUQkVEglKoiEhQChURCUqhIiJBKVREJCiFiogEFSRUzGyqmb1oZg1mdl0H\n879tZmvjvj+PmtnIrHktZrYi/lncfl0RKS1JtT39X6Da3d83s68QteiYEc/b5e7j8q1DRIpDIm1P\n3f1xd38/vruMqL+PiJShJNuetrkSeDDrft+4nekyM/tcZyup7alIaUi0I7aZ/TNQDZyZNTzS3RvN\nbDTwmJmtdveX26+rtqcipSHEO5Vu254CmNk5wA+Aae6+p23c3Rvj2/VELU/HB6hJRFKSVNvT8cDt\nRIGyJWt8sJn1iaeHApOA7B285e2GG+DUU6EEOxqIdCbvUHH3ZqCt7ekLwF1tbU/jVqcAPwEGAHe3\nO3T8MaDOzFYCjwOz2x01Km8tLbBqFaxenXYlZaupCU4+ObqVZCTV9vScTtZ7GjglRA0laepUuPlm\neOgh+PjH066mLN13H6xdC/ffD7NmpV3N4UFn1KbpjDOijukPPQQ7dsCKFWlXVHbumN9Kr6o93DG/\nNe1SDhuJHv2RLO+8Axs3wplnwoMPRrff/CaM03mA+bj3XliyJJrebbup39nIwNNaqNtRyVevPZ5M\n/Cc/ZQpcdFFqZZY1hUpaBg6Ea66BZ56J7q9YAZWV6dZUBvbtg9tug+ZmGDDuTSr6twDQWrGP39y9\nk71vHEkmA5Mnp1xoGdPHn7RUVMCvfw2ZrFzPKOPzNWMGrFwJo0dDn/4fbP7em0pGj47mT5+eUoGH\nAYVKmk45Bb773QP3FSpBjB0L9fXw/sYh+8f2NA5m19b+PPdcNF8KR6GStuuvhzFjoml9/AnmySch\n0zSY9+tHs7PuwzRvGka/ftG4FJZCJW19+8Ltt0fTeqcSTG0t7NwJ407J8PQTFYwfH92vrU27svKn\nUCkGZ50FV1yhUAlo3TqoqYGlS2HChOi2piYal8IyL8FTxKurq72uri7tMsLavh02b45O/xRJmZnV\nu3t1T9bVf43FYsiQ6EekxOnjj4gEpVARkaAUKsWitQWevym6ldKg16xDCpVisfUpWHU9vPW3tCuR\nXOk165BCpVhsXAAYvLIg7UokV3rNOqRQKQbeCq/eDXh06/qaftHTa9YphUox2PYstO6Lplv3wrbl\n6dYj3dNr1imFSjF4ZSG07IqmW3bBxoXp1iPd02vWqSAnv5nZVODnQAUw191nt5vfB6gFTge2ATPc\n/ZV43veJegG1ANe6+8Mhaio6e7bDsiugeefB895aBh4fQfAWaJgL7zx/8HKZAXDGPOijk+QSodes\nR5Jqe3ol8La7n2hmM4EfATPMbCzR1fdPBo4B/mJmH3H38jtGVzkQMv2g8U/dL9vyHrz56MHjI2dB\n5aDwtUnH9Jr1SCJtT+P78+Ppe4BPm5nF44vcfY+7bwAa4scrP70qYdICmLgAMv3BKnJbzyqi/+0m\nLoRJv4Ne+mZFYvSa9UhSbU/3LxO39GgCjspxXaCM2p6OuhTOXw2DxkJFv66XregXLXf+Khg1M5n6\n5GB6zQ5Jyeyodfc57l7t7tXDhg1Lu5z8DDgBzquHUV+I/kfrSKZ/NP+8+mh5SZdes5wl1fZ0/zJm\nlgGOINphm1PL1LLUqxKqhkeHIzvSug+qjomWk+Kg1ywnibQ9je9fFk9fDDzm0YVcFgMzzayPmZ0A\njAGeDVBTadhw5wf/QC3rj7F1bzRfiotes24l1fb0N8BRZtYAfBu4Ll53DXAXUf/kh4CvleWRn47s\nWAe73zhwv6IKRs2Kbtvs3gzvNiRfm3RMr1lOguxTcfcH3P0j7v5hd785Hqtx98Xx9G53v8TdT3T3\nCe6+Pmvdm+P1PuruD4aopyS8end0fkOvvtDveDh3KXzyjui23/HR+P5TwaUo6DXLScnsqC07G+ZH\nn8FHXAIXvACDT43GB58a3R9xcfR2ev38rh9HkqPXLCcKlTS0NkPrHpi0CCbWRkcNsmX6w8Q7o/mt\nu6PlJV16zXKmC1+LyEHyufC13qmISFAKFREJSqEiIkEpVEQkKIWKiASlUBGRoBQqIhKUQkVEglKo\niEhQChURCUqhIiJBKVQCalWTOhGFSiiNjTB+PPz1r2lXIpIuhUogGzfCa6/BOefAnDnR2OLFevci\nh5/DqyFJAU2cCM88A9OmwTXXwOrVsHx5FDbf+Eba1YkkJ693KmY2xMweMbN18e3gDpYZZ2ZLzWyN\nma0ysxlZ8+4wsw1mtiL+GZdPPWkbMwaWLYPzzoNbb41C5nvfg4bD+5KlcpjJ9+PPdcCj7j4GeDS+\n3977wBfd/WRgKvAzMzsya/6/uvu4+GdFnvWk7r334OSTD9zftQu+9CV9DJLDR76hkt3OdD7wufYL\nuPtL7r4unn4d2AKUeDewzg0aBCeeCKeccmDsqafgllvSq0kkSfmGytHuvjmefgM4uquFzWwC0Bt4\nOWv45vhj0U/NrE+e9aRuwIBon8rKlfDEEzB9OmQy8G//Bi+9lHZ1IoXX7TVqzewvwIc6mPUDYL67\nH5m17NvuftB+lXjecGAJcJm7L8sae4MoaOYAL7v7jZ2sfzVwNcCIESNO37hxY9dbVkRefz06IrRm\nDSxaBBU59vkWSUs+16jN68LXZvYiMMXdN7eFhrt/tIPlBhEFyn+4+z2dPNYU4DvufkF3z1uqF77e\nuxdaWqCqqvtlRdKU5oWvs9uZXgb8qf0CcSvUPwC17QMlDiLMzIj2xzyfZz1FrXdvBYqUv3xDZTbw\nGTNbB5wT38fMqs1sbrzMdOBTwOUdHDr+nZmtBlYDQ4Gb8qynZDU1RUeNmprSrkQkP3md/Obu24BP\ndzBeB1wVT/8W+G0n65+dz/OXk/vug7Vr4f77YdastKsR6Tmdpl8ENr39Prff1USvvnuZf3h3zJQy\noNP0U3LvvbBkCWzv9TZbKraytgkGng5PrTqGa68dsH+5KVPgootSK1PkkClUUrJvH9x2G1SNe4de\nWWfnZEa8yS9u7Q9uZDIweXJ6NYr0hD7+pGTGjOgEuaOGQGXlgXGrbKGqfyujR0fzp09Pr0aRnlCo\npGjsWPjtzwbT0nJgrOW9PuzdVcFzz0XzRUqNQiVl2xuOxBuPpvXdfrRsG8iedcfQrx88+WTalYn0\njEIlZbW10LThCE7qcxyPzh/OuLGV7NwZjYuUIoVKytatg5oaWLoUJkyIbmtqonGRUpTXd3/SUqrf\n/REpFWl+90dE5AMUKiISlEJFRIJSqIhIUAoVEQlKoSIiQSlURCQohYqIBKVQEZGgFCoiElTBeynH\ny7VkXfR6cdb4CWb2jJk1mNnv4yvvi0gJS6KXMsCurH7J07LGfwT81N1PBN4GrsyzHhFJWcF7KXcm\n7vVzNtDWC+iQ1heR4pTvNWpz7aXc18zqgGZgtrv/ETgKeMfdm+NlNgHHdvZE2W1PgT1mVo6Nx4YC\nb6VdRIGU67aV63Yd1Gk0V92GSje9lPdzdzezzq6jMNLdG81sNPBY3EDskNpmufscon7LmFldT7+W\nXczKdbugfLetnLerp+t2Gyrufk4XT/ymmQ3P6qW8pZPHaIxv15vZEmA88N/AkWaWid+tHAc09mAb\nRKSIJNFLebCZ9YmnhwKTgLUeXR3qceDirtYXkdKSRC/ljwF1ZraSKERmu/vaeN73gG+bWQPRPpbf\n5Pi8c/Ksu1iV63ZB+W6btqudkrycpIgUL51RKyJBKVREJKiSCBUzu8TM1phZq5l1evjOzKaa2Yvx\naf+dnd1bNPL9mkOx6e73b2Z94q9jNMRfzxiVfJU9k8O2XW5mW7Nep6vSqPNQmNk8M9vS2TlfFrkl\n3uZVZnZaTg/s7kX/Q7Sz96PAEqC6k2UqgJeB0UBvYCUwNu3au9muHwPXxdPXAT/qZLmdadeaw7Z0\n+/sHvgr8Kp6eCfw+7boDbtvlwK1p13qI2/Up4DTg+U7mnw88CBhwBvBMLo9bEu9U3P0Fd3+xm8Um\nAA3uvt7d9wKLiL5GUMx6/DWHIpTL7z97e+8BPh1/XaPYleLfVrfc/QlgexeLXAjUemQZ0Xllw7t7\n3JIIlRwdC7yWdb/L0/6LxCF9zcHMlplZsQZPLr///ct4dMJjE9GpBMUu17+tz8cfE+4xs+OTKa2g\nevRvKt/v/gTT1dcB3L1kT4or1Ncc3P3l0LVKXv4MLHT3PWZ2DdE7srNTrikVRRMq3sXXAXLUCGT/\n71AUp/13tV15fs2h2EIll99/2zKbzCwDHAFsS6a8vHS7be6evR1zifaXlboe/Zsqp48/y4Ex8YWf\nehPtCCzaIyWxHn/NIbEKc5fL7z97ey8GHvN4j2CR63bb2u1rmAa8kGB9hbIY+GJ8FOgMoCnr43rn\n0t4DneNe6n8i+jy3B3gTeDgePwZ4oN3e6peI/hf/Qdp157BdRxFd3God8BdgSDxeDcyNpycCq4mO\nOKwGrky77i6256DfP3AjMC2e7gvcDTQAzwKj06454Lb9J7Amfp0eB05Ku+YctmkhsBnYF//7uhL4\nMvDleL4Bv4y3eTWdHHlt/6PT9EUkqHL6+CMiRUChIiJBKVREJCiFiogEpVARkaAUKiISlEJFRIL6\nfy2Azkr/rQ0KAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\ntQ+RXBARAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def one_step(m):\n", " slam.motion_update(0.2, math.pi / 180.0 * 20, robot)\n", " robot.pose = robot.motion_model(robot.pose, 0.2, math.pi / 180.0 * 20)\n", " measurements = robot.observation(m)\n", " for m in measurements:\n", " slam.measurement_update(m)\n", "\n", "n = 50\n", "for i in range(n):\n", " one_step(m)\n", "\n", "print(str(n) + \"step後の地図\")\n", "slam.draw(robot)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.3" } }, "nbformat": 4, "nbformat_minor": 2 }