1

背景是,我正在控制状态为 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 文件,在其中使用旋转关节设置倾斜机翼。在德雷克中,当我使用浮动底座加载 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,直接输入8使用 u 控制。这是可行的吗?

或者你有更好的方法来解决这个问题吗?

4

1 回答 1

1

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

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

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

于 2018-04-26T00:35:50.210 回答