0

我的目标是使用有限水平线性二次调节器(FHLQR) 来跟踪由数学程序生成的轨迹并在 Gazebo 中对其进行模拟。由于 FHLQR 需要一个系统作为输入,我正在使用QuadrotorPlant,但我不确定这是否理想。当我尝试将状态从 Gazebo 连接到 Drake 时,我的问题出现了。简而言之,将 Gazebo 的状态与 FHLQR 等控制器耦合的正确方法是什么?

我曾考虑编辑 QuadrotorPlant 的上下文以反映 Gazebo 中的状态,但在此更新之后,我无法从控制器获取控制输出。我还考虑过在控制器的输出和 QuadrotorPlant 的输入之间耦合模拟器,但还没有弄清楚如何修改模拟器以镜像 Gazebo。

4

2 回答 2

2

对于您的凉亭界面,假设您都使用 c++,那么我想它看起来像这样:

// setup
auto regulator = MakeFiniteHorizonLinearQuadraticRegulator(...);
auto context = regulator.CreateDefaultContext();

// during execution
context->SetTime(time_from_gazebo);
context->FixInputPort(0, Eigen::VectorXd([state obtained from gazebo]));
Eigen::VectorXd u = regulator->get_output_port(0)->Eval(context);
// then apply u to your gazebo interface
于 2020-05-08T02:17:30.007 回答
0

我认为我们应该能够提供帮助,但可能需要更多细节。

我对你的设置的心智模型是你QuadrotorPlant用来设计德雷克中的轨迹和MakeFiniteHorizonLinearQuadraticRegulator方法......结果是一个德雷克System,它有一个输入端口,期望一个代表四旋翼状态的双精度向量,它输出一个代表四旋翼推力命令的双精度向量。

另外,您有一个带有四旋翼的 Gazebo 模拟器,它接受命令并模拟动力学。

您是否尝试通过消息传递(而不是单个可执行文件)连接它们?大概是 ROS1 消息?(如果是,那么我们在 drake 中的小系统可以发送/接收 ROS 消息,我们可以为您指出)

FWIW,我绝对建议在尝试轨迹版本之前先在 drake 中运行 LQR 控制器来尝试工作流程。

于 2020-05-07T20:50:13.777 回答