在淘宝买了个三轴云台,基于STorM32 BGC的,用调试软件控制没有问题,但是自动飞行时候也得通过程序自动控制,所以研究下官网协议,并对其进行了翻译说明。
参考链接Serial Communication
Storm32板可通过串口USB、UART和蓝牙进行通信。三组命令可用于串口通信:
简单指令和RC指令有许多相似之处,都是由固件中相同代码处理的。它们往往比mavlink命令更有效。任何一组命令都可以通过任何串口(USB、UART和蓝牙)进行处理。然而,当mavlink心跳被激活时,UART只接受mavlink命令,并且蓝牙可能不再使用(USB仍然接受所有命令)。
这三个命令集的每个命令都可以互换使用。命令所属的命令集由第一个字符决定。这意味着在通信错误的情况下,消息解析器可能会误解错误后面的字符。消息分析器在超时后重置。
为了理解通信的所有细节,通常最好查看GUI的源代码(包含在任何固件包中)。它是用Perl编写的,Perl足够原始,可以轻松理解代码。
通过串口进行通信的协议遵循以下规则:
控制板返回的任何数据流以以下字符之一结尾:
每当传输数据时都会调用校验和,例如对于“p”、“g”和“d”命令。
下面列出最重要的简单命令。与GUI交互还需要更多的命令,可以通过查看GUI源代码来获得。
注:程序中所有的校验位计算算法源码请参考3轴云台校验位计算源码
除了上一节中描述的简单串口指令外,Storm32控制器还能处理一些针对万向节远程控制的消息。这些消息具有更严格的数据格式,并可能提供更高级别的传输可靠性。传输的规则与前面一样。
数据帧的一般结构是:
如果不需要回应的话,可以将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。
目前自己没有Mavlink的开发经验,这里先空着,等需要时候再进行分析。
基本上目前需要的功能协议都已经获得,下一步就是根据这些协议对目标进行控制。刚开始研究三轴云台,欢迎讨论。