【大一立项】ROS服务机器人-结题报告

知乎:Magical-E
Github:Magical-E
项目展示:【大一立项】亲手搭建ROS机器人小车

1.课题背景

近年来,机器人领域飞速发展,各种技术层出不穷。从四足机器狗的运动,到阿尔法狗战胜柯洁,再到无人驾驶上路测试,各种新发明、新成果向我们表明机器人将会给社会带来翻天覆地的变化。未来,机器人必将会引领人们的工作进行智能化升级,帮助人们更高效、更准确、更节省成本地完成工作。随着人工智能、云计算的发展,机器人所需要的成本不断下降,在可以遇见的未来,一大批服务机器人将出现在前台迎宾、餐厅送菜、养老服务、清洁康复等领域,而我国服务机器人起步较晚,但发展迅猛、需求巨大,值得引起关注。服务机器人通常应用于非确定性环境,如酒店、家庭、医院,需要通过激光雷达、深度摄像头等传感器对周围环境进行感知,还要通过语音交互与人共同协作才能完成任务。本文从服务机器人所需的基本功能入手,初步学习了所需功能的经典算法原理,并复现了经典算法在服务机器人上的效果。

2.课题研究内容与方法

服务机器人所需要的功能包括但不限于:自主移动、语音交互、环境感知、路径规划、目标检测、目标跟踪等功能,项目组自主搭建基于Arduino的底盘完成了机器人的自主移动,使用树莓派和Jetson Nano运行ROS将Gmapping、RGB-DSLAMv2、路径规划(A* & TEB)、语音交互、YOLOv3目标检测、KCF目标跟踪等算法整合到机器人上,并检测算法效果。

2.1底盘搭建

底盘为两轮差速模型,采用Arduino作为下位机,树莓派作为上位机。Arduino接收树莓派的速度信息,通过L298N对两个直流减速电机进行调速;并且接收霍尔编码器数值,返回给树莓派。树莓派计算出速度后发送给Arduino,并且接收Arduino反馈的编码器数值,将编码器进行积分得出底盘的里程计信息。流程如下:

在这里插入图片描述

2.2 Gmapping原理与实践

​ 服务机器人想要获得周围的环境信息以及自身在环境中的位姿需要SLAM,目前较为经典的SLAM算法有Gmapping、Karto、Cartographer、Hector等算法,本次项目主要学习了Gmapping的原理,并检测了小范围建图的效果。

原理: SLAM指实时位姿估计和地图构建,对于激光SLAM,由于激光的数据较为准确,使用覆盖栅格建图可以很好地构建地图,所以主要任务便是位姿估计。Gmapping优化了基于RBPF的粒子滤波器:1. 优化粒子耗散问题:减少重采样次数来避免粒子多样性被耗散:通过公式在这里插入图片描述评估粒子权重的分散度,当Neff小于一定阈值时,说明粒子分布与真实情况差距较大,此时才应该进行重采样;而Neff未小于阈值时,说明粒子分布与真实情况较为符合,可以减少重采样次数。2. Gmapping通过改善提议分布来优化滤波器,提升proposal分布采样的效果来减少所需粒子数,从而减少内存消耗,配合里程计仅需30个粒子便能较好地估计位姿、构建地图:里程计给出预测后,激光雷达进行一次扫描匹配得到图示L所代表的尖峰区域,在L区域内选择K个点计算里程计的均值与方差,得到了真实位姿的近似分布,在高斯分布中采用的粒子有更好的效果,从而可以减少所需粒子数目。
在这里插入图片描述
实践:在ROS中编译好相关软件包后,配置对应launch文件,添加好laser到base_link的静态TF变换便可运行。但最开始建图效果很差,后来发现是里程计未进行校准,在进行里程计的标定(轮径和轮距)后效果有一定提升,最终效果如下:
在这里插入图片描述
如图可见:即便Gmapping没有回环检测算法,但依靠粒子多样性仍能够在小回环中消除累计误差。虽然目前基于图优化的Cartographer已经基本取代gmapping,但作为经典SLAM的Gmapping凭借简洁、计算量小等特点仍值得学习。

2.3 RGB-D SLAMv2实践

顾名思义,RGB-D SLAMv2采用深度摄像头,通过对RGB图与深度图(Depth)处理生成点云,SLAM主要分为四个部分:前端、后端、闭环检测、建图:
在这里插入图片描述
实践:由于RGB-D SLAMv2使用g2o优化并且用点云表示三维地图,所以在使用前首先要编译好g2o与PCL库。编译完成后需要改写launch文件,将相机的RGB图像的topic、深度图像的topic和相机参数的topic重映射到launch所需的话题名。由于使用点云表示三维地图消耗的内存较大,运行时需要缓慢移动相机,效果如下:
在这里插入图片描述

2.4 EKF & AMCL & 路径规划

对于服务机器人而言,最重要的就是能够自主移动到想要到达的位置,即自主导航。导航之前机器人首先需要定位自身位置,然后通过SLAM为机器人建立的拓扑地图进行全局路径规划。全局路径规划器规划好全局路径后,为了让机器人尽量沿着规划的全局路径走会,同时避免在路线中碰撞到突然出现的障碍物,局部路径规划器会根据激光雷达的扫描信息规划出一条局部路径,然后根据局部路径不断发送速度给底盘控制器完成导航。导航的总体框架如下:
在这里插入图片描述
机器人需要准确定位自身位置,由于单独由编码器积分得出的odom存在一定的累计误差,可以让线速度主要由编码器计算,而角速度主要由IMU计算,在设置好编码器和imu的协方差后,通过扩展卡尔曼滤波robot_pose_ekf将编码器信息和imu信息进行融合,得出odom_combined话题:

在这里插入图片描述
在导航的过程中可能会出现意外情况让里程计跑飞,为了避免这样的情况,导航包中提供了AMCL即自适应蒙特卡罗定位的功能包用于定位机器人的位姿。AMCL是基于粒子滤波的定位方法,可以通过设置粒子数目和粒子分布情况来调节定位效果。在给定初始位姿后,该算法会在对应位置散布一定数量的粒子,机器人进行移动后,根据激光雷达扫描信息进行滤波处理,粒子会逐渐收敛得到准确位姿:
在这里插入图片描述在这里插入图片描述
定位完成后便可以进行路径规划,路径规划包括全局规划和局部规划,本次项目主要采用A*全局路径规划器和TEB局部路径规划器。A*是Dijkstra的改进版,加入了启发式函数进行估值,达到最短路径的效果。TEB全称Timed-Elastic-Band,是时间最短的最优控制器,基本思路为在周围散布姿态,通过搜索树搜索最优方案。效果如下:(红色为全局路径规划路线,绿色为全局路线上突然出现障碍物后规划的局部路径)

在这里插入图片描述
当然,在真实情况中服务机器人不一定需要采用最短路径,也就是说可以根据实际需要自己规划一条路径,加上局部路径规划器便可以按照需求自主导航。

2.5 语音交互

人们最自然的交流方式是语音,语音也是人机交互中最便捷、高效的方式,语音交互突破了传统人机交互方式的局限性,对老人、残障人群较为友好,在助老、迎宾等领域效果显著。所以作为服务机器人,语音交互是必不可少的一个功能。语音交互目前分为四个部分:语音唤醒(Wake Up)、语音识别(ASR)、语义理解(NLP)、语音合成(TTS)。本次项目中采用SnowBoy开源语音唤醒库,百度语音的语音识别、语音理解和语音合成进行语音交互。

SnowBoy是一个开源的、轻量级的语音唤醒库,可根据用户定制唤醒词。在语音唤醒后,才能进行百度语音提供的识别、理解和合成功能。具体流程如下:
在这里插入图片描述
本次项目使用树莓派配合树莓派语音板完成了查看时间、查询天气、垃圾分类等功能,但在噪声较大的地方语音交互效果不够理想。

2.6 YOLOv3

深度学习是近年来机器人学最火的领域之一,目标检测是深度学习最主要应用的课题。目标检测可用于服务机器人的识别跟踪,从而提高机器人的任务辅助能力。YOLO算法是由Redmon等提出的基于回归方法的目标检测算法,使用Darknet-53网络架构,不断将特征图卷积处理得到三次预测结果,然后对三次预测结果进行抑制处理得到最终效果,流程如下:
在这里插入图片描述
本次项目采用Jetson Nano配合奥比中光深度摄像头进行目标检测.Jetson Nano是英伟达今年新推出的低功耗GPU开发板,配备128个CUDA核心。在使用GPU加速后YOLOv3摄像头实时检测帧率可达10帧。

2.7 KCF目标跟踪

有了目标检测自然需要目标跟踪,在特殊场景下可能需要服务机器人跟随人,或跟随某一移动物体来完成任务。KCF算法是由Joao F. Henriques等人提出的逐帧训练2D滤波器的跟踪算法,其效果稳定、反应迅速。

本次项目采用深度摄像头,首先将RGB图像话题和深度图像话题重映射到kcf_tracker所需话题下,然后调试相机深度参数,打印出dist_val值,乘以一定的比例系数将其控制在0.4~2之间即可,kcf_tracker原理流程如下:
在这里插入图片描述
2.8 APP控制

​ ROS Control是一款基于ros_bridge的手机APP,通过HTTP协议连接到底盘的Master,读取Master下的image、scan等topic并显示出来。同时,APP还可以模拟摇杆和重力传感发送速度给底盘,甚至可以设置目标点,通过读取odom信息让底盘移动到目标点。效果如下:
在这里插入图片描述在这里插入图片描述
4.研究成果

本次项目通过分布式通讯,搭建了以树莓派、Jetson Nano、PC共同为上位机,以Arduino Mega为下位机的ROS服务机器人,机器人总体框架如下:
在这里插入图片描述
完成了以下功能:

  1. 通过串口通讯完成树莓派控制Arduino进而控制底盘的功能。
  2. 使用Gmapping进行建图,做到1000平范围的优良建图效果。
  3. 通过RGB-D SLAM进行小范围的三维重建。
  4. 使用A *全局算法和TEB全局算法进行路径规划完成导航,并且通过脚本在地图中设定多个目标点,完成了每个目标点停止10秒中的多点定点巡航。
  5. 通过Snowboy语音唤醒库和百度语音的识别、理解、合成功能做到语音交互的功能,可以进行查询天气、时间、垃圾的类别等。
  6. 使用YOLOv3算法做到10帧的实时摄像头目标检测。
  7. 通过KCF算法完成目标跟踪的功能。
  8. 基于ros_bridge完成APP控制。
    本次项目小组使用ROS将整合到了服务机器人上,完成了SLAM、多点导航、语音交互、目标检测、目标跟踪、APP控制等服务机器人所需的基本功能。同时小组对串口通讯、SLAM、路径规划进行了系统学习,也对语音交互、深度学习、计算机视觉有了一定的了解和认识。

5.创新点

本次项目通过学习ROS将许多算法整合到了服务机器人上,学会了使用开源软件完成项目需求。ROS是一种松耦合的系统结构,可以方便开发者根据需求灵活添加不同功能模块。同时ROS提供标准化框架,方便代码的重复利用,也方便开发者学习开发。

6.结束语
经过这次创新立项,我们了解到了一个机器人是需要很多功能才能高效地完成任务,这说明机器人领域有很多值得探索的方向。根据估算,全球机器人市场需求巨大,而目前除了扫地机器人和无人机,其他领域尚未成功大批量落地产品,尤其是服务机器人领域,目前的产品功能有限,所以还有很多复杂的问题等待我们去解决。

7.参考文献

[1] Grisetti, C. Stachniss, and W. Burgard, “Improved techniques for grid mapping with rao-blackwellized particle filters,” IEEE Transactions on Robotics (T-RO), vol. 23, pp. 34–46, 2007.
[2]wiki.ros.org.
[3]范丽,苏兵,王洪元,《基于YOLOv3模型的实时行人检测改进算法》,山西大学学报(自然科学版),3-4,2019.

  • 40
    点赞
  • 280
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
搭建自己的机器人模型需要进行以下步骤: 1. 安装ROS和仿真工具包 2. 创建ROS包和机器人模型 3. 编写机器人控制程序 4. 启动仿真环境并加载机器人模型 5. 运行机器人控制程序,观察仿真结果 下面是一个简单的机器人模型搭建示例,使用ROS Kinetic和Gazebo仿真工具包: 1. 安装ROS和仿真工具包 在Ubuntu系统中使用以下命令安装ROS Kinetic和Gazebo仿真工具包: ``` sudo apt-get update sudo apt-get install ros-kinetic-desktop-full sudo apt-get install ros-kinetic-gazebo-ros-pkgs ros-kinetic-gazebo-ros-control ``` 2. 创建ROS包和机器人模型 使用以下命令创建一个名为my_robot的ROS包,并在其中创建一个名为urdf的目录用于存放机器人模型文件: ``` mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_create_pkg my_robot cd my_robot mkdir urdf ``` 在urdf目录中创建一个名为my_robot.urdf的机器人模型文件,内容如下: ```xml <?xml version="1.0"?> <robot name="my_robot" xmlns:xacro="http://www.ros.org/wiki/xacro"> <link name="base_link"> <visual> <geometry> <box size="0.3 0.3 0.1"/> </geometry> </visual> </link> <joint name="base_joint" type="fixed"> <parent link="world"/> <child link="base_link"/> <origin xyz="0 0 0.05"/> </joint> <link name="left_wheel_link"> <visual> <geometry> <cylinder length="0.05" radius="0.1"/> </geometry> </visual> </link> <joint name="left_wheel_joint" type="continuous"> <parent link="base_link"/> <child link="left_wheel_link"/> <origin xyz="0.15 0 -0.05"/> <axis xyz="0 1 0"/> </joint> <link name="right_wheel_link"> <visual> <geometry> <cylinder length="0.05" radius="0.1"/> </geometry> </visual> </link> <joint name="right_wheel_joint" type="continuous"> <parent link="base_link"/> <child link="right_wheel_link"/> <origin xyz="0.15 0 0.05"/> <axis xyz="0 1 0"/> </joint> </robot> ``` 这个机器人模型由一个长方体的底座和两个圆柱形的轮子组成,使用URDF格式描述。其中base_link表示机器人的底座,left_wheel_link和right_wheel_link分别表示左右两个轮子。 3. 编写机器人控制程序 在ROS包的src目录中创建一个名为my_robot_control.cpp的控制程序文件,内容如下: ```cpp #include <ros/ros.h> #include <geometry_msgs/Twist.h> int main(int argc, char** argv) { ros::init(argc, argv, "my_robot_control"); ros::NodeHandle nh; ros::Publisher cmd_vel_pub = nh.advertise<geometry_msgs::Twist>("cmd_vel", 10); ros::Rate loop_rate(10); while (ros::ok()) { geometry_msgs::Twist cmd_vel; cmd_vel.linear.x = 0.1; cmd_vel.angular.z = 0.5; cmd_vel_pub.publish(cmd_vel); ros::spinOnce(); loop_rate.sleep(); } return 0; } ``` 这个控制程序使用ROS的Twist消息类型发布机器人的线速度和角速度,以控制机器人的运动。在这个示例中,机器人线速度为0.1,角速度为0.5。 4. 启动仿真环境并加载机器人模型 使用以下命令启动Gazebo仿真环境,并加载机器人模型: ``` roslaunch my_robot my_robot.launch ``` 在my_robot包中创建一个名为my_robot.launch的启动文件,内容如下: ```xml <?xml version="1.0"?> <launch> <arg name="model" default="$(find my_robot)/urdf/my_robot.urdf"/> <param name="robot_description" textfile="$(arg model)" /> <node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-urdf -model my_robot -param robot_description -x 0 -y 0 -z 0"/> <node name="my_robot_control" type="my_robot_control" pkg="my_robot"/> <node name="gazebo_gui" pkg="gazebo" type="gazebo"/> </launch> ``` 这个启动文件首先将机器人模型文件加载到ROS参数服务器中,然后使用gazebo_ros包的spawn_model节点将机器人模型加载到Gazebo仿真环境中。同时运行my_robot_control程序节点控制机器人运动。最后启动Gazebo仿真环境的GUI界面。 5. 运行机器人控制程序,观察仿真结果 使用以下命令运行my_robot_control程序节点,控制机器人运动: ``` rosrun my_robot my_robot_control ``` 可以观察到仿真环境中的机器人开始运动,同时在控制程序的终端输出中可以看到机器人的线速度和角速度。 下图为搭建自己的机器人模型的结果截图: ![ROS机器人仿真结果截图](https://i.imgur.com/lv9v5a1.png)
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值