第一次拿到Benewake TF03长距雷达时,我差点被它小巧的体积骗了——这个巴掌大的设备竟然能实现180米的测距范围。作为北醒光子旗下的明星产品,TF03采用905nm激光波长,在保证人眼安全的前提下,实现了±2cm的高精度测量。无论是无人机避障、工业自动化还是智能交通,这个小家伙都能大显身手。
我特别喜欢它的环境适应性。实测在强光直射下,TF03依然能稳定输出数据,这得益于它的抗干扰算法设计。记得有次在户外测试,正午阳光直射时,普通红外传感器早已失灵,而TF03依然能准确识别30米外的障碍物。它的IP67防护等级也让人放心,雨天户外使用完全不是问题。
硬件参数方面有几个关键点需要注意:
拆开TF03的包装盒,你会看到以下标配物品:
特别提醒要检查航空插头的针脚定义,不同版本可能略有差异。我遇到过因为线序接反而导致设备无法通信的情况,后来养成了先核对针脚再通电的好习惯。
北醒提供的Windows上位机软件是快速验证设备的好帮手。下载安装后,按这个步骤操作:
如果一切正常,你会看到实时距离数据在界面跳动。这里有个实用技巧:按住"保存数据"按钮可以记录测量日志,后期分析非常方便。我常用这个功能来做性能基准测试。
没有上位机时,用普通串口助手也能测试。TF03默认输出的是十六进制数据帧,格式如下:
code复制0x59 0x59 [Dist_L] [Dist_H] [Strength_L] [Strength_H] [Temp_L] [Temp_H] 0xCRC
分享一个我常用的Python测试脚本:
python复制import serial
ser = serial.Serial('COM3', 115200, timeout=1)
while True:
data = ser.read(9)
if data[0] == 0x59 and data[1] == 0x59:
distance = data[2] + data[3]*256
print(f"距离: {distance}cm")
将TF03接入Arduino UNO只需要4根线:
注意:烧录程序时要断开RX连接,否则会导致冲突。这个坑我踩过三次才长记性。
下面是一个完整的避障程序,当检测到障碍物小于50cm时触发报警:
arduino复制#include <SoftwareSerial.h>
SoftwareSerial tfSerial(10, 11); // RX,TX
void setup() {
Serial.begin(115200);
tfSerial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
if(tfSerial.available() >= 9) {
if(tfSerial.read() == 0x59 && tfSerial.read() == 0x59) {
int dist = tfSerial.read() + tfSerial.read()*256;
tfSerial.read(); tfSerial.read(); // 跳过信号强度
tfSerial.read(); tfSerial.read(); // 跳过温度值
tfSerial.read(); // 跳过CRC
Serial.print("Distance: ");
Serial.print(dist);
Serial.println(" cm");
digitalWrite(LED_BUILTIN, dist < 50 ? HIGH : LOW);
}
}
}
在长时间运行中,我发现两个提升稳定性的方法:
tfSerial.flush()清除缓冲区垃圾数据millis()做非阻塞延时,避免delay()导致的数据丢失首先安装必要的库:
bash复制sudo apt-get install python3-serial
为了避免主程序被阻塞,我习惯用线程来处理串口数据:
python复制import threading
import serial
from queue import Queue
data_queue = Queue()
def serial_thread():
ser = serial.Serial('/dev/ttyAMA0', 115200, timeout=1)
while True:
data = ser.read(9)
if data[0] == 0x59 and data[1] == 0x59:
data_queue.put(data[2] + data[3]*256)
threading.Thread(target=serial_thread, daemon=True).start()
while True:
if not data_queue.empty():
print(f"当前距离: {data_queue.get()}cm")
对于机器人应用,可以创建TF03的ROS驱动节点:
python复制#!/usr/bin/env python
import rospy
from sensor_msgs.msg import Range
rospy.init_node('tf03_driver')
pub = rospy.Publisher('tf03/range', Range, queue_size=10)
msg = Range()
msg.radiation_type = Range.INFRARED
msg.field_of_view = 0.04 # 约2.3度
msg.min_range = 0.1
msg.max_range = 180.0
ser = serial.Serial(rospy.get_param('~port', '/dev/ttyAMA0'),
rospy.get_param('~baud', 115200))
rate = rospy.Rate(30)
while not rospy.is_shutdown():
data = ser.read(9)
if data[0] == 0x59 and data[1] == 0x59:
msg.range = (data[2] + data[3]*256)/100.0 # 转为米
msg.header.stamp = rospy.Time.now()
pub.publish(msg)
rate.sleep()
使用STM32CubeMX配置串口时要注意:
这是我验证过的稳定接收代码:
c复制#define TF03_BUFFER_SIZE 18
uint8_t tf03_buffer[TF03_BUFFER_SIZE];
uint16_t distance = 0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if(huart == &huart1) {
if(tf03_buffer[0] == 0x59 && tf03_buffer[1] == 0x59) {
distance = tf03_buffer[2] + (tf03_buffer[3] << 8);
// 触发数据处理事件
}
HAL_UART_Receive_DMA(&huart1, tf03_buffer, 9);
}
}
工业环境中建议添加滑动平均滤波:
c复制#define FILTER_WINDOW 5
uint16_t filter_buffer[FILTER_WINDOW];
uint8_t filter_index = 0;
uint16_t apply_filter(uint16_t new_val) {
filter_buffer[filter_index++] = new_val;
if(filter_index >= FILTER_WINDOW) filter_index = 0;
uint32_t sum = 0;
for(uint8_t i=0; i<FILTER_WINDOW; i++) {
sum += filter_buffer[i];
}
return sum / FILTER_WINDOW;
}
在仓库AGV项目中,我将TF03安装在车辆四角:
通过CAN总线组网,所有雷达数据实时上传到主控。这里有个布线技巧:使用带屏蔽的CAN电缆,能有效减少电机干扰。
四旋翼无人机上,TF03朝下安装测量离地高度。关键参数设置:
实测在10米高度内,定位精度可达±3cm,完全满足精准农业喷洒需求。
传统安全光幕维护成本高,我用多台TF03构建了柔性防护系统:
这套系统不仅成本降低60%,还能记录入侵轨迹,特别适合大型冲压设备防护。