Skip to content

servo_move()를 사용한 추적 운동

servo_move(SOCKETFD socketFd,ServoMovePara servoMove)는 포인트 그룹을 수신한 후 timeStamp에 따라 수신한 포인트를 평활 처리하여 서보 운동으로 전송할 수 있습니다.

ServoMovePara 구조체 설명:

cpp
struct ServoMovePara {
  ///< 전송 매개변수
  int robotNum;                             ///< 몇 번째 로봇을 제어할지 지정
  bool clearBuffer;                         ///< 이전에 전송했지만 보간 계산을 시작하지 않은 포인트를 삭제할지 여부
  int targetMode;                           ///< 0-독립 포인트 1-연속 궤적
  int sendMode;                             ///< 0-전체 궤적을 한 번에 전송 1-포인트 일부를 한 번에 전송
  int runMode;                              ///< 0-수신 완료 후 운동 1-수신하면서 운동
  int sum;                                  ///< 총 전송 횟수
  int count;                                ///< 현재 몇 번째 전송인지
  ///< 운동 매개변수
  int coord;                                ///< 0-관절 1-직교
  int size;                                 ///< 이번 전송의 포인트 수
  std::vector<std::vector<double>> pos;     ///< 2차원 배열. 1차원은 이번 전송의 포인트 수를 나타내고, 2차원 길이는 7이며 각 관절 각도 또는 Cartesian 좌표를 나타냄
  std::vector<std::vector<double>> axisvel; ///< 2차원 배열. 1차원은 이번 전송의 포인트 수를 나타내고, 2차원 길이는 7이며 각 축의 속도를 나타냄
  std::vector<std::vector<double>> axisacc; ///< 2차원 배열. 1차원은 이번 전송의 포인트 수를 나타내고, 2차원 길이는 7이며 각 축의 가속도를 나타냄
  std::vector<double> timeStamp;            ///< 이번 전송의 포인트 수와 같은 길이이며, 해당 포인트에 도달하는 시간을 나타냄. 단위 ms
};

예시: 연속 포인트 궤적을 사용하여 전체 궤적 포인트를 한 번에 전송

참고: servo_move 인터페이스를 사용할 때는 운동 모드에서 외부 포인트 명령이 포함된 작업 파일을 실행해야 합니다(외부 포인트 명령이 servo_move 전송 데이터를 수신함).

py
def test_7000(socketFd):
    print('开启测试7000.....')
    socket_7000 =  aa.connect_robot("192.168.1.13", "7000")
    servomovepara = aa.ServoMovePara()
    pos = aa.VectorVectorDouble()
    time = aa.VectorDouble()
    time_pos = [50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 550]     #목표 포인트에 도달하는 타임스탬프
    for value in time_pos:
        time.append(value)
    axis_pos = [[0,0,0,0,0,0,0],
                [0,0,0,0,0,1,0],
                [0,0,0,0,0,2,0],
                [0,0,0,0,0,3,0],
                [0,0,0,0,0,4,0],
                [0,0,0,0,0,5,0],
                [0,0,0,0,0,6,0],
                [0,0,0,0,0,7,0],
                [0,0,0,0,0,8,0],
                [0,0,0,0,0,9,0],
                [0,0,0,0,0,10,0]]                               #목표 포인트
    
    for value in axis_pos:
        pos.append(value)
    for k in range(11):
        servomovepara.pos = pos
    for j in range(11):
        servomovepara.timeStamp = time
    servomovepara.runMode = 0          #기본값으로 고정하여 0 전송
    servomovepara.clearBuffer = True   #연속 운동 사용 시 clearBuffer, targetMode, sendMode, runMode는 이 고정 형식으로 값을 할당해야 함
    servomovepara.targetMode = 1       #연속 궤적
    servomovepara.coord = 0            # 0-관절 좌표   1-직교 좌표
    servomovepara.size = 11            #전송할 목표 포인트 길이
    result =  aa.servo_move(socket_7000, servomovepara)
    print("return " , result)