Livox Horizon及同类LiDAR扫描模式的数学描述与程序实现咨询
一、数学描述
Livox Horizon采用非重复螺旋扫描模式,区别于传统机械式LiDAR的周期性往复扫描,其轨迹由水平方位角的匀速旋转和垂直俯仰角的慢变周期扰动合成,核心特点是长时间内轨迹无重复,实现逐步覆盖全场景。
1. 方位角(Azimuth)变化
水平方向为连续匀速旋转,角速度记为$\omega_a$(单位:rad/s),任意时刻$t$的方位角:
$$\theta_a(t) = \omega_a \cdot t + \theta_{a0}$$
其中$\theta_{a0}$为初始方位角(rad)。
2. 俯仰角(Elevation)变化
垂直方向是缓慢线性漂移+周期振动的复合运动,覆盖范围约-25°~+15°,数学表达式:
$$\theta_e(t) = \theta_{e0} + k \cdot t + A \cdot \sin(\omega_e \cdot t + \phi)$$
参数说明:
- $\theta_{e0}$:初始俯仰角(rad)
- $k$:俯仰角线性漂移系数(rad/s,控制垂直方向覆盖速度)
- $A$:俯仰振动振幅(rad)
- $\omega_e$:俯仰振动角频率(rad/s)
- $\phi$:振动初始相位(rad)
关键特性:俯仰振动周期与水平旋转周期的比值为无理数,确保扫描轨迹不会在有限时间内重复。
3. 点云坐标转换
结合LiDAR测量的距离$d(t)$,将极坐标转换为笛卡尔坐标(传感器坐标系下):
$$
\begin{cases}
x(t) = d(t) \cdot \cos(\theta_e(t)) \cdot \cos(\theta_a(t)) \
y(t) = d(t) \cdot \cos(\theta_e(t)) \cdot \sin(\theta_a(t)) \
z(t) = d(t) \cdot \sin(\theta_e(t))
\end{cases}
$$
二、程序实现(Python示例)
以下是基于上述数学模型的模拟实现,参数参考Livox Horizon官方标称值:
1. 定义核心参数
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 水平扫描参数 omega_a = 2 * np.pi * 10 # 10转/秒,转换为rad/s theta_a0 = 0.0 # 初始方位角(rad) # 俯仰扫描参数 theta_e0 = np.deg2rad(-25) # 初始俯仰角(对应最低位置) k = np.deg2rad(0.08) # 垂直方向漂移速度,约0.08°/s A = np.deg2rad(4) # 俯仰振动振幅,约4° omega_e = 2 * np.pi * 0.15 # 振动频率0.15Hz phi = 0.0 # 初始相位 # 模拟配置 total_time = 8 # 模拟8秒扫描 point_freq = 240000 # Livox Horizon标称点频24万点/秒 t_steps = np.linspace(0, total_time, total_time * point_freq)
2. 计算角度与点云坐标
# 计算每个点的方位角、俯仰角 theta_a = omega_a * t_steps + theta_a0 theta_e = theta_e0 + k * t_steps + A * np.sin(omega_e * t_steps + phi) # 模拟距离数据(实际为LiDAR测量值,这里固定为10m) d = np.full_like(t_steps, 10.0) # 极坐标转笛卡尔坐标 x = d * np.cos(theta_e) * np.cos(theta_a) y = d * np.cos(theta_e) * np.sin(theta_a) z = d * np.sin(theta_e)
3. 扫描轨迹可视化
# 3D轨迹展示 fig = plt.figure(figsize=(12, 8)) ax = fig.add_subplot(111, projection='3d') ax.scatter(x, y, z, s=0.5, alpha=0.4) ax.set_xlabel('X (m)') ax.set_ylabel('Y (m)') ax.set_zlabel('Z (m)') ax.set_title('Livox Horizon Scan Trajectory Simulation') plt.show() # 俯视图(XY平面) plt.figure(figsize=(8, 8)) plt.scatter(x, y, s=0.3, alpha=0.4) plt.xlabel('X (m)') plt.ylabel('Y (m)') plt.title('Top View of Scan Trajectory') plt.axis('equal') plt.show()
实现注意事项
- 实际参数需以Livox官方技术手册为准,上述为近似标称值;
- 真实场景中需考虑LiDAR的点发射时序(离散时间步长),而非连续时间模拟;
- 若需更精确建模,可加入激光束的发散角、测距误差等物理特性。
内容的提问来源于stack exchange,提问作者Yusuf Ziya Güleray

