#P2023. L1-8 学长的项目

L1-8 学长的项目

题目描述

在2023年天梯赛的宣讲会上,邓老师用邢学长的例子,讲述了邢学长因参加超算比赛获得全球16强的经历,从而在北京找到了年薪30W+高性能计算相关的工作,鼓励大家多多参加学科竞赛,挑战自己,展示自己。

在讲座结束后,同作为毕业班的学长,感觉自愧不如,觉得自己是个fw,在emo之际,学长偶然想起了自己曾经也完成过一个项目。

电子与计算机工程专业是目前校区人(juan)数(wang)最多的专业之一,在大三的时候,电计专业会被分为嵌入式和移动互联2个方向分别进行学习。学长在学习了嵌入式方向的知识后,出于对嵌入式的热爱,想要完成以下的项目:设计制作一个声源定位跟踪系统,能够实时显示及指示声源的位置,当声源移动时能够用激光笔动态跟踪声源。声源检测系统测量区域分布俯视如图 1 所示: image 注:A点表示坐标原点,B点表示声源位置,均不考虑高度(即二维平面定位)

具体的设计要求如下:

(1). 设计并制作一个声源定位检测装置,传感器安装在图 1 的 C 区范围内,系统采用的拾音器或麦克风传感器数量不超过 10 个;在装置上标记测试参考点A,作为位置坐标的原点;装置上有显示电路,实时显示 D 区域内声源的位置,显示 A、B 两点直线距离γ和以 A 点为原点,AB在地面的投影与图1中心线的夹角θ(0≤θ≤90),测量时间不超过5s,距离γ和角度θ的测值误差越小越好。

(2). 设计并制作一个声源指示控制装置,此装置和上述声源定位检测装置可以合为一体。也放置在图1的C区,安装有激光笔和二维电动云台,能控制激光笔指向声源,定位计算过程中时,激光笔关闭,定位运算完成时激光笔开启。定位指示声源时,动作反应时间不超过10s,光点与B点偏差越小越好。

经过四天三夜的努力,老师们和学长运用相关的传感器和STM32单片机的外部中断,设置滤波电路等技术成功地采集到了声源的具体信息,并将声源信息的坐标信息(按上图所示的建系方式,以A点为原点)返回到了STM32单片机上了。

STM32收到的数据是一个float类型的单精度浮点数数据,他采用IEEE754标准进行存储。一个单精度浮点数由32位二进制编码组成,具体的构成方法如下:(从高位到低位)

符号位(S) 阶码(E) 尾数(M)
1 8 23

其中,符号位表示该数的正负,0为正,1为负。
阶码决定了浮点数的范围,而尾数决定了浮点数的精度。
一个IEEE754浮点数转化为十进制数可由以下公式来实现:

image

N表示对应十进制数;S表示符号位,E表示阶码,M表示尾数

例如:0100 0000 0010 0000 0000 0000 0000 0000 这个IEEE754类型浮点数按照上表的标准,可以划分为:

符号位 阶码 尾数
0 1000 0000 010 0000 0000 0000 0000 0000

注:将尾数化为十进制数时,尾数第一位为image ,第二位为image 以此类推。故尾数表示为0.25.
阶码的第i位,则表示为image ,从image 开始依次递增,故阶码为128.

利用上述公式可得:image

现在需要做的任务,就是将第一个任务中的夹角θ和A、B两点直线距离γ的信息(以十进制的方式)打印在显示屏上,同时完成第二个任务控制二维电动云台的旋转。学长已经很累了,聪明的你能够帮学长完成这两个任务吗?已知最开始的时候,二维电动云台指向y轴方向,对于第二个任务而言,你只需要输出二维电动云台每次转动的角度即可(往x正方向旋转为正,反之为负)。

输入格式

第一行输入2个数字n(1≤n≤100),表示声源的数量

之后n行,每行读入2个以IEEE754浮点数表示的数据,表示采集到的声源定位结果。即该声源所在的坐标。

输出格式

输出n行,每行按以下格式输出: angle:θ dis:γ rotat:θ,(注意空格的数量,见样例,行末无多余空格)分别表示任务1中根据声源位置计算出的θ角的大小,A、B 两点直线距离γ,以及任务2中得到的二维电动云台所旋转的角度。(结果保留3位小数,十进制数)

样例

3
01000010111110100000000000000000 01000011011110100000000000000000
11000010111110100000000000000000 01000011011110100000000000000000
11000010110010000000000000000000 01000011011110100000000000000000
angle:26.565 dis:279.508  rotat:26.565
angle:26.565 dis:279.508  rotat:-53.130
angle:21.801 dis:269.258  rotat:4.764

限制

1s, 1024KiB for each test case.

提示:

求角度,在C++中,可以直接调用 atan函数求得其反正切的值,函数的返回值为对应的幅度。
(弧度制换算角度:高中知识::1rad≈180/π)
函数声明如下:

atan2(double x,double y);

返回的则是θ在幅度制下的结果 image