MultiBodyPlant 컨텍스트에서 nans가있는 추가 바디로 인해 시뮬레이션 중 오류 발생

Dec 01 2020

urdf 파일을 가져오고 MultiBodyPlant를 만든 후 컨텍스트를 인쇄 할 때 nans 가 있는 추가 매개 변수 그룹이 표시 됩니다. 전체 인쇄 된 컨텍스트는 여기에서 볼 수 있습니다 . 설명 / 이해할 수없는 파라미터 그룹은 다음과 같습니다.

18 numeric parameter groups with
   10 parameters
     nan nan nan nan nan nan nan nan nan nan

다음을 사용하여 플랜트 토폴로지를 얻는 경우 : pydot.graph_from_dot_data(plant.GetTopologyGraphvizString())[0].write_svg("robot_topology.svg")

urdf를 만드는 동안 예상대로 식물의 토폴로지를 봅니다 ( WorldBodyInstance 내부에 추가 WorldBody 포함 ). 토폴로지 이미지는 여기에서 볼 수 있습니다 .

이 추가 본문은 연속 시간 시뮬레이션 (time_step = 0.0) 중에 다음 오류를 일으키는 것으로 보입니다.

RuntimeError: Encountered singular articulated body hinge inertia for body node index 1. Please ensure that this body has non-zero inertia along all axes of motion.

처음 3 개의 의사 링크를 제거하려고 시도했지만 Context의 첫 번째 매개 변수 그룹은 여전히 ​​nans와 함께 있습니다. 다른 모든 매개 변수 그룹은 urdf 파일의 몸체 / 관절에 올바르게 대응합니다.

이 오류가 urdf 파일 작성 방법에있을 수 있습니까?

urdf 파일은 여기 에서 찾을 수 있습니다 . 컨텍스트를 인쇄하는 데 사용되는 코드 :

builder = DiagramBuilder()

plant, scene_graph = AddMultibodyPlantSceneGraph(builder, time_step=0.0)
Parser(plant, scene_graph).AddModelFromFile(SCpath)
# Remove gravity
plantGravityField = plant.gravity_field()
plantGravityField.set_gravity_vector([0,0,0])
plant.Finalize()

# Adds the MeshcatVisualizer and wires it to the SceneGraph.
meshcat = ConnectMeshcatVisualizer(builder, scene_graph, zmq_url=zmq_url, delete_prefix_on_load=True)

diagram = builder.Build()
context = diagram.CreateDefaultContext()
plant_context = plant.GetMyMutableContextFromRoot(context)
print(plant_context)

불연속 시간 시뮬레이션 (time_step = 0.001)을 실행하면 시뮬레이션이 성공적으로 실행되지만 다음 줄을 사용하여 base_roll 관절에 관절 토크를 적용한 후 meshcat 시각화 도우미 또는 인쇄 된 컨텍스트 사후 시뮬레이션에 변경 사항이 없습니다 .

jointAcutation =  np.zeros((plant.num_actuators(),1))
jointAcutation[0] = 10
plant.get_actuation_input_port().FixValue(plant_context, jointAcutation)

simulator = Simulator(diagram, context)

meshcat.load()

meshcat.start_recording()
simulator.AdvanceTo(30.0)
meshcat.stop_recording()
meshcat.publish_recording()
print(plant_context)

따라서 연속 시간 및 이산 시간 시뮬레이션은 모두 모델에서 설명 할 수없는 nans로 인해 실패하는 것 같습니다.

답변

2 joemasterjohn Dec 02 2020 at 06:15

NaN이는 당신이 세계 몸에 파라미터 그룹의 대응에서보고있는 것을, 그들은 의심스러운 있지만, 나는 그들이 문제의 근본 생각하지 않는다. 월드 바디에는 유효한 관성 매개 변수 세트가 없으며 (따라서 NaN으로 설정 됨) 코드에서 특수한 경우로 처리됩니다. 현재 구현에서 작성 되었기 때문에 본문 매개 변수 API는 모든 본문에서 유비쿼터스입니다. 각 본문에는 유효한지 여부에 관계없이 컨텍스트에 매개 변수 세트가 있습니다. 이것은 특수 기관 ( '세계')에 대한 논쟁 점이 ​​될 수 있으므로 논의 할 문제 를 열었습니다 .

지금 겪고있는 문제는 base_main링크 (따라서 전체 로봇)가 자유롭게 떠 다니는 몸체 이기 때문 입니다. 링크를 연결하는 조인트에 적용된 토크 ( Joint_base_yaw귀하의 경우)가 무한 가속을 유발할 수 있기 때문에 질량이 0이 아닌 링크의 다른 자유 부동 트리에 조인트와 함께 부착 된 제로 질량 링크의 자유 부동 트리를 가질 수 없습니다. 내부 바디에. 이를 해결하려면 :

  • (옵션 1) 사이에 고정 된 관절을 추가 base_main하고 world당신의 URDF 파일에.

    <joint name="base_main" type="fixed">
      <parent link="world"/>
      <child link="base_main"/>
    </joint>
    
  • (옵션 2) : base_main링크의 바디 프레임을 코드의 월드 프레임에 용접합니다 .

    plant.WeldFrames(plant.world_frame(), plant.GetFrameByName("base_main"))