天天看點

ROS聯合webots實戰案例(三)使用外接搖桿控制機器人[2]

部落格位址:https://blog.csdn.net/xiaokai1999

筆者裝置:北通 阿修羅

一共有14個按鈕和4個線性杆

1. 使用外接搖桿控制小機器人

1.1 安裝相關功能包

  1. 安裝ROS遊戲杆功能包$ sudo apt-get install ros-melodic-joystick-drivers$ ls /dev/input/可以看到,js0就是搖桿所建立的端口
    ROS聯合webots實戰案例(三)使用外接搖桿控制機器人[2]

    7.jpg

    3. 我們可以使用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功能包$ roscore

    $ rosrun joy joy_node如果配置無誤,可以看到[ INFO] [1610344484.707536624]: Opened joystick: /dev/input/js0. deadzone_: 0.050000.$ rostopic echo /joy我們随便按一個搖桿上的按鈕可以看到

    ROS聯合webots實戰案例(三)使用外接搖桿控制機器人[2]

    8.jpg

    axes代表軸向輸入,buttons代表按鈕輸入

  2. 首先,将搖桿連接配接到電腦上,使用如下代碼,檢查搖桿是否可以被識别到
  3. 測試搖桿在ros中的功能,使用joy和joy_node功能包
  4. 發送搖桿動作資訊

    joy_node功能包使用/joy話題釋出搖桿資訊,可以使用如下指令檢視

  5. 可以使用下面的指令擷取/joy釋出消息的類型$ rostopic type /joy

    sensor_msgs/Joy$ rosmsg show sensor_msgs/Joy

    std_msgs/Header header

    uint32 seq

    time stamp

    string frame_id

    float32[] axes

    int32[] buttons

  6. 使用下面指令檢視消息中使用的字段

1.3 編寫搖桿控制機器人的程式

在上文中我們提到了/joy釋出資訊的類型為

sensor_msgs/Joy

,頭檔案就需要加入

#include <sensor_msgs/Joy.h>

我們使用搖桿上的X(左轉),Y(前進),B(右轉),A(後退)來控制機器人的運動。

ROS聯合webots實戰案例(三)使用外接搖桿控制機器人[2]

9.jpg

用搖桿控制的方式和鍵盤控制的方式隻有兩個地方寫法不同,如下:

整體程式請看

ROS聯合webots實戰案例(三)在webots中使用ROS控制小機器人

1. 訂閱/joy話題ros::Subscriber joySub;

joySub = n->subscribe("/joy",1,JoyDataCallback);搖桿傳回函數/*******************************************************

* 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.最後配置

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})編譯功能包 $ cd catkin_ws/

$ catkin_make運作launch檔案,可能不會那麼快可以TAB出來,打進去一樣可以運作$ roslaunch webots_demo webots.launch打開joy功能包中的joy_node節點用于擷取搖桿資料$ rosrun joy joy_node運作編寫好的代碼$ rosrun webots_demo velocity_joy效果undefined

ROS聯合webots實戰案例(三)使用外接搖桿控制機器人[2]
3.gif