Skip to content

Lightware SF45/B旋转式激光雷达

LightWare的SF45/B是一款超小且轻便的旋转式激光雷达,测距范围达50米。它无需借助伴侣计算机,就能实现防撞功能

LightWare SF45旋转式激光雷达

INFO

该激光雷达驱动未包含在PX4的默认构建中。你需要创建并使用自定义构建

LightWare Studio设置

LightWare Studio应用程序中设置以下值:

参数描述
波特率921600

确保设置的扫描角度不会使无人机上的任何部件干扰测量。驱动和防撞功能会自动处理与最大角度不同的扫描角度。

硬件安装

该测距仪可连接到任何未使用的串口,如TELEM2参数配置部分会说明如何配置要使用的端口以及测距仪的其他属性。

PX4设置

将驱动添加到PX4构建中

此激光雷达的驱动默认未包含在PX4固件中。你需要执行以下操作:

  1. lightware_sf45_serial驱动添加到固件中:
    • 安装并打开menuconfig
    • menuconfig中,导航至驱动程序 > 距离传感器
    • 选择/启用lightware_sf45_serial
  2. 为你的飞行控制器目标构建PX4,然后上传新固件。

参数配置

你需要配置PX4,以指明传感器所连接的串口(按照串口配置),同时还要设置传感器的方向和其他属性。需要更改的参数如下表所示:

参数描述
SENS_EN_SF45_CFG设置为传感器所连接的串口。
SF45_ORIENT_CFG设置传感器的方向(朝上或朝下)。
SF45_UPDATE_CFG设置更新速率。
SF45_YAW_CFG设置偏航方向。

测试

你可以通过连接QGroundControl,并观察MAVLink Inspector中是否存在OBSTACLE_DISTANCE,来确认传感器是否配置正确。

QGC中的障碍物叠加图会如下所示:

QGC中显示的sf45避障地图

驱动实现

传感器驱动发布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中使用响应式脚本的示例。

全局代码,仅执行一次:

lua
obs_dist_xy = ScatterXY.new("obstacle_distance_xy")

function(tracker_time)

lua
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消息。