学习使用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,一经查实,立即删除!

相关文章

山东省正规等保测评机构名称以及地址一览表

山东省正规等保测评机构名称以及地址一览表 序号&#xff1a;1 名称&#xff1a;山东新潮信息技术有限公司 地址&#xff1a;济南市二环东路东环国际广场A座2701室 序号&#xff1a;2 名称&#xff1a;联通数字科技有限公司山东省分公司 地址&#xff1a;山东省济南市市中…

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

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

Java是用什么语言写的?PHP呢?

Java底层是C语言。 Sun公司研发人员根据嵌入式软件的要求&#xff0c;对C进行了改造&#xff0c;去除了留在C的一些不太实用及影响安全的成分&#xff0c;并结合嵌入式系统的实时性要求&#xff0c;开发了一种称为Oak的面向对象语言。而后&#xff0c;经过迭代更新&#xff0c…

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

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

一些常用的正则(持续更新)

常用正则合集 1、匹配字符串中的所有标签&#xff0c;拆分字符串并且将标签作为单独一项 1、匹配字符串中的所有标签&#xff0c;拆分字符串并且将标签作为单独一项 /(<\/?.?>)/g splitStringByTags 函数接受一个参数 inputString&#xff0c;然后使用正则表达式/(&l…

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;存储的是当前元素的位置。 遍历整个…

宁波中墙建材预制混凝土模板、铝合金模板、方木有啥区别?可送奉化鄞州海曙慈溪杭州湾前湾北仑

宁波中墙建材预制混凝土模板、铝合金模板、方木有啥区别&#xff1f;可送奉化鄞州海曙慈溪杭州湾前湾北仑 预制混凝土模板、铝合金模板和方木是三种不同的建筑模板材料&#xff0c;它们各自拥有独特的特性和用途。 预制混凝土模板&#xff1a;这种模板通常是由工厂预制的混凝土…

LeetCode-热题100:34. 在排序数组中查找元素的第一个和最后一个位置

题目描述 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 1…

各种编程语言的优缺点

当谈论编程语言时&#xff0c;我们进入了一个充满激情和争议的领域。每种编程语言都有其独特的优点和局限性&#xff0c;适用于不同的场景。让我们简要评价一些主流编程语言&#xff0c;探讨它们的优缺点和应用领域。 来来来,老铁们,男人女人都需要的技术活 拿去不谢:远程调试,…

LeetCode-热题100:33. 搜索旋转排序数组

题目描述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], ..., nums[n-1], nums[0], n…

第三十四章 配置服务器访问

文章目录 第三十四章 配置服务器访问添加应用程序路径应用程序路径配置参数 第三十四章 配置服务器访问 本页介绍如何配置 网关连接的应用程序。对于这些配置任务&#xff0c;可以使用 Web Gateway 管理页面。其他文章介绍了如何配置默认设置和服务器。 每个Web 应用程序都必…

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},性别是…