Nintendo Switch의 조이콘 (L)을 ROS의 컨트롤러로 사용
소개
Switch 조이콘에서 ROS /cmd_vel
주제로 보낼 수있는 노드를 만들었습니다.
조이스틱을 앞으로 쓰러뜨릴 때 전진, 뒤로 쓰러뜨릴 때 후퇴, 오른쪽으로 쓰러뜨릴 때 오른쪽 선회, 왼쪽으로 쓰러뜨릴 때 왼쪽 선회하게 되어 있습니다.
환경
할 수있는 일 (동영상)
이하의 트윗이 쓰레드가 되어 버리고 있습니다. 죄송합니다. . .
조이콘의 스틱 조작에서 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"/>버튼으로 속도 변경 (teleop_twist_keyboard 이미지) 피 c. 라고 r. 코 m / c54 그 XS cB
— 이치 (@_first_blog) May 8, 2020
준비
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)
조이스틱의 반환값은 세로로 잡을 때 다음과 같습니다.
방향 | x | y |
---|---|---|
이전 | -1 | 0 |
뒤 | 1 | 0 |
오른쪽 | 0 | 1 |
왼쪽 | 0 | -1 |
앞으로 쓰러뜨릴 때 전진, 뒤로 쓰러뜨렸을 때 후퇴, 오른쪽으로 쓰러뜨릴 때 오른쪽 선회, 왼쪽으로 쓰러뜨릴 때 왼쪽 선회하게 되어 있습니다.
이렇게 하려면 반환 값에 -1을 곱합니다.
또한 조이스틱 입력의 값은 0 또는 1이므로 각 버튼 ▲▼▶◀로 속도를 조작할 수 있습니다.
결론
조이콘에서의 조작, 해보고 싶었기 때문에 해 보았습니다! 생각보다 간단하게 할 수 있고 해설도 칩입니다만 뭔가 있으면 추기합니다.
수정점 등 여러가지 있으면 코멘트해 주세요.
자숙 기간이 열리면 실험실에서 실제 로봇을 움직이고 싶다~
참고
Reference
이 문제에 관하여(Nintendo Switch의 조이콘 (L)을 ROS의 컨트롤러로 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/koichi_baseball/items/59e093211e9f6be9482f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Nintendo Switch의 조이콘 (L)을 ROS의 컨트롤러로 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/koichi_baseball/items/59e093211e9f6be9482f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)