FAQ

자주 묻는 질문입니다.

일반

Q: RaisinClient와 Direct Network의 차이점은?

A: RaisinClient 는 일반적인 사용 사례를 위한 예제 래퍼 클래스입니다. Direct Network는 raisin_network 라이브러리를 직접 사용하여 더 세밀한 제어가 가능합니다.

  • RaisinClient: 빠른 시작, 간단한 API

  • Direct Network: 커스텀 서비스, 고급 기능

Q: GPS 없이도 사용할 수 있나요?

A: 네. GPS 없이 PCD 맵 기반 자율주행이 가능합니다.

// PCD 맵 기반 (GPS 불필요)
client.setMap("office.pcd", 0, 0, 0, 0, "office");
Waypoint("office", 5.0, 3.0);  // 맵 좌표

GPS를 사용하려면 로봇에 GPS 모듈이 장착되어 있어야 합니다.

Q: 여러 로봇을 동시에 제어할 수 있나요?

A: 네. 각 로봇에 대해 별도의 RaisinClient 인스턴스를 생성하면 됩니다.

raisin_sdk::RaisinClient client1("controller1");
raisin_sdk::RaisinClient client2("controller2");

client1.connect("robot1_id");
client2.connect("robot2_id");

Waypoint

Q: Waypoint frame은 왜 중요한가요?

A: frame은 좌표계를 지정합니다. setMap() 에서 설정한 map_name 과 Waypoint의 frame 이 일치해야 로봇이 올바른 위치로 이동합니다.

// map_name = "floor1" 으로 설정했다면
client.setMap("map.pcd", 0, 0, 0, 0, "floor1");

// Waypoint도 "floor1" frame 사용
Waypoint("floor1", 10.0, 5.0);  // OK

// 다른 frame 사용 시 동작 안함
Waypoint("map", 10.0, 5.0);     // Wrong

Q: 무한 순찰은 어떻게 설정하나요?

A: repetition 을 0으로 설정하거나 startPatrol() 을 사용합니다.

// 방법 1
client.setWaypoints(waypoints, 0);  // repetition = 0

// 방법 2
client.startPatrol(waypoints);

Q: 순찰 중 Waypoint를 추가할 수 있나요?

A: 네. appendWaypoint() 를 사용합니다.

// 기존 미션에 새 waypoint 추가
client.appendWaypoint(raisin_sdk::Waypoint("my_map", 15.0, 10.0));

제어

Q: 수동/자율 제어 전환은 어떻게 하나요?

A: setManualControl()setAutonomousControl() 을 사용합니다.

// 수동 제어 (조이스틱)
client.setManualControl();

// 자율주행 제어
client.setAutonomousControl();
client.setWaypoints(waypoints, 1);

Q: 긴급 정지는 어떻게 하나요?

A: stopNavigation() 으로 자율주행을 중지합니다.

// 자율주행 중지
client.stopNavigation();

실제 로봇 긴급 정지는 조이스틱의 비상 정지 버튼을 사용하세요.

데이터

Q: Odometry 데이터는 어떤 좌표계인가요?

A: 맵이 로드된 경우 맵 기준 좌표계, 그렇지 않으면 시작 위치 기준 odom 좌표계입니다.

Q: PointCloud 데이터 형식은?

A: Point3D 구조체 벡터로 제공됩니다.

struct Point3D { float x, y, z; };

client.subscribePointCloud([](const std::vector<raisin_sdk::Point3D>& points) {
    for (const auto& p : points) {
        // p.x, p.y, p.z 사용
    }
});

Q: 배터리 잔량은 어떻게 확인하나요?

A: subscribeRobotState() 로 배터리 정보를 구독합니다.

client.subscribeRobotState([](const raisin_sdk::ExtendedRobotState& state) {
    double percentage = 0.0;
    if (state.max_voltage > state.min_voltage) {
        percentage = (state.voltage - state.min_voltage) /
                    (state.max_voltage - state.min_voltage) * 100.0;
    }
    std::cout << "Battery: " << percentage << "%" << std::endl;
});

호환성

Q: 어떤 로봇을 지원하나요?

A: Raibo2 플랫폼을 지원합니다. Autonomy 플러그인과 Fast-LIO 플러그인이 로드되어 있어야 합니다.

Q: Windows에서 사용할 수 있나요?

A: 현재 Ubuntu Linux만 공식 지원합니다. Windows 지원은 추후 검토 예정입니다.

Q: ARM64 (Jetson 등)에서 사용할 수 있나요?

A: 네. x86_64와 arm64 아키텍처 모두 지원합니다.