4족 보행 로봇, 휴머노이드 로봇 또는 고성능 로봇 암을 개발할 때 기존의 독립적인 위치/속도/토크 제어 방식은 통신 프레임 속도의 한계로 인해 고주파 전신 동역학 제어 요구 사항을 충족하지 못하는 경우가 많습니다. 이러한 이유로 MIT Mode는 개발자들이 가장 선호하는 제어 방식으로 자리 잡았습니다.
이 튜토리얼에서는 C++를 사용하여 CAN 버스를 통해 CubeMars AK60-6 (KV80) Robotic Actuator를 MIT Mode로 구성하고 제어하는 방법을 단계별로 설명합니다. 이 가이드를 따라 하면 기본 통신 프로토콜의 핵심 로직을 이해하고 액추에이터의 높은 응답성과 낮은 지연 시간을 최대한 활용할 수 있습니다.
C++ 코드를 작성하기 전에 다음과 같은 하드웨어 및 소프트웨어 환경을 준비해 주십시오.
핵심 하드웨어: CubeMars AK60-6 (KV80) Robotic Actuator, 안정적인 CAN 통신 인터페이스(예: USB-to-CAN 어댑터, CANoe 또는 CAN 인터페이스가 탑재된 개발 보드)
소프트웨어 환경: C++ 컴파일러(GCC, MSVC 등)와 CAN 통신을 지원하는 서드파티 라이브러리(PCAN-Basic, SocketCAN 등)
유틸리티 소프트웨어: CubeMars 공식 설정 소프트웨어(초기 파라미터 설정용)
코드를 작성하기 전에 먼저 MIT Mode를 사용하는 이유를 이해하는 것이 중요합니다. 기존 제어 방식은 한 번에 하나의 파라미터(예: 위치 또는 속도)만 전송할 수 있습니다. 반면 MIT Mode에서는 다음의 5가지 핵심 파라미터를 하나의 표준 8바이트 CAN 프레임에 동시에 포함할 수 있습니다.
목표 위치
목표 속도
목표 토크 (Torque / Kt × I)
위치 PD 게인 (Kp)
속도 PD 게인 (Kd)
이와 같은 통합 메시지 구조는 통신 지연을 크게 줄여주며, 고주파 보행 제어와 컴플라이언트 힘 제어를 구현하는 기반이 됩니다.
코드를 실행하기 전에 액추에이터가 올바르게 연결되고 설정되었는지 확인하십시오.
하드웨어 연결: CAN 인터페이스의 CAN_H 및 CAN_L을 각각 AK60-6 액추에이터의 CAN_H 및 CAN_L에 연결합니다. 또한 모든 장치가 공통 접지(Common Ground)를 공유하는지 확인하십시오.
CubeMars 소프트웨어를 통한 설정:
CubeMars 설정 소프트웨어를 사용하여 액추에이터에 연결합니다.
액추에이터의 CAN ID를 원하는 값(예: 0x01)으로 설정하고, 해당 값을 기억해 두십시오. 이 값은 C++ 프로그램에서 사용됩니다.
Baud Rate를 1 Mbps(1000 kbps)로 설정합니다. 이는 MIT Mode에서 권장되는 통신 속도입니다.
"Enter MIT Mode" 버튼을 클릭합니다. 설정이 성공적으로 완료되면 손으로 축을 회전시킬 때 뚜렷한 전자기 저항감을 느낄 수 있습니다.
C++ 환경에서 AK60-6의 제어 로직은 다음의 세 가지 핵심 단계로 나눌 수 있습니다(전체 프로젝트 코드와 데이터 변환 함수는 아래 첨부 파일을 다운로드하십시오).
Enable 명령 전송: MIT Mode에 진입한 후에도 액추에이터는 기본적으로 보호 상태에 있습니다. 제어 명령을 보내기 전에 전용 Enable 프레임(일반적으로 0x00으로 채워진 8바이트 프레임 또는 프로토콜에서 정의한 Enable 프레임)을 먼저 전송하여 액추에이터를 활성화해야 합니다. 확인음(삐 소리)이 들리면 활성화가 완료된 것입니다.
부동소수점 값을 부호 없는 정수로 변환: 이는 MIT Mode의 C++ 구현에서 가장 중요한 알고리즘입니다. CAN 프레임은 정수 데이터만 전송할 수 있으므로, 물리량(예: 목표 위치 -12.5 rad)을 16비트 또는 12비트 부호 없는 정수로 변환해야 합니다.
로직: 선형 매핑 함수 float_to_uint(x, x_min, x_max, bits)를 사용합니다.
동작: 목표 위치, 속도, 토크, Kp 및 Kd를 액추에이터의 허용 범위 내로 제한한 후, 비례적으로 해당 16진수 값으로 변환합니다.
8바이트 CAN 프레임 구성 및 전송: 이전 단계에서 얻은 다섯 개의 정수 값을 CubeMars 통신 프로토콜에서 정의한 비트 배열에 따라 하나의 8바이트(64비트) 배열로 패킹합니다. 이후 사용 중인 CAN 라이브러리를 이용해 설정된 CAN ID로 액추에이터에 전송합니다. 액추에이터는 프레임을 수신하면 즉시 이를 해석하고 명령을 실행합니다.
C++ 프로그램을 컴파일하고 실행(또는 다운로드)한 후 AK60-6 액추에이터의 전원을 켭니다.
C++ 프로그램을 실행하면 코드에서 설정한 목표 위치, 속도 및 토크 값에 따라 액추에이터가 매우 부드럽고 빠르게 응답하는 것을 확인할 수 있습니다. 또한 Kp와 Kd 값을 동적으로 변경하여 액추에이터의 강성과 컴플라이언스 특성이 어떻게 변화하는지 직접 확인할 수 있습니다.
Q1: CAN 프레임을 전송했는데 액추에이터가 응답하지 않거나 오류가 발생합니다.
A: 다음 사항을 확인하십시오.
Enable 명령이 정상적으로 전송되었습니까?
C++ 코드의 CAN ID가 액추에이터에 설정된 CAN ID와 정확히 일치합니까?
명령 값이 프로토콜에서 정의한 제한 범위(P_MAX, V_MAX 등) 내에 있습니까? 허용 범위를 벗어난 값은 액추에이터에서 거부됩니다.
Q2: 코드에서 바이트 순서(Byte Order)는 어떻게 처리해야 하나요?
A: CubeMars CAN 프로토콜은 일반적으로 Big-Endian 방식을 사용합니다. C++에서 8바이트 CAN 프레임을 구성할 때 MSB(Most Significant Byte)와 LSB(Least Significant Byte)의 순서를 반드시 정확하게 맞춰야 합니다. 바이트 순서가 잘못되면 위치와 토크 값이 올바르게 해석되지 않습니다. 자세한 내용은 Communication Protocol Manual을 참고하십시오.
Q3: 액추에이터의 Zero Position은 어떻게 보정하나요?
A: MIT Mode에서는 "Set Current Position as Zero" 전용 CAN 명령을 전송합니다(CAN ID 및 데이터 프레임은 Communication Protocol Manual을 참조하십시오). 그러면 액추에이터는 현재 로터 위치를 기계적 영점으로 저장합니다. 시스템 전원 인가 후 초기화 과정에서 매번 이 작업을 수행하는 것이 권장됩니다.
60 mm 플랜지 크기와 뛰어난 동적 성능을 갖춘 AK60-6 (KV80)는 경량 로봇 암, 짐벌 시스템 및 4족 보행 로봇의 다리 관절에 이상적인 선택입니다.
[CubeMars AK60-6 (KV80)의 상세 사양 및 치수를 확인해 보세요.]