ros1-xbox_joy

硬件准备

实验器材

  1. 绝影lite3 / 虚拟机
  2. xbox手柄
  3. 蓝牙网卡二合一

1. 确保宿主机支持蓝牙

1. 检查硬件支持

  1. 确保系统的蓝牙模块已启用

    • 运行以下命令查看蓝牙状态:

      rfkill list bluetooth
      

      如果蓝牙被软禁用,使用以下命令启用:

      sudo rfkill unblock bluetooth
      

2. 安装必要的软件

确保蓝牙服务和工具已安装:

sudo apt update
sudo apt install bluetooth bluez bluez-tools

安装蓝牙管理工具:

sudo apt install blueman

启动蓝牙服务:

sudo systemctl start bluetooth
sudo systemctl enable bluetooth

2. 连接蓝牙

可以通过终端使用 bluetoothctl 进行手动连接。

步骤:

  1. 打开终端,输入以下命令启动 bluetoothctl

    bluetoothctl
    
  2. bluetoothctl 中输入以下命令:

    • 开启蓝牙:

      power on
      
    • 使设备可被发现:

      discoverable on
      
    • 开启配对模式:

      pairable on
      
    • 扫描设备:

      scan on
      

      系统会显示附近的蓝牙设备及其MAC地址。

  3. 找到目标设备后,记下其MAC地址(例如:XX:XX:XX:XX:XX:XX)。

  4. 配对设备:

    pair XX:XX:XX:XX:XX:XX
    

    系统会提示输入PIN码(通常是设备上显示的或默认如00001234)。

  5. 信任设备:

    trust XX:XX:XX:XX:XX:XX
    
  6. 连接设备:

    connect XX:XX:XX:XX:XX:XX
    
  7. 如果成功连接,设备将显示为“已连接”。

退出 bluetoothctl

输入 exit 退出蓝牙管理工具。

软件准备

image-20250310094708750

joy_node 是别人实现的

/joy 话题也是别人发布的

  • /joy_teleop 是我们要实现的节点

1. 安装 joy ROS包

  • 使用ROS的 joy 包来接收手柄输入:

    sudo apt install ros-noetic-joy
    
  • 确保系统识别手柄:

    ls /dev/input/js*
    

    如果没有看到

    /dev/input/js0
    

    等设备节点,请检查蓝牙连接。

2. 配置joy节点

2.1 启动joy节点

在ROS的joy包中,提供了一个joy_node节点,可以直接读取手柄输入数据。

创建一个launch文件,例如xbox_joy.launch

<launch>
  <node name="joy_node" pkg="joy" type="joy_node" output="screen">
    <param name="dev" value="/dev/input/js0" />
    <param name="deadzone" value="0.1" />
    <param name="autorepeat_rate" value="20.0" />
  </node>
</launch>

运行:

roslaunch your_package xbox_joy.launch

2.2 验证joy节点

启动joy_node后,可以检查是否成功发布手柄数据:

rostopic echo /joy

正常情况下,你应该会看到类似以下的数据:

header: 
  seq: 0
  stamp: 
    secs: 0
    nsecs: 0
  frame_id: ''
axes: [0.0, 0.0, -0.1, 0.0]
buttons: [0, 0, 0, 0, 0, 0, 0, 0]

3. 控制机器人

使用/joy话题的数据来控制机器人。

3.1 编写控制节点

创建一个Python脚本或C++节点,将/joy话题数据转换为运动控制指令(通常是发布到/cmd_vel话题上)。

以下是一个简单的Python例子:

catkin_create_pkg my_joy rospy geometry_msgs sensor_msgs std_msgs
#!/usr/bin/env python
import rospy
from sensor_msgs.msg import Joy
from geometry_msgs.msg import Twist

def joy_callback(data):
    twist = Twist()
    # 假设左摇杆控制线速度,右摇杆控制角速度
    twist.linear.x = data.axes[1]  # 左摇杆垂直轴
    twist.angular.z = data.axes[3]  # 右摇杆水平轴
    cmd_vel_pub.publish(twist)

rospy.init_node('joy_teleop')
cmd_vel_pub = rospy.Publisher('/cmd_vel', Twist, queue_size=10)
rospy.Subscriber('/joy', Joy, joy_callback)

rospy.spin()

保存为joy_teleop.py,并赋予执行权限:

chmod +x joy_teleop.py

运行:

rosrun your_package joy_teleop.py

3.2 测试机器人响应

在机器人端启动对应的驱动程序和joy节点,确保指令能够正确发布到控制机器人运动的节点。

优化

为了方便使用全部写到一个 launch文件中

github