即时定位与地图构建(simultaneous localization and mapping,简写成SLAM),用于环境模型(map)的并行构建,以及在其中移动机器人的状态估算。换句话说,SLAM为你提供了一种实时跟踪机器人在世界上的位置、并识别地标(例如建筑物,树木,岩石和其他世界特征)位置的方法。除了本地化之外,我们还希望建立机器人环境模型,这样我们就有了一个物体的概念,以及围绕机器人的地标,以便我们可以使用此地图数据来确保机器人在世界各地移动时走在正确的道路上。因此,构建地图的关键是机器人本身可能会由于其运动不确定性而失去对其位置的跟踪,因为现有的地图是不存在且我们是使用机器人并行构建地图的。而这就是SLAM发挥作用的地方。
import numpy as npfrom helpers import make_data #slam的实现应该使用以下输入 #请随意更改这些输入值并查看其响应方式! # 世界参数num_landmarks = 5 # number of landmarksN = 20 # time stepsworld_size = 100.0 # size of world (square) # 机器人参数measurement_range = 50.0 # range at which we can sense landmarksmotion_noise = 2.0 # noise in robot motionmeasurement_noise = 2.0 # noise in the measurementsdistance = 20.0 # distance by which robot (intends to) move each iteratation # make_data实例化一个机器人,并为给定的世界大小和给定数量生成的随机地标data = make_data(N, num_landmarks, world_size, measurement_range, motion_noise, measurement_noise, distance)
def initialize_constraints(N, num_landmarks, world_size): ''' This function takes in a number of time steps N, number of landmarks, and a world_size, and returns initialized constraint matrices, omega and xi.''' middle_of_the_world = world_size / 2 ## 建议:在变量中定义和存储约束矩阵的大小(行/列) rows, cols = 2*(N + num_landmarks), 2*(N + num_landmarks) ## TODO: 用两个初始“strength”值定义约束矩阵Omega omega = np.zeros(shape = (rows, cols)) ## 我们机器人最初的x,y位置 #omega = [0] omega[0][0], omega[1][1] = 1,1 ## TODO: Define the constraint *vector*, xi ## 假设机器人以100%的置信度在世界的正中间开始。 #xi = [0] xi = np.zeros(shape = (rows, 1)) xi[0][0] = middle_of_the_world xi[1][0] = middle_of_the_world return omega, xi
def get_poses_landmarks(mu, N): # 创建一个姿势列表 poses = [] for i in range(N): poses.append((mu[2*i].item(), mu[2*i+1].item())) # 创建一个地标列表 landmarks = [] for i in range(num_landmarks): landmarks.append((mu[2*(N+i)].item(), mu[2*(N+i)+1].item())) # 返回完成的列表 return poses, landmarks def print_all(poses, landmarks): print('\n') print('Estimated Poses:') for i in range(len(poses)): print('['+', '.join('%.3f'%p for p in poses[i])+']') print('\n') print('Estimated Landmarks:') for i in range(len(landmarks)): print('['+', '.join('%.3f'%l for l in landmarks[i])+']') # 调用你的slam实现,并传入必要的参数mu = slam(data, N, num_landmarks, world_size, motion_noise, measurement_noise) # 打印出地标和姿势结果if(mu is not None): # 获取姿势和地标列表 # 并打印出来 poses, landmarks = get_poses_landmarks(mu, N) print_all(poses, landmarks)