硬件准备
实验器材
- 绝影lite3 / 虚拟机
- xbox手柄
- 蓝牙网卡二合一
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 进行手动连接。
步骤:
-
打开终端,输入以下命令启动
bluetoothctl:bluetoothctl -
在
bluetoothctl中输入以下命令:-
开启蓝牙:
power on -
使设备可被发现:
discoverable on -
开启配对模式:
pairable on -
扫描设备:
scan on系统会显示附近的蓝牙设备及其MAC地址。
-
-
找到目标设备后,记下其MAC地址(例如:
XX:XX:XX:XX:XX:XX)。 -
配对设备:
pair XX:XX:XX:XX:XX:XX系统会提示输入PIN码(通常是设备上显示的或默认如
0000或1234)。 -
信任设备:
trust XX:XX:XX:XX:XX:XX -
连接设备:
connect XX:XX:XX:XX:XX:XX -
如果成功连接,设备将显示为“已连接”。
退出 bluetoothctl
输入 exit 退出蓝牙管理工具。
软件准备

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文件中