问题现象

第一批买的ROS手柄存在问题:
1.不能自动关机,导致耗电量大,一天1充/2充
2.不同手柄一致性不一样,右摇杆上下方向,键值不一样

之前用过北通游戏手柄,感觉比较好用,项目中买一个无线版测试,验证.

遇到问题

1.问题1: 开发板无法识别input设备, /dev/input/jsx 枚举失败.
解决方法:ubuntu/linux 北通无线游戏手柄不识别
2.问题2: 北通游戏手柄 左右摇杆 灵敏度/频率过高

实测: 左右摇杆输出频率达到100Hz
rosrun joy joy_node
rostopic hz /joy

subscribed to [/joy]
average rate: 152.672
min: 0.001s max: 0.107s std dev: 0.01296s window: 81
average rate: 162.566
min: 0.001s max: 0.107s std dev: 0.01199s window: 241
average rate: 131.580
min: 0.001s max: 0.247s std dev: 0.02013s window: 308

尝试解决方案

1.咨询北通官方技术支持,修改灵敏度. --NG, 本款手柄不支持修改灵敏度.
2.修改joy_node参数 --OK
3.修改源码 --OK

方法1:修改joy_node参数

<launch><!--手柄控制--><node pkg="joy" name="joy_node" type="joy_node" output = "screen"><param name="coalesce_interval" value="0.2" type="double"/></node>
</launch>

代码原理:
github搜索: joystick_drivers joy github代码链接
joy_node.cpp

 nh_param.param<double>("coalesce_interval", coalesce_interval_, 0.001); #launch 修改此参数bool publish_now = false;bool publish_soon = false;int select_out = select(joy_fd+1, &set, nullptr, nullptr, &tv);if (read(joy_fd, &event, sizeof(js_event)) == -1 && errno != EAGAIN){break;  // Joystick is probably closed. Definitely occurs.}if (publish_now){// Assume that all the JS_EVENT_INIT messages have arrived already.// This should be the case as the kernel sends them along as soon as// the device opens.joy_msg.header.stamp = ros::Time().now();joy_msg.header.frame_id = joy_dev_.c_str();pub_.publish(joy_msg);publish_now = false;tv_set = false;publication_pending = false;publish_soon = false;pub_count_++;}if (!publication_pending && publish_soon){tv.tv_sec = trunc(coalesce_interval_);tv.tv_usec = (coalesce_interval_ - tv.tv_sec) * 1e6;publication_pending = true;tv_set = true;}

逻辑概要:
话题发布频率 --> select超时 -->
tv_set —> publication_pending --> publish_now --> 话题发布pub_.publish(joy_msg)

逻辑有点复杂,我是通过vscode + gdb调试, 在变量变化处加断点, 才理清逻辑.

实测结果:
rostopic hz /joy

rostopic hz /joy
average rate: 9.589
min: 0.102s max: 0.110s std dev: 0.00286s window: 6
average rate: 9.558
min: 0.101s max: 0.115s std dev: 0.00433s window: 10
average rate: 6.923
min: 0.101s max: 0.833s std dev: 0.16693s window: 19

频率限制到10Hz

方法2.其它参数尝试

修改autorepeat_rate

<launch><node pkg="joy_test" name="joy_node" type="joy_node"><param name="autorepeat_rate" value="0.1" type="doble"/></node>
</launch>
nh_param.param<double>("autorepeat_rate", autorepeat_rate_, 0);

实测结果: --NG
输出频率是10Hz, 不过由于input缓冲区问题, 停止拨动手柄摇杆, 依旧会继续输出,10s之后才停止.

方法3.自己修改源码

joy_node.cpp gitee修改代码
核心代码实现

  bool check_publish_time(){double now_time = ros::Time::now().toSec();if ((now_time - pub_time_) > pub_delay_){pub_time_ = now_time;return true;}return false;}main()
{
read_joy:if (read(joy_fd, &event, sizeof(js_event)) == -1 && errno != EAGAIN){break;  // Joystick is probably closed. Definitely occurs.}if (check_publish_time() == false)goto read_joy;
}

通过函数 check_publish_time() 检查发布时间,如果时间差小于0.1s, 继续read (清空缓冲区)

注意事项:
一定要继续read(), 清空input buffer缓冲区, 不然会出现 方法2 一样的现象, 停止拨动手柄摇杆, 继续输出.

xbox360 ps2/3模式切换方法

长按北通Logo 切换模式

总结:

  1. 目前只是限制ros topic 发布频率, 没有从根本上解决问题, 后面尝试添加sys节点, 从kernel限制频率.
  2. 运到问题,大部分还是得从源码方面解决问题, 定制需求.

我是一名ROS机器人,嵌入式开发工程师

ROS 北通游戏手柄灵敏度 频率过高, xbox360/ ps2/3模式切换问题相关推荐

  1. 华为定制版北通游戏手柄上手体验,享受大屏视听盛宴冲击,嗨爆了

    家庭娱乐,亲子游戏,先锋最喜欢在大屏玩,尤其是去年换了华为智慧屏后,那画质和音质在游戏场景中真的是爽爆.每逢周六.日或假期,每天都会安排个把小时,给我家调皮蛋释放一下学习的压力,先锋觉得合理安排,让孩 ...

  2. orangepi rk3588开发板 北通游戏手柄只枚举出/dev/input/eventx, 没有js0

    现象 在orangepi5 3588平台上,北通游戏手柄不能识别出 /dev/input/jsx设备 查看usb设备 lsusb Bus 001 Device 004: ID 045e:028e Mi ...

  3. Python---将一字符串转换为字典,并按词语出现的频率由高到低进行排列。

    题目: 将一字符串转换为字典,并按词语出现的频率由高到低进行排列 . 源代码如下: import re x = input('请输入:') #将输入内容转换为字符串类型 x_str1 = str(x) ...

  4. CPU主频频率越高,手机运行速度就越快吗?

    本文链接:https://blog.csdn.net/openkado/article/details/24087305 问:CPU频率越高,手机速度就越快吗?1.7GHz处理器的手机肯定比1.2GH ...

  5. tensorflow没有这个参数_内存频率越高越好?如果不看这个参数,内存频率再高也没有用...

    Hello大家好,我是兼容机之家的小牛! 内存是我们装机时候必不可少的重要部件之一,和CPU相似,内存的主要参数也是频率.可以简单的理解为,频率越高,内存的运行速度就越快,通常内存频率是以MHz为计算 ...

  6. 关于为什么频宽越大传输越快 、 频率越高传输距离越短

    关于为什么频宽越大传输越快 . 频率越高传输距离越短 频宽可以理解为水管,通常网络传输中越快的意思是单位时间内数据的吞吐量越大表示越快,频宽越宽水管越大,在同等流速情况下,水管越大的在单位时间内流出的 ...

  7. 【软件工程】统计文章字数和出现频率较高词汇的程序实现

    代码功能: 能够实现统计所给任意段落单词的总数和排序频率较高词汇的功能. 文章字数不限,高频词汇取前十个. 编程语言:c语言 具体代码: // 字数统计_1.cpp : Defines the ent ...

  8. 宝塔linux shell定时访问url,bt(宝塔)面板添加shell 脚本通过nginx日志封访问频率过高的IP...

    额,这篇文章是bt(宝塔)面板来写的文章,其他的程序如果是wdcp管理面板也有添加shell脚本的功能,大鸟自己用的是bt(宝塔)面板,所以说说如何添加shell 脚本通过nginx日志封访问频率过高 ...

  9. c# winform 实现北通 游戏手柄 游戏摇杆二次开发 包含视觉头盔

    c# winform 游戏手柄的二次开发,包含视觉头盔 基础实现 视觉头盔的数据如何获取 如何移植代码到自己的项目中 基础实现 在之前的文章中,描述了如何使用摇杆获取xyz轴坐标,以及游戏手柄的按键. ...

最新文章

  1. 微信小程序 文字居中
  2. 利用python爬虫(part7)--初识Xpath之Node节点
  3. Java中key可以重复的Map集合:IdentityHashMap
  4. 控制元素显示和隐藏的方式及区别、内容溢出处理(区域滚动)、透明性、字体图标、常见字体、自定义字体设计、网站图标、CSS代码分析
  5. SWT实现Text输入自动提示
  6. 5h Oralcle进阶直播课,限时免费报名,手慢无!
  7. linux yum c 11,CentOS YUM源安装 GVM-11 (一)
  8. 如何在ASP.NET Core中上传文档
  9. jquerymobile入门(文件引用+多页面)
  10. 200. 岛屿数量 leetcode
  11. android查看cpu型号_笔记本电脑cpu处理器怎么看?
  12. uni-app引入阿里Icon 图标方式(CustomIcon 扩展自定义图标库)
  13. linux下使用libxml2库,解析xml文件
  14. 思科模拟器EVE-NG如何导入镜像
  15. 树莓派4B之ubuntu系统配置UART
  16. 网站服务器发生故障,全国DNS服务器发生故障
  17. html中文本框的透明度,jQuery实现textarea文本框半透明文本提示效果
  18. python库——未完待续,紫薯布丁
  19. app和wap手机网站的区别在那里
  20. 6G网络潜在关键技术研究综述

热门文章

  1. Android 7.0新特性“Nougat”(牛轧糖)。
  2. vue之el-form实现常用表单验证规则定义【比如:用户名、密码、身份证号、邮箱号,手机号,车牌号、ip地址等】|亲测有效,建议收藏
  3. 鬼谷子入门(如何学习鬼谷子)
  4. 1.23 C语言 2022.8.23
  5. “无人驾驶汽车”已无法满足人类 中国正在试验“无人驾驶高铁”
  6. Android Studio 的一些 常用操作和 编译报错 整理(持续更新中...)
  7. 日历控件FullCalendar中文API
  8. 《Web GIS原理与应用开发》读书笔记(7)
  9. TensorFlow架构与设计:OP本质论
  10. 用python画玫瑰花 表白浪漫