2、行人运动模型基础:社会力模型
好,咱们今天来聊聊行人运动模型里最经典的一个——社会力模型。说实话,我刚入行做自动驾驶仿真那会儿,第一次看到这个模型的名字,还以为是什么社会学理论。后来才发现,这玩意儿在行人模拟里,简直就是基石一样的存在。
社会力模型(Social Force Model)原理
社会力模型,说白了就是把人当成一个「受力粒子」。你想想看,我们走路的时候,是不是会下意识地避开别人?会朝着目标方向走?会跟前面的人保持距离?这些行为,在模型里都被抽象成了「力」。
我个人习惯把这个模型拆成三个核心力:
- 驱动力:你想往哪儿走,就有一个力把你往那个方向拉。比如你赶着去上班,这个力就很大。
- 排斥力:你不想撞到别人,也不想撞到墙。所以人和人之间、人和障碍物之间,都有一个排斥力,距离越近力越大。
- 吸引力:有时候你会被某些东西吸引,比如看到朋友在路边等你,或者看到一家奶茶店。这个力会让你偏离原来的路线。
嗯,这里要注意一点:社会力模型里的「力」不是物理上的力,而是一种数学上的抽象。它描述的是行人行为的变化趋势。我在项目中遇到过有人非要拿牛顿第二定律去套,结果算出来的轨迹完全不对——因为行人不是无摩擦的小球,他有自己的意图和反应时间。
核心思想:行人的加速度 = 驱动力 + 排斥力 + 吸引力 + 随机扰动
社会力模型数学表达
好,咱们来看数学表达。别怕,其实不复杂。我尽量用白话讲清楚。
首先,每个行人 i 都有一个期望速度 v_i^0 和期望方向 e_i^0。驱动力就是让他的实际速度 v_i 朝着期望速度靠近:
F_drive = m_i * (v_i^0 * e_i^0 - v_i) / τ_i
这里 τ_i 是反应时间,说白了就是你从「想加速」到「真的加速」需要多久。我一般取 0.5 秒左右,太快了不真实,太慢了像在梦游。
然后是排斥力。行人 i 和行人 j 之间的排斥力长这样:
F_rep_ij = A_i * exp((r_ij - d_ij) / B_i) * n_ij
其中:
A_i是力的强度,我习惯取 2000 N 左右B_i是作用范围,一般 0.08 米,太小了人会穿模r_ij是两个人半径之和d_ij是两个人质心之间的距离n_ij是从 j 指向 i 的单位向量
你看这个公式,距离越近,力越大,而且是指数增长的。这很符合直觉——你离别人越近,越觉得不舒服,会下意识躲开。
避坑指南:我曾经在调参时把 A_i 设得太大,结果仿真里行人像被弹弓打出去一样,互相弹飞了。后来我学乖了,先设小一点,再慢慢往上加,直到行为看起来自然为止。
障碍物的排斥力跟行人之间的类似,只是把行人换成了墙或者路障。公式差不多:
F_rep_iW = A_W * exp((r_i - d_iW) / B_W) * n_iW
这里 d_iW 是行人和墙的最短距离。嗯,要注意墙是有厚度的,别把行人算到墙里面去了。
最后,把所有力加起来,得到行人的加速度:
a_i = (F_drive + ΣF_rep_ij + ΣF_rep_iW + F_att + ξ) / m_i
那个 ξ 是随机扰动项,用来模拟行人行为的不确定性。我一般加一个高斯噪声,标准差取 0.1 左右,太小了太机械,太大了像喝醉了酒。
社会力模型优缺点
聊完了原理和公式,咱们来客观说说这个模型的优缺点。毕竟没有完美的模型,只有合适的模型。
| 优点 | 缺点 |
|---|---|
| 数学形式简洁,容易实现 | 参数调起来很麻烦,不同场景要不同参数 |
| 能模拟出自然的行人流现象 | 没有考虑行人之间的信息传递(比如眼神交流) |
| 计算效率高,适合大规模仿真 | 在拥挤场景下容易出现震荡或穿模 |
| 可扩展性强,能加各种自定义力 | 对障碍物形状的处理比较粗糙 |
我个人觉得,社会力模型最大的优势就是「够用」。在自动驾驶仿真里,我们不需要模拟行人之间多么复杂的社交互动,只需要他们走路、避让、过马路这些基本行为看起来合理就行。社会力模型正好能满足这个需求。
但它的缺点也很明显。我记得有一次做十字路口的仿真,行人密度一高,模型就开始「抖」——两个人面对面走过来,互相让来让去,就是过不去。后来我加了点随机扰动,又调整了反应时间,才勉强解决。
注意:社会力模型不适合模拟群体恐慌、踩踏等极端场景。在这些场景下,人的行为逻辑完全变了,社会力模型的假设不再成立。如果你要做这类仿真,建议换用基于智能体的模型或者流体模型。
总的来说,社会力模型是行人模拟的「入门标配」。我建议初学者先把这个模型吃透,跑通几个典型场景,再去接触更复杂的模型。毕竟,能把简单的东西用好,比一上来就搞花里胡哨的模型要实在得多。
好,这一节就到这里。下一节咱们聊聊社会力模型在自动驾驶仿真里的具体应用,包括怎么跟感知模块对接、怎么处理行人突然横穿马路这些棘手情况。