我已经在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
尝试的方法:
我试图训练一个无状态模型,该模型一次进行一次试验,因为每次试验的时间可能不同。
对试验进行零填充,以使每个单独的试验具有相同的长度(即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个信誉点)。我想知道我在做什么甚至可以通过神经网络实现,而我在做什么错了。谢谢。