🤝
이 가이드는 인류와 AI가 함께 만드는 지식입니다.
이 콘텐츠는 Human + AI Partnership 철학 아래 모든 사람이 로봇·AI를 배울 수 있도록 무료로 제공됩니다. 당신의 질문과 기여가 다음 학생의 미래를 바꿉니다.
ROS 2 서비스 로봇 가이드 2026
ROS 2로 자율 서비스 로봇 개발. 배송, 청소, 보안, 의료 지원, 멀티테스킹 플랫폼 구축.
1. 서비스 로봇 아키텍처
자율 서비스 시스템 설계:
- 자율 이동: SLAM, 경로 계획, 장애물 회피
- 작업 모듈: 청소(브러쉬/청소액), 배송(상자 운반), 보안(카메라/경보)
- 사용자 상호작용: 음성, 터치스크린, 제스처
- 멀티테스킹: 우선순위 기반 작업 스케줄링
- 24/7 운영: 자동 충전, 상태 모니터링
2. 자율 배송 로봇 (Delivery)
물품 배송 자동화:
class DeliveryRobotController : public rclcpp::Node {
public:
struct DeliveryTask {
std::string package_id;
std::string destination;
geometry_msgs::msg::Point location;
int priority; // 1(낮음) ~ 5(높음)
};
DeliveryRobotController() : Node("delivery_robot") {
// 배송 요청 구독
delivery_sub_ = create_subscription<std_msgs::msg::String>(
"delivery_requests", 10,
[this](const std_msgs::msg::String::SharedPtr msg) {
queue_delivery_task(*msg);
});
// 도어 개방 신호
door_pub_ = create_publisher<std_msgs::msg::Bool>(
"door_open_signal", 10);
// 주기적 작업 처리
task_timer_ = create_wall_timer(
std::chrono::seconds(1),
[this]() { process_next_task(); });
}
void execute_delivery_mission() {
// 1. 우선순위 큐에서 다음 작업 선택
auto task = select_next_delivery_task();
if (!task) return;
RCLCPP_INFO(get_logger(), "Delivering package %s to %s",
task->package_id.c_str(), task->destination.c_str());
// 2. 목적지로 자율 이동
navigate_to_destination(task->location);
// 3. 물품함 개방
open_delivery_compartment();
// 4. 사용자가 패키지 수거할 때까지 대기
wait_for_pickup_confirmation();
// 5. 다음 배송지로 이동
process_next_task();
}
private:
void open_delivery_compartment() {
std_msgs::msg::Bool open_signal;
open_signal.data = true;
door_pub_->publish(open_signal);
// 30초 열림 → 자동 폐쇄
std::this_thread::sleep_for(std::chrono::seconds(30));
open_signal.data = false;
door_pub_->publish(open_signal);
}
void wait_for_pickup_confirmation() {
// 사용자가 버튼을 눌러 확인할 때까지 대기
// 또는 30초 후 자동 진행
}
void navigate_to_destination(const geometry_msgs::msg::Point& loc) {
// SLAM + 경로 계획 → 자율 이동
}
std::optional<DeliveryTask> select_next_delivery_task() {
// 우선순위가 높은 작업부터 처리
if (delivery_queue_.empty()) return std::nullopt;
auto task = delivery_queue_.front();
delivery_queue_.pop();
return task;
}
std::queue<DeliveryTask> delivery_queue_;
rclcpp::Subscription<std_msgs::msg::String>::SharedPtr delivery_sub_;
rclcpp::Publisher<std_msgs::msg::Bool>::SharedPtr door_pub_;
rclcpp::TimerBase::SharedPtr task_timer_;
};3. 자율 청소 로봇 (Cleaning)
자동화된 청소 작업:
class CleaningRobotController : public rclcpp::Node {
public:
enum CleaningMode {
SPOT, // 특정 부위 집중 청소
AREA, // 넓은 영역 청소
PERIMETER, // 경계선 청소
AUTO // 자동 판단
};
void execute_cleaning_mission(CleaningMode mode) {
// 1. SLAM 지도에서 청소 영역 분석
auto cleaning_path = generate_cleaning_path(mode);
// 2. 청소액/물 충전 확인
if (!check_water_level()) {
RCLCPP_WARN(get_logger(), "Water level low - docking for refill");
return_to_dock();
return;
}
// 3. 청소 패턴 실행
for (const auto& segment : cleaning_path) {
move_along_path(segment);
// 4. 실시간 먼지/오염도 센서
double dirt_level = measure_dirt_level();
// 5. 필요시 상향식 청소
if (dirt_level > 0.7) {
increase_brush_speed();
apply_cleaning_solution();
}
RCLCPP_DEBUG(get_logger(), "Cleaned segment at dirt=%.1f%%",
dirt_level * 100);
}
// 6. 청소 완료 → 배수
empty_dirty_water_tank();
}
private:
std::vector<nav_msgs::msg::Path> generate_cleaning_path(
CleaningMode mode) {
// 지도 분석 → 효율적 청소 경로 생성
// 바이오닉 알고리즘: 미로 풀기 (Pledge algorithm)
std::vector<nav_msgs::msg::Path> paths;
// 경로 계산...
return paths;
}
bool check_water_level() {
// 물탱크 수위 센서
return true; // 충분하면 true
}
double measure_dirt_level() {
// 먼지 센서: 0.0 ~ 1.0 (0=깨끗, 1=매우 더러움)
return 0.5;
}
void increase_brush_speed() {
// 브러쉬 RPM 증가
}
void apply_cleaning_solution() {
// 청소액 분사
}
void empty_dirty_water_tank() {
// 배수 상태 확인 후 자동 배수
}
void return_to_dock() {
// 충전소로 자동 복귀
}
rclcpp::Publisher<std_msgs::msg::Float32>::SharedPtr brush_speed_pub_;
};4. 보안 순찰 로봇 (Security)
자율 보안 감시:
class SecurityPatrolRobot : public rclcpp::Node {
public:
void start_patrol_mission(const std::vector<std::string>& checkpoints) {
// 1. 정해진 순찰 경로 설정
patrol_path_ = checkpoints;
is_patrolling_ = true;
// 2. 주기적 순찰 (예: 야간 1시간마다)
patrol_timer_ = create_wall_timer(
std::chrono::hours(1),
[this]() { execute_patrol_cycle(); });
// 3. 비상 신호 감지
alarm_sub_ = create_subscription<std_msgs::msg::Bool>(
"security_alarm", 10,
[this](const std_msgs::msg::Bool::SharedPtr msg) {
if (msg->data) handle_security_alarm();
});
}
private:
void execute_patrol_cycle() {
for (const auto& checkpoint : patrol_path_) {
// 1. 체크포인트로 이동
navigate_to(checkpoint);
// 2. 카메라 스캔 + 열화상 촬영
capture_360_panorama();
capture_thermal_image();
// 3. 비정상 감지 (움직임, 열원)
if (detect_anomaly()) {
RCLCPP_WARN(get_logger(), "Anomaly detected at %s",
checkpoint.c_str());
report_to_security_center();
}
// 4. 로그 기록
log_checkpoint(checkpoint);
}
RCLCPP_INFO(get_logger(), "Patrol cycle completed");
}
void handle_security_alarm() {
// 비상: 즉시 경보 위치로 이동
RCLCPP_ERROR(get_logger(), "SECURITY ALARM - Moving to alarm location");
// 1. 경로 재계획 (현재 위치 → 경보 위치)
// 2. 고속 이동
// 3. 카메라 녹화 활성화
// 4. 경비팀에 실시간 영상 전송
}
bool detect_anomaly() {
// Vision + Motion detection
// 인간 침입자 감지
// 화재/열원 감지
return false;
}
void report_to_security_center() {
// 경비 센터에 알림 발송 (JSON)
// 위치, 타임스탬프, 증거(사진/영상)
}
void capture_360_panorama() {
// 360도 카메라로 전주시야 촬영
}
void capture_thermal_image() {
// 열화상 카메라
}
void navigate_to(const std::string& checkpoint) {
// 체크포인트로 자율 이동
}
void log_checkpoint(const std::string& checkpoint) {
// 순찰 기록 (DB)
}
std::vector<std::string> patrol_path_;
bool is_patrolling_ = false;
rclcpp::TimerBase::SharedPtr patrol_timer_;
rclcpp::Subscription<std_msgs::msg::Bool>::SharedPtr alarm_sub_;
};5. 인간-로봇 상호작용
사용자 친화적 인터페이스:
class UserInteractionManager : public rclcpp::Node {
public:
UserInteractionManager() : Node("user_interaction") {
// 음성 명령 구독
voice_sub_ = create_subscription<std_msgs::msg::String>(
"voice_commands", 10,
[this](const std_msgs::msg::String::SharedPtr msg) {
handle_voice_command(*msg);
});
// 터치스크린 입력
touch_sub_ = create_subscription<std_msgs::msg::String>(
"touch_input", 10,
[this](const std_msgs::msg::String::SharedPtr msg) {
handle_touch_input(*msg);
});
// TTS 출력
tts_pub_ = create_publisher<std_msgs::msg::String>(
"tts_output", 10);
}
private:
void handle_voice_command(const std_msgs::msg::String& cmd) {
// 음성 명령어 처리
// 예: "배송 로봇, 3층으로 가" → navigate_to_floor(3)
// 예: "청소 로봇, 강화 청소" → increase_cleaning_intensity()
if (cmd.data == "help") {
speak_response("도움말: 배송, 청소, 순찰 업무를 수행할 수 있습니다.");
} else if (cmd.data == "status") {
speak_response(get_robot_status());
}
}
void handle_touch_input(const std_msgs::msg::String& touch) {
// 터치스크린 메뉴
// 예: "배송 목적지" → 목적지 선택 화면
}
void speak_response(const std::string& text) {
std_msgs::msg::String tts_msg;
tts_msg.data = text;
tts_pub_->publish(tts_msg);
}
std::string get_robot_status() {
// 로봇 상태 요약 반환
return "배터리 85%, 청소 준비 완료, 배송 0건";
}
rclcpp::Subscription<std_msgs::msg::String>::SharedPtr voice_sub_;
rclcpp::Subscription<std_msgs::msg::String>::SharedPtr touch_sub_;
rclcpp::Publisher<std_msgs::msg::String>::SharedPtr tts_pub_;
};6. 실제 배포 체크리스트
- ✅ 자동 충전 도킹 테스트
- ✅ 24시간 연속 운영 시뮬레이션
- ✅ 긴급 정지 버튼 배치
- ✅ 사용자 교육 프로그램
- ✅ 유지보수 스케줄 수립
- ✅ 보험 가입
7. 산업 표준 & 규제
서비스 로봇 준수사항:
- ISO/IEC 18646 (서비스 로봇 안전)
- ISO/IEC 19989 (서비스 로봇 인터페이스)
- GDPR (개인정보 보호, 카메라)
핵심 정리
ROS 2 기반 서비스 로봇은 배송, 청소, 보안, 의료 지원 등 다양한 자동화 작업을 24/7 수행하며, 인간-로봇 협력 시대의 중추 역할을 합니다.