前文中记录了随机移动机器人的开发过程,本文内容为Turtlebot3 Gazebo仿真环境下Teleop-bot 键盘操控移动机器人,主要包含以下几个部分:

1、键盘驱动(按键驱动发布keys话题)

2、运动生成器(订阅keys话题发布cmd_vel话题)

3、速度斜坡曲线

4、参数服务器

6、rviz 机器人、传感器和算法 3D可视化系统使用

1、键盘驱动(按键驱动发布keys话题)

代码及注释如下:

#!/usr/bin/env python
#-*- coding:utf-8   -*-import sys
import select
import tty
import termios
import rospy
from std_msgs.msg import Stringkey_pub=rospy.Publisher('keys',String,queue_size=1)
rospy.init_node('keyboard_driver')
rate=rospy.Rate(100)# 保存原来属性
old_attr=termios.tcgetattr(sys.stdin)
# 设置为单字符响应模式
tty.setcbreak(sys.stdin.fileno())
print "Publishing keystrokes. Press Ctrl+C to exit..."while not rospy.is_shutdown():if select.select([sys.stdin],[],[],0)[0]==[sys.stdin]:# 发布按键key_pub.publish(sys.stdin.read(1))rate.sleep()
#恢复属性
termios.tcsetattr(sys.stdin,termios.TCSADRAIN,old_attr)

可以通过rostopic echo命令查看keys 话题发布的消息:

wsc@wsc-pc:~/wanderbot_ws$ rostopic echo keys
data: "a"
---
data: "a"
---
data: "a"
---
data: "z"
---
data: "s"

2、运动生成器(订阅keys话题发布cmd_vel话题)

运动生成器代码及注释如下:

#!/usr/bin/env python
#-*- coding:utf-8   -*-import rospy
from std_msgs.msg import String
from geometry_msgs.msg import Twist# 定义按键定义
key_mapping={'w':[0,1],'x':[0,-1],'a':[-1,0],'d':[1,0], 's':[0,0]
}# 接收keys话题回调函数
def keys_callback(msg,twist_pub):if len(msg.data)==0 or (not key_mapping.has_key(msg.data[0])):returnvels=key_mapping[msg.data[0]]t=Twist()t.angular.z=vels[0]t.linear.x=vels[1]twist_pub.publish(t)if  __name__ == '__main__':rospy.init_node('keys_to_twist')twist_pub=rospy.Publisher('cmd_vel',Twist,queue_size=1)keys_sub=rospy.Subscriber('keys',String,keys_callback,twist_pub)rospy.spin()

运行rqt_plot 命令显示发布的话题数据:

3、参数服务器

上面我们按下键盘给出了固定的速度大小,我们可以使用ROS的参数系统来决定线速度和角速度,另外,上面的程序仅在按键时发布一条消息,我们可以利用rospy.Rate(10)改进代码使得程序以10HZ的频率稳定地发布话题。改进后的代码及注释如下:

#!/usr/bin/env python
#-*- coding:utf-8   -*-import rospy
from std_msgs.msg import String
from geometry_msgs.msg import Twist# 定义按键定义
key_mapping={'w':[0,1],'x':[0,-1],'a':[-1,0],'d':[1,0], 's':[0,0]
}
g_last_twist=None# 速度因子参数
g_vel_scals=[0.1,0.1]# 接收keys话题回调函数
def keys_callback(msg,twist_pub):global g_last_twist,g_vel_scalsif len(msg.data)==0 or (not key_mapping.has_key(msg.data[0])):returnvels=key_mapping[msg.data[0]]g_last_twist=Twist()g_last_twist.angular.z=vels[0]*g_vel_scals[0]g_last_twist.linear.x=vels[1]*g_vel_scals[0]twist_pub.publish(g_last_twist)if  __name__ == '__main__':rospy.init_node('keys_to_twist')twist_pub=rospy.Publisher('cmd_vel',Twist,queue_size=1)keys_sub=rospy.Subscriber('keys',String,keys_callback,twist_pub)g_last_twist=Twist()# 判断是否有linear_scale参数 if rospy.has_param('~linear_scale'):g_vel_scals[1]=rospy.get_param('~linear_scale')else:rospy.logwarn("linear_scale not provided,using %.1f"%g_vel_scals[1])# 判断是否有angular_scale参数 if rospy.has_param('~angular_scale'):g_vel_scals[0]=rospy.get_param('~angular_scale')else:rospy.logwarn("angular_scale not provided,using %.1f"%g_vel_scals[0])rate=rospy.Rate(10)while not rospy.is_shutdown():twist_pub.publish(g_last_twist)rate.sleep()

设置参数值方法 :rosrun teleop_bot  keys_to_twist_with_ramps.py  _linear_scale:=0.5 _angular_scale:=0.5

4、速度斜坡曲线

从第2步中发布的cmd_vel 话题数据图形显示可以看出,速度从1到-1是突变的,但是实际的物体不能瞬时启动、停止,机器人电机瞬间切到一个相差较大的速度时,可能会发生严重的后果。底层的机器人驱动器固件可能会对控制加速度进行平滑,但是最科学的办法还是在向机器人发布cmd_vel时就考虑到这一点,下面给出了改进的代码,限制了瞬时加速度。

#!/usr/bin/env python
#-*- coding:utf-8   -*-import rospy
import math
from std_msgs.msg import String
from geometry_msgs.msg import Twist# 定义按键定义
key_mapping={'w':[0,1],'x':[0,-1],'a':[-1,0],'d':[1,0], 's':[0,0]
}g_twist_pub=Noneg_target_twist=None
g_last_twist=Noneg_last_send_time=None# 速度因子参数
g_vel_scals=[0.1,0.1]
g_vel_ramps=[1.0,1.0]def fetch_params(name,default):# 判断是否有name参数 if rospy.has_param(name):return rospy.get_param(name)else:print "%s not provided,using %.1f"%(name,default)return defaultdef send_twist():global g_last_twist,g_target_twist,g_last_send_time,g_vel_ramps,g_twist_pubt_now=rospy.Time.now()g_last_twist=ramped_twist(g_last_twist,g_target_twist,g_last_send_time,t_now,g_vel_ramps)g_twist_pub.publish(g_last_twist)g_last_send_time=t_nowdef ramped_vel(v_prev,v_target,t_prev,t_now,ramp_rate):step=(t_now-t_prev).to_sec()*ramp_rateif v_target>v_prev:sign=1else:sign=-1if (math.fabs(v_target-v_prev))>step:return v_prev+step*signelse:return v_targetdef ramped_twist(prev,target,t_prev,t_now,ramps):tw=Twist()tw.angular.z=ramped_vel(prev.angular.z,target.angular.z,t_prev,t_now,ramps[0])tw.linear.x=ramped_vel(prev.linear.x,target.linear.x,t_prev,t_now,ramps[1])return tw# 接收keys话题回调函数
def keys_callback(msg):global g_target_twist,g_vel_scalsif len(msg.data)==0 or (not key_mapping.has_key(msg.data[0])):returnvels=key_mapping[msg.data[0]]g_target_twist=Twist()g_target_twist.angular.z=vels[0]*g_vel_scals[0]g_target_twist.linear.x=vels[1]*g_vel_scals[0]if  __name__ == '__main__':rospy.init_node('keys_to_twist')g_last_send_time=rospy.Time.now()g_twist_pub=rospy.Publisher('cmd_vel',Twist,queue_size=1)keys_sub=rospy.Subscriber('keys',String,keys_callback)g_last_twist=Twist()g_target_twist=Twist()g_vel_scals[1]=fetch_params('~linear_scale',g_vel_scals[1])g_vel_scals[0]=fetch_params('~angular_scale',g_vel_scals[0])g_vel_ramps[1]=fetch_params('~linear_accl',g_vel_ramps[1])g_vel_ramps[0]=fetch_params('~angular_accl',g_vel_ramps[0])rate=rospy.Rate(10)while not rospy.is_shutdown():send_twist()rate.sleep()

结果如下图,速度不再突变:

6、rviz 机器人、传感器和算法 3D可视化系统使用

rviz可以通过RoboWare Studio 菜单打开,也可以通过终端命令打开。

(1)选择参考坐标系,过程如下:

(2)添加机器人模型

(3)添加传感器

(4)转换视角观察

(5)在rviz中观察键盘驱动Turtlebot3运动

ROS开发笔记(5)——基于 python 开发 Turtlebot3 Gazebo仿真环境下键盘操控移动机器人(Teleop-bot )相关推荐

  1. 视觉学习笔记Week9 Gazebo仿真环境下相机焦距计算

    第九周 仿真环境下相机焦距计算 这周更新了曲线,按照嘉元和建荣的新曲线,落点应在TR后方一个车身位左右,速度和效率以及容错率可以达到比较好的状态. 焦距计算:                     ...

  2. python 知识管理系统_MrDoc: 基于Python开发的Markdown在线文档系统,适合作为个人和小型团队的文档、笔记和知识管理工具...

    MrDoc觅道文档 - 记录文档.汇聚思想 个人和小型团队的笔记.文档.知识管理私有化部署方案 简介 MrDoc 是基于Python开发的在线文档系统,适合作为个人和小型团队的文档.知识和笔记管理工具 ...

  3. python任务队列 http_基于Python开发的分布式任务队列:Celery

    Celery (芹菜)是基于Python开发的分布式任务队列.它支持使用任务队列的方式在分布的机器/进程/线程上执行任务调度. 架构设计. Celery的架构由三部分组成,消息中间件(message ...

  4. python写web自动化_Web接口开发与自动化测试——基于Python语言

    目 录∣ V 目 录 第1 章 Python 学习必知 ........................................................................ ...

  5. python开发的著名软件公司_软件开发公司_软件外包_项目外包平台基于Python开发一个全文检索系统...

    基于Python开发一个全文检索系统.功能要求为: 使用全文检索引擎对文本进行检索.文本的格式为Word.PDF.TXT. 同时按数据域进行复合条件检索.数据域指文本对应的信息,例如创建人.文件编号. ...

  6. jemeter python接口自动化测试平台_WEB接口开发与自动化测试基于PYTHON语言PDF_Python教程...

    资源名称:WEB接口开发与自动化测试 基于PYTHON语言 PDF 内容简介: <Web接口开发与自动化测试--基于Python语言>以接口测试为主线,以Web开发为切入点,全面介绍了We ...

  7. pythonarcgis插件_【直播】基于Python开发ArcGIS插件:Python Add-in丨城市数据派

    原标题:[直播]基于Python开发ArcGIS插件:Python Add-in丨城市数据派 Add-in是什么? Add-in(加载项)是一种自定义项(例如工具栏上的工具集合),Add-in可以插入 ...

  8. 基于python的图像处理的毕业论文_个人毕业设计基于python开发的图像论文34646.doc...

    word文档可自由复制编辑 本科生毕业论文(设计) 题目:基于python开发的图像 采集器之Airppt 学 部 学科门类 专 业 基于python开发的图像采集器之Airppt 摘 要 装订 装 ...

  9. 学习PySide2基于Python开发人工智能系统应用

    学习PySide2基于Python开发人工智能系统应用 文章目录 学习PySide2基于Python开发人工智能系统应用 摘要 模型训练 一.学习PySide2使用 第1步 环境安装 第2步 配置好Q ...

最新文章

  1. 微软成功抵御峰值高达 2.4Tbps 的 DDoS 攻击
  2. 数据结构之二叉树(遍历、建立、深度)
  3. 我的Java教程,不断整理,反复学习,记录着那些年大学奋斗的青春
  4. 黑盒测试法——等价类划分法(修改版)
  5. 以下哪个不是python财经数据接口工具_这7种Python的全新玩法,大部分人都不知道!...
  6. 为什么PostgreSQL比MongoDB还快之完结篇(深挖单点索引查询)
  7. Google Analytics(分析)
  8. vtigerCrm 目录结构(整理中)
  9. python爬取邮件内容_python 定时爬取内容并发送报告到指定邮箱
  10. matlab 警告(warning)、错误(error)、异常(exception)与断言(assert)
  11. 用友漏洞php,用友NC任意文件上传漏洞复现
  12. 电子工艺实训考核装置
  13. 电脑快捷方式变白原因及解决方法——血的教训呜呜呜
  14. destoon参考大全
  15. mysql安装教程 mac_Mac下MySQL安装配置教程
  16. 小程序推荐——那些好用实用的小程序(图片类、资讯类、工具类)
  17. C++实现批量文件重命名
  18. 飞行摇杆设置_分离摇杆+16000DPI,旗舰电竞鼠标ROG魔刃标准版体验
  19. 【Linux】生产者消费者模型
  20. winform-htmlEditor窗体超文本编辑器

热门文章

  1. ROM、RAM存储器原理详解以及DRAM、SRAM、SDRAM 、FLASH存储器的介绍
  2. NOIP2021游记
  3. 2020年“磐云杯”网络空间安全技能竞赛全国拉赛
  4. 一篇文章带你快速入门 AdminLTE
  5. CMMI之项目管理类
  6. mybatis删除mysql提交事务,MYsql单独使用mybatis事务处理的无法回滚问题
  7. 浅谈分布式学习(SGD)中提高速率的方法
  8. 【软件质量与软件测试 软件质量工程体系】
  9. 医疗器械系统测试用例编写实操(二)流程图分析法
  10. tecplot脚本在Linux系统下运行,Linux系统下安装Tecplot的步骤详解