Skip to content

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. 주요 모션 기능 ​

지연 함수가 사용되므로, 추가로 &lt;thread&gt;, &lt;chrono&gt; 두 헤더 파일을 포함해야 합니다.

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;
}
🤖 AI assistants / automation: start with the Agent Development Guide and Pre-generation Checklist (Chinese); machine-readable entry: /llms.txt; plain-text version: swap .html for .md in the URL