在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()
仅输出CompassGait
7 个状态(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.