indy eye client command 관련 문의



  • 그림 1
    그림 1

    안녕하세요,

    제가 Indy에서 제공한 마커의 Pose를 추정하고 싶습니다.
    그런데 그림 1에서 보시다시피 indy-eye 커맨드는 딥러닝 알고리즘만 실행이 가능한데, 혹시 마커의 Pose를 추정하는 command가 있는 지 궁금합니다.

    ---

    online module을 이용하여 marker pose를 추정해보았는데, indy-eye앱과 indy dcp(C++)가 동시에 로봇과 연결이 되지 않는 문제가 있었습니다. (한쪽이 연결되어 있으면, timeout error 발생) 

    indy-eye 앱에서 로봇과 연결을 해제한 후, online module을 이용해marker의 pose를 확인하면 매우 엉뚱한 값이 나옵니다. 따라서, online module을 이용한 marker pose estimation은 indy-eye 앱을 반드시 켜야하는 문제점을 가지고 있습니다.

    그래서, indy_eye_client 클래스를 사용해 marker pose를 추정하고자 합니다. 이러한 이유로 이 문의 글을 작성하게 되었습니다.

    혹시 indy dcp를 동시에 키면서 marker의 pose를 정확하게 추정할 수 있는 다른 방법이 있는 지 궁금합니다.

    감사합니다.

    --- 수정 (추가) 200818

    또는 Calibration Sheet의 Pose를 추정하는 방법이 있는 지 궁금합니다. 일단 detect 함수의 파라미터에서 cls = 1 은 class = Sheet 를 의미하나요?

    그림 2

    그림 2와 같이 robot base to sheet를 표현하는 homogeneous transformation matrix를 구하려 하는데,

    문제는 indy_eye.detect() 메서드를 실행하면 시트를 인식하지 못하고 None을 반환합니다. 이러한 오류의 원인이 무엇일까요? 



  • 안녕하세요, 인디아이 담당자 송희준입니다.

     

    저번 원격 연결을 통해 지원해드렸던 내용을 다시 간추려서 추가로 답변드리고자 합니다.

     

    먼저, 첫 번째로 문의 주신 내용에 대해서 답변드립니다.

    IndyEye 제품 배송시, 함께 배송되는 Calibration Sheet와 Tool Marker를 검출하시려면 다음과 같이 설정 해주셔야 합니다.

    IndyEye 안드로이드 앱의 검출 탭 구성_

    1. 위의 사진과 같이 Camera - DetectMarker - Select 로 구성된 그래프를 작성합니다.

    2. DetectMarker의 설정 중, 검출을 원하시는 시트를 선택합니다. (sheet / marker 중 택1)

    ---- 이후 ----

    앱의 설정이 완료되었다면, 사용 중이신 python 스크립트에서 indyeye 클라이언트의 detect 함수를 사용하시면 마커의 좌표점을 얻을 수 있습니다.

     

    예제_

    task_pos = dcp_client.get_task_pos()

    marker_pos = indy_eye.detect(1, task_pos, 'Tbo')

    print(marker_pos)

     

    수정 및 추가해주신 질문에 대한 답변은 아래와 같습니다.

     

    indy dcp를 사용하실 경우, IndyEye 안드로이드 앱에서 연결 중인 로봇과 접속을 끊어야 합니다.

    Python 스크립트에서 IndyEye Client를 통해 인디아이 그래프를 작동시키는 경우, 인디아이에서 로봇과 반드시 연결하여야 하는 것은 아닙니다.

    만약 추정한 값이 전혀 엉뚱한 값이 나온다면, detect 함수 호출 시에 인자 값으로 입력한 로봇의 task position과 검출하고자 하시는 class를 정확히 입력하셨는지 확인하여 보시기 바랍니다.

    detect 함수에 인자값으로 사용되는 task_pos의 경우, 로봇의 현재 자세에 대한 position을 전달하여야 하며, 검출시 전달된 로봇의 position을 좌표점 추정에 활용합니다.

    따라서 marker의 pose estimation의 경우, indyeye_client.py의 detect 함수를 통해 추정된 좌표점을 반환받으실 수 있습니다.

     

    마지막으로 말씀주신 cls 인자값의 경우, indyeye_client.py의 get_object_dict 함수에서 반환되는 값을 사용하여야 합니다.

    get_object_dict 함수의 경우, 현재 그래프상에 등록된 타겟 물체의 정보를 python의 dictionary 형태로 반환합니다.

    예를 들어, IndyEye 앱에서 "Camera-DetectMarker-Select"와 같이 구성되어 있을 때, DetectMarker에서 설정한 값이 "sheet"라면 다음과 같이 반환됩니다.

    {"1":"sheet"}

    위의 반환 값에서 "Key" : "Value" 형태의 데이터가 가지는 의미는 다음과 같습니다.

    Key : 타겟의 번호(class)

    Value : 타겟의 이름

    여기서 추출되는 Key 값은 indyeye_client.py의 detect 함수의 cls 인자값으로 사용되며, int 형태로 입력되어야 합니다.

    ex)_

    objs = eye.get_object_dict()

    print(objs)

    # 출력 결과 : {"1":"sheet","2":"label_object1","3":"label_object2"}

    # 검출하고자 하는 타겟 물체 : 캘리브레이션 시트 (1 번)

    sheet_pos = eye.detect(1, task_pos, 'Tbo")

     

    이상으로 답변을 마치도록 하겠습니다.

    감사합니다.

     

     

    - P.S.

    마지막에 추가해주신 그림 2에서 None을 반환하는 이유는 다음의 이유 중 하나일 수 있습니다.

    1. 영상에서 검출 타겟으로 설정된 sheet가 검출될 만큼의 충분한 거리 안으로 들어오지 않았을 경우

      -> 해당 문제의 경우, 초점이 맞지 않는 위치에 시트가 위치할 경우 발생할 수 있습니다.

      -> 시트를 인식할 수 있는 감지 가능 영역까지 시트를 위치시켜 주시면 해결할 수

    2. 검출 탭에서 검출 알고리즘이 제대로 검출 결과 값을 반환하지 못할 경우

      -> 해당 문제는 검출 탭에서 작성하신 그래프에서 DetectMarker와 Select 이후, 다른 알고리즘을 사용하시면서 결과가 덮어씌워진 경우일 수 있습니다.

      -> 알고리즘 구성을 다시 한 번 살펴주시기 바랍니다.


Log in to reply