这个问题与任何特定语言无关,而是解决一个问题。
我有一个计时器,它向机器人发送一个方法并请求传感器数据。
一些传感器非常重要,几乎应该总是被请求,而其他一些传感器并不那么重要,但应该不时读取。
想象一下我有一个计时器,并且在计时器中它要求一个方法,该方法将由下面的代码返回:
Timer_Tick()
{
AskForData(SensorRequestList())
}
private int _tCliffState = 0;
private int _tCliffSignal = 0;
private int _tLight = 0;
//and 7 other
private byte[] SensorRequestList()
{
if (_tCliffState <= 5)
{
_tCliffState++;
return RequestCliffStates();
}
if(_tCliffSignal < 1)
{
_tCliffSignal++;
return RequestCliffSignals();
}
if(_tLight < 1)
{
_tLight++;
RequestLightSignals();
}
//and more ifs!
//reset all
_tCliffState = 0;
_tCliffSignal = 0;
_tLight = 0;
//...
}
如果我有 10 个方法,比如命名为 1,2,3,...10,优先级为 1,2,3...10,那么最好的方法是什么。
如何才能实现一个好的模式,以确保具有更高优先级的方法会请求更多?像这样的模式:
1,1,1,2,1,3,1,1,4,1,1,1,2,1,1,1,3,1,1,1,4 等等
最佳答案
如果数据定期出现,那么分析一段时间内收集的数据会更容易 - 例如毫秒一次、每秒一次、每天一次、每周一次或其他。
如果您最终需要保证性能 - 如果机器人没有至少每秒或其他时间收到某个传感器的消息,那么机器人可能会犯错误 - 如果您的程序按某种定期计划运行会更容易。
出于这些原因,我建议您通过重复发出固定数量的请求来收集数据,并且每个固定数量的请求之间有固定的时间间隔。我通常将这样固定数量的请求称为一个帧。
在帧中为非常重要的传感器读数提供自己的插槽,以便在每一帧中收集它们。让不太重要的传感器读数在它们之间共享一个槽,例如,您可以让 8 个传感器读数共享一个槽,每个传感器读数每 8 帧收集一次。如果你想让生活变得更复杂,你可以共享子时隙,因此 8 个真正不重要的传感器读数可以共享一个子时隙,并且每 64 帧收集一次。
在数据和原始值中保留某种时间戳通常是一个好主意。事实上,有些系统安排每帧拍摄一次快照并记录该快照的时间,然后在快照时间之后将值读出。那么所有的值都是在同一时刻读取的读数,并且该时刻是已知的。
关于algorithm - 优先考虑必须在计时器上运行的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14180040/