硬件准备
实验器材
- 绝影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文件中