4.调试人脸跟踪下位机代码

0x00 如何调试下位机代码

其实调试下位机代码没有一种通用的方法,主要目的是保证被控系统(硬件平台)可以正确执行上位机发送过来的指令即可。所以,这里的调试就大概分为三部分调试了。分别如下:

(1)正确接收上位机的指令,这里的接收方式根据不同的下位机,接收指令的方式可能不同。可以有RS232串口,RS485,TCP/IP网络传输等。需要通过对应的方式将发送来的命令按照协议进行解析和判断,如果是非法指令需要丢弃。对于数据传输方式就我目前了解,对于一些简单的、常用的设备大多用RS232串口就可以了。因为比较简单,但是RS232也是有弊端的就是数据的传输距离不能太长,如果上位机和下位机的距离一般超过15米,那么RS232传输的数据就会不稳定。这是就可以改用RS485了,因为RS485的数据传输上千米都基本没什么问题。如果再远的话就需要加中继器也就可以了。

(2)根据指令来正确控制设备,例如上位机指令是需要打开设备的LED灯,那么下位机在解析出该指令后,就需要正确的控制相应的LED灯打开。这里就涉及到相关的硬件操作了,一般下位机都是用STM32或者什么51单片机,再有就是最近很火的arduino了。其实arduino中用的也跟51单片机差不多,不过性能更好一点而已。控制硬件的操作一般都是需要控制下寄存器、设置IO口什么的。

(3)最后就是反馈系统,一般下位机在执行完操作后,都需要将执行结果反馈给上位机系统。这样整个指令的操作才能形成闭环,上位机根据反馈才知道下位机的执行状态,如果下位机反馈执行失败的指令,那么上位机可以根据需要决定是否需要重新执行该操作。

最后通过一个图来方便大家清楚整个指令控制过程,方便后面我们来进行调试:

上下位机控制指令通讯过程示意图

0x01 配置串口调试的软硬件环境

对于当前的arduino来说,指令的传输都是通过RS232串口来传输的,只不过是arduino板上有USB转串口的芯片,这样我们就可以很方便的通过USB线来调试数据传输命令了。在调试程序前,我们需要先把整个硬件环境搭好。然后再将我们前一篇文章中下位机的代码都下载到arduino板中,先来看整个硬件环境,如下图所示:

硬件环境先接好

这里先不用接摄像头,我们后面在调试人脸识别模块时再用。这里我们先调试云台的两个舵机能否正常的通过指令来控制左右、上下移动。接下来就开始将调试的软件环境准备好,打开Arduino IDE软件,在“工具”下拉选项中配置好arduino的“开发板”型号和“端口”,如下图所示:

配置arduino开发板型号、端口

p配置好所有的硬件环境和软件环境后,接下来就可以打开arduino IDE自带的串口监视器来进行串口命令的调试了。我们直接点击上图中的“串口监视器”就可以弹出一个串口调试页面,我们在这里可以输入的串口命令,可以通过代码中的command.h这个文件来查看,如下图所示:

通讯串口配置

这里需要特别注意的地方是串口通讯波特率,这个参数一般是在arduino代码的setup()函数中最先配置的。通过Serial.begin()来配置,如果配置好波特率后,以后要想通过串口来向arduino发送数据就必须配置该波特率,否则数据会是乱码或者干脆一点数据接收不到。


0x02 调试串口接收控制指令

这里的调试串口接收模块是否正常是非常重要的,因为后面的下位机执行命令前提是要可以正确接收到上位机发送过来的命令。如果上位机发送过来10条命令,下位机只执行了其中的8条命令。这是我们就需要来定位发生这个问题的原因了,是下位机没有收到上位机通过串口发送过来的命令,还是下位机收到命令后没有执行呢?所以我们要一个模块一个模块的进行调试,后面模块的正常运行前提是要保证前面的模块已经稳定可靠的运行了。就拿刚才的问题来说,如果我们已经可以保证上位机的命令100%可以正确发送到下位机上,那么就可以很快定位问题的原因是,下位机的执行模块出现了问题。

那么,如何保证你上位机通过串口发送过来的命令可以100%传输到下位机呢?这里就需要有一个测试过程,我们可以进行这样一个测试,假如上位机发送100条命令,下位机收到后都可以正确打印出来收到的命令,且与上位机发送的命令相同。那么就可以保证下位机的接收命令模块没有问题,当然你感觉发送100条命令有点少,那就可以增加测试强度,例如我们可以发送100万条命令,看看是否有数据丢失。如果你感觉100万条命令还不够,那我们就再加大测试强度,测试1亿条命令来看看。直到你感觉测试模块确实经过高强度的测试,确实没有出过一点错,没有丢失过一条命令,那么就可以基本证明,接收模块不会出现问题了。

下面就来查看下这个接收模块的测试流程图,如下图所示:

接收模块测试流程图

在进行测试前,我们需要先将代码稍微修改一下,方便我们保存测试数据,修改的代码如下图所示,其实就是增加一行打印信息,将串口收到的字符再打印出来。然后就是将检测命令错误的提示消息给注释掉:

修改代码

接下来我们先使用arduino IDE自带的串口监视器来看看arduino接收的命令跟输入的命令是否相同,调试过程如下动图所示:

调试过程

通过上图大家可以发现虽然使用arduino IDE自带的串口监视器可以发送数据,并且也可以打印反馈的数据,但是这样手动输入的效率有点低啊。假如我们要是测试100万个数据,那不是要累死测试人员嘛。所以我们需要找一种可以自动化发送串口数据,并可以将反馈数据保存起来的工具,这里就不得不提到linux中常用的串口调试工具minicom了,下面来专门开一个小节来简单介绍下这个工具如何使用。


0x03 linux下串口调试软件minicom的简单使用

使用该软件的第一件事就是保证自己的系统中已经安装了该软件,在ubuntu中可以直接使用如下命令来直接安装minicom:

sudo apt install minicom

在安装好软件后,接下来就要保证系统的当前用户在dialout组中才行,否则就无法操作串口,添加当前用户到dialout组的命令如下,注意最后的corvin是我当前系统的用户名,如果你的系统当前用户名是其他的,那么要将corvin修改为你的用户名:

sudo usermod -aG dialout corvin

整个操作过程如下图所示,当然如果使用groups命令,发现当前用户已经在dialout组中就没必要使用usermod命令添加用户到dialout组了:

添加当前用户到dialout组

接下来就是使用minicom配置要连接的串口了,通过下图来了解如何配置,需要注意的是这里打开minicom时,需要加上sudo选项才行:“sudo minicom”命令来打开minicom软件:

minicom的首页

j接下来就是配置连接的串口设备端口号了,ctrl+a,然后按z键进入参数配置页面,这里需要按字母o键了,这里就进入配置页面了,如下图所示:

接下来就是配置串口执行脚本参数了,这里我们希望minicom可以执行bash脚本,所以需要修改该参数:

接下来就是编写一个bash脚本,使其每次可以输出一个整型数,这样该数就会通过串口发送给下位机了,该脚本代码如下,我们可以将文件命名为com_test.sh:

#!/bin/bash

start_num=0
max_num=100

while [ $start_num -lt $max_num ]
do
    echo "$start_num"
    sleep 0.05
    let start_num++
done

exit 0

j接下来就可以在打开minicom时调用该脚本了,命令如下:

sudo minicom -S com_test.sh

下面通过一个动图来把整个过程来给大家演示下如何操作,这里唯一的缺点就是脚本最后输出的数据最后的换行符也会被打印出来,最后输出的数据是歪的:

这样我们就可以在脚本里配置输入多少数据来进行测试了,这样就省了我们手动一个一个输入测试数据了。希望大家可以掌握在minicom中使用bash脚本的功能,这个功能还是很强大的。


0x04 测试下位机能否正确执行命令

接下来算是测试的重点了,首先就是将我们刚才修改过的代码再还原,重新下载到arduino板中。这里测试的指令还是通过arduino IDE自带的串口监视器,因为发送的命令比较简单。在测试前我们要知道需要测试哪些功能,这里列出来,然后开始依次测试:

(1)测试舵机使能状态和设置舵机使能

这里检测当前所有舵机的使能状态使用的命令是‘s’,会依次列出所有的状态:

查看当前所有舵机使能状态

接下来测试设置pwm5,pwm6位置的舵机使能,设置使能的命令是'e':

设置使能状态

当设置完索引3位置的舵机使能状态后,我们仍然可以使用's'命令来查看所有舵机的使能状态,看看索引位置3的舵机状态到底有没有使能:

再次查看使能状态

(2)测试舵机的转动

在测试舵机转动前,我们需要先查看下所有舵机的当前位置。这里可以使用'p'命令来查看下所有舵机的当前位置,只有知道所有舵机当前位置,我们才可以设置其他想设置的转动位置:

查看所有舵机的当前位置

下面我们来测试索引位置3的舵机,使其转动到10度的位置,转动时的延时是10ms(我们可以控制转动的速度),控制舵机转动的命令是'w'。该命令的用法是"w 舵机索引值 转动的目的位置 转动的延时",下面来查看如何测试:

测试舵机左右转动命令
输入测试左右转动命令

测试完左右转动的命令,下面就可以来测试上下转动的命令了。这里只不过需要把舵机索引位置从3改为4即可,这样我们就可以来控制云台上下转动了,如下动图所示:

测试舵机上下转动命令

到这里我们需要测试的主要部分已经完成了,就是测试云台的左右转动、上下转动。这两个舵机能否按照串口指令来正确执行,到目前位置,基本上所有的指令都可以正确执行。唯一测试不足的地方在于,是否可以通过压力测试了。在这里其实我们仍然是可以使用minicom的脚本功能来不断的往串口发送命令来进行测试的,我这里就懒着弄了,其实大家可以参考上面的代码来修改一下就差不多可以了。

当然,这里其实还有有一些不太重要的指令没有测试。例如查看当前arduino代码版本号的命令'v',这里输入该命令后就会返回版本号(整型数字),方便我们后面来进行升级。对于其他命令的测试相信大家也知道如何操作了,我这里就不再测试了。后面的教程我们开始介绍上位机的代码编写了,人脸识别模块如何实现。


0x05 Feedback

大家在按照教程操作过程中有任何问题,可以关注ROS小课堂的官方微信公众号,在公众号中给我发消息反馈问题即可,我基本上每天都会处理公众号中的留言!当然,如果你要是顺便给ROS小课堂打个赏,我更是万分感谢,如果打赏30块还会邀请进ROS小课堂的微信群与更多志同道合的小伙伴一起学习和交流!(还有就是记得在打赏完后给我留言或者发条消息,否则我看到的打赏记录是不全的,可能会遗漏你的打赏哦!)

发表评论