fetch是硅谷机器人公司FetchRobotics的仓储机器人,Fetch的机器人可以根据订单把货架上的商品拿下来,放到另一个叫Freight的机器人里运回打包
本次实验使用fetch机器人,完成了语音识别(Pocketphinx)、建图(Karto_Slam)与导航(amcl)、图像处理(YOLO V3)、机械臂抓取功能(Moveit!),其中将语音识别和建图与导航进行了结合,通过识别关键词"Move",实现机器人自动导航至指定地点,基于建图生成的地图完成机器人的自我位置的标定,通过yolo识别物体并且实现机械臂抓取物块的功能。
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
问题解决
软件包提供对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) # 这是主要的移动函数,具体内容请看源码
问题解决
【ROS_bug】rospy.init_node() has already been called with different arguments
该问题的错误是因为一个 python 文件中只能初始化一个节点,而语音和导航py文件都各自初始化了节点,所以导致运行错误
修改
# 直接在语音的py文件中初始两个节点
rospy.init_node("asr_control",'navtopoint')
YOLO(You Only Look
Once)将整个图像输入到网络中,可以直接预测目标位置和对应的类别.这使得YOLO推理速度很快并且保持较高的精度.
功能实现
本次实验采用darknet_ros网络,通过launch文件直接调用yolo目标检测
roslaunch darknet_ros darknet_ros.launch
问题解决
使用机械臂实现了对物块抓取及摆放功能
功能实现
基于Moveit,识别视野内的物体,如果发现目标,则展开机械臂对其进行抓取,抓取后中空中进行一定程度的转动,随后放置回桌子上
问题解决
在ros平台下,需要很多的配置以及命令调用,安装相关依赖以及项目部署的时候,会有各种各样的问题,不同的设备也会有不同的情况,首先是需要有耐心和细心去查看问题,并且要利用好网络上的资源,了解别人的解决办法,从而解决自己的问题
单个功能的实现是比较简单的,但是当多个功能综合应用的时候,会出现很多的问题,比如在本次实验中语音导航后进行机械臂抓取就会遇到视野丢失物块的问题,除了多次重复实验,还要去注意为什么会出现定位偏差,为什么位置确认耗时较长,这些都会影响到整体程序的运行
将网上的资源进行调用时,要学会明白其中的原委,这样在完成自己需求的特定功能时,会知道如何修改,建议可以多花一些时间去阅读源码,这样既可以了解别人的优秀编写,也更方便二次开发,将开源的利发挥的更大