Python DCP를 이용해서 데이터 빠르게 가져오기



  • 안녕하세요!

    python DCP를 이용해서 indy.get_task_pos()함수를 이용해 x, y, z 좌표를 while문으로 실시간으로 가져오는데 딜레이가 0.5~ 0.7초 정도 됩니다! 혹시 이걸 더 빠르게 가져올 수 있을까요??



  • 안녕하세요, 뉴로메카 입니다.
    문의주신 부분에 대해 좀 더 정확한 답변을 드리고자 사용하시고 계시는 python 코드와 사용 환경 (jupyter notebook 통해 실행 등) 을 먼저 말씀해주실 수 있으신가요?



  • test는 아래 코드로 하였고 환경은 python 3.7 JetBrains PyCharm Community Edition 2019.2.5 x64에서 실행했습니다.

    네트워크 상태에 따라 다를 수는 있겠지만 약 0.6초마다 좌표를 받아오고 있습니다.

    import indydcp_client as client
    import time
    import socket
    import sys
    def main():
        # robot connect    
        #robot_ip = sys.argv[1]    
        robot_ip = "192.168.0.104"    
        robot_name = "NRMK-Indy7"    
        # indy = robot control    
        indy = client.IndyDCPClient(robot_ip, robot_name)
        start = time.time()    
        while 1:        
            x = round(1000 * indy.get_task_pos()[0], 2)        
            y = round(1000 * indy.get_task_pos()[1], 2)        
            z = round(1000 * indy.get_task_pos()[2], 2)        
            print(x, y, z)        
            print("time : ", time.time() - start)
    if __name__ == "__main__":    main()
    


  • 안녕하세요. 

    뉴로메카입니다.


    우선 작성해주신 코드의 x, y, z 좌표를 읽어오는 부분을 보면,

    각각,  get_task_pos() 를 실행하고 있는것을 알 수 있습니다. 

    즉  get_task_pos() 를 3회 실행하고 있으며 때문에 0.6[s] 정도의 긴 시간이 소요되었습니다.  

    import indydcp_client as client
    import time
           
    def main():
        # robot connect    
        robot_ip = "192.168.3.134"    
        robot_name = "NRMK-Indy7"    
        indy = client.IndyDCPClient(robot_ip, robot_name)
        while True:
            start = time.time()
            t_pos = indy.get_task_pos()
            print("time : ", time.time() - start)
    

    위와 같이 코드를 수정할 경우, 0.2[s] 내외의 시간에 결과값이 받아지는것을 확인할 수 있습니다. 

    또한, 더욱 짧은 시간내에 응답을 원하실 경우 indydcp_client 코드를 수정하는 방법이 있습니다. 

    배포 되고 있는 indydcp_client 에는 편의를 위하여 각 명령 마다 client가 connect 및 disconnect 되고 있습니다.

    매 명령을 실행 할때마다 새롭게 연결을 생성하기 때문에 상당한 시간이 소요됩니다. 

    이를 수정하는 방법은 다음과 같습니다. 

    1. indydcp_client 코드의 socket_connect 수정

    def socket_connect(func):
        def decorated(*args, **kwargs):
            # args[0].connect()
            func_out = func(*args, **kwargs)
            # args[0].disconnect()
            return func_out
        return decorated

    위 코드와 같이 connect, disconnect 를 주석처리 해주세요

    2. main 프로그램 수정 

    import indydcp_client as client
    import time
    def main():
        # robot connect    
        robot_ip = "192.168.3.134"    
        robot_name = "NRMK-Indy7"    
        indy = client.IndyDCPClient(robot_ip, robot_name)
        indy.connect()
        while True:
            start = time.time()
            t_pos = indy.get_task_pos()
            print("time : ", time.time() - start)
        indy.disconnect()

    위와 같이 명령어를 실행하기 전에 connect 후 명령이 실행된 뒤 disconnect 하도록 수정하시면 됩니다. 

    네트워크 환경에 따라 다르겠지만 0.05[s] 내외에 값을 얻을 수 있습니다. 



  • 매 명령마다 소켓 connect/disconnect 하던 코드를 수동으로 connect/disconnect 하도록 변경하였습니다. 

    Docs에 이를 반영하여 코드와 예제 업데이트 호스팅 되었습니다.

    http://docs.neuromeka.com/2.3.0/kr/Python/section1/


Log in to reply