背景是,我正在控制状态为 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 控制。这是可行的吗?
或者你有更好的方法来解决这个问题吗?