在初始化期间从机器人硬件姿势更新德雷克系统状态

问题描述

我一直在尝试使用 drake 中的 Kuka IIWA 硬件设置一个自定义操作站。我让硬件接口正常工作。运行关节遥操作码(改编自drake/examples/manipulation_station/joint_teleop.py)时,机器人先是剧烈抽搐(所有关节都试图移动到0位置),然后继续正常运行。深入挖掘后,我发现这是由 FirstOrderLowPassFilter 系统引起的。在稍微推进模拟 (simulator.Advanceto(1e-6)) 以评估 LCM 消息以设置初始 GUI 滑块-filter_initial_output_value-植物关节位置等,以匹配硬件时,FirstOrderLowPassFilter 输出瞬时值0. 这会将实例的 IIWA_COMMAND 位置设置为零并导致抖动。 我怎样才能避免这种行为?。

作为一种解决方法,在初始化 drake 系统并在推进模拟之前设置 filter_initial_output_value 之前,我单独订阅来自硬件的原始 LCM 消息。这是推荐的方式吗?。

解决方法

我认为你在做什么(手动阅读 LCM 消息)很好。

或者,看看 DiscreteDerivative 如何提供 suppress_initial_transient = true 选项。也许我们可以在 FirstOrderLowPassFilter 中添加一个类似的选项(通过不受限制的更新事件),以便在 t == 0 时从输入中采样初始输出值。但是启动的事件排序可能仍然很困难。我们本质上需要按照系统的数据流顺序初始化系统,包括在事件触发时刷新输出端口,这是本机不支持的。

在另一种选择中,也许我们可以将 IIWA_COMMAND 发布者配置为不在 t == 0 时发布,而是仅发布 t >= 0.005。

,

FirstOrderLowPassFilter 有一个设置初始值的方法。 https://drake.mit.edu/doxygen_cxx/classdrake_1_1systems_1_1_first_order_low_pass_filter.html#aaef7539cfbf1acfa0cf487c371bc5360

它在您复制的示例中使用: https://github.com/RobotLocomotion/drake/blob/master/examples/manipulation_station/joint_teleop.py#L146

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...