쉽게 설명하는 자율 주행 기술, 로봇은 어떻게 자기의 위치를 아는가?

안녕하세요.

오늘은 자율 주행 기술에 대해 쉽게, 제가 아는 선에서 설명해보려고 합니다.

저는 석사 2년동안 자율주행분야에서 연구했었는데요.

제가 아는 것, 제가 하는 것, 제가 속해 있는 분야에 대해 잘 설명하는 것이 중요한데

스팀잇에서 연습하려고요!

참! @stella12, @tradingideas 글을 최근에 봤는데 재밌게 봤습니다 ㅎㅎ

@stella12님 포스팅 4차 산업혁명의 최대 수혜자

@tradingideas님 포스팅 아마존 물류 센터에 있는 로봇 키바


본론

생각보다 자율 주행 기술은 우리 생활과 가까이 있고 다가오고 있습니다.

로봇 청소기

공장 물류 로봇

자율주행차!

특히 최근 로봇청소기는 ㅋㅋ

집 구조를 파악하고 돌아다닌다고 합니다.

스마트폰으로 집 평면도를 볼 수 있어요!

관련 이미지

<Dyson 360>


그렇다면 자율 주행 기술이 도대체 뭘까요?

제가 생각하는 자율주행은 이렇습니다.

로봇이 자기 주변의 환경을 알고, (Mapping)

특정 환경에서 자기 위치가 어디있는지 알고, (Localization)

장애물을 피하면서, (Obstacle avoidance)

목적지까지 최적의 경로로 가는 것 (Path planning)

이게 자율주행 기술이라고 생각합니다.

<Autonomous naviation system on simulation>


생각해보면 사람과 비슷하지 않나요?

예를 들어, 제가 코엑스에 있습니다.

저는 코엑스에 있는 메가박스를 가고 싶어요.

어떻게 찾아갈까요?

  1. 먼저 지도를 봐야겠죠. 코엑스에는 지도를 보여주는 디스플레이가 있습니다.
    (로봇은 특정 환경의 지도를 가지고 있다. 없다면 만들어야 한다. 이것이 Mapping)
  2. 다음으로 내가 그 지도에서 어디있는지 파악하는 것입니다. 그리고 가고자 하는 메가박스가 어디있는지 확인을 해야겠죠.
    (로봇은 지도 상에서 자신이 어디 있는지 파악한다. 이것이 Localization)
  3. 그 다음에는 사람들을 피해가며 메가박스로 갑니다.
    (목적지까지 최적의 경로를 만들고 장애물을 피해갑니다. Obstacle avoidance or Path planning)
  4. 중간에 길을 잃을 때도 있죠. 왜냐하면 코엑스는 넓으니깐요! 그렇다면 지도를 다시 보고 내가 어디있는지 확인하고 빠른 길로 갑니다.
    (로봇도 길을 잃을까요? 자신의 위치를 잃어버릴 수 있을까요? 퀴즈입니다!)
  5. 메가박스에 도착했다!

어떤가요?

사람과 로봇이 목적지까지 찾아가는 방법이 비슷해보이지 않나요?


쉬운 문제를 풀어봅시다.

로봇은 지도가 있다는 가정 하에,

그 지도에서 자신이 어디에 있는지 어떻게 알 수 있을까요?

로봇의 위치 추정에 집중해보려고 합니다.


사람으로 예를 하나 들어보겠습니다.

만약 사람이 눈을 감고 코엑스의 메가박스를 찾아야 한다면 찾아갈 수 있을까요?

코엑스를 몇 번 가봤던 사람이라고 해봅시다.

눈 감고 걸으면 자신이 생각한 이동 거리와 실제 이동 거리가 달라질 것입니다. 그리고 오래 눈 감고 걸을수록 그 오차는 커지겠죠.

그러다가 눈을 뜨면 순간 어디 있는지 모를 수 있지만

이전에 봤던 음식점들을 보고 자신의 위치를 파악할 수 있죠.


로봇도 마찬가지입니다.

센서가 필요합니다. 즉, 주변 환경을 파악할 센서 말이죠. 눈이나 귀처럼요!

로봇은 여러 센서들을 이용하여 현재 관측하는 데이터와 지도 (기존에 특정 장소에 대한 데이터, 이전에 봤던 랜드마크, 특징)을 매칭시켜보면서 로봇의 위치를 추정합니다. 여러가지 방법으로요!

<Lidar, RGB-D camera, RGB camera>


결론

최대한 쉽게 설명하려고 했는데 재밌게 읽으셨는지요.

어떤지 잘 모르겠어요.

언젠가 각 집마다 자율주행기술이 들어간 로봇이 하나씩 갖게될 것을 꿈꾸며

글을 마치겠습니다.

multi_robot_collision_avoidance analysis

multi_robot_collision_avoidance 분석

예를 들어 로봇이 2개가 있다.

각 로봇은 위치를 공유한다. (position_share_controller)

각 로봇은 공유된 장애물, 다른 로봇의 위치를 활용하여 속도를 조정한다. (move_base)

 

  • position_share_controller node
    • 주변의 로봇 정보를 받아서, 주변 장애물 정보를 제공
    •  subscriber
      • 주변의 로봇 정보를 받는다. (/position_share)
    • publisher
      • 주변 장애물에 대한 정보 생성 (/stationary_robots)
        • 순간 멈춰있는 주변 로봇들이라는 의미인 것 같다.
      • clearing_scan
    • service
      • 주변 장애물을 요청하면 제공.
  • detect_obstacles node
    • obstacle을 검출한다.
    • subscriber
      • lidar 정보를 받는다. (/base_scan)
    • service
      • obstacle을 요청하면 제공.
  • me_publisher node
    • 자신의 위치 출력하는 publisher
    • subscriber
      • /tf
      • /tf_static
      • AMCL에서 제공하는 파티클 weight 정보 (/particlecloud_weighted)
        • 불확실도에 따른 반경 설정
      • 로봇의 오도메트리 (/odom)
    • publisher
      • 로봇의 polygon (/convex_hull)
      • 자신의 ID와 위치 출력 (/position_share)
    • service
      • 자신의 위치를 Marker로 제공 (visualization_msgs/MarkerArray)
  • controller_robots node
    • 각 Robot의 실질적인 컨트롤 파트
    • subscriber
      • 로봇들의 위치 (/position_share)
      • /base_pose_ground_truth
      • /commands_robotac
  • active_collvoid node
    • 꾸꾸?
    • subscriber

[kr-dev] 최신글 알림 서비스 #2 (Telegram 활용하는 법을 배워보자)

안녕하세요.

저는 최근 호기심이 생겨 최신글 알림 서비스를 개발하고 있습니다.

목적은 특정 태그, 특정 유저의 최신 글이 작성 되었을 때,
알림이 오도록 하는 것 입니다.

첫번째, 카카오톡으로 알림 서비스를 받으면 참 좋겠다 생각했으나, 유료 서비스라 패스하였습니다.

두번째, 직접 어플을 만들자니 배보다 배꼽이 더 큰 상황이라..


해결책은 Telegram을 활용한 알림 서비스

telegram bot에 대한 이미지 검색결과

Telegram은 공식적으로 python-telgegram-bot 관련 라이브러리를 제공하고 있으며,

이를 이용해서 쉽게 알림 서비스를 만들 수 있을 것입니다.

Telegram의 장점은 아래와 같습니다.

  • 무료다.
  • API가 제공된다.
  • 카카오 플러스 친구 같은 것을 만들 수 있다.
  • **스팀잇 뿐만 아니라 알림을 받고 싶은 서비스에 활용할 수 있다.**
    • ex) 추후 제가 개발하고 싶은 홈서비스 로봇에도 사용할 수 있을것으로 기대합니다.
    • 집에 불을 키고 나왔거나 집에 손님이 방문했을 때, 그것을 인식하고 Telegram을 통해서 알림을 받는다던가!

서론이 길었지만..

Telegram Great!

Telegram 설치 및 활용 과정

설치 방법은 링크로 대체하고 큰 그림으로 설명드릴게요

1. Bot Father에게 Bot을 생성해달라고 요청해야합니다.


Bot은 아래 설명한 것과 같습니다.

  • 사용자로부터 무언가 입력을 받거나 사용자에게 알림을 보내기 위해서는 봇이라는게 필요합니다.
  • 예를 들어, 카카오 플러스 친구를 생각하면 되는데 우리가 만드려는 것은 카카오 플러스 친구를 만든다고 생각하며 됩니다.
  • 봇 파더에게 생성 요청 – 이 글이 전반적으로 설명을 참 잘했습니다.

Bot Father로부터 Bot을 생성했다면 반은 끝났습니다.


2. python-telegram-bot 라이브러리 설치

sudo pip install python-telegram-bot만 하면 끝!

백종원 참 쉽죠에 대한 이미지 검색결과

3. 사용자에게 메시지 보내기

아래 코드를 보면 Bot father에게 받은 telegramKey를 이용해서 Bot 객체를 만듭니다.

self.telegramBot = telegram.Bot(token=telegramKey)

그 다음에 메시지를 보내고 싶을 때, sendMessage함수를 사용하면 됩니다.

예를 들어, 새로운 글이 감지 되었을 때, sendMessage를 보내면 되는겁니다!

4. 사용자의 입력에 따른 피드백

이제 사용자로부터 입력을 받고 그에 따른 동작을 해야할 때 사용하는 함수인데요

간단히 설명드리면 Handler와 Callback method, 그리고 Handler를 관리하는 dispatcher가 있습니다.

  • Handler는 특정 Command나 메시지가 왔을 때, 특정 함수를 실행하도록 설정합니다.

41번째 줄로 설명하면 ‘start’라는 신호가 오면 start함수를 실행하라는 의미입니다.

  • Callback method는 이 때 실행되는 start 함수를 말합니다.
  • dispatcher는 여러 개의 handler를 관리하는 애를 말합니다.


결론

결론은 위에 4단계를 쭉 따라오면 원하는 Telegram 서비스를 만들 수 있다고 생각합니다.

코드는 아래와 같이 공개를 하였고요! 참고하세요 ㅎㅎ

https://github.com/passionbull/steemit-alarm-posting


제가 만든 최신글 알림 서비스는 현재 위의 기능들을 활용해서 아래와 같이 동작합니다.

현재 DB랑 연결하는 부분을 안만들어서 개인용입니다..

이제 해야할 부분은 사용자들이 원하는 태그 및 특정 유저를 선택하면 그것을 DB에 저장하고

서비스에서 DB를 읽어와 최신글 검출 및 메시지 발송을 해야합니다.

생각되는 문제는 저 혼자 쓰는데는 문제가 없으나,

사람들이 많아질 경우 제 서버 (오드로이드-XU4)가 버틸 수 있을지 모르겠네요 ㅜㅜ

궁금한 것이 있으면 물어보세요!

제안, 조언 등 언제든 환영입니다.

글이 많이 긴데 읽어주셔서 감사합니다!


Refrence

기존에 있는 스팀잇 Telegram 서비스를 찾아봤는데요.

  • @clayop
    • https://steemkr.com/kr/@isaaclab/clayop-steemit-telegram
    • https://steemit.com/ko-general/@clayop/–noteefi
  • @ludorum
    • https://steemit.com/steemchatbot/@ludorum/steem-mentions-steemchatbot-v0-1-0

@clayop, @ludorum, 외국 개발자님이 개발한 것도 있었는데 기억이 안납니다.

현재 clayop님이 noteefi가 제가 목표하던 알림 서비스더군요.
Telegram현재 서비스를 운영하고 있지는 않으신 것 같습니다.

ludorum님의 챗봇은 언급됐을 때, 알림이 오는 서비스입니다.

사실 기존 서비스가 다시 가동된다면 제 서비스는 필요없을 수 있으나,

저도 처음으로 스팀잇 라이브러리도 써보고, Telegram 봇도 개발해보고

많이 공부가 되었습니다.