ROS联合webots实战案例(三[2])使用外接手柄控制机器人

笔者设备:北通 阿修罗
一共有14个按钮和4个线性杆

1. 使用外接手柄控制小机器人

1.1 安装相关功能包

  1. 安装ROS游戏杆功能包
$ sudo apt-get install ros-melodic-joystick-drivers
  1. 首先,将手柄连接到电脑上,使用如下代码,检查手柄是否可以被识别到
$ ls /dev/input/

可以看到,js0就是手柄所创建的端口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LAZhQvrH-1610451598417)(7.jpg)]

  1. 我们可以使用jstest命令查看他的工作状态
$ jstest /dev/input/js0

Driver version is 2.1.0.
Joystick (Microsoft X-Box 360 pad) has 8 axes (X, Y, Z, Rx, Ry, Rz, Hat0X, Hat0Y)
and 11 buttons (BtnA, BtnB, BtnX, BtnY, BtnTL, BtnTR, BtnSelect, BtnStart, BtnMode, BtnThumbL, BtnThumbR).
Testing ... (interrupt to exit)
Axes:  0:     0  1:     0  2:-32767  3:     0  4:     0  5:-32767  6:     0  7:     0 Buttons:  0:off  1:off  2:off  3:off  4:off  5:off  6:off  7:off  8:off  9:off 10:off

随意按动手柄上的任意一个按键,数值都会发生改变

1.2 测试Joy功能包

  1. 测试手柄在ros中的功能,使用joy和joy_node功能包
$ roscore
$ rosrun joy joy_node

如果配置无误,可以看到

[ INFO] [1610344484.707536624]: Opened joystick: /dev/input/js0. deadzone_: 0.050000.
  1. 发送手柄动作信息
    joy_node功能包使用/joy话题发布手柄信息,可以使用如下指令查看
$ rostopic echo /joy

我们随便按一个手柄上的按钮可以看到
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-04zjK0g5-1610451598419)(8.jpg)]

axes代表轴向输入,buttons代表按钮输入

  1. 可以使用下面的命令获取/joy发布消息的类型
$ rostopic type /joy

sensor_msgs/Joy
  1. 使用下面命令查看消息中使用的字段
$ rosmsg show sensor_msgs/Joy

std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
float32[] axes
int32[] buttons

1.3 编写手柄控制机器人的程序

在上文中我们提到了/joy发布信息的类型为sensor_msgs/Joy,头文件就需要加入#include <sensor_msgs/Joy.h>
我们使用手柄上的X(左转),Y(前进),B(右转),A(后退)来控制机器人的运动。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aw3juNak-1610451598421)(9.jpg)]

用手柄控制的方式和键盘控制的方式只有两个地方写法不同,如下:
整体程序请看

ROS联合webots实战案例(三)在webots中使用ROS控制小机器人

  1. 订阅/joy话题
ros::Subscriber joySub;
joySub = n->subscribe("/joy",1,JoyDataCallback);
  1. 手柄返回函数
/*******************************************************
* Function name :手柄返回函数
* Description   :当手柄动作,就会进入此函数内
* Parameter     :
        @value   返回的值
* Return        :无
**********************************************************/
void JoyDataCallback(const sensor_msgs::Joy::ConstPtr &value)
{
    // 发送控制变量
    int send =0;
    //ROS_INFO("sub keyboard value = %d",a);
    if (value->buttons[2])
    {
        // 左转
        speeds[0] = -5.0;
        speeds[1] = 5.0;
        send=1;
    }
    else if(value->buttons[3])
    {
        // 前进
        speeds[0] = 5.0;
        speeds[1] = 5.0;
        send=1;
    }
    else if(value->buttons[0])
    {
        // 后退
        speeds[0] = -5.0;
        speeds[1] = -5.0;
        send=1;
    }
    else if(value->buttons[1])
    {
        //  右转
        speeds[0] = 5.0;
        speeds[1] = -5.0;
        send=1;
    }
    //当接收到信息时才会更新速度值
    if (send)
    {
        updateSpeed();
        send=0;
    } 
}

2.最后

  1. 配置CMakeList.txt,在最下面添加:
add_executable(velocity_joy src/velocity_joy.cpp)
add_dependencies(velocity_joy webots_ros_generate_messages_cpp)
target_link_libraries(velocity_joy	${catkin_LIBRARIES})
  1. 编译功能包
$ cd catkin_ws/
$ catkin_make
  1. 运行launch文件,可能不会那么快可以TAB出来,打进去一样可以运行
$ roslaunch webots_demo webots.launch
  1. 打开joy功能包中的joy_node节点用于获取手柄数据
$ rosrun joy joy_node
  1. 运行编写好的代码
$ rosrun webots_demo velocity_joy
  1. 效果
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kr2wtGiv-1610451598423)(3.gif)]

猜你喜欢

转载自blog.csdn.net/xiaokai1999/article/details/112545545