- 物联网
- 机器人
- 嵌入式
【免费下载链接】gobot
Golang framework for robotics, drones, and the Internet of Things (IoT)
本篇技术指南聚焦于 Gobot(Go 语言机器人/IoT 框架)中 Holystone 平台的 HS200 无人机驱动,讲解如何在你的 Go 程序中初始化驱动、通过 Wi-Fi 与无人机建立 TCP/UDP 双通道通信,并调用TakeOff、Land、Throttle、Rotate、Forward、Right等 API 完成飞行控制。读完本文,你将掌握该驱动的完整使用流程、底层 11 字节 UDP 控制报文的字节含义与校验和算法,以及社区实践中总结出的端口与协议注意事项。
一、Holystone 平台包与支持的机型
在 Gobot 中,Holystone 无人机的支持位于 platforms/holystone 目录,包注释(见 holystone.go)明确说明:目前仅支持 HS200 这一款机型(Holystone HS200W,一款带 720P 高清 Wi-Fi 图传相机的四轴飞行器)。
包结构分为两层:
gobot.io/x/gobot/v2/platforms/holystone:平台总包;gobot.io/x/gobot/v2/platforms/holystone/hs200:HS200 具体驱动包,导出Driver类型与NewDriver构造函数。
从驱动实现看(hs200_driver.go),Driver结构体不依赖任何 Gobot Adaptor(Connection()返回nil),而是直接通过标准库net包建立 TCP 与 UDP 连接,是一个自包含的 Device 驱动。
二、安装与前置条件
安装方式与 Gobot 其他平台一致,在项目目录下获取依赖模块:
go get gobot.io/x/gobot/v2当前仓库模块版本为gobot.io/x/gobot/v2(Go 1.22+,见 go.mod),引入驱动包:
import "gobot.io/x/gobot/v2/platforms/holystone/hs200"使用前需要满足的硬件/网络前置条件:
- 无人机已充满电、各连接件(电池、机身排线等)插接牢固;
- 电脑连接至无人机自带的 Wi-Fi 热点,并确认无人机的 IP 地址;
- 使用 TCP 控制通道时,确认端口(下文详述 8080/8888 端口差异)。
三、连接无人机并创建驱动
1. 连接 Wi-Fi 并确定地址
- 连接无人机广播的 Wi-Fi 网络;
- 识别无人机/网关的 IP 地址(HS200 常见为
172.16.10.1,部分机型或场景下为192.168.0.1)。
2. 通过NewDriver创建驱动
驱动构造函数需要两个地址参数:
drone := hs200.NewDriver("172.16.10.1:8888", "172.16.10.1:8080")- 第一个参数是TCP 地址:对应原厂 Android 控制 App 通过 TCP 发送的字节流通道(用途尚未完全明确,详见下文"随机笔记");
- 第二个参数是UDP 地址:对应飞行控制报文通道,
flightLoop会以 50ms 为周期持续向该地址发送控制包。
测试用例(hs200_driver_test.go)验证了构造函数的参数存储行为:传入127.0.0.1:8080与127.0.0.1:9090后,d.tcpaddress与d.udpaddress被正确赋值。
3. 端口差异的处理建议
部分无人机使用的 TCP 端口可能不同(8080 还是 8888)。如果示例程序无法工作:
- 对无人机进行端口扫描,确认实际开放的端口;
- 或者修改驱动逻辑,跳过 TCP 通道(因为从源码看,TCP 连接建立后并未实际发送数据,飞行控制全部走 UDP)。
四、完整可运行示例
以下是官方推荐的最小可用示例(仓库示例见 examples/holystone_hs200.go,构建标签为//go:build example,可通过go run examples/holystone_hs200.go运行):
package main import ( "time" "gobot.io/x/gobot/v2" "gobot.io/x/gobot/v2/platforms/holystone/hs200" ) func main() { drone := hs200.NewDriver("172.16.10.1:8888", "172.16.10.1:8080") work := func() { drone.TakeOff() gobot.After(5*time.Second, func() { drone.Land() }) } robot := gobot.NewRobot("hs200", []gobot.Connection{}, []gobot.Device{drone}, work, ) if err := robot.Start(); err != nil { panic(err) } }执行流程解析:
NewDriver创建驱动并初始化 11 字节控制报文;gobot.NewRobot注册设备,注意连接列表为空(该驱动无 Adaptor);robot.Start()会调用驱动Start()——内部通过net.Dial("tcp", ...)与net.Dial("udp4", ...)分别建立两条连接(见 hs200_driver.go);- 进入
work后立即TakeOff(),5 秒后通过gobot.After定时执行Land()。
五、底层控制协议:11 字节 UDP 报文与校验和
驱动在NewDriver中构建了固定的 11 字节控制报文(hs200_driver.go),每个字节的含义如下表:
| 索引 | 初始值 | 含义 |
|---|---|---|
| 0 | 0xff | 报文头(header),2 字节中的第 1 字节 |
| 1 | 0x04 | 报文头,2 字节中的第 2 字节 |
| 2 | 0x7e | 左摇杆:油门(throttle),范围约0x00–0xff |
| 3 | 0x3f | 左摇杆:左右旋转/偏航(yaw) |
| 4 | 0xc0 | 右摇杆:前进/后退(pitch),范围约0x80–0xfe |
| 5 | 0x3f | 右摇杆:左/右平移(roll),范围约0x00–0x7e |
| 6 | 0x90 | Trim:偏航微调(yaw trim) |
| 7 | 0x10 | Trim:俯仰微调(pitch trim) |
| 8 | 0x10 | Trim:横滚微调(roll trim) |
| 9 | 0x00 | 功能标志位/按键(flags/buttons) |
| 10 | 0x00 | 校验和:255 - ((索引 1 到 9 之和) % 256) |
校验和算法在源码中实现为(hs200_driver.go):
func checksum(c []byte) byte { var sum byte for i := 1; i < 10; i++ { sum += c[i] } return 255 - sum }每次修改任一控制字节后,驱动都会立即重新计算第 10 字节,保证报文始终有效。
飞行控制循环
Enable()会启动一个常驻 goroutineflightLoop(hs200_driver.go),内部使用两个定时器:
- UDP tick(50ms):周期调用
sendUDP()向无人机持续发送当前控制报文; - TCP tick(1000ms):预留通道,源码注释说明"等弄清楚 TCP 命令用途后再从这里发送"。
六、飞行控制 API 与取值范围
Driver提供的 API 均通过mutex(sync.RWMutex)保护,防止并发写报文导致数据竞态。
1. 起飞与降落
TakeOff()与Land()采用"按键脉冲"方式:先将第 9 字节(flags)置为对应值(起飞0x40、降落0x80),等待 500ms 后复位为0x04(见 hs200_driver.go):
| API | flags 字节(cmd[9]) | 行为 |
|---|---|---|
TakeOff() | 0x40→ 500ms 后0x04 | 起飞升空 |
Land() | 0x80→ 500ms 后0x04 | 降落 |
2. 四向控制
四个方向控制 API 接收float32速度参数,范围约定为-1.0 到 +1.0:
Throttle(speed):油门,正值为爬升、负值为下降(cmd[2],中性点0x7e);Rotate(speed):偏航旋转,正/负表示左右转向(cmd[3],中性点0x3f);Forward(speed):前进/后退,内部做了speed = -speed反转后映射到 cmd[4](中性点0xc0);Right(speed):右移/左移(cmd[5],中性点0x3f)。
浮点值到字节的映射由floatToCmdByte完成(hs200_driver.go):先将输入钳制在[-1, 1],再乘以最大值、加上中性点并取整:
func floatToCmdByte(cmd float32, mid byte, maxv byte) byte { if cmd > 1.0 { cmd = 1.0 } if cmd < -1.0 { cmd = -1.0 } cmd = cmd * float32(maxv) bval := byte(cmd + float32(mid) + 0.5) return bval }典型组合示例——起飞后持续悬停微调与转向:
drone.TakeOff() drone.Throttle(0.3) // 轻微爬升 drone.Rotate(0.5) // 向右偏航 drone.Forward(-0.4) // 后退 drone.Land()七、实测笔记与注意事项(来自社区逆向分析)
HS200 驱动文档中记录了大量来自 hackaday 项目与第三方逆向工程的实测观察,对实际飞行调试非常重要:
- 视频流:HS200 会从机身摄像头发出 RTSP 视频流,数据通过 UDP 传输。第三方资料提及可用 VLC 打开
rtsp://192.168.0.1/0查看,但视频流的开启方式尚不明确; - TCP 通道:原厂 Android 控制 App 会向无人机发送一串用途未知的 TCP 字节
00 01 02 03 04 05 06 07 08 09 25 25,且无人机不依赖 TCP 连接即可飞行;无人机对 TCP 请求的固定回复是"noact\r\n"; - 额外 UDP 包:App 偶尔会发送 29 字节的 UDP 数据包(用途未知),例如
26 e1 07 00 00 07 00 00 00 10 00 00 00 00 00 00 00 14 00 00 00 0e 00 00 00 03 00 00 00; - 遥测缺失:除视频流外,无人机似乎不会回传任何遥测数据;
- 稳定性:无人机偶尔会出现飞行不稳的情况,建议确保电池满电、Wi-Fi 干扰最小化、机身上各连接器插接牢固;
- 遥控器与 Wi-Fi:尚不清楚遥控器是否使用 Wi-Fi 通信,Wi-Fi 可能仅供手机 App 使用。
这些观察与源码实现相互印证:驱动只单向发送 UDP 控制包,从不为遥测解析设计接口。
八、驱动生命周期与接口契约
Driver完整实现了gobot.Driver接口,测试文件第一行即通过编译期断言验证(hs200_driver_test.go):
var _ gobot.Driver = (*Driver)(nil)接口契约一览:
| 方法 | 行为 |
|---|---|
Name() / SetName(n) | 设备名,默认值为gobot.DefaultName("HS200") |
Connection() | 返回nil(无 Adaptor 的自包含驱动) |
Start() | 建立 TCP 与 UDP 连接 |
Halt() | 调用stop()将enabled置为false,停止飞行循环 |
Enable() / Disable() | 启动/停止常驻的flightLoopgoroutine |
九、小结
通过 Gobot 的holystone/hs200驱动,你可以用十几行 Go 代码完成对 Holystone HS200 无人机的连接、起飞、四向控制和降落。其设计要点在于:UDP 通道承载 50ms 周期的飞行控制报文,TCP 通道暂时只建立不发送;所有控制动作本质上是改写 11 字节报文中的对应字节并重算校验和。如果你需要进一步探索,可以从以下路径深入:
- 驱动实现:platforms/holystone/hs200/hs200_driver.go
- 驱动测试:platforms/holystone/hs200/hs200_driver_test.go
- 可运行示例:examples/holystone_hs200.go
- 平台包声明:platforms/holystone/holystone.go
- 物联网
- 机器人
- 嵌入式
【免费下载链接】gobot
Golang framework for robotics, drones, and the Internet of Things (IoT)
相关推荐
用 Gobot 控制 Holystone HS200 无人机:驱动安装、Wi-Fi 连接与飞控命令实战指南
用 Gobot 控制 Holystone HS200 无人机:驱动安装、Wi Fi 连接与飞控命令实战指南 本文以 Gobot 框架中的 Holystone H
物联网机器人嵌入式Gobot 驱动 DJI Tello 无人机:从 Wi-Fi 连接到飞控、事件与视频流的完整实践指南
Gobot 驱动 DJI Tello 无人机:从 Wi Fi 连接到飞控、事件与视频流的完整实践指南 本文以 Gobot(Go 语言机器人框架)内置的 DJI
物联网机器人嵌入式Gobot 控制 Parrot ARDrone 四轴飞行器:从 WiFi 连接到飞行控制实战
Gobot 控制 Parrot ARDrone 四轴飞行器:从 WiFi 连接到飞行控制实战 本文以 Gobot 开源机器人框架(当前仓库 platforms/
物联网机器人嵌入式
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考