← Back to list

SLAM 공부용 로봇 만들기

나의 두 번째 로봇

김영욱 · 2025-07-28 11:31 · 0 claps · 4.3 min read
#aml #robots #ukf
Open on Medium ↗

SLAM 공부용 로봇 만들기

나의 두 번째 로봇

이전 프로젝트에서 사용했던 로봇을 그대로 이용해서 slam을 학습 중이었습니다. 그러던 중 로봇의 크기가 너무 커 제어의 오차가 심해 slam의 정확도가 떨어지는 것 같다는 가정을 해봤습니다.

이전 로봇은 약 10kg에 12V DC 모터 두 개를 사용했었습니다. 최대 전압을 줘야 겨우 직진이 가능해서 주행에 필요한 부품을 제외하고는 다 제거했습니다. 그래도 4~5kg 정도의 304020(WLH, cm) 크기여서 주행할 때 바퀴 밀림 현상이 자주 발생하고 회전 또한 불안정했습니다(회전 후 바퀴가 안쪽으로 휨).

나의 첫 로봇의 마지막 모습

나의 첫 로봇의 마지막 모습

그래서 로봇을 한번 작게 재조립해 보았습니다. 이전 로봇의 부품은 그대로 사용하고 프레임만 바꿔줬습니다.

새로운 로봇의 조립 전 모습

새로운 로봇의 조립 전 모습

그리고 로봇을 다시 재조립했는데 크기를 비교해 보면

두 로봇의 크기 비교

두 로봇의 크기 비교

거의 두 배 작아진 것처럼 보입니다. 두 번째 로봇의 사이즈는 대략 20209(WLH, cm)입니다.

새로운 로봇의 이슈

로봇 개발 환경을 조금 바꾸는 중입니다. 장비들을 제 개인용 장비로 교체하려고 하는 과정에서 발생했던 이슈들입니다(아래 SLAM Test와는 별개).

  • To be: Ubuntu 22.04, RaspberryPi4 2GB
  • As Is: Macos + UTM(Ubuntu 24.04), RaspberryPi5 8GB

vm과 ↔ rasp Ros2 pub,sub 안됨

총 3가지 이유가 있었는데

  1. vm 네트워크 설정이 shared 였음 -> bridge로 변경
  2. ROS_DOMAIN_ID 설정 안 함-> 다 0으로 환경 변수 설정
  3. wifi에서 멀티캐스트를 막고 있음(추측, 확인 불가) -> FastDDS에서 CycloneDDS로 변경

3번은 macos와 pi 둘끼리도 전달이 안 되는 상황이어서 그렇게 추측 중입니다.

serial 통신이 자꾸 끊김

시리얼 통신이 끊기는 것보다 ros 환경에서 시리얼이 불안정하다고 표현하는 게 더 맞을 것 같습니다. minicom 사용했을 때는 잘 넘어오다가 ros에서 한두 번 읽어 오면 그 뒤로 응답이 없었습니다. 원인을 찾기 위해서 log를 넣어서 디버깅을 해봤는데

void readSerial() {
  if (serial_.eof()) {
    RCLCPP_WARN(this->get_logger(), "Serial EOF reached");
  }
  if (serial_.fail()) {
    RCLCPP_ERROR(this->get_logger(), "Serial stream failed");
  }
  if (serial_.bad()) {
    RCLCPP_FATAL(this->get_logger(), "Serial stream corrupted (badbit set)");
  }

  char ch;
  while (serial_.get(ch)) {
    RCLCPP_INFO(this->get_logger(), "while start");
    ...
  }
  RCLCPP_INFO(this->get_logger(), "while end");

이렇기 넣어서 찍어보니

[robot_monitor_node-2] [ERROR] [1753688163.610586878] [robot_monitor_node]: Serial stream failed

이런 메시지가 나와서 상황에 맞게 시리얼 클리어하거나 재연결하도록 변경해 줬습니다. 이전 Pi 4에서는 발생하지 않고 5에서 발생하는 이유가 뭘까 생각해 봤는데 아마 4에는 ttyS0(serial0)로 연결해 사용했고 5에서는 ttyAMA0를 연결해서 사용했기 때문이라고 생각합니다.

SLAM TEST

다시 원래 이야기로 돌아와서 한번 제 가정이 맞았는지 확인해 보기 위해서 이전에 돌렸던 SLAM을 그대로 돌려봤습니다(URDF만 변경).

이전과 비교하면 상당히 안정적으로 지도를 작성하는 걸 확인했습니다. 하지만 여전히 하나의 문제가 남아 있는데 여전히 회전에 관해서는 위치 추정이 불안정했습니다.

UKF??

두 번째 로봇 조립하면서 SLAM 강의에서 새로운 필터를 학습했습니다. Unscented Kalman filter, 비선형 운동 방정식을 선형화하여 해석하는 EKF와 다르게 몇 개의 점을 뽑아 비선형 운동 방정식 그 자체를 만들어 추정하는 필터입니다. 일반적으로 비선형에 대해서는 UKF보다는 성능이 좋다고 하여 아마 이 필터를 적용하면 회전에 대해서도 안정적인 SLAM이 가능하지 않을까합니다. 다음 글에는 UKF를 사용해서 위치 추정을 하는 걸로 변경하는 과정에 대해서 적어 보겠습니다.


메타데이터
post_id
407bced6cbf0
slug
slam-공부용-로봇-만들기-407bced6cbf0
url
https://medium.com/@duddnrdpqj/slam-%EA%B3%B5%EB%B6%80%EC%9A%A9-%EB%A1%9C%EB%B4%87-%EB%A7%8C%EB%93%A4%EA%B8%B0-407bced6cbf0
canonical_url
https://medium.com/@duddnrdpqj/slam-%EA%B3%B5%EB%B6%80%EC%9A%A9-%EB%A1%9C%EB%B4%87-%EB%A7%8C%EB%93%A4%EA%B8%B0-407bced6cbf0
author_url
https://medium.com/@duddnrdpqj
status
ok
fetched_at
2026-06-21 07:44:09