Pydrake:如何从 sine.get_output_port(0).Eval(sine_context) 中获取单个正弦波? (目前产生3波)

Pydrake: how to get a single sine wave out of sine.get_output_port(0).Eval(sine_context)? (currently generates 3 waves)

|德雷克 0.38.0 | python 3.7 | OS: ubuntu 20.04 | pycharm |

我想用一个正弦波(振幅:0.01,f:2)作为kuka iiwa模拟机器人底座的关节力矩输入。 (即我只想看到底座来回旋转以测试其他代码)

我使用正弦系统构建器将正弦系统添加到我的图表中。

sine = builder.AddSystem(Sine(np.array([0.01]),np.array([2]),np.array([0])))
context = diagram.CreateDefaultContext()
sine_context = sine.GetMyMutableContextFromRoot(context)
## sine_context = sine.CreateDefaultContext() # exact same behavior occurs

...
qt = np.zeros(n_dof)
qt[0] = sine.get_output_port(0).Eval(sine_context)
plant.get_actuation_input_port().FixValue(plant_context, qt)

当我调用下面(在某个时间 t)并尝试绘制 qt[0] 时,我看到三个波而不是一个:正弦、余弦和其他异相。 我的理解是 Sine() 的输出端口 0 = sine, 1 = cosine, 2 = -sine 并且我必须使用 qt[0] = sine.get_output_port(0).Eval(sine_context)得到正弦在给定时间t的浮点值。

simulator = Simulator(diagram, context)
simulator.set_target_realtime_rate(1.0)
# Advance the simulation slightly to initialize the GUI
simulator.AdvanceTo(0.01)
...
ml = momentum_log(5000, plant)
simulator.set_monitor(partial(momentum_log.monitor, ml))
while meshcat.GetButtonClicks(stop_sim_button) < 1:
      t = simulator.get_context().get_time()
      sine_context.SetTime(t)
      qt[0] = sine.get_output_port(0).Eval(sine_context)
      plant.get_actuation_input_port().FixValue(plant_context, qt)
      plotp(t,qt[0],0.05)
      simulator.AdvanceTo(t + 1.0)

ml.save()
plotp(t,qt[0],0.05)
plt.show()

我错过了什么?

编辑:请参阅下图进行说明

当我运行这个示例代码时:

sine = Sine(np.array([0.01]), np.array([2]), np.array([0]))
context = sine.CreateDefaultContext()
value = sine.get_output_port(0).Eval(context)
print(repr(value))
context.SetTime(0.7)
value = sine.get_output_port(0).Eval(context)
print(repr(value))

那么我看到的打印输出是这样的:

array([0.])
array([0.0098545])

这对我来说似乎是正确的。

您需要提供更彻底(即完整)的重现示例代码才能回答此问题。

情节看起来是正确的。当您每 2 弧度对 sin(x) 进行采样时,它应该是这样的:

import matplotlib.pyplot as plt
from math import sin

amplitude = 0.01
frequency = 2.0
t = list(range(0, 50))
y = [amplitude * sin(frequency * x) for x in t]
plt.plot(t, y, 'ro')
plt.show()