Skip to content

servoJ를 사용한 관절 제어

인터페이스 설명

cpp
/**
 * @brief 관절 추적 모드 열기
 * @param vmax 속도 제한 단위 도/초
 * @param amax 가속도 제한 단위 도/초^2
 * @param jmax 가가속도 제한 단위 도/초^3
 */
Result open_servoJ(SOCKETFD socketFd, std::vector<double> vmax, std::vector<double> amax, std::vector<double> jmax);


/**
 * @brief 추적 관절 위치 전송
 * @param q 목표 위치 단위 도
 */
Result set_servoJ_pos(SOCKETFD socketFd, std::vector<double> q);


/**
 * @brief 관절 추적 모드 닫기
 */
Result stop_servoJ(SOCKETFD socketFd);

사용 예시

cpp
int main()
{
    // 6000 포트에 연결하여 전원 켜기 제어 및 로봇의 현재 위치 조회
    SOCKETFD fd_6000 = connect_robot("192.168.1.13", "6000");
    // 7000 포트에 연결
    SOCKETFD fd_7000 = connect_robot("192.168.1.13", "7000");
    if (fd_6000 < 0 || fd_7000 < 0) 
    {
        return 0; // 연결 실패, 종료.
    }
    // 로봇 전원 켜기 설정
    std::cout << "준비: " <<  set_servo_state(fd_6000, 1)<<std::endl;
    std::cout << "전원 켜기: " << set_servo_poweron(fd_6000)<<std::endl;
    std::this_thread::sleep_for(std::chrono::milliseconds(30));
    
    // 운동 제한 설정
    std::vector<double> vMax = {10, 10, 10, 10, 10, 10, 10};  // 속도 10°/s
    std::vector<double> avMax = {1000, 1000, 1000, 1000, 1000, 1000, 1000}; // 가속도 1000°/s^2
    std::vector<double> jMax = {1000, 1000, 1000, 1000, 1000, 1000, 1000}; // 가가속도 1000°/s^3
    std::cout << "관절 추종 열기" << open_servoJ(fd_7000, vMax, avMax, jMax) << std::endl;


    int n = 100
    while(n > 0)
    {
        n--;
        std::cout << "현재 위치: " << get_current_position(fd_6000, 0, pos) << std::endl;
    
        // 첫 번째 요소 pos[0]에만 0.5를 더하며, 로봇의 1축에 해당
        pos[0] += 0.2;
    
        std::cout << "관절 추종 전송" << set_servoJ_pos(fd_7000, pos) << std::endl;
        // 10ms마다 새 위치를 전송
        std::this_thread::sleep_for(std::chrono::milliseconds(10));
    }


    // servoJ 모드 중지
    stop_servoJ(fd_7000);
    return 0;
}