德雷克:无法将植物输出连接到可视化输入

drake: trouble connecting plant output to visualizer input

背景是,我在控制一个状态为x=[X,Y,Z,ϕ,θ,ψ,X˙,Y˙,Z˙,ϕ˙,θ˙,ψ ˙],控制输入u=[ω1^2,ω2^2,ω3^2,ω4^2,θ1,θ2,θ3,θ4],这里ωi是螺旋桨的转速,θi是螺旋桨的倾角翅膀。基本上我假设我可以瞬间控制倾斜角度,我只关心飞机机身的位置和姿态。因此,在我的代码中,num_states 是 12,num_inputs 是 8。

出于可视化的目的,我制作了一个 urdf 文件,我在其中使用旋转关节设置了倾斜机翼。在 drake 中,当我使用浮动基加载 urdf 时,刚体树会生成 20 个状态。这并不奇怪,因为我猜 12 个状态是 x=[X,Y,Z,ϕ,θ,ψ,X˙,Y˙,Z˙,ϕ˙,θ˙,ψ˙],还有额外的8个状态来自旋转关节的状态[θ1,θ2,θ3,θ4,θ1˙,θ2˙,θ3˙,θ4˙]。

就在今天,当我构建 C++ 代码时,如果我使用,这会引发一个问题: builder.Connect(quad_tilt_wing->get_output_port(0), visualizer->get_input_port(0));

因为12不等于20

所以我想知道我应该如何解决这个问题?我在考虑两种方式:

(1) 一个是我修改我的动力学,让我的状态是 x=[X,Y,Z,ϕ,θ,ψ,X˙,Y˙,Z˙,ϕ˙,θ˙, ψ˙,θ1,θ2,θ3,θ4,θ1˙,θ2˙,θ3˙,θ4˙],我的控制是u=[ω21,ω22,ω23,ω24,θ1,θ2,θ3,θ4]。但是这样一来,我就想不出一个办法把动态写成x˙=f(x,u)的形式。

(2)另一种方式,我想知道是否可以将可视化器的输入端口分成2个端口,一个是12个,另一个是8个,然后我用我的动态x喂12个,使用 u 直接控制的 8。这可行吗?

或者您有更好的解决方法吗?

看看http://drake.mit.edu/doxygen_cxx/group__primitive__systems.html

您应该能够对您的输入进行多路复用以获得仅具有 theta 值的信号(您想要将其修补到您的可视化输入中)。很想说您可以将两个信号一起多路复用到您推送到可视化工具输入的信号中,但我认为您想将输入插入向量的 middle 中。所以我怀疑你会想要做一些像 Multiplex 这样的事情然后有一个(矩阵)增益将你的向量元素排列成正确的顺序。

或者,由于您是自己编写植物,因此您可以制作第二个输出端口,其中包含可视化所需的矢量信息。这是例如使用的方法https://github.com/RobotLocomotion/drake/blob/master/examples/rimless_wheel/rimless_wheel.h#L31