1. 程式人生 > >通過遊戲手柄控制機器人(ROS,Twist)

通過遊戲手柄控制機器人(ROS,Twist)

1.適配與測試遊戲手柄

首先把手柄插入主機,一般來說可以通過檢查/dev/input檢視,裡面js#的裝置一般就是手柄了

ls /dev/input/

然後使用jstest,安裝的話sudo apt-get install就好,使用jstest的語句如下:

sudo jstest /dev/input/jsX
X為之前js#的字尾數字,根據數字不同,可以檢測不同的手柄。

最後要記得檢查一下手柄裝置的許可權,需要的許可權是讀和寫,需要新增的話命令如下:

sudo chmod a+rw /dev/input/jsX
2.安裝joy ROS包

接下來安裝ROS的joy包

sudo apt-get install ros-ROS版本-joy
啟動joy節點之前要先設定一下這個節點所讀取的手柄裝置:
rosparam set joy_node/dev "/dev/input/jsX"
然後開啟joy節點
rosrun joy joy_node
如果能通過rostopic list看到joy主題,並通過echo看到內容的話就成功了

3.程式碼

原作者是:Andrew Dai

#!/usr/bin/env python
import rospy
from geometry_msgs.msg import Twist
from sensor_msgs.msg import Joy

def callback(data):
	twist = Twist()
	twist.linear.x = data.axes[1]
	twist.angular.z = data.axes[0]
        print('speed: %.2f, turn: %.2f'%(twist.linear.x,twist.angular.z))
        if data.buttons[2]==1:
             twist.linear.x = 0
             twist.angular.z = 0
             print("STOP!!")
	pub.publish(twist)

# Intializes everything
def start():
	# publishing to "cmd_vel" to control turtle1
	global pub
	pub = rospy.Publisher('cmd_vel', Twist)
	# subscribed to joystick inputs on topic "joy"
	rospy.Subscriber("joy", Joy, callback)
	# starts the node
	rospy.init_node('Joy2Turtle')
	rospy.spin()

if __name__ == '__main__':
	start()
從joy主題內獲取手柄的資訊,其中
twist.linear.x = data.axes[1]
twist.angular.z = data.axes[0]
獲取了手柄搖桿的資訊,並直接填入twist資訊裡面。我這裡直接填進去了,需要的話可以對數值進行調整,以免跑的太快
data.buttons[2]
獲取了手柄上X鍵的資訊,如果按下的話就會立即停止機器人的運動

最後釋出twist資訊,將控制命令傳給機器人

4.Launch File

自己寫的一個launch檔案,為了啟動的時候方便一點

<launch>
  <arg name="joy_dev" default="/dev/input/js0" />

  <node pkg="joy" type="joy_node" name="joy_node">
    <param name="dev" value="$(arg joy_dev)" />
    <param name="deadzone" value="0.3" />
    <param name="autorepeat_rate" value="20" />
  </node>

  <node pkg="joytwist" type="joytwist.py" name="joytwist" output="screen"/>

</launch>
啟動命令
roslaunch joyetwist joytwist.launch
然後就可以愉快的用手柄控制烏龜了,比自帶的鍵盤teleop舒服太多了


最後吐個槽,編輯器好難用(╯°Д°)╯文字的格式和大小老是不對勁,行距也時常出問題。。。是不是該學習一下那個markdown,感覺挺高階的樣子呢。。。