仅仅是有了下行的 RC_Ch1 数据是不足以完成通道一的校准工作的,毕竟,RC_Ch1 只是代表了遥控器通道一的实际输出数值,要完成遥控器通道校准工作,还必须获取通道一输出的最大值、最小值以及中点数值,获取上述数值之后,上行发送至APM进行数据装订,这样才能够完成校准的全过程。
类似的,我们要为RC_Ch1输出范围内的最大值、最小值、中点值创建总想数据项,依然是进入数据总线编辑器中使用和前面类似的方法进行创建,如下图:
但是不同的是,此次创建的 RcCh1_MAX、RcCh1_MIN、RcCh1_MID 三条总线数据,他们的总线数据类型为“状态总线”,而非前面RC_Ch1 的类型“数值总线”。
数值总线与状态总线顾名思义,分别用于表示数值型数据和状态型数据,在数据总线编辑器分别绿色和橙色表示。但要特别注意,这两类总线的最大区别在于,状态总线能够进行Mavlink二次动态关联,也就是说该总线数据能够与代表APM/ArduPlane机载参数数值的机载参数总线(有时候也简单的称为“远端总线”)建立起单向数据联系。数据传输的方向为:机载参数总线(远端总线) ---> 系统数据总线(本地总线)。之所以要这样做,一是可以实时反映机载参数的数值(当然,前提条件是通讯链路不能中断,否则地面上的你怎么可能知道天上飞机的某项参数呢?);二是限于通讯链路在进行上行数据传输的时候并不是100%可靠(下行也是一样),地面为飞机装订的参数不一定能够装订成功,设置两个总线数据分别用于反映地面、飞机的同一数值,对及时了解地面与飞机在同一参数的一致性上有很大的帮助。
到这里,认真思考的TX可能有疑问了,既然上面说到的数据传输是单向的,那么CSS如何进行机载参数的数据装订呢?这个问题问得好,CSS为机载参数上行装订准备了至少3种方法:
1、通过数据帧复用直接发送数据帧进行参数装订,这种是最生猛直接的装订方式,但是比较复杂繁琐,有点像汇编语言编程。
2、通过机载参数装订Grid装订ArduPlane当中200多个中的任意个。类似于MP当中的Adv Parameter List,如下图:
3、通过“远端总线数据装订”机制,将系统总线(本地总线)上的数值装订到机载参数总线(远端总线),这种方法的优势在于,在本地总线与远端总线之间形成了闭环回路,同时还可利用数据处理通道对闭环回路进行数据运算处理,从而能够实现远端数据总线与本地数据总线之间形成自动化或半自动化的闭环控制。
好像说多了点哈,本地总线与远端总线机制是CSS的核心内容之一,也是功能最强的大一部分,当然啦,稍微有点点复杂啦…
言归正题,在总线编辑器中分别将总线数据项RcCh1_MAX与0x64 RC1_MAX,RcCh1_MIN与0x62 RC1_MIN,RcCh1_MID与0x63 RC1_TRIM 建立起Mavlink 二次数据关联。注意,这几个数值代表的是远端机载数据参数的数值。
完成了上述工作之后,接下来的问题是,如何从RC_Ch1 数值范围中获取最大值与最小值。人工确定?当然可以,推动遥控器通道一的控制杆,记下最大值最小值值后填入“参数装订Grid”中进行上行装订。但这是个笨办法。CSS还有更好的方法,那就是利用“公式编辑器—数据处理通道”来自动进行获取。
简单的说,在CSS的数据总线之上还有一个数据处理通道,数据总线上的数值在经过数据处理通道时,如果事先使用公式编辑器设置了以总线数据项为运算变量的多个公式表达式,则经过连续运算后的数值将重新返回数据总线。
比如说我们要从RC_Ch1 数值范围中获取最大值 RcCh1_MAX,ok,如下表达式轻松搞定:
RcCh1_MAX = if(RC_ch1>RcCh1_MAX , RC_ch1, RcCh1_MAX)
这个表达式的含义解释一下,如果RC_ch1>RcCh1_MAX成立,则RC_ch1 赋值给RcCh1_MAX,否则RcCh1_MAX不变。
如此这般,建立接下来的两个表达式:
RcCh1_MIN = if( RC_ch1<RcCh1_MIN ,RC_ch1 ,RcCh1_MIN)
RcCh1_MID = (RcCh1_MIN+RcCh1_MAX)/2
保存,OK啦,一旦CSS开始运行,RcCh1_MAX、RcCh1_MIN什么的就能够从RC_ch1变化范围中自动获取。
这个问题就此搞定。
接下来的最后一个问题,如何才能够把RcCh1_MAX、RcCh1_MIN、RcCh1_MID的数值上行装订到APM/Arduplane上面去?点那个按钮呢进行发送呢?同学你又错了!CSS不提供现成的手段,而是提供实现手段的方法。CSS提供的是渔,而不是鱼。
点那个按钮进行发送,那个按钮是大是小,是圆是方,完全由你自己来决定。这就要通过CSS当中的“触发条件—动作响应”机制来实现。CSS当中如果出现了符合预设条件的“条件—动作”组合,则该组合加入到动作队列当中。系统会在每个循环周期检查动作队列,如果队列中存在元素(“条件—动作”),则执行该组合中预设的动作,执行完毕后从队列中清除该元素,直到队列为空。该机制有点类似于Windows当中的消息相应机制。
动作编辑器:
待续……喘口气先……
|