수업 노트/Computer Vision

[Robot Vision System]

2로 접어듦 2022. 11. 15. 16:13

Assignment 1

Screencast from 2022년 11월 15일 23시 43분 15초.webm
7.20MB

실행 순서

 

1. 환경 세팅

# firstly, install ROS Melodic (This assignment does not work on M1, M2 macbooks.)
# Second, install opencv
# 내 경우엔 
"""
$ python2
>>> import cv2
>>> cv2.__version__
'4.2.0'
"""

$ echo "export ROS_MASTER_URI=http://localhost:11311 " >> ~/.bashrc  
"""
만약 ping 연결이 안된다면, bashrc 의 ROS_HOST ip를 ifconfig 후 나오는 것으로 교체.
"""

$ sudo apt update && sudo apt upgrade -y  
$ sudo apt install ros-melodic-rosbridge-server 

$ cd /{Working_dir}/
$ mkdir -p xycar_ws/src && cd xycar_ws/src
$ git clone https://github.com/Angledsugar/RobotVision_xycar.git  

# catkin_make should be typed outside of src/
$ cd ../ && catkin_make

# devel, bulid dir will be created.
# this should be writed because new ros package files cannot be found exactly.
$ echo "source ~/{Working_dir}/.../devel/setup.bash" >> ~/.bashrc
$ source ~/.bashrc

 

 

2. Unity and ros launch file setting

# (1) Terminal 1 
$ roslaunch rosbridge_server rosbridge_websocket.launch

# (2) Terminal 2
# Unity is on, Input Ubuntu IP(localhost). => "ws://localhost:9090" and Press "Enter".
# Unity window will be exactly closed.
$ cd ~/{Working_dir}/xycar_ws/src/RobotVision_xycar/Build/Linux/Start/
$ sudo chmod +x RVS_start.x86_64
$ ./RVS_start.x86_64

# If you input right host ip, ros can connect RVS. 
$ cd ~/{Working_dir}/xycar_ws/src/RobotVision_xycar/Build/Linux/Xycar/
$ sudo chmod +x RVS.x86_64
$./RVS.x86_64

# (3) Terminal 3
$ roslaunch assignment1 driving.launch

 

그러고 난 뒤 해야하는 것은 driving.py 를 수정하는 것.

1. from cv_bridge import CvBridge, CvBridgeError 임포트하기

2. #!/usr/bin/env python2
# -*- coding: utf-8 -*-

로 파이썬 2로 지정하기

3. 이제 지정된 ''' ''' 를 제거하고, 라인 디텍팅 코드를 수정해서(노가다) 시뮬레이션 돌리면 된다.

driving.py 를 보면서 이해한 것

1. opencv image window는 가로축이 x, 세로축이 y이다. 오른쪽으로 갈 수록 x가 커지고, 아래로 갈 수록 y가 커진다.

 

해야할 것.

1. 노란색 선을 인식하는 것인지 흰색 선만을 인식하는 것인지 확인해서, 노란색선과의 센터를 계산해야 한다.

의문 1. 노란색선을 인식한 left line은 왜 흰색 선쪽으로 그려지는가?

아닌가?

의문 2. 일단 -240으로 임의로 해두고. 근데 왼쪽으로 기울게 되면, 

_angle = line_center - 240에서 _angle은 음수가 되어야 하는데, 왜 양수인가? 뭐가 측정되는거지?

의문 3. 빨간 색 선 기준으로 center를 잡고 계산해보자.

 

---

일단 임의로 left line 들을 이동시켜서 노란 선으로 맞춰봤다(+160). 직진은 잘 되고 어느정도의 우회전은 된ㄴ데,

우측 곡선을 잡질 못한다. 그래서 우회전하다가, 왼쪽 선들에 의해 좌회전해버린다.

오른쪽 선을 못 잡는다.

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=hirit808&logNo=221486800161

 

의문 1. 오른쪽 흰색 선은 잡는 것 같은데, 왜 초록색으로는 안 그려지지?

의문 2. 횡단보도를 잡는다.

아래쪽영역만 잡아서 선 그릴려고 했는데, 이미 ROI로 y범위는 360:480으로 제한되어있다.

 

의문 3. 횡단보도쪽 가로 선을 잡고,계속 남아있다.

dh,,,, slope 크기가 0.6이어서.... 너무 큰줄알고 그랬네,,,,

 

그 다음, 라인 없는 곳과 횡단보도.

뭔가 선 길이로 해야할 듯.

 

남은 사항들

1. 현재 이미지 픽셀 위치에 제대로 그림을 그려내지 못한다. 위치 계속 헷갈림. 그거 확실히 파악해야 함.

+ 또한, 곡선구간 되면 임의로 중앙 위치로 그려놓은 선들이 툭툭 튄다. 그것도 확실히 확인하자.

2. 사실 우회전 하는 것은 지금 거의 랜덤이다. 기울기 각도를 계산하는 것이 아니라, 이전 값으로 그냥 무작정 회전하는 것임,

중앙 차선과 오른쪽 차선을 제대로 인식할 수 있도록(곡선들 포함) 해야 한다.

3. 아무것도 없는 차선 + 횡단보도의 짧은 직선들이 마구 그려진다. 필터링 알고리즘을 추가하자.

4. 좌회전 힘들 것임. 우회전만 했으니. 고고!

 

2022.11.17 진행목표

1. Houghline 어쩌고는 곡선 잘 안된다고 한다.

사진만 캡처해서 선 인식 시도해보기 + bird view 시도 + ROI 설정 + 이미지에 선 긋는기

2. 필터링 알고리즘 찾아보기 + ROI 색칠?

한 것

뭘 했는지 모르겠다 ㅋㅋ

일단 곡선 인식 안되서, bird view 하고 roi 설정하려고 했는데, 함수 이해안하고 해서 뭘 하는지 모르겠다.

- 사진 크기에 맞게 선 긋기 정도는 했고, bird view를 위한 warping도 했는데, 그 다음 ROI를 위한 window를 하는 이유를 모르겠다. 가운데인지 아닌지만 알면 되는데. 졸려서 머리가 안 돌아간다. 예제들은 원래 이미지에서 차선의 영역을 세그멘테이션 하듯이 하려고 한다.

 

곡선에 대한 warping은 거의 되지 않는다. 아직 이해못하고 영역을 warping한 것 같기도 하고.

out_img는 왜 저렇게 그려지는지 아직 이해하지 못했다. 

 

한 것

line_roi 창에 뜨는게, roi내에서 HoughlinesP 를 적용시켜서 따낸 직선을 두께 20으로 그려놓은 것이다.

곡선은 너무 못 딴다. 

warping 및 예제들을 따라해서 곡선을 인식하려고 했는데, 졸려서 잘 못했다.

slide_window_search 인자를 링크 맨 밑 총합 코드에서는 thresh를 넣으면서, 함수에는 warped라고 써놨다. 이미지를 받는건지, 쓰레쉬홀드를 받는건지 이해하지 못했고, 왜 저기다가 그림을 그리는건지(초록윈도우) 이해하지 못했다.

 

참고 링크

https://moon-coco.tistory.com/entry/OpenCV%EC%B0%A8%EC%84%A0-%EC%9D%B8%EC%8B%9D

https://durian9s-coding-tree.tistory.com/86

 

 

Real world Xycar Simulation

하드웨어 제약사항

앞 바퀴 회전 최대 각도가 50도 랬던거같음.

 

 

 

1121 Sim to Real

금일 목표

1. xycar 연결하는 방법, 작성한 코드가 어떻게 전송되고 실행시킬수 있는지 확인하기

2. 영상촬영해서 인식 얼마나 하는지 확인하기


xycar 동작 방법

0. ssh 포트

랩탑 와이파이 - raise-project pwd:engineers

ssh: ssh nvidia@192.168.0.6(6번 자이카) pwd: nvidia

 

1. 원리

  • laptop real_driving.py  등을 실행해서
# self.motor = rospy.Publisher('/xycar_motor', xycar_motor, queue_size=1)
# self.real_image = rospy.Subscriber('/usb_cam/image_raw/compressed',CompressedImage, self.realimg_callback)

이 부분을 주석 해제. 이 부분이 실제 xycar 의 image를 수신해서 작동하는 코드이다.

이런 부분들로 이미지를 받아오면 되는 것이고,

 

  • laptop ~/.bashrc의 ros host 를 이 컴퓨터 p로 변경하였음
export ROS_MASTER_URI=http://192.168.0.3:11311 
export ROS_HOSTNAME=192.168.0.3

원래는 192~ 부분 둘 다 localhost로 되어 있었음.

 

  • xycar: catkin_create_pkg assignment1 rospy roscpp std_msgs 로 만든다음
    • ~xycar_ws/srs/my_hough/launch 의 h_drive.launch 를  복사해서 assignment1/launch 파일 안에다가 복사붙여넣기.
    • src 밖인가? 거기서 catkin_make 해주고, 런치파일을 실행시키면 laptop으로도 rostopic 들이 넘어온다.
    • 현재 6번 자이카는 
      • roslaunch assignment1 drive.launch 로 실행.
  • laptop: roslaunch driving launch file 실행(driving.launch 혹은 real_driving.launch 실행)
    • 현재 real_driving.launch는 usb_cam을 못 찾아서 에러 뜸. 확인 필요
  • xycar 원격 연결 + roslaunch assignment1 drive.launch
  • 이후 laptop에서 rqt_image_view, rqt_graph로 확인 가능
  •  

지금 문제

자이카에서 usb_cam을 못 보냄.

자이카 -> <- cam 을 중간에 가져와서 laptop에서 받아쓰려고 한 건데, 안되는거니까, 새로 xycar에서 그냥 보내게 조교가 고칠 예정. 

 

준현이는 핸드폰 - 자이카 연결해서 통신을 시도함.

나는? 

일단 키보드로 이미지 + 모터출력 값을 가지고 딥러닝?을 하고싶음.

 

된 것: xycar에서  basrh rosmaster uri = 192.168.0.3:11311(내 랩탑)

hostname = 192.168.0.6(자이카) 으로 하니까 image_raw/compressed 받아짐.

+ rosbag 노트북에서 실행 잘 됨(빨리 재생되는 것도 없음)

+ rosbag 촬영 완료(대신 모터의 출력과 회전각도는 녹화 못함 ㅠㅠ)

 

 

2022.12.02 시도

1. 에러제거

QObject::moveToThread: Current thread (0x557f745c3780) is not the object's thread (0x557f7478d030). Cannot move to target thread (0x557f745c3780)

라는 에러가 발생해서, opencv-python 버전 downgrade를 아래와 같이 수행함. 4.5.5.64 -> 4.3.0.36.

일단 그랬더니, line_detector_test.py의  window가 제대로 뜨지 않음.

-> 간헐적으로 될 때가 있고 안 될 때가 있다. 뭔가 계산이 안 될 경우에는 조그마하게, 안 뜨는 듯.

 

일단 line_wind를 이해하기에는 opencv-python 4.3을 쓰고, 

출력을 확인할 때는  4.5.5.64 를 쓰자.

 

2. 대표적인 라인 검출 -> 히스토그램을 이용

대표적인 라인들의 히스토그램을 이용해서 곡선은 검출못하지만, 기울어진 정도로 검출을(노란선) 완료함.

 

3. 지금 유니티가 실행이 안되는 문제 발생.

음... 지난번 실습 때 subscribe를 건들였던가?? 아. publisher를 건들였었따. Publisher를 없애면 됨.

 

4. 선이 하나만 인식되는 경우, Plothistogram 이 두개가 겹친다.

 

또한, 아예 left_lane 같은 값이 안 들어올 때, leftx_test[0]의 인덱싱이 실패해서 종료된다. 이 문제 해결해야 함.

 

히스토그램으로 해서 겹치면 어떻게 해결해야 하나?

선이 인식이 안되면 try except 해야하나?

 

음... 히스토그램의 left_base가 10이하(leftx 좌표)이면 오른쪽만 계산하도록 해야하나?

 

 

20:48:

move_with_one_line 진행 중(함수)

자꾸 인덱싱 에러 난다. 왜지? 하나는 무조건 하게 한것 같았는데.

수정 완료. 부등호 변수를 low로 잘못했었음.

 

 

완료사항

일단 회전 시에는 최소한 한쪽만 try해서 한쪽 라인 인식해서 움직이도록 했다 -> 오른쪽 차선을 인식해서 오른쪽 라인 따라 이동가능하게 되었음.

(회전한다고 계산될 시 왼쪽 아니면 오른쪽 line인식해서 이동하도록 try except를 작성하였음. move_with_only_with_one_line은 한 라인만 인식해서 선을 긋도록 햇음)

 

 

남은 사항

- stop line 인식

- esimated_center 에 평균필터, 로우패스필터 넣어서 튀는 값 잡아주기!

- 미션 수행... 특정구간 회전...

- 실 영상에서 돌려보기

 

 

20221204 도전

목표

1. stop line인식

2. 미션 수행

3. 안정화(필터링)

 

stop line인식하기

22.12.06 assignment 1 성공

 

2022.12.07 도전

목표

1. rosbag 인식, real driving py 실행해서 rosbag -> cv 변환 시도

2. 카메라 캘리브레이션 시도

3. ROI 재 조정, cv 정확도 올리기

4. xycar 직진, 회전 확인하기

 

--

xycar 연결하는 거 까먹어서 다시.

Xycar:

1. assignment1 driving.launch 파일을 노드만 키도록 설정. (py 실행 안 하도록 마지막줄 지워서)

2. xycar 의 bashrc 의 MASTER_URI 를 내 laptop ip로 설정.(HOSTNAME의 ip는 xycar ip)

3. xycar와 laptop은 같은 네트워크여야한다.

4. roslaunch assignment1 driving.launch 로 실행

 

LAPTOP:

1. bashrc MASTER, HOST URI를 ifconfig의 ip로 변경(local host -> 192.168. ... 으로 변경)

2. 내가 작성한 driving.py가 있는 launch file 실행

roslaunch assignment1 driving.launch

3. rqt 그래프가 잘 나와야한다. -

rqt_graph

rqt_image_view

 

20221208 목표

1. CV 정확도 올리기

2. Angle, estimated center 계산해서 출력값 잘 계산하기

3. 돌려보기

 

rosbag 재생 확인법

# launch file

ubuntu@ubuntu:~/2022-2_lectures/xycar_ws/src/RobotVision_xycar/assignment1/src$ roslaunch assignment1 driving.launch

# rosbag file
ubuntu@ubuntu:~/git_dir/RobotVision_xycar/recorded_video$ rosbag play 20221122_record_road_first.bag

 

한 것

1. window 별 평균내서 cv 정확도 향상시켰음

2. 회전각도는 30도가 가장 편할 듯. 구간 별 인식한 angle에 따라 +- 30으로 설정함

3. 신호등인식 추가 필요 + 직진, 임의로 좌회전 코드 추가 필요

4. 아직 안 돌려봄

 


2022.12.11 과제 2 제출

라인 인식을 통한 직진 및 회전 구현완료

정지선 인식 후 정지 구현 완료

 

트랙의 나머지 구간 주행X. 구현하지 못함.