Lightware SF45/B旋转式激光雷达
LightWare的SF45/B是一款超小且轻便的旋转式激光雷达,测距范围达50米。它无需借助伴侣计算机,就能实现防撞功能。
INFO
该激光雷达驱动未包含在PX4的默认构建中。你需要创建并使用自定义构建。
LightWare Studio设置
在LightWare Studio应用程序中设置以下值:
参数 | 描述 |
---|---|
波特率 | 921600 |
确保设置的扫描角度不会使无人机上的任何部件干扰测量。驱动和防撞功能会自动处理与最大角度不同的扫描角度。
硬件安装
该测距仪可连接到任何未使用的串口,如TELEM2
。参数配置部分会说明如何配置要使用的端口以及测距仪的其他属性。
PX4设置
将驱动添加到PX4构建中
此激光雷达的驱动默认未包含在PX4固件中。你需要执行以下操作:
- 将lightware_sf45_serial驱动添加到固件中:
- 安装并打开menuconfig。
- 在menuconfig中,导航至驱动程序 > 距离传感器。
- 选择/启用
lightware_sf45_serial
。
- 为你的飞行控制器目标构建PX4,然后上传新固件。
参数配置
你需要配置PX4,以指明传感器所连接的串口(按照串口配置),同时还要设置传感器的方向和其他属性。需要更改的参数如下表所示:
参数 | 描述 |
---|---|
SENS_EN_SF45_CFG | 设置为传感器所连接的串口。 |
SF45_ORIENT_CFG | 设置传感器的方向(朝上或朝下)。 |
SF45_UPDATE_CFG | 设置更新速率。 |
SF45_YAW_CFG | 设置偏航方向。 |
测试
你可以通过连接QGroundControl,并观察MAVLink Inspector中是否存在OBSTACLE_DISTANCE,来确认传感器是否配置正确。
QGC中的障碍物叠加图会如下所示:
驱动实现
传感器驱动发布ObstacleDistance UORB消息,供PX4的防撞功能使用。每个扇区的测量值将对应传感器在该扇区的最低测量值。然后,数据会发布到OBSTACLE_DISTANCE MAVLink消息中。
故障处理
错误与抖动
启动问题、抖动,或者使用lightware_sf45_serial status
命令显示大量通信错误,可能意味着传感器供电不足。
根据其数据手册,该传感器在5V电压下需要300mA的电流。所提供的电缆相当长,当连接到5V电源(如飞行控制器的TELEM2
端口)时,测距仪处的电压可能会降至所需水平以下。一种缓解措施或替代方法是通过单独的降压转换器从电池电压为SF45供电,确保测距仪两端有5V电压。
使用PlotJuggler进行调试
如果你能在x - y图中绘制OBSTACLE_DISTANCE消息,那么调试距离传感器的问题会容易得多,因为这样你可以直接看到测量值相对于无人机的方向。
以下视频展示了如何在PlotJuggler中查看此类绘图。
为了生成这种绘图,你需要将以下响应式Lua脚本添加到PlotJuggler中。如果你保存这些脚本,然后添加新数据,你将看到一个名为obstacle_distance_xy
的新时间序列,这与视频中显示的内容相同。
TIP
在《防撞功能》主题中使用PlotJuggler实时绘制障碍物距离和最小距离有更详细的关于如何在PlotJuggler中使用响应式脚本的示例。
全局代码,仅执行一次:
obs_dist_xy = ScatterXY.new("obstacle_distance_xy")
function(tracker_time)
obs_dist_xy:clear()
i = 0
angle_offset = TimeseriesView.find("obstacle_distance/angle_offset")
increment = TimeseriesView.find("obstacle_distance/increment")
while(true) do
str = string.format("obstacle_distance/distances.%02d", i)
distance = TimeseriesView.find( str )
if distance == nil then break end
angle = angle_offset:atTime(tracker_time) + i * increment:atTime(tracker_time)
y = distance:atTime(tracker_time) * math.cos(math.rad(angle))
x = distance:atTime(tracker_time) * math.sin(math.rad(angle))
obs_dist_xy:push_back(x, y)
i = i + 1
end
TIP
若要同时查看融合后的obstacle_distance
,你只需修改脚本,使其适用于obstacle_distance_fused
消息。