使用DirectTranscription时遇未连接几何查询端口错误求助
问题解决方法
你遇到的问题核心是:传给DirectTranscription的是单独的MultibodyPlant实例和它的上下文,但这个plant依赖SceneGraph提供几何查询能力,单独的plant上下文无法包含diagram内部的端口连接关系——哪怕你在diagram里已经连好了几何查询端口,单独提取的plant上下文也无法让DirectTranscription识别到这个连接。
修正步骤很简单,直接传递整个diagram和它的根上下文即可:
修改后的代码片段:
builder = DiagramBuilder() plant: MultibodyPlant plant, scene_graph = AddMultibodyPlantSceneGraph( builder, time_step=0.001) parser = Parser(plant) parser.AddModels("robot.sdf") plant.SetUseSampledOutputPorts(False) plant.Finalize() diagram = builder.Build() root_context = diagram.CreateDefaultContext() # 传入整个diagram和根上下文,指定要控制的plant系统 dirtran = DirectTranscription( diagram, root_context, num_time_samples=21, input_port_index=plant.get_actuation_input_port().get_index(), system_index=plant.get_system_index() ) prog = dirtran.prog() # 从根上下文获取plant的状态来初始化约束 plant_context = plant.GetMyContextFromRoot(root_context) prog.AddLinearEqualityConstraint( dirtran.initial_state(), plant.GetPositionsAndVelocities(plant_context) ) Solve(prog)
之所以之前报错,是因为单独的plant实例脱离diagram后,无法访问SceneGraph提供的几何查询服务,而DirectTranscription在处理运动学约束时需要这个服务。传递整个diagram后,它就能正确识别并使用内部的端口连接了。
内容的提问来源于stack exchange,提问作者fhk
相关产品推荐
相关产品推荐

