실내 평지 자율주행 로봇 프로젝트 계획
ESP-32 C3, 라즈베리파이 제로 2W,RPlidar A1M8 자동차 새시 전륜조향 스트럿과 서보모터 세트 후륜 모터와 기어박스 배터리 등이 있다. 자율주행을 하기 위해 어떻게 프로젝트를 진행하는 게 좋을까? 아주 자세한 플랜을 짜고 소프트웨어, 하드웨어적으로 부족하거나 필요한 것은 무엇인지 알려주고 자세한 정보 생성해
자율주행 프로젝트를 위한 자세한 플랜을 수립하려면 다음 사항을 추가로 알려주세요:
- 목표 수준: 완전 자율주행(AI 기반 경로 생성 및 주행)인지, 특정 미션(라인 트레이싱, 장애물 회피)인지 등 목표 범위를 알려주세요.
- 환경 조건: 실내 주행인지, 실외 주행인지? 특정한 지형(예: 평지, 경사로, 장애물 포함 등)이 있는지?
- 센서 추가 여부: 현재 RPlidar A1M8 외에 추가적으로 사용하고 싶은 센서(예: 초음파, IMU, 카메라 등)가 있는지?
- 통신 방식: 원격 제어나 데이터 수집을 위한 Wi-Fi, 블루투스, LoRa 등의 필요 여부?
- 소프트웨어 개발 경험: ROS, Python, C++, TensorFlow 등 어떤 기술 스택을 선호하는지?
- 예산 및 추가 부품 구매 가능 여부: 추가적으로 필요한 모듈을 구매할 수 있는지?
이 정보를 기반으로 하드웨어 및 소프트웨어 설계, 필요한 부품 목록, 프로젝트 단계별 계획을 정리해드리겠습니다!
평지 실내에서 SLAM을 하고 추가센서는 카메라(라즈베리파이) 라즈베리파이는 5 버전에 AI HAT(hailo 8L)이 있는 모델도 있음.
좋아요! 자율주행 프로젝트를 위해 실내 평지에서 SLAM을 수행하며, 추가적으로 라즈베리파이 카메라와 AI HAT(Hailo-8L)을 활용하는 계획을 세우겠습니다.
이 연구에서는:
- 하드웨어 설계: ESP-32 C3, 라즈베리파이 제로 2W 및 5 버전, RPlidar A1M8, 전륜 조향(서보 모터), 후륜 구동(모터+기어박스), 배터리 구성
- 소프트웨어 개발: ROS 기반의 SLAM 알고리즘 활용, AI HAT을 활용한 이미지 기반 보조 기능, 주행 컨트롤 설계
- 부족한 요소 및 추가 추천 부품: 최적의 IMU, 추가적인 센서 필요 여부, 배터리 및 전력 관리 시스템
- 구현 단계별 계획: 하드웨어 조립, 기본 주행 기능 구현, SLAM 설정, AI 기반 탐색 및 최적화
이와 같은 사항을 포함하여 자세한 로드맵과 필요한 추가적인 하드웨어 및 소프트웨어 구성 요소를 정리하겠습니다. 곧 결과를 공유해드리겠습니다!
하드웨어 설계
구성 요소 및 역할 배치: Raspberry Pi 5는 이 로봇의 메인 컴퓨터로, ROS 기반 SLAM 알고리즘 실행과 AI HAT (Hailo-8L)을 활용한 영상 처리를 담당합니다. Raspberry Pi 5에는 Hailo-8L 가속 모듈이 HAT 형태로 장착되어, 이미지 객체 인식 같은 연산을 실시간으로 처리할 수 있습니다 (Raspberry Pi AI Kit - Object recognition | Hailo). Raspberry Pi Zero 2W는 보조 컴퓨터로 활용할 수 있는데, 필요에 따라 센서 데이터 전처리나 경량 노드 실행 등에 사용할 수 있습니다. ESP-32 C3 마이크로컨트롤러는 실시간 제어를 맡아, 모터 드라이버와 서보모터를 제어하고 IMU/엔코더 등의 센서 데이터를 읽어 Raspberry Pi와 교신합니다. RPLidar A1M8 라이다 센서는 360도 주변 환경 스캔을 통해 SLAM에 필요한 거리 데이터를 제공하며, 로봇 상단에 장애물 없이 장착하여 전방위 스캔이 가능하도록 배치합니다. 자동차 섀시의 전륜에는 조향용 서보모터와 스트럿(액슬)이 있어 주행 방향을 결정하고, 후륜에는 DC 기어드 모터가 장착되어 로봇을 구동합니다. 이 모터에는 주행 속도와 이동 거리를 측정할 수 있도록 엔코더를 추가 장착하는 것이 권장됩니다. 엔코더 기반 휠 오도메트리는 로봇의 이동 거리와 방향을 추정하여 SLAM 정밀도를 높이는 데 기여합니다 (ackermann_steering_controller - ROS Wiki). 각 구성품은 진동과 전자기 간섭을 최소화하도록 단단히 고정하고, 라이다와 카메라 시야를 가리지 않도록 배치합니다.
통신 방식: ESP-32 C3와 Raspberry Pi 간 데이터 교환은 유선 직렬(UART) 통신이나 SPI/I2C 등을 활용한 직접 연결 또는 Wi-Fi를 통한 무선 통신 중 선택 가능합니다. 지연과 신뢰성을 고려하면, UART 시리얼 연결을 통해 ROS 메세지를 주고받는 구성을 권장합니다. 특히 ROS 2 환경에서는 ESP-32에 micro-ROS 펌웨어를 올려 센서/모터 데이터를 ROS 토픽으로 발행하고 Raspberry Pi 5의 ROS 2 네트워크에 참여시키는 방식이 효과적입니다 ( Raspberry Pi 5 Expansion Board With ESP32 Chip Support Micro ROS Robot ). Yahboom의 Raspberry Pi 5용 마이크로ROS 보드 사례에서도 ESP32 co-프로세서가 Wi-Fi UDP 또는 직렬 통신으로 ROS 2 노드와 통신하여 모터/센서를 제어하는 구성을 사용하고 있습니다 ( Raspberry Pi 5 Expansion Board With ESP32 Chip Support Micro ROS Robot ). 따라서 ESP-32 C3도 micro-ROS를 통해 Wi-Fi 기반 무선 통신으로 Raspberry Pi 5와 연동하거나, 혹은 USB-UART로 직접 연결해 ROS 시리얼 브리지를 구축할 수 있습니다. Raspberry Pi Zero 2W를 활용한다면, Raspberry Pi 5와 Ethernet/Wi-Fi로 ROS 멀티머신 구성하여 보조 노드의 데이터를 주고받거나, ESP-32 C3와 Raspberry Pi 5 사이의 브릿지 역할을 수행하게 할 수도 있습니다. 다만 시스템 복잡성을 줄이기 위해 ESP-32 C3 ↔ Raspberry Pi 5 간 직접 통신으로도 충분하며, Zero 2W는 필요시 추가 센서 노드로 활용합니다.
전원 및 배터리 관리: 모든 시스템을 안정적으로 구동하기 위해 공용 배터리로 충분한 용량의 리튬 폴리머(또는 리튬 이온) 배터리를 사용합니다. 예를 들어 7.4V (2셀) LiPo 배터리 팩은 소형 로봇 자동차에 흔히 쓰이며, 모터 구동과 Raspberry Pi 전원을 모두 공급할 수 있습니다 (How to build a robot car with Raspberry Pi 5?). 해당 전압은 모터 구동에 직접 사용하거나, 서보모터의 권장 전압 범위(보통 5~7.4V)에 맞게 공급할 수 있습니다. Raspberry Pi 및 ESP-32, 라이다 등 전자장치는 5V (또는 3.3V)로 동작하므로, 배터리로부터 고효율 DC-DC 강하 레귤레이터를 통해 5.1V로 변환하여 공급합니다. Raspberry Pi 5는 최대 성능 시 전류 소모가 높으므로 5V 3~5A 이상의 안정된 출력이 필요합니다 ( Raspberry Pi 5 Expansion Board With ESP32 Chip Support Micro ROS Robot ). Hailo-8L AI HAT 역시 약 1.5W 정도의 전력을 소모하므로(13 TOPS 가속, 1.5W typical (Hailo-8L Entry-Level AI Accelerator Solutions - Hailo)), 이를 고려해 전원 예산을 계산해야 합니다. 모터 구동을 위한 전류(모터의 정지 시 과도 전류 등)와 라이다의 소비전류(약 100~300mA 수준 (RPLIDAR A1 - Waveshare Wiki) (SLAMTEC RPLiDAR A1M8 360° 12m | MYBOTSHOP.DE)) 도 합산하여 배터리 용량을 정합니다. 전원 분배는 모터/서보와 전자장치 회로를 가능하면 분리하거나 필터링하여 간섭을 줄입니다. 하나의 배터리를 쓸 경우 적절한 디커플링 캐패시터와 노이즈 필터, 그리고 모터 드라이버의 전원과 Raspberry Pi의 전원을 별도로 관리하여 모터 구동 시 발생하는 전압 강하나 잡음을 억제해야 합니다 (electronics - Strategies for managing power on electrical systems for mobile robots - Robotics Stack Exchange). 프로젝트 규모가 크다면 이중 전원도 고려할 수 있습니다. 예를 들어 모터는 고출력 배터리로, 제어회로는 별도의 배터리팩으로 분리하면 상호 간섭 없이 안정성을 높일 수 있습니다 (electronics - Strategies for managing power on electrical systems for mobile robots - Robotics Stack Exchange) (electronics - Strategies for managing power on electrical systems for mobile robots - Robotics Stack Exchange). 배터리 관리 측면에서는 저전압 차단 회로(Low-voltage cutoff)나 배터리 관리 시스템(BMS)을 도입하여 배터리를 과방전으로부터 보호하고, 안전한 충전이 가능하도록 설계합니다.
추가 센서 및 IMU: 2D 라이다만으로도 실내 SLAM이 가능하지만, 관성측정장치(IMU)를 추가하면 주행 중 로봇의 자세와 방향 변화 정보를 얻어 SLAM 정확도를 향상시킬 수 있습니다. 9축(IMU + 지자기) 센서는 롤, 피치, 요 각도를 추정해주므로, 라이다로 얻는 스캔과 함께 퓨전하면 보다 안정적인 위치 추정이 가능합니다 (GitHub - TixiaoShan/LIO-SAM: LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping). 실제로 고급 LiDAR SLAM 알고리즘인 LOAM/LIO-SAM 등은 9축 IMU 데이터를 활용해 라이다 스캔 왜곡을 보정하고 정확도를 높입니다 (GitHub - TixiaoShan/LIO-SAM: LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping). 따라서 MPU-9250/6500, ICM-20948 또는 Bosch BNO055처럼 9축 IMU 모듈을 장착해 퓨전 센서 방식(예: EKF를 통한 라이다+IMU 융합)을 적용하는 것을 권장합니다. 또한 전륜 조향의 각도를 정확히 알기 위해 서보모터의 명령 각도 이외에 실제 조향각 피드백을 받으면 보다 정확한 주행 제어 및 오도메트리 산출이 가능합니다. 그러나 일반 RC서보는 내부적으로 위치 제어가 되므로 별도 각도 피드백이 없어도 일정 정확도 내에서는 동작합니다. 초음파 센서나 적외선 거리센서는 라이다가 있기 때문에 필수는 아니지만, 보조적으로 매우 근거리의 장애물 감지나 낭떠러지 감지(테이블 위 주행 등)를 원한다면 추가할 수 있습니다. 무게와 전력 예산을 고려하여 필요한 최소한의 센서로 구성하되, 휠 엔코더와 IMU는 추가하는 것이 자율주행 정밀도 향상에 크게 도움이 될 것입니다.
소프트웨어 개발
ROS 기반 SLAM 구현: ROS 환경에서 SLAM을 구현하기 위해 Lidar 전용 2D SLAM 알고리즘을 활용합니다. 후보 알고리즘으로 GMapping, Hector SLAM, Cartographer, RTAB-Map, LOAM 등이 있습니다. RPLidar A1M8은 2D 평면 라이다이므로, GMapping이나 Hector SLAM과 같이 2D SLAM에 특화된 패키지가 적합합니다. GMapping은 입자 필터 기반의 고전적 2D SLAM으로, 구성과 사용이 비교적 쉬워 초기에 맵을 구축하기에 좋습니다 (RTABMAP vs Gmapping - ROS Answers archive). Hector SLAM은 높은 라이다 주사 빈도를 이용해 오도메트리가 없는 경우에도 빠른 스캔매칭으로 위치추정을 할 수 있는 알고리즘으로, 로봇이 천천히 움직이는 실내 환경에서는 양호한 성능을 보입니다. 두 알고리즘 모두 실시간으로 지도(Occupancy Grid)를 작성할 수 있으며, ROS 패키지로 구현되어 있습니다. 작은 실내 환경에서는 두 방법이 유사한 정확도의 지도를 생성하며, GMapping은 기본 매개변수로도 바로 사용하기 쉬워 초반 실험에 적합합니다 (RTABMAP vs Gmapping - ROS Answers archive). 이후 지도를 다듬거나 큰 영역에서 정밀도를 높이려면 Graph-SLAM 기반의 RTAB-Map도 고려해볼 수 있습니다. RTAB-Map은 Loop Closure Detection(폐회로 인식)을 통해 맵의 왜곡을 줄여주며, 2D 라이다 데이터와 휠 오도메트리를 함께 사용하면 GMapping과 유사한 지도를 얻을 수 있습니다 (RTABMAP vs Gmapping - ROS Answers archive). 또한 RTAB-Map은 카메라 영상까지 활용한 비주얼 SLAM 확장이 가능하므로, 추후 라이다와 카메라를 함께 쓰는 SLAM(예: RGB-D SLAM)으로 발전시킬 수 있습니다. LOAM(Lidar Odometry and Mapping)은 라이다와 IMU를 융합한 3D SLAM 알고리즘으로, 원론적으로는 3D 스캐너용이지만 2D 라이다를 로봇에 이동시키며 3D 지도를 생성하는 실험적 활용도 있습니다 (daobilige-su/loam_continuous: loam SLAM with continuous ... - GitHub). 그러나 우리의 경우 평면 주행이므로 LOAM보다는 2D SLAM에 집중하고, IMU 데이터를 결합해 LIO-SAM과 같은 라이다-관성 SLAM으로 확장하는 것도 고려 가능합니다. 초기 단계에서는 GMapping으로 맵핑을 시도하고, 이후 필요에 따라 Cartographer (구글의 Graph SLAM, 실시간 루프클로저 지원)나 RTAB-Map으로 전환하면서 성능을 비교 평가합니다.
모든 SLAM 알고리즘은 ROS에서 라이다 LaserScan 토픽과 오도메트리(odom) 또는 IMU 데이터를 입력으로 사용하므로, 해당 토픽들이 정확하게 퍼블리시되도록 소프트웨어 노드를 개발합니다. 특히 tf 변환 계층 (기본 좌표계 설정: base_link, laser, odom, map 프레임 등)을 정확히 수립해야 SLAM 패키지가 올바르게 동작합니다.
AI HAT (Hailo-8L) 활용: Raspberry Pi 5에 연결된 Hailo-8L AI 가속 모듈은 실시간 객체 인식과 같은 딥러닝 작업을 CPU 부하 없이 처리할 수 있게 해줍니다 (Raspberry Pi AI Kit - Object recognition | Hailo). 예를 들어 로봇 전방에 설치된 카메라로부터 영상을 입력받아 보행자나 장애물 객체 인식을 수행하고, 그 결과를 자율주행 의사결정에 활용할 수 있습니다. Hailo-8L은 13TOPS 성능의 엣지 AI 가속기이며, YOLOv7/YOLOv8 등의 모델을 Hailo 전용으로 최적화하여 사용할 수 있습니다 (Object Detection in Images using Hailo AI Kit for Raspberry Pi - Guides - Hailo Community). 실제 Hailo 제공 예제에서는 YOLOv7 모델을 활용한 객체 탐지 데모가 있으며, Raspberry Pi 5 + Hailo-8L 조합으로 영상을 실시간 분석해 사람, 사물 등을 인식하고 바운딩 박스로 표시할 수 있음을 보여줍니다 (Object Detection in Images using Hailo AI Kit for Raspberry Pi - Guides - Hailo Community). 우리 프로젝트에서는 Hailo-8L을 활용해 실내 환경의 동적 장애물 인식 또는 특정 객체(예: 사람, 책상 등) 검출을 수행할 수 있습니다. 이를 통해 SLAM으로 생성된 지도를 의미론적 지도로 발전시킬 수 있고, 경로 계획 시 단순한 장애물 회피를 넘어서 사람을 피하거나 특정 목표물을 식별하는 등의 지능형 내비게이션이 가능합니다. 또한 Hailo-8L을 이용하면 Raspberry Pi 카메라 영상에 대한 신경망 기반 특징 추출이나 분할(segmentation)도 실시간으로 처리할 수 있으므로, 로봇이 단순 지도뿐 아니라 주변 환경의 의미를 이해하도록 만들 수 있습니다. 소프트웨어적으로는 Hailo-8L의 SDK와 ROS 노드를 연계하여, 카메라 토픽으로부터 이미지를 받아 추론을 수행하고 그 결과(예: 탐지된 객체의 좌표)를 ROS 토픽으로 퍼블리시합니다.
모터 및 서보 제어 알고리즘: 로봇의 주행 제어를 위해 Ackermann 조향에 맞는 제어 알고리즘을 구현합니다. 전륜 조향각과 후륜 속도를 적절히 제어하여 주어진 경로를 따라가야 하므로, PID 제어와 경로 추종 알고리즘을 조합합니다. 구체적으로, 후륜 구동모터의 속도 제어에는 모터 드라이버 (예: H-브리지 또는 ESC)에 PWM 신호를 입력하여 속도를 조절하고, 이때 모터 엔코더 피드백을 이용해 PID 속도 제어를 수행합니다. 목표 선속도와 실제 속도 간 오차를 PID 컨트롤러로 보정하여 일정한 속도를 유지하거나 감속/정지 시 신속히 목표에 도달하도록 합니다. 전륜 조향 서보모터의 경우 목표 조향각에 해당하는 PWM 제어신호를 출력하면 서보 내부 제어기로 각도를 맞추지만, 조향각에 대한 피드백 PID를 추가로 적용하면 과도한 움직임을 방지하고 안정적으로 목표각을 유지할 수 있습니다.
주행 경로 최적화 측면에서는 Pure Pursuit 또는 Stanley 방법과 같은 경로 추종 알고리즘을 적용하여 로봇이 경로상의 곡선을 부드럽게 따르도록 합니다. 상위 계층의 경로 계획은 ROS의 Nav2 (Navigation stack)이나 teb_local_planner 등을 이용해 목표점까지의 속도-조향 명령(geometry_msgs/Twist 혹은 Ackermann Drive 메시지)을 생성하고, 하위 계층에서 이를 모터 속도와 조향각으로 변환합니다. ROS 제어를 활용한다면 ackermann_steering_controller 패키지를 사용해 Twist 메시지를 후륜(속도)과 전륜(조향) 제어로 분할할 수 있습니다 (ackermann_steering_controller - ROS Wiki). 이 컨트롤러를 이용하면 하드웨어로부터 속도/조향 피드백(엔코더 속도, 서보 각도)을 받아 오도메트리를 자동 계산하고 퍼블리시할 수도 있습니다 (ackermann_steering_controller - ROS Wiki). 직접 제어 구현 시에는 ESP-32 C3 상에서 주기적으로 엔코더를 읽고 PID 제어를 수행하여 모터 출력(PWM 듀티비)을 조절하고, 서보 목표각과 현재각(있다면)을 비교하여 오차를 줄이는 방향으로 서보 명령을 보정하는 루프를 돌립니다. 이러한 실시간 제어 루프는 50~100Hz 이상의 주기로 실행하여 로봇 제어에 빠른 응답성을 확보합니다. 또한 안전을 위해 일정 시간 명령이 없으면 모터 출력을 정지시키거나, 소프트웨어적으로 정지 명령(이머전시 브레이크)을 수신하면 즉시 동작을 중단하도록 설계합니다.
경로 최적화는 전역 경로 계획(예: A* 또는 RRT 알고리즘으로 경유지점 생성) 후, 로컬 플래너에서 Ackermann 차량의 최소회전반경 등을 고려한 곡선을 생성하게 합니다. 이때 Teb Local Planner와 같이 Ackermann 모델을 지원하는 ROS 로컬 플래너를 사용하면 시간최적 경로를 생성하고 차량 기구학에 맞는 속도/조향 명령을 출력해줍니다. 종합적으로, 저수준에서는 PID 기반 속도/각도 제어, 고수준에서는 ROS Nav 스택 기반 경로계획 및 추종을 구현하여 자율주행을 실현합니다.
실시간 데이터 처리 및 영상 처리: Raspberry Pi 5는 멀티코어 CPU와 Hailo-8L 가속기가 있으므로 라이다, IMU, 카메라 등 멀티 센서 데이터 처리를 실시간으로 수행할 수 있습니다. ROS 2 기반으로 각 센서 데이터는 콜백 함수나 멀티스레드 실행으로 병렬 처리되며, 메시지 동기화가 필요한 경우에는 message_filters 등을 사용해 타이밍을 맞춥니다. 라이다로부터 들어오는 LaserScan 데이터는 SLAM 노드에서 소비하고, 동시에 모터/오도메트리 정보는 Nav 스택에서 처리하는 식으로 여러 노드가 동작합니다.
Raspberry Pi 카메라 모듈은 ROS의 이미지 토픽(sensor_msgs/Image)으로 퍼블리시하고, 이를 구독하는 AI 노드가 Hailo-8L을 통해 추론을 실행합니다. 예를 들어 /camera/image_raw 토픽을 받아 객체 검출 노드에서 Hailo SDK를 호출→결과로 bounding box와 레이블 정보 토픽(/detections)을 퍼블리시→필요시 이를 지도상의 장애물로 변환하거나 UI 표시 등의 처리를 합니다. 영상 데이터는 대역폭이 크므로, 필요에 따라 해상도나 프레임레이트를 조절해 SLAM에 지장이 없도록 합니다. 영상 기반 위치인식도 고려할 수 있는데, 예를 들어 AprilTag 등의 마커를 실내에 부착하고 카메라로 읽어 정밀한 절대 위치보정을 할 수 있습니다. 이러한 처리도 Hailo-8L의 여유 성능으로 실행 가능하며, CNN 기반 마커 검출 또한 실시간화할 수 있습니다. 모든 소프트웨어는 ROS에서 노드 간 메시지 통신으로 이루어지므로, 장애가 발생해도 다른 모듈에 영향이 최소화되며 각 기능을 독립적으로 개발 및 테스트할 수 있습니다. 최적의 성능을 위해서는 스레드 우선순위 조정이나 리소스 할당을 통해 중요한 제어/SLAM 루프가 일정 주기로 실행되도록 조율합니다. 예를 들어 모터 제어 노드는 RT-Preempt 커널이나 micro-ROS RTOS 상에서 실행해 제어 주기의 정확성을 높이고, SLAM과 AI노드는 약간의 지연이 있어도 크게 문제가 없도록 QoS나 scheduling을 조정합니다.
부족한 요소 및 추가 추천 부품
IMU (관성측정장치): 현재 구성만으로도 동작 가능하지만, 앞서 언급한 대로 9축 IMU의 추가를 강력히 권장합니다. 9축 IMU는 3축 자이로+3축 가속도+3축 지자계로 구성되어 로봇의 자세 (roll, pitch)뿐 아니라 절대 방위각(yaw) 추정까지 도움을 줍니다. 특히 Lidar SLAM에서 움직임 추정에 IMU가 추가되면, 라이다 스캔 사이의 로봇 자세 변화를 추정하여 스캔 왜곡 보정이나 초기 위치 추정에 유리합니다 (GitHub - TixiaoShan/LIO-SAM: LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping). 예를 들어 LOAM 계열 알고리즘은 9축 IMU 없이는 동작이 어렵고, LIO-SAM은 9축 IMU로 롤/피치를 초기화하고 요각 추정을 보조합니다 (GitHub - TixiaoShan/LIO-SAM: LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping). 우리 로봇이 2D 평면을 주행하더라도 가속/감속 시 기울어짐이나 미끄럼 등이 발생할 수 있어 IMU로 이를 감지하면 SLAM의 신뢰성을 높일 수 있습니다. 추천 센서로는 MPU-9250/MPU-6500 (사용 편의성 좋음), ICM-20948 (9축, 소형), BNO055 (온보드 Fusion 칩으로 직접 Euler각을 출력) 등이 있습니다. IMU 데이터를 ROS의 /imu/data 등의 토픽으로 퍼블리시하고, 로봇 상태 추정에는 robot_localization 패키지의 EKF를 활용해 휠 오도메트리 + IMU + (가능하면 비전)을 융합하면 더욱 정확한 위치 추정과 맵 정합이 가능합니다.
추가 배터리/전력 관리: 하나의 배터리로 구동 가능하나, 모터와 로직 회로의 전원 분리가 충분히 이루어지지 않으면 전압 강하나 노이즈로 인한 시스템 재부팅 등의 문제가 생길 수 있습니다. 이 때문에 일부 로봇 프로젝트에서는 모터용과 컴퓨팅용 배터리를 분리하기도 합니다 (electronics - Strategies for managing power on electrical systems for mobile robots - Robotics Stack Exchange) (electronics - Strategies for managing power on electrical systems for mobile robots - Robotics Stack Exchange). 우리 프로젝트에서도 만약 모터 구동 시 라즈베리파이 전원이 불안정해지는 경우, 배터리 팩을 분리하거나 전력 분배기(PDB) 및 강압 모듈을 증설하여 안정화를 도모해야 합니다. 예를 들어 7.4V 2000mAh 배터리 2개를 병렬/직렬이 아닌 각각 하나는 5V 레귤레이터를 통해 Raspberry Pi와 센서들에만 공급하고, 다른 하나는 모터 드라이버에만 공급하는 식입니다. 또는 단일 배터리를 쓰되, 모터 드라이버 쪽에 대용량 커패시터와 인덕터 등을 사용해 순간 전류 변동을 완충하고, 스위칭 레귤레이터를 통해 5V를 안정적으로 유지하는 회로를 설계합니다. 배터리 용량은 사용 시간에 따라 늘릴 수 있는데, 사용 목표 시간(예: 1시간 연속 주행)에 모터, 컴퓨팅의 평균 소비전류를 합산하여 산정합니다. 만약 5V 보조 배터리(보조 배터리 팩)를 사용할 계획이 있다면, 라즈베리파이용으로 USB 파워뱅크를 사용하고 모터는 별도 배터리로 하는 방법도 있습니다. 추가적으로 배터리 전압 모니터링 회로를 달아 ROS 노드로 현재 전압을 모니터링하고, 임계치 이하로 떨어지면 안전정지하거나 사용자에게 알리는 시스템을 구현하는 것이 좋습니다.
모터 드라이버: 구성 목록에 명시되지 않았지만, DC 모터를 Raspberry Pi/ESP32로 직접 제어할 수는 없으므로 모터 드라이버 또는 ESC가 필요합니다. 일반 DC 브러시 모터라면 듀얼 H-브리지 모터드라이버(L298N, MC33926, VNH5019 등) 중 모터 전류에 맞는 것을 선택하여 사용합니다. 모터 드라이버는 ESP-32 C3의 PWM 출력과 방향 제어 신호를 받아 모터에 전력을 공급하게 되며, 필요시 현재 전류 피드백 기능이 있는 드라이버를 쓰면 과부하 탐지에 활용할 수 있습니다. 서보모터의 경우 별도 드라이버 없이 ESP32의 GPIO PWM으로 제어 가능하나, 서보가 고전류를 소모할 경우 (특히 조향에 힘이 많이 드는 경우) 서보 전원공급을 배터리 직결+BEC로 하고 신호선만 ESP32에 연결하는 것이 바람직합니다. 요약하면, 안정적인 구동을 위해 스펙에 맞는 모터 드라이버와 서보 구동 회로를 준비해야 하며, 이는 하드웨어 조립 단계에서 함께 고려되어야 합니다.
무선 통신 모듈: 원격에서 로봇을 모니터링하거나 제어하기 위해 무선 통신이 필요하다면, Raspberry Pi 5의 내장 Wi-Fi/Bluetooth를 우선 활용할 수 있습니다. Raspberry Pi 5는 듀얼밴드 802.11ac Wi-Fi와 Bluetooth 5.0 모듈을 내장하고 있어 별도 무선 모듈 없이도 원격 PC와 TCP/IP 통신(예: ROS teleop, SSH, VNC 등)이 가능합니다 (Raspberry Pi 5 - 8GB - Single Board Computer (SBC)). 개발 및 디버깅 단계에서는 이 Wi-Fi를 통해 ROS 토픽을 PC에서 시각화(rviz 등)하거나, teleoperation 노드를 통해 키보드로 로봇을 조종할 수 있습니다. Bluetooth는 조이스틱이나 휴대폰과 연결해 원격 제어용으로 사용할 수 있습니다. LoRa와 같은 장거리 무선 모듈은 실내 평지 환경에서는 필요성이 낮으며, Wi-Fi 신호가 미치지 않는 넓은 야외에서나 고려하면 됩니다. 다만 건물 내부에서 Wi-Fi 음영지역을 커버하거나 여러 층에 걸친 통신을 해야 한다면 별도의 Mesh 네트워크 구성이 필요할 수도 있지만, 일반적인 실내 환경에서는 Raspberry Pi 내장 Wi-Fi로 충분합니다. ESP-32 C3 자체도 Wi-Fi와 BLE 통신 기능이 있으므로, 향후 Raspberry Pi 없이 ESP32 단독으로 동작하는 모드나, 혹은 ESP32를 통한 원격 센서 데이터 브로드캐스트 등을 구현할 수도 있습니다. 종합적으로 현재 구성에서 추가적인 무선 통신 모듈은 필수는 아니며, Raspberry Pi의 네트워킹 기능을 최대한 활용하고, 필요시 ESP32의 무선 기능이나 USB 동글(예: 지향성 Wi-Fi 동글, 5G/4G 모뎀 등)을 추가하면 될 것입니다.
프로젝트 단계별 로드맵
- 하드웨어 조립 및 배선 작업: 먼저 모든 부품을 섀시에 장착하고 연결합니다. Raspberry Pi 5와 Pi Zero 2W, ESP-32 C3, 모터 드라이버, 라이다, 카메라, IMU 등을 물리적으로 고정하고 배선을 정리합니다. 배터리를 장착하고, 5V 레귤레이터를 통해 Raspberry Pi와 ESP32에 전원을 공급하며, 모터 드라이버에는 배터리 전원을 직결합니다. 각 장치의 공통 접지를 연결하여 신호 기준을 맞추고, 전원 극성 및 전압을 멀티미터로 확인합니다. USB, UART 케이블 등 Raspberry Pi와 ESP32 간 통신선도 연결합니다. 조립 후에는 라이다가 자유롭게 회전하는지, 카메라 시야에 가리움이 없는지 확인하고, 바퀴와 서보의 작동에 기계적 간섭이 없는지 점검합니다. 마지막으로 배터리를 연결하여 각 부품에 전원이 제대로 공급되는지(라즈베리파이 부팅, ESP32 동작, 라이다 스핀 등) 테스트합니다.
- 기본 주행 기능 구현 (후륜 구동 및 전륜 조향 테스트): ESP-32 C3에 간단한 모터/서보 제어 펌웨어를 작성하여 원격 명령으로 로봇을 움직여봅니다. 예를 들어 시리얼 터미널이나 임시 스크립트를 통해 “앞으로/뒤로/좌회전/우회전” 명령을 보내면 ESP32가 이를 해석하여 모터 드라이버와 서보에 신호를 출력하도록 합니다. 후륜 모터의 회전 방향과 속도가 명령대로 동작하는지 확인하고, 전륜 조향 각도가 올바른 방향으로 회전하는지 (예: 좌회전 명령 시 좌측으로 조향) 확인합니다. 이 단계에서는 PID 제어 없이도 일단 수동 조작이 되는지 보는 것이 목표이므로, 모터에 일정 듀티의 PWM을 주어 천천히 전진/후진시키고, 서보에 일정 각도를 줘서 좌우로 방향 전환해봅니다. 협소한 실내에서 테스트하므로 낮은 속도로 실시하고, 장애물이 없는 공간에서 진행합니다. 만약 이 단계에서 직진 시 한 쪽으로 치우치거나 조향각이 부족/과하면, 기구적으로 조향 트림을 조정하거나 소프트웨어적으로 보정합니다. 또한 엔코더 값 출력을 콘솔로 프린트하여 바퀴 속도가 대략적으로라도 측정되는지 확인합니다. 기본 주행 테스트가 통과되면, ROS 노드와 연동하기 위해 ESP32의 코드를 ROS 시리얼 노드나 micro-ROS 클라이언트로 발전시킬 준비를 합니다.
- RPLidar A1M8 설정 및 SLAM 초기 테스트: 라즈베리파이에 Ubuntu와 ROS를 설치한 후, RPLidar A1M8를 인식시키고 라이다 토픽을 확인합니다. Slamtec에서 제공하는 RPLidar ROS 드라이버 패키지를 사용해 /scan 토픽이 퍼블리시되는지 확인하고, rviz에서 레이저 스캔이 제대로 보이는지 검증합니다. 라이다의 회전 주파수와 토픽 퍼블리시 레이트를 체크하여 (보통 5~10Hz) SLAM에 충분한지 평가합니다. 이후 ROS의 GMapping 패키지를 이용해 초기 SLAM 테스트를 진행합니다. 이를 위해 우선 휠 오도메트리 없이 Hector SLAM을 시도해볼 수 있습니다. 로봇을 수동으로 천천히 밀거나 teleop 노드로 주행시키면서, Hector SLAM 노드를 실행해 실시간으로 지도가 형성되는지 봅니다. 또는 GMapping을 쓰는 경우 /odom 메시지가 필요하므로, 임시로 odom을 라이다 스캔 기반 추정(Hector SLAM 결과)이나 엔코더 적분 값으로 퍼블리시하여 GMapping을 동작시킵니다. 작은 방 안에서 장애물 (의자, 상자 등) 배치를 바꿔가며 라이다가 이를 잘 포착하는지도 테스트합니다. 이 단계의 목표는 라이다를 통해 환경의 지도를 작성할 수 있음을 확인하는 것으로, 생성된 지도는 rviz를 통해 시각화하거나 맵 파일로 저장해봅니다.
- ROS 기반 SLAM 세팅 및 최적화: 기본 SLAM이 동작하는 것을 확인한 후, 보다 정교한 SLAM 구성을 구축합니다. 우선 로봇의 URDF(Unified Robot Description Format)를 작성하여 로봇의 좌표 변환(tree)을 ROS에 등록합니다. 여기에는 base_link (로봇 본체 중심), laser (라이다 센서 위치), camera_optical_frame, imu_link, wheel_link 등 프레임과 이들의 변환 관계를 정의합니다. 그런 다음 robot_localization 패키지의 EKF 노드를 이용해 엔코더 오도메트리 + IMU 융합으로 /odom 토픽을 생성하고, 이를 SLAM 노드에 입력합니다. 이렇게 하면 SLAM 알고리즘이 보다 안정적인 자기 추종 정보를 활용할 수 있어 지도 품질이 향상됩니다.
- SLAM 알고리즘은 초기에는 GMapping으로 시작하였지만, 실제 주행에서 Loop Closure(자기장소 재인식)가 필요하면 RTAB-Map 또는 Cartographer로 전환합니다. RTAB-Map은 라이다만으로도 그래프 기반 SLAM을 수행할 수 있고, 카메라 이미지까지 활용하면 훨씬 풍부한 3차원 맵을 만들 수 있습니다. Cartographer는 2D 라이다 SLAM에 매우 좋은 결과를 보이는 구글의 알고리즘으로, 실시간 루프클로저와 IMU융합을 지원하므로 실내에서 정확한 지도를 얻는 데 도움이 됩니다. 각 SLAM 노드의 파라미터 (예: 맵 해상도, 최소입력, 최대 범위 등)를 조정하여 성능 최적화를 진행합니다. 예를 들어 GMapping의 입자 개수나 Cartographer의 voxel filter 설정 등을 조절해 처리 속도와 정확도 균형을 맞춥니다. 다양한 환경에서 로봇을 주행시키며 SLAM의 신뢰도를 평가하고, 문제점이 있으면 IMU 가중치 조정, 엔코더 변수 튜닝, 혹은 SLAM 알고리즘 자체 변경 등을 통해 개선합니다.
- AI HAT을 활용한 이미지 기반 탐색 추가: 안정적인 SLAM이 구현되면, 카메라와 Hailo-8L AI 가속기를 통합하여 고급 센싱 기능을 추가합니다. 먼저 ROS 환경에 카메라 노드(drivers)를 설치하고, 카메라 캘리브레이션을 수행한 후 영상 스트림을 획득합니다. 그 다음 Hailo-8L용 SDK를 사용하여 사전 학습된 객체 인식 딥러닝 모델을 로드합니다. 예를 들어 COCO 데이터셋으로 학습된 YOLOv8 모델을 Hailo-8L에 최적화하여 로딩하고, 이를 이용해 사람, 물체, 장애물을 탐지합니다 (Object Detection in Images using Hailo AI Kit for Raspberry Pi - Guides - Hailo Community). AI 노드는 지속적으로 카메라 영상을 처리하여 만약 사람을 인식하면 해당 좌표를 ROS 토픽으로 발행하고, 이를 상위 의사결정 노드에서 구독하여 동적 장애물 회피에 활용합니다. SLAM 맵에는 나타나지 않는 움직이는 대상에 대해, 전방 일정 거리 이내에 장애물이 포착되면 로봇을 일시정지하거나 경로를 재계산하는 로직을 추가할 수 있습니다. 또한 특정 QR 코드나 마커를 인식하게 하여 지정된 위치에서 특별 동작을 수행하도록 할 수도 있습니다. 모델 추론으로 인한 시스템 부하가 SLAM이나 제어에 영향을 주지 않도록 CPU 코어 Affinity 설정이나 QoS를 조정해 각 기능의 자원을 분배합니다.
- 실내 환경에서 테스트 및 성능 튜닝: 이제 로봇을 실제 실내 환경에서 자율주행 모드로 종합 테스트합니다. 가구가 놓인 방이나 복도를 주행하면서, 구축된 SLAM+Nav 스택과 AI 인지 모듈이 제대로 동작하는지 관찰합니다. 로봇에게 목표 위치를 주고 Nav2 혹은 move_base로 경로를 계획하고 따라가도록 합니다. 이때 라이다로 장애물을 감지해 경로를 재계획하는지, 조향을 부드럽게 수행하는지 확인합니다. 회전 반경 제한 때문에 경로 추종에 어려움이 있으면 로컬 플래너의 파라미터(전륜 코너링 속도, 최소 회전반경 등)를 조정합니다. 배터리 전압이나 온도 모니터링도 병행하여 과열이나 전압 강하가 없는지 살핍니다. 다양한 시나리오(사람 회피, 협소한 복도 통과 등)를 시험하며 성능 튜닝을 진행합니다. SLAM 위치 오차가 누적된다면 IMU 보정이나 폐회로 인식 알고리즘으로 해결하며, 주행시 흔들림이 크다면 PID 게인을 조정하여 조향 응답을 개선합니다.
- 최종 테스트 및 결과 분석: 마지막으로 전체 시스템의 신뢰성을 확인하기 위해 시나리오별 최종 테스트를 진행합니다. 여러 번 반복 주행해도 지도가 일관되게 생성되는지, 경로 이탈이나 계획 실패가 없었는지 확인합니다. 완성된 SLAM 맵을 실제 평면도와 비교하며 정밀도를 측정하고, AI 모듈이 사람이나 물체를 잘 인식하는지 평가합니다. ROS bag으로 기록된 센서 데이터를 오프라인에서 분석해 CPU/메모리 사용량, 통신 지연, 센서 노이즈 등을 점검합니다. 이 과정을 통해 목표였던 실내 평지 환경 자율주행을 안정적으로 달성할 수 있는지 최종 검증하고, 개선 사항과 추가 확장 계획을 문서화함으로써 프로젝트를 마무리합니다.
이상의 계획을 체계적으로 실행함으로써, 하드웨어 선정부터 단계적 소프트웨어 개발, 통합 시험까지 아우르는 종합 로드맵이 마련되었습니다. 추가 부품(예: IMU, 모터드라이버)과 보완 요소를 조율하여 안정성을 높이고, 각 단계를 검증하면서 진행하면 성공적인 실내 자율주행 로봇을 구현할 수 있을 것입니다.


'Tech > Physical Computing' 카테고리의 다른 글
YDLIDAR X4PRO 뷰어로 보는 법 (0) | 2025.02.26 |
---|---|
RISC(축소 명령어 집합 컴퓨터) (0) | 2025.02.22 |
RPI5 SD card 부팅 상태에서 NVMe로 이미지 복사해서 전환하기 (0) | 2025.02.16 |
RPI5 클러스터 근황과 공유하고 싶은 해결 과정 정리 (0) | 2025.02.16 |
RPI5 8G ubuntu 24.04 LTS Desktop install ISSUE -우분투 설치 오류 및 해결 방법 정리 (0) | 2025.02.08 |