当前位置: 首页 > news >正文

机器人入门(五)—— 仿真环境中操作TurtleBot

仿真环境中操作TurtleBot

  • 一、实操
    • 1.1 查看姿态信息
    • 1.2 控制turtlebot移动的三种方式
      • 1.2.1 命令行发布指令
      • 1.2.2 键盘操控
      • 1.2.3 Python脚本控制
      • 1.2.4 使用rqt工具界面,发布运动指令
  • 二、里程计(odometry)
  • TurtleBot3 仿真

进行实操之前,先准备环境

$ sudo apt install ros-kinetic-turtlebot ros-kinetic-turtlebot-apps ros-kinetic-turtlebot-interactions ros-kinetic-turtlebot-simulator ros-kinetic-kobuki-ftdi ros-kinetic-turtlebot-gazebo

一、实操

1.1 查看姿态信息

环境准备好后,执行以下命令启动

$ roslaunch turtlebot_gazebo turtlebot_world.launch

可以看见以下效果,视角不舒服的话,就按Ctrl+Shift+鼠标左键调整调整至你喜欢的视角,并通过滚轮缩放大小。
在这里插入图片描述在这里插入图片描述
按如下顺序点击,TurtleBot将被一个白色框线框住,并可以查看姿态信息

在这里插入图片描述

也可以用以下命令,打印出mobile_base的姿态信息,注意到,由于车应该是放置在水平面上的,position.z的值本应该是0,这里却是一串-0.00113074128666的小数,原因是什么呢?是ROS的缺陷吗?//@TODO,此问题待解答,然后看到orientation的x,y,z,w,这被称作四元数(quaternion),用来表示三维空间里的旋转,关于四元数如何表示三维空间里的旋转,见《二维空间与三维空间的姿态表示法》

$ rosservice call gazebo/get_model_state '{model_name: mobile_base}'
header: seq: 1stamp: secs: 1945nsecs: 170000000frame_id: ''
pose: position: x: 1.97484093771y: 0.0147819206239z: -0.00113074128666orientation: x: -0.00134519341326y: -0.00376571136568z: -0.348703846748w: 0.937224432639
twist: linear: x: -0.000155242355429y: -0.000224370086231z: -4.28258194336e-06angular: x: -0.0023805996017y: 0.00191483013878z: 0.000121453647707
success: True
status_message: "GetModelState: got properties"

1.2 控制turtlebot移动的三种方式

1.2.1 命令行发布指令

可以看到,这个名字叫做mobile_base的link(连接刚体),根据之前操作小乌龟的文章,我们要先找到有哪些node在跑,然后再找到对应的有哪些topic在publish和被subscribe,去控制mobile_base,开始,我们干脆看图说话。

rosrun rqt_graph rqt_graph

在这里插入图片描述目的很明确,要找的node就应该是/gazebo了,我原本以为,这里会有一个结点应该叫mobile_base,但想了想,它应该被整个包含在/gazebonode环境里面了,所以/gazebo这个node还是有非常多子结构,不然一个孤零零的/gazebo,怎么完成这么多物体的操作呢?

$ rosnode list
/gazebo #忽略
/gazebo_gui #忽略
/laserscan_nodelet_manager
/mobile_base_nodelet_manager #可能是
/robot_state_publisher 
/rosout #忽略

继续,信息有点多,但是我们还是只需要看Subscriptions这个,服从命令听指挥是优良作风,看名字的话,在上面rqt_graph图中所见到的的topic正是/mobile_base/commands/velocity,哦这里连message的数据类型都给出来了是geometry_msgs/Twist

$ rosnode info /gazebo
--------------------------------------------------------------------------------
Node [/gazebo]
Publications: * /camera/depth/camera_info [sensor_msgs/CameraInfo]* /camera/depth/image_raw [sensor_msgs/Image]
...
...Subscriptions: * /clock [rosgraph_msgs/Clock]* /gazebo/set_link_state [unknown type]* /gazebo/set_model_state [unknown type]* /mobile_base/commands/motor_power [unknown type]* /mobile_base/commands/reset_odometry [unknown type]* /mobile_base/commands/velocity [geometry_msgs/Twist]
...
...

那么就有的放矢了,发布命令

$ rostopic pub -r 10 /mobile_base/commands/velocity /geometry_msgs/Twist '{linear: {x: 0.2}}'

在这里插入图片描述

1.2.2 键盘操控

执行下面的命令,可以用键盘操作

$ roslaunch turtlebot_teleop keyboard_teleop.launch

在这里插入图片描述在这里插入图片描述但这个package是turtlebot_teleop有什么说法和依据吗?为什么执行的是它,答案是没有,代码开发时的设计如此,来看最新的rqt_graph,所以这建立在你非常了解你所要运行的仿真环境基础上,才能做到用键盘操作,不然琢磨半天也不会知道如何使用键盘去操作这个turtlebot。
在这里插入图片描述

1.2.3 Python脚本控制

西天取经,孙悟空总算是要拿到他的如意金箍棒了,有了程序,才叫编程,有了金箍棒,孙悟空才能大闹天宫,可孙悟空终会有取到经书的一刻,那时,不只是涅盘成佛,也是大圣的寂灭。
创建一份ControlTurtleBot.py,内容为:

#!/usr/bin/env python
# Execute as a python script  
# Set linear and angular values of TurtleBot's speed and turning.
import rospy      # Needed to create a ROS node
from geometry_msgs.msg import Twist    # Message that moves baseclass ControlTurtleBot():def __init__(self):# ControlTurtleBot is the name of the node sent to the #masterrospy.init_node('ControlTurtleBot', anonymous=False)# Message to screenrospy.loginfo("Press CTRL+c to stop TurtleBot")# Keys CNTL + c will stop script #这里的self.shutdown是一个函数地址rospy.on_shutdown(self.shutdown)# Publisher will send Twist message on topic cmd_vel_mux/input/naviself.cmd_vel = rospy.Publisher('cmd_vel_mux/input/navi',Twist, queue_size=10)# TurtleBot will receive the message 10 times per second.rate = rospy.Rate(10);# 10 Hz is fine as long as the processing does not exceed#   1/10 second.# Twist is geometry_msgs for linear and angular velocitymove_cmd = Twist()move_cmd.linear.x = 0.3# Modify this value to change speed# Turn at 0 radians/smove_cmd.angular.z = 0# Modify this value to cause rotation rad/s# Loop and TurtleBot will move until you type CNTL+cwhile not rospy.is_shutdown():# publish Twist values to TurtleBot node /cmd_vel_muxself.cmd_vel.publish(move_cmd)# wait for 0.1 seconds (10 HZ) and publish againrate.sleep()def shutdown(self):# You can stop turtlebot by publishing an empty Twist# messagerospy.loginfo("Stopping TurtleBot")self.cmd_vel.publish(Twist())# Give TurtleBot time to stoprospy.sleep(1)if __name__ == '__main__':try:ControlTurtleBot()except:rospy.loginfo("End of the trip for TurtleBot")

然后赋予执行权限,并用python解释执行,然后小车就会沿着它自身坐标系的x轴方向一直前进。

$ chmod +x ControlTurtleBot.py
$ python ControlTurtleBot.py

1.2.4 使用rqt工具界面,发布运动指令

rqt = ROS Qt GUI Toolkit,

$ rqt

然后在插件选项栏里,将Message PublisherTopic Monitor调出来

在这里插入图片描述并选择对应的Topic和Message Type,设置数据值,然后勾选发布
在这里插入图片描述另外rqt这个工具可以让你跟踪发布的message,一旦TurtleBot的行动不是你预期的那样,你可以进行debug排查原因。

二、里程计(odometry)

这个odometry是用来估计mobile robot当前所处位置,和起点之间的距离和姿态变化,当mobile robot走了一段较长的距离时,这个数据会变得不准,原因可能是车轮的直径参数有误,或者路不平导致车轮的转换器输出了不准确的数据,书上给了一篇IEEE Transactions on Robotics and Automation(IEEE TRO)收录的论文,对这个问题有较为详尽的讨论 Measurement and Correction of Systematic Odometry Errors in Mobile Robots.pdf,这篇文章还讨论了轴距(wheelbase)的影响。
这是一作老头子的个人主页 Johann Borenstein

首先,查看/odom这个topic使用的message,结果显示是nav_msgs/Odometry,再看nav_msgs/Odometry的数据格式

$ rostopic type /odom
nav_msgs/Odometry
$ rosmsg show nav_msgs/Odometry
std_msgs/Header headeruint32 seqtime stampstring frame_id
string child_frame_id
geometry_msgs/PoseWithCovariance posegeometry_msgs/Pose posegeometry_msgs/Point positionfloat64 xfloat64 yfloat64 zgeometry_msgs/Quaternion orientationfloat64 xfloat64 yfloat64 zfloat64 wfloat64[36] covariance
geometry_msgs/TwistWithCovariance twistgeometry_msgs/Twist twistgeometry_msgs/Vector3 linearfloat64 xfloat64 yfloat64 zgeometry_msgs/Vector3 angularfloat64 xfloat64 yfloat64 zfloat64[36] covariance

用以下命令可以使turtlebot归位

# 1.查找归位topic对应的message
$ rostopic type /mobile_base/commands/reset_odometry 
std_msgs/Empty
# 2.命令mobile_base归位
$ rostopic pub /mobile_base/commands/reset_odometry std_msgs/Empty
$ rostopic echo /mobile_base/sensors/imu_data

使用以下命令,分别把gazebo和rviz启动起来

$ roslaunch turtlebot_gazebo turtlebot_world.launch
$ roslaunch turtlebot_rviz_launchers view_robot.launch

按如下方式勾选
在这里插入图片描述就会出现一根红色箭头,将指明turtlebot的前进方向

在这里插入图片描述然后发布运动命令

$ rostopic pub -r 10 /cmd_vel_mux/input/teleop \geometry_msgs/Twist '{linear: {x: 0.1, y: 0, z: 0}, angular: {x: 0, y: 0, z: -0.5}}'
# 效果与上面的一样,
$ rostopic pub -r 10 /mobile_base/commands/velocity \geometry_msgs/Twist '{linear: {x: 0.1, y: 0, z: 0}, angular: {x: 0, y: 0, z: -0.5}}'

TurtleBot3 仿真

安装环境

$ sudo apt-get install ros-kinetic-joy ros-kinetic-teleop-twist-joy ros-kinetic-teleop-twist-keyboard ros-kinetic-laser-proc ros-kinetic-rgbd-launch ros-kinetic-depthimage-to-laserscan ros-kinetic-rosserial-arduino ros-kinetic-rosserial-python ros-kinetic-rosserial-server ros-kinetic-rosserial-client ros-kinetic-rosserial-msgs ros-kinetic-amcl ros-kinetic-map-server ros-kinetic-move-base ros-kinetic-urdf ros-kinetic-xacro ros-kinetic-compressed-image-transport ros-kinetic-rqt-image-view ros-kinetic-gmapping ros-kinetic-navigation

然后将给turtlebot3远程计算机开发的ROS catkin 软件包代码拉到本地,并进行编译

$ cd ~/catkin_ws/src/
$ git clone https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git
$ git clone https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git
$ git clone https://github.com/ROBOTIS-GIT/turtlebot3.git
$ cd ~/catkin_ws
$ catkin_make

用以下命令,去指定model,这样再启动rviz环境下看到的就是burger这个机器人,TurtleBot 3 Burger [US]

$ export TURTLEBOT3_MODEL=burger
$ roslaunch turtlebot3_fake turtlebot3_fake.launch

然后在新的Terminal,就可以用键盘控制这个机器人了

$ export TURTLEBOT3_MODEL=burger
$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch

在这里插入图片描述

关闭刚刚打开rviz的终端,然后是gazebo环境的仿真,你应该会看到如下画面

$ export TURTLEBOT3_MODEL=burger
$ roslaunch turtlebot3_gazebo turtlebot3_world.launch

在这里插入图片描述然后再打开一个Terminal,执行下面的命令,你就能操控turtlebot3在这个仿真环境里行驶了

$ export TURTLEBOT3_MODEL=burger
$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch

在这里插入图片描述
并且turtlebot3还可以自动行驶,关掉执行turtlebot3_teleop的终端,在新的Terminal里执行下面的命令

$ export TURTLEBOT3_MODEL=burger
$ roslaunch turtlebot3_gazebo turtlebot3_simulation.launch

在这里插入图片描述
来看下为什么turtlebot3不撞墙,新建一个Terminal并执行

$ export TURTLEBOT3_MODEL=burger
$ roslaunch turtlebot3_gazebo turtlebot3_gazebo_rviz.launch

发现有激光雷达的扫描数据,红点连起来就是激光雷达的描边
在这里插入图片描述书本的第三章后半部分就在写硬件部分的实操了,第三章就到这里

相关文章:

机器人入门(五)—— 仿真环境中操作TurtleBot

仿真环境中操作TurtleBot 一、实操1.1 查看姿态信息1.2 控制turtlebot移动的三种方式1.2.1 命令行发布指令1.2.2 键盘操控1.2.3 Python脚本控制1.2.4 使用rqt工具界面,发布运动指令 二、里程计(odometry)TurtleBot3 仿真 进行实操之前,先准备环境 $ sud…...

G2406C是一款高效的直流-直流降压开关稳压器,能够提供高达1A输出电流。

G2406C 1.5MHz,1A高效降压DC-DC转换器 概述: G2406C是一款高效的直流-直流降压开关稳压器,能够提供高达1A输出电流。G2406C在2.7V至5.5V的宽范围输入电压下工作,使IC是低压电源转换的理想选择。在1.5MHz的固定频率下运行允许使用具有小电感…...

HTB——常见端口及协议总结

文章目录 一、 常见端口二、HTTP协议三、FTP四、SMB 一、 常见端口 http协议:80、8000https协议:443、8443ftp协议:20(数据传输)、21(发送命令)smb协议:445 二、HTTP协议 https的…...

Spring Boot中处理简单的事务

说到事务,我们第一影响应该是数据库管理系统的一个重要概念。 事务(Transaction)是数据库管理系统(DBMS)中的一个概念,用于管理对数据库的一组操作,这些操作要么全部成功执行,要么全…...

source activate my_env 和conda activate my_env 有什么区别

source activate my_env 和conda activate my_env 有什么区别 source activate 和 conda activate 是两个不同的命令,用于在Conda环境中激活特定的虚拟环境。它们的区别在于它们分别适用于不同版本的Conda。 source activate: source activate 是在Con…...

机器学习模型超参数优化最常用的5个工具包!

优化超参数始终是确保模型性能最佳的关键任务。通常,网格搜索、随机搜索和贝叶斯优化等技术是主要使用的方法。 今天分享几个常用于模型超参数优化的 Python 工具包,如下所示: scikit-learn:使用在指定参数值上进行的网格搜索或…...

出口美国操作要点汇总│走美国海运拼箱的注意事项│箱讯科技

01服务标准 美国的货物需要细致的服务,货物到港后的服务也是非常重要的。如果在货物到港15天内,如果没有报关行进行(PROCEED),货物就会进入了G.O.仓库,G.O.仓库的收费标准是非常高的。 02代理资格审核 美国航线除了各家船公司&a…...

Gateway网关

Gateway网关 1、网关的位置与作用 官网:Spring Cloud Gateway Geteway是Zuul的替代, Zuul:路由和过滤Zuul最终还是会注册到Eureka Zuul网关采用同步阻塞模式不符合要求。 Spring Cloud Gateway基于Webflux,比较完美地支持异步…...

Python Opencv实践 - 车牌定位(纯练手,存在失败场景,可以继续优化)

使用传统的计算机视觉方法定位图像中的车牌,参考了部分网上的文章,实际定位效果对于我目前使用的网上的图片来说还可以。实测发现对于车身本身是蓝色、或是车牌本身上方有明显边缘的情况这类图片定位效果较差。纯练手项目,仅供参考。代码中im…...

U盘插在电脑上显示要格式化磁盘怎么办

U盘是一种便携式存储设备,广泛应用于各种场合。然而,有时候我们可能会遇到一些问题,比如将U盘插入电脑后显示要格式化磁盘,这通常意味着U盘的分区出现了问题或者U盘的文件系统已经损坏。这种情况下,我们应该如何解决呢…...

Python使用腾讯云SDK实现对象存储(上传文件、创建桶)

文章目录 1. 开通服务2. 创建存储桶3. 手动上传文件并查看4. python上传文件4.1 找到sdk文档4.2 初始化代码4.3 region获取4.4 secret_id和secret_key获取4.5 上传对象代码4.6 python实现上传文件 5 python创建桶 首先来到腾讯云官网 https://cloud.tencent.com/1. 开通服务 来…...

Springboot整合Jedis实现单机版或哨兵版可切换配置

Springboot整合Jedis实现单机版或哨兵版可切换配置 前言实现最后 前言 前文写到借助redis实现Shiro实现session限制登录数量踢人下线,本文就写一下Jedis的配置,可切换单机版和集群哨兵版,方便开发测试。 实现 很简单,直接上代码&…...

lenovo联想小新 Air-14 2019 AMD平台API版(81NJ)原装出厂Windows10系统

下载链接:https://pan.baidu.com/s/1HCC66EH4UOcgofRx5_v1oA?pwdlgqw 提取码:lgqw 原厂系统自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、联想电脑管家等预装程序 所需要工具:16G或以上的U盘 文件格式&#xf…...

特殊矩阵的压缩存储(对称矩阵,三角矩阵,三对角矩阵,稀疏矩阵)

目录 1.数组的存储结构1.—维数组2.二维数组1.行优先存储2.列优先存储 2.特殊矩阵1.对称矩阵1.行优先存储 2.三角矩阵1.上三角矩阵2.下三角矩阵 3.三对角矩阵(带状矩阵)4.稀疏矩阵 1.数组的存储结构 1.—维数组 各数组元素大小相同,且物理上…...

DDU框架学习之路

目录 MVVM对比 DDU 数据消费者UI 数据的转换者:Domain Layer 数据图生产者/提供者 DataLayer 遵循原理: 单一数据流: Android官方推荐架构:DDU MVVM对比 M:Model 网络层 用于获取远端数据 VM:ViewModel 中间转…...

进阶课6——基于Seq2Seq的开放域生成型聊天机器人的设计和开发流程

情感聊天机器人通常属于开放领域,用户可以与机器人进行各种话题的互动。例如,微软小冰和早期的AnswerBus就是这种类型的聊天机器人。基于检索的开放领域聊天机器人需要大量的语料数据,其开发流程与基于任务型的聊天机器人相似,而基…...

Java面试题04

1.Array 和 ArrayList 有何区别? Array是固定长度的,元素类型可以是基本类型,创建后大小不可改变;ArrayList是可变长 度的,只能存储对象,可以动态添加和删除元素。 区别1: 存储类型不同 …...

海康Visionmaster-通讯管理:使用 Modbus TCP 通讯 协议与流程交互

使用 Modbus TCP 通讯协议与视觉通讯,当地址为 0000 的保持型寄存器(4x 寄存器)变为 1 时,触发视觉流程执行一次,同时视觉将地址为 0000 的寄存器复位(也即写为 0),视觉流程执行完成后,将结果数…...

assimp中如何判断矩阵是否是单位矩阵

对于一个矩阵元素为浮点型的矩阵&#xff0c;你是否还在使每个元素跟1.0f或0.0f进行比较&#xff0c;如果这样&#xff0c;只能说你的结果不一定正确&#xff0c;那我们看看assimp中是如何做的。 template <typename TReal> AI_FORCE_INLINE bool aiMatrix4x4t<TReal…...

大数据Doris(二十):数据导入(Broker Load)介绍

文章目录 数据导入(Broker Load)介绍 一、​​​​​​​适用场景...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...