ROS小车研究笔记1/31/2023 小车硬件结构及键盘移动控制节点

本文是ROS小车研究笔记的第一部分,详细介绍了小车的硬件结构,包括中控设备、传感器系统、遥控系统和电池盒。特别讨论了键盘控制移动的实现,包括键盘控制节点的使用、速度控制逻辑以及如何通过ROS话题通信实现平滑速度变化。
摘要由CSDN通过智能技术生成

1 小车硬件结构
在这里插入图片描述
1 中控设备
在这里插入图片描述
上方的单片机用于控制电机运动,搭载wifi模块和电量显示屏。下方为树莓派,安装了ROS系统和Ubuntu系统,用于整个小车控制。显示屏和树莓派相连

2 传感器系统
在这里插入图片描述
在这里插入图片描述
激光雷达及转换器。激光雷达和转换器相连,再由转换器连接树莓派以控制激光雷达

在这里插入图片描述
摄像头系统,搭载深度摄像头和彩色摄像头

4 遥控系统
在这里插入图片描述
在这里插入图片描述
使用PS2遥控器,车身搭载PS2接收端
5 在这里插入图片描述
12V电池盒。小车只有在电压大于10V时才能工作

2 键盘控制移动
键盘控制节点:

roslaunch wheeltec_robot_rc keyboard_teleop.launch

控制说明:
U I O
J L
M .
控制各方向

k键和空格键为急停,立刻停止电机,按其他键为缓慢减速停止

Q/Z 增加/减少10%线速度和角速度
W/X 增加/减少10%线速度
E/C 增加/减少10%角速度
B 开关全向模式

键盘控制节点(turtlebot_teleop_key)
1

Omni = 0 #全向移动模式

#键值对应移动/转向方向
moveBindings = {
   
        'i':( 1, 0),
        'o':( 1,-1),
        'j':( 0, 1),
        'l':( 0,-1),
        'u':( 1, 1),
        ',':(-1, 0),
        '.':(-1, 1),
        'm':(-1,-1),
           }

#键值对应速度增量
speedBindings={
   
        'q':(1.1,1.1),
        'z':(0.9,0.9),
        'w':(1.1,1),
        'x':(0.9,1),
        'e':(1,  1.1),
        'c':(1,  0.9),
          }
          
speed = 0.2 #默认移动速度 m/s
turn  = 0.5   #默认转向速度 rad/s

移动键和速度控制键对应的值。最终速度为 (speed X 方向)和(turn X 方向)。在修改速度时为(speed X 修改幅度)和(turn X 修改幅度)

2

    settings = termios.tcgetattr(sys.stdin) #获取键值初始化,读取终端相关属性
    
    rospy.init_node('turtlebot_teleop') #创建ROS节点
    pub = rospy.Publisher('~cmd_vel', Twist, queue_size=5) #创建速度话题发布者,'~cmd_vel'='节点名/cmd_vel'

    x      = 0   #前进后退方向
    th     = 0   #转向/横向移动方向
    count  = 0   #键值不再范围计数
    target_speed = 0 #前进后退目标速度
    target_turn  = 0 #转向目标速度
    target_HorizonMove = 0 #横向移动目标速度
    control_speed = 0 #前进后退实际控制速度
    control_turn  = 0 #转向实际控制速度
    control_HorizonMove = 0 #横向移动实际控制速度

创建ros节点和Twist消息发布者pub。pub的消息被wheeltec_robot类订阅。wheeltec类会通过串口通信将速度控制指令发给下位机。

这里速度变化由于都是平滑变化。方向控制指令只会直接影响目标速度target_turn和target_speed。真实速度会渐进到目标速度(见下方代码)

3 读取控制键信息

while(1):
            key = getKey() #获取键值

            #切换是否为全向移动模式,全向轮/麦轮小车可以加入全向移动模式
            if key=='b':               
                Omni=~Omni
                if Omni: 
                    
  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个简单的例子,可以通过键盘控制ROS小车移动: ```python #!/usr/bin/env python # coding=utf-8 import rospy from geometry_msgs.msg import Twist # 初始化ROS节点 rospy.init_node('keyboard_control') # 创建一个Twist的publisher pub = rospy.Publisher('/cmd_vel', Twist, queue_size=10) # 创建一个Twist消息 move_cmd = Twist() # 定义线速度和角速度的初始值 move_cmd.linear.x = 0.0 move_cmd.angular.z = 0.0 # 定义线速度和角速度的增量 linear_step = 0.1 angular_step = 0.1 # 定义键盘控制函数 def keyboard_control(): # 获取键盘输入 key = raw_input("Control the robot (w: forward, s: backward, a: left, d: right, q: quit): ") # 根据键盘输入设置线速度和角速度 if key == 'w': move_cmd.linear.x += linear_step elif key == 's': move_cmd.linear.x -= linear_step elif key == 'a': move_cmd.angular.z += angular_step elif key == 'd': move_cmd.angular.z -= angular_step elif key == 'q': return True # 发布Twist消息 pub.publish(move_cmd) # 打印当前的线速度和角速度 rospy.loginfo("Current linear velocity: %f, Current angular velocity: %f", move_cmd.linear.x, move_cmd.angular.z) # 循环执行键盘控制函数 while not rospy.is_shutdown(): if keyboard_control(): break ``` 在这个例子中,我们通过键盘输入控制小车的运动。通过按下w键,可以使小车向前移动,按下s键可以使小车向后移动,按下a键可以使小车向左转弯,按下d键可以使小车向右转弯,按下q键可以退出程序。在键盘控制函数中,我们根据键盘输入设置线速度和角速度,并发布Twist消息。在循环中不断执行键盘控制函数,直到用户按下q键退出程序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值