发 帖  
原厂入驻New
[问答]

求一份AI电磁小车初级参考设计指南

77 无线 串口 数据
分享
怎样去设计一部属于自己的AI电磁小车?有哪些操作步骤?
如何使用无线转串口模型发送数据?以及电脑端如何接受数据?如何使用模型的函数计算转角?

0
2021-7-1 06:37:10   评论 分享淘帖 邀请回答
1个回答
    进入正文前,我们通过下方框图整体了解每个章节的内容,先大概了解每个章节做的工作是什么作用,这样有助于理解每个章节的内容。同学们可以参考以下章节内容在英飞凌单片机上进行模型部署和运行,但这只是一个初级参考,相信有同学可以实现更好的模型和方法,最终也一定有强校、强队会在赛场上让大家惊艳,希望此篇入门教程能抛砖引玉,让我们在赛场上看到更多的惊艳时刻,我们拭目以待。
  
  ▌一、软件安装
  1.1、操作系统版本确认
    在安装配套的软件之前首先确认系统是否满足要求,操作系统必须是win7或者以上且必须是64位的系统。这里强烈建议大家使用win10 64位的版本。因为后面所有的讲解与演示都是基于win10系统。
  1.2、安装python
    使用提供的资料包,找到python-3.6.8-amd64.exe(务必使用这个版本的python)文件,双击文件开始安装,如下图所示:
    1、务必勾选Add Python 3.6 to PATH之后再点击Customize installation。
    2、点击Next进入下一步。
    3、点击Browse指定python安装目录,自己指定安装目录的好处在于当需要找到python目录的时候自己会比较清楚安装的位置,需要切记指定目录不能含有中文。
    4、然后点击Install开始安装,直到安装完成。
  1.3、安装pycharm
    使用提供的资料包,找到pycharm-professional-2019.3.exe文件,双击开始安装,如下图:
    1、点击Next进入下一步
    2、点击Browse指定pycharm安装目录,自己指定安装目录的好处在于当需要找到pycharm目录的时候自己会比较清楚安装的位置,需要切记指定目录不能含有中文。然后点击Next。
    3、勾选64-bit launcher和Add launchers dir to the PATH,再点击Next。
    4、然后点击Install开始安装。
  1.4、更换pip安装源
    在后续的使用中我们需要依赖一些工具包,我们将会通过pip在线安装工具包,但是由于默认的pip安装源速度很慢,因此我们需要对pip的安装源进行更换,切换为国内阿里的源提高安装速度。
    1、打开资源管理器并打开C盘,然后点击图片中箭头所指的查看。
    2、然后勾选上隐藏选项,这样我们才能找到我们需要打开的一个文件夹。
    3、进入“用户”文件夹
    4、然后选择自己的用户账号文件夹进入,这里我的账户名称是SEEKFREE因此我需要打开SEEKFREE文件夹。
    5、依次打开AppData、Roaming文件夹。
    6、在Roaming文件夹内新建一个文件夹并取名为pip,将资料包中的pip源切换压缩包中的pip.ini文件放入新建的文件夹中。到此pip源切换就完成了。
  1.5、安装相关的包
    提供的python代码用到了很多的包,因此为了保证代码能够被正确的运行我们需要将用到的包给安装好。
    1、按下windows微标键+R按键,在左下角弹出的窗口中输入cmd,然后回车。在打开的命令提示符窗口中我们将会使用pip3命令来安装各种我们需要的包。
    2、在命令提示符窗口中输入pip3 install scikit-learn == 0.22.1并回车,等待安装完成。
  
    3、在命令提示符窗口中输入pip3 install numpy == 1.16.6并回车,等待安装完成。
  
    4、在命令提示符窗口中输入pip3 install tensorflow==1.14.0并回车,等待安装完成。
  
    5、在命令提示符窗口中输入pip3 install keras== 2.2.4并回车,等待安装完成。
  
    6、在命令提示符窗口中输入pip3 install matplotlib== 3.1.3并回车,等待安装完成。
  
    7、在命令提示符窗口中输入pip install onnx== 1.5.0并回车,等待安装完成。
    8、在命令提示符窗口中输入pip install onnxmltools== 1.5.0并回车,等待安装完成。
    9、到此我们需要的一些包全部安装完成了,如果以后自己在学习时遇到了没有安装的包一样可以通过这样的方式来安装。
    10、检查包版本,在桌面空白处按住shift右击鼠标选择Powershell,然后输入pip list并回车,查看自己的各种包版本是否与下图一致,如果不一致可能出现无法训练模型等问题。其中重点关注h5py、Keras、matplotlib、numpy、scikit-learn、scipy、tensorflow、wheel这些包的版本是否与下图中一致,如果一致还是有问题,则尝试将其他不一致的包全部卸载使用指定版本的方式安装对应的包。卸载包可以使用pip uninstall 包名,指定版本安装可以使用pip3 install keras==2.2.4,keras是需要安装的包名称,2.2.4是需要安装的版本。
  
  ▌二、初次尝试模型训练
  2.1、制作训练数据文件
    在开始之前需要先说明一下,本章节仅仅是让大家体验一下训练模型的过程,资料里面的数据是与我们样车进行配套的,小伙伴们到时候应该用自己的车采集到的数据进行训练,才能用于控制你们自己的车模哦。
    在提供的资料包中找到train_dat压缩包解压,然后打开train_dat文件夹,将鼠标放在文件夹的空白处然后按下左shift按键+鼠标右键,然后点击“在此处打开Powershell窗口”。
    在打开的Powershell窗口中输入python train_data_convert.py -b 1 -f normal.txt,这个脚本从txt中读取数据,经过一阶滤波处理,按照模型设计的数据结构生成两个数据集文件:ad_origin_normal.npy和pwm_origin_normal.npy,分别代表模型的输入数据AD值,和输出标签PWM转向值。其他两个文件使用同样的操作可以得到对应的文件。如下图所示:
  
    执行python concatenate.py语句之后会将之前生成的数据集合并然后生成测试集和训练集文件。
    然后继续运行python sc_keras.py -a dense -ad 1语句,将会开始训练模型。脚本文件设置了最多训练120次,训练120次之后将会结束程序,或者当loss下降到0.03x的时候也可以使用ctrl+c提前结束训练。
  
    经过多轮训练,生成模型文件smartcar_ad_dense_drop_025_adSize_1_nobn.h5。由于脚本支持了断点续练的功能,如果大家修改了数据或模型,可以在输入命令时加 -r 参数,重新训练模型。(这里介绍一款特别好用的模型查看工具Netron通过这个工具可以很方便的查看模型的结构,参数等,软件已经为大家下载好了,放在了“需要用到的软件”的压缩包中)。
  2.2、模型部署
    在提供的资料包中,找到“quantitative model.zip”并解压,然后按照以下步骤顺序操作。
    1、将训练后的模型文件
    smartcar_ad_dense_drop_025_adSize_1_nobn.h5文件复制到当前文件夹文件夹(在第一个步骤中,已经有h5模型文件,这里压缩包中自带的,大家训练好自己的模型文件之后,将其替换即可)。
    2、双击quantitative model.bat文件,等待片刻模型即可开始部署。
  
    3、模型文件已经部署完毕,接下来我们将这些文件移植到单片机的工程里将它跑起来。
  2.3、模型性能测试
    在“ai_car”压缩包中提供了两个MCU工程,一个是基于TC364的AI例程,一个是基于TC377的AI例程。
    1、使用ADS导入工程,关于导入工程的操作可以从开源库中的“AURIX Development Studio使用说明书–逐飞科技”文档进行学习,根据自己所使用的核心板导入对应的工程,导入的时候一定要勾选copy projects into workspace,勾选这个选项之后,工程会被复制到workspace所在的目录,编译的时候就会编译复制到workspace下的工程。
    2、将转换后的model1.nncu.c文件复制到AI工程目录下的CODE文件夹,替换原有的model1.nncu.c文件并编译。
    3、然后使用英飞凌下载器连接TC3XX核心板,将程序下载到核心板。
    4、下载器接口自带了一个串口方便发送调试数据,因此可以直接使用下载器的串口直接查看调试信息,而不用单独接一个USB转TTL,如果想自己单独接一个USB转TTL,单片机发送调试信息用的串口0,引脚是P14.0 P14.1。
    5、任意打开一个串口助手以ascii方式接收,此时复位一下单片机即可看到如下图所示,从显示的信息可以看到,运行一次模型所需的时间大约为502us。
  
  ▌三、训练自己的模型
    在训练我们自己的模型前我们需要清晰的知道比赛的规则,AI组在比赛的时候,是不能将传感器伸出去,这也就意味着电感没有办法获得前瞻。并且不能使用摄像头来引导车模,因此车模最终的形态差不多如下图,说实话看着还是蛮帅气的!没有长长的电磁支架以后去比赛的路上也要轻松不少。
  3.1、前期准备
    1、无线转串口模块+无线转usb模块,用于采集数据。
  ▲ 串口数据传输模块
    2、制作一辆可以按照赛道寻迹的车模,推荐使用TC364或TC377作为主控,在前期的数据采集阶段可以使用电磁信号进行引导,电磁进行引导时我们可以将电磁头伸出去,以获得较远的前瞻使得车模走线更好。然后还需要给车模周围加上AI模型需要的7个电感。在本章最开始的图片已经为大家展示了。这里需要着重提示下,距离舵机较近的电感容易受到干扰,可以选择将电感布置的较远的位置,或者找些方法来减小舵机带来的干扰。
    3、使用传统的控制方法,将车模跑起来,尽量跑的流畅,因为AI训练出来最好的效果就是和采集数据时的效果一致,也就是说采集数据时的车模运行状态决定了AI模型能够达到的最好的效果。
  3.2、数据格式说明
    单片机将每次采集到的车身周围的7个电感数据、系统运行时长、当前PWM转向值的数据打包,每次发送11个字节,数据通过无线转串口模块发送到电脑上,每个字节的具体含义如下。
  
    这里使用无线转串口模块来进行数据的采集,主要是为了方便且简单,同学们也可以用其他的方式采集数据,例如将数据写入SD卡等等,这部分就可以由同学们自己扩展。
  3.3、数据采集测试
    接下来我们使用逐飞科技的TC364/TC377库来演示下单片机采集到数据后如何使用无线转串口模型发送数据,以及电脑端如何接受数据。示例程序如下:示例工程也可以在资料包找到。压缩包名称为“collection_data”,工程基于TC364/TC377制作,如果使用TC264核心板,直接将相关程序复制到TC264的工程即可。并根据自己所使用的引脚进行一定的修改即可。
  #include “Cpu0_Main.h” #include “headfile.h” #pragma section all “cpu0_dsram” //将本语句与#pragma section all restore语句之间的全局变量都放在CPU0的RAM中 //工程导入到软件之后,应该选中工程然后点击refresh刷新一下之后再编译 //工程默认设置为关闭优化,可以自己右击工程选择properties-》C/C++ Build-》Setting //然后在右侧的窗口中找到C/C++ Compiler-》Optimization-》Optimization level处设置优化等级 //一般默认新建立的工程都会默认开2级优化,因此大家也可以设置为2级优化 //对于TC系列默认是不支持中断嵌套的,希望支持中断嵌套需要在中断内使用enableInterrupts();来开启中断嵌套 //简单点说实际上进入中断后TC系列的硬件自动调用了disableInterrupts();来拒绝响应任何的中断,因为需要我们自己手动调用enableInterrupts();来开启中断的响应。 uint8 send_buff[11]; //无线转串口发送的数组 int16 turn_angle = 0;//舵机控制变量 void elec_init(void) { adc_init(ADC_0, ADC0_CH4_A4); adc_init(ADC_0, ADC0_CH5_A5); adc_init(ADC_0, ADC0_CH6_A6); adc_init(ADC_0, ADC0_CH7_A7); adc_init(ADC_1, ADC1_CH2_A10); adc_init(ADC_1, ADC1_CH3_A11); adc_init(ADC_1, ADC1_CH4_A12); } uint8 ai_data_flag;//1:ad数据采集完成 0:ad数据未采集完成 int8 ad_data[7]; //ad数据 void ai_data(void) { ad_data[0] = (int16)adc_convert(ADC_0, ADC0_CH4_A4, ADC_8BIT) - 128; ad_data[1] = (int16)adc_convert(ADC_0, ADC0_CH5_A5, ADC_8BIT) - 128; ad_data[2] = (int16)adc_convert(ADC_0, ADC0_CH6_A6, ADC_8BIT) - 128; ad_data[3] = (int16)adc_convert(ADC_0, ADC0_CH7_A7, ADC_8BIT) - 128; ad_data[4] = (int16)adc_convert(ADC_1, ADC1_CH2_A10, ADC_8BIT) - 128; ad_data[5] = (int16)adc_convert(ADC_1, ADC1_CH3_A11, ADC_8BIT) - 128; ad_data[6] = (int16)adc_convert(ADC_1, ADC1_CH4_A12, ADC_8BIT) - 128; ai_data_flag = 1; } #define S_MOTOR_PIN ATOM1_CH1_P33_9 //定义舵机引脚 #define ANGLE_CENTER 6800 void smotor_init(void) { gtm_pwm_init(S_MOTOR_PIN, 50, ANGLE_CENTER); } void turn(void) { turn_angle = (int16)limit(turn_angle,1650);//限幅保护避免舵机出现卡死 导致舵机烧毁 pwm_duty(S_MOTOR_PIN, ANGLE_CENTER-turn_angle); } int core0_main(void) { get_clk();//获取时钟频率 务必保留 //用户在此处调用各种初始化函数等 elec_init(); smotor_init(); seekfree_wireless_init(); //等待所有核心初始化完毕 IfxCpu_emitEvent(&g_cpuSyncEvent); IfxCpu_waitEvent(&g_cpuSyncEvent, 0xFFFF); enableInterrupts(); while (TRUE) { //用户在此处编写任务代码 ai_data();//采集车身周围的电感 并将数据转换为-128至+127 //计算舵机需要转动的角度 //这部分需要同学们自己根据选用的引导方式来进行计算 turn();//控制舵机转动 //以上的数据采集以及控制代码建议放入周期中断,保证代码的执行周期是一样的 //数据发送代码建议放在主循环,使用if查询,如果数据采集成功就发送数据 if(ai_data_flag) { //头两个字节发送系统时间,如果你的工程里没有系统时间这个参数,则可以不发送 //发送时间的目的主要是判断两个包之间是否连续,没有时间参数也没有什么问题 send_buff[0] = 0; send_buff[1] = 0; send_buff[2] = ad_data[0]; send_buff[3] = ad_data[1]; send_buff[4] = ad_data[2]; send_buff[5] = ad_data[3]; send_buff[6] = ad_data[4]; send_buff[7] = ad_data[5]; send_buff[8] = ad_data[6]; //将舵机数值转换为-128至+127 因为舵机转角被限制在-1650至+1650之间, //因此舵机转角除以1651之后绝对值必定是小于1的, //然后在乘以128数据范围也就一定被限制在了-128至+127之间了。 send_buff[9] = (uint8)((int32)turn_angle*128/1651); //固定字节,可以用于校验或者方便肉眼可辨每一个包是否正确 send_buff[10] = 0x5a; ai_data_flag = 0; seekfree_wireless_send_buff(send_buff, 11); } } } #pragma section all restore   在运行上面的程序之前,需要将自己的无线转串口模块波特率设置为230400,因为数据量较大,这样才能更好的发送数据。设置好后运行上面的示例程序之后,我们在串口助手中可以接受到如下格式的数据:
  
    然后将数据全部复制出来,新建一个文本文件,将复制的数据粘贴在文本文件中。可以看到数据只有一行,接下来我们使用编写好的脚本文件对文本文件进行自动的换行,找到资料包中的split压缩包并解压之后,打开之后里面有编写好的split.py文件,我们将刚才新建的文本文件改名为normal.txt(名称最好都改为英文),并拷贝到与split.py文件同一目录下,然后在文件夹窗口中的空白部分按住shift之后右击鼠标按键,选择在此处打开powershell窗口,然后输入python 。\split.py -f 。\normal.txt命令,会在当前文件夹中生成转换后的split_normal.txt文件,其中。\normal.txt参数可以自行更改,更改为自己的txt文件名称即可。转换之后的split_normal.txt文件也就是train_dat文件夹下需要的normal.txt文件。
    命令窗口运行效果如下图:
  
    转换后的文本文件如下图:
  
    我们可以将不同方式采集的数据按照不同的名称保存,例如正常寻迹用(normal)、手推车(manual)、引入随机控制(random)等等,名字可以自己随意取。
  3.4、训练模型
    使用我们采集到的数据文件,按照第二章一步一步进行操作,即可得到我们自己的模型并部署在自己的车模上进行测试。需要注意的是如果需要从0开始训练模型的话,记得在输入命令的时候加上-r参数 例如:“python sc_keras.py -a dense -ad 1 –r”。否则模型会在之前的基础上继续训练。简单说就是如果你换车了你就应该加上-r参数进行重新训练,不应该在保留之前的数据。
  3.5、实际应用模型
    接下来我们将属于自己的模型真正的用起来。实际上使用非常简单,主要使用run_model函数,当7路ad采集完成时,将ad的数组作为参数送入模型计算,即可得到角度值。
  [tr]参数名称参数说明[/tr]pvModel模型参数
  g_input7路ad的数据
  g_out输出转向值
    具体可以参考示例程序,在资料包中可以找到“ai car”的压缩包。此例程仅仅说明如何使用模型的函数计算转角,并不是下载程序后,车就能在赛道上跑。工程基于TC377/TC364制作,如果使用TC264核心板,直接将相关程序复制到TC264的工程即可。并根据自己所使用的引脚进行一定的修改即可。逐飞TC264、TC364、TC377三款核心板可实现无缝切换,如果是使用的TC264核心板制作主控,也可以无缝升级为TC364和TC377核心板。
    
2021-7-1 09:57:23 评论

举报

只有小组成员才能发言,加入小组>>

1个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /9 下一条

快速回复 返回顶部 返回列表