控制底盘采集环境数据(一)- 键盘控制

为了进行后续的定位SLAM算法、路径跟踪等自动驾驶算法,需要提前采集一些环境数据,此处在我们建立的小车模型、巷道环境下采集激光雷达、IMU、关节等数据,使用rosbag保存用于后续分析处理。

1、之前我们使用rqt向cmd_vel话题写入数据,通过拖动进度条来控制小车

复制代码
  <node name="rqt_robot_steering" pkg="rqt_robot_steering" type="rqt_robot_steering" />

2、但是这样控制不是特别方便,因此改用键盘控制

先安装上键盘控制节点,注意:melodic替换成自己使用的版本

复制代码
sudo apt install ros-melodic-teleop-twist-keyboard

执行键盘控制节点,后续直接集成在启动文件

复制代码
rosrun teleop_twist_keyboard teleop_twist_keyboard.py

运行之前确保ros 管理器开启,若没有开启,执行下列命令

复制代码
roscore

3、经过尝试也不算很方便的控制自己的小车模型,因此参考以下文章编写自己的控制键盘https://blog.csdn.net/josiah_zhao/article/details/146525779

在之前的控制功能包下创建keyboard_control_node.py文件

("控制指令: w前进 s后退 a左转 d右转 e直行 x停止 q退出")

python 复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rospy
import sys
import tty
import termios
import select
import time
from geometry_msgs.msg import Twist

def main():
    print("=== 智能键盘控制(高频检测+10Hz发布)===")
    
    # 初始化ROS
    rospy.init_node('smart_keyboard_control', anonymous=True)
    pub = rospy.Publisher('/cmd_vel', Twist, queue_size=10, latch=True)
    rospy.sleep(0.5)
    
    # 速度状态
    linear_x, angular_z = 0.0, 0.0
    running = True
    publish_count = 0
    
    print("控制指令: w前进 s后退 a左转 d右转 e直行 x停止 q退出")
    print("开始控制(高频检测+10Hz发布)...")
    
    # 保存终端设置
    fd = sys.stdin.fileno()
    old_settings = termios.tcgetattr(fd)
    
    # 设置非阻塞模式
    tty.setraw(fd)
    
    try:
        last_status_time = time.time()
        last_publish_time = time.time()
        
        # 关键参数
        DETECTION_INTERVAL = 0.001    # 检测频率:1000Hz(1ms)
        PUBLISH_INTERVAL = 0.1        # 发布频率:10Hz(100ms)
        
        while running and not rospy.is_shutdown():
            current_time = time.time()
            
            # ========== 高频按键检测(1000Hz) ==========
            key = None
            rlist, _, _ = select.select([sys.stdin], [], [], 0.0)  # 立即返回
            if rlist:
                try:
                    key = sys.stdin.read(1)
                except:
                    pass
            
            # 立即处理按键(无延迟)
            if key:
                if key == 'w':
                    linear_x, angular_z = 5.0, 0.0
                    print("\n🎯 前进")
                elif key == 's':
                    linear_x, angular_z = -5.0, 0.0
                    print("\n🎯 后退")
                elif key == 'a':
                    angular_z = 0.61
                    print("\n🎯 左转")
                elif key == 'd':
                    angular_z = -0.61
                    print("\n🎯 右转")
                elif key == 'e':
                    angular_z = 0.0
                    print("\n🎯 直行")
                elif key == 'x':
                    linear_x, angular_z = 0.0, 0.0
                    print("\n🎯 停止")
                elif key == 'q':
                    running = False
                    print("\n🎯 退出")
            
            # ========== 低频消息发布(10Hz) ==========
            if current_time - last_publish_time >= PUBLISH_INTERVAL:
                msg = Twist()
                msg.linear.x = linear_x
                msg.angular.z = angular_z
                pub.publish(msg)
                publish_count += 1
                last_publish_time = current_time
            
            # ========== 状态显示(0.5秒更新) ==========
            if current_time - last_status_time > 0.5:
                subscribers = pub.get_num_connections()
                status = "⚡ 发布:%d | 速度:%.1f | 转向:%.2f | 检测:1000Hz | 发布:10Hz" % (
                    publish_count, linear_x, angular_z)
                print("\r" + status + " " * 10),
                sys.stdout.flush()
                last_status_time = current_time
            
            # 保持高频检测循环
            time.sleep(DETECTION_INTERVAL)
            
    except KeyboardInterrupt:
        print("\n用户中断")
    except Exception as e:
        print("错误: %s" % e)
    finally:
        # 清理
        termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
        pub.publish(Twist())
        print("\n退出")

if __name__ == '__main__':
    main()

赋予py执行权限

python 复制代码
sudo chmod +x keyboard_control_node.py 

并在keyboard_control_node.py 路径下打开终端,启动节点

4、启动后控制,效果如下:

相关推荐
bj_bluewei_tech1 天前
拯救者键盘部分按键失灵,换键盘无效,需要排查主板键盘控制芯片
计算机外设·电脑
qq_513728041 天前
浏览器配置 + 文件上传 + 截图
python·selenium·测试工具·计算机外设
杨丰玮4181 天前
从零手写Java飞机躲障碍游戏|Swing绘图、鼠标跟随、计时器碰撞检测实战(四)
java·游戏·计算机外设
YOLO数据集集合2 天前
火情监测新方案:无人机红外-可见光多模态火点烟雾数据集(含YOLOv11实战)
人工智能·yolo·计算机外设·无人机·无人机数据集·可见光多模态
杨丰玮4182 天前
从零手写Java飞机躲障碍游戏|Swing绘图、鼠标跟随、计时器碰撞检测实战(二)
java·游戏·计算机外设
码艺-Alimjan2 天前
横向滚动组件纯用 CSS,丝滑鼠标滚动不许js
javascript·css·计算机外设
Nomarsgo3 天前
柔性生产平台工业显示解决方案——基于联控 Lionconit IFD-1901 工业显示器打造高可靠人机交互终端
人工智能·科技·计算机外设·视觉检测·电脑·人机交互·制造
daols884 天前
解决 vxe-table 全键盘操作编辑单元格时,如果是中文拼音输入法时,解决首字母丢失问题
计算机外设
weixin_6685 天前
取消Windows 11 默认精简的鼠标右键文件夹菜单
windows·计算机外设
2601_963906786 天前
显示器 DDC/CI 控制工具:支持自动亮度/对比度调整等高级功能
计算机外设·软件需求