Limit is your thinking

IT 공부/project_01

11/14 final project

a19o_20 2023. 11. 14. 14:59

Readme GUI와 ROS2 통신간의 연결 

 

서론:

프로젝트의 출발은 현실적인 문제를 기반으로 한다. 

전체 프로젝트의 개요는 .. 

 

이상적인 신발 정리 시스템은 존재 하지 않았습니다. 특히나, 많은 사람이 오는 식당이나, 신발을 벗고 하는 여러종류의 헬스장등 그렇게 효율적이지 않았습니다. 

 

그리하여 이프로젝트를 기획하게 되었으며, 좀 더 기초적인 것에부터 제가 아는 기술을 써보고 같이 하는 팀들을 구했습니다.



이에 로봇과 iot시스템과 딥러닝 모델을 이용하여 각각 사람들에 맞는 신발장을 부여하고 자동으로 주는 시스템 그 후에 나갈 때도 자연스럽게 나가게 만드는 프로젝트를 준비 하고자해서 만들어 보았습니다.



로봇 시스템에서의 효율적인 제어 및 모니터링을 위해 진행되는 이 프로젝트는 초기에는 여러가지의 키워드로서 나눠졌으며 저가 맡은 파트는 GUI와 관제시스템 혹은 로스2 통신을 이용해서 효율적인 통신을만드는 것입니다.

 

제가 관제 시스템을 한 큰 이유중 하나는 기술 자체는 새로운 유저, 즉 일반인들에게 그렇게 친절하지 못한다고 생각하였고, USER-friendly를 생각하며, 새로운 사람이 이것을 적용하고 사용할 수 있는데에서 좀 더 생각 보려고 했고 만들었습니다.

 

일단, 기초적인 작업으로는

모바일 로봇과, 메뉴플레이터(로봇암)에 대해서 각각 통신을 구축하고, 어떤 방식으로 논리를 구현하는 지에대해서 연구했으며, 이후에 작성하도록 하겠습니다.







이론적 배경:

이 로봇과 인터페이스 간에 사람들간의 생각은 이미 되었으며, 제가 참조한 논문으로는 

<가정용 로봇 GUI의 사용자 친화적 시스템 구축을 위한 연구- 양리가>를 참조했으며,

 

여기에서 제가 기억나는것은 로봇이 보는 상황에 대해서 어떻게 생각할것인지, 또한 로봇이 주는 데이터는 인간으로서는 어떻게 표현되는지 였습니다.



 

위에 자료는 로봇이 정보를 보는 환경입니다.

위에 보는 것으로서는 로봇이 정보를 처리하는 것인데, 사람이 보는 환경이기도 합니다. 하지만, 예전의 로봇 인터페이스는 각 20~30개이상의 버튼이 존재 했다는 것입니다. 이에 가장 중요한것은 시각적 정보표현 , 또는 거기에 뜨는 정보 처리를 보여주는 회색창이 좀 더 미래 지향적이라는것입니다.

 




위에는 로봇이 기능과 그것에 대한 세부기능을 주고 구분으로 나눈것입니다.

17개이상의 기능을 구현은 로봇 그 자체에서 실현해야합니다. 하지만, 현실적인 면에서는 아직까지는 힘들다고 했으나, 점 점더 가능하게 되고 있기는 합니다. 

 

ROS2를 선택한 이유와 PyQt선택이유

 

ROS2는 현대적이고 확장 가능한 오픈 소스 로봇 운영 체제로, 

분산 시스템에서의 로봇 응용 프로그램을 지원합니다. 

 

ROS2를 통신 체계로 삼는데에 첫번쨰로 했으며, 

GUI 로는 PyQt5는 Python 기반의 강력한 GUI 프레임워크로, 사용자 친화적인 인터페이스를 

구축하는 데 적합하다. 본 섹션에서는 ROS2와 PyQt5의 기본 원리와 사용법,

 두 기술 간의 상호 작용 방식 등에 대한 이론적인 내용을 제공한다.

 

#두 기술간의 연결

두 기술간의 상호 방식에는 3가지의 기초적인 것이 필요합니다. 

제가 쓴 것으로는 Ubuntu 22.04, PyQt5, PyQt5-sip, designer(drag&drop PyQt Tool)

ROS2

다음으로는 PyQt와 ROS2간의 상호 연결을 가져가는 것인데, 절차대로 하시면 쉽습니다.

 

  1. PyQt UI의 메인안에 클래스를 두개를 만듭니다. (Listen[node])-<ROS2>  WindowClass(Qmainwindow, from_class)-<PyQt> 
  2. Ros2의 모듈은 리스너 모듈 튜토리얼에서 가져와서 서브스크립션 먼저 하는것을 시도해봅니다.
    PyQt에서는 기본적인 UI를 이용해서 LineEdit에 서브스크립션 한것을 적용해봅니다. 
  3. PyQt main 에서 rclpy.init()을 이용하고, 노드를 받고, thread를 사용해서, Thread안에서 (target, args, demon)을 줘서 메인에서 두개다 실현을 가능하게 만듭니다. ROS2는 계속돌고 , ROS2가 돌면서 demon에 false 를 줘서 이 ROS2가 도는 동안에도 PyQt가 실행 되게끔 했습니다.

 

이런 3가지 절차를 통해서 기본적인 PyQt와 ROS2의 통신을 연결 하는 과정에 대해서 알려드렸고 본론을 통해서 더욱 더 자세한 코드와 변화 과정에 대해서 작성하겠습니다.



다음은 PyQt Ui 구성도 입니다. 



실행이 끝난 화면이며, 버튼하나하나가 어떻게 작동하고 어떤기능을 하는지 알려 드리고자 합니다. 

 

가장 중요한 기능은 ROsMObileStart와 RosMObileREVstart, Reset이렇게 3가지입니다. 이 3가지는 실행, 거꾸로 방향으로 실행, 초기화 과정이며, 전체 과정의 실행 과정을 담았고, 그 과정은 다중 논리로서, 통신을 받으면 그 다음 통신을 주게끔 만들었습니다.. 



위는 RosMobileStart하는 과정에서 미니봇이 홈으로가는 과정에서의 파란색은 활동하고 있는 위치입니다. 그렇게 해서 사용자가 지금 시나리오에서 어떻게 구성되고 있는지를 보여줍니다. 또한 옆에로그는 어느 부분에서 못받은지에대해서 씁니다. 아래 3가지 예시를 들어서 실행이 멈추는 이유가 있습니다. 중간에서 멈춥니다. 

  1. Face Id를 받지 못하는경우
  2. Roboarm이 finish 을 보내지못할 경우
  3. minibot이 finish을 보내지못하는경우

 

각각의 시나리오에서의 멈춤은 그 당시의 로봇과 또는 어떠한 통신체계에서 받지 못했음을 뜻합니다.

Face_id 손님상호작용에대하여

또한 손님에게 중복적인 번호를 주지 않습니다. FACE_ID를 통하여 신발 위치부여에서 한 번의 두 개의 과정만을 실행합니다.

나가는 번호에대해서만 그 얼굴 디텍팅을 통하여 작동합니다.







본론:

PyQt에서 하는 것은 주요 통신 연결 체계를 한 눈에 바라 볼 수 있다는 것이며, 진행과정도 볼 수 있다는 것입니다. 그리고 나서 명령 체계도 줄 수 있고, 또한 받을 수도 있습니다.

 

이 기술을 사용한 이유는 여러가지 툴중에 가장 빠르고, 가장 쉽게 접근할 수 있는 GUI 프로그램과 ROS2 이해과정에서 사용할수 있는 것이라고 생각했습니다.

 

가장 직면했던 문제는 :

 

이 프로젝트를 통해서 ROS2와 PyQt간의 연결에 처음에 오류가 있었으며, 이 작업을 한 예시도 별로 없었습니다. 그래서 이 문제에대해서 어떻게 시도해야하는지 많은 시행착오가 있었으며, 그 과정과 절차에대해서 하나하나씩 시도 해보왔습니다. 

ROS2 의 기본적인 Publisher from tutorial 과정에서 가져온것입니다.

 

주목할 것은 def main 에 어떻게 구성되어 있냐는것입니다.

 rclpy.init(실행과정이라는것이 있었고, 

rclpy.spin(node)를 통해서 계속해서 퍼블리셔하는 과정이 무한정 발행 되는것이며, rclpy.shutdown()은 프로그램이 꺼질 때 같이 꺼지는 것입니다. 

 

이에 여기서 가져와야할것은 rclpy가 하는 구조와 이것들로 하여금 PyQt또한 연결이 되어 있어야 했는데 여러번 검은화면이 나왔습니다. 

이에 해결방안에는 다중 쓰레드를 쓸것인지, 아니면 쓰레딩을 쓸것인지를 해서 두 개 다 시도해보았습니다만, 더 간단한 쓰레딩은 쓰레딩이라 생각하고 코딩을 짜봤습니다. 

 

위에 코딩에서 rclpy가 쓰레딩안에서 작동하도록 하였고, 그것들이 서로 연결이 안되게끔 daemon=False( default)값을 주어서 만들었습니다. 

 

프로젝트의 핵심은 로봇 제어 및 모니터링을 위한 진보된 GUI의 설계와 구현이다. 

ROS2와 PyQt5를 통합하여 사용자가 로봇 시스템을 직관적으로 제어하고 상태를 모니터링할 수 있도록 하는 방법에 대한 자세한 소개와 설명을 제공한다.

 

로봇시스템에 이해에 대해서는 관제시스템안에서 또한 로봇은 신호체계를 했다, 끝냈다로 주고 받아야합니다. 그리고 감지했다라고해서, 이벤트와 상태로 나누어져 있습니다. 3가지의 작업을 할 수 있도록 코드를 유기적으로 쌍방이 가능하게 짜줘야하며, 로봇시스템에서의 효율적인 것들은, 감지의 자율화 또한 신호의 유기적 형태 입니다. 마지막으로는 순서도와 논리도며, 논리에서도 오류 논리를 짜는 것이 목표였습니다. 

  1. 감지의 자율화

로봇 스스로가 감지 할 수 있고, 그것을 메인에다가 주고, 메인에서 생각해서 그것으로 활동 하게끔 만들어주면, 우리 뇌와 같은 활동을 하거나 아니면 메인 이전에 스스로 멈추거나, 다른 재활동 작업을 할 수 있게 만드는것이 주요 목표였습니다.

  1. 신호의 유기적 형태

신호가 쌍방이 되야하고, 모든 신호는 완료라는 것이 실행이 끝난이후에 받고나서 활동을 해야합니다. 그 완료라는 것이 받지않으면, 멈춤 상태가 되거나 초기화 버튼을 눌러주거나 해야했습니다. 메인과 모바일로봇 그리고 로봇암에게서 계속해서 신호를 주고 받을수 있도록 유기적으로 작동하도록 하는것이 목표였습니다.

시스템 내에서의 센서는 모바일로봇의 라이더 센서로, 맵핑과 그 맵에서의 위치 좌표 자기가 판단해서 자리를 잡을수 있는것으로 갔으며, 그러한 형태로서 진행이 되었으며, 저에게는 새로운 센서였으며 어떻게 이용되고, 또한 무엇을 전달해주는지를 받았습니다. 또한 로봇암에게서는 오브젝트 디텍션하는 카메라가 있었고, 신발자체를 학습해서 그 신발에대한 위치파악, 집기 편한 위치로 파악해서 집는거까지가 목표 였습니다. 

신호의 유기적 FACE_ID에서는 카메라가 주는 것이 사람의 얼굴 을 감지하는 카메라 였으며, 신발장에서는 압력센서나, 위치 정보로 하여금 만들었습니다. 그리하여 사용자가 좀 더 익숙하면서도 쉽게 이해할수 있게끔 만드는것이 목표였습니다.

3.시나리오 순서도와 오류 시나리오 해석

위에 시나리오는 어떻게 상태가 변하고, 여러가지 상태가 줄때 무슨 동작을 이행할것인지 보여주는 것입니다.


결과 정리:

이 섹션에서는 프로젝트의 결과물을 시각적으로 제시한다. 



실제 작동하는 GUI의 스크린샷과 동영상을 첨부하고, 성능에 관한 통계 데이터를 제공한다. 

 

위의에서는 두 가지를 보여드렸습니다. 



face_id가 같은 것이 두번 실행될 때는 예외 처리르 해두었습니다.

로봇암이 안켜져서 피니쉬가 안되서 여기까지만 실행되며, 과정이 멈춘 상태입니다.

그이후에 모바일로봇 과정이 안켜졌기 때문에 여기까지 실행 됬습니다. 이후에 

 

미니봇을 켜주면

 

이런식으로 홈으로 까지 가는데 GUI 표시와 더불어 오른쪽에 같이 로그에도 완성됬다고 뜹니다. 

 

또한, 사용자의 피드백과 테스트 결과를 종합하여 GUI의 효율성과 성능에 대한 평가를 수행한다.











결론:

프로젝트의 장점은 선행 연구와의 비교를 통해 명확하게 드러난다. 

개발자 위주의 GUI 개발을 처음에 했다면 좀 더 사용자에게 익숙한 시나리오를 만들고 사용자 위주의 GUI를 만드는데 조금더 공들였습니다. 

 

또한 ROS2를 사용하는 사람들에게 얼레는 RVIZ 툴이나, GAZEBO를 통하여 로봇이 움직이는 모형을 하기도 했지만, PyQt를 통하여 움직임을 좀 더 직관적으로 만들 수 있다는 것을 만들었으며, 이에대해서 로봇 시스템 제어에 대해서 새로운 가능성을 내포한다고 생각합니다. 이후에 PyQt말고도 다른 UI로도 만들수 있다고 생각합니다. 






 

이 프로젝트를 통해 배운 것이라면 처음에 어떠한 것들에 대한 기초 지식이 짧다면, 하나하나 해보는것이 더 효율적이라는 측면입니다. 하나의 바꾸는 것을 하고, 그다음에 아는것을 적용시켜 보는것이 가장 빠른것이었습니다. 












참고문헌:

팀원 오세찬 김동우 김명섭 백세진 왕한세 최석원

이 프로젝트 수행에 참고된 논문, Python 라이브러리, 사용된 데이터셋, 기술 문서, 그리고 GitHub 등의 자료들이 명시된다. 각 참고 자료에 대한 역할과 활용 방법이 상세히 서술된다.

<가정용 로봇 GUI의 사용자 친화적 시스템 구축을 위한 연구- 양리가

Python lib

  • import sys
  • from PyQt5.QtWidgets import *
  • from PyQt5.QtGui import *
  • from PyQt5 import uic
  • import rclpy
  • from rclpy.node import Node
  • from std_msgs.msg import String, Int32, Bool
  • from PyQt5.QtCore import QTimer
  • from PyQt5.QtGui import QPalette, QColor
  • import time
  • import threading

Github link

https://github.com/addinedu-ros-2nd/robot-repo-2/tree/main