ROS仿真软件Turtlebot-Gazebo的安装使用以及错误处理[机器人避障]

        很多时候由于机器人价格比较贵,而且会因为环境因素、操作失误或者摔坏等,所以我们可以先在仿真软件上做测试,也可以避免这些问题,虽然没有那么真实感,可毕竟是免费的嘛。我们可以在这些仿真的机器人身上去学习如何控制机器人,读取它们的传感器数据,解析这些传感器数据并做出决策,通过前面我们学到的话题、服务、动作来驱动机器人。

1、操作仿真机器人

1.1、安装仿真软件

这里主要介绍turtlebot-gazebo的安装以及在这个过程中遇到的一些问题,主要是版本问题
安装命令如下

sudo apt-get install ros-indigo-turtlebot-gazebo

如果出现错误:

E: Unable to locate package ros-indigo-turtlebot-gazebo

这种安装出错的原因是Ubuntu的版本问题,比如本人的是Ubuntu 18.04版本,所以需要将indigo修改为melodic,这个在前面的文章也有介绍:Ubuntu18.04版本安装ROS及出现错误的处理方法

所以在安装之前,先查看自己的OS版本:uname -v 

修改之后,执行命令

sudo apt-get install ros-melodic-turtlebot-gazebo

不出意外的情况,将依然报错

E: Unable to locate package ros-melodic-turtlebot-gazebo

这个时候我们可以双击tab键来让其补全或出现可用的列表,因为很大程度上可能是输入的名称有误或者升级之后的名称有变化等,这种小技巧出了确保正确之外,还可以提高你的输入效率。 

输入:sudo apt-get install ros-melodic-turtlebot,将自动补全为turtlebot3,继续双击tab键,将出现的正确的提示:sudo apt-get install ros-melodic-turtlebot3-gazebo

从这里可以看到,turtlebot-gazebo版本已更新到了turtlebot3-gazebo,丢弃了以前的名称。 

当然这里的情况不一定就适合大家,只能说出现错误,一般就是这个名称有误的问题,这个时候就使用双击Tab键来正确提示!!

1.2、一些错误处理

安装好了之后,我们来启动仿真软件

roslaunch turtlebot3_gazebo turtlebot3_world.launch

出现如下错误:

... logging to /home/yahboom/.ros/log/23567ca0-54f7-11ee-91f8-000c294b0b84/roslaunch-YAB-3881.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

RLException: Invalid <arg> tag: environment variable 'TURTLEBOT3_MODEL' is not set. 

Arg xml is <arg default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]" name="model"/>
The traceback for the exception was written to the log file

从错误信息来看,这里有两个问题,一个是磁盘空间小了,日志文件需要超过1GB的容量;另一个问题是arg这个标签的问题,没有设置TURTLEBOT3_MODEL环境变量。
清理日志:

rosclean purge
rosclean check

设置环境变量:

export TURTLEBOT3_MODEL=burger

这里就是选定一个机器人,这里就选burger吧,还有一个waffle,大家可以试下

查看环境变量:

export [-p]

然后再次执行:roslaunch turtlebot3_gazebo turtlebot3_world.launch

当然这种环境变量的更改是临时的,推荐使用下面方法让其永久生效:

echo "export TURTLEBOT3_MODEL=burger" >> ~/.bashrc
source ~/.bashrc

再次启动,仿真软件的界面在初始化的时候,突然就出现下面这样的错误然后终止了:

log file: /home/yahboom/.ros/log/558bb39a-5509-11ee-86fb-000c294b0b84/spawn_urdf-4*.log
[Err] [REST.cc:205] Error in REST request

libcurl: (51) SSL: no alternative certificate subject name matches target host name 'api.ignitionfuel.org'
VMware: vmw_ioctl_command error Invalid argument.
Aborted (core dumped)
[gazebo_gui-3] process has died [pid 2350, exit code 134, cmd /opt/ros/melodic/lib/gazebo_ros/gzclient __name:=gazebo_gui __log:=/home/yahboom/.ros/log/558bb39a-5509-11ee-86fb-000c294b0b84/gazebo_gui-3.log].
log file: /home/yahboom/.ros/log/558bb39a-5509-11ee-86fb-000c294b0b84/gazebo_gui-3*.log

错误的意思是没有证书与这个主机名匹配,实质原因是主机名变更了,所以我们修改配置文件,修改如下:

gedit ~/.ignition/fuel/config.yaml

将里面的

url: https://api.ignitionfuel.org

修改为

url: https://fuel.ignitionrobotics.org 

还需要追加一个环境变量,解决VMware: vmw_ioctl_command error Invalid argument.这个错误问题

echo "export SVGA_VGPU10=0" >> ~/.bashrc
source ~/.bashrc

再次启动:roslaunch turtlebot3_gazebo turtlebot3_world.launch

当然上面是带障碍物的场景,也可以是空地图的场景:

roslaunch turtlebot3_gazebo turtlebot3_empty_world.launch

还有很多其余地图,同样双击tab键可以看到:roslaunch turtlebot3_gazebo

multi_map_merge.launch              turtlebot3_house.launch
multi_turtlebot3.launch             turtlebot3_simulation.launch
multi_turtlebot3_slam.launch        turtlebot3_stage_1.launch
turtlebot3_autorace_2020.launch     turtlebot3_stage_2.launch
turtlebot3_autorace.launch          turtlebot3_stage_3.launch
turtlebot3_autorace_mission.launch  turtlebot3_stage_4.launch
turtlebot3_empty_world.launch       turtlebot3_world.launch
turtlebot3_gazebo_rviz.launch

1.3、 操作机器人

我们可以直接通过命令行发送话题来操作里面的机器人,那么这个话题与类型又是怎么知道的呢?我们可以通过前面的知识来理解
首先查看话题列表:rostopic list

/clock
/cmd_vel
/gazebo/link_states
/gazebo/model_states
/gazebo/parameter_descriptions
/gazebo/parameter_updates
/gazebo/set_link_state
/gazebo/set_model_state
/imu
/joint_states
/odom
/rosout
/rosout_agg
/scan
/tf

这里可以看到主要是关于gazebo的话题,以及一些惯性测量单元IMU,关节话题等,里面的数据类型很多都属于传感器定义的类型。
我们查看其中的/cmd_vel信息:rostopic info /cmd_vel

Type: geometry_msgs/Twist

Publishers: None

Subscribers: 
 * /gazebo (http://YAB:38191/)

发送消息的数据类型是geometry_msgs/Twist,然后我们可以继续查看这个类型的详细信息:rosmsg show geometry_msgs/Twist

geometry_msgs/Vector3 linear
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular
  float64 x
  float64 y
  float64 z 

可以看到是由两个向量组成,一个是线速度,另一个是角速度。
有了这些之后,我们就可以通过输入命令,发布消息直接操作机器人:

rostopic pub /cmd_vel geometry_msgs/Twist -- '[1.0, 0.0, 0.0]' '[0.0, 0.0, 0.0]'

2、创建话题cmd_vel

有了前面命令行操作机器人的知识铺垫,我们重新来定义一个话题,名称就是上面这个cmd_vel

2.1、创建工作空间

mkdir -p ~/mywanderbot_ws/src
cd mywanderbot_ws/src
catkin_init_workspace

 2.2、创建依赖包

cd ~/mywanderbot_ws/src
catkin_create_pkg mywanderbot rospy geometry_msgs sensor_msgs

这样就创建好了一个mywanderbot包,以及让ROS构建系统需要知道的依赖包:rospy geometry_msgs sensor_msgs,这些依赖包是保证当依赖发生更改时,重新编译这个mywanderbot包到最新版本,以及在发布软件包时生成依赖。

我们可以查看下里面的情况:ls ~/mywanderbot_ws/src/mywanderbot

CMakeLists.txt  package.xml  src

关于这块代码,更多详情,有兴趣的可以查阅:ROS新建工作区(workspace)与包(package)编译的实践(C++示例)

2.3、自定义话题

我们试着来做一个让机器人每隔三秒进行行驶和暂停的周期性切换,这里给出两个示例

2.3.3、示例1
cd ~/mywanderbot_ws/src/mywanderbot/src
gedit red_green.py
#!/usr/bin/env python
import rospy
from geometry_msgs.msg import Twistmycmd_vel_pub = rospy.Publisher('cmd_vel',Twist,queue_size=1)
rospy.init_node('red_green')red_light_twist = Twist()
green_light_twist = Twist()
green_light_twist.linear.x = 0.5driving_forward = True
rate = rospy.Rate(10)
light_change_time=rospy.Time.now()while not rospy.is_shutdown():#print(light_change_time,rospy.Time.now())if light_change_time < rospy.Time.now():driving_forward = not driving_forwardlight_change_time= rospy.Time.now()+rospy.Duration(3)if driving_forward:mycmd_vel_pub.publish(green_light_twist)else:mycmd_vel_pub.publish(red_light_twist) rate.sleep()

这个网上例子比较多,很多都是书上的原内容是错误的,原例内容是:
if light_change_time > rospy.Time.now():
这样的话,永远不会执行到这个位置也就不会做切换了,需要将>修改为<,一开始小,所以就当前时间加3秒,比当前时间大,这个时间段就是等待当前时间一直累加,累加到小于当前时间,再次切换,加3秒,继续等待......

2.3.4、示例2
cd ~/mywanderbot_ws/src/mywanderbot/src
gedit red_green.py
#!/usr/bin/env python
import rospy
from geometry_msgs.msg import Twistmycmd_vel_pub = rospy.Publisher('cmd_vel',Twist,queue_size=1)
rospy.init_node('red_green')red_light_twist = Twist()
green_light_twist = Twist()
green_light_twist.linear.x = 0.5driving_forward = True
rate = rospy.Rate(1)while not rospy.is_shutdown():if int(rospy.get_time()) % 3 == 0:driving_forward = not driving_forward#print(rospy.Time.now().to_sec(),int(rospy.get_time())%3,driving_forward)if driving_forward:mycmd_vel_pub.publish(green_light_twist)else:mycmd_vel_pub.publish(red_light_twist) rate.sleep()

这种方式也不错,需要注意的是这里的频率不能是10了,需要每秒只发送一次,如果频率很快,试想下,在一秒钟里面进行取余会多次是一样的值,如果是0,那么会在这一秒钟内切换很多次,这肯定不可以。

2.4、编译与执行

添加可执行权限:chmod +x red_green.py

cd ~/mywanderbot_ws
catkin_make
echo "source ~/mywanderbot_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc

 执行上述节点:rosrun mywanderbot red_green.py

可以看到机器人行驶了起来,也可以查看话题发布的输出信息:rostopic echo  cmd_vel

linear: 
  x: 0.5
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: 0.0
---
linear: 
  x: 0.5
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: 0.0

2.5、rqt_graph

我们除了使用rostopic info cmd_vel查看这个话题的类型,发布者和订阅者之外,还可以用到前面章节介绍的rqt_graph来查看
发布的red_green节点通过cmd_vel话题,由gazebo机器人或其他订阅者订阅的关系图:

 

3、避障测试

我们打开的是带障碍物的地图,所以机器人遇到障碍物的时候会被迫停止,我们可以使用激光雷达LaserScan来测距,进行避障,这里用到实质是Turtlebot上的Kinect深度相机产生的数据。

3.1、激光雷达LaserScan

我们先来看下激光雷达的相关信息:

scan话题:rostopic info scan

Type: sensor_msgs/LaserScan

Publishers: 
 * /gazebo (http://YAB:36357/)

Subscribers: None

可以看到类型是sensor_msgs/LaserScan

查看sensor_msgs/LaserScan消息类型:rosmsg show sensor_msgs/LaserScan

std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
float32 angle_min
float32 angle_max
float32 angle_increment
float32 time_increment
float32 scan_time
float32 range_min
float32 range_max
float32[] ranges
float32[] intensities

查看scan的输出信息:rostopic  echo scan  -n 1

 header: 
  seq: 1
  stamp: 
    secs: 2537
    nsecs: 462000000
  frame_id: "base_scan"
angle_min: 0.0
angle_max: 6.28318977356
angle_increment: 0.0175019223243
time_increment: 0.0
scan_time: 0.0
range_min: 0.119999997318
range_max: 3.5
ranges: [0.377697229385376, 0.38358184695243835, 0.3849789798259735, 0.4099400043487549, ...]
intensities: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,...]

3.2、避障代码

前面的机器人实现了行驶和暂停的功能,接下来使用激光扫描来测距,并进行避开测试。

cd ~/mywanderbot_ws/src/mywanderbot/src
gedit mybot.py
#!/usr/bin/env python
import rospy
from geometry_msgs.msg import Twist
from sensor_msgs.msg import LaserScandef scan_cb(msg):global g_range_ahead#g_range_ahead = msg.ranges[len(msg.ranges)/2]g_range_ahead = msg.ranges[0]print(g_range_ahead)g_range_ahead = 1
cmd_vel_pub = rospy.Publisher('cmd_vel',Twist,queue_size=1)
scan_sub = rospy.Subscriber('scan',LaserScan,scan_cb)rospy.init_node('mybot')
state_change_time = rospy.Time.now() + rospy.Duration(30)
driving_forward = True
rate = rospy.Rate(10)while not rospy.is_shutdown():if driving_forward:if(g_range_ahead<0.8 or rospy.Time.now()>state_change_time):print(rospy.Time.now(),state_change_time)driving_forward = Falsestate_change_time = rospy.Time.now() + rospy.Duration(5)else:if(g_range_ahead>0.8 or rospy.Time.now()>state_change_time):driving_forward = Truestate_change_time = rospy.Time.now() + rospy.Duration(30)twist = Twist()if deriving_forward:if g_range_ahead>0.8:twist.linear.z=0.0twist.linear.x=0.5else:twist.linear.x=-0.2twist.angular.z=0.5else:if g_range_ahead>0.8:twist.linear.z=0.5twist.linear.x=0.0else:twist.linear.x=-0.2twist.angular.z=0.5 cmd_vel_pub.publish(twist)rate.sleep()

加个执行权限:chmod +x mybot.py

启动带障碍物的地图:roslaunch turtlebot3_gazebo turtlebot3_world.launch
执行:rosrun mywanderbot mybot.py

可以看到机器人在行驶中,遇到障碍物(小于0.8米)会进行避开,Nice~
这里使用一个全局变量g_range_ahead来存储激光扫描器检测到的最小距离,这使得回调函数变得简单,直接复制最小距离到我们的全局变量中,当然对于复杂的程序来说,这是一种不好的习惯,影响性能。 

查看下激光扫描:rostopic info scan

Type: sensor_msgs/LaserScan

Publishers: 
 * /gazebo (http://YAB:44733/)

Subscribers: 
 * /mybot (http://YAB:37459/)

可以看到订阅者就是我们定义的mybot机器人节点。
也可以使用rqt_graph来查看下节点之间的关系,如下图: 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/102834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java使用opencv实现人脸识别、人脸比对

1. opencv概述 OpenCV是一个开源的计算机视觉库&#xff0c;它提供了一系列丰富的图像处理和计算机视觉算法&#xff0c;包括图像读取、显示、滤波、特征检测、目标跟踪等功能。 opencv官网&#xff1a;https://opencv.org/ opencv官网文档&#xff1a;https://docs.opencv.or…

Spring三级缓存流程再梳理

本文主要是说下在使用spring时遇到了循环依赖&#xff0c;Spring利用三级缓存怎么解决 getBean(beanName)doGetBean(name, null, null, false);getSingleton(beanName)方法&#xff0c; 最后会通过addSingleton(beanName, singletonObject)存到一级缓存里面去createBean(beanN…

一文拿捏对象内存布局及JMM(JAVA内存模型)

1 JMM(Java Memory Model) 1 概述 Java内存模型(Java Memory Model简称JMM)是一种抽象的概念&#xff0c;并不真实存在&#xff0c;它描述的一组规则或者规范。通过这些规则、规范定义了程序中各个变量的访问方式。jvm运行的程序的实体是线程&#xff0c;而每个线程运行时&am…

Unity编辑器从PC平台切换到Android平台下 Addressable 加载模型出现粉红色,类似于材质丢失的问题

Unity编辑器在PC平台下使用Addressable加载打包好的Cube&#xff0c;运行发现能正常显示。 而在切换到Android平台下&#xff0c;使用Addressable时加载AB包&#xff0c;生成Cube对象时&#xff0c;Cube模型呈现粉红色&#xff0c;出现类似材质丢失的问题。如下图所示。 这是…

安全设备和防火墙

文章目录 微步TDP态势感知防火墙防火墙的负载均衡 微步TDP态势感知 安全设备的主要功能在黑名单&#xff0c;只要记住黑名单的功能在哪即可 常用的是威胁选项卡的监控功能&#xff0c;监控模块会把实时的告警列出来&#xff0c;只要列出来就能分析流量是误报还是真实的&#x…

tomcat服务tomcat多实例部署

tomcat服务&&tomcat多实例部署 文章目录 tomcat服务&&tomcat多实例部署1.简介2.优缺点优点&#xff1a;缺点&#xff1a; 3.工作原理4.工作流程5.tomcat服务部署5.1.java环境安装5.2.拉取tomcat软件包5.3.解压部署5.4.启动tomcat服务5.5.访问tomcat的web页面5.…

基于VUE的图书借阅管理系统的设计与实现

目录 一、摘要 二、技术描述 三、部分截图 四、获取方式 一、摘要 随着我国经济的高速发展&#xff0c;人们对图书的需求也愈发旺盛&#xff0c;而传统图书管理模式存在以下弊端&#xff1a;信息存储和分类操作不够高效&#xff0c;导致查找书籍困难&#xff1b;借还书流程…

【数据结构-栈 二】【单调栈】每日温度、接雨水

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【单调栈的应用】&#xff0c;使用【栈】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&am…

location rewrite

Nginx location 匹配的规则和优先级 Nginx常用的变量 rewrite: 重定向功能 Location 匹配 URI URI&#xff1a;统一资源的表示符&#xff0c;是一种字符串标识&#xff0c;用于标识抽象或者物理资源 先来巩固一些与location结合使用的正则表达式 正则表达式&#xff1a;匹…

基于安卓android微信小程序音乐播放器

运行环境 小程序前端框架&#xff1a;uniapp 小程序运行软件&#xff1a;微信开发者 后端技术:javaSsm(SpringSpringMVCMyBatis)vue.js 后端开发环境:idea/eclipse 数据库:mysql 项目介绍 音乐播放器小程序的设计主要是对系统所要实现的功能进行详细考虑&#xff0c;确定所要…

【机器学习 | 回归问题】超越直线:释放多项式回归的潜力 —— 详解线性回归与非线性 (含详细案例、源码)

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

【数据结构-字符串 四】【字符串识别】字符串转为整数、比较版本号

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【字符串转换】&#xff0c;使用【字符串】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…

Java Day1

day01 一、Markdown 基础语法1.标题2. 字体3. 引用 >4. 分隔线 --- ***5. 图片 ![]()6.超链接7.列表8.表格9.代码 代码名称 二、计算机三、常用快捷键1. Win 系列2. Ctrl 系列3. ALt 系列 四、 基本的DOS命令1. 打开方式&#xff1a;2. 常用DOS命令 五、计算机语言发展史第一…

【软件测试学习】—软件测试知识点总结(二)

【软件测试学习】—软件测试的分类&#xff08;二&#xff09; 一、软件测试的分类 二、软件的生命周期 三、软件测试的工作流程 四、软件测试用例设计方法 &#xff08;一&#xff09;、等价类划分 定义&#xff1a;等价类划分是一种典型的、重要的黑盒测试的方法&#xff…

从零开始探索C语言(十一)----共用体和位域

文章目录 1. 共用体1.1 定义共用体1.2 访问共用体成员 2. 位域2.1 位域声明2.2 位域的定义和位域变量的说明2.3 位域的使用2.4 位域小结 1. 共用体 共用体是一种特殊的数据类型&#xff0c;允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体&#…

JavaFx学习问题2--音频、视频播放失败情况

文章目录 一、路径注意事项&#xff1a;① 用相对路径的时候别忘了前面的斜杠② uri问题 二、播放不了的问题① 获取的媒体文件路径本身就是不对的② 必须是uri 额外收获: 一、路径注意事项&#xff1a; ① 用相对路径的时候别忘了前面的斜杠 并不是什么大问题&#xff0c;只是…

2.Javaweb模块基本

1.1web基本 session 和 cookie 有什么区别&#xff1f; 存储位置不同&#xff1a;session 存储在服务器端&#xff1b;cookie 存储在浏览器端。 安全性不同&#xff1a;cookie 安全性一般&#xff0c;在浏览器存储&#xff0c;可以被伪造和修改。 容量和个数限制&#xff1a;…

机器学习之旅-从Python 开始

你想知道如何开始机器学习吗&#xff1f;在这篇文章中&#xff0c;我将简要概括一下使用 Python 来开始机器学习的一些步骤。Python 是一门流行的开源程序设计语言&#xff0c;也是在人工智能及其它相关科学领域中最常用的语言之一。机器学习简称 ML&#xff0c;是人工智能的一…

LCD12864驱动开发

目录 一、概述 二、方框图 三、模块接口说明 1、串口接口管脚信号 2、并行接口 四、模块主要硬件构成说明 1、RS&#xff0c;R/W配4种模式&#xff1a; 2、E信号 五、指令说明 六、读写时序图 6.1 数据传输过程 6.2、时序图 6.3、串口读写时序 七、交流参数 八、软件…

Maven Eclipse

Eclipse 提供了一个很好的插件 m2eclipse &#xff0c;该插件能将 Maven 和 Eclipse 集成在一起。 在最新的 Eclipse 中自带了 Maven&#xff0c;我们打开&#xff0c;Windows->Preferences&#xff0c;如果会出现下面的画面&#xff1a; 下面列出 m2eclipse 的一些特点&a…