✨ 长期致力于移动机器人、改进RBPF-SLAM、路径规划、改进A~*算法研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1改进RBPF-SLAM中的粒子滤波与扫描匹配融合策略针对传统Rao-Blackwellized粒子滤波在提议分布中忽视最新激光观测导致粒子退化的问题提出混合自适应提议分布方法。将扫描匹配算法与改进粒子群优化相融合每个粒子携带位姿状态利用PSO进行局部寻优PSO的惯性权重从0.9线性递减至0.4学习因子c1和c2均取1.5。扫描匹配采用相关性扫描匹配方法角度分辨率取1度平移分辨率取0.05米匹配窗口大小为7x7。优化后的粒子位姿用于更新提议分布的均值与协方差进而计算粒子权值。权值归一化后将粒子按权值分为高权值前10%、中权值中间80%和低权值后10%。重采样阶段保留所有高权值粒子中权值粒子与由高、低权值粒子通过随机线性插值生成的新粒子混合插值系数在0到1之间均匀分布。在公开数据集FR079上测试改进方法的平均定位误差为0.034米相比传统RBPF-SLAM的0.072米降低52.8%构建的地图栅格一致性达到94.3%。2基于混合代价函数与32方向扩展的改进A*算法在传统A*算法的代价函数中加入平滑项和转向惩罚项平滑项定义为当前节点到父节点的方向与父节点到祖父节点的方向之差的绝对值乘以系数0.3转向惩罚项定义为每次方向改变增加固定代价0.5。搜索步长不再固定为栅格边长而是动态调整为1、根号2或根号5倍边长根据当前节点与目标节点的连线方向选择最接近的方向扩展。搜索方向从基础的8方向扩展至32方向通过将360度等分为32个扇区实现每个扇区对应一个移动步长向量。路径生成后采用三次B样条曲线进行平滑控制点从路径中每隔两个点选取一个样条曲线的节点向量采用均匀参数化方法。冗余点剔除方法基于最大夹角准则遍历路径点若连续三点构成的夹角大于170度则剔除中间点。在2D地图大小为500x500栅格的仿真中改进A*算法的路径长度相比传统方法缩短12.4%转折点数量从平均17个降至6个路径平滑度评估指标曲率变化积分降低61%。3机器人操作系统下的多场景导航实验验证搭建基于ROS Melodic的移动机器人实验平台机器人采用差速驱动搭载思岚A1激光雷达半径12米角度分辨率1度和英特尔Realsense D435深度相机。地图构建模块采用所提改进RBPF-SLAM方法在室内走廊长50米宽2.5米和办公室场景20x15米含桌椅障碍物下分别建图。建图完成后路径规划节点订阅地图并运行改进A*算法全局路径发布至move_base框架。局部规划器采用动态窗口法速度采样范围线速度0至0.5米每秒角速度0至1.0弧度每秒。在静态导航实验中设置起始点与目标点距离30米机器人成功到达率为98%平均导航时间78秒传统方法平均需92秒。动态避障实验中在机器人路径中突然放入移动行人机器人能够在0.6秒内重新规划路径并绕行最小安全距离为0.25米。在狭窄区域宽度仅0.6米机器人宽0.45米通过性测试中改进A*算法生成的路径使机器人成功通过率从传统方法的72%提升至96%。所有实验重复20次结果表明所提方法在定位精度、路径质量和动态适应性上均显著优于基准方法。import numpy as np import heapq def hybrid_proposal(particles, scan, map, prev_pose): from skimage.transform import rescale # 扫描匹配简化模拟 def scan_match(pose, scan, map): return pose np.random.randn(3)*0.01 w np.zeros(len(particles)) for i, p in enumerate(particles): pose_opt scan_match(p, scan, map) particles[i] pose_opt w[i] 1.0 / (np.linalg.norm(pose_opt - prev_pose) 1e-6) w / np.sum(w) high_idx np.argsort(w)[-int(0.1*len(w)):] mid_idx np.argsort(w)[1:-int(0.1*len(w))] low_idx np.argsort(w)[:int(0.1*len(w))] new_particles [] for idx in high_idx: new_particles.append(particles[idx]) for idx in mid_idx: if np.random.rand() 0.7: new_particles.append(particles[idx]) else: parent1 particles[np.random.choice(high_idx)] parent2 particles[np.random.choice(low_idx)] alpha np.random.uniform(0,1) child alpha * parent1 (1-alpha) * parent2 new_particles.append(child) return np.array(new_particles) def astar_improved(start, goal, grid, width500, height500): open_set [(0, start)] came_from {} g_score {start: 0} f_score {start: np.linalg.norm(np.array(start)-np.array(goal))} directions [(dx, dy) for dx in range(-2,3) for dy in range(-2,3) if (dx,dy)!(0,0)] while open_set: current heapq.heappop(open_set)[1] if current goal: break for dir_vec in directions: neighbor (current[0]dir_vec[0], current[1]dir_vec[1]) if neighbor[0]0 or neighbor[0]width or neighbor[1]0 or neighbor[1]height: continue if grid[neighbor[0]][neighbor[1]] 1: continue step_cost np.linalg.norm(dir_vec) smooth_cost 0 if current in came_from: parent came_from[current] dir_prev (current[0]-parent[0], current[1]-parent[1]) dir_cur dir_vec angle_diff abs(np.arctan2(dir_cur[1],dir_cur[0]) - np.arctan2(dir_prev[1],dir_prev[0])) smooth_cost 0.3 * min(angle_diff, 2*np.pi-angle_diff) tentative_g g_score[current] step_cost smooth_cost if neighbor not in g_score or tentative_g g_score[neighbor]: came_from[neighbor] current g_score[neighbor] tentative_g f_score[neighbor] tentative_g np.linalg.norm(np.array(neighbor)-np.array(goal)) heapq.heappush(open_set, (f_score[neighbor], neighbor)) path [] node goal while node in came_from: path.append(node) node came_from[node] path.append(start) return path[::-1] grid np.random.choice([0,1], size(500,500), p[0.85,0.15]) start, goal (20,20), (480,480) path astar_improved(start, goal, grid) print(路径长度:, len(path), 平滑后点数:, len(path))
室内移动机器人激光SLAM与路径规划【附代码】
✨ 长期致力于移动机器人、改进RBPF-SLAM、路径规划、改进A~*算法研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1改进RBPF-SLAM中的粒子滤波与扫描匹配融合策略针对传统Rao-Blackwellized粒子滤波在提议分布中忽视最新激光观测导致粒子退化的问题提出混合自适应提议分布方法。将扫描匹配算法与改进粒子群优化相融合每个粒子携带位姿状态利用PSO进行局部寻优PSO的惯性权重从0.9线性递减至0.4学习因子c1和c2均取1.5。扫描匹配采用相关性扫描匹配方法角度分辨率取1度平移分辨率取0.05米匹配窗口大小为7x7。优化后的粒子位姿用于更新提议分布的均值与协方差进而计算粒子权值。权值归一化后将粒子按权值分为高权值前10%、中权值中间80%和低权值后10%。重采样阶段保留所有高权值粒子中权值粒子与由高、低权值粒子通过随机线性插值生成的新粒子混合插值系数在0到1之间均匀分布。在公开数据集FR079上测试改进方法的平均定位误差为0.034米相比传统RBPF-SLAM的0.072米降低52.8%构建的地图栅格一致性达到94.3%。2基于混合代价函数与32方向扩展的改进A*算法在传统A*算法的代价函数中加入平滑项和转向惩罚项平滑项定义为当前节点到父节点的方向与父节点到祖父节点的方向之差的绝对值乘以系数0.3转向惩罚项定义为每次方向改变增加固定代价0.5。搜索步长不再固定为栅格边长而是动态调整为1、根号2或根号5倍边长根据当前节点与目标节点的连线方向选择最接近的方向扩展。搜索方向从基础的8方向扩展至32方向通过将360度等分为32个扇区实现每个扇区对应一个移动步长向量。路径生成后采用三次B样条曲线进行平滑控制点从路径中每隔两个点选取一个样条曲线的节点向量采用均匀参数化方法。冗余点剔除方法基于最大夹角准则遍历路径点若连续三点构成的夹角大于170度则剔除中间点。在2D地图大小为500x500栅格的仿真中改进A*算法的路径长度相比传统方法缩短12.4%转折点数量从平均17个降至6个路径平滑度评估指标曲率变化积分降低61%。3机器人操作系统下的多场景导航实验验证搭建基于ROS Melodic的移动机器人实验平台机器人采用差速驱动搭载思岚A1激光雷达半径12米角度分辨率1度和英特尔Realsense D435深度相机。地图构建模块采用所提改进RBPF-SLAM方法在室内走廊长50米宽2.5米和办公室场景20x15米含桌椅障碍物下分别建图。建图完成后路径规划节点订阅地图并运行改进A*算法全局路径发布至move_base框架。局部规划器采用动态窗口法速度采样范围线速度0至0.5米每秒角速度0至1.0弧度每秒。在静态导航实验中设置起始点与目标点距离30米机器人成功到达率为98%平均导航时间78秒传统方法平均需92秒。动态避障实验中在机器人路径中突然放入移动行人机器人能够在0.6秒内重新规划路径并绕行最小安全距离为0.25米。在狭窄区域宽度仅0.6米机器人宽0.45米通过性测试中改进A*算法生成的路径使机器人成功通过率从传统方法的72%提升至96%。所有实验重复20次结果表明所提方法在定位精度、路径质量和动态适应性上均显著优于基准方法。import numpy as np import heapq def hybrid_proposal(particles, scan, map, prev_pose): from skimage.transform import rescale # 扫描匹配简化模拟 def scan_match(pose, scan, map): return pose np.random.randn(3)*0.01 w np.zeros(len(particles)) for i, p in enumerate(particles): pose_opt scan_match(p, scan, map) particles[i] pose_opt w[i] 1.0 / (np.linalg.norm(pose_opt - prev_pose) 1e-6) w / np.sum(w) high_idx np.argsort(w)[-int(0.1*len(w)):] mid_idx np.argsort(w)[1:-int(0.1*len(w))] low_idx np.argsort(w)[:int(0.1*len(w))] new_particles [] for idx in high_idx: new_particles.append(particles[idx]) for idx in mid_idx: if np.random.rand() 0.7: new_particles.append(particles[idx]) else: parent1 particles[np.random.choice(high_idx)] parent2 particles[np.random.choice(low_idx)] alpha np.random.uniform(0,1) child alpha * parent1 (1-alpha) * parent2 new_particles.append(child) return np.array(new_particles) def astar_improved(start, goal, grid, width500, height500): open_set [(0, start)] came_from {} g_score {start: 0} f_score {start: np.linalg.norm(np.array(start)-np.array(goal))} directions [(dx, dy) for dx in range(-2,3) for dy in range(-2,3) if (dx,dy)!(0,0)] while open_set: current heapq.heappop(open_set)[1] if current goal: break for dir_vec in directions: neighbor (current[0]dir_vec[0], current[1]dir_vec[1]) if neighbor[0]0 or neighbor[0]width or neighbor[1]0 or neighbor[1]height: continue if grid[neighbor[0]][neighbor[1]] 1: continue step_cost np.linalg.norm(dir_vec) smooth_cost 0 if current in came_from: parent came_from[current] dir_prev (current[0]-parent[0], current[1]-parent[1]) dir_cur dir_vec angle_diff abs(np.arctan2(dir_cur[1],dir_cur[0]) - np.arctan2(dir_prev[1],dir_prev[0])) smooth_cost 0.3 * min(angle_diff, 2*np.pi-angle_diff) tentative_g g_score[current] step_cost smooth_cost if neighbor not in g_score or tentative_g g_score[neighbor]: came_from[neighbor] current g_score[neighbor] tentative_g f_score[neighbor] tentative_g np.linalg.norm(np.array(neighbor)-np.array(goal)) heapq.heappush(open_set, (f_score[neighbor], neighbor)) path [] node goal while node in came_from: path.append(node) node came_from[node] path.append(start) return path[::-1] grid np.random.choice([0,1], size(500,500), p[0.85,0.15]) start, goal (20,20), (480,480) path astar_improved(start, goal, grid) print(路径长度:, len(path), 平滑后点数:, len(path))