使用递归神经网络识别两轮机器人

时间:2019-05-26 08:28:22

标签: recurrent-neural-network system-identification

我已经在Keras中实现了Hammerstein Wiener模型,其中包含从眺望台收集的两轮模拟机器人的数据,并具有以下字段(模拟时间,汽车左速度,汽车右速度,汽车x位置,左位置汽车的方向,汽车的方向)。经过一些数据转换后,神经网络的输入是时间差,车轮的左右速度以及在时间t-1时机器人的编码方向。神经网络应该预测的输出是时间t的dx,dy和theta。角度根据以下文章进行编码:https://stats.stackexchange.com/questions/218407/encoding-angle-data-for-neural-network以避免在0和2pi不连续。我已经收集了1000次试验,试验的时间间隔为[0,3.5],随机抽取汽车的左右速度。

为使数据具有某种意义,数据看起来像这样,其行名的格式为“ l_ [LEFT_VEL] r [RIGHT_VEL] _ [TRIAL_NUM]”。 TRIAL_NUM通过相同的输入来区分试验。

input       timestep        dt       theta_cos(t-1), theta_sin(t-1)
l_0.0_r_0.4_2 0         0.000000  ...       -0.357857 
              1         0.236000  ...       -0.363438
              2         0.148000  ...       -0.364779
l_0.0_r_0.8_1 0         0.000000  ...       -0.908579
              1         0.232500  ...       -0.919592
              2         0.199500  ...       -0.928194
              3         0.200000  ...       -0.932100
l_0.0_r_1.0_2 0         0.000000  ...       -0.395123
              1         0.228833  ...       -0.365949
              2         0.206500  ...       -0.336356
              3         0.193500  ...       -0.314581
              4         0.157500  ...       -0.306509
l_0.0_r_1.2_1 0         0.000000  ...       -0.846047
              1         0.241000  ...       -0.868502
              2         0.202000  ...       -0.887325
              3         0.197000  ...       -0.899569
              4         0.201500  ...       -0.906584

我试图预测的输出是:

input       timestep          dx,dy,     theta_cos(t), theta_sin(t)
l_0.0_r_0.4_1 0            0.000000  ...  -0.766549
              1           -2.000333  ...  -0.772440
              2            0.000000  ...  -0.772955
l_0.0_r_0.4_2 0            0.000000  ...  -0.359953
              1           -2.000000  ...  -0.364430
              2           -1.000000  ...  -0.364909
l_0.0_r_0.8_1 0            0.000000  ...  -0.911996
              1           -5.000000  ...  -0.924416
              2           -2.500000  ...  -0.930759
              3           -0.500000  ...  -0.932500
l_0.0_r_1.0_2 0            0.000000  ...  -0.386341
              1            4.999667  ...  -0.350191
              2            3.500000  ...  -0.323909
              3            1.000000  ...  -0.308951
              4            0.500000  ...  -0.305529

尝试的方法:

  1. 我试图训练一个无状态模型,该模型一次进行一次试验,因为每次试验的时间可能不同。

  2. 对试验进行零填充,以使每个单独的试验具有相同的长度(即max_duration,这是数据集中试验的最大长度)。除了输入维数从(1,None,#输入要素)更改为(32,max_duration,#输入要素)之外,这些试验都被输入方法1的类似的无状态模型中。

这是Keras模型的代码:

# time_step = None in approach 1
# time_step = max_duration in approach 2
model = Sequential()
model.add(Dense(layers_dims[1], input_shape=(time_step, layers_dims[0]),
    kernel_initializer=RandomNormal(stddev=np.sqrt(2./layers_dims[0]))))
# model.add(BatchNormalization())
model.add(Activation('tanh'))
model.add(Dropout(0.3))
model.add(Dense(layers_dims[1], activation='tanh', 
    kernel_initializer=RandomNormal(stddev=np.sqrt(2./layers_dims[1]))))
model.add(Dropout(0.3))
model.add(LSTM(layers_dims[2], activation='tanh', return_sequences=True))
model.add(Dense(layers_dims[3]))

optimizer = Adam(lr=lr)
model.compile(loss='mean_squared_error', optimizer=optimizer)

我期望神经网络能够学习两轮汽车的状态方程,即:

theta(t + 1)= theta(t)+ omega(t)* dt

x(t + 1)= x(t)+ v(t)* cos(theta(t))* dt

y(t + 1)= y(t)+ v(t)* sin(theta(t))* dt

其中v(t)的平移速度和omega(t)的角速度定义为:

v(t)= 1/2 *(v_l(t)+ v_r(t))

omega(t)= 1 / b(v_l(t)-v_r(t))

有关更多信息:https://robotics.stackexchange.com/questions/106/what-is-a-suitable-model-for-two-wheeled-robots

在测试期间,我通过复制无状态模型的权重将无状态模型转换为有状态模型,以便进行一步预测,因为需要前一个时间步的theta来预测下一个时间步的机器人姿势。

我从这两种方法获得的轨迹都不接近实际轨迹,并且似乎预测的轨迹跳跃了很多(我想添加一些图像,但是我还没有10个信誉点)。我想知道我在做什么甚至可以通过神经网络实现,而我在做什么错了。谢谢。

0 个答案:

没有答案