微软Xbox One无线手柄控制机器人

2023-11-09

 

  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- 1 root dialout 188, 0 2009-08-14 12:04 /dev/input/jsX
  c表示该文件是一个字符设备文件(character),一般置于/dev目录下,一次传输一个字节的设备被称为字符设备,如键盘、字符终端等,传输数据的最小单位为一个字节。r代表具有可读权限;w代表具有可写权限;x代表具有可执行权限,- 代表无权限。其中前三个表示文件属主的权限,中间三个表示组用户权限,最后三个表示其他用户权限。

   如果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 = 1

  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_(1), angular_(2)
{
  //  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", 1);

  // subscribe to the joystick topic for the input to drive the turtle
  joy_sub_ = nh_.subscribe<sensor_msgs::Joy>("joy", 10, &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控制左转和右转

 

 

 

 

参考:

joy

teleop_twist_joy

WIN10怎样校准和设置游戏手柄

如何将 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微软Xbox One无线手柄控制机器人 的相关文章

随机推荐

  • 国家大力发展集成电路,是否意味着微电子行业在中国前景可以?

    集成电路是信息化 数字化的基石 是全球信息产业的基础 用于通信 安防 军事 工业 交通 消费电子等领域 现在的消费电子 互联网 数字图像 网络通信 云计算 大数据 人工智能发展都得靠它 而在国家安全 经济 日常生活中是不可或缺的 如果是这种
  • 前端笔试题

    目录 1 选择器的优先级 从上往下依次降低 是 2 下述有关 border none 以及 border 0 的区别 描述错误的是 3 关于a元素 以下说法正确的有 4 History对象的属性或方法描述正确的是 5 在HTML5中 为in
  • Matlab中的点数据生成图

    目录 简单的背景介绍 尝试plot3 构造矩阵 遍历填充 无优化版遍历填充 优化后的遍历填充 简单的背景介绍 今天蠢师弟用comsol导出了一个模拟数据 用matlab打开一看是一个数据长度 189739 3 189739 3 189739
  • 嵌入式物联网毕业设计选题智能图像识别项目-stm32mp157 linux开发板

    stm32mp157开发板FS MP1A是华清远见自主研发的一款高品质 高性价比的Linux 单片机二合一的嵌入式教学级开发板 开发板搭载ST的STM32MP157高性能微处理器 集成2个Cortex A7核和1个Cortex M4 核 A
  • R语言第八次课堂小测 rattle的应用(包括rattle的安装)

    题目 安装rattle 并使用rattle 用三种聚类方法对鸢尾花数据集进行聚类 步骤一 修改镜像源 首先 在Rstudio上打开如下界面 进入后 找到packages 再点击change 下图是已经更换了的截图 选择中国的任意一个镜像 最
  • ./configure之后报错

    首先要看报的错误是什么 一般从第一条开始解决 因为有可能下面的错误是由上面的导致的
  • js 判断变量类型(完整版),包括ES6 新类型Symbol

    欢迎来到Altaba的博客 相信大家在开发中遇到需要判断变量类型的问题 js变量按存储类型可分为值类型和引用类型 值类型包括Undefined String Number Boolean 引用类型包括object Array Functio
  • 股票和期货的区别(股指期货1个点赚多少钱)

    股票和期货的辨别 股票的最后含意即是说不妨表明你购置了这家公司的股子 而期货 则是买卖两边按照各自对目标物的将来价钱预期 以此刻的价钱签署的合约 观念既是仍旧领会了 那咱们就再领会一下这几个的辨别 1 目标物 目标物也即是买卖东西 菜商场里
  • 【深度学习】SETR:基于视觉 Transformer 的语义分割模型

    Visual Transformer Author louwill Machine Learning Lab 自从Transformer在视觉领域大火之后 一系列下游视觉任务应用研究也随之多了起来 基于视觉Transformer的语义分割正
  • OpenMMLab AI实战营第二期(2)MMPose初体验

    根据MMPose的官方文档学习一下 MMPose文档地址 https mmpose readthedocs io zh CN latest index html 文章目录 1 概述 2 安装 2 1 创建conda环境并激活 2 2 安装p
  • mysql锁

    想要了解锁 必须要知道mysql事务 以及mysql事务产生的并发问题 数据库中的事务 隔离级别 以及数据展示 華同学 的博客 CSDN博客 1 Mysql锁的介绍 锁是计算机协调多个线程或进程并发访问某一资源的机制 除传统的计算机资源 C
  • sentencepiece原理与实践

    1 前言 前段时间在看到XLNET Transformer XL等预训练模式时 看到源代码都用到sentencepiece模型 当时不清楚 经过这段时间实践和应用 觉得这个方法和工具值得NLP领域推广和应用 今天就分享下sentencepi
  • Vscode + php + xdebug 单步调试

    1 确认xdebug已打开 php ini xdebug remote enable 1 xdebug remote autostart 1 xdebug remote host localhost xdebug remote port 9
  • win32汇编基础概念

    一 关于寄存器 寄存器有EAX EBX ECX EDX EDI ESI ESP EBP等 似乎IP也是寄存器 但只有在CALL RET在中会默认使用它 其它情况很少使用到 暂时可以不用理会 EAX是WIN32 API 默认的返回值存放处 E
  • 深入理解机器学习与极大似然之间的联系

    似然函数 事件A的发生含着有许多其它事件的发生 所以我就把这些其它事件发生的联合概率来作为事件A的概率 也就是似然函数 数据类型的不同 离散型和连续性 就有不同的似然函数 极大似然极大似然估计方法 Maximum Likelihood Es
  • sqli-labs:less-27(过滤select和union)

    div div
  • eosjs v20 如何通过jsonrpc连接到主网节点

    用eosjs连接主网节点很简单 只需要在创建JsonRpc对象时 指定要连接主网节点的地址 就可以了 例如 下面的代码将创建一个使用eosnewyork io节点RPC旳JsonRpc 对象 然后使用get info 方法获取网络总体信息
  • 拆分Nim游戏

    拆分Nim游戏 给定n堆石子 两位玩家轮流操作 每次操作可以取走其中的一堆石子 然后放入两堆规模更小的石子 新堆规模可以为0 且两个新堆的石子总数可以大于取走的那堆石子数 最后无法进行操作的人视为失败 问如果两人都采用最优策略 先手是否必胜
  • 顺序主子式

    设有矩阵 a b c d e f g h i 则 一阶顺序主子式 a 二阶顺序主子式 a b d e 三阶顺序主子式 a b c d e f g h i 若n阶方阵A的顺序主子式均 0 则A的LU分解A LU存在且唯一 转载于 https
  • 微软Xbox One无线手柄控制机器人

    ROS中的joy包提供了游戏手柄的驱动 并且包含joy node节点 这一节点可以发布包含手柄按钮和轴信息的Joy消息 在终端中输入下面命令 安装joy包 sudo apt get install ros kinetic joy Confi