ros机器人gazebo仿真
ros实现机器人gazebo仿真,使用fetch机器人完成语音识别、建图与导航、机械臂抓取、图像识别
fetch实现建图、导航、语音、图像处理、机械臂抓取
实验内容介绍
fetch是硅谷机器人公司FetchRobotics的仓储机器人,Fetch的机器人可以根据订单把货架上的商品拿下来,放到另一个叫Freight的机器人里运回打包
本次实验使用fetch机器人,完成了语音识别(Pocketphinx)、建图(Karto_Slam)与导航(amcl)、图像处理(YOLO V3)、机械臂抓取功能(Moveit!),其中将语音识别和建图与导航进行了结合,通过识别关键词"Move",实现机器人自动导航至指定地点,基于建图生成的地图完成机器人的自我位置的标定,通过yolo识别物体并且实现机械臂抓取物块的功能。
技术实现
1. 建图(Karto_Slam)
Cartographer用分支定界原理加速求解过程(相对于暴力求解),进行深度有限优先搜索,CSM计算得到初始最高分数,确定深度,分支就是进行拓展,定界就是剪枝。提高运算效率。
先有一定数量的laser scan构建submap,由submap拼接成地图,所谓的回环检测,就是间隔一定数量的扫描进行一次所有submap的图优化(SPA,运用了分支定界原理进行加速)。
功能实现
在开启机器人模型及gazebo世界后,打开建图,使用rviz进行可视化,通过键盘控制,在地图中进行移动,保证机器人能够观测到地图中的每一个角落,并且环绕物体四周,保证建立物体的完整图像
在调用rviz之前,要先进入fetch机器人的navigation文件中,从而调用Karto_Slam方法进行建图
//建图可视
roscd fetch_navigation/config
rviz -d navigation.rviz
在建图完成后要进行地图保存,将其保存到/tmp文件夹
rosrun map_server map_saver -f /tmp/fetch_map
问题解决
- 建图缓慢且误差大
在一开始使用的是gmapping方法,建图非常满,而且起始位置以及建图路径都对结果影响极大,查询后了解到gmapping严重依赖里程计,无法适应无人机及地面不平坦的区域,无回环(激光SLAM很难做回环检测),大的场景,粒子较多的情况下,特别消耗资源。于是换成了Karto_Slam
在更换建图方法后,建图成功率大大提高,偶尔会出现失败的情况,推测原因为在没有建立好周围环境的情况下,在内部建图出现视深偏差,尽量保证贴着墙体走可以提高成功率 - 文件保存位置
默认保存位置为/tmp文件夹,但在重启后文件会清空,导致无法调用地图,在生成后复制到其他位置即可
2. 语音识别(Pocketphinx)+导航(amcl)
软件包提供对CMU Pocket Sphinx语音识别器的访问。它使用gstreamer自动将传入的音频分割为要识别的语音,并提供启动和停止识别的服务。
功能实现
下载好相关依赖后,通过调用软件包中的launch文件可以开启语音识别,此时电脑开启麦克风,软件包将会对关键词进行识别
为了在识别到关键词后作出自定义动作,我们编写了一个py文件,通过发布ros相关节点,对机器人进行姿态控制,为了加深ros应用并更好的体现自动控制,实验中将语音识别与导航进行了结合,规定关键词Move为导航触发词,当软件包识别到Move后,将小车移动到位置2.95,3.3,0,部分代码如下
#语音py文件中对识别到的关键词进行自定义操作
elif detected_words.data.find("move") > -1:
print('move')
nv2.main(2.95,3.3,0)
# 导航文件中的main函数
def main(X,Y,theta):
X,Y,theta = float(X),float(Y),float(theta)
target_pose=[X,Y,theta]
parser = argparse.ArgumentParser(description='move_base navigation')
parser.add_argument('--nonblocking', help='Send the goal in non-blocking mode', action='store_true')
args = parser.parse_args()
nav = NavToPoint()
nav.goto(target_pose,not args.nonblocking) # 这是主要的移动函数,具体内容请看源码
问题解决
- 语音识别不准确
在调用pocketphinx软件包时,会出现关键词检测不到的情况,在测试过程中发现是发音的问题,通过使用英语软件发音即可 - 语音与导航的连接
在测试时,语音和导航的py文件是各自独立的,这样就没有办法通过语音驱动机器人导航运动,通过阅读代码,发现可以在语音py文件中识别到关键词后,调用导航的py文件,根据上文的代码部分,即可实现二者功能的连接,但是在运行时出现了错误
提示
【ROS_bug】rospy.init_node() has already been called with different arguments
该问题的错误是因为一个 python 文件中只能初始化一个节点,而语音和导航py文件都各自初始化了节点,所以导致运行错误
修改
# 直接在语音的py文件中初始两个节点
rospy.init_node("asr_control",'navtopoint')
- 导航至目标位置后姿态角与设定不符
通过代码可以知道,设定的thata角为0,但是在实际运行的过程中,机器人到达指定的X,Y后总是出现很大的姿态偏角,影响到后续的物块识别以及机械臂抓取
进行相关了解后,机器人在导航的过程会不断识别周围的物体进行自我定位,如果可识别特征较少,将可能出现错误导航以及长时间位置寻找的过程,于是本次实验在初始的地图上添加了新的方块以便特征读取及位置定位,但仍需一定时间稳定位置,下面是添加方块前后的建图
3. 图像识别(YOLO V3)
YOLO(You Only Look
Once)将整个图像输入到网络中,可以直接预测目标位置和对应的类别.这使得YOLO推理速度很快并且保持较高的精度.
功能实现
本次实验采用darknet_ros网络,通过launch文件直接调用yolo目标检测
roslaunch darknet_ros darknet_ros.launch
问题解决
- darknet_ros编译错误
在进行catkin_make编译后无法寻找到launch文件,添加路径、删除build文件夹方法都失败,不太清楚出了什么问题,最终解决是将darknet_ros放置到其他文件夹进行编译并添加全局路径 - FPS只有2-3
通过修改void *YoloObjectDetector::detectInThread()中的内容即可修改FPS,修改内容根据具体情况添加
4. 机械臂(Moveit!)
使用机械臂实现了对物块抓取及摆放功能
功能实现
基于Moveit,识别视野内的物体,如果发现目标,则展开机械臂对其进行抓取,抓取后中空中进行一定程度的转动,随后放置回桌子上
问题解决
- 安装Moveit提示Could not find a package configuration file provided by “manipulation_msg”
在对应的src文件夹下git clone缺少的文件 - 抓取失败
在实验的过程中,出现了多次抓取失败的例子,总结有以下原因:- 视野内未发现物块
该方法是因为机器人位置的问题,要注意将机器人移动到物块面前,通过rqt_image_view来查看机器人的视野,从而确定位置是否可以进行抓取 - 机器人在移动机械臂的过程出现了位置移动
在实验中,出现因为移动机械臂导致了碰撞,使得机器人发生了位移,从而视野中丢失物块,解决办法同上 - 因物体物理属性导致抓取失败
如果物体过大或者质量过大,都会导致失败,前者超出fetch机器人机械臂的抓取宽度,则无法抓取;后者在抓取的过程中受重力的原因可能会导致物体掉落
- 视野内未发现物块
实验总结
在ros平台下,需要很多的配置以及命令调用,安装相关依赖以及项目部署的时候,会有各种各样的问题,不同的设备也会有不同的情况,首先是需要有耐心和细心去查看问题,并且要利用好网络上的资源,了解别人的解决办法,从而解决自己的问题
单个功能的实现是比较简单的,但是当多个功能综合应用的时候,会出现很多的问题,比如在本次实验中语音导航后进行机械臂抓取就会遇到视野丢失物块的问题,除了多次重复实验,还要去注意为什么会出现定位偏差,为什么位置确认耗时较长,这些都会影响到整体程序的运行
将网上的资源进行调用时,要学会明白其中的原委,这样在完成自己需求的特定功能时,会知道如何修改,建议可以多花一些时间去阅读源码,这样既可以了解别人的优秀编写,也更方便二次开发,将开源的利发挥的更大
更多推荐
所有评论(0)