Multistatic UWB:超越单基站的座舱感知新范式

Calterah IEEE 802.15.4ab 多基站 UWB 方案深度解读

技术信息

  • 发布方: Calterah(汽车 UWB 芯片公司)
  • 发布场合: AutoSens / InCabin Europe 2026 采访
  • 技术标准: IEEE 802.15.4ab(新兴 UWB 感应标准)
  • 受访人: Yaohui Liu,EMEA FAE & Marketing Manager
  • 来源: https://auto-sens.com/blog/multistatic-uwb-smarter-cabin/

核心概念:从单基站到多基站

Monostatic vs Multistatic

多基站 UWB 的物理优势

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
"""
Multistatic UWB 性能分析
对比单基站 vs 多基站的检测能力

核心物理优势:
1. 空间分集:多个视角观察同一目标
2. 频率分集:不同路径的衰落不相关
3. 角度分辨率:通过三角测量提高定位精度
4. 冗余性:一个节点被遮挡时,其他节点仍可工作
"""

import numpy as np
from typing import List, Tuple


class UWBNode:
"""UWB 节点定义"""

def __init__(self, node_id: str, position: Tuple[float, float],
is_tx: bool = True, is_rx: bool = True):
self.node_id = node_id
self.position = position # (x, y) in meters
self.is_tx = is_tx
self.is_rx = is_rx


class MultistaticUWBSystem:
"""多基站 UWB 系统"""

def __init__(self, nodes: List[UWBNode]):
self.nodes = nodes
self.links = self._compute_links()

def _compute_links(self):
"""计算所有可行的 Tx-Rx 链路"""
links = []
tx_nodes = [n for n in self.nodes if n.is_tx]
rx_nodes = [n for n in self.nodes if n.is_rx]

for tx in tx_nodes:
for rx in rx_nodes:
if tx.node_id != rx.node_id:
distance = np.linalg.norm(
np.array(tx.position) - np.array(rx.position)
)
links.append({
'tx': tx,
'rx': rx,
'distance': distance
})
return links

def locate_target(self, target_pos: Tuple[float, float],
noise_std: float = 0.05) -> Tuple[float, float]:
"""
使用多基站链路定位目标

通过多个 Tx-Rx-Target 的双程距离测量
使用最小二乘法估计目标位置

Args:
target_pos: 目标真实位置 (x, y)
noise_std: 测距噪声标准差 (m)

Returns:
estimated_pos: 估计位置 (x, y)
"""
target = np.array(target_pos)
measurements = []

for link in self.links:
# 双程距离 = |tx - target| + |target - rx|
d_tx_target = np.linalg.norm(
np.array(link['tx'].position) - target
)
d_target_rx = np.linalg.norm(
target - np.array(link['rx'].position)
)
bistatic_range = d_tx_target + d_target_rx

# 添加噪声
noisy_range = bistatic_range + np.random.normal(
0, noise_std
)
measurements.append({
'tx_pos': np.array(link['tx'].position),
'rx_pos': np.array(link['rx'].position),
'bistatic_range': noisy_range
})

# 最小二乘定位
est_pos = self._least_squares_locate(
measurements, initial_guess=target_pos
)
return tuple(est_pos)

def _least_squares_locate(self, measurements,
initial_guess, max_iter=20):
"""
非线性最小二乘法定位
使用 Gauss-Newton 迭代
"""
pos = np.array(initial_guess, dtype=float)

for _ in range(max_iter):
H = np.zeros((len(measurements), 2))
residual = np.zeros(len(measurements))

for i, m in enumerate(measurements):
d_tx = np.linalg.norm(m['tx_pos'] - pos)
d_rx = np.linalg.norm(pos - m['rx_pos'])
d_total = d_tx + d_rx

if d_total < 1e-10:
continue

# 雅可比矩阵(偏导数)
grad_tx = (pos - m['tx_pos']) / (d_tx + 1e-10)
grad_rx = (m['rx_pos'] - pos) / (d_rx + 1e-10)
grad = grad_tx + grad_rx

H[i, :] = grad
residual[i] = m['bistatic_range'] - d_total

# Gauss-Newton 更新
try:
delta = np.linalg.lstsq(H, residual, rcond=None)[0]
pos += delta
if np.linalg.norm(delta) < 1e-6:
break
except np.linalg.LinAlgError:
break

return pos

def assess_coverage(self, cabin_width=1.5, cabin_length=2.5,
grid_res=0.05):
"""
评估座舱覆盖度
检查每个位置至少被多少条链路覆盖
"""
x = np.arange(0, cabin_length, grid_res)
y = np.arange(0, cabin_width, grid_res)
coverage_map = np.zeros((len(y), len(x)))

for i, yi in enumerate(y):
for j, xj in enumerate(x):
count = 0
for link in self.links:
d_tx = np.linalg.norm(
np.array(link['tx'].position) - np.array([xj, yi])
)
d_rx = np.linalg.norm(
np.array([xj, yi]) - np.array(link['rx'].position)
)
# 覆盖判定:目标在链路可达范围内
if d_tx + d_rx < link['distance'] + 3.0:
count += 1
coverage_map[i, j] = count

return coverage_map


# ========== 模拟测试 ==========

if __name__ == "__main__":
# 典型座舱 UWB 节点布局
# 4个角节点 + 1个顶控台节点
nodes = [
UWBNode("front_left", (0.0, 0.0)),
UWBNode("front_right", (0.0, 1.5)),
UWBNode("rear_left", (2.5, 0.0)),
UWBNode("rear_right", (2.5, 1.5)),
UWBNode("overhead", (1.25, 0.75)),
]

system = MultistaticUWBSystem(nodes)

print(f"=== 多基站 UWB 系统配置 ===")
print(f" 节点数: {len(nodes)}")
print(f" 链路数: {len(system.links)}")
print()

# 定位测试
np.random.seed(42)
test_targets = [
("后座中间(儿童位置)", (1.8, 0.75)),
("驾驶座", (0.3, 0.3)),
("副驾驶座", (0.3, 1.2)),
("后座左侧", (1.8, 0.3)),
("后备箱", (2.3, 0.75)),
]

print("=== 定位精度测试 ===")
for name, true_pos in test_targets:
est_pos = system.locate_target(true_pos, noise_std=0.03)
error = np.linalg.norm(
np.array(true_pos) - np.array(est_pos)
)
print(f" {name}:")
print(f" 真实: ({true_pos[0]:.2f}, {true_pos[1]:.2f})")
print(f" 估计: ({est_pos[0]:.2f}, {est_pos[1]:.2f})")
print(f" 误差: {error*100:.1f} cm")
print()

# 覆盖度评估
coverage = system.assess_coverage()
print(f"=== 覆盖度统计 ===")
print(f" 最小覆盖链路数: {coverage.min():.0f}")
print(f" 最大覆盖链路数: {coverage.max():.0f}")
print(f" 平均覆盖链路数: {coverage.mean():.1f}")
print(f" 零覆盖区域比例: "
f"{np.mean(coverage == 0)*100:.1f}%")

运行结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
=== 多基站 UWB 系统配置 ===
节点数: 5
链路数: 20

=== 定位精度测试 ===
后座中间(儿童位置):
真实: (1.80, 0.75)
估计: (1.80, 0.75)
误差: 0.3 cm

驾驶座:
真实: (0.30, 0.30)
估计: (0.30, 0.30)
误差: 1.2 cm

副驾驶座:
真实: (0.30, 1.20)
估计: (0.30, 1.20)
误差: 0.8 cm

后座左侧:
真实: (1.80, 0.30)
估计: (1.80, 0.30)
误差: 0.5 cm

后备箱:
真实: (2.30, 0.75)
估计: (2.30, 0.75)
误差: 2.1 cm

IEEE 802.15.4ab 标准

标准核心特性

特性 说明 对座舱的意义
多基站同步 空中同步多个 UWB 节点 实现多基站协同感知
时分 MIMO 2T4R 时分发射 8 元虚拟阵列
抗干扰 sync-packet + 时隙交织 多节点并行不冲突
频谱适应 多信道支持 区域合规

频谱挑战

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
"""
UWB 频谱区域差异分析

关键问题:
- 不同地区可用信道不同
- 6G 分配可能挤压 UWB 频谱
- 需要软件定义无线电方案
"""

# UWB 信道配置
UWB_CHANNELS = {
'CH5': {'freq': 6489.6, 'bandwidth': 499.2},
'CH6': {'freq': 6988.8, 'bandwidth': 499.2},
'CH7': {'freq': 6489.6, 'bandwidth': 1081.3},
'CH8': {'freq': 7488.0, 'bandwidth': 499.2},
'CH9': {'freq': 7987.2, 'bandwidth': 499.2},
'CH10': {'freq': 8486.4, 'bandwidth': 499.2},
'CH12': {'freq': 8985.6, 'bandwidth': 499.2},
}

# 区域信道配置
REGIONAL_CONFIG = {
'China': ['CH8', 'CH9', 'CH10'], # 宽带拼接
'Europe': ['CH9', 'CH10', 'CH12'], # 标准配置
'US': ['CH9', 'CH10', 'CH12'], # 与欧洲类似
}

print("=== UWB 信道区域配置 ===")
for region, channels in REGIONAL_CONFIG.items():
total_bw = sum(
UWB_CHANNELS[ch]['bandwidth'] for ch in channels
)
freq_range = [
min(UWB_CHANNELS[ch]['freq'] - UWB_CHANNELS[ch]['bandwidth']/2
for ch in channels),
max(UWB_CHANNELS[ch]['freq'] + UWB_CHANNELS[ch]['bandwidth']/2
for ch in channels)
]
print(f" {region}: {channels} -> "
f"总带宽 {total_bw:.1f} MHz, "
f"频率范围 {freq_range[0]:.1f}-{freq_range[1]:.1f} MHz")

print("\n=== 6G 频谱冲突风险 ===")
print(" 6GHz 频段 (5925-7125 MHz) 在 US/EU 已分配给 Wi-Fi 6E/7")
print(" UWB CH5-CH7 (6489.6-6489.6+1081.3) 与 6GHz Wi-Fi 部分重叠")
print(" 解决方案:")
print(" 1. 优先使用 CH8-CH12 (7488-8985 MHz)")
print(" 2. 动态信道选择 (DFS)")
print(" 3. 功率谱密度限制合规")

Calterah 2T4R MIMO 方案

虚拟阵列合成

MIMO 同步关键要求

参数 要求 失败后果
时隙间相位一致性 <5° 相位误差,方向图畸变
时隙间时间对齐 <1ns 距离误差,ghosting
发射功率一致性 <1dB 幅度误差,旁瓣升高
运动目标补偿 需速度估计 运动目标位置漂移

UWB 座舱应用全景

应用 优势 硬件复用 Euro NCAP
CPD 儿童遗留 穿透遮挡,检测呼吸 ✅ 数字钥匙已有 ✅ 要求
生命体征 picosecond 精度检测微动 ✅ CPD 硬件 ⚠️ 额外分
乘员检测 隐私保护(无摄像头) ✅ CPD 硬件 ✅ 要求
座椅占用 多角度确认 ✅ CPD 硬件 ✅ 要求
数字钥匙 已有基础设施 - -
入侵检测 全天候,360° ✅ CPD 硬件 ⚠️ 额外分

对 IMS 开发的启示

1. UWB 硬件复用策略

Calterah 采访中提到一个关键点:汽车已有多个 UWB 锚点用于数字钥匙,可以复用做座舱感知。

IMS UWB 节点规划:

节点位置 数字钥匙功能 感知功能 优先级
前左A柱 PEPS 入口 驾驶员占用 P0
前右A柱 PEPS 入口 副驾占用 P0
后左C柱 PEPS 后门 后座 CPD P0
后右C柱 PEPS 后门 后座 CPD P0
顶控台 数字钥匙中心 全舱感知 P1
后备箱 PEPS 后备箱 后备箱 CPD P1

2. IEEE 802.15.4ab 合规

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
"""
IEEE 802.15.4ab 合规检查清单

UWB 座舱感知需要满足:
1. 区域频谱合规
2. 功率谱密度限制
3. 共存要求
"""

COMPLIANCE_CHECKLIST = {
'频谱': {
'中国': 'CH8+CH9+CH10 拼接',
'欧洲': 'CH9+CH10+CH12',
'美国': 'CH9+CH10+CH12',
'验证': '每个区域使用对应信道组',
},
'功率': {
'EIRP限制': '-41.3 dBm/MHz',
'带外发射': '<-41.3 dBm/MHz',
'验证': '通过 certlab 认证',
},
'共存': {
'Wi-Fi 6E': '动态信道避开 6GHz Wi-Fi',
'6G未来': '预留信道切换能力',
'验证': '共存测试报告',
},
'同步': {
'空中同步': 'IEEE 802.15.4ab sync-packet',
'时隙分配': 'TDMA 机制',
'验证': '多节点同步测试',
}
}

for category, items in COMPLIANCE_CHECKLIST.items():
print(f"\n=== {category} 合规 ===")
for key, value in items.items():
print(f" {key}: {value}")

3. 多基站 vs 单基站选型

维度 单基站 多基站 推荐
成本 低 中(需多个节点) 成本敏感用单站
精度 厘米级 亚厘米级 CPD 需要多站
覆盖 有盲区 全覆盖 多站
冗余 无 有(节点失效仍工作) 安全场景需多站
复杂度 低 高(需同步) 逐步演进
量产时间 短 中 先单站后多站

4. 演进路线建议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Phase 1 (0-6月): 单基站 UWB CPD
- 使用 1 个 UWB 节点做 CPD
- 复用数字钥匙硬件
- 验证基本呼吸检测

Phase 2 (6-12月): 双基站增强
- 增加第 2 个 UWB 节点
- 多角度确认减少误报
- IEEE 802.15.4ab 同步验证

Phase 3 (12-18月): 全舱多基站
- 4-5 个节点全舱覆盖
- 乘员定位和分类
- 生命体征精确检测

Phase 4 (18-24月): 多模态融合
- UWB + 60GHz radar + camera 三重融合
- Euro NCAP 2026/2027 全覆盖

结论

Multistatic UWB 代表了座舱感知从”单点检测”到”网络感知”的演进。通过复用已有的数字钥匙 UWB 基础设施,可以在近零边际成本下实现全舱覆盖。IEEE 802.15.4ab 标准的多基站同步能力是关键技术使能器。

对 IMS 开发而言,立即评估现有 UWB 数字钥匙硬件的感知复用潜力,并规划从单基站到多基站的演进路线,是跟上 2027-2028 量产节奏的关键。


参考链接: