树莓派Python编程实现超声波动态雷达图

2023-06-21 21:54牟晓东
电脑报 2023年23期
关键词:滑环极坐标舵机

牟晓东

超声波传感器能检测与前方障碍物间的距离,如果将它固定于360 度旋转的舵机上持续采样,就能将采样获取的数据绘制成雷达图进行动态展示。

1.实验器材及连接

树莓派3B+ 和古德微扩展板各一块,HC-SR04 超声波传感器一个,4 路8 线电滑环一个,360 度舵机一个,红色、绿色LED 灯各一支;还需要电烙铁和热熔枪各一把。

用热熔枪将滑环中央的转子底端与舵机输出转子进行固定,注意二者的中心点要尽量吻合,防止旋转时偏心。再将滑环中央转子的顶端与超声波传感器顶端固定好,也要中心对齐。接着,将滑环外围的定子圈的四根线与古德微扩展板的20 号和21 号(共四个引脚)进行连接,红线接电源正极VCC,黑线接地GND,橙红色线接Trig 信号发射端,棕色线接Echo信号回声端。滑环中央转子4 根引线分别与超声波传感器的四个引脚进行对应连接(电烙铁点锡);将舵机固定好之后,连接线插入扩展板的18 号引脚,注意黑色、红色和棕黄色三根线分别与GND、VCC和信号控制D 端连接;然后,将红色和绿色LED 灯按照“长腿正、短腿负”的规则分别插入扩展板的5 号和6 号引脚;最后,给树莓派插入数据线,通电启动操作系统(如图1)。

2.Python代码编程

(1)库模块的导入与变量初始化

首先, 导入GPIO Zero 、Matplot Lib等库模块: “from gpiozero import LED , Servo , Distance Sensor ”“ importnumpyasnp”“importmatplotlib”"impor tmatplotlib.pyplot as plt”和“importtime”; 然后进行LED 灯、舵机和超声波传感器实例的初始化操作:“ Red _ LED= LED ( 5 ) ”“ Green_LED=LED(6)”“servo=Servo(18)”和“sensor=DistanceSensor(echo=21,trigger=20,max_distance=4)”, 并且通过语句“servo.mid()”控制360 度舵机以中速带动超声波传感器向一个方向开始旋转;再设置雷达图绘制画布的宽度和高度,大小分别为8 和6(单位为英寸):“plt.figure(figsize=(8,6))”;建立变量ax,赋值为“plt.subplot(111,projection='polar')”, 作用是设置画图样式为“极坐标”模式(Polar);建立变量theta, 赋值为“np.arange(0,2*np.pi,2*np.pi/30)”,通过调用Numpy 库中的arange() 函数返回一个起点为0、终点为2Pi(360 度圆周)的等差数列,固定步长为2Pi/30;语句“plt.ion()”的作用是将figure 绘图设置为交互模式;建立变量data,赋值为空列表“[]”,作用是存放超声波传感器每旋转360 度一周扫描后检测生成的若干个与前方障碍物的间距值。

(2)“whileTrue:”循环体

如果超声波传感器检测的障碍间距值在安全范围内(比如20cm),则控制绿色LED 灯常亮:“Green_LED.on()”;在每次旋转360 度的过程中,需要获取30 个值与之前产生的等差数列30 个刻度值对应:“for i in range(30):”; 建立变量distance,赋值为“round(sensor.distance,4)”, 获取检测到的障碍间距数据( 保留4位小数), 并且通过语句“print(i,distance)” 进行输出监测; 在“if distance<=0.2:” 分支结构中, 如果条件成立则亮红色LED 灯、关闭绿色LED 灯:“Red_LED.on()”“Green_LED.off()”, 持续时间为0.01 秒钟:“time.sleep(0.01)”; 然后通过语句“data.append(distance)”, 将数据有序追加到data 列表中,再关闭红色LED灯、打开绿色LED 灯:“Red_LED.off()”“Green_LED.on()”。

進入下一次循环(range),30次循环结束之后, 开始绘制雷达图: 语句“ax.plot(theta,data,'o--',color='g',label='data',linewidth=1)”对极坐标进行数据设置,包括30 个0 至360 度的等差刻度值、30 个超声波检测障碍间距值(data 列表)、线的模式(虚线)、颜色(Green 绿色)和线宽(linewidth)等; 语句“ax.fill(theta,data,facecolor='g',alpha=0.15)” 是对30个障碍间距值与极坐标中心点围成的封闭区域进行设置,包括填充颜色和透明度等;语句“plt.pause(0.1)”的作用是控制交互式绘图过程中数据更新的预留时间缓冲,预防出现图形不能及时刷新显示的问题;语句“plt.cla()”的作用是清除当前活动轴的数据内容(相当于清空操作),语句“plt.show()”的作用是绘制显示图像,语句“data.clear()”的作用是清除data 列表中的当前数据,为下一次循环保存新数据“留空”。

3.测试超声波动态雷达

将程序保存为Radar.py, 点击“ 运行” 按钮进行超声波动态雷达的测试。超声波传感器在舵机的带动下开始匀速旋转,程序界面中也不断有“00.2698”“23 0.3555”等信息出现,表示每次旋转一周所监测到的30 个障碍间距值;同时,绿色LED 灯亮起,如果出现有近距离的障碍物(在20cm 范围内),则会亮起红色LED 灯。超声波传感器每旋转一周,就会出现一个雷达极坐标图,绘制有每个点所处的二维空间位置(角度值)和距离中心的半径大小(障碍物间距值),同时在这些坐标点所包围生成的封闭区域内,雷达图是以一定透明度的绿色来展示的。随着超声波传感器的不停旋转,同时在其周围变换出现各种障碍物,整个雷达图也在不断发生变化(如图2)。

关注“壹零社”公众号下载源代码。

猜你喜欢
滑环极坐标舵机
巧用极坐标解决圆锥曲线的一类定值问题
含齿隙弹载舵机的全局反步模糊自适应控制
一种无触点能量及信号传输的滑环设计
HXn5机车主辅发电机滑环安装工艺研究
基于dsPIC单片机的飞艇舵机控制实现
极坐标视角下的圆锥曲线
基于高速同步485总线通信的多通道舵机控制器设计
自冷式滑环风路结构的设计
基于云模型的舵机同步控制
岭澳核电站3号机组电动发电机滑环的更换