본문 바로가기

대외활동/irc src 씨름로봇

[씨름로봇 ] 색 기반 물체 추적기 (티스토리 초보)

                                              색 기반 물체 추적기

 

                                                                      출처 :SRC IRC 씨름로봇 2022년 규정집

 

위 사진처럼 로봇 위에 초록색 원통을 놓고 경기를 치르게 된다.  카메라를 통해 통해 상대로봇의 위치를 파악하고 밀어내야하는데

처음에는 음.... 걍 적외선으로 0,1로 해서 하믄 안될라나 생각했지만....  2019년대회때도 잘 먹혔거든요 ㅋㅋㅋ

 

경기장에 벽이 생겼었네요 ㅋㅋㅋㅋ 2020년 대회까지만해도 없었는데...  주최측의 영상처리 기술을 사용하길원하는 의도가

너무 보이는 경기장이잖아 ㅋㅋㅋ   이러면 그냥 카메라 써야지 허허허헣


  카메라 영상 데이터가 2D 이기 때문에 영상속의 물체 추적을 위해서는 서보 모터 두개가 필요하겠죠?

( 스텝모터도 있긴한데 돈도 없고 무겁고...... )

 

그래서 구상한것이 아래 링크 영상처럼 서보모터 두개로 2축 펜틸드를 만들어서 카메라를 달아 물체를 추적하는거죠

 

https://www.youtube.com/watch?v=63_mOyZeNng 

영상속작품은 ai카메라모듈을사용해서 opencv로 따로 영상처리코드가 필요가없었다고 한다.

  걍 저 카메라 모듈 쓸까...


                                                                           기구부 제작

 

 

제어기: 아두이노(서보모터 제어기), 라즈베리파이 4B(영상처리용)

구동기: S90서보모터

OS:ubuntu18.04 server

ROS:Melodic

 

                                    서보모터 2축 펜틸드

 스위치는 로봇이 경기 규정중 심판 호각이 울리기 전까지는 움직이지 않아야되는데 심판이 호각이 불고나서 시스템 부팅을 시키기에는 시간이 너무 오래걸려서 스위치 off 시 모든 프로그램을 정지시키고 on이 될때 프로그램들이 돌아가게하려는 계획이죵

근데 스위치 옆에 IC칩들이 있는데 이것까지 설명할려면 너무 길어져서 다음에 기회가 되면 한번 설명을 해볼게용

 


                                                                  아두이노 Rosserial로 라즈베리파이 연동

1. 아래코드로 rosserial-arduino 설치

$ sudo apt-get install ros-melodic-rosserial-arduino
$ sudo apt-get install ros-melodic-rosserial

2. 아두이노 ide 설치

sudo wget https://downloads.arduino.cc/arduino-1.8.19-linuxaarch64.tar.xz
tar xf arduino-1.8.19.tar.xz
cd arduino-1.8.19.tar.xz
sudo ./install.sh

3.ros library  설치

cd arduino-1.8.19/libraries
$ rosrun rosserial_arduino make_libraries.py .

 

자그러면 간단하게 스위치 on/off를 publish 하는 것을 해볼게용

 

1.아두이노 코드

#include <ros.h>
#include <ArduinoHardware.h>
#include <std_msgs/Bool.h>
#include "std_msgs/Float32.h"
bool flag;
ros::NodeHandle  nh;
std_msgs::Bool bool_msg;
ros::Publisher switching("trigger", &bool_msg);
void going() {
       flag = true;
}
void stopping() {
      flag = false;
}
void setup() {
      Serial.begin(57600);
      pinMode(2, INPUT_PULLUP);
      pinMode(3, INPUT_PULLUP);
      attachInterrupt(0, stopping, FALLING);
      attachInterrupt(1, going, RISING);
      bool_msg.data = flag;
      nh.initNode();
      nh.advertise(switching);
}
void loop() {
      bool_msg.data = flag;
      switching.publish( &bool_msg );
      delay(10);
      nh.spinOnce();
}

아두이노를 라즈베리파이 usb에 연결후 우분투에 아래 코드를 입력하면 아두이노쪽노드가 실행됩니다.

 

sudo chmod a+rw /dev/ttyUSB0 #usb를 꽂은 아두이노에 권한을 부여
rosrun rosserial_python serial_node.py _port:=/dev/ttyUSB0 _baud:=57600

근데 저는 라즈베리 부팅마다 저 노드를 입력하기 귀찮아서 아래처럼 bashrc에 넣어서 라즙이 부팅되면 자동으로 실행하도록 설정했습니다. 경기장에서 노트북으로 선연결해서 ssh창 열고 작동시키믄 글잖아요 ㅋㅋㅋㅋ

아래 동영상처럼 결과값이 잘 나오네요 (roscore도 첨부해줘야 돌아갑니다. )

 

동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.

rqt_graph로 보면 노드가 잘작동하네용

 

 

 

 

 

pid 제어는 다음으로 ,,,,,,,