一沙一世界 一树一菩提
分类: LINUX
2016-02-17 11:37:06
如何在px4实施恒定采样率的控制
下面是来自px4users组的。。。。
我问自己如何向高级选择算法那样运行这些需要恒定采样率的apps。我发现所有的模块(和控制器)没有一个恒定的采样率,而是在topic上等待需要的数据被published。并且我感觉“hrt_call_”系列函数也不是最适合控制器应用的方式,你有更好的提议吗?
在一个控制系统里有两个基本的时序要求:更新速率和延时
为了获得一个好的系统性能,你必须最小化延时,在很多场合,延时比更新率更重要,因为大延时会产生相移。
你可以控制钟摆以1HZ的来回摆动来更新数据,没有1秒的延时。因为延时的相位会给你一个错误的提示。所以与其坚持一个固定的频率,不如把我们的注意力放在延时上。固定频率的控制循环有时候真的有很差的延时。例如:
假设你以100hz的速度采集传感器值,估算也是100hz,其它控制器也是100Hz,你是否会认为最坏的延时一步输入时10ms呢?实际上不是10ms,如果你使用自由循环,延时是出于10ms—29.99ms中的随机数值。因为每个循环都可以错过下一个循环的一小部分。
Sensors runs at 10ms 20ms 30ms and so on
Estimator runs at 9ms 19ms 29ms and so on
Controller runs at 8ms 18ms 28ms and so on
比如某时刻你的系统正处于1ms时刻,那么还有9ms才进行sensors的采集,那么estimator需要18ms才能看见这次的数据,而controller需要27ms才能看见数据。在nshshell,如果有三个这样的序列,那真是糟透的设计。
其实我们需要的是按顺序执行所有的步骤。那是否可以把它们挤在一个main循环里呢,那将也是一个很糟的设计。首先这不是一个灵活的可扩展的架构。并且也不符合实际,为何呢?因为我们需要支持不同的速率要求,还有当多个控制器运行时,其它快速的控制器不能并发。如我们sensors采样率是1000Hz,有的控制器运行速率是250Hz,有的是50Hz。我们不想在他们之间有任何延时。
那px4系统的延时优化如何呢?在每次sensors采样后立即运行估算和控制器。你可以在代码中主循环中的poll看到这一实现。这一实现的最大优势是在wait期间,没有cpu负荷。这对于恒定采样率意味着什么呢?传感器时钟由高精度定时器提供,他们的时序很准确。我们采用这个恒定采样率来作为系统其它部分的时钟。这样你就有一个恒定采样率了。
而实际使用情况是:如果你想建立一个好的控制系统,你只需要调整sensors的采样时序即可。而不是调整系统的时序。这样系统还提供每隔几次运行某功能的机制,如sensors的采样率更新为250hz,你只要按照比例运行其它就可以啦。
如果你仔细查看你使用的具体的控制器,除了MPC解决方案。大部分方案中dt是系统的一个控制系数。这样你需要的不是一个恒定的采样率,而是测量dt。当然对于你的调整,你需要尽量调整精确的,尽量与真实dt接近的dt值来满足你设计的系统需要。如果你想使用MPC控制器,你仍然可以选择几个sensors采样周期为你的设计时序,一般也会取得很精确的计时。