微软Xbox One无线手柄控制机器人
ROS中的joy包提供了游戏手柄的驱动,并且包含joy_node节点,这一节点可以发布包含手柄按钮和轴信息的Joy消息。在终端中输入下面命令,安装joy包:
$ sudo apt-get install ros-kinetic-joy
Configuring the Joystick
安装好之后,将用USB线将手柄连上电脑,然后输入下面指令看看Linux能否找到设备:
$ ls /dev/input/
通常会输出下面类似的信息:
by-id event0 event2 event4 event6 event8 mouse0 mouse2 uinput
by-path event1 event3 event5 event7 js0 mice mouse1
游戏手柄的名字一般为jsX,这里我们的手柄为js0,可以使用jstest命令来测试手柄:
$ sudo jstest /dev/input/js0
按下手柄上不同的按钮或者移动摇杆,可以看到相应数据发生变化:
接下来要让ROS节点joy_node能获取手柄信息,先列出手柄的权限( ls -l: 以长格式的形式查看当前目录下所有可见文件的详细属性):
$ ls -l /dev/input/js0
将会看到下面类似的输出:
crw-rw-XX- root dialout , -- : /dev/input/jsX
如果XX为rw,表示js设备配置正确;如果XX为--表示设备没有配置正确,需要添加权限:
$ sudo chmod a+rw /dev/input/js0
Starting the Joy Node
为了能发布joy消息我们需要运行joy_node节点,并且指定设备名,默认为js0(tell the joy node which joystick device to use the default is js0):
$ roscore
$ rosparam set joy_node/dev "/dev/input/js0"
然后就可以运行joy_node节点:
$ rosrun joy joy_node
如果运行成功,端中会显示下面的信息:
[ INFO] [1513180661.775001483]: Opened joystick: /dev/input/js0. deadzone_: 0.050000.
打开一个新终端,输入下面命令查看具体的joy消息:
$ rostopic echo joy
sensor_msgs/Joy消息格式如下:
# Reports the state of a joysticks axes and buttons.
Header header # timestamp in the header is the time the data is received from the joystick
float32[] axes # the axes measurements from a joystick
int32[] buttons # the buttons measurements from a joystick
蓝牙无线连接
打开Ubuntu16.04的蓝牙,查找到Xbox Wireless Controller后进行连接:
不过在连接过程中遇到了一些问题,蓝牙一连上就掉了。下面这个方法可以解决这一问题:
1. install
sudo apt install sysfsutils
2. 以管理员权限用gedit打开sysfs.conf文件
sudo gedit /etc/sysfs.conf
3. 在文件中加入下面一行:
module/bluetooth/parameters/disable_ertm =
4. 保存文件然后重启电脑。开机后再次连接:
待手柄上的指示灯常亮,用ls命令查看设备,可以看出js0已经安装好:
测试与校准
JStest is a simple and useful tool that you can use to calibrate your controllers’ axis.
sudo apt-get install jstest-gtk
输入下面命令打开jstest的GUI界面,选择已经连接上的Xbox One手柄
$ jstest-gtk
点击Properties属性按钮,可以进行手柄测试:
Writing a Teleoperation Node for a Linux-Supported Joystick
在工作空间中创建一个测试package:
$ cd ~/catkin_ws/src
$ catkin_create_pkg learning_joy roscpp turtlesim joy
$ cd ~/catkin_ws/
$ catkin_make
然后在package的src文件夹中创建turtle_teleop_joy.cpp源文件
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
#include <sensor_msgs/Joy.h> // create the TeleopTurtle class and define the joyCallback function that will take a joy msg
class TeleopTurtle
{
public:
TeleopTurtle(); private:
void joyCallback(const sensor_msgs::Joy::ConstPtr& joy); ros::NodeHandle nh_; int linear_, angular_; // used to define which axes of the joystick will control our turtle
double l_scale_, a_scale_;
ros::Publisher vel_pub_;
ros::Subscriber joy_sub_; }; TeleopTurtle::TeleopTurtle(): linear_(), angular_()
{
// initialize some parameters
nh_.param("axis_linear", linear_, linear_);
nh_.param("axis_angular", angular_, angular_);
nh_.param("scale_angular", a_scale_, a_scale_);
nh_.param("scale_linear", l_scale_, l_scale_); // create a publisher that will advertise on the command_velocity topic of the turtle
vel_pub_ = nh_.advertise<geometry_msgs::Twist>("turtle1/cmd_vel", ); // subscribe to the joystick topic for the input to drive the turtle
joy_sub_ = nh_.subscribe<sensor_msgs::Joy>("joy", , &TeleopTurtle::joyCallback, this);
}
void TeleopTurtle::joyCallback(const sensor_msgs::Joy::ConstPtr& joy)
{
geometry_msgs::Twist twist; // take the data from the joystick and manipulate it by scaling it and using independent axes to control the linear and angular velocities of the turtle
twist.angular.z = a_scale_*joy->axes[angular_];
twist.linear.x = l_scale_*joy->axes[linear_];
vel_pub_.publish(twist);
} int main(int argc, char** argv)
{
// initialize our ROS node, create a teleop_turtle, and spin our node until Ctrl-C is pressed
ros::init(argc, argv, "teleop_turtle");
TeleopTurtle teleop_turtle; ros::spin();
}
在CMakeLists中加入下面这两行:
add_executable(turtle_teleop_joy src/turtle_teleop_joy.cpp)
target_link_libraries(turtle_teleop_joy ${catkin_LIBRARIES})
按照前面的操作连接并配置好手柄以后,在learning_joy目录下新建一个launch文件夹并在其中创建turtle_joy.launch文件(注意joystick设备名称要写对):
<launch>
<!-- Turtlesim Node-->
<node pkg="turtlesim" type="turtlesim_node" name="sim"/> <!-- joy node -->
<node pkg="joy" type="joy_node" name="turtle_joy" respawn="true">
<param name="dev" type="string" value="/dev/input/js0" />
<param name="deadzone" value="0.12" />
</node> <!-- Axes -->
<param name="axis_linear" value="1" type="int"/>
<param name="axis_angular" value="0" type="int"/>
<param name="scale_linear" value="2" type="double"/>
<param name="scale_angular" value="2" type="double"/>
<node pkg="learning_joy" type="turtle_teleop_joy" name="teleop"/>
</launch>
编译好之后执行下面的命令,可以开启3个节点(turtlesim_node海龟仿真节点、joy_node发布手柄消息节点、turtle_teleop_joy订阅手柄消息并发布turtle1/cmd_vel消息节点),实现用手柄控制海龟运动:
roslaunch learning_joy turtle_joy.launch
用手柄上的左摇杆(下图中的1)来控制海龟:Up/Down Axis控制前进和后退;Left/Right Axis控制左转和右转
参考:
如何将 Xbox One 无线控制器连接到 Windows PC
Get to know your Xbox One Wireless Controller
How to Set Up an Xbox One Controller in Ubuntu
How do I get an Xbox One controller to work with 16.04
Configuring and Using a Linux-Supported Joystick with ROS
Writing a Teleoperation Node for a Linux-Supported Joystick
微软Xbox One无线手柄控制机器人的更多相关文章
- ROS中测试机器人里程计信息
在移动机器人建图和导航过程中,提供相对准确的里程计信息非常关键,是后续很多工作的基础,因此需要对其进行测试保证没有严重的错误或偏差.实际中最可能发生错误的地方在于机器人运动学公式有误,或者正负号不对, ...
- 百视通与微软共同宣布9月在华发布Xbox One
4月30日消息,百视通今日与微软共同宣布,于今年9月在华发布Xbox One.这是继百视通与微软2013年9月成立合资公司后,双方合作的又一进展. 微软副总裁,硬件及设计工作室部门主管尤瑟夫 •梅赫迪 ...
- XBox 开发者大会
今天参加了微软的Xbox开发者大会,虽然没我什么事情,不过还是有不少的收获,随便说说自己的一点感受吧. 先上几张图,附带妹子一个,不过手机不清楚哈,~~ 1 ID@XBOX开发者计划与独立游戏开发者 ...
- ID@Xbox计划宣传片 XboxOne喜迎大波小游戏(转)
微软Xbox One游戏不够多?别担心,微软的ID@Xbox计划将带来一大波独立游戏!微软在今天正式公布了即将登陆旗下的Xbox One主机平台的独立游戏阵容,数量多达32款,官方的宣传片也已放出,感 ...
- 无线手柄+步进电机——控制方向
今天测试了一下无线手柄控制电机转向的改变 1: #include <PS2X_lib.h> //for v1.6 2: #include <Stepper.h> 3: 4: ...
- 疫情之下微软收入猛增15%!远程办公产品Teams日活达7500万
当地时间 2020 年 4 月 29 日,微软公布了截止 2020 年 3 月 31 日的 2020 财年第三季度财报. 这是微软首次在财报中显示新冠疫情的影响——疫情之下,远程办公.远程教育和游戏场 ...
- 微软和Google的盈利模式对比分析
一: 微软和Google是世界上最成功科技巨头之一,但他们之间却有着不同的产品和业务,二者的盈利方式也各有不同,本文将分析和探讨的二者盈利模式的异同. 微软的盈利模式 在1975年由大学肄业的Bill ...
- Android零基础入门第1节:Android的前世今生
原文:Android零基础入门第1节:Android的前世今生 现在网上有很多各色Android资料了,但相对来说还是比较零散,Android覆盖的范围极广,最近刚好有机会全部拉通整理一遍,也保存起来 ...
- 游戏引擎架构 (Jason Gregory 著)
第一部分 基础 第1章 导论 (已看) 第2章 专业工具 (已看) 第3章 游戏软件工程基础 (已看) 第4章 游戏所需的三维数学 (已看) 第二部分 低阶引擎系统 第5章 游戏支持系统 (已看) 第 ...
随机推荐
- Eclipse国内镜像源配置方法
Table of Contents 我们在国内从官网下载Eclipse以及插件非常慢,那么,有没有方法变快呢? 有,那就是使用国内的公开镜像源替换官方源. 1 下载Eclipse 首先,我们看一个链接 ...
- wim2008 让FTP防火墙可用性配置
转: Win2003和Win2008防火墙导致FTP服务器不能访问的解决方法 这篇文章主要介绍了Win2003和Win2008防火墙导致FTP服务器不能访问的解决方法,需要的朋友可以参考下 由于通过远 ...
- C/C++log日志库比较
事实上,在C的世界里面没有特别好的日志函数库(就像Java里面的的log4j,或者C++的log4cxx).C程序员都喜欢用自己的轮子.printf就是个挺好的轮子,但没办法通过配置改变日志的格式或者 ...
- GIST特征描述符使用
来源:http://www.cnblogs.com/justany/archive/2012/12/06/2804211.html 一种场景特征描述 场景特征描述? 通常的特征描述符都是对图片的局部特 ...
- Latex使用的注意事项
CTEX : CTeXDownload latex中的图片格式主要就2种 pdf 和 eps.如果要用pdflatex编译,那么自然选择pdf,如果用latex编译,自然用eps.本人论文中的图片来源 ...
- 读书笔记,《Java 8实战》,第三章,Lambda表达式
第一节,Lambda管中窥豹 可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式,它没有名称,但它有参数列表.函数主题和返回值. 本节介绍了Lambda表达式的语法,它包括 ...
- Python3 简单验证码识别思路及实例
1.介绍 在爬虫中经常会遇到验证码识别的问题,现在的验证码大多分计算验证码.滑块验证码.识图验证码.语音验证码等四种.本文就是识图验证码,识别的是简单的验证码,要想让识别率更高, 识别的更加准确就需要 ...
- AOP在大规模软件开发项目中的应用(图)
AOP在大规模软件开发项目中的应用(图) 本文的写作源于一个真实的大型软件开发项目,我们努力尝试在这个项目中推广应用AOP.在此我们将对曾经面临过的一些实际问题与困难进行分析,试图引发关于面向方面软件 ...
- Android版-微信APP支付
首发地址: Android版-微信APP支付 欢迎留言.转发 微信极速开发系列文章(微信支付.授权获取用户信息等):点击这里 目录 1.注册账号.开发者认证 2.添加应用 3.申请微信支付 4.技术开 ...
- .NET 托管、非托管、本地:这些代码有什么区别?
http://www.codeguru.com/Csharp/.NET/cpp_managed/article.php/c4871 本文内容 什么是托管代码? 什么是非托管代码? 什么是本地代码? 托 ...