2. 평활를 고려하지 않는 단일 포인트 모션
우리 컨트롤러에는 세 가지 모션이 있습니다: 티치 모드, 運줄 모드, 遠程 모드.
그 중 티치 모드에는 다시 다음이 있습니다: 드래그 티치, 조그 티치.
이번 회에서는 조그 티치 하에서 단일 포인트 모션을 수행하는 방법을 소개합니다.
1. 전원 켜기 함수 캡슐화
단일 포인트 모션은 조그 티치 하에서 수행되지만, 티치 모드의 모션은 추가적인 전원 켜기 작업이 필요하므로 전원 켜기 함수를 캡슐화해야 합니다.
cpp
/*
* 전원 켜기 함수 캡슐화
*/
void power_on(int fd)
{
int state = 0;
get_servo_state(fd, state); // 현재 서보 상태 조회
switch (state)
{
case 0: // 현재 서보가 정지 상태
set_servo_state(fd, 1); // 서보를 준비 상태로 설정
set_servo_poweron(fd); // 서보 전원 켜기
break;
case 1: // 현재 서보가 준비 상태
set_servo_poweron(fd);
break;
case 2: // 현재 서보가 알람 상태
clear_error(fd); // 오류 제거
set_servo_state(fd, 1);
set_servo_poweron(fd);
break;
}
get_servo_state(fd, state);
std::cout << "서보 상태: " << state << std::endl;
}2. 모션 종료 대기 함수 캡슐화
cpp
/*
* 모션 종료 시까지 루프 블로킹 함수
*/
void wait_for_running_over(int fd)
{
// 모션 완료 대기
int running_state = 0;
get_robot_running_state(fd, running_state); // 로봇이 모션 중인지 조회 2-모션 중
while (running_state == 2)
{
std::this_thread::sleep_for(std::chrono::milliseconds(500)); // 500ms 블로킹
get_robot_running_state(fd, running_state); // 다시 조회
}
}3. 주요 모션 기능
지연 함수가 사용되므로, 추가로 <thread>, <chrono> 두 헤더 파일을 포함해야 합니다.
cpp
#include <iostream>
#include <thread>
#include <chrono>
#include "cpp_interface/nrc_api.h" // 헤더 파일 임포트
int main()
{
SOCKETFD fd = connect_robot("192.168.1.15", "6001"); // 컨트롤러 연결
if (fd <= 0)
{
std::cout << "연결 실패" << std::endl;
return 0;
}
std::cout << "연결 성공: "<< fd << std::endl;
set_current_mode(fd, 0); // 티치 모드 설정, 티치 모드의 모션만 전원 켜기 필요
set_speed(fd, 50); // 티치 모드의 전역 속도 설정
power_on(fd); // 캡슐화된 전원 켜기 함수 호출
// 모션 전 좌표 조회
std::vector<double> pos(7);
get_current_position(fd, 0, pos);
std::cout << "관절 모션 전 좌표: " << pos[0] << " " << pos[1] << " " << pos[2] << " " << pos[3] << " " << pos[4] << " " << pos[5] << " " << pos[6] << std::endl;
// 모션 명령 구성, 모션 시작
MoveCmd temp_cmd;
temp_cmd.coord = 0; // 관절 좌표계 설정
temp_cmd.targetPosType = PosType::data;
get_current_position(fd, 0, temp_cmd.targetPosValue); // 현재 관절 좌표 가져오기
temp_cmd.targetPosValue[0] += 10; // 현재 위치를 기준으로 1축의 양의 방향으로 10° 이동
temp_cmd.velocity = 50; // 명령 속도, 관절 좌표계에서의 속도 범위 [1,100]
temp_cmd.acc = 100; // 명령 가속도
temp_cmd.dec = 100; // 명령 감속도
robot_movej(fd, temp_cmd);
std::this_thread::sleep_for(std::chrono::milliseconds(200)); // 200ms 블로킹
wait_for_running_over(fd); // 모션 종료 시까지 블로킹
// 모션 후 좌표 조회
get_current_position(fd, 0, pos);
std::cout << "관절 모션 후 좌표: " << pos[0] << " " << pos[1] << " " << pos[2] << " " << pos[3] << " " << pos[4] << " " << pos[5] << " " << pos[6] << std::endl;
return 0;
}