FixInputPort пытается подключиться к неверному порту - PullRequest
0 голосов
/ 12 мая 2019

У меня есть пользовательский LeafSystem, который имеет входные и выходные порты следующим образом

template <typename T>
MyLeafSystem<T>::MyLeafSystem() :
    systems::LeafSystem<T>(systems::SystemTypeTag<MyLeafSystem>{}),
    input1_idx(this->DeclareVectorInputPort("input1", systems::BasicVector<T>(1)).get_index()),
    input2_idx(this->DeclareVectorInputPort("input2", systems::BasicVector<T>(1)).get_index()),
    output_idx(this->DeclareVectorOutputPort("output", systems::BasicVector<T>(2), &TorqueCombiner::convert).get_index())
{}

Я добавляю его в свою систему через

auto my_leaf_system = builder.AddSystem(std::make_unique<MyLeafSystem<double>>());
// Connect one of the input ports of my_leaf_system
// Connect one of the output port of my_leaf_system
auto diagram = builder.Build();

Для оставшегося порта, я хотел бы сейчас подключить исправить входной порт. Я делаю это через

auto diagram = builder.Build();

std::unique_ptr<systems::Context<double>> diagram_context = diagram->CreateDefaultContext();
Context<double>& context = diagram->GetMutableSubsystemContext(plant, diagram_context.get());

context.FixInputPort(my_leaf_system->get_second_input_port().get_index(), Vector1d::Zero());

Однако, я запускаю std::logic_error, когда я запускаю FixInputPort

terminate called after throwing an instance of 'std::logic_error'
  what():  System::FixInputPortTypeCheck(): expected value of type drake::geometry::QueryObject<double> for input port 'geometry_query' (index 0) but the actual type was drake::systems::BasicVector<double>. (System ::_::drake/multibody/MultibodyPlant@000055e087146ec0)

Странная вещь

int(my_leaf_system->get_second_input_port().get_index())) == 0

и

int(plant.get_geometry_query_input_port().get_index())) == 0

Мое растение добавляется следующим образом

auto pair = drake::multibody::AddMultibodyPlantSceneGraph(&builder, std::make_unique<drake::multibody::MultibodyPlant<double>>(0));

drake::multibody::MultibodyPlant<double>& plant = pair.plant;
drake::geometry::SceneGraph<double>& scene_graph = pair.scene_graph;

// Make and add the model.
drake::multibody::Parser(&plant, &scene_graph).AddModelFromFile(model_filename);

// Connect scene graph to visualizer
drake::geometry::ConnectDrakeVisualizer(&builder, scene_graph);

plant.Finalize();



auto my_leaf_system = builder.AddSystem(std::make_unique<MyLeafSystem<double>>());
...

Ответы [ 2 ]

2 голосов
/ 12 мая 2019

В вашем посте есть несколько противоречивых вещей. Для начала, сообщение об ошибке подразумевает, что ошибка генерируется при попытке исправить входной порт мультиспиральной установки (не вашей конечной системы). И тип этого входного порта не является векторным, поэтому ошибка очевидна.

Есть подозрение, что вы где-то пересекли свои провода (или указатели). Исправление векторного входного порта производной конечной системы должно быть принято - это очень распространено.

0 голосов
/ 13 мая 2019

Я сделал ошибку в

Context<double>& context = diagram->GetMutableSubsystemContext(plant, diagram_context.get());

context.FixInputPort(my_leaf_system->get_second_input_port().get_index(), Vector1d::Zero());

Здесь я использую context для подсистемы plant для FixInputPort на my_leaf_system.

Правильный код должен быть

Context<double>& my_leaf_system_context = diagram->GetMutableSubsystemContext(*my_leaf_system, diagram_context.get());

my_leaf_system_context.FixInputPort(my_leaf_system->get_mip_input_port().get_index(), Vector1d::Zero());

Спасибо Расс, Шерм!

...