键盘控制启动命令:

roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch

问题描述:

turtlebot3启动键盘控制后 /cmd_vel 会持续输出数据,再键盘不给信号时速度持续输出0,导致此功能与导航同时启动,会导致小车自动行走时一顿一顿的,可以用rostopic echo /cmd_vel 看数据输出情况;

以下是我改良后的键盘控制代码:

键盘控制改良版,按下s停止后,不会在持续输出 速度,与导航一起启动,不影响小车自动行走

#!/usr/bin/env python3
#coding=utf-8
# Copyright (c) 2011, Willow Garage, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
#    * Redistributions of source code must retain the above copyright
#      notice, this list of conditions and the following disclaimer.
#    * Redistributions in binary form must reproduce the above copyright
#      notice, this list of conditions and the following disclaimer in the
#      documentation and/or other materials provided with the distribution.
#    * Neither the name of the Willow Garage, Inc. nor the names of its
#      contributors may be used to endorse or promote products derived from
#       this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.import rospy
from geometry_msgs.msg import Twist
from std_msgs.msg import String
import sys, select, os
# sukai 2021-11-03
# 键盘控制改良版,按下s停止后,不会在持续输出 0 速度
# rosrun slamservice currency_teleop_key.pyif os.name == 'nt':import msvcrt
else:import tty, termiosBURGER_MAX_LIN_VEL = 0.22
BURGER_MAX_ANG_VEL = 2.84WAFFLE_MAX_LIN_VEL = 0.36
WAFFLE_MAX_ANG_VEL = 0.82LIN_VEL_STEP_SIZE = 0.03
ANG_VEL_STEP_SIZE = 0.1msg = """Control Your JiCui CurrencyChassis!
键盘控制改良版,按下s停止后,/cmd_vel 不会在持续输出速度;
---------------------------
Moving around:wa    s    dxw/x : increase/decrease linear velocity (Burger : ~ 0.22, Waffle and Waffle Pi : ~ 0.26)
a/d : increase/decrease angular velocity (Burger : ~ 2.84, Waffle and Waffle Pi : ~ 1.82)space key, s : force stopCTRL-C to quit
"""e = """
Communications Failed
"""
datamsg =""
def getKey():if os.name == 'nt':if sys.version_info[0] >= 3:return msvcrt.getch().decode()else:return msvcrt.getch()tty.setraw(sys.stdin.fileno())rlist, _, _ = select.select([sys.stdin], [], [], 0.1)if rlist:key = sys.stdin.read(1)else:key = ''termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)return keydef vels(target_linear_vel, target_angular_vel):return "currently:\tlinear vel %s\t angular vel %s " % (target_linear_vel,target_angular_vel)def makeSimpleProfile(output, input, slop):if input > output:output = min( input, output + slop )elif input < output:output = max( input, output - slop )else:output = inputreturn outputdef constrain(input, low, high):if input < low:input = lowelif input > high:input = highelse:input = inputreturn inputdef checkLinearLimitVelocity(vel):if turtlebot3_model == "burger":vel = constrain(vel, -BURGER_MAX_LIN_VEL, BURGER_MAX_LIN_VEL)elif turtlebot3_model == "waffle" or turtlebot3_model == "waffle_pi":vel = constrain(vel, -WAFFLE_MAX_LIN_VEL, WAFFLE_MAX_LIN_VEL)else:vel = constrain(vel, -BURGER_MAX_LIN_VEL, BURGER_MAX_LIN_VEL)return veldef checkAngularLimitVelocity(vel):if turtlebot3_model == "burger":vel = constrain(vel, -BURGER_MAX_ANG_VEL, BURGER_MAX_ANG_VEL)elif turtlebot3_model == "waffle" or turtlebot3_model == "waffle_pi":vel = constrain(vel, -WAFFLE_MAX_ANG_VEL, WAFFLE_MAX_ANG_VEL)else:vel = constrain(vel, -BURGER_MAX_ANG_VEL, BURGER_MAX_ANG_VEL)return velif __name__=="__main__":if os.name != 'nt':settings = termios.tcgetattr(sys.stdin)rospy.init_node('turtlebot3_teleop')pub = rospy.Publisher('cmd_vel', Twist, queue_size=10)#turtlebot3_model = rospy.get_param("model", "burger")turtlebot3_model = "waffle"status = 0target_linear_vel   = 0.0target_angular_vel  = 0.0control_linear_vel  = 0.0control_angular_vel = 0.0try:print(msg)flg = Falsewhile(1):key = getKey()if key == 'w' or key == 'x' or key == 'a' or key == 'd' :flg = Trueif not flg:continue;print("while(flg)")if key == 'w' :target_linear_vel = checkLinearLimitVelocity(target_linear_vel + LIN_VEL_STEP_SIZE)status = status + 1print(vels(target_linear_vel,target_angular_vel))elif key == 'x':target_linear_vel = checkLinearLimitVelocity(target_linear_vel - LIN_VEL_STEP_SIZE)status = status + 1print(vels(target_linear_vel,target_angular_vel))elif key == 'a' :target_angular_vel = checkAngularLimitVelocity(target_angular_vel + ANG_VEL_STEP_SIZE)status = status + 1print(vels(target_linear_vel,target_angular_vel))elif key == 'd':target_angular_vel = checkAngularLimitVelocity(target_angular_vel - ANG_VEL_STEP_SIZE)status = status + 1print(vels(target_linear_vel,target_angular_vel))elif key == ' ' or key == 's' :#缓冲while(target_linear_vel>0.02 or target_linear_vel<-0.02):r = rospy.Rate(15)r.sleep()target_linear_vel = checkLinearLimitVelocity(target_linear_vel - target_linear_vel/5)target_angular_vel  = 0.0control_linear_vel = makeSimpleProfile(control_linear_vel, target_linear_vel, (LIN_VEL_STEP_SIZE/2.0))twist.linear.x = control_linear_vel; twist.linear.y = 0.0; twist.linear.z = 0.0control_angular_vel = makeSimpleProfile(control_angular_vel, target_angular_vel, (ANG_VEL_STEP_SIZE/2.0))twist.angular.x = 0.0; twist.angular.y = 0.0; twist.angular.z = control_angular_velpub.publish(twist)target_linear_vel   = 0.0control_linear_vel  = 0.0target_angular_vel  = 0.0control_angular_vel = 0.0print(vels(target_linear_vel, target_angular_vel))flg =Falseelse:if (key == '\x03'):breakif status == 20 :print(msg)status = 0twist = Twist()control_linear_vel = makeSimpleProfile(control_linear_vel, target_linear_vel, (LIN_VEL_STEP_SIZE/2.0))twist.linear.x = control_linear_vel; twist.linear.y = 0.0; twist.linear.z = 0.0control_angular_vel = makeSimpleProfile(control_angular_vel, target_angular_vel, (ANG_VEL_STEP_SIZE/2.0))twist.angular.x = 0.0; twist.angular.y = 0.0; twist.angular.z = control_angular_velpub.publish(twist)except:print(e)finally:twist = Twist()twist.linear.x = 0.0; twist.linear.y = 0.0; twist.linear.z = 0.0twist.angular.x = 0.0; twist.angular.y = 0.0; twist.angular.z = 0.0pub.publish(twist)if os.name != 'nt':termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)

urtlebot3启动键盘控制后 /cmd_vel 会持续输出数据,在键盘不给信号时 /cmd_vel 续输,导致此功能与导航同时启动,会导致小车自动行走时一顿一顿的相关推荐

  1. 成功解决for循环语句中,后几次循环输出数据一直全部为空

    成功解决for循环语句中,后几次循环输出数据一直全部为空 目录 解决问题 解决思路 解决方法 解决问题 for循环语句中,后几次循环输出数据一直全部为空

  2. 多旋翼无人机仿真 rotors_simulator:用键盘控制无人机飞行

    多旋翼无人机仿真 rotors_simulator:用键盘控制无人机飞行 前言 书接上文 接口测试 键盘指令发布 指令转换与发布 修改 rotors_simulator 的控制接口节点 测试 前言 R ...

  3. 控制程序中加入键盘控制

      又是哭瞎的调试过程,不是码农,不做很深入地追究,只想实现想要的效果,随便记录下.期待有更好的想法. 设计目标:方便小车调试,能用键盘控制小车急停与移动.   刚开始是为了调试的时候防止小车出现不可 ...

  4. ROS探索总结(七)(八)(九)——smartcar源码上传 键盘控制 操作杆控制

    ROS探索总结(七)--smartcar源码上传 看到前面写的博客还是帮助了很多ROS的学习者,我感到非常荣幸.其实我也是一名ROS的新手,ROS的相关资料少,上手难度大,我现在也在摸索着学习,还希望 ...

  5. 【OpenGL学习笔记⑧】——键盘控制正方体+光源【冯氏光照模型 光照原理 环境光照+漫反射光照+镜面光照】

    ✅ 重点参考了 LearnOpenGL CN 的内容,但大部分知识内容,小编已作改写,以方便读者理解. 文章目录 零. 成果预览图 一. 光照原理与投光物的配置 1.1 光照原理 1.2 投光物 二. ...

  6. OpenGL南邮计算机图形学实验报告四——用键盘控制物体

    OpenGL南邮计算机图形学实验报告四--用键盘控制物体 计算机图形学的新题目要求 OpenGL配置参考: 南邮老前辈wonz哥的OpenGL配置(Shader.h始终不用改).SOIL2 环境配置. ...

  7. 为什么在ROS中启动小乌龟后,无法用键盘控制?

    在刚开始学习ROS系统时,通常会用小乌龟作为示例. 启动小乌龟需要输入下列三个命令.注意,每输入一个命令都需要重新打开一个终端.因为这里的每一条命令都会对终端占用. 1启动ROS核心 roscore ...

  8. 关于ROS+Gazebo通过cmd_vel或键盘控制节点发布速度消息时,仿真小车运动速度相反问题

    本人初学ros,在做仿真小车的时候,通过soildworks2018建立四轮小车模型,并通过插件soildworks to urdf导出urdf文件. 将该文件移入虚拟机中,并将urdf修改为xacr ...

  9. [转]基于ROS平台的移动机器人-4-通过ROS利用键盘控制小车移动

    原文出处: https://blog.csdn.net/Forrest_Z/article/details/55002484 准备工作 1.下载串口通信的ROS包 (1)cd ~/catkin_ws/ ...

最新文章

  1. 小冰拉开人生第二幕:AI时代的“Office”问世,你的虚拟男友“复活”了
  2. java callback类_利用java8新特性实现类似javascript callback特性
  3. Visual Studio 2010 概念型IDE
  4. Linux入门(6)——Ubuntu16.04安装atom
  5. OpenCV4.4.0+VS2017 环境配置
  6. POJ_1253胜利的大逃亡
  7. 笨办法学python3_月底送书!入门Python都在学的“笨办法”,出进阶篇了!
  8. 左移右移位运算_计算机硬件技术基础M2——计算机运算基础(二)
  9. Atom飞行手册翻译: 4.3 作用域设置、作用域和作用域描述符
  10. 鸿蒙如何连接电视,鸿蒙系统首秀,在自家设备上和普通电视大不相同
  11. 【Pre-Training】XLNet:预训练最强,舍我其谁
  12. 数据结构学习笔记(二) 线性表的顺序存储和链式存储
  13. java 日历类_java常用的类---日历类
  14. SylixOS之OK6410开发板系统烧写
  15. 真实世界里的钢铁侠-特斯拉汽车创始人埃隆·马斯克(Elon Musk)
  16. string类的深拷贝和浅拷贝
  17. 【POJ P3311】【状压DP】Hie with the Pie
  18. mysql3306端口被占用无法终止_Mysql3306端口被占用无法启动解决办法
  19. linux关闭笔记本自带键盘
  20. nuxt 更新部署因浏览器缓存导致页面错误解决方法

热门文章

  1. ios的延迟执行方法
  2. C# Using 用法
  3. 开篇~试试word写博客
  4. PHP 运行 php-fpm 报错
  5. 骨牌覆盖问题 KxM
  6. Swift面向对象基础(上)——Swift中的枚举
  7. 不得不爱开源 Wijmo jQuery 插件集(10)-【Expander】(附页面展示和源码)
  8. C/C++ 常见误区
  9. JPA基础(三):搭建JPA开发环境和全局事务介绍
  10. ELK 6下日志平台监控Nginx日志构建实践