Ubuntu环境下读取罗技G29方向盘信息

news2025/1/9 1:36:46

本篇博客最早发布于实验室公共博客,但已无人维护,现迁移至个人博客


引言

在这里插入图片描述

实验室有这么酷的驾驶设备,来了一年还没有实际操作过,早就蠢蠢欲试了,哈哈哈不过之前负责的师兄还在就一直没敢用,现在他毕业了就可以为所欲为了

之前师兄好像都是在Windows下开发的,我觉得比较麻烦而且与现有的框架感觉兼容性不高,所以还是选择了在Linux下开发

信息查看

首先要确定插入的设备哪一个是G29方向盘,下面两个命令都可以

ls /dev/input
或
dmesg

一般来说是event11js0

要查看方向盘信息,在终端输入

cat /dev/input/js0 | hexdump

输出信息如下

(base) redwall@redwall-desktop:~$ cat /dev/input/js0 | hexdump
0000000 d754 0053 0000 0081 d754 0053 0000 0181
0000010 d754 0053 0000 0281 d754 0053 0000 0381
0000020 d754 0053 0000 0481 d754 0053 0000 0581
0000030 d754 0053 0000 0681 d754 0053 0000 0781
0000040 d754 0053 0000 0881 d754 0053 0000 0981

显然没什么可读性

安装操纵杆的校准工具:jstest-gtk

sudo aptitude install jstest-gtk

建议大家熟悉使用aptitude而不是apt

安装完成后在终端运行

jstest-gtk /dev/input/js0

出现如下图形界面,方向盘信息均在图形界面中进行了显示

在这里插入图片描述

结合ROS的joy包进行开发

安装并编译相关包,在终端输入

sudo aptitude install ros-melodic-joy
sudo aptitude install ros-melodic-joystick
sudo aptitude install ros-melodic-joystick-drivers
rosdep install joy
rosmake joy

在两个终端中分别输入

roscore
rosrun joy joy_node

查看现有的话题

(base) redwall@redwall-desktop:~/catkin_ws$ rostopic list 
/diagnostics
/joy
/joy/set_feedback
/rosout
/rosout_agg

其中/joy话题包含了需要的方向盘信息,查看/joy话题的内容

(base) redwall@redwall-desktop:~$ rostopic echo /joy

输出

---
header: 
  seq: 386
  stamp: 
    secs: 1657894839
    nsecs: 565566079
  frame_id: "/dev/input/js0"
axes: [0.648137629032135, 0.0, 0.0, 0.0, 0.0, 0.0]
buttons: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
---
header: 
  seq: 387
  stamp: 
    secs: 1657894839
    nsecs: 567570108
  frame_id: "/dev/input/js0"
axes: [0.6481055021286011, 0.0, 0.0, 0.0, 0.0, 0.0]
buttons: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
---
header: 
  seq: 388
  stamp: 
    secs: 1657894839
    nsecs: 573687380
  frame_id: "/dev/input/js0"
axes: [0.6480733752250671, 0.0, 0.0, 0.0, 0.0, 0.0]
buttons: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

查看/joy话题的信息

(base) redwall@redwall-desktop:~$ rostopic info /joy
Type: sensor_msgs/Joy

Publishers: 
 * /joy_node (http://redwall-desktop:41415/)

Subscribers: None

可以看到该话题是由/joy_node节点发布的,信息的数据类型为sensor_msgs/Joy

查看sensor_msgs/Joy的消息格式

(base) redwall@redwall-desktop:~$ rosmsg show sensor_msgs/Joy
std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
float32[] axes
int32[] buttons
  • seq——消息序列
  • stamp——消息的时间戳
  • frame_id——消息的来源
  • axes——方向盘中轴的信息,以数组的形式
  • buttons——方向盘中按键的信息,以数组的形式

所以在正常使用中只要订阅该话题,并对该话题发布的消息进行解析即可获取G29方向盘的信息

编写简单的测试程序

#include <ros/ros.h>
#include <sensor_msgs/Joy.h>
#include <iostream>
using namespace std;

void steer_callback(const sensor_msgs::Joy::ConstPtr &msg)
{
    cout << "Receive control message from:" << msg->header.frame_id << endl;

    for (int i = 0; i < msg->axes.size(); ++i)
    {
        if (msg->axes[i] != 0.0)
        {
            cout << "Axis " << i << " is not zero!" << endl;
            cout << "Axis " << i << " value:" << msg->axes[i] << endl;
        }
    }

    for (int i = 0; i < msg->buttons.size(); ++i)
    {
        if (msg->buttons[i] != 0.0)
        {
            cout << "Button " << i << " is not zero!" << endl;
            cout << "Button " << i << " value:" << msg->axes[i] << endl;
        }
    }
    cout << endl;
}

int main(int argc, char *argv[])
{
    ros::init(argc, argv, "logitech_steer");
    ros::NodeHandle nh;

    ros::Subscriber sub = nh.subscribe("/joy", 1, steer_callback);

    ros::spin();

    return 0;
}

编写简单的launch文件

<?xml version="1.0"?>
<launch>
    <node pkg="joy" type="joy_node" name="joy_node" output="screen" />

    <node pkg="steer_test" type="steer_test" name="steer_test" output="screen" />       
</launch>

运行输出

(base) redwall@redwall-desktop:~/catkin_ws$ roslaunch steer_test steer_test.launch 
... logging to /home/redwall/.ros/log/dbe33e8e-043a-11ed-a8dc-000babe43e9a/roslaunch-redwall-desktop-20515.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://redwall-desktop:46371/

SUMMARY
========

PARAMETERS
 * /rosdistro: melodic
 * /rosversion: 1.14.13

NODES
  /
    joy_node (joy/joy_node)
    steer_test (steer_test/steer_test)

ROS_MASTER_URI=http://localhost:11311

process[joy_node-1]: started with pid [20547]
process[steer_test-2]: started with pid [20548]
[ WARN] [1657895770.683714324]: Couldn't set gain on joystick force feedback: Bad file descriptor
[ INFO] [1657895770.685046029]: Opened joystick: /dev/input/js0. deadzone_: 0.050000.
Receive control message from:/dev/input/js0
Axis 0 is not zero!
Axis 0 value:0.648041

Receive control message from:/dev/input/js0
Axis 0 is not zero!
Axis 0 value:0.648009

Receive control message from:/dev/input/js0
Axis 0 is not zero!
Axis 0 value:0.647977

Receive control message from:/dev/input/js0
Axis 0 is not zero!
Axis 0 value:0.647945

确定按键与轴的对应关系

方向盘axes[0]
离合axes[1]
刹车axes[3]
油门axes[2]
左拨片buttons[5]
右拨片buttons[4]
红色圆环包围的回车键buttons[23]
加号键buttons[19]
减号键buttons[20]
方向上下键axes[5]
方向左右键axes[4]
L2键buttons[7]
L3键buttons[11]
R2键buttons[6]
R3键buttons[10]
  • axes数组中数据的范围在[-1,1],将[-32767,32767]进行了归一化
  • buttons数组中的值只有0和1,可以认为是一个布尔量,按一下则变为true
  • 方向盘顺时针为正,逆时针为负
  • 油门、离合、刹车抬起时为-1,踩下时为1
  • 方向上键为-1,下键为1,与正常印象中的相反,这和罗技手柄倒是一致的
  • 方向左键为-1,右键为1,同样与正常印象中的相反

参考博客

罗技G29方向盘linux下的开发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/680590.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

rust abc(2): 从 hello world 到整数、浮点类型

文章目录 1. 目的2. 搞懂 hello world2.1 代码2.2 fn 的含义2.3 main() 的含义2.4 println! 的含义2.5 行尾分号是必要的吗&#xff1f;2.6 左花括号可以放下一行吗&#xff1f; 3. 数据类型的例子3.1 代码3.2 rust 的注释3.3 编译运行结果3.4 基本数据类型 4. 整数类型的例子4…

SpringMVC系列-3 拦截器

背景 本文作为 SpringMVC系列 的第三篇&#xff0c;以SpringMVC系列-2 HTTP请求调用链为基础&#xff0c;介绍Spring MVC的拦截器。 1.拦截器 SpringMVC的核心实现是DispatcherServlet&#xff0c;本质是一个Servlet实现类&#xff0c;拦截器位于DispatcherServlet逻辑中&am…

MySQL进阶SQL语句2之表连接

目录 1.连接查询 1.1inner&#xff08;内连接&#xff09; 1.2left join&#xff08;左连接&#xff09; 1.3right join&#xff08;右连接&#xff09; 1.4直接查询两个表相同的字段值的数据 2. VIEW&#xff08;视图&#xff09; 2.1create view&#xff08;创建视图…

设计模式之迭代器模式笔记

设计模式之迭代器模式笔记 说明Iterator(迭代器)目录迭代器模式示例类图学生类抽象迭代器角色接口具体迭代器角色类抽象聚合角色接口具体聚合角色类测试类 说明 记录下学习设计模式-迭代器模式的写法。JDK使用版本为1.8版本。 Iterator(迭代器) 意图:提供一种方法顺序访问一…

Python2、3下载安装、环境配置和Python2、3版本共存配置

一、python 版本简介 python 包括 python2、python3 两个大版本&#xff0c;其中 python3 改进了 python2 的一些不足&#xff0c;但由于以前很多应用是用 python2 开发的&#xff0c;维护这些应用还需用到 python2&#xff0c;故 python2 尚未被完全淘汰。 北京时间 2020 年 4…

近期参与开源的心得体会

引言 最近随着Kepler项目加入CNCF sandbox&#xff0c;写一篇blog来记录下参与这个项目半年的发展的心得体会。 运营 项目的运营最好还是专注于项目自身的发展&#xff0c;围绕项目的特点&#xff0c;创新点入手&#xff0c;为大家提供价值&#xff0c;从而自然而然的扩大自…

【计算机网络】计算机网络期末自测题(一)答案

2019-2020 学年第 2 学期自测题答案及评分标准 (卷 1) 计算机网络 一、 填空题&#xff1a; 参考答案&#xff1a; 1 、 01000101 、11100111 3 、 100Mbps、双绞线、基带、全双工 [10Mbps 要求单位] 4 、 报文 5 、 ICMP 6 、 虚电路 7 、 距离矢量、链路状态 …

什么是网络安全?

文章目录 一、概述1.1 网络安全的指标1.2 网络安全的特征 二、网络安全威胁2.1 黑客能破坏的2.2 Internet安全手段2.2.1 端口扫描2.2.2 分组嗅探sniffing2.2.3 IP欺骗Spoofing 2.3 Internet安全威胁2.3.1 DOS拒绝服务 三、密码学3.1 对称加密算法3.1.1 传统加密3.1.2 现代加密技…

Redis(七):Redis基础入门

Redis基础入门 Redis用途Redis优缺点docker运行RedisRedis常用命令String命令Hash命令List命令Set命令ZSet命令全局命令 Redis事务Redis持久化机制RDBAOFRDBAOF&#xff08;默认&#xff09; Redis内存淘汰机制Redis对过期Key的处理 Redis用途 Redis是一种开源的NoSQL内存数据库…

【MySql】多版本并发控制MVCC前置知识——隐藏字段、undo日志与Read View

文章目录 3个记录隐藏列字段undo日志模拟 MVCCRead View 数据库并发的场景有三种&#xff1a; 读-读 &#xff1a;不存在任何问题&#xff0c;也不需要并发控制 读-写 &#xff1a;有线程安全问题&#xff0c;可能会造成事务隔离性问题&#xff0c;可能遇到脏读&#xff0c;幻读…

UOS系统下搭建qtcreator编译环境

文章目录 前言一、依赖包说明二、No valid kits found 问题现象三、No valid kits found 问题解决1.查找qt安装路径2.设置Qt Versions3.构建套件&#xff08;kit&#xff09;下选择Qt版本4.重新添加工程 前言 本文记录了在UOS系统下如何安装qtcreator以及涉及的依赖包安装&…

冷静期or跌落神坛:净水市场纠结,“易开得”们路在何方?

文丨琥珀消研社 作者丨余二 1986年11月1日&#xff0c;一场火灾拉开了世界三大水污染——莱茵河水污染的序幕。 是夜&#xff0c;位于瑞士巴塞尔市的桑多兹化学公司的一个化学品仓库发生火灾&#xff0c;装有约1250吨剧毒农药的钢罐爆炸&#xff0c;大火持续了4个多小时&…

SpringBoot 线上服务假死,CPU 内存正常,什么情况?

背景 开发小伙伴都知道线上服务挂掉&#xff0c;基本都是因为cpu或者内存不足&#xff0c;出现GC频繁OOM之类的情况。本篇文章区别以上的情况给小伙伴们带来不一样的服务挂掉。 还记得哔哩哔哩713事故中那场诡计多端的0吗&#xff1f; 图片 对就是这个0&#xff0c;和本次事…

团体程序设计天梯赛-练习集L2篇③

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的普通人。 &#x1f3c0;个人主页&#xff1a;陈童学哦CSDN &#x1f4a1;所属专栏&#xff1a;PTA &#x1f381;希望各…

【golang中的变量 全局/局部/4中声明】

目录 变量变量的分析1.变量的创建的四种形式1.1总结1.2第一种 var a int 声明1.3 第二种 var a string "XXXX" 初始化1.4第三种 var a "XXXX"1.5第四种 a : XXXX 2.一次性声明多个变量3.一次初始化多个变量3.1交换值 4.全局变量--局部变量5. 声明和初始化…

Kafka生产调优源码

一、Kafka硬件配置选择 1.1 场景说明 100 万日活&#xff0c;每人每天 100 条日志&#xff0c;每天总共的日志条数是 100 万 * 100 条 1 亿条。 1 亿/24 小时/60 分/60 秒 1150 条/每秒钟。 每条日志大小&#xff1a;0.5k - 2k&#xff08;取 1k&#xff09;。 1150 条/…

算法------排序算法------冒泡排序法

介绍 冒泡排序法又称交换排序法&#xff0c;原理是从第一个元素开始&#xff0c;比较相邻元素的大小&#xff0c;如大小顺序有误&#xff0c;则对调后再进行下一个元素的比较&#xff0c;一次扫描之后可以确保最后一个元素位于正确的位置。接下来进行的第二次扫描&#xff0c;…

SSMP整合案例(5) Spring Boot整合MyBatis-Plus实现条件查询

讲完条件查询 那么 我们整个数据层的代码就写完了 可以看到 我们之前的代码 查询语句都有一个 参数 QueryWrapper 这个就是查询条件 其实 我们可以直接这样写 QueryWrapper<book> Query new QueryWrapper<>(); bookDao.selectList(Query);QueryWrapper类需要手…

Spring加载后初始化的9种方式

本文来聊一下在spring中&#xff0c;当spring 容器启动后&#xff0c;我们有几种初始化操作的方式。 目录 Spring加载后初始化的几种方式 Component和Service加构造方法 ContextRefreshedEvent事件 代码如下&#xff1a; 输出结果&#xff1a; PostConstruct 注解 代码如…

基于骨骼关键点的动作识别(OpenMMlab学习笔记,附PYSKL相关代码演示)

一、骨骼动作识别 骨骼动作识别是视频理解领域的一项任务 1.1 视频数据的多种模态 RGB&#xff1a;使用最广&#xff0c;包含信息最多&#xff0c;从RGB可以得到Flow、Skeleton。但是处理需要较大的计算量 Flow&#xff1a;光流&#xff0c;主要包含运动信息&#xff0c;处理…