基于PID和虚拟结构的多智能体控制。 仿真代码量大,有3种仿真效果,包含相应的参考文献。 #python仿真代码

多智能体系统在无人机编队、机器人协作中越来越常见,但让一群铁疙瘩听话可不容易。PID控制是经典方法,加上虚拟结构的概念,能让这群家伙更有组织性。举个例子,假设我们要让五个无人机排成三角形移动——这时候虚拟结构就相当于一个隐形的框架,每个无人机知道自己该占哪个角,PID负责把位置误差压到最小。

先上段核心代码,定义一个带PID的智能体类:

class Agent:
    def __init__(self, kp=0.5, ki=0.01, kd=0.1):
        self.pid = PID(kp, ki, kd)
        self.position = np.random.rand(2)*10  # 随机初始位置
        self.virtual_target = None  # 虚拟结构中的目标点
        
    def update(self, neighbors):
        error = self.virtual_target - self.position
        # 加上邻居位置影响的修正项
        neighbor_force = sum([(n.position - self.position)*0.1 for n in neighbors])
        control = self.pid.compute(error) + neighbor_force
        self.position += control * dt  # 位置更新

这里有个骚操作:除了PID控制误差,还加了邻居间的相互作用力。就像排队时前面人走太快你会下意识跟紧一样,代码里的neighbor_force项让智能体之间保持若即若离的关系,避免挤成一团或者散得太开。

虚拟结构怎么生成?看这段坐标生成逻辑:

def generate_virtual_formation(center, shape='triangle'):
    if shape == 'triangle':
        return [center + [0, 2],  # 顶点
                center + [-1, 0], # 左底角  
                center + [1, 0]]   # 右底角
    elif shape == 'square':
        # 生成正方形坐标...

想要切换编队队形,改个参数就行。实测把shape从triangle换成square,无人机立马变方阵——比军训学生听话多了。

三种典型仿真场景:

  1. 静态队形维持:给固定虚拟结构,看抗干扰能力。故意给某个智能体施加冲力,其他成员会自动补位,像磁铁一样把跑偏的拉回来。
  1. 动态队形变换:虚拟结构的中心点按正弦曲线移动,队形在行进中切换。关键在过渡时的平滑处理,需要给PID加个微分限幅:
    python
    class PID:
    def compute(self, error):
    self.integral += error dt
    derivative = (error - self.lasterror) / dt
    # 限制微分项突变
    derivative = np.clip(derivative, -1, 1)
    output = self.kp
    error + self.kiself.integral + self.kdderivative
    self.last
    error = error
    return output
  1. 障碍规避模式:虚拟结构遇到障碍物时自动变形。通过实时计算障碍物的排斥场,叠加到原本的虚拟目标上:
    python
    def obstacleavoidance(target, obstaclepos):
    direction = target - obstacle_pos
    distance = np.linalg.norm(direction)
    if distance < 2.0: # 进入危险距离
    return target + direction/distance * 0.5 # 沿排斥方向偏移
    return target

调参时发现个反直觉的现象:把积分项系数ki设太大反而容易震荡。后来想明白是因为多智能体之间存在耦合,积分累积导致相位滞后。解决办法是给每个智能体的积分项加个衰减因子,像这样self.integral *= 0.95,相当于让系统"忘记"太久之前的误差。

跑仿真时最治愈的画面:一开始智能体们像无头苍蝇乱窜,约20秒后突然找准各自的位置,整齐划一地开始移动。那个瞬间仿佛看到代码有了生命,在屏幕上跳起机械芭蕾。

(参考文献:Reynolds的boids模型、Olfati-Saber的群体控制框架、经典PID在多体系统的改进方案)

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐