jjzjj

【ROS机器人系统】自主导航+YOLO目标检测+语音播报

-借我杀死庸碌的情怀- 2023-08-29 原文

文章目录

一、总体功能设计

完成自主导航功能,并在小车移动至指定地点的过程中,通过机器人的摄像头检测导航途中所见物体,识别出物体的种类(框选出不同物体并标注识别结果),结合科大讯飞语音合成模块对识别结果进行语音播报。

(注:目标检测,也叫目标提取,是一种基于目标几何和统计特征的图像分割。它将目标的分割和识别合二为一,其准确性和实时性是整个系统的一项重要能力。)

二、实验环境

Windows10
VMware虚拟机 ubuntu18.04
Ros melodic

三、演示

演示地址:https://www.bilibili.com/video/BV1tB4y1Y7UH

四、场景搭建、建图与导航模块

4.1 场景搭建

  • gazebo Building Editor
  • 场景概览

    由于官方的模型库中没有我所使用的YOLO模型中能够检测到的特征鲜明的物体,如猫、狗、大象、马、苹果、香蕉等,所以部分物体(如图中的香蕉)放在相框中的图片中进行识别。
  • 设置的小车主要识别的区域

4.2 小车模型

本次课设使用的是TurtleBot3中的Waffle小车,下图中的中间一个(含有雷达与摄像头)

小车模型在rviz中展示

4.3 导航模块

  • 注:对应github文件中的test_ws工作空间

gmapping 通过粒子滤波将激光距离数据转化为珊格地图。

  • 优点:在长廊及低特征场景中建图效果好;构建小场景地图所需的计算量较小且精度较高。缺点:依赖里程计,无法适用无人机及地面小车不平坦区域;无回环;大的场景,粒子较多的情况下,特别消耗资源。

主要参考:我在github上传的这个文件:导航模块参考.pdf

(1)安装依赖

在开始该部分设计之前,我们先安装相关支持的功能包,包括建图、导航以及机器人仿真的功能包(克隆下载后仅保留turtlebot3_gazebo文件夹),相关命令如下:

sudo apt-get update  
sudo apt-get install ros-melodic-turtlebot3-*  
sudo apt-get install ros-melodic-navigation  
sudo apt-get install ros-melodic-slam-gmapping  
git clone https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git  
sudo apt-get install ros-melodic-dwa-local-planner  
  • 在使用仿真机器人之前先利用以下命令确定机器人类型,在 test_ws 目录下运行:
echo “export TURTLEBOT3_MODEL=waffle” >>~/.bashrc

(2)从github下载的文件中的test_ws目录下

先 catkin_make编译然后刷新工作空间,最后在运行 launch文件即可完成整体功能的启动,建图流程:
在test_ws目录下运行以下两条命令

roslaunch turtlebot3_gazebo turtlebot3_world.launch  
roslaunch my_navi build_map.launch  

运行完上述前两条命令之后会出现一个仿真的场景,然后rviz中会显示当前建图结果,然后运行下面的命令会出现键盘控制界面,

rosrun turtlebot3_teleop turtlebot3_teleop_key  

可以利用“w”,“a”,“s”,“d”来控制机器人移动,这四个按键分别控制向前移动、向左自旋、停止和向右自旋,合理的控制机器人移动来建立环境地图,结果如图3所示,最后利用下面的命令保存建图结果,

rosrun map_server map_saver -f map2  

产生图片名为“map2.pgm”和名为“map2.yaml”的地图参数,相关建图结果如图所示

  • 开始建图的时候
  • 建图完成
  • 控制小车建图的时候各个节点之间的通信情况

(3)运行导航功能

导航相关命令如下,在 test_ws 目录下执行命令之后会出现仿真场景和 rviz,点击 rviz 导 航栏的“2D Nav Goal”,然后点击地图上的任意空白地点之后机器人会自动导航至目标点, 并且 rviz 和仿真地图中机器人的动作在没有系统延时的时候会保持一致。

roslaunch turtlebot3_gazebo turtlebot3_world.launch  
roslaunch my_navi turtlebot_navigation.launch  

五、YOLO目标检测模块

注:对应github文件中的yolo_ws工作空间
主要参考:小车yolo机械臂(一)ros下gazebo搭建小车(可键盘控制)安装摄像头仿真 加载yolo检测识别标记物体

5.1 YOLO介绍

YOLO(You Only Look Once) 是一种基于深度神经网络的对象识别和定位算法,其最大的特点是运行速度很快,可以用于实时系统。

5.2 本课设尝试使用过的YOLO模型

注:本课设使用的是yolov2_tiny.weights(能识别80种类别的物体)

注:YOLO_weights网盘下载链接:https://pan.baidu.com/s/1wQHcdP5kQWm8qL_qxqhPdw?pwd=o7fp
提取码:o7fp --来自百度网盘超级会员V2的分享

六、语音合成模块

sudo apt-get install sox
为了不要每次运行都souce,把x64目录下的共享库文件拷贝到/usr/lib/,先cd到voice/libs/x64目录下
cp libmsc.so /usr/lib/

七、小车摄像头与YOLO模块的通信

7.1 小车摄像头模块发布话题消息

找到导航模块中小车的摄像头对应的话题名称:
打开小车导航模块的时候在rviz中添加camera(可以用来查看小车摄像头的实时画面),然后选择话题名称:/camera/rgb/image_raw
(也可以在rqt_image_view中查看话题名称)

  • rviz中添加camera
  • 选择topic
  • rqt_image_view中查看摄像头话题名称

7.2 YOLO模块模块订阅话题消息

在YOLO模块中订阅该话题:

  • 通信过程

八、YOLO模块与语音合成模块的通信

8.1 YOLO模块模块发布话题消息

YOLO检测模块中的ros.yaml文件中,发布话题/darknet_ros/bounding_boxes

rostopic echo /darknet_ros/bounding boxes,展示发布到topic上的消息数据,Class是需要获取到的识别结果

8.2 语音合成模块订阅话题消息

  • 语音合成模块节点
  • 在回调函数中获取话题/darknet_ros/bounding boxes消息中的Class内容:
  • 通信过程

九、演示时各模块的启动命令

(在test_ws路径下)启动gazebo:roslaunch my_navi xinyang.launch
(在test_ws路径下)启动导航模块:roslaunch my_navi turtlebot_navigation.launch
(在yolo_ws路径下)启动YOLO模块:roslaunch darknet_ros darknet_ros.launch
(在catkin_ws路径下)启动语音合成模块:rosrun voice_system xf_tts_node

十、全局概览

  • 全局:各节点之间的通信情况

注意事项;

实验的过程中遇到了许多的bug和问题,例如:

  • YOLO模块检测物体的时候检测框的左上角不出现文字(后来发现是缺少labels文件);
  • gazebo打开的时候可能会崩溃(后来发现是虚拟机的问题,需要关闭vmware的3D图形加速选项);
  • 关闭gazebo的时候尽量使用ctrl+C去关闭,直接关闭窗口可能不能完全关闭gazebo的全部进程(此时需要重启);
  • 使用语音模块去订阅YOLO模块发送的消息的时候要处理好/darknet_ros/bounding boxes话题信息,在回调函数中提取其中的识别结果。
  • 安装ros可参考:
    Ubuntu18.04上安装ROS的详细教程
    Ubuntu18.04安装Ros(最新最详细亲测)

源码:

github源码地址:https://github.com/xinyangwy/ROS_DesignCode

有关【ROS机器人系统】自主导航+YOLO目标检测+语音播报的更多相关文章

  1. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  2. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  3. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  4. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  5. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  6. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

  7. ruby - 在没有基准或时间的情况下用 Ruby 测量用户时间或系统时间 - 2

    因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实

  8. ruby - 以毫秒为单位获取当前系统时间 - 2

    在Ruby中,以毫秒为单位获取自纪元(1970)以来的当前系统时间的正确方法是什么?我试过了Time.now.to_i,好像不是我想要的结果。我需要结果显示毫秒并且使用long类型,而不是float或double。 最佳答案 (Time.now.to_f*1000).to_iTime.now.to_f显示包含十进制数字的时间。要获得毫秒数,只需将时间乘以1000。 关于ruby-以毫秒为单位获取当前系统时间,我们在StackOverflow上找到一个类似的问题:

  9. ruby - 检测由 RSpec、Ruby 运行的代码 - 2

    我想知道我的代码是否在rspec下运行。这可能吗?原因是我正在加载一些错误记录器,这些记录器在测试期间会被故意错误(expect{x}.toraise_error)弄得乱七八糟。我查看了我的ENV变量,没有(明显的)测试环境变量的迹象。 最佳答案 在spec_helper.rb的开头添加:ENV['RACK_ENV']='test'现在您可以在代码中检查RACK_ENV是否经过测试。 关于ruby-检测由RSpec、Ruby运行的代码,我们在StackOverflow上找到一个类似的问题

  10. ruby - 使用 Ruby Daemons gem 检测停止 - 2

    我正在使用rubydaemongem。想知道如何向停止操作添加一些额外的步骤?希望我能检测到停止被调用,并向其添加一些额外的代码。任何人都知道我如何才能做到这一点? 最佳答案 查看守护程序gem代码,它似乎没有用于此目的的明显扩展点。但是,我想知道(在守护进程中)您是否可以捕获守护进程在发生“停止”时发送的KILL/TERM信号...?trap("TERM")do#executeyourextracodehereend或者你可以安装一个at_exit钩子(Hook):-at_exitdo#executeyourextracodehe

随机推荐