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

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

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

joy/Tutorials/ConfiguringALinuxJoystick - ROS Wiki

这里我提供一下具体步骤

第一步 安装joy

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

bash 复制代码
sudo apt-get install ros-noetic-joy

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

bash 复制代码
ls /dev/input/

查看情况如下

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

bash 复制代码
sudo jstest /dev/input/js0

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

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

bash 复制代码
ls -l /dev/input/jsX

输出如下

如果XX为rw,则配置正确

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

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

bash 复制代码
sudo chmod a+rw /dev/input/jsX

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

bash 复制代码
roscore
rosparam set joy_node/dev "/dev/input/js0"

现在就可以启动joy了

bash 复制代码
rosrun joy joy_node

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

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

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

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

bash 复制代码
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,实现代码如下:

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/s
 
   n.param<double>("vel_angular",vangular,1);//默认角速度1 单位rad/s
 
   pub = 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文件的理解和改善过的代码:

cpp 复制代码
<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文件:

cpp 复制代码
  <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文件:

cpp 复制代码
cmake_minimum_required(VERSION 3.0.2)
project(input_js_control)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  geometry_msgs
  sensor_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文件即可使用左摇杆控制小乌龟移动!

相关推荐
西岸行者4 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码4 天前
嵌入式学习路线
学习
毛小茛4 天前
计算机系统概论——校验码
学习
babe小鑫4 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms4 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下4 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。4 天前
2026.2.25监控学习
学习
im_AMBER4 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J4 天前
从“Hello World“ 开始 C++
c语言·c++·学习