이전 버전(1.33.4)의 문서를 보고 있습니다. 이 버전은 계속 지원됩니다.
최신 버전 정보는 1.33.5에서 확인하세요.

read_data_rt

이 함수는 로봇 컨트롤러의 실시간 출력 데이터를 읽습니다. set_rt_control_output으로 구성한 모션, 토크, 시스템 상태가 담긴 최신 출력 구조체를 가져옵니다.

보통 start_rt_control 뒤 실시간 루프 안에서 조인트 위치, 속도, 외부 토크를 계속 모니터링할 때 사용합니다.

정의
DRFLEx.h, CDRFLEx 클래스의 public 섹션

LPRT_OUTPUT_DATA_LIST read_data_rt() {
    return _read_data_rt(_rbtCtrlUDP);
};

매개변수
없음

반환값

값

설명

LPRT_OUTPUT_DATA_LIST

모든 RT 출력 데이터 필드가 담긴 구조체에 대한 포인터입니다.
필드는 get_rt_control_output_data_list에 정의되어 있습니다.

예제

#include <chrono>
#include <cstring>
#include <thread>

drfl.connect_rt_control("192.168.137.100", 12347);

std::string version = "v1.0";
float period = 0.001f;  // 1 msec 주기
int lossCount = 4;

// 입출력 스트리밍 설정
drfl.set_rt_control_input(version, period, lossCount);
drfl.set_rt_control_output(version, period, lossCount);
drfl.start_rt_control();

// 실시간 읽기 루프
while (true) {
    // 프레임 전체를 한 번에 복사합니다. 필드별로 복사하면 복사하는 사이에
    // 버퍼가 덮어써질 수 있어 필드 값이 서로 다른 프레임에서
    // 올 수 있습니다.
    RT_OUTPUT_DATA_LIST frame;
    memcpy(&frame, drfl.read_data_rt(), sizeof(frame));

    printf("Joint 1 Pos: %.1f  Vel: %.1f  Torque: %.1f\n",
           frame.actual_joint_position[0],
           frame.actual_joint_velocity[0],
           frame.actual_joint_torque[0]);

    // 루프를 종료하는 사용자 정의 조건
    if (frame.actual_joint_position[0] > 30.0f)
        break;

    // RT 주기만큼 대기
    std::this_thread::sleep_for(std::chrono::milliseconds(1));
}

drfl.stop_rt_control();
drfl.disconnect_rt_control();

이 예제는 실시간 스트림에서 현재 조인트 위치, 속도, 토크를 계속 가져와 출력합니다.

팁

  • 이 함수는 반드시 start_rt_control로 RT 스트리밍을 시작한 뒤에 호출해야 합니다.

  • 반환되는 포인터는 절대 null이 되지 않으므로 null 검사로는 유효성을 확인할 수 없습니다.
    포인터가 가리키는 버퍼는 새 프레임이 도착할 때마다 덮어쓰이므로, 필드를 하나씩 읽으면 서로 다른 두 패킷의 값이 섞일 수 있습니다. 예제처럼 구조체 전체를 한 번에 복사하고 복사본으로 작업하세요.

  • 첫 RT 데이터를 받기 전까지는 time_stamp를 포함해 반환된 구조체의 모든 필드가 0입니다. 데이터를 사용하기 전에(예: 서보 목표의 초깃값으로 쓰기 전에) time_stamp가 0이 아니고 계속 증가하는지 확인하세요.

  • 루프 안에서 데이터를 안전하게 복사하려면 memcpy나 직접 인덱싱을 사용하세요.

  • 시각화하려면 데이터를 배열에 저장하거나 로거로 실시간 전송하세요.