C++ 使用露台和drake制作四旋翼

C++ 使用露台和drake制作四旋翼,c++,drake,gazebo-simu,C++,Drake,Gazebo Simu,我的目标是使用FHLQR跟踪数学程序生成的轨迹,并在Gazebo中进行模拟。由于FHLQR需要一个系统作为输入,我使用的是,但我不确定这是否理想。当我试图将国家从Gazebo连接到Drake时,我的问题就出现了。简言之,将Gazebo的状态与控制器(如FHLQR)耦合的正确方式是什么 我曾经考虑过编辑QuadrotorPlant的上下文以镜像Gazebo中的状态,但是在这次更新之后,我很难从控制器获得控制输出。我也考虑过在控制器的输出和四转子设备的输入之间进行耦合,但还没有想出如何修改模拟器以镜

我的目标是使用FHLQR跟踪数学程序生成的轨迹,并在Gazebo中进行模拟。由于FHLQR需要一个系统作为输入,我使用的是,但我不确定这是否理想。当我试图将国家从Gazebo连接到Drake时,我的问题就出现了。简言之,将Gazebo的状态与控制器(如FHLQR)耦合的正确方式是什么


我曾经考虑过编辑QuadrotorPlant的上下文以镜像Gazebo中的状态,但是在这次更新之后,我很难从控制器获得控制输出。我也考虑过在控制器的输出和四转子设备的输入之间进行耦合,但还没有想出如何修改模拟器以镜像露台

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

我对您的设置的心理模型是,您使用
QuadrotorPlant
来设计轨迹和
makefinitehorizonlinearquadiicregulator
方法在drake。。。其结果是一个drake
系统
,该系统的输入端口需要一个表示四旋翼状态的双倍矢量,并输出一个表示四旋翼推力指令的双倍矢量

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

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


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

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

我对您的设置的心理模型是,您使用
QuadrotorPlant
来设计轨迹和
makefinitehorizonlinearquadiicregulator
方法在drake。。。其结果是一个drake
系统
,该系统的输入端口需要一个表示四旋翼状态的双倍矢量,并输出一个表示四旋翼推力指令的双倍矢量

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

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


FWW,我绝对推荐在运行轨迹版本之前在DRAKE中运行LQR控制器。

< P>和GaseBo接口,假设你都在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

对于你的GeeBeo界面,假设你都在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

所以我实际上在一个单独的类中定义了四转子的运动方程,然后将动力学作为约束添加到数学程序中作为残差。我永远无法在一个系统中将QuadrotorPlant与MakeFiniteHorizonalLinearQuadraicRegulator耦合,因为当我实例化MakeFiniteHorizonalLinearQuadraicRegulator时,它需要一个上下文。此上下文来自QuadrotorPlant,要求QuadrotorPlant定义一个输入端口。我认为这个输入端口应该是LinearQuadicialRegulator控制器的输出端口,所以我们有鸡和蛋的问题。目前,安装程序作为一个可执行文件运行,但在使用什么接口方面很灵活。关于
MakefiniteHorizonLinearQuadicialRegulator
上下文。。。这就像我们将上下文传递给
线性正交调节器的方式一样。不应该有鸡和蛋的问题。。。?也许这个例子会对你有所帮助?太好了,是的,现在可以了。我逻辑中的错误是认为有限水平线正交调节器选项的u0必须与系统“耦合”,但它只是代表了一个初始起点。。应该更彻底地阅读有限水平线性二次调节器.cpp。。谢谢!:)所以我实际上在一个单独的类中定义了四转子的运动方程,然后将动力学作为约束添加到数学程序中作为残差。我永远无法在一个系统中将QuadrotorPlant与MakeFiniteHorizonalLinearQuadraicRegulator耦合,因为当我实例化MakeFiniteHorizonalLinearQuadraicRegulator时,它需要一个上下文。此上下文来自QuadrotorPlant,要求QuadrotorPlant定义一个输入端口。我认为这个输入端口应该是LinearQuadicialRegulator控制器的输出端口,所以我们有鸡和蛋的问题。目前,安装程序作为一个可执行文件运行,但在使用什么接口方面很灵活。关于
MakefiniteHorizonLinearQuadicialRegulator
上下文。。。这就像我们将上下文传递给
线性正交调节器的方式一样。不应该有鸡和蛋的问题。。。?也许这个例子会对你有所帮助?太好了,是的,现在可以了。我逻辑中的错误是认为有限水平线正交调节器选项的u0必须与系统“耦合”,但它只是代表了一个初始起点。。应该更彻底地阅读有限水平线性二次调节器.cpp。。谢谢!:)