def test_average_rt():
    # TODO: investigate why this does not work
    # angles = Angles.from_random_data(size=(3, 1, 100))
    # or
    # angles = Angles(np.arange(300).reshape((3, 1, 100)))
    angles = Angles(np.random.rand(3, 1, 100))
    seq = "xyz"

    rt = Rototrans.from_euler_angles(angles, seq)
    rt_mean = Rototrans.from_averaged_rototrans(rt)
    angles_mean = Angles.from_rototrans(rt_mean, seq).isel(time=0)

    angles_mean_ref = Angles.from_rototrans(rt, seq).mean(dim="time")

    np.testing.assert_array_almost_equal(angles_mean,
                                         angles_mean_ref,
                                         decimal=2)
def test_euler2rot_rot2euleur(seq, angles=ANGLES, epsilon=EPSILON):
    if seq == "zyzz":
        angles_to_test = angles[:3, ...]
    else:
        angles_to_test = angles[:len(seq), ...]
    r = Rototrans.from_euler_angles(angles=angles_to_test, angle_sequence=seq)
    a = Angles.from_rototrans(rt=r, angle_sequence=seq)

    np.testing.assert_array_less((a - angles_to_test).meca.abs().sum(),
                                 epsilon)
def test_average_rt():
    seq = "xyz"
    angles_size = (3, 1, 100)
    ref_angles_from_rt_mean = [0.25265133, 0.57436872, 0.79133042]

    restart_seed()
    angles = Angles.from_random_data(size=angles_size)
    # min-max normalization to keep the angles low
    angles = angles.pipe(lambda x: (x - x.min()) / (x.max() - x.min()))

    rt = Rototrans.from_euler_angles(angles, seq)
    rt_mean = Rototrans.from_averaged_rototrans(rt)
    angles_from_rt_mean = Angles.from_rototrans(rt_mean, seq)

    np.testing.assert_almost_equal(angles_from_rt_mean.data.ravel(),
                                   ref_angles_from_rt_mean,
                                   decimal=4)
Exemple #4
0
def rototrans_from_averaged_rototrans(
    caller: Callable, rt: xr.DataArray
) -> xr.DataArray:
    # arbitrary angle sequence
    seq = "xyz"

    target = rt.mean(dim="time").expand_dims("time", axis=-1)

    angles = Angles(np.ndarray((3, 1, 1)))

    def objective_function(x):
        angles[:3, 0, 0] = x
        rt = caller.from_euler_angles(angles, seq)
        return np.ravel(rt.meca.rotation - target.meca.rotation)

    initia_guess = Angles.from_rototrans(target, seq).squeeze()
    angles[:3, 0, 0] = least_squares(objective_function, initia_guess).x
    return caller.from_euler_angles(angles, seq, translations=target.meca.translation)