Direct Network API
고급 사용자를 위한 raisin_network 직접 사용 방법입니다.
헤더 포함
#include "raisin_network/raisin.hpp"
#include "raisin_network/network.hpp"
#include "raisin_network/node.hpp"
#include "raisin_interfaces/srv/set_waypoints.hpp"
#include "raisin_interfaces/srv/get_waypoints.hpp"
#include "raisin_interfaces/srv/append_waypoint.hpp"
#include "raisin_interfaces/srv/set_laser_map.hpp"
#include "raisin_interfaces/srv/string.hpp" // Joy 제어용
#include "raisin_interfaces/msg/robot_state.hpp" // 로봇 상태 토픽
연결 패턴
// 1. 초기화
raisin::raisinInit();
// 2. 네트워크 생성
std::vector<std::vector<std::string>> threads = {{"main"}};
auto network = std::make_shared<raisin::Network>(
"my_client", // 클라이언트 ID
"external", // 디바이스 타입
threads
);
std::this_thread::sleep_for(std::chrono::seconds(1));
// 3. 로봇 연결
auto connection = network->connect("ROBOT_ID");
if (!connection) {
std::cerr << "Connection failed" << std::endl;
return -1;
}
std::this_thread::sleep_for(std::chrono::seconds(2));
// 4. Node 생성
raisin::Node node(network);
서비스 클라이언트 생성
// Waypoint 설정 클라이언트
auto setClient = node.createClient<raisin::raisin_interfaces::srv::SetWaypoints>(
"planning/set_waypoints", connection);
// Waypoint 조회 클라이언트
auto getClient = node.createClient<raisin::raisin_interfaces::srv::GetWaypoints>(
"planning/get_waypoints", connection);
// Waypoint 추가 클라이언트
auto appendClient = node.createClient<raisin::raisin_interfaces::srv::AppendWaypoint>(
"planning/append_waypoint", connection);
// 맵 설정 클라이언트
auto mapClient = node.createClient<raisin::raisin_interfaces::srv::SetLaserMap>(
"set_map", connection);
// Joy 제어 클라이언트
auto joyListenClient = node.createClient<raisin::raisin_interfaces::srv::String>(
"set_listen", connection);
// 서비스 대기
if (!setClient->waitForService(std::chrono::seconds(10))) {
std::cerr << "Service not available" << std::endl;
}
서비스 호출 예시
// SetWaypoints 요청 생성
auto request = std::make_shared<raisin::raisin_interfaces::srv::SetWaypoints::Request>();
raisin::raisin_interfaces::msg::Waypoint wp;
wp.frame = "my_map";
wp.x = 5.0;
wp.y = 0.0;
wp.z = 0.0;
wp.use_z = false;
request->waypoints.push_back(wp);
request->repetition = 1;
request->current_index = 0;
// 비동기 호출
auto future = setClient->asyncSendRequest(request);
if (future.wait_for(std::chrono::seconds(5)) == std::future_status::ready) {
auto response = future.get();
std::cout << "Success: " << response->success << std::endl;
std::cout << "Message: " << response->message << std::endl;
}
구독자 생성
// Odometry 구독
auto odomSub = node.createSubscriber<raisin::nav_msgs::msg::Odometry>(
"/Odometry", connection,
[](const raisin::nav_msgs::msg::Odometry::SharedPtr& msg) {
std::cout << "Position: " << msg->pose.pose.position.x
<< ", " << msg->pose.pose.position.y << std::endl;
});
// PointCloud 구독
auto cloudSub = node.createSubscriber<raisin::sensor_msgs::msg::PointCloud2>(
"/cloud_registered", connection,
[](const raisin::sensor_msgs::msg::PointCloud2::SharedPtr& msg) {
std::cout << "Points: " << msg->width * msg->height << std::endl;
});
// RobotState 구독 (배터리, locomotion 상태, 액추에이터 등)
auto stateSub = node.createSubscriber<raisin::raisin_interfaces::msg::RobotState>(
"robot_state", connection,
[](const raisin::raisin_interfaces::msg::RobotState::SharedPtr& msg) {
std::cout << "Locomotion state: " << msg->state << std::endl;
std::cout << "Battery: " << msg->voltage << "V / " << msg->current << "A" << std::endl;
std::cout << "Joy source: " << msg->joy_listen_type << std::endl;
std::cout << "Actuators: " << msg->actuator_states.size() << std::endl;
});
Joy 제어 서비스 호출
// 수동 조이스틱 제어 활성화
auto enableRequest = std::make_shared<raisin::raisin_interfaces::srv::String::Request>();
enableRequest->data = "joy<&>my_client_id"; // "토픽명<&>클라이언트ID"
auto future = joyListenClient->asyncSendRequest(enableRequest);
if (future.wait_for(std::chrono::seconds(5)) == std::future_status::ready) {
auto response = future.get();
std::cout << "Enable joy: " << response->success << std::endl;
}
// 조이스틱 제어 비활성화 (잠금)
auto disableRequest = std::make_shared<raisin::raisin_interfaces::srv::String::Request>();
disableRequest->data = "joy<&><CLOSE>"; // "토픽명<&><CLOSE>"
auto future2 = joyListenClient->asyncSendRequest(disableRequest);
if (future2.wait_for(std::chrono::seconds(5)) == std::future_status::ready) {
auto response = future2.get();
std::cout << "Disable joy: " << response->success << std::endl;
}