GitHub_Trending/om/OM1 CRSF远程控制:长距离机器人操作技术
【免费下载链接】OM1 Modular AI runtime for robots 项目地址: https://gitcode.com/GitHub_Trending/om/OM1
引言
当前以安全为重点的机器人运动手动控制通常使用蓝牙游戏手柄,但这些手柄并不特别可靠。最大的问题是大多数游戏手柄在闲置几分钟后会进入睡眠状态,导致控制中断。想象一下,当你让OpenAI的o4-mini完全控制一个人形机器人,却发现用于"禁用AI"的游戏手柄为了省电而进入睡眠状态,这无疑会让人陷入恐慌。相比之下,专业的无人机控制无线电设备提供了更可靠的长距离控制解决方案,本文将详细介绍OM1项目中基于CRSF(Crossfire)协议的长距离机器人控制技术。
CRSF协议概述
CRSF(Crossfire)协议是一种专为远程控制设计的通信协议,最初由TBS(Team Black Sheep)开发,广泛应用于无人机领域。该协议具有低延迟、高可靠性和抗干扰能力强等特点,非常适合对实时性要求较高的机器人远程控制场景。在OM1项目中,CRSF协议的实现主要基于Bryan Mayland的CRSF Python解析器和TBS CRSF官方文档。
硬件配置
推荐硬件
- 发射器:TBS Tango2 II 遥控器
- 接收器:TBS Crossfire Nano RX 或类似CRSF兼容接收器
- USB转TTL转换器:如WaveShare Industrial USB to TTL Converter with Original FT232RNL(注意:假冒的CP2102模块可能会导致CRC错误)
硬件连接
- 将CRSF接收器通过TTL接口连接到USB转TTL转换器
- 将USB转TTL转换器连接到机器人的主控计算机
- 确保接收器的电源供应稳定,电压符合设备要求
遥控器设置
传统的油门控制可能不是机器人控制的最佳选择。你可以通过卸下发射器背面,禁用油门棘轮和摩擦力,并启用回中杆张力,具体操作可参考TBS Tango2手册中的"调整油门棘轮强度"部分。
软件配置
遥控器参数设置
- 长按Menu按钮进入无线电设置
- 按Page按钮切换到第3页(共7页)的RADIO SETUP
- 使用摇杆(右侧的旋转控制拨盘)向下滚动到底部
- 将Mode设置为2(Mode 2模式,油门在左侧摇杆)
更多信息请参见TBS Tango II手册第16页。
其他建议的无线电设置:
- Internal RF
- CRSF
- Ch. range CH1-16
- Receiver 00
- External RF
- Mode OFF
建议使用的波特率设置为420000。
软件驱动配置
OM1项目提供了CRSF协议解析的Python实现,位于system_hw_test/parse_crsf_radio.py。该脚本负责从串口读取CRSF协议数据,并解析为机器人可理解的控制指令。
关键代码片段:
with serial.Serial(
args.port,
args.baud,
timeout=1,
) as ser:
input = bytearray()
while True:
if ser.in_waiting > 0:
input.extend(ser.read(ser.in_waiting))
while len(input) > 2:
expected_len = input[1] + 2
if expected_len > 64 or expected_len < 4:
input = bytearray()
elif len(input) >= expected_len:
single = input[:expected_len] # copy out this whole packet
input = input[expected_len:] # and remove it from the buffer
if single[0] == PacketsTypes.SYNC_BYTE:
if not crsf_validate_frame(single):
packet = " ".join(map(hex, single))
print(f"crc error: {packet}")
else:
handleCrsfPacket(single[2], single)
else:
break
使用方法
查找串口
首先,确定CRSF接收器连接到计算机后的串口名称:
ls /dev/tty.*
通常串口名称类似/dev/tty.usbserial-0001或/dev/tty.usbserial-B003ABY3。
启动CRSF解析器
使用以下命令启动CRSF协议解析器:
uv run parse_crsf_radio.py --port /dev/tty.usbserial-B003ABY3
其中/dev/tty.usbserial-B003ABY3应替换为实际的串口名称。
数据解析
解析器会持续输出接收到的控制数据,例如:
LUD:0.5,LLR:0.5,RUD:0.5,RLR:0.5,SWA:off,SWB:middle,SWC:middle,SWD:off,SWE:off,SWF:off
RSSI=-65/-68dBm LQ=100 mode=1 ant=1 snr=12 power=20 drssi=-72 dlq=98 dsnr=10
这些数据包含了摇杆位置和开关状态,可直接用于控制机器人的运动和行为。
协议解析实现
CRSF协议解析的核心代码位于system_hw_test/parse_crsf_radio.py,主要包括以下几个部分:
数据包类型定义
class PacketsTypes(IntEnum):
GPS = 0x02
VARIO = 0x07
BATTERY_SENSOR = 0x08
BARO_ALT = 0x09
HEARTBEAT = 0x0B
VIDEO_TRANSMITTER = 0x0F
LINK_STATISTICS = 0x14
RC_CHANNELS_PACKED = 0x16
ATTITUDE = 0x1E
FLIGHT_MODE = 0x21
# ... 其他数据包类型
SYNC_BYTE = 0xC8
CRC校验
def crc8_dvb_s2(crc, a) -> int:
crc = crc ^ a
for ii in range(8):
if crc & 0x80:
crc = (crc << 1) ^ 0xD5
else:
crc = crc << 1
return crc & 0xFF
def crsf_validate_frame(frame) -> bool:
return crc8_data(frame[2:-1]) == frame[-1]
数据包处理
def handleCrsfPacket(ptype, data):
if ptype == PacketsTypes.RC_CHANNELS_PACKED:
# 解析RC通道数据
packet = data[2:-1]
packet = packet[1:-1] # 移除类型和CRC
packet_bin_8 = ["{0:08b}".format(i)[::-1] for i in packet] # 反转位顺序
packet_bin_full = "".join(packet_bin_8)
packet_bin_11 = [packet_bin_full[11*i:11*(i+1)] for i in range(16)]
rc_packet = [int(b[::-1], 2) for b in packet_bin_11]
# 处理噪声数据
if max(rc_packet) > 2000:
return
# 映射到0.0到1.0范围
lud = n(rc_packet[2])
llr = n(rc_packet[3])
# ... 解析其他通道
已知问题与解决方案
噪声数据处理
偶尔,某个RC通道的值可能会大于2000,这属于噪声信号。这是一个潜在问题,因为它可能会错误地指示开关被按下。因此,我们会拒绝所有大于2000的数据:
# 有时数据包中会有噪声 - 任何超过2000的值都是无效数据
if max(rc_packet) > 2000:
return
信号范围映射
有效的RC信号范围通常是174到1806,我们将这个范围映射到0.0到1.0区间:
def n(val):
# 拒绝无效值和噪声(任何<174或>1806的值)
res = val - 174
res = res / 1632 # 1806-174=1632
if res > 1.0:
res = 1.0
elif res < 0.0:
res = 0.0
return round(res, 2)
总结
CRSF协议为OM1项目提供了可靠的长距离机器人控制解决方案,相比传统的蓝牙游戏手柄,具有更远的控制距离和更高的可靠性。通过本文介绍的硬件配置、软件设置和协议解析方法,你可以快速实现机器人的长距离远程控制功能。
官方文档:docs/robotics/crsf_long_range_control.mdx 源码实现:system_hw_test/parse_crsf_radio.py
希望本文能帮助你更好地理解和应用CRSF远程控制技术。如果你在使用过程中遇到任何问题,欢迎在项目仓库提交issue或参与讨论。
【免费下载链接】OM1 Modular AI runtime for robots 项目地址: https://gitcode.com/GitHub_Trending/om/OM1
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



