上一篇:【Tutlebot迎宾机器人(一)】总体原理与设计

2. 具体开发实现

2.1 Gazebo 室内和 Turtlebot3 模型搭建及建图

2.1.1 室内环境的搭建

房间内各元素其中部分采用 gazebo 模型中自带的 marble table 和 table,房间另外所需的 sofa 和 chair 等由正方体堆砌而成,如图 7 所示。
在这里插入图片描述
在模拟仿真三个客人时,采用了两种方案。其一是使用 gazebo 中的standing_person模型包,对 textures 中的瞳孔图片或者眉毛、头发图片进行替换,如图 8 所示。
在这里插入图片描述
优点是较为简洁方便,模型更加真实,贴近正常的人;然而只对五官图片进行替换的后果是三位客人的区分度不高,为后续人脸识别的同学增加难度。
其二是使用长方体代替躯干、由圆柱体代替头部,并为圆柱体添加 texture 为真人的照片。这种方法弱化了人体结构的真实性,但是人脸图片比第一种方案更加真实,容易分辨,如图 9 所示。
在这里插入图片描述
该实验仿真环境主要由三个房间构成,其中一个为主接待室如图 10 所示,其余两个是简易办公室, 如图 11 所示。本次实验的主要实现过程都在主接待室中。
在这里插入图片描述
在这里插入图片描述

2.1.2 修改 Turtlebot3 模型的 URDF 文件

本次实验中选用的是 turtlebot 三代,如图 12 所示。这是一款小型的、低成本的、完全可编程的,在 ROS 基础上开发的开源移动平台,主要用于教育目的、研究、产品原型设计和机器人爱好者应用。
Turtlebot3 包中含有三个模型,分别是 burger、waffle、waffle-pi,其中我们选择的是 waffle,同时装 有激光雷达和 kinect 摄像头。
在这里插入图片描述
参照turtlebot_empty_world.launch中加入 turtlebot3 的语句,在上述建好的房间中添加 turtlebot3 模型。
由于人的高度远高于机器人的高度,机器人的摄像头无法拍摄到人脸,我们需要提高 turtlebot3 的高 度和摄像头的高度。通过修改turtlebot3_waffle_ urdf_ Xacro文件中base_link节点中的 scale 可以 修改整体机器人的高度,同样,修改camera_link中的 box size 可以修改摄像头的高度。修改后的 turtlebot3 如图 13 所示。
在这里插入图片描述

2.1.3 建图

在 gazebo 中建好仿真环境之后,将 turtlebot3 包下的turtlebot3_slam.launch和turtlebot3_teleop_key.launc 制至工作区的 launches 文件中,利用激光雷达 (Hokuyo) 在 Turtlebot3 平台上实现 gmapping 构建地图, 实现机器人在未知环境中从未知位置开始移动,在移动过程中依据位置估计和地图进行自身定位,在定 位基础上同步增量建立地图,而实现自主定位和导航。由于使用自动遍历房间时,容易有一些边角处被 忽略掉,所以使用键盘控制 turtlebot3 移动建全地图并保存得到.pgm图片(如图 14 所示)和.yaml文件。
在这里插入图片描述

2.2 人脸识别模块

通过阅读 face++ 的用户手册熟悉了 face++ 的各类 API 的使用方法。发送经过配置的 API 结构给服务端,服务端进行运算并返回人脸的检测和对比结果,再从将返回的数据通过 JSON 变换为 python 中的字典,在字典中查找所需的相对应的信息。

人脸检测功能通过 face++ 中的 detect API 实现,而人脸对比查找功能则通过 compare API 实现。 在完成两个功能后,将其封装为了 ROS 中的节点,注册了两个服务并定义了相应的数据类型如图 15 所 示。之后利用图片实例进行测试,并将代码以 ROS 中功能包的形式提交。

在这里插入图片描述

2.3 语音识别模块

2.3.1 科大讯飞 SDK

首先从官网 上下载 SDK,流程如下:

  • 在 科大讯飞官网 右上角“注册”。
  • 进入“我的应用”,第一次进来是没有的应用的;点击右上角“+ 创建新应用”,填好信息,提交。
  • 在“我的应用中”找到刚才创建的应用,“SDK 下载”,“添加更多”AI 功能后,点击“SDK 下 我添加的语音听写和语音合成。
  • 下载压缩文件,解压到工作空间的 src 文件夹下。

接着按如下流程编译 SDK:

  • 进入目录:cd Linux_iat1227_tts_online1227_5ff12445/
  • 执行:source 64bit_make.sh
  • 若报错“Error: alsa/asoundlib.h: No such file or directory”,则安装:sudo apt−get install libasound2−dev
  • 编译:make

按如下过程修改 SDK:

  • 在工作空间下新建功能包,并编译整个工作空间;
  • 将之前下载的科大讯飞 SDK 里的 iat_online_record_sample 功能包下的.c 和.h 文件复制到 robot_voice/src 下;
  • 在科大讯飞网站上查看自己的 Appid ,这是科大讯飞提供的用户标识 id ,通过这个 id 可以登录到 我自己创建的应用,将 iat_online_record_sample.c 中 appid 修改为我自己的;
  • 将 Linux_iat1218_5c6e7f8d/include 下的.h 文件复制到 robot_voice/include 下;
  • 在 CMakeLists.txt 下添加编译规则,如下:
      include_directories ( 
      include 
      ${catkin_INCLUDE_DIRS} 
      ) 
      add_executable(
      iat_publish src/iat_publish .cpp
      src/speech_recognizer.c
      src/ linuxrec .c) 
      target_link_libraries (
      iat_publish ${catkin_LIBRARIES} libmsc.so −ldl −lpthread −lm −lrt −lasound)
    
  • 编译整个工作空间。

2.4 自主导航模块

2.4.1 完成任务的过程

  • 编写多点导航代码;
  • 根据导航需求,在 gazebo 中确定机器人导航目标点位姿并记录;
  • 将代码封装为类。

    2.4.2 代码说明

    将位姿信息存储在数组 waypoints 中,定义goal_pose()函数,该函数功能为提取 waypoints 数组元 素的 position 与 orientation。

在主函数中,首先初始化节点名称为 patrol,接着创建 action 客户端 client,且 client 发送的消息为 MoveBaseAction。在需要导航时,利用goal_pose()函数获取 waypoints 中存储的位姿,利用 client.send_goal()向 服务器发送位姿信息,client.wait_for_result()等待服务器响应。

2.4.3 记录目标点位姿

启动 gazebo 环境地图,同时启动建好的地图并 rviz 可视化,通过 2D Nav Goal 在 rviz 中移动机 器人,并在 Image 中接收camera/rgb/image_raw消息以得到摄像头视图,将机器人移动至合适目标位姿 后,通过“rostopic echo amcl_pose -n 1”打印位姿信息。