✅博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。
✅ 如需沟通交流,扫描文章底部二维码。
(1)基于自适应信息素挥发与多步不等概率转移的改进蚁群全局规划:
为解决传统蚁群算法收敛慢且易陷入局部最优,对蚁群进行了三项改进。首先,信息素挥发系数ρ不再固定,而是设计为随迭代代数增大的Sigmoid型自适应函数,前期ρ较小以增强探索,后期ρ增大加速收敛。其次,状态转移概率不只考虑信息素和启发式,还引入转角惩罚因子,当蚂蚁选择路径点导致转弯角度超过π/4时,转移概率被额外衰减,以生成更平滑的路径。第三,采用多步前瞻搜索策略,每次蚂蚁选择下一节点时,不仅评估直接邻居,还评估两步可达节点的综合代价,然后以轮盘赌方式采样最终节点,这样能提前感知障碍物分布并减少无效绕行。改进蚁群在复杂迷宫地图上迭代80次后,最优路径长度比传统蚁群缩短12.7%,转弯次数减少34.5%,路径平滑度显著提升。规划结果通过冗余点删除和B样条拟合得到全局引导点序列。
(2)基于动态模糊权重调整的改进DWA局部避障:
动态窗口法(DWA)的评价函数包含方位、速度和障碍物距离三项,但其常因固定权重导致在狭窄过道胆小避障或陷入凹陷。设计了一种动态模糊权重调整器,以激光雷达检测到的两侧最小距离和当前速度作为输入,通过模糊规则动态输出方位角权重α(t)和速度权重β(t)。例如当两侧距离均很小时,提高障碍物距离权重并降低速度权重以小心通过;当周围开阔时,提高方位角权重以快速回归全局路径。模糊控制器部署为60行查表形式,更新频率与DWA同步。同时,在障碍物距离项中区分动态与静态障碍物,动态障碍物的影响距离按预测轨迹扩大。改进DWA在包含动态行人和随机摆放箱子的环境中导航,机器人成功率从89%提升至97.5%,平均轨迹长度缩短9.2%,且在墙壁附近的振荡现象完全消失。
(3)全局-局部融合策略与ROS嵌入式验证:
将改进蚁群规划的全局关键点作为DWA的局部目标序列,而非单一终点。当机器人通过当前位置到达某关键点半径0.3米内,自动切换至下一关键点,形成分段引导。若在前往某关键点途中DWA因动态障碍长期无法通过,启用全局重规划:利用当前点与最终目标运行快速蚁群(限制迭代20次)产生一条新全局路径,并将未完成的旧路径截断,实现无缝衔接。融合算法在ROS Gazebo中搭载TurtleBot3进行验证,在50m×30m的复杂动态环境(10个移动障碍物)中,平均任务完成时间较静态全局+传统DWA减少18.3%,路径平滑度(基于曲率积分)改善26.1%,CPU占用稳定。实物实验也验证了该融合方案在真实医院走廊环境中的可靠性。
import numpy as np import random import matplotlib.pyplot as plt # 自适应挥发蚁群 class AdaptiveACO: def __init__(self, map, n_ants=50, alpha=1.0, beta=2.0): self.map = map; self.n_ants = n_ants self.alpha=alpha; self.beta=beta self.pheromone = np.ones_like(map) * 0.1 def plan(self, start, goal, max_iter=80): best_path = None; best_len = np.inf for it in range(max_iter): rho = 0.1 + 0.4 / (1+np.exp(-0.1*(it-40))) paths = [] for _ in range(self.n_ants): path = self.construct_path(start, goal) if path: paths.append(path) self.update_pheromone(paths, rho) cur_best = min(paths, key=len, default=None) if cur_best and len(cur_best) < best_len: best_len = len(cur_best); best_path = cur_best return best_path def construct_path(self, s, g): path = [s] while path[-1] != g: neighbors = self.get_neighbors(path[-1]) if not neighbors: return None probs = [self.pheromone[n]**self.alpha * (1/self.dist(n,g))**self.beta for n in neighbors] if len(path)>=2: for i, n in enumerate(neighbors): angle = self.calc_turn_angle(path[-2], path[-1], n) if angle > np.pi/4: probs[i] *= 0.5 probs = np.array(probs)/sum(probs) next_node = neighbors[np.random.choice(len(neighbors), p=probs)] path.append(next_node) return path # 动态模糊权重DWA class FuzzyDWA: def __init__(self, base_params): self.params = base_params def fuzzy_weights(self, d_left, d_right, speed): if d_left<0.3 and d_right<0.3: return 0.15, 0.6 elif speed > 0.5: return 0.35, 0.3 else: return 0.3, 0.35 def compute_trajectory(self, robot_pose, goal, laser): d_left = min(laser[0:10]); d_right = min(laser[-10:]) alpha, beta = self.fuzzy_weights(d_left, d_right, robot_pose[2]) best_u = (0,0); best_score = -np.inf for v in np.linspace(0, 0.6, 10): for w in np.linspace(-0.8, 0.8, 20): traj = self.simulate(robot_pose, v, w, steps=15) score = alpha*self.heading(traj, goal) + beta*self.vel(v) + (1-alpha-beta)*self.dist_obs(traj, laser) if score > best_score: best_score = score; best_u = (v,w) return best_u如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇