NVIDIA Isaac Sim: LIDAR 사용

11265 단어 NVIDIAisaacsimtech

개요


시뮬레이션에서 LIDAR을 생성합니다.
이 내용은 Issac Sim의 tutorial에 기재되어 있으며 이에 따라 진행될 것입니다.
https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/tutorial_advanced_range_sensor_lidar.html

운영 환경

  • 설치 실행 환경
  • unit
    specification
    CPU
    i9-11900H
    GPU
    GeForce RTX 3080 Laptop
    RAM
    32GB
    OS
    Ubuntu 20.04.3 LTS
  • Nvidia Driver 버전
  • 510.39.01
  • Issacsim 버전
  • 2021.2.1
  • 절차.


    GUI의 작업과 Python API에서 장면에 LIDAR을 추가합니다.
  • LIDAR(GUI) 추가
  • LIDAR(Python API) 추가
  • 1. LIADR(GUI) 추가


    이 페이지에 기재된 순서에 따라 진행하다.
    https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/tutorial_advanced_range_sensor_lidar.html#getting-started

    1.1 Omniverse에서 Issac Sim 시작



    1.2 제작 장면


    메뉴 표시줄의 Create&Physics Scene을 선택합니다.

    1.3 LIDAR 증가


    생성된 장면에 LIDAR을 추가합니다.
    메뉴 표시줄의 Create > Isaac > Sensors > LIDAR > Rotating을 선택하십시오.

    1.4 LIDAR 설정


    추가된 LIDAR 속성을 조정합니다.
    오른쪽 Stage에서 추가 LIDAR을 선택합니다.
    선택한 상태에서 오른쪽 아래 코너의 Property에서 다음 값을 변경합니다.
  • Raw USD Properties의 "drawLinus"를 검사하여 enable
  • 로 만듭니다.
  • Raw USD Properties의 "rotationRate"를 1.0
  • 으로 설정

    이 상태에서 Viewport 왼쪽에 있는 PLAY 버튼을 누르면 LIDAR가 회전합니다.
    또한 Raw USD Properties의 rotationRate를 0.0으로 설정하면 LINDAR의 레이저가 모두 출력됩니다.

    1.5 객체 추가


    LIDAR 센서는 장면에 존재하는 객체의 Collision이 Enable인 객체를 식별합니다.
    장면에 객체를 추가하여 LIDAR에서 식별합니다.
    먼저 장면에 큐브를 추가합니다.
    메뉴 표시줄의 Create>Mesh&Cube를 선택합니다.

    오른쪽 Stage에서 추가 Cube를 선택합니다.
    선택한 상태에서 오른쪽 아래 코너의 Property에서 다음 값을 변경합니다.
  • Transform의translate의 X를 200
  • 으로 설정
  • Transform의translate의 Y를 0
  • 으로 설정
  • Transform의translate의 Z를 0으로 설정

  • 오른쪽 아래에 있는 Property의 +Add 를 클릭하여 Physics > Collider 를 선택합니다.
    선택하면 Collision 속성이 객체에 추가됩니다.

    이 상태에서 Viewport 왼쪽에 있는 PLAY 버튼을 누르면 LIDAR의 레이저가 큐브에 비치는 상태가 된다.

    1.6 객체에 LIDAR 첨부


    Cylinder에 LIADR을 첨부합니다.
    Viewport에서 마우스 오른쪽 버튼을 클릭하고Create>Mesh&Cylinder를 선택합니다.

    오른쪽 Stage에서 추가된 Cylinder를 선택합니다.
    선택한 상태에서 오른쪽 아래 코너의 Property에서 다음 값을 변경합니다.
  • Transform의translate의 X를 0
  • 으로 설정
  • Transform의translate의 Y를 0
  • 으로 설정
  • Transform의translate의 Z를 0으로 설정

  • 오른쪽에 있는 Stage 탭에서 LIDAR을 선택하고 Cylinder 아래로 드래그하여 이동합니다.

    그런 다음 Cylindar와 LIDAR의 상대 위치를 수정합니다.
    오른쪽 Stage에서 LIDAR을 선택합니다.
    선택한 상태에서 오른쪽 아래 코너의 Property에서 다음 값을 변경합니다.
  • Transform의translate의 X를 50
  • 으로 설정
  • Transform의translate의 Y를 50
  • 으로 설정
  • Transform의translate의 Z를 0으로 설정

  • 이 상태에서 Viewport 왼쪽에 있는 PLAY 버튼을 눌러 Cylindar를 이동한 후 상대 위치를 유지하면서 LIDAR도 이동합니다.

    1.7 로봇에 LIDAR 첨부


    LIDAR을 로봇에 부착하는 절차는 전항과 같습니다.
    이번에는 캐터의 엑시플을 사용해 LIDAR을 캐터에 부착했다.
    메뉴 모음의 Isaac Examples > Import Robots > Carter URDF를 선택합니다.

    메뉴 표시줄의 Create>Isaac>Sensors>LIDAR>Rotating 선택

    오른쪽에 있는 Stage 태그에서 LIDAR 을 선택하고/carter/chassis 를 선택합니다.linkr 아래에서 드래그해서 이동합니다.

    오른쪽 Stage에서 LIDAR을 선택합니다.
    선택한 상태에서 오른쪽 아래 코너의 Property에서 다음 값을 변경합니다.
  • Raw USD Properties의 "drawLinus"를 검사하여 enable
  • 로 만듭니다.
  • Raw USD Properties의 "rotationRate"를 0.0으로 설정

  • 이 상태에서 Viewport 왼쪽에 있는 PLAY 버튼을 누르면 Carter가 이동하고 LIDAR가 레이저를 비춘다.

    2. LIDAR(Python API) 추가


    2.1 LIADR 추가


    Python API에서 LIDAR을 사용합니다.
    메뉴 모음에서 File>New 를 선택합니다.
    그런 다음 메뉴 모음에서 Window>Script Editor를 선택합니다.

    다음 내용은 Script Editor에 설명되어 있습니다.
    Python3
    import omni
    import asyncio
    from omni.isaac.range_sensor import _range_sensor
    from pxr import UsdGeom, Gf, UsdPhysics
    
    stage = omni.usd.get_context().get_stage()
    lidarInterface = _range_sensor.acquire_lidar_sensor_interface()
    timeline = omni.timeline.get_timeline_interface()
    
    omni.kit.commands.execute('AddPhysicsSceneCommand',stage = stage, path='/World/PhysicsScene')
    lidarPath = "/LidarName"
    result, prim = omni.kit.commands.execute(
                "RangeSensorCreateLidar",
                path=lidarPath,
                parent="/World",
                min_range=0.4,
                max_range=100.0,
                draw_points=False,
                draw_lines=True,
                horizontal_fov=360.0,
                vertical_fov=30.0,
                horizontal_resolution=0.4,
                vertical_resolution=4.0,
                rotation_rate=0.0,
                high_lod=False,
                yaw_offset=0.0,
                enable_semantics=False
            )
    
    CubePath = "/World/CubeName"
    cubeGeom = UsdGeom.Cube.Define(stage, CubePath)
    cubePrim = stage.GetPrimAtPath(CubePath)
    cubeGeom.AddTranslateOp().Set(Gf.Vec3f(200.0, 0.0, 0.0))
    cubeGeom.CreateSizeAttr(100)
    collisionAPI = UsdPhysics.CollisionAPI.Apply(cubePrim)
    
    async def get_lidar_param():
        await omni.kit.app.get_app().next_update_async()
        timeline.pause()
        depth = lidarInterface.get_linear_depth_data("/World"+lidarPath)
        zenith = lidarInterface.get_zenith_data("/World"+lidarPath)
        azimuth = lidarInterface.get_azimuth_data("/World"+lidarPath)
    
        print("depth", depth)
        print("zenith", zenith)
        print("azimuth", azimuth)
    
    timeline.play()
    asyncio.ensure_future(get_lidar_param())
    
    설명 후 Ctrl + Enter 키를 누르면 Script가 실행되고 장면에 LIADR이 추가됩니다.

    2.2 Point Cloud의 Segmentaiton


    Depth 데이터에 sematinc label을 추가하여 segmentation 결과를 Point Cloud로 표시할 수 있습니다.
    다음 내용은 Script Editor에 설명되어 있습니다.
    Python3
    import omni                                                     # Provides the core omniverse apis
    import asyncio                                                  # Used to run sample asynchronously to not block rendering thread
    from omni.isaac.range_sensor import _range_sensor               # Imports the python bindings to interact with lidar sensor
    from pxr import UsdGeom, Gf, UsdPhysics                         # pxr usd imports used to create cube
    
    stage = omni.usd.get_context().get_stage()                      # Used to access Geometry
    timeline = omni.timeline.get_timeline_interface()               # Used to interact with simulation
    lidarInterface = _range_sensor.acquire_lidar_sensor_interface() # Used to interact with the LIDAR
    
    # These commands are the Python-equavalent of the first half of this tutorial
    omni.kit.commands.execute('AddPhysicsSceneCommand',stage = stage, path='/World/PhysicsScene')
    lidarPath = "/LidarName"
    # Create lidar prim
    result, prim = omni.kit.commands.execute(
                "RangeSensorCreateLidar",
                path=lidarPath,
                parent="/World",
                min_range=0.4,
                max_range=100.0,
                draw_points=True,
                draw_lines=False,
                horizontal_fov=360.0,
                vertical_fov=60.0,
                horizontal_resolution=0.4,
                vertical_resolution=0.4,
                rotation_rate=0.0,
                high_lod=True,
                yaw_offset=0.0,
                enable_semantics=True
            )
    UsdGeom.XformCommonAPI(prim).SetTranslate((200.0, 0.0, 0.0))
    
    # Create a cube, sphere, add collision and different semantic labels
    primType = ["Cube", "Sphere"]
    for i in range(2):
        prim = stage.DefinePrim("/World/"+primType[i], primType[i])
        UsdGeom.XformCommonAPI(prim).SetTranslate((-200.0, -200.0 + i * 400.0, 0.0))
        UsdGeom.XformCommonAPI(prim).SetScale((100, 100, 100))
        collisionAPI = UsdPhysics.CollisionAPI.Apply(prim)
    
        # Add semantic label
        sem = Semantics.SemanticsAPI.Apply(prim, "Semantics")
        sem.CreateSemanticTypeAttr()
        sem.CreateSemanticDataAttr()
        sem.GetSemanticTypeAttr().Set("class")
        sem.GetSemanticDataAttr().Set(primType[i])
    
    # Get point cloud and semantic id for lidar hit points
    async def get_lidar_param():
        await asyncio.sleep(1.0)
        timeline.pause()
        pointcloud = lidarInterface.get_point_cloud_data("/World"+lidarPath)
        semantics = lidarInterface.get_semantic_data("/World"+lidarPath)
    
        print("Point Cloud", pointcloud)
        print("Semantic ID", semantics)
    
    timeline.play()                                                 
    asyncio.ensure_future(get_lidar_param())                        
    
    설명 후 Ctrl + Enter 키를 눌러 Script를 실행하고 Cube 표면에 Point Cloud를 표시합니다.

    좋은 웹페이지 즐겨찾기