Nintendo Switch의 조이콘 (L)을 ROS의 컨트롤러로 사용

소개



Switch 조이콘에서 ROS /cmd_vel 주제로 보낼 수있는 노드를 만들었습니다.
조이스틱을 앞으로 쓰러뜨릴 때 전진, 뒤로 쓰러뜨릴 때 후퇴, 오른쪽으로 쓰러뜨릴 때 오른쪽 선회, 왼쪽으로 쓰러뜨릴 때 왼쪽 선회하게 되어 있습니다.

환경


  • ubuntu 16.04
  • ROS kinetic
  • Python 2.7
  • pygame

  • 할 수있는 일 (동영상)



    이하의 트윗이 쓰레드가 되어 버리고 있습니다. 죄송합니다. . .
    조이콘의 스틱 조작에서 Turtlebot3을 gazebo 위에서 움직이고 있습니다. (작고 죄송합니다)

    turtlebot3(매우 작음) 피 c. 라고 r. 코m/주2Vk2자 QF — 이치 (@_first_blog) May 8, 2020


    teleop_twist_keyboard 과 같이 버튼으로 속도를 바꿀 수 있습니다.

    <script async=""src="https://platform.twitter.com/widgets.js"/>

    준비



    pygame이 들어 있지 않은 분은 아래 명령으로 설치하십시오.



    $ pip install pygame
    


    Bluetooth로 PC와 조이콘을 연결합니다. 아래 그림의 버튼으로 블루투스 연결 모드로 들어갑니다.



    코드



    이것을 복사하면 바로 사용할 수 있습니다.



    #! /usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import rospy
    from geometry_msgs.msg import Twist
    from turtlesim.msg import Pose
    
    import pygame
    from pygame.locals import *
    import time
    
    class joyconController:
        def __init__(self):
            rospy.init_node('joycon_node', anonymous=True)
            self.twist_pub = rospy.Publisher('cmd_vel', Twist, queue_size=1000)
            rospy.Timer(rospy.Duration(0.1), self.timerCallback)
    
            # ジョイコン操作用
            pygame.joystick.init()
            self.joystick0 = pygame.joystick.Joystick(0)
            self.joystick0.init()
            self.joystickx = 0
            self.joysticky = 0
            pygame.init()
    
            # ボタンのカウントと速度の係数
            self.button_cnt = 0
            self.coff_linearx = 1
            self.coff_angularz = 1
    
            twist = Twist()
            twist.linear.x = 0.0
            twist.linear.y = 0.0
            twist.linear.z = 0.0
            twist.angular.x = 0.0
            twist.angular.y = 0.0
            twist.angular.z = 0.0
            self.twist_pub.publish(twist)
    
            print 
            print '▲ : UP Linear X,  ▼ : DOWN Linear X'
            print '◀ : UP Angular Z, ▶ : DOWN Angular Z'
            print
    
        def timerCallback(self, event):
            twist = Twist()
            eventlist = pygame.event.get()
    
            # イベント処理
            for e in eventlist:
                if e.type == QUIT:
                    return
                # スティックの処理
                if e.type == pygame.locals.JOYHATMOTION:
                    self.button_cnt += 1
                    self.joystickx, self.joysticky = self.joystick0.get_hat(0)
                    print 'linear x:' + str(-self.joystickx * self.coff_linearx) + ', angular z:' + str(-self.joysticky * self.coff_angularz)
                # ボタンの処理
                elif e.type == pygame.locals.JOYBUTTONDOWN:
                    self.button_cnt += 1
                    if e.button==2:
                        self.coff_linearx += 0.1
                    elif e.button==1:
                        self.coff_linearx -= 0.1
                        if self.coff_linearx <=0.1: self.coff_linearx = 0.1
                    elif e.button==0:
                        self.coff_angularz += 0.1
                    elif e.button==3:
                        self.coff_angularz -= 0.1
                        if self.coff_angularz <= 0.1: self.coff_angularz = 0.1
                    print 'linear x:' + str(self.coff_linearx) + ', angular z:' + str(self.coff_angularz)
    
            twist.linear.x  = -self.joystickx * self.coff_linearx
            twist.angular.z = -self.joysticky * self.coff_angularz
    
            self.twist_pub.publish(twist)
    
            if self.button_cnt>=10:
                print 
                print '▲ : UP Linear X,  ▼ : DOWN Linear X'
                print '◀ : UP Angular Z, ▶ : DOWN Angular Z'
                print
                self.button_cnt = 0
    
    if __name__ == '__main__':
        try:
            jc = joyconController()
            rospy.spin()
        except pygame.error:
            print 'joystickが見つかりませんでした。'
        except rospy.ROSInterruptException: pass
    


    간단히 설명



    조이콘의 입력을 취하고 있는 부분은 timerCallback 안의 e.type == *** 안이군요. 조이스틱과 버튼을 사용합니다.



    self.joystick0.get_hat(0)
    


    조이스틱의 반환값은 세로로 잡을 때 다음과 같습니다.

































    방향xy
    이전-10
    10
    오른쪽01
    왼쪽0-1



    앞으로 쓰러뜨릴 때 전진, 뒤로 쓰러뜨렸을 때 후퇴, 오른쪽으로 쓰러뜨릴 때 오른쪽 선회, 왼쪽으로 쓰러뜨릴 때 왼쪽 선회하게 되어 있습니다.




    이렇게 하려면 반환 값에 -1을 곱합니다.



    또한 조이스틱 입력의 값은 0 또는 1이므로 각 버튼 ▲▼▶◀로 속도를 조작할 수 있습니다.



    결론



    조이콘에서의 조작, 해보고 싶었기 때문에 해 보았습니다! 생각보다 간단하게 할 수 있고 해설도 칩입니다만 뭔가 있으면 추기합니다.

    수정점 등 여러가지 있으면 코멘트해 주세요.



    자숙 기간이 열리면 실험실에서 실제 로봇을 움직이고 싶다~



    참고




    좋은 웹페이지 즐겨찾기