系列文章:
8.我们从电话控制ROS控制,GPS节点7.机器人本地化:映射,AMCL,房间地图上的参考点6.带轮编码器的里程表,房间地图,激光雷达5.我们在rviz和凉亭中工作:xacro,新传感器。4.使用rviz和gazebo编辑器创建机器人仿真。3.加速,更换相机,固定步态2.软件1.铁上
一次 ,我们使用树莓派3b +的所有功能与OpenCV和ROS(机器人操作系统)一起工作,沿线骑行,看到人们脸上的笑容,悲伤的枪口,甚至去见他们。
但是,随着机器人技术领域令人鼓舞的第一步,我不得不面对许多小任务:缓慢的覆盆子pi,距相机一小段距离,可以识别人脸,在开车时向侧面移动等等。 稍后将描述如何解决这些问题,包括在ROS开发中开辟新的视野。
1.通过运行先前组装的项目中的所有节点(ROS中的脚本),并开始使用Haar级联,很快变得很清楚,单板计算机执行此类任务的性能仍然很弱。 尽管处理器负载没有达到峰值并在80%范围内变化,但机器人长时间思考后还是想着要看到一个人的脸或猫的脸。
最可悲的是,当面部或面部离开摄像机的视野后,机器人开始移动,“思考”它正要移向物体。 一般而言,与M.Yu一样。 莱蒙托夫:
“长期的流浪者徘徊
在没有庇护所的世界沙漠中……”。
纠正这种情况的首次尝试如下:
-在相机启动节点(在树莓派上)上,捕获的图像的大小从640x480 60fps减小到320x240 15fps。
cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver nano pi_camera_driver.py
这在一定程度上提高了生产率,但是总体上来看,还远远不够理想。
此外,在开始跟随人的脸(follow_face.py)或猫(follow_cat2.py)的脚本中,注释了opencv图像本身在屏幕上的结论。 就是cv.imshow。 现在,开始旅行时,无法从视觉上观察机器人是否看到了它要移动的图片。 好吧,我不得不牺牲清晰度。
另外,脚本中ROS本身的信息输出也被评论为:#rospy.loginfo。
这稍微减轻了负荷并提高了工作速度。
但是...有必要提出其他建议。
2.同样,该机器人是近视眼。 根据我们过去在该领域的经验和建议,我们使用了鱼眼镜头:

这款摄像机提供了相当宽的视角,可让您捕获房间的很大一部分。
然而,事实证明,她在面部识别质量领域的成绩令人印象深刻……Mckayla并没有留下深刻的印象……由于相机使用的视角相同,因此同时会扭曲可识别的物体本身。 因此,使用的Haar级联效果不佳。 照明也具有显着效果;在阴影下,质量下降的幅度更大。
3.最重要的是-机器人缺乏角速度来产生明显的扭曲,甚至在门槛(不是需要越过的门槛)和地毯上,它都完全卡住了。 在这里,胡椒粉增加了“相同功率”电机的功率差异,即使离开同一批次,它们也几乎不会相同。 因此,机器人明显向左漂移。
改善“性能”。
有了性能,当ROS作为系统的主要优势得以挽救时,情况就开始显着改善,即:在不同机器上分配负载的能力。
也就是说,足以在树莓派本身上运行运动节点,摄像机和主节点,而其他重负载节点则可以放在功能更强大的系统上。
例如,在笔记本电脑上安装ROS或部署虚拟机。
在这种情况下,选择了第二个选项。
为了不描述如何在虚拟机上安装Ubuntu,ROS,我们使用Winnie Jones的口号:“
我们需要一个没有生命的志愿者” 。 我们已经准备好了……-具有所有填充物的虚拟机可以在
此处下载。
建议使用的虚拟机参数如下:

可以理解,您正在将其部署(运行)在VMware工作站上。
密码:raspberry
现在,您可以评估消化铁上的Haar级联时的性能,该功能比树莓派更强大!
为了启动现在分为两部分的ROS系统,您需要指定主节点所在的虚拟机(在系统启动后立即在树莓派上启动)。
为此,请在虚拟机中编辑bashrc:
sudo nano ~/.bashrc
在文件末尾的行中,指定IP地址:
export ROS_MASTER_URI=http://192.168.1.120:11311 export ROS_HOSTNAME=192.168.1.114
第一个IP地址是树莓派地址,第二个IP地址是虚拟机地址。
*虚拟机和覆盆子必须位于同一本地网络上。
在树莓上,相同的bashrc将有所不同:
<source lang="bash">export ROS_MASTER_URI=http://192.168.1.120:11311 export ROS_HOSTNAME=192.168.1.120
树莓派上的两个IP地址匹配。
*不要忘记在更改bashrc之后重新启动。
如何启动分布式ROS系统?
树莓上有两个终端。
在第一乐章中:
rosrun rosbots_driver part2_cmr.py
在第二个覆盆子相机中:
sudo modprobe bcm2835-v4l2 roslaunch usb_cam usb_cam-test.launch
总共有2个节点将在树莓派上工作:一个节点正在等待命令移动,第二个节点将视频从摄像机发送到网络。
要连接到主机并通过键盘控制机器人,现在需要在虚拟机中运行:
rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/part2_cmr/cmd_vel
以相同的方式,您可以运行一个节点-跟随一个人的脸,而不是通过虚拟机进行管理:
cd /home/pi/rosbots_setup_tools/rpi_setup python follow_face.py
现在,对于从鱼眼覆盆子pi相机在从相机捕获的图像进行不同设置的情况下所得到的结果,有些不准确的统计信息。
320x240、30fps:
男人的脸。 80-100厘米,光线影响,几乎看不到阴影。 最好将灯泡对准面部以进行改善。 微笑带微笑可以更快地识别脸部。
A4页上的猫脸。 15-30厘米。
以800x600和60fps的速度-面部看到的距离为2-3 m。
在1280x720和60fps的情况下-面部看到的距离为3-4 m。但是存在误报-将墙壁时钟视为面部,依此类推。
A4上的一只猫以1-2秒的延迟识别出1-1.5 m的距离。
虚拟机负载为77-88%。如您所见,如果从摄像机捕获的图像的窗口更大,则虚拟机上的负载以及机器人看到对象的距离都会增加。 覆盆子的负载在增加,但没有明显增加。 与仅在树莓上的所有节点的操作相比,识别速度已显着提高。
治疗近视
上面的统计数据表明,要改善视觉效果,必须提高摄像头的分辨率和fps,从而获得虚拟机的性能。 但是,即使在1280x720和60fps的情况下,到对象的距离也不会太大。
解决此问题的方法出乎意料。
如您所知,覆盆子可以使用一整套相机。 对于我们来说,其中之一是完美的,即:

她的结果如下:
在房间中使用人工照明时,可以看到7-8 m的距离! 甚至没有必要微笑)
800x600和60fps-下载。 虚拟机-70-80%,覆盆子-21%(只有移动节点并开始广播摄像机)。
A4上的一只猫以1-2秒的延迟识别出2-2.3 m的距离。如您所见,猫再次遭受痛苦,这是在较短距离内确定的。 但是这里的原因很可能是Haar级联的设置,而不是相机。
*通常,此相机配有IR耳。 无需在白天使用它们:

因此,与鱼眼不同的树莓派相机即使在劣质的人工照明下也能在处理物体时表现出最佳效果。 但是,为了增加与相机的距离,我必须考虑视角,这必须予以考虑。
现在关于底盘的改进和机器人向侧面的拆卸
如上所述,实际上没有双引擎,并且机器人注定要向右或向左驱动,这取决于在所有其他条件相同的情况下电机如何变得更强大。
通常,运动差异可以使用编码器消除,因为它们在我们的项目中很好。 关于这是如何工作的,有一部好
电影 。
但是,在这里您可以简化所有操作,并通过仅校正在虚拟机中跟随人的脸部(follow_face.py)或猫(follow_cat2.py)的脚本来进行一些技巧。
我们对以下几行感兴趣:
根据机器人的打击位置和打击程度,您需要调整z的值。 在上面的代码中,为12V电机驱动器供电时将选择这些值。
通过应用到项目(L9110s)中使用的发动机驱动器(而不是8 V-12V),可以提高机器人的运行特性(速度和可操作性)。 但是最好不要安装电源稳定器或至少一个电容器来这样做,因为 事实证明,L9110的H桥芯片燃烧良好。 也许这使它们如此便宜。 尽管如此,机器人还是非常轻快地驱动12 V电源。
而不是结论
好了,既然机器人不再被带走了,他的视野得到了改善,例如,您可以与他一起玩捉迷藏。 或者强迫从房间的另一端带来东西。 当然,要面对一个人,面对他。
待续。