我正在使用examples/atlas/atlas_run_dynamics.cc,我想添加一个LQR控制器使机器人站立。我添加了我的代码
int num_act,num_states;
num_act = plant.num_actuators();
num_states = plant.num_multibody_states();
std::cout<<"num_actuators: "<<num_act<<std::endl;
std::cout<<"num_multibody_states: "<<num_states<<std::endl;
Eigen::MatrixXd Q = 10*Eigen::MatrixXd::Identity(num_states, num_states);
Eigen::MatrixXd R = Eigen::MatrixXd::Identity(num_act, num_act);
const InputPort<double>& actuation_port = plant.get_actuation_input_port();
auto controller = systems::controllers::LinearQuadraticRegulator(
plant, plant_context, Q, R,
Eigen::Matrix<double, 0, 0>::Zero() /* No cross state/control costs */,
actuation_port.get_index());我得到了:
what(): System::FixInputPortTypeCheck(): expected value of type drake::geometry::QueryObject<drake::AutoDiffXd> for input port 'geometry_query' (index 0) but the actual type was drake::geometry::QueryObject<double>. (System ::plant)
先前的问题如下:
https://stackoverflow.com/questions/65471497/how-are-you-supposed-to-use-a-controller-with-a-urdf/65471632#65471632
https://stackoverflow.com/questions/61626553/when-doing-direct-collocation-inputporteval-required-inputport0-geometr#comment109060518_61633651
但仍然不明白如何“将包含MultibodyPlant和SceneGraph的关系图传递到LQR调用”,并在本例中设置assume_non_continuous_states_are_fixed=true。
有人能提供一些具体的指导吗?谢谢!
最新情况:
对于it's slightly unnatural to call LQR for a system with contact,更常见的方法是用轨迹优化的方法得到一个轨迹,包括关节力矩、接触力等,然后用一个控制器,比如lqr,来控制系统,对吗?
但德雷克对我来说很复杂。我不知道如何在带浮点和接触点的模型上使用直接配置,如何在直接配置中加入质心动量约束,如何将关节轨迹和接触力应用到模型中。我运行了acrobot/run_lqr, acrobot/run_swing_up_traj_optimization,但是他们没有浮动基,并且不涉及接触,另外,增加一个引脚连接也改变了浮动基特性,对吗?
对于更传统的软件,如Vrep,我的理解是使用一些轨迹优化方法来获取轨迹数据,使用IK/ID获取联合输入,然后使用控制器来控制多体模型。Drake似乎比我使用的其他软件更强大,但我有点迷失在文档和教程中。
发布于 2021-07-23 13:06:25
实际上,我已经打开了一个PR,以便更好地记录您所看到的错误:https://github.com/RobotLocomotion/drake/pull/15437。
的确,LinearQuadraticRegulator还没有assume_non_continuous_states_are_fixed。这很容易加进去。真正需要发生的是,我对各种控制设计算法进行了全面的研究,并标准化了它们的选项。(到目前为止,我一直在逐个改进他们的要求)。我在这里打开了一个问题:https://github.com/RobotLocomotion/drake/issues/15464
但是,我们还没有这个特别的选择的原因是,调用LQR是有点不自然的,一个有联系的系统。默认情况下,在某种状态下将系统线性化将包括任何活动接触力的动态,但只会忽略任何潜在的接触(要明确的是,这是数学属性,而不是代码的限制)。这些接触动力学将是刚性的,几乎可以肯定地说,在原始坐标下是无法控制的。代码可能也有限制..。并不是所有的接触几何学都会给出分析梯度。但我认为地图集模型只使用半平面上的点接触点,因此应该得到充分的支持。
当我展示了阿特拉斯平衡与LQR在我欠驱动的讲座,该模型已经取代了接触动力学与针关节在脚趾(我希望我是清楚的!)这是一个非常合理的方法;这也是为什么我们使用简化的模型来设计轮式车辆/球机器人的控制器,而不是通过接触动力学线性化。使用这些最小模型是混合动力学方法的核心。
https://stackoverflow.com/questions/68470276
复制相似问题