将 gazebo 与 drake 一起用于四旋翼飞行器
Using gazebo with drake for quadrotor
我的 objective 是使用 finite horizon linear quadratic regulator(FHLQR) to follow a trajectory generated by a mathematical program and simulate it in Gazebo. As FHLQR needs a system as input, I'm using the QuadrotorPlant,但我不确定这是否理想。当我尝试将状态从 Gazebo 连接到 Drake 时,我的问题就出现了。简而言之,将 Gazebo 的状态与 FHLQR 等控制器耦合的正确方法是什么?
我考虑过编辑 QuadrotorPlant 的上下文以反映 Gazebo 中的状态,但在这次更新之后我无法从控制器获取控制输出。我也考虑过在控制器的输出和 QuadrotorPlant 的输入之间耦合 Simulator,但还没有想出如何修改模拟器以镜像 Gazebo。
我认为我们应该能够提供帮助,但可能需要更多详细信息。
我对你的设置的心智模型是你使用 QuadrotorPlant
设计轨迹和德雷克中的 MakeFiniteHorizonLinearQuadraticRegulator
方法......结果是德雷克 System
有一个输入端口期望一个表示四旋翼状态的双精度向量,它输出一个表示四旋翼推力命令的双精度向量。
另外,你有一个带有四旋翼的 Gazebo 模拟器,它接受命令并模拟动力学。
您是否尝试通过消息传递(而不是单个可执行文件)连接它们?大概是用 ROS1 消息? (如果是,那么我们在 drake 中有一些小系统可以 send/receive ROS 消息,我们可以向您指出)
FWIW,我肯定会建议在尝试轨迹版本之前仅使用 运行 德雷克中的 LQR 控制器来尝试工作流程。
对于你的 gazebo 界面,假设你都在使用 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
我的 objective 是使用 finite horizon linear quadratic regulator(FHLQR) to follow a trajectory generated by a mathematical program and simulate it in Gazebo. As FHLQR needs a system as input, I'm using the QuadrotorPlant,但我不确定这是否理想。当我尝试将状态从 Gazebo 连接到 Drake 时,我的问题就出现了。简而言之,将 Gazebo 的状态与 FHLQR 等控制器耦合的正确方法是什么?
我考虑过编辑 QuadrotorPlant 的上下文以反映 Gazebo 中的状态,但在这次更新之后我无法从控制器获取控制输出。我也考虑过在控制器的输出和 QuadrotorPlant 的输入之间耦合 Simulator,但还没有想出如何修改模拟器以镜像 Gazebo。
我认为我们应该能够提供帮助,但可能需要更多详细信息。
我对你的设置的心智模型是你使用 QuadrotorPlant
设计轨迹和德雷克中的 MakeFiniteHorizonLinearQuadraticRegulator
方法......结果是德雷克 System
有一个输入端口期望一个表示四旋翼状态的双精度向量,它输出一个表示四旋翼推力命令的双精度向量。
另外,你有一个带有四旋翼的 Gazebo 模拟器,它接受命令并模拟动力学。
您是否尝试通过消息传递(而不是单个可执行文件)连接它们?大概是用 ROS1 消息? (如果是,那么我们在 drake 中有一些小系统可以 send/receive ROS 消息,我们可以向您指出)
FWIW,我肯定会建议在尝试轨迹版本之前仅使用 运行 德雷克中的 LQR 控制器来尝试工作流程。
对于你的 gazebo 界面,假设你都在使用 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