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)