我正在通过串行(加速度计的值)从传感器读取值,在一个类似于下面的循环中:
while( 1 ) {
vector values = getAccelerometerValues();
// Calculate velocity
// Calculate total displacement
if ( displacement == 0 )
print("Back at origin");
}我知道每个样本需要的时间,这是在getAccelerometerValues()中处理的,所以我有一个时间周期来计算速度,位移等。我以大约120个样本/秒的速度采样。
这是可行的,但存在缺陷(不精确的加速度计数值、浮点误差等),并且校准和补偿以获得合理准确的位移值被证明是困难的。
我在寻找调试循环的进程时遇到了很大的麻烦。如果我使用调试器(我的代码恰好是用C++编写的,并且我正在慢慢地学习使用gdb而不是print语句),那么在调试器执行该行的时间点,为了获得加速度计读数,我在单步执行和推动传感器时会遇到问题。也就是说,很难获得“继续下一行”和“推动传感器使其加速”的正确时机。
我可以使用许多print语句,这些语句往往会在屏幕上飞过,但由于样本数量的原因,这会变得单调乏味,很难推断出问题所在,特别是当每个循环节拍有多个print语句时。
我可以减少样本的数量,这提高了程序输出的可读性,但极大地降低了我从传感器轮询的加速值的可靠性;如果我以1 1Hz的频率轮询,则在加速度计进行加速时轮询加速度计值的机会会显著下降。
总体而言,我在单步执行代码和使用实际数据时遇到了问题;我可以使用无用的数据单步执行,也可以使用更好的数据单步执行。
我假设print语句不是这种情况下的最佳调试方法。更好的选择是什么?有没有什么我会觉得有用的资源(我是不是在gdb中遗漏了什么,或者有没有其他我可以使用的工具)?我正在努力开发一种方法来调试它。
发布于 2012-02-08 23:20:53
一种明智的方法是为getAccelerometerValues()使用一些接口,您可以在运行时或构建时替换这些接口,例如,使用虚方法传入基类指针,以便在具体的派生类中进行覆盖。
如果需要,我可以更详细地描述该机制,但理想的做法是能够对以下对象运行相同的循环:
特别要注意的是,如果每次调用只返回文件中的下一个数据,则“重放”版本应易于调试。
发布于 2012-02-08 23:17:09
我会先用假的(即:随机的)值来调试你的代码。如果计算按预期工作,那么我将使用从端口读取的值。
另外,有没有办法以回调/推送的方式读取这些值,也就是说,当有新的可靠数据时,只调用函数?
编辑:我不知道您使用的是什么库,但在.NET框架中,您可以使用带有事件DataReceived的SerialPort类。这样你肯定会使用最真实、最可靠的数据。
发布于 2012-02-08 23:17:16
为要调试的确切条件创建if块。例如,如果您只关心加速度计何时显示您正在向左移动:
if(movingLeft(values) {
print("left");
}https://stackoverflow.com/questions/9195996
复制相似问题