在examples/quadrotor/示例中,QuadrotorPlant指定了一个自定义并将其输出传递到QuadrotorGeometry将QuadrotorPlant状态打包到FramePoseVector的位置SceneGraph以进行可视化。
其中的相关代码段QuadrotorGeometry执行此操作:
...
builder->Connect(
quadrotor_geometry->get_output_port(0),
scene_graph->get_source_pose_port(quadrotor_geometry->source_id_));
...
void QuadrotorGeometry::OutputGeometryPose(
const systems::Context<double>& context,
geometry::FramePoseVector<double>* poses) const {
DRAKE_DEMAND(frame_id_.is_valid());
const auto& state = get_input_port(0).Eval(context);
math::RigidTransformd pose(
math::RollPitchYawd(state.segment<3>(3)),
state.head<3>());
*poses = {{frame_id_, pose.GetAsIsometry3()}};
}
在我的例子中,我有一个基于浮动的多体系统(想想一个附有钟摆的四旋翼),我已经创建了一个自定义植物 ( LeafSystem)。这样一个系统的最小坐标是 4(四元数)+ 3(x,y,z)+1(关节角)= 7。如果我按照 QuadrotorGeometry 示例,我相信我需要指定完整RigidTransformd的四旋翼和全RigidTransformd摆。
问题
是否可以设置可视化/指定姿势,这样我只需要指定 7(四旋翼姿势 + 关节角度)状态最小坐标,并让内部MultibodyPlant处理每个个体(四旋翼和钟摆)的RigidTransform计算然后可以传递给SceneGraph可视化吗?
我相信这是可能的“阁楼版”(我认为这意味着“被弃用”)RigidBodyTree,这是在examples/compass_gait
lcm::DrakeLcm lcm;
auto publisher = builder.AddSystem<systems::DrakeVisualizer>(*tree, &lcm);
publisher->set_name("publisher");
builder.Connect(compass_gait->get_floating_base_state_output_port(),
publisher->get_input_port(0));
get_floating_base_state_output_port()仅输出CompassGait7 个状态(3 rpy + 3 xyz + 1 髋角)的状态在哪里。
MultibodyPlant相当于什么SceneGraph?
更新(使用Russ 已删除答案中的MultibodyPositionToGeometryPose
我创建了以下函数,它尝试MultibodyPlant从给定创建一个model_file并pose_output_port通过MultibodyPositionToGeometryPose.
pose_output_port我使用的是 4(quaternion) + 3(xyz) + 1(joint angle) 最小状态。
void add_plant_visuals(
systems::DiagramBuilder<double>* builder,
geometry::SceneGraph<double>* scene_graph,
const std::string model_file,
const systems::OutputPort<double>& pose_output_port)
{
multibody::MultibodyPlant<double> mbp;
multibody::Parser parser(&mbp, scene_graph);
auto model_id = parser.AddModelFromFile(model_file);
mbp.Finalize();
auto source_id = *mbp.get_source_id();
auto multibody_position_to_geometry_pose = builder->AddSystem<systems::rendering::MultibodyPositionToGeometryPose<double>>(mbp);
builder->Connect(pose_output_port,
multibody_position_to_geometry_pose->get_input_port());
builder->Connect(
multibody_position_to_geometry_pose->get_output_port(),
scene_graph->get_source_pose_port(source_id));
geometry::ConnectDrakeVisualizer(builder, *scene_graph);
}
以上失败,但有以下异常
abort: Failure at multibody/plant/multibody_plant.cc:2015 in get_geometry_poses_output_port(): condition 'geometry_source_is_registered()' failed.