Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将加速度随时间转换为速度或代码中的速度_Java_C#_Accelerometer - Fatal编程技术网

Java 将加速度随时间转换为速度或代码中的速度

Java 将加速度随时间转换为速度或代码中的速度,java,c#,accelerometer,Java,C#,Accelerometer,我有来自传感器的加速度数据。X Y&Z。我在Y轴上移动传感器。大部分是直线。所以我忽略了x&z 根据传感器文件5.2.1加速度输出: ax=((AxH速度是加速度的积分。如果初始速度为0,则可以使用(*);加速度函数的面积来计算速度 对于常规功能fx,您可以执行以下操作: public static double RiemannIntegration (Func<double, double> fx, double x0, double x1,

我有来自传感器的加速度数据。X Y&Z。我在Y轴上移动传感器。大部分是直线。所以我忽略了x&z

根据传感器文件5.2.1加速度输出:


ax=((AxH速度是加速度的积分。如果初始速度为0,则可以使用(*);加速度函数的面积来计算速度

对于常规功能
fx
,您可以执行以下操作:

public static double RiemannIntegration
    (Func<double, double> fx,
     double x0,
     double x1,
     double step)
{
    var previous = x0;
    var res = 0d;
    var semiStep = step / 2;

    for (var x = x0 + step; x < x1; x += step)
    {
        res += semiStep * (fx(x) + fx(previous));
        previous = x;
    }

    res += (x1 - previous) / 2 * (fx(x1) + fx(previous));
    return res;
}
更新:根据您的评论,您最终希望评估所覆盖的距离。您可以通过积分两倍加速度来完成此操作,但为此,您实际上需要返回积分曲线,而不是总值。以下实现将完成此操作:

public static IEnumerable<(double X, double Y)> RiemannIntegration(
    (double X, double Y)[] xy, double initialValue)
{
    var res = initialValue;
    yield return (xy[0].X, initialValue);

    for (var i = 1; i < xy.Length; i++)
    {
        res += (xy[i].X - xy[i - 1].X) * (xy[i].Y + xy[i - 1].Y) / 2;
        yield return (xy[i].X, res);
    }
}

(*)所提出的算法并不完全是黎曼积分,我使用的是梯形区域,黎曼积分实际上使用的是高度等于时间间隔中心函数值的矩形区域。

你需要对力进行积分,积分会增加大量误差,它只在几秒钟内有用。加速度计这不是获得速度的合适传感器。如果你有GPS,最好使用计算的速度。不知道初始速度,这是不可能的。即使你知道初始速度,也不会非常精确,因为你不知道测量间隔内的加速度。GUSMAN你不能在6英寸的米范围内使用GPSDawood,起始速度是零。你可以用时间和加速度来确定从固定位置到终点的速度。我可以假设每个加速度之间有一个恒定的正加速度。这是可以计算的。在每个方程中,Fx,x0,x1,步长和第二个X=时间,Y=加速度是多少?@SteveColeman在第一个方程中方程,
fx
将是一个lambda表达式,表示函数
acc(t)和<代码> X0和 X1将是您要考虑的初始和最后的时间。<代码>步骤< /代码>定义要集成的时间步长,越小,由于考虑<代码> TI <代码>和<代码> Ti + 1 之间的线性变化的误差越小,但它可以使双表示I。诱导误差增加。在第二个方程中,
fx
表示离散的
(t,acc)
data.in其间,我正在对计算进行一些测试。我将把传感器放置在不同的高度。我将验证速度*时间=下降的距离。如果接近准确,我将接受你的答案。@SteveColeman这不会是真的。积分将给出最终速度,而不是平均速度,这似乎是正确的你想用<代码>速度>时间<代码>来验证。你可以考虑创建一个速度“曲线”。通过间隔积分加速曲线,然后积分速度曲线,这将给你提供距离。在这两者之间,我知道你在这方面投入了一些时间。一旦我们完成。我将对其进行奖励并接受你的回答。非常感谢你的帮助。
public static double RiemannIntegration(
    (double X, double Y)[] xy)
{
    var res = 0d;

    for (var i = 1; i < xy.Length; i++)
    {
        res += (xy[i].X - xy[i - 1].X) * (xy[i].Y + xy[i - 1].Y) / 2;
    }

    return res;
}
public static IEnumerable<(double X, double Y)> RiemannIntegration(
    (double X, double Y)[] xy, double initialValue)
{
    var res = initialValue;
    yield return (xy[0].X, initialValue);

    for (var i = 1; i < xy.Length; i++)
    {
        res += (xy[i].X - xy[i - 1].X) * (xy[i].Y + xy[i - 1].Y) / 2;
        yield return (xy[i].X, res);
    }
}
var timeVsAccelerationData = new[] { (t0, a0), (t1, a1), ... };

//initial speed and distance are zero.
var distance = RiemmanIntegral(RiemannIntegral(
    timeVsAccelerationData, 0).ToArray(), 0).Last().Y;