Animating object from speed data in python
Integrate the velocity curve.

Please note: Am currently working on an addon that uses 3rd party addons scipy (to integrate here) and matplotlib to plot.

Displacement is the integration of the velocity curve.

Instead of 10ms between points (would need frame rate of 100fps for a frame each) have spread the velocity across the scene frame range. dt is how many frames between points.

Scipy.integrate.cumtrapz is used to integrate the velocity list, setting initial displacement to zero.  This is basically the sum of the area of each trapezium. Remember have bloated out the time scale, for strictly having  10ms between readings

t = np.linspace(0, len(v) * 10 / 1000, len(v))
s = integrate.cumtrapz(v, t, initial=0)


and the frame for 10ms (where fps = 24) can use the utility method.

&gt;&gt;&gt; bpy.utils.time_to_frame(10 / 1000)
0.24 


Result of Matplotlib.pyplot


Displacement in blue, velocity (scaled by frames per point (dt)) in red

The resulting fcurve.



Test script maps the displacement to the frame range, considering velocity as blend units per frame, rather than meters per second.

import bpy
import numpy as np
from scipy import integrate

plot = False


context = bpy.context
scene = context.scene
ob = context.object
ob.animation_data_create()
ad = ob.animation_data
action = ad.action or bpy.data.actions.new("Displacement")
ad.action = action

v = np.array(
    (
        0.111,
        1.11,
        2.22,
        3.33,
        4.555,
        1.111,
        2.22,
        10.11,
    )
)

t = np.linspace(
    scene.frame_start,
    scene.frame_end,
    len(v))
dt = t[1] - t[0]
s = integrate.cumtrapz(v, t, initial=0)
if plot:
    from matplotlib import pyplot as plt
    plt.plot(t, s)
    plt.plot(t, dt * v)
    plt.savefig("disp.png")
    plt.show()
# ravelled list of frame, value keyframes
kfs = np.empty((v.size + t.size,), dtype=t.dtype)
kfs[0::2] = t
kfs[1::2] = s
# move in x location
fc = action.fcurves.find("location")
# remove if exists
if fc:
    action.fcurves.remove(fc)
fc = action.fcurves.new("location", index=0)
fc.keyframe_points.add(len(v))   
fc.keyframe_points.foreach_set("co", kfs)
# add linear velocity points before and after
kfs = np.insert(kfs, 0, (-dt, -v[0]))
kfs = np.append(kfs, (scene.frame_end + dt, s[-1] + v[-1]))
# set handles based on before / after
fc.keyframe_points.foreach_set("handle_left", kfs[:-2])
fc.keyframe_points.foreach_set("handle_right", kfs[2:])