学习使用xbox手柄控制小乌龟节点移动

使用xbox手柄控制小乌龟,首先要下载joy功能包,发布sensor_msgs话题也就是手柄和ros通信的话题

下载的步骤就根据官方文档即可

joy/Tutorials/ConfiguringALinuxJoystick - ROS Wiki

这里我提供一下具体步骤

第一步 安装joy

首先安装对应系统版本的joy

sudo apt-get install ros-noetic-joy

连接号手柄查看手柄的接口

ls /dev/input/

查看情况如下

其中的jsX,这里是js0就是手柄的接口,接着使用如下命令查看手柄是否有数据,jsX改为对应的js0。

sudo jstest /dev/input/js0

你将看到如下情况,移动手柄按钮摇杆看到数据变化,即初步成功

现在我在将他连接到ros节点上,列出手柄权限

ls -l /dev/input/jsX

输出如下

如果XX为rw,则配置正确

如果XX为--,则没有配置正确你需要,给他权限

在这里我自己是复杂的所以我选择直接执行的chmod

sudo chmod a+rw /dev/input/jsX

如上操作后就已经成功了,让我们启动joy节点验证一下,首先,让我们告诉joy节点要使用的操纵杆设备默认为js0

roscore
rosparam set joy_node/dev "/dev/input/js0"

现在就可以启动joy了

rosrun joy joy_node

如果一切正常,你将会看到

如果你和我一样执行的chmod,有可能会看到

不用担心也是可以正常使用的

启动节点后打印查看具体话题发布的信息

rostopic echo joy

移动按键观察有输出即证明安装好了。

第二步 使用手柄控制小乌龟

以下控制程序皆来源于合工大机器人实验室博主,我只是作为一个记录,和一点程序完善

原文链接:https://blog.csdn.net/qq_34935373/article/details/87905784

要想使用手柄控制小乌龟节点运动,我们要知道

想让手柄/joy_node节点控制/turtlesim_node节点,必须创建一个节点,一边接受/joy_node节点发布的/sensor_msgs/Joy的话题消息,一边再通过话题/turtle1/cmd_vel发布消息给/turtlesim_node。这个节点就得完场消息数据的转换。

建立一个工作空间,建一个功能包input_js_control ,设置依赖为roscpp rospy std_msgs,如上,在功能包input_js_control 的src下建立用于实现订阅joy和发布给cmd_vel的cpp文件logitech.cpp,实现代码如下:

#include<ros/ros.h>#include<geometry_msgs/Twist.h>#include <sensor_msgs/Joy.h>#include<iostream>using namespace std;class Teleop{public:Teleop();private:/* data */void callback(const sensor_msgs::Joy::ConstPtr& Joy);ros::NodeHandle n; //实例化节点ros::Subscriber sub ;ros::Publisher pub ;double vlinear,vangular;//我们控制乌龟的速度,是通过这两个变量调整int axis_ang,axis_lin; //axes[]的键};Teleop::Teleop(){//我们将这几个变量加上参数,可以在参数服务器方便修改n.param<int>("axis_linear",axis_lin,1); //默认axes[1]接收速度n.param<int>("axis_angular",axis_ang,0);//默认axes[0]接收角度n.param<double>("vel_linear",vlinear,1);//默认线速度1 m/sn.param<double>("vel_angular",vangular,1);//默认角速度1 单位rad/spub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",1);//将速度发给乌龟sub = n.subscribe<sensor_msgs::Joy>("joy",10,&Teleop::callback,this);//订阅游戏手柄发来的数据} void Teleop::callback(const sensor_msgs::Joy::ConstPtr& Joy){geometry_msgs::Twist v;v.linear.x =Joy->axes[axis_lin]*vlinear; //将游戏手柄的数据乘以你想要的速度,然后发给乌龟v.angular.z =Joy->axes[axis_ang]*vangular;ROS_INFO("linear:%.3lf angular:%.3lf",v.linear.x,v.angular.z);pub.publish(v);}int main(int argc,char** argv){ros::init(argc, argv, "joy_to_turtle");Teleop teleop_turtle;ros::spin();return 0;}

在创建launch文件夹创一个launch文件input_js_control.launch集合启动所有节点:

以下是我对这个launch文件的理解和改善过的代码:

<launch><!-- roslaunch已经启动roscore --><!-- 相当于rosrun turtlesim turtlesim_node --><node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node"></node><!-- 相当于rosrun input_js_control logitech  --><node pkg="input_js_control" type="logitech" name="joy_to_turtle" output="screen"> </node><!--input axis 4,3代表右摇杆 1,0代表左摇杆 2代表左扳机 --><param name="axis_linear" value="1" type="int"/><param name="axis_angular" value="0" type="int"/><!--input vel 2,1.5 --><param name="vel_linear" value="1" type="double"/><param name="vel_angular" value="1" type="double"/><!-- 相当于rosrun joy joy_node --><node  respawn="true" pkg="joy" type="joy_node" name="joystick" >  </node></launch>

另外编译之前要配置package.xml文件和CMakeLists.txt文件

对package.xml文件:

  <buildtool_depend>catkin</buildtool_depend><build_depend>roscpp</build_depend><build_depend>rospy</build_depend><build_depend>std_msgs</build_depend><build_depend>geometry_msgs</build_depend><build_depend>sensor_msgs</build_depend><build_export_depend>roscpp</build_export_depend><build_export_depend>rospy</build_export_depend><build_export_depend>geometry_msgs</build_export_depend><build_export_depend>std_msgs</build_export_depend><build_export_depend>sensor_msgs</build_export_depend><exec_depend>roscpp</exec_depend><exec_depend>rospy</exec_depend><exec_depend>std_msgs</exec_depend><exec_depend>message_runtime</exec_depend>

对CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.0.2)
project(input_js_control)find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsgeometry_msgssensor_msgs
)catkin_package(CATKIN_DEPENDS roscpp rospy std_msgs geometry_msgs sensor_msgs
)include_directories(${catkin_INCLUDE_DIRS}
)add_executable(logitech src/logitech.cpp)add_dependencies(logitech  ${${PROJECT_NAME}_EXPORTED_TARGETS}${catkin_EXPORTED_TARGETS})target_link_libraries(logitech${catkin_LIBRARIES}
)

配置完成后编译,catkin_make之后运行launch文件即可使用左摇杆控制小乌龟移动!

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

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

相关文章

【第二部分--Python之基础】02

二、运算符与程序流程控制 1、运算符 1.1 算术运算符 算术运算符用于组织整数类型和浮点类型的数据&#xff0c;有一元运算符和二元运算符之分。 一元算术运算符有两个&#xff1a;&#xff08;正号&#xff09;和-&#xff08;负号&#xff09;&#xff0c;例如&#xff1…

SV-7041VP SIP塑料壳sip音箱支持POE供电(白色弧形)

SV-7041VP SIP塑料壳sip音箱支持POE供电 &#xff08;白色弧形&#xff09; 一、描述18123651365微信 SV-7041VP是深圳锐科达电子有限公司的一款壁挂式SIP网络有源音箱&#xff0c;具有10/100M以太网接口&#xff0c;可将网络音源通过自带的功放和喇叭输出播放&#xff0c;可…

QT的 纯代码+注释 学习笔记

QT学习笔记链接 更新到数据库操作为止..ing

微信怎么恢复聊天记录?效果惊人的3个方法

微信作为我们日常生活中最常用的即时通讯工具之一&#xff0c;承载着我们与亲友之间的重要沟通记录。然而&#xff0c;不可避免地会遇到误删聊天记录的情况&#xff0c;可能是因为手误、设备问题或其他原因。 当我们发现重要的聊天记录不见了&#xff0c;往往会感到焦虑和困扰…

题目:求和(蓝桥真题)

问题描述&#xff1a; 解题思路&#xff1a; 暴力超时&#xff0c;S变换得S a1*(a2.....an) a2*(a3....an) .... an-1*an。因此只需要求出括号内前缀和再相加求和即可。时间复杂度大大减小。 注意点&#xff1a;ans和前缀和的大小要开long long。 题解&#xff1a; #includ…

openGauss学习笔记-252 openGauss性能调优-使用Plan Hint进行调优-Scan方式的Hint

文章目录 openGauss学习笔记-252 openGauss性能调优-使用Plan Hint进行调优-Scan方式的Hint252.1 功能描述252.2 语法格式252.3 参数说明252.4 示例 openGauss学习笔记-252 openGauss性能调优-使用Plan Hint进行调优-Scan方式的Hint 252.1 功能描述 指明scan使用的方法&#…

论文:Term-Weighting Approaches in Automatic Text Retrieval翻译笔记(自动文本检索中的术语加权方法)

文章目录 论文标题&#xff1a;自动文本检索中的术语加权方法摘要1. 自动文本分析2. 词权重规范3. 术语加权实验4 推荐4.1 查询向量4.2 文档向量 论文标题&#xff1a;自动文本检索中的术语加权方法 论文链接&#xff1a;https://www.cs.colostate.edu/~howe/cs640/papers/sal…

javaWeb健康管理系统

一、引言 1.1 设计背景 紧张的工作节奏、教学和科研的压力、个人不良的工作生活习惯、以及伴随工作压力而来的家庭关系、人际关系紧张等因素使得高校群体成为慢性病的高发群体[1]。学生入学的定期体检&#xff0c;教职工人入职体检&#xff0c;以及所有学生和教职工的定期体检…

Leetcode 3.26

Leetcode Hot 100 一级目录1.每日温度 堆1.数组中的第K个最大元素知识点&#xff1a;排序复杂度知识点&#xff1a;堆的实现 2.前 K 个高频元素知识点&#xff1a;优先队列 一级目录 1.每日温度 每日温度 思路是维护一个递减栈&#xff0c;存储的是当前元素的位置。 遍历整个…

Ubuntu 下统计文件数量的命令

参考:https://blog.csdn.net/kxh123456/article/details/123811580 查看当前目录下的文件数量&#xff08;不包含子目录中的文件&#xff09; ls -l|grep "^-"| wc -l实例展示&#xff1a;如下图所示&#xff0c;当前路径下&#xff0c;有2个json文件和2个文件夹&a…

CMC学习系列 (1):EEG-EMG相干性均局限于对侧,同侧无显著相干性

CMC学习系列:EEG-EMG相干性均局限于对侧&#xff0c;同侧无显著相干性 0. 引言1. 主要贡献2. 方法和结果2.1 EEG-EMG相干谱2.2 EEG-EMG相干性地形图2.3 3种任务受影响侧与未受影响侧的一致性比较 3. 讨论和结论4. 总结欢迎来稿 论文地址&#xff1a;https://www.ahajournals.or…

函数进阶-Python

师从黑马程序员 函数中多个返回值的接收 def test_return():return 1,"hello",3x,y,ztest_return() print(x) print(y) print(z) 多种参数的使用 函数参数种类 位置参数 关键字参数 def user_info(name,age,gender):print(f"姓名是{name},年龄是:{age},性别是…

SublimtText修改远程机器文件

Sublime Text 本身并不强大&#xff0c;但是它方便使用插件扩展功能&#xff0c;所以变得很强大。今天介绍一个很实用的插件 SFTP &#xff0c;可以大大提高前端工作效率。 SFTP 安装 1. 打开 Sublime Text 2. 快捷键 shift ctrl p 键&#xff0c;呼出面板 3. 使用 Packag…

【深度学习】最强算法模型之:潜在狄利克雷分配(LDA)

潜在狄利克雷分配 1、引言2、潜在狄利克雷分配2.1 定义2.2 原理2.3 算法公式2.4 代码示例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c; 给我讲一讲LDA 小鱼&#xff1a;LDA&#xff1f; 你指的是&#xff1f; 小屌丝&#xff1a;就是算法模型的LDA啊&#xff0c; 你…

【linux深入剖析】基础IO操作 | 使用Linux库函数实现读写操作 | 文件相关系统调用接口

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 前言1.复习C文件IO相关操…

双亲委派机制总结

回顾了一下双亲委派机制&#xff0c;在这记录记录&#xff0c;下一篇会基于打破双亲委派机制来更新 1. 类加载&#xff1a; 多个java文件经过编译打包后生成可运行jar包&#xff0c;最后启动程序。首先需要通过类加载器把主类加载到JVM。主类在运行过程中如果使用到其他类&a…

【Python】搭建 Python 环境

目 录 一.安装 Python二.安装 PyCharm 要想能够进行 Python 开发&#xff0c;就需要搭建好 Python 的环境 需要安装的环境主要是两个部分&#xff1a; 运行环境: Python开发环境: PyCharm 一.安装 Python (1) 找到官方网站 (2) 找到下载页面 选择 “Download for Windows”…

最小割问题合集,最大权闭合图,最大密度子图,最小权点覆盖,最大权独立子图,OJ练习,代码详解

文章目录 零、回顾1、流网络的割2、最小割问题 一、最小割的应用1.1POJ1966 -- Cable TV Network1.1.1原题链接1.1.2思路分析1.1.3AC代码 1.2ZOJ 2676 Network Wars1.2.1原题链接1.2.2思路分析1.2.3AC代码 1.3OPTM - Optimal Marks1.3.1原题链接1.3.2思路分析1.3.3AC代码 二、最…

QML | JavaScript作用域和命名解析2

QML | JavaScript作用域和命名解析3.绑定的作用域对象 属性绑定是QML中最常见的JavaScript应用。属性绑定关联了一个JavaScript表达式的结果和对象的一个属性,该属性所归属的对象被称为绑定的作用域对象。在下面的代码中,Item对象就是一个绑定的作用域对象: ​ 绑定可以…

JavaScript Uncaught ReferenceError: WScript is not defined

项目场景&#xff1a; 最近在Visual Studio 2019上编译libmodbus库&#xff0c;出现了很多问题&#xff0c;一一解决特此记录下来。 问题描述 首先就是configure.js文件的问题&#xff0c;它会生成两个很重要的头文件modbus_version.h和config.h&#xff0c;这两个头文件其中…