본문 바로가기

KAIROS 2기

[카이로스2기] 1차 프로젝트 : myAGV 주행하기

드디어 카이로스 2기 과정의 프로젝트에 대한 포스팅을 시작할 예정이다.
저번주 금요일에 1차, 2차 프로젝트에 대한 결과 발표를 진행하였고, 이제 통합 프로젝트 시작을 앞두고 있다!
포스팅으로 이번 주는 1차 프로젝트에 대한 리뷰, 차주는 2차 프로젝트에 대한 리뷰를 간단히 진행하고, 추후에 상세 기술에 대한 포스팅도 할 수 있으면 좋을 것 같다.😀

1. 1차 프로젝트 개요
2. 모듈별 활용 기술
3. 자체 평가

 

1. 1차 프로젝트 개요

카이로스 2기 1차 프로젝트는 myAGV 주행으로, 우리 반은 두 개의 기본 과제를 가지고, 조별로 창의적인 추가 미션을 만들어서 함께 구현하는 방식으로 진행하였다. 💯
- 프로젝트 기본 과제
  : 라인 트레이싱을 활용하여 myAGV가 코스 전체를 완주, 해당 과정에서 붉은색/장애물을 보면 인지하여 정지
- 우리 조의 추가 과제 목표 3개
  1) Lidar를 활용하여 장애물 인지 & 회피,
  2) PLC와 cobot을 이용한 신호등 제작 & 적용
  3) Arco Marker 활용


2. 모듈별 활용 기술

1) 라인 트레이싱
우선 가장 기본이자, 그래서 가장 중요한 라인 트레이싱은 우리 조 2인이 개발 완료해주었다.
처음 조건으로 라인은 검은색이었는데, 빛 반사가 있다보니 일부 다른 조들은 노란색 선으로도 변경하였으나, 우리 조는 Threshold 기법으로 처리하여 검은색 라인으로 주행에 성공할 수 있었다!
또한 하단에 있는 라인에 집중하기 위한 카메라 세팅과 ROI 조정에 정말 많은 시간을 들였는데, 이런 조원들의 노력이 빛을 발하여 프로젝트 중반 즈음에 완벽히 주행되는 코드를 가질 수 있어 이후 추가 개발을 하는데에 정말 큰 마음의 안정과 도움이 되었다.💖

2) 장애물 회피 (Lidar)
Lidar를 활용한 장애물 회피는 내가 맡은 파트였는데, 정말 막막함이 많았던 영역이었지만, 초기 분석에 큰 도움을 준 조원 분이 계셔서 포기하지 않고 완료할 수 있었다.
분석 단계에서 가장 유효했던 것은 /scan 토픽을 발행하는 노드를 찾아서, 토픽 값을 받은 후 필요한 값으로 가공하여 subscriber를 생성한 단계를 잘 수행했던 점인 것 같다.

 
약간의 시행착오로, 초기에는 이 토픽을 다시 구독하는 주행 노드를 만들어서 주고받는 서비스 구조를 만들어보았다.
이를 위해서 인터페이스 패키지를 생성하는데 ROS1 환경이라서 ROS2로만 진행해봤던 CMake 설정과 빌드에 정말 어려움이 많았다...😥
결국 성공했는데, 주행 코드를 작성한 move.py를 ROS1에 얹는 순간, 잘 되던 주행이 버벅이며 제대로 동작되지 않는 현상이 있었다. Threading을 사용해서 돌리고 있는데도 환경상 안되겠다고 판단해서 subscriber 노드에서는 만들었던 서비스 구조를 포기하고 ㅠ.ㅠ socket 통신으로 장애물 현황을 보내주는 방식으로 변경하였다.

 

마지막 어려움으로는 라이다로 인한 주행 변경 타이밍의 어려움이 있었다.
동작이 변경되는 타이밍이(ex. 직진 > 좌회전) 라이다 값의 변경을 트리거로 받다 보니, 라이다 값이 변경되지 않는 지점에서 동작이 변경되어야 하면 그 트리거를 주는 것이 불가했다.
그래서 장애물 회피를 한 이후에 원래 주행으로 복귀하는 시점에서 회전을 적당량만 하지 못하는 이슈가 있어서, 결국 AGV의 PAN 기능을 사용해서 라인으로 복귀하게 되었다. 
당시 시간과 상황에서는 그게 최선이었고, 무엇보다 최우선 과제가 라인 복귀였기 때문에 어쩔 수 없었지만, 내 파트 담당자로서 매우매우 아쉬움이 남는다. ㅠㅠ 😭
그래도 Lidar를 포기하지 않고 사용했다는 점에서 자랑스럽고, 트리거만 잘 해결하면 완전 우회도 충분히 가능할 것 같다!


3) 신호등 🚥
빨간색을 보면 정지하는 부분의 구현을 위해 우리 조는 PLC LED를 사용하여 조원 한 명이 파트를 맡아주었다.
꺼진 LED는 적색이어도 인지하지 않도록 하기 위해 HSV 값 조정에도 많은 신경을 썼고, Cobot이 신호등을 들고 길을 막았다가 여는 동작으로 연결하기 위한 타이밍도 중요했던 것 같다.
특히 하드웨어적인 부분으로 serial 통신을 해야하는 별도 아두이노 Gripper도 사용하다 보니 배선 연장 등 환경적인 세팅이 꽤나 많았다.
그리고 라인 트레이싱 파트에서 신호등 적색을 인지하고 정지 & 녹색을 인지하고 다시 주행을 코드에 녹이기 위한 또 한번의 고생이 있었다. 😇
라인을 보기 위해 아래쪽을 보는 카메라를 설치했다 보니 ROI를 나눠서 설정해야해서 그런 전처리 과정이 복잡했고, 인식까지 상당히 가깝게 가야하다보니 정지거리가 너무 짧아졌고, 주행 방향에도 영향을 많이 받아서 애먹은 부분들이 있었다.
그래도 결국 다양한 조정 끝에 완벽하게 신호등 인식 및 초록불 후 cobot 제거 이동 등도 매끄럽게 되었다!


4) Arco Marker
라인 트레이싱과 더불어 아르코 마커를 이용한 주행도 함께 일부 진행하였다. 
이 부분을 개발해주신 조원분은 PID 제어에 큰 관심이 있으신 분이라 그 부분을 활용해서 마커를 따라가며 AGV가 움직일 수 있도록 개발하였다.
특히 마커와 일정 거리를 유지하며 가까울경우 천천히, 멀 경우 빠르게 주행하도록 하며, 좌회전 우회전 등 마커가 시야에서 사라질 수 있는 부분도 커버하는 주행을 만들어주셨다! 🤠
 

3. 자체 평가 👀

개발 시간이 5일로 굉장히 짧았지만, 다들 맡은 부분에 최선을 다해주어서 정말 만족스러운 결과가 나올 수 있었다.
결과도 좋았지만, 그 과정에서도 어려운 부분에 모두 봉착했지만, 도와가며 헤쳐나갔다는 점이 가장 좋았던 것 같다.
특히 모두 '해보고 싶은' 분야에 도전하고 성취하는 모습을 보는게 정말 대단했다! 
물론 나도 누구보다 열심히 몰입하는 시간을 갖는 카이로스 프로젝트 기간이 되고 있다.😎
 


🌱 카이로스 2기에서 배운 SLAM이 궁금하다면?
https://bagjo2884.tistory.com/31

 

[카이로스 2기] ROS2 기초 : 시리얼 통신(ESP), URDF

이번에는 저번 포스팅에 이어, ROS를 활용한 시리얼 통신과 소켓 통신으로, ESP32와 ROS 간의 소통에 대한 부분과, 새로 배운 URDF에 대해 다루고자 한다.간단히 순서는 아래와 같다. 🐫1. ESP32 > ROS 간

bagjo2884.tistory.com

 
 
다음주 포스팅은 2차 프로젝트 : myCobot 블록 분류하기로 만나요!🍁