drake:将工厂输出连接到可视化器输入时出现问题

时间:2018-04-25 15:08:30

标签: drake

背景是,我正在控制四边形翼,状态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, 8使用u直接控制。这可行吗?

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

1 个答案:

答案 0 :(得分:0)

查看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