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()
|德雷克 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()