Wireless_Joystick

2024. 6. 24. 12:05Jetson

 

# 조이스틱 젯봇 -> 본체로 옮기기

✅ 무선으로 조이스틱을 활용해보자!

import ipywidgets.widgets as widgets

from IPython.display import display

controller = widgets.Controller(index = 0)

display(controller)

from jetbot import Camera
from jetbot import bgr8_to_jpeg

import traitlets

camera = Camera.instance(width = 224, height = 224)
image = widgets.Image(width = 224, height = 224, format = 'jpeg')

camera_link = traitlets.dlink((camera, 'value'), (image, 'value'), transform = bgr8_to_jpeg)
# 디지털 링크를 생성해서 카메라 입력과 이미지 위젯 연결!

display(image)

# 카메라 끄기

camera_link.unlink()
# 조이스틱 조종, 카메라 활용!
# 두가지 일을 동시에 처리해야 함! -> Thread 라이브러리 활용해서 동시 작업!
# 숫자를 출력하는 함수!

import time

def count_number(start, end) :
    for i in range(start, end + 1) :
        print(i, end = " ")
        time.sleep(0.5)
    print()
count_number(1, 10)
count_number(101, 110) # 하나가 끝나야 실행! -> 함수는 두개를 동시에 할 수 없음

✅ Thread 라이브러리 활용하기!

  • threading을 임포트
  • threading.Thread(target = 함수, args = (범위 지정))
import threading

thread1 = threading.Thread(target = count_number, args = (1, 5))
thread2 = threading.Thread(target = count_number, args = (10, 15))

thread1.start()
thread2.start()

# 외부에서 Thread 능동적으로 멈추는 함수 정의

import inspect # inspect -> 코드 내의 객체에 대한 정보를 검사하는 데 사용
import ctypes # C언어 타입 / ctypes 모듈은 C 라이브러리를 사용하기 위한 외부 함수 호출을 제공하며, 이 때 C 타입을 다루기 위해 사용 

# stop_thread(멈출 쓰레드)
# 이 함수를 실행하면 쓰레드가 멈춘다!!

def _async_raise(tid, exctype): #쓰레드에게 예외를 발생시키는 역할
    
    """raises the exception, performs cleanup if needed"""
    
    tid = ctypes.c_long(tid) #쓰레드 식별자를 C 타입인 c_long으로 변환
    
    if not inspect.isclass(exctype): #exctype가 클래스가 아니면
        exctype = type(exctype) # 해당 객체의 타입을 가져와서 클래스로 사용
        
    res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype)) #함수를 사용하여 쓰레드에게 예외를 발생 -> 반환값은 성공 여부
    
    if res == 0:#반환값이 0이면
        raise ValueError("invalid thread id") #쓰레드 식별자가 유효하지 않다는 예외를 발생
    elif res != 1:#반환값이 1이 아니면 
        # """if it returns a number greater than one, you're in trouble,
        # and you should call it again with exc=NULL to revert the effect"""
        ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None) #쓰레드에게 예외를 다시 발생시켜서 효과를 되돌림
        
def stop_thread(thread): # 주어진 쓰레드를 강제로 종료 
    _async_raise(thread.ident, SystemExit) #SystemExit 예외를 발생시킴으로써 쓰레드를 종료
import threading

thread1 = threading.Thread(target = count_number, args = (1, 100))
thread2 = threading.Thread(target = count_number, args = (10, 100))

thread1.start()
thread2.start()
stop_thread(thread1)
stop_thread(thread2) # 강제 종료 코드

import custom
import head

def jetbot_motion():
    #[1] -> 조이스틱의 왼쪽 위아래!
    
    while 1:
        
        if controller.axes[1].value == 1:
            custom.backward()
        elif controller.axes[1].value == -1:
            custom.forward()
            
        #[0]버튼 -> 조이스틱의 1번버튼
        
        if controller.buttons[0].value == True:
            custom.stop()
        if controller.buttons[1].value == True:
            head.center()
        if controller.buttons[2].value == True:
            head.pan_right()
import threading

thread3 = threading.Thread(target = jetbot_motion)

thread3.start()

'Jetson' 카테고리의 다른 글

Widget Button  (1) 2024.06.28
Data collection  (0) 2024.06.27
JoyStick  (0) 2024.06.21
Face Tracking  (1) 2024.06.21
Cat Detection  (0) 2024.06.20