Skip to content

4. 티치 모드 유형 전환 및 궤적 재생 기능

상위컴퓨터(上비트機)를 사용하여 드래그 모드를 활성화하기 전에 먼저 티치盒(티치 펜던트)에서 드래그 식별(identification)을 수행해야 합니다.

주의: 드래그 모드로 전환한 후 set_servo_poweron 인터페이스를 호출하여 서보 上활성화을 활성화해야 드래그을 진행할 수 있습니다.

1. 티치 모드 유형 전환 함수

cpp
/*
 * 티치 모드 유형 전환 함수 캡슐화
 */
void Switching_teach_type(int fd)
{
  int type;
  get_teach_type(fd, type);
  switch (type)
  {
  case 0:   //현재 티치 모드 유형이 조그 모드
    set_teach_type(fd, 1);   //현재 티치 모드 유형을 드래그 모드로 전환
    break;
  
  case 1:   //현재 티치 모드 유형이 드래그 모드
    set_teach_type(fd, 0);   //현재 티치 모드 유형을 조그 모드로 전환
    break;
  }


}

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(100));  // 500ms 블로킹
        get_robot_running_state(fd, running_state);   // 다시 조회
    }
}

3. 궤적 재생 기능 함수 캡슐화

cpp
/*
 * 궤적 재생 기능 함수 캡슐화
 */
void record_playback(int fd)
{
  int vel = 30;                                                     //궤적 재생 속도
  set_teach_type(fd, 0); 
  track_record_playback(fd, vel);                                   //기록된 궤적 재생
  wait_for_running_over(fd);
}

4. 드래그 轨 기록 함수 캡슐화

cpp
/*
 * 드래그 轨 기록 함수 캡슐화
 */
void track_record(int fd)
{
  set_teach_type(fd, 1);   //현재 티치 모드 유형을 드래그 모드로 전환
  double maxSamplingNum = 200;     //궤적의 샘플링 간격
  double samplingInterval = 0.05;  //최대 샘플링 포인트 수
  int vel = 30;                    //궤적 재생 속도
  track_record_delete(fd);         //새 궤적 기록 전 기존 궤적 제거
  track_record_start(fd, maxSamplingNum, samplingInterval);         //궤적 기록 시작
  for(int i = 0; i < 50; i++)
  {
    sleep(0.2);     ////.....10초 대기, 드래그 종료 대기
  }
  track_record_stop(fd);                                            //궤적 기록 종료
}

5. 드래그 재생 기능

cpp
#include <chrono>
#include <iostream>
#include <string>
#include <unistd.h>
#include <thread>


#include "cpp_interface/nrc_api.h"


using namespace std;


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;
    clear_error(fd);     //오류 제거
    track_record(fd);
    //record_playback(fd);   //방금 기록된 궤적을 재생하려면 이 함수를 호출


}