智能清洁机器人是一种专门设计用于执行清洁任务的自动化机器人,又被称为环境提升机器人,它们被广泛应用于各类社区服务环境中,如商场、办公楼、酒店等,旨在减轻人力负担,提高清洁效率,并提升场景的卫生状况。智能清洁机器人通过搭载激光雷达,立体视觉相机、超声/TOF模块等感知传感器、搭配机载自主定位系统,路径规划系统和智能算法来自主感知周围环境和自主导航完成清洁任务。它们能够识别障碍物、避免碰撞,并规划有效的清洁路径。智能清洁机器人可以用于多种清洁任务,包括地面清洁、桌面清洁、立面清洁、卫生间清洁等。
为了贴合智能清洁机器人的行业前景,提升学生相关技术深度与动手实践能力,设立智能清洁机器人比赛。通过这个比赛,期望参赛者能够展示出创新的机器人技术和解决当前清洁机器人行业实际问题的能力,为智能清洁领域的发展作出贡献。
比赛场地为3m*3m的正方形场地,每场比赛放置2个可清除垃圾,机器人需要将可清除垃圾抓取并放置在垃圾桶内,将所有垃圾放置在垃圾桶并返回到出发区后比赛结束。具体详细规则请参照官方发布的规则说明。
比赛例程已经封装好了一个单独的ros功能包里,下面所有程序改动都在该功能包里修改,该功能包为demo_ws工作空间下的demo_clean_desktop功能包。
参照软件上手指南里的Cartographer建图,运行8-cartographer_mapping.sh文件,使用键盘控制机器人运动,对比赛场地进行建图,保存;
进入robot_shell/w2a目录下,运行14-demo_clean_desktop.sh即可启动比赛demo程序:
将机器人放到起始位置,打开终端运行命令,让机械臂运行到初始化位置:
rostopic pub /servo_controller std_msgs/String "data: 'init'"
机械臂动作设置函数位于 clean_desk_robot.py 中,这里依次接收 servo_controller 话题,并对消息进行处理,执行不同的机械臂动作:
在键盘控制模式下,操控机器人运动到桌子附近,使得机器人摄像头视野内看到垃圾物料块,单独键盘控制窗口已经集成到了14-demo_clean_desktop.sh
里,无需单独打开。
此时订阅话题 tracked_pose发布的信息,并将机器人的位置坐标和四元数值记录下来作为导航目标点。
将四元数转为欧拉角,填入到slam_task.py中(这里yaw角度填入的是角度,需要提前转换下,也可以自己改动程序,直接输入四元数):
视觉识别垃圾,这里我们使用的是基于OpenCV的颜色、形状识别,来确定垃圾物料块在摄像头画面中的位置;OpenCV的颜色、形状识别这里我们使用HSV颜色空间来识别图像内的物料颜色,同时使用OpenCV形态学检测,霍夫圆检测来检测图像内物料块颜色的圆形物体,为了方便调试,我们在摄像头画面上嵌入了拖动条组件,并且单击画面中的要识别的物料,可以在控制台打印该物料块的HSV值:
![]() |
![]() |
---|
根据控制台打印的HSV值,拖动窗口中的按钮,来确定一个范围,并且将该值记录到程序中:
接下来,我们计算机械臂转向的角度,这里我们通过导航到目标点的位置,以及测试机械臂抓取动作的调试后,能确定一个抓取初始化的动作以及摄像头到物料块的距离。并且,通过测量确定物料块与机械臂夹爪中心位置的实际偏移量,同时,OpenCV进行垃圾物料块识别,获取物料块中心坐标在画面中的位置,以此来确定实际物料偏移和图像中物料偏移对应的比例系数。
摄像头距离物料块的距离 |
物料块与机械臂夹爪中心位置的实际偏移量 |
---|
上述步骤我们确定了摄像头距离物料块的距离,这里我们假设为30cm、物料块与机械臂夹爪中心位置的实际偏移量、物料块在屏幕中的坐标,这里我们记录为x、图像坐标系与实际坐标系中物料与机械臂夹爪中心偏移的比例系数,这里我们假设为0.08,此时我们就可以根据反三角函数中的正切函数,计算出机械臂夹角的位置
α:
offset_x = (320 - x) * 0.08 # 通过直角三角形两边距离,计算出夹角的弧度,并转换为角度 offset_angle = int(math.atan2(offset_x, 30) * 180 / pi) |
---|
计算出机械臂与物料块的夹角后,这里还需要注意,控制机械臂转向有左右两个方向,所以我们要根据物料块在画面中心的左面还是右面进行判断。
根据自己的实际情况来调试机械臂的抓取与放置动作:
导航到目标点后,进行垃圾对准,抓取,垃圾投掷的这里我们持续订阅里程计信息,来完成转向与前进的位置输出,在 clean_desk_robot.py
函数中 注意让机器人左转右转,需要根据自己的实际场地布置来决定,这里输出的里程计yaw 为弧度值:
输入如下指令,启动任务:
rostopic pub /slam_task std_msgs/String "data: 'desk_point1'"