STorM32 BGC 三轴云台学习(一) 通信协议分析

在淘宝买了个三轴云台,基于STorM32 BGC的,用调试软件控制没有问题,但是自动飞行时候也得通过程序自动控制,所以研究下官网协议,并对其进行了翻译说明。

参考链接Serial Communication

Storm32板可通过串口USB、UART和蓝牙进行通信。三组命令可用于串口通信:

  • 简单指令:这个集合有一个非常简单的命令结构,用于GUI的主要任务。
  • RC指令:这套设备的目标是远程控制Storm32万向节。
  • mavlink指令:这个集合是“real”mavlink。

简单指令和RC指令有许多相似之处,都是由固件中相同代码处理的。它们往往比mavlink命令更有效。任何一组命令都可以通过任何串口(USB、UART和蓝牙)进行处理。然而,当mavlink心跳被激活时,UART只接受mavlink命令,并且蓝牙可能不再使用(USB仍然接受所有命令)。

这三个命令集的每个命令都可以互换使用。命令所属的命令集由第一个字符决定。这意味着在通信错误的情况下,消息解析器可能会误解错误后面的字符。消息分析器在超时后重置。

为了理解通信的所有细节,通常最好查看GUI的源代码(包含在任何固件包中)。它是用Perl编写的,Perl足够原始,可以轻松理解代码。

1 串口通信——简单指令

通过串口进行通信的协议遵循以下规则:

  • 控制板根据接收到的命令发送一个或多个字符的对应数据流进行相应。
  • 控制板不会主动发送数据,它只会根据接收到的指令来进行响应而发数据。
  • 控制板会一直响应任何传入的命令,无论是否有效。

控制板返回的任何数据流以以下字符之一结尾:

  • “o”:表示一切正常,即已识别接收的命令
  • “e”:表示发生错误,即接收到无效命令
  • “T”:表示已发生超时,即由多个字符组成的命令未在某个时间窗口内完成。
  • “C”:表示发生校验和错误

每当传输数据时都会调用校验和,例如对于“p”、“g”和“d”命令。

下面列出最重要的简单命令。与GUI交互还需要更多的命令,可以通过查看GUI源代码来获得。

  • 命令t:此命令只返回字符“o”。主机可以使用它来检查板是否仍然连接。
  • 命令v:此命令返回有关已安装固件版本、板名和板类型的信息。数据流有校验位并以字符“o”结束。
  • 命令g:此命令返回包含所有参数值的数据流。数据流有校验位并以字符“o”结束。
  • 命令p:此命令设置所有参数值。命令字符“p”后面需要跟一个包含所有参数值的数据流,数据流有校验位。它返回字符“o”。
  • 命令 d :收到命令“d”后,控制板传输当前的实时数据流,最后附加一个2字节的校验位,并以一个字符’o’结束。协议完整信息可以参考链接获得。
  • 命令s:这个功能基本与命令d相同,但是只传输前5个数据值。

注:程序中所有的校验位计算算法源码请参考3轴云台校验位计算源码

2 串口通信——RC 指令

除了上一节中描述的简单串口指令外,Storm32控制器还能处理一些针对万向节远程控制的消息。这些消息具有更严格的数据格式,并可能提供更高级别的传输可靠性。传输的规则与前面一样。

数据帧的一般结构是:

  • 包头:0xFA用于信息输入,0xFB用于信息输出
  • 长度:有效数据包长度,即数据包的字节数,不包括起始符号、长度字节、命令字节和CRC字
  • 命令:命令字节
  • 有效数据:数据和长度根据需求确定
  • 校验位:x25 16-bit 校验位,不包括起始字节。

如果不需要回应的话,可以将0xfa替换为0xf9。下面是几种常用的控制指令

  • CMD_GETVERSION(#1) 指令:0xFA 0x00 0x01 crc-low-byte crc-high-byte
    如果发生错误,则接收到一个CMD_ACK消息,否则将返回得到固件版本、安装布局版本和此格式的板功能的消息。
    0xFB 0x06 0x00 data1-low data1-high data2-low data2-high data3-low data3-high crc-low-byte crc-high-byte
    其中data1表示固件版本,data2表示安装布局版本,data3表示版功能值。

  • CMD_GETVERSIONSTR(#2) 指令:0xFA 0x00 0x02 crc-low-byte crc-high-byte
    如果发生错误,将发出CMD_ACK消息。否则,将发出包含此格式的版本字符串,名称字符串和电路板字符串的消息:
    0xFB 0x30 0x02 data-stream crc-low-byte crc-high-byte
    数据流包含16字节版本字符串,16字节名称字符串和16字节板字符串。

  • CMD_GETPARAMETER(#3) 指令:0xFA 0x02 0x03 data-low-byte data-high-byte crc-low-byte crc-high-byte
    数据类型为uint16_t,表示请求的参数编号。如果发生错误,将发出CMD_ACK消息。否则,将发出包含此格式的参数值的消息:
    0xFB 0x04 0x03 data1-low-byte data1-high-byte data2-low-byte data2-high-byte crc-low-byte crc-high-byte
    Data1是参数编号,data2是参数值。

  • CMD_SETPARAMETER(#4) 指令:0xFA 0x04 0x04 data1-low-byte data1-high-byte data2-low-byte data2-high-byte crc-low-byte crc-high-byte
    Data1是参数编号,data2是参数值。作为对该命令的响应,将发出CMD_ACK消息。

  • CMD_GETDATA(#5) 指令:0xFA 0x01 0x05 type-byte crc-low-byte crc-high-byte
    Type指定所请求数据流的类型; 目前只支持类型0。如果发生错误,将发出CMD_ACK消息。否则,将发出包含此格式的数据流的消息:
    0xFB 0x4A 0x05 type-byte 0x00 data-stream crc-low-byte crc-high-byte
    数据流包含与’d’命令发送的数据相同的数据。

  • CMD_GETDATAFIELDS(#6) 指令:0xFA 0x02 0x06 data-low-byte data-high-byte crc-low-byte crc-high-byte
    数据类型为uint16_t,表示一个位掩码,用于指定应发送哪些数据。如果发生错误,将发出CMD_ACK消息。否则,将发出包含位掩码字和此格式的所有请求数据的消息:
    0xFB LEN 0x06 data1-low-byte data1-high-byte data-stream crc-low-byte crc-high-byte
    Data1是位掩码字,数据流保存数据。可以触发以下数据位:

0x0001 = LIVEDATA_STATUS_V1 //已弃用,请勿使用
0x0002 = LIVEDATA_TIMES
0x0004 = LIVEDATA_IMU1GYRO
0x0008 = LIVEDATA_IMU1ACC
0x0010 = LIVEDATA_IMU1R
0x0020 = LIVEDATA_IMU1ANGLES
0x0040 = LIVEDATA_PIDCNTRL
0x0080 = LIVEDATA_INPUTS
0x0100 = LIVEDATA_IMU2ANGLES
0x0200 = LIVEDATA_STATUS_DISPLAY
0x0400 = LIVEDATA_STORM32LINK
0x0800 = LIVEDATA_IMUACCCONFIDENCE
0x1000 = LIVEDATA_ATTITUDE_RELATIVE
0x2000 = LIVEDATA_STATUS_V2
0x4000 = LIVEDATA_ENCODERANGLES
0x8000 = LIVEDATA_IMUACCABS
  • CMD_SETPITCH(#10) 指令:0xFA 0x02 0x0A data-low-byte data-high-byte crc-low-byte crc-high-byte
    数据类型为uint16_t,可以采用值700 … 2300。它代表音俯仰输入值。如果发送值0,则将重新调整俯仰轴,忽略任何其他值。作为对该命令的响应,将发出CMD_ACK消息。

  • CMD_SETROLL(#11) 指令:0xFA 0x02 0x0B data-low-byte data-high-byte crc-low-byte crc-high-byte
    数据类型为uint16_t,可以采用值700 … 2300。它表示滚转输入值。如果发送值0,则将重新定位滚动轴。忽略任何其他值。作为对该命令的响应,将发出CMD_ACK消息。

  • CMD_SETYAW(#12) 指令:0xFA 0x02 0x0C data-low-byte data-high-byte crc-low-byte crc-high-byte
    数据类型为uint16_t,可以采用值700 … 2300。它代表偏航输入值。如果发送值0,则偏移轴将被重新定位。忽略任何其他值。作为对该命令的响应,将发出CMD_ACK消息。

  • CMD_SETPANMODE(#13) 指令:0xFA 0x01 0x0D data-byte crc-low-byte crc-high-byte
    该数据的类型为uint8_t,并且可以假设这些值:0 = off,1 = HOLDHOLDPAN,2 = HOLDHOLDHOLD,3 = PANPANPAN,4 = PANHOLDHOLD,5 = PANHOLDPAN,6 = HOLDPANPAN。作为对该命令的响应,将发出CMD_ACK消息。

  • CMD_SETSTANDBY(#14) 指令:0xFA 0x01 0x0E data-byte crc-low-byte crc-high-byte
    数据类型为uint8_t,可以采用以下值:0 = off,1 = on。作为对该命令的响应,将发出CMD_ACK消息。

  • CMD_DOCAMERA(#15) 指令:0xFA 0x06 0x0F dummy-byte data-byte dummy-byte dummy-byte dummy-byte dummy-byte crc-low-byte crc-high-byte
    数据类型为uint8_t,并且可以采用以下值:0 =关闭,1 = IRSHUTTER,2 = IRSHUTTERDELAYED,3 = IRVIDEOON,4 = IRVIDEOOFF。作为对该命令的响应,将发出CMD_ACK消息。

  • CMD_SETSCRIPTCONTROL(#16) 指令:0xFA 0x02 0x10 data1-byte data2-byte crc-low-byte crc-high-byte
    data1和data2的类型为uint8_t。Data1是脚本的编号,data2可以采用以下值:0 = off,1 = CASE#DEFAULT,2 = CASE#1,3 = CASE#2,4 = CASE#3。作为对该命令的响应,将发出CMD_ACK消息。

  • CMD_SETANGLE(#17) 指令:0xFA 0x0E 0x11 float1 float2 float3 flags-byte type-byte crc-low-byte crc-high-byte
    float1,float2,float3字段各占4个字节。它们是浮点型,对应于俯仰,滚转和偏航角度。flags字节允许修改每个轴的角度设置的行为。它们可以处于无限制或有限模式。在无限制模式下,相应的轴可以无限制地设置为任何角度,绕过RcMin和RcMax设置,并且可以同时用于“相对”和“绝对”。在限制模式下,角度设置受RcMin和RcMax的影响设置,仅适用于“绝对”。标志字节的第一位0x01对应于音高,0x02对应于滚动,0x04对应于偏航,并且当设置时,相应的轴处于受限模式。当前未使用类型字节,必须将其设置为零。作为对该命令的响应,将发出CMD_ACK消息。

  • CMD_SETPITCHROLLYAW(#18) 指令:0xFA 0x06 0x12 data1-low-byte data1-high-byte data2-low-byte data2-high-byte data3-low-byte data3-high-byte crc-low-byte crc-high-byte
    data1,data2和data3各自为uint16_t类型,并且可以采用值700 … 2300。它们代表俯仰,滚转,偏航输入值。如果发送值0,则将重新定位相应的轴。忽略任何其他值。作为对该命令的响应,将发出CMD_ACK消息。

  • CMD_SETPWMOUT(#19) 指令:0xFA 0x02 0x13 data-low-byte data-high-byte crc-low-byte crc-high-byte
    数据类型为uint16_t,可以采用值700 … 2300。它代表pwm传递输入值。作为对该命令的响应,将发出CMD_ACK消息。

  • CMD_RESTOREPARAMETER(#20) 指令:0xFA 0x02 0x14 data-low-byte data-high-byte crc-low-byte crc-high-byte
    数据类型为uint16_t并保存参数编号。此命令将参数设置为EEPROM中的值。作为对该命令的响应,将发出CMD_ACK消息。

  • CMD_RESTOREALLPARAMETER(#21) 指令:0xFA 0x00 0x15 crc-low-byte crc-high-byte
    该命令将所有参数设置为存储在EEPROM中的值。作为对该命令的响应,将发出CMD_ACK消息。

  • CMD_SETINPUTS(#22) 指令:0xFA 0x17 0x16 data-bytes crc-low-byte crc-high-byte
    如果未配置虚拟输入,则会覆盖从虚拟输入接收的数据。数据字节的格式与sbus类似:16个11位值的通道组合成22个字节,加上一个状态字节。

  • CMD_SETHOMELOCATION(#23) 指令:0xFA 0x0E 0x17 data-bytes crc-low-byte crc-high-byte
    这将设置STorM32控制器的起始位置。

  • CMD_SETTARGETLOCATION(#24) 指令:0xFA 0x0E 0x18 data-bytes crc-low-byte crc-high-byte
    这将设置STorM32控制器应将摄像机指向的目标位置。

  • CMD_ACTIVEPANMODESETTING(#100) 指令:0xFA 0x01 0x64 data-byte crc-low-byte crc-high-byte
    数据类型为uint8_t,是与平移模式设置相关的位字段:默认设置= 0x00,设置#1 = 0x01,设置#2 = 0x02,设置#3 = 0x03。作为对该命令的响应,将发出CMD_ACK消息。

  • CMD_ACK(#150) 指令:0xFB 0x01 0x96 data-byte crc-low-byte crc-high-byte
    该命令由STorM32控制器发送,以确认执行收到的RC命令消息(如果消息本身不导致响应,例如get参数命令)。数据类型为uint8_t,可以采用以下值:

0 = SERIALRCCMD_ACK_OK
1 = SERIALRCCMD_ACK_ERR_FAIL
2 = SERIALRCCMD_ACK_ERR_ACCESS_DENIED
3 = SERIALRCCMD_ACK_ERR_NOT_SUPPORTED
150 = SERIALRCCMD_ACK_ERR_TIMEOUT
151 = SERIALRCCMD_ACK_ERR_CRC 
152 = SERIALRCCMD_ACK_ERR_PAYLOADLEN
  • CMD_CONNECT(#120) 指令:
    特殊命令:用于处理ArduPilot passthrough。

  • CMD_GETDATADISPLAY(#123) 指令:
    特殊命令:用于将状态信息发送到例如连接的OLED显示器。

  • CMD_WIFICONNECTEDPING(#215) 指令:
    特殊命令:由连接的ESP8266 wifi模块发送,指示wifi连接状态。

  • CMD_STORM32LINK_V1(#217) 指令:
    特殊命令:用于从飞行控制器发送到STorM32-Link的STorM32。

  • CMD_STORM32LINK_V2(#218) 指令:
    特殊命令:用于从飞行控制器发送到STorM32-Link的STorM32。

3 串口通信——Mavlink指令

目前自己没有Mavlink的开发经验,这里先空着,等需要时候再进行分析。

4 总结

基本上目前需要的功能协议都已经获得,下一步就是根据这些协议对目标进行控制。刚开始研究三轴云台,欢迎讨论。

你可能感兴趣的:(三轴云台,STorM32,BGC,三轴云台)