Skip to main content
🤝

이 가이드는 인류와 AI가 함께 만드는 지식입니다.

이 콘텐츠는 Human + AI Partnership 철학 아래 모든 사람이 로봇·AI를 배울 수 있도록 무료로 제공됩니다. 당신의 질문과 기여가 다음 학생의 미래를 바꿉니다.

ROS 2 서비스 로봇 가이드 2026

ROS 2로 자율 서비스 로봇 개발. 배송, 청소, 보안, 의료 지원, 멀티테스킹 플랫폼 구축.

1. 서비스 로봇 아키텍처

자율 서비스 시스템 설계:

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. 실제 배포 체크리스트

7. 산업 표준 & 규제

서비스 로봇 준수사항:

핵심 정리

ROS 2 기반 서비스 로봇은 배송, 청소, 보안, 의료 지원 등 다양한 자동화 작업을 24/7 수행하며, 인간-로봇 협력 시대의 중추 역할을 합니다.