搞个大新文

菜单

菜单

  • 博客
  • 归档
  • 标签
  • 邮件
  • 订阅
  • 登陆

页面

  • About
  • 关于本站
  • 友链
  • 技术栈(超级持续更新
  • 隐私政策

最近的帖子

  • 操作系统的边界在哪里
  • PythonSTG开发心路
  • 东方Project同人例会录制/直播指北
  • 张量分析大观
  • ConvNext品鉴-东方Project角色识别

档案

  • September 2026
  • May 2026
  • March 2026
  • February 2026
  • December 2025
  • September 2025
  • August 2025
  • July 2025
  • June 2025
  • May 2025
  • April 2025
  • March 2025
2024的档案

December 2023

  • 红蓝锥桶招中识别

    前言 SLAM写不出来,整个纯视觉凑合凑合得了 main import cv2 import numpy as np import time import numba class FindMiddleLine: def __init__(self, raw_img): self.raw_img = raw_img def find_line(self): img = self.raw_img down_width = 640 down_height = 320 down_points = (down_width, down_height) small_img = cv2.resize(img, down_points, interpolation=cv2.INTER_LINEAR) start_pix = 80 end_pix = 250 max_pix = (end_pix-start_pix * 640 ) detected_img = small_img[start_pix:end_pix, 0:640] hsv = cv2.cvtColor(detected_img, cv2.COLOR_BGR2HSV) blue_shv = [[100, 128], [130, 255], [50, 240]] red_hsv = [[0, 18], [149, 255], [85, 240]] red_hsv_2 = [] blue_inrange = cv2.inRange(hsv, np.array([100, 130, 50]), np.array([128, 255, 240])) red_inrange = cv2.inRange(hsv, np.array([0, 149, 85]), np.array([24, 255, 240])) blue_inrange = blue_inrange.astype(np.int32) red_inrange = red_inrange.astype(np.int32) different = np.sum(red_inrange) print(different) different -= np.sum…

    永久链接至 “红蓝锥桶招中识别”

November 2023

  • 如何放生字符串

    import requests,random import random import os from threading import Thread from multiprocessing import Process def generate_random_str(randomlength=16): """ 生成一个指定长度的随机字符串 """ random_str ='' base_str ='ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789' length =len(base_str) -1 for i in range(randomlength): random_str +=base_str[random.randint(0, length)] return random_str url = "https://www.baidu.com/s" # 目标网站url headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36" } def req(): while 1: #ps = generate_random_str(random.randint(6,20)) r = requests.get(url=url, headers=headers) #print(r.text) threads = [] try: for i in range(0, 128): thr = Process(target=req) thr.start() print(i) threads.append(thr) except: print("GG")

    永久链接至 “如何放生字符串”
  • 如何纯python寻仙咔咔跑

    十九届智能车百度组车模,随手寻个线先。 改良了以前遍历像素慢得扣的问题,用numpy解决了这个问题 #encoding: utf-8import cv2import numpy as npimport serialimport timeimport sysfrom simple_pid import PIDp = PID(Kp=0.23 , Ki=0, Kd=0.01,setpoint=320, output_limits=(-50, 50))left_start = 0right_start = 640up_start = 190down_start = 250pressed_pix = 2speed = 50def find_value(img11):    # 计算灰度直方图    global left_start, right_start, up_start, down_start    finally_list = []    mid_num = int((right_start + left_start) / 2)    for i in range(left_start, right_start):        # error_now = i - mid_num        n = 0        for j in range(up_start, down_start):            if img11[j, i] >= 128:                n = n + 1            else:                pass       …

    永久链接至 “如何纯python寻仙咔咔跑”
  • 2023年狮子座流星雨观星有感

    23/12/20 天文社小伙伴们越好一起去古北口玩耍 S503 CRH6型怀密号动车组市郊列车,京局担当,非常地慢速,非常地地铁,非常地不Run许拍照 酒,酒是苦的。但是喜欢,喜欢能够微微离开地表的感觉,如同长时站立后坐下长舒一口气。 星空,星空是虚幻的。离我太远了,它能在我一生中产生的唯一影响就是星光本身。有的光出发的时候,地球上还没有相机,没有工业,没有现代技术,但是古人在无数个黑暗的长夜中用纸笔记录下了它们的位置,给它们命名。多年后我站在同一片土地上抬头,看到了无数个曾经抬头仰望星空的人所见证过的,同一片天空。 狮子座流星雨,这道光芒不是来自于遥远的恒星,而是陨石在划过大气层。这些亿年前就漂浮在轨道上的石头,等待这么多年,终于走向了结局:流星

    永久链接至 “2023年狮子座流星雨观星有感”
  • 使用LTspice进行ZVS电路仿真

    写在前面 准备搓个狠东西,但是需要高频高压电,所以在各种方案下ZVS零电压开关就成了比较合适的选择。 在正式开搓之前要先仿真一下验证一下方案不然给自己炸飞了就不好了。 准备仿真 仿真软件我们选择全世界都爱用的免费软件LTspice。 你可以在这里下载到这个软件: LTspice信息中心 | 亚德诺半导体 (analog.com) 先搓一个单倍压电路试试手吧: 按f2进入元器件库慢慢选,f3连接导线,f8抓取,Ctrl+e镜像,Crtl+r旋转,这里不多赘述。 我们通过二极管的单向导通特性与电容的储存特性来做一个连续的升压电路: 在选择电源时候我们在f2列表中选择: 电压源 放置好之后右键 这样就能产生一个标准的交流电压源了。 之后直接右键Run 再探测点电压就能看到: 非常标准的倍压,一级一级地把电压升上去。 ZVS原理详解 MOSFET Metal Oxide Semiconductor Field Effect Transistor-金属氧化物半导体场效应晶体管 名称很长,但是也说明白了这个东西的原理。 我们不太需要知道其具体的工作方式,种类和工作方式比较多 我们这里调要用的说一下 对于NMOS,当G极电压对S极电压高于某一值时,D极对S极导通,反之不导通。 由此我们搭建这样一个电路 我们通过右侧的LC震荡来实现MOS的不稳定状态,在其中一个mos由导通变成关断的瞬间会导通另一个MOS管,循环往复就能实现产生超高频的交变电流。 ZVS仿真与遇到的问题 于是我们运行上面那个仿真 注意有一个大坑,首先是现实世界中找不到两个完全相同的MOS,而仿真不会管你这个,所以我们需要一点点初始的扰动,即一个电源做了延时启动(C2),另一方面是对仿真设置电压从0开始往上走: 之后运行仿真: 非常好图像,如果没有负载这个应该是正弦波,但是我加了点奇奇怪怪的负载所以波形不太对。 我们再看MOS 的G极 我们看到两个MOS正在互相启动关闭,非常完美。

    永久链接至 “使用LTspice进行ZVS电路仿真”
  • 记一次自找的服务器起飞危机

    事件概述 本博客自22.12一直部署在一台hk的centos7服务器上,最近手痒喜欢用dnf,想升级到centos8,一通乱搞成功给系统干崩,SSL网站全部连接不了,只得冲头刷镜像再来。 第一步 备份网站 我自己博客的备份 本站的备份是长期在One Drive上,每天两次备份,所以我并不担心本站会消失。 另外一个在我服务器上的就是社团网站cumtb.club了,没做任何备份。 开始升级之前的准备 我在宝塔面板选择了备份网站以为万无一失,万万没想到这个备份只备份网站文件目录而不备份网站数据库,给之后的我埋了个超级大雷。 第二步 升级 首先就是安装dnf yum install dnf 之后骚的来了 卸载yum # dnf -y remove yum yum-metadata-parser # rm -Rf /etc/yum 这个时候事情尚可挽回,在更新完dnf之后的下一步就更加逆天咯: # rpm -e `rpm -q kernel` 删除了内核 本来事情到这里就很顺利 然后装新内核就完事了 dnf -y –releasever=8 –allowerasing –setopt=deltarpm=false distro-sync dnf -y install kernel-core 报错一堆 Open ssl与NetWork Manager不兼容啊各种问题 于是找到了缓存中的包手动安装: rpm -ivh –nodeps –force /var/cache/dnf/包名字 哦这一步干完内核能安装了,于是重启。 于是ssh连不上了,网站打不开了。 于是寄了。 第三步 抢救 试试Debain 原系统现在已经无论如何都没法操控了,完全完蛋了。重刷吧。 首先刷了个debain装宝塔面板。 我们首先自己手贱装一个php8: sudo apt install php8.0 结果宝塔面板又自己装了一份(子弹出膛! 装好WordPress准备恢复备份文件的时候发现文章怎么全部没有了。分析可得数据库炸裂了,没有成功恢复,重启后WordPress直接打不开了。 猜测和自己装的php有关系,但是不清楚,人当时已经慌了 还是 Centos 于是装回CentOs7 重新装上WordPress出现下一个问题 备份完成,但是密码忘了…

    永久链接至 “记一次自找的服务器起飞危机”

October 2023

  • Live free or die…

    十一假期去自驾出行了一小圈,非常棒。

    永久链接至 “Live free or die????.”

September 2023

  • Pytorch 入门实战…

    写在前面 最近老想用Pytorch来搓点网络了。 第一个例子:简单的CNN图像分类 一段一段代码来分析 import torchimport torchvisionimport torchvision.transforms as transforms 导入必要的库,不扯淡 transform = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) batch_size = 4 trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size, shuffle=True, num_workers=2) testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform) testloader = torch.utils.data.DataLoader(testset, batch_size=batch_size, shuffle=True, num_workers=2) classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck') 第一句 transform = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) 首先定义了 预处理方法 transforms.ToTensor() 把图像转化为张量 transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) 把图像张量标准化为[-1…

    永久链接至 “Pytorch 入门实战 手搓自己的第一个网络”
  • 如何计算开关降压ic的电感与电阻值…

    写在前面 最近在画无刷电机驱动,恰好需要这个万一给单片机供电。 选择你的电阻 查看技术手册可得 注意到公式中VREF 为参考电压,R1选择1K不变,我们需要12v-5v故计算可得 3.065K 选择你的电感 首先需要计算设定的“伏秒” E*T = (12-5)(5/12)(1000/52)= 56.08v*us 我们撑死要个0.5A,查表可得 我们需要一个“L470电感,”470 微亨(μH) 选择你的输出电容 您猜怎么着,哎例子里面那个就是咱今儿个选的电感,得嘞,算算吧 得到 49uf的结果,行,找个50uf的糊弄糊弄吧。

    永久链接至 “如何计算开关降压ic的电感与电阻值(以LM2575为例”
  • How to DIY a 3D…

    Befor The Start Because I became the president of the 3D printing club, I had no choice but to DIY two 3D printers. Along the way, I encountered many obstacles, so I decided to write them all down to help others avoid them. I have two printers. One is based on the Ultimaker (UM) structure, using the Klipper, while the other is a delta structure printer with Marlin firmware. If there are any parts that you don’t understand, feel free to come directly to the 沙河学八二楼, or leave a comment below this post. UM结构 这个结构还有个名字叫做笛卡尔打印机,正如其名,每一个坐标轴都由一个步进电机来驱动,从而实现了对打印机空间位置的精确控制。 这个过程中最重要的是:步进电机。 步进电机控制 步进电机简介 步进电机是一种特殊的无刷直流电机,在电机的内部能够产生指向某特殊方向的磁场,从而控制带有磁铁的转子来稳定而又精确地指向某一个确定的方向,当然步进电机并不能闭环地知道自己确切的位置,所以在外部负载过大的时候,电机会发生丢步的现象。 故步进电机的驱动方式是脉冲驱动,信号每给一次则电机转动一个角度,故这个就是步进电机名字的由来。 步进电机驱动方式(只是装个打印机可以跳过这一章 脉冲驱动很明显不太能用单片机的GPIO直接引出来,我们需要一些驱动芯片,对于3D打印机来说我们常用的驱动是:A4988 A4988驱动: 这里以Arduino为例: 我们首先需要接个线先。 一个标准的A4988驱动板 引脚介绍: EN:使能引脚,低电平使能,但是默认拉低 MS1,2,3:三个引脚来选择步进电机的细分方式,即一个脉冲转动多少分之一的步进…

    永久链接至 “How to DIY a 3D Printer, And How it working”

August 2023

  • 为什么ESP32是神

    在谈论这个问题之前,我们先要说说神独特的出生,本身10块的芯片定价,却拥有全引脚中断的实力,这样独特的他注定是不平凡的,果然,一推出就达到了前所未有的热度,并且靠着全引脚全功能输出,wifi蓝牙的加持成功碾压一众单片机,超凡入圣,粉丝更是称其为“我超,乐鑫!” 那么其他单片机/开发板相较于ESP32差在了哪里 首先是犯下傲慢之罪的树莓派 凭借自己强大的开源库就沾沾自喜,而不专注于开发者的使用体验,甚至允许黄牛卖出1000多一块树莓派4b的价格,这样的开发板注定走不长远,而事实也正是如此,多年未产出新产品的树莓派基金会彻底一蹶不振,傲慢的他们只能在生死存亡之际疯狂降价,但依然受人耻笑,相较之下,ESP32就一直专注于自身的开发,推出各种新的芯片-ESP32-WROOM-32、ESP32-WROVER、ESP32-S等等,他们都是神的一员,凡人不懂就擅自锐评,我劝你们好自为之。 然后是犯下愤怒之罪的Jetson Nano 因为没人买英伟达的显卡就愤怒不已,甚至说出了“买得越多,省得越多”这样的批话,犯下了神在定价中定的罪———“太沟八贵”,于是被神多次正面击破,从此使用人数大减,纷纷转投RK3588等带NPU的开发板。“So NVIDIA, F*** U!“也成为了他一生的耻辱 接着是犯下懒惰之罪的Arduino 这是神不愿提起的往事,Arduino本是神最疼爱的弟子,同为可以使用Arduino IDE开发的芯片的它,最适合和神并肩作战,但是在多年不出新板子的懒惰后,Arduino居然敢把神放在自己的板子上面作为wifi模块,这种wifi模块比Arduino性能还强的行为简直是在打乐鑫的脸,这举动惹怒了神,他降下了神罚,令Arduino 的pwm,iic,spi,adc通道永远少于神,甚至连电容触摸功能都得外接芯片。所以Arduino主动悔改,选择将Arduino IDE 完全交给神,作为神的专用IDE。 再然后是犯下嫉妒之罪的STC 屡次在大学生的使用数量上输给神,但是口服心不服STC,暗中嫉妒着神可以如此亮眼,受万众瞩目。于是他献祭了自己的金金金在各种比赛上宣传自己的芯片,甚至是在电磁组中只能使用STC的芯片,然后却只能使用丑陋的Keil来开发,也不提供完善的platform io 支持。于是神降下了神罚,他伸手摘掉了蟒蛇,将其抛入人间来惩罚STC…

    永久链接至 “为什么ESP32是神”
  • 重庆,但是只有内透

    长期以来拍的什么“洪崖洞”之类的照片都是一大坨丑到爆炸的黄色的红色的光在那里,我的评价是一坨屎,所以专门等到洪崖洞下班了,大部分外墙和桥梁把装饰灯光都关闭之后再去拍照,就很有维多利亚港的感觉(bushi 渝中,但是凌晨1点多 稍微换一个角度 千厮门大桥,但是没有开灯 东水门大桥南桥头,稍微拍久了一点星星拉成星轨力(悲 应该是渝中区南边( 江北嘴CBD,那个楼一直不关灯(恼 这个关灯了( 相当离谱的建筑密度 总有一天能修好.jpg(天上那个是飞机吧 在飞机上拍的(

    永久链接至 “重庆,但是只有内透”
  • VIM,启动

    写在前面 对于在终端中编辑文本的需求,我们通常会选择vscode server,但是并不是所有服务器的性能都能装上vscode,抑或是在本地没有安装图像界面的时候修改配置文件之类的,一个好的终端文本编辑器的作用就体现出来了,通常的选择是nano,但是对于更加复杂的代码或者配置文件,选择vim 就很合理了。 vim的几种模式 大概用得上的一共有命令模式 输入模式 底线命令模式 我们第一次进入vim难免手足无措,因为默认就是命令模式,所以你是不能直接输入什么内容的,要输入内容我们需要切换至输入模式 直接输入 i在光标的当前位置开始输入文本a在光标的下一个位置开始输入文本o在当前行的下一行新建行,然后开始输入O在当前行上方插入新行,然后开始输入 当然我们还有一些别的命令可能用得上 x — 删除当前光标所在处的字符。 : — 切换到底线命令模式,以在最底一行输入命令。 dd — 删除当前行。 yy — 复制当前行。 p(小写) — 粘贴剪贴板内容到光标下方。 P(大写)– 粘贴剪贴板内容到光标上方。 u — 撤销上一次操作。 Ctrl + r — 重做上一次撤销的操作。 :w — 保存文件。底线命令模式 :q — 退出 Vim 编辑器。底线命令模式 :q! — 强制退出Vim 编辑器,不保存修改。底线命令模式 快速高效地编辑 首先是光标的导航 k或↑ 上移 j或↓ 下移 h或← 左移 l或→ 右移 也可以更大范围地来移动光标 ctrl+f 在文件中前移一页(相当于 page down) ctrl+b 在文件中后移一页(相当于 page up) ctrl+d 屏幕向下移动半页 ctrl+u 屏幕向上移动一页 狠狠地移动: * 当光标停留在一个单词上,* 键会在文件内搜索该单词,并跳转到下一处; # 当光标停留在一个单词上,# 在文件内搜索该单词,并跳转到上一处; (/) 移动到 前/后 句 的开始; {/} 跳转到 当前/下一个 段落 的开始。 g_ 到本行最后一个不是 blank 字符的位置。 fa 到下一个为 a 的字符处…

    永久链接至 “VIM,启动”
  • 2023电赛E题心得

    写在前面 比赛完蛋了,下次再来。 方案简介 硬件结构图 红色激光前两题题解 首先前两题我们的方案是直接使用开环控制。 直接记录舵机的pwm值,然后连续控制多级走四个点或者中心点即可。 红色激光第三题方案题解: 首先使用获取一张当前的图像,然后裁切得到一张只含有屏幕部分的该图像。 之后使用大津法进行选取,这样就能获取图片上面的黑框部分。 我们获取黑框的四个点之后可以对两个相邻点之间进行连续采样。 之后我们对舵机进行位置增量PID控制,来连续地追踪那一堆点。这样第三题就完成了。 绿色激光追踪题解 opencv首先hsv提取红色与绿色激光点位置,之后根据位置之差进行x,y方向的pid控制追踪,控制给到下位机的esp32,再控制无刷云台追踪实现闭环。 源码品鉴 无刷电机下位机程序 #include <SimpleFOC.h>      MagneticSensorI2C sensor = MagneticSensorI2C(AS5600_I2C);   BLDCMotor motor = BLDCMotor(11);   BLDCDriver3PWM driver = BLDCDriver3PWM(25, 26, 27, 14);      float target_angle = 0;   float change_angle = 2.8;   int i = 0;      Commander command = Commander(Serial);   void doTarget(char* cmd) { command.scalar(&target_angle, cmd); }      void setup() {     Wire.setPins(33,32);     Wire.begin();     sensor.init(&Wire);     motor.linkSensor(&sensor);        driver.voltage_power_supply = 12;     driver.init();     motor.linkDriver(&driver);        motor.foc_modulation = FOCModulationType::SpaceVectorPWM…

    永久链接至 “2023电赛E题心得”

July 2023

  • 从0开始的异次元Surface…

    前言 一不小心给manjaro的pacman源换成了arch的,更新完全是bug,干脆自己动手从头安装一个arch得了 硬件简介 surface pro8 windows11已经安装 制作安装介质 下载,制作Arch安装介质 首先在Index of /archlinux/iso/2023.07.01/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror下载arch的对应版本,如果你是x86架构,你应该下载 之后使用balenaEtcher这个软件烧入一个你不用的u盘里面。 进入Arch 安装介质 首先进入你电脑的bios(通常是开机狂按del),把首要引导换成usb,选择uefi引导,关闭安全启动。 然后重启就进入arch,选择: Arch Linux install medium (x86_64, UEFI) 连接互联网 首先进入iwd环境 iwctl 输入device list 查看都有什么网络设备 我们记住name下面的网络名称 [iwd]# station wlan0 scan # 扫描网络,请将 wlan0 换成您的设备名称 [iwd]# station wlan0 get-networks # 输出扫描结果,请将 wlan0 换成您的设备名称 [iwd]# station wlan0 connect "mySSID" # 连接网络,请将 wlan0 换成您的设备名称,mySSID 换成您的网络名称 Type the network passphrase for mySSID psk. Passphrase: ******** # 输入密码 [iwd]# quit # 退出 iwd 程序环境 这里是用wifif联网的,用有线网可能会复杂一点点,但是我没用 你可以ping一下本网站来确定连接成功 # ping qwqpap.com 按ctrl+c 退出 请校准时钟 # timedatectl 查看时间是否准确,如果是utc时间可能会慢上8小时,不用管他 对磁盘分区 务必谨慎操作 我这里已经有了windows系统,提前在diskgenius里面提前给出了一块空闲的空分区。 因为只有一个硬盘,所以要事先划分一块嘛。 输入 fdisk -l  查看所有的磁盘分区,我们注意到/dev…

    永久链接至 “从0开始的异次元Surface Arch安装之路(2023/7”
  • PEP 8 -- Style…

    转载自https://learnku.com/docs/styleofcode/PEP_8/7084 放在这里纯属自己看着方便 介绍 本文档为包含主要 Python 发行版中的标准库的 Python 代码提供了编码约定。请参阅随附的信息性 PEP 描述样式指南,以了解 Python 的 C 实现中的 C 代码。 本文档和 [PEP257](/dev/peps /pep-0257)(Docstring 公约) 改编自 Guido 最初的 Python 样式指南文章,并引用了 Barry 样式指南。 此样式指南会随着时间的推移而演变,因为会确定其他惯例,而过去的惯例会因语言本身的变化而过时。 许多项目都有自己的编码风格准则。在发生任何冲突的情况下,此类项目特定的指南优先于该项目。 A Foolish Consistency is the Hobgoblin of Little Minds 圭多岛 (Guido) 的主要见解之一是读取的代码通常比编写的要多得多。此处提供的指南旨在提高代码的可读性并使其在 Python 代码的整个光谱范围内保持一致。如 [PEP 20](/dev/peps /pep-0020) 所述, “Readability counts”。 风格指南是关于一致性的。与本指南的一致性很重要。项目内的一致性更重要。在一个模块或功能中的一致性是最重要的。 但是,请知道何时不一致 – 有时不适用样式指南的建议。如有疑问,请使用最佳判断。查看其他示例并确定最佳外观。而且不要犹豫去问! 特别是:请勿违反向后兼容性以仅符合本 PEP! 其他一些忽略特定准则的好的理由: 应用指南会使代码变得不那么可读,甚至对于被用来阅读遵循此 PEP 的代码的人来说也是如此。 与周围的代码保持一致 (也可能是出于历史原因)- 尽管这也是清理其他人 (真正的 XP 风格) 的机会。 因为所提出的代码早于指南的介绍,并且没有其他理由修改该代码。 需要与旧版本的 Python 保持兼容的代码时,该旧版本不支持样式指南建议的功能。 代码布局 缩进 每个缩进使用四个空格 延续线应使用 Python 的隐式线在括号,括号和花括号内垂直对齐,或使用 …

    永久链接至 “PEP 8 -- Style Guide for Python Code”
  • FOC 控制 位置闭环小车

    23年电赛小车,准备做控制类赛题,还有点问题,改改再说 import math import time import serial from location import Location as mt from threading import Thread left_num = 1.1 right_num = 1.1 left_location = 1 right_location = 2 start_flag = 1 left_port = serial.Serial( port="/dev/left_roll", baudrate=115200, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, ) right_port = serial.Serial( port="/dev/right_roll", baudrate=115200, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, ) def left_speed_control(speed): str0 = "T"+str(speed)+"\n" left_port.write(str0.encode("utf-8")) def right_speed_control(speed): str1 = "T"+str(speed)+"\n" right_port.write(str1.encode("utf-8")) def get_right(): global right_num,right_port strr = "" while True: if right_port.inWaiting() > 0: data = (right_port.read()).decode("utf-8") if data == '\n': #print(strr) #print("ll:"+strr) try: strr = float(strr[:-1]) right_num = strr except: pass strr = "" else: strr = strr…

    永久链接至 “FOC 控制 位置闭环小车”
  • Arch 中 Vlc…

    问题描述: 使用Manjaro,vlc 版本:3.0. 18-12 Vlc 在播放视频时会直接闪退,报错代码: kf.jobwidgets: Cannot register a job with KUiServerV2JobTracker without QGuiApplication::desktopFileName uint DBusMenuExporterDBus::GetLayout(int, int, const QStringList&, DBusMenuLayoutItem&): Condition failed: menu uint DBusMenuExporterDBus::GetLayout(int, int, const QStringList&, DBusMenuLayoutItem&): Condition failed: menu uint DBusMenuExporterDBus::GetLayout(int, int, const QStringList&, DBusMenuLayoutItem&): Condition failed: menu [00007fec9c006820] gl gl: Initialized libplacebo v5.229.2 (API v229) libva error: vaGetDriverNameByIndex() failed with unknown libva error, driver_name = (null) [00007fec9c006820] glconv_vaapi_x11 gl error: vaInitialize: unknown libva error zsh: segmentation fault (core dumped) vlc 可以播放音乐,但是视频不行 解决办法 在这里找到了解决办法,是因为软件不兼容导致的: https://bbs.archlinux.org/viewtopic.php?id=282638 我们只需要把 libva的e版本退回2.16.0-1就可以了(出问题是2.17.0-1 pacman -U https://archive.archlinux.org/repos…

    永久链接至 “Arch 中 Vlc 播放视频直接退出解决方法”
  • OpenCv Python入门到入土

    写在前面: 因为经常需要用到opencv,又经常忘记很多用过的方法,所以写个文章给记下来好了。 你一定见过她 1 安装OpenCv 通常安装opencv只需要这么一行命令就可以做到了。 pip3 install opencv-python 在不那么通常的情况下,我们需要使用Anaconda来安装,这个以后再说。 在非常不通常的情况下,我们需要直接下载源码编译安装,这是及其痛苦的。 2 基本图像操作方法 你应该知道: 什么是数组 在C语言中数组的存储方式 图片就是数组 2.1 从摄像头获取一张图片 import cv2 import numpy cap = cv2.VideoCapture(0) #创建VideoCapture对象 while(True): #创建无限循环,用于播放每一帧图像 ret, frame = cap.read() #读取图像的每一帧 print(frame) cv2.imshow('frame',frame) #显示帧 #等待1毫秒,判断此期间有无按键按下,以及按键的值是否是Esc键 if cv2.waitKey(1) & 0xFF == 27: break #中断循环 cap.release() #释放ideoCapture对象 cv2.destroyAllWindows() 2.1.2 从文件中读取一张图片或是视频中的一帧 imgFile = "../images/sakara.jpg" # 读取文件的路径 img1 = cv2.imread(imgFile, flags=1) # flags=1 读取彩色图像(BGR) img2 = cv2.imread(imgFile, flags=0) # flags=0 读取为灰度图像 2.2 改变图片的大小 # 读取图片 image = cv2.imread('image.jpg') cv2.imshow('Original Image', image) # 让我们使用新的宽度和高度缩小图像 down_width = 300 down_height = 200 down_points = (down_width, down_height) resized_down = cv2.resize(image, down_points, interpolation= cv2…

    永久链接至 “OpenCv Python入门到入土”
  • Latex 快速入门

    写在前面 这是一个急速入门教程,latex最好的学习方法还是边用边学习。 1.安装Latex 环境和IDE 1.1 安装TexStudio: 在这里:https://www.texstudio.org/ 直接安装就可以,但是安装的时间会非常长。 2 开始你的第一篇文章 2.1 Latex是怎么工作的 \documentclass{article} \begin{document} Hello, world! \end{document} 上面这个叫做Latex的源代码,我们需要通过latex编译来变成一篇包含hello world的pdf文章。latex并不是一个所见即所得的编辑工具(像是word)一样,我们在编写的时候是看不到最后的结果的,需要写完源代码之后编译得到结果。 这给了Latex一些无法替代的作用,我们得以在编辑过程中完全不在乎排版的问题,Latex的文章具有极高的规范性,我们写的文章将符合印刷和排版规则,另一方面是Latex的公式编辑功能也是相当地易用和实用,所以在各种理工论文中,刊物通常会要求是Latex编写的文章。也可以做到在任何电脑上面都是同样的显示内容(好像这个是pdf的特点bushi)。 2.2 文章基本结构 一篇文章需要包含以下至少几个内容,我们以上文的那一篇HelloWord为例。 2.2.1 文章类型 文章类型却决于你需要生成的目标出版物是什么。 对于英文,可以用book、article和beamer; 对于中文,可以用ctexbook、ctexart和ctexbeamer,这些类型自带了对中文的支持。 为了输入中文,我们在写论文或者技术报告一般选择:<ctexart>作为文章格式。 当然也可以在\documentclass中设置文章的字体大小,纸张大小,打印是否单页 \documentclass[12pt, a4paper, oneside]{ctexart} 2.2.2 宏包 就像是python的import C语言的#include一样,我们在编写的时候难免会使用一些外部定义好的宏包来调用里面的方法。 \usepackage{ctex}%导入ctex包 \usepackage{caption} \usepackage{amsmath, amsthm, amssymb, graphicx…

    永久链接至 “Latex 快速入门”
  • 一些照片

    1 南京一瞥 2 天津 海滨日出 3 天津 夜 4 矿大 海盐味夏天 5 矿大 学院路的夏天

    永久链接至 “一些照片”
  • 使用IIC协议在Arduino和树莓派…

    写在前面 这篇文章是在树莓派上写的,正好写完代码 1 树莓派传输 1.1 前置工作 首先:打开树莓派的iic 如果你使用的是图形桌面,非常好,直接在左上角首选项>Raspberry Pi Configuration>Interfaces 里面把i2c打开就可以 如果你用的命令行,在终端输入sudo raspi-config 1.2 查看你的iic设备地址 先安装必要的工具:sudo apt-get install i2c-tools 查看所有iic设备的地址:i2cdetect -y 1 从i2c设备读出所有寄存器的值: sudo i2cdump -y 1 <设备地址> 往某一个iic设备中的某一个寄存器中写入某一个值:sudo i2cset -y 1 <设备地址><寄存器地址><写入的值> 从某一个地址的某一个寄存器读出值:sudo i2cget -y 1<设备地址><寄存器地址> 2 python实现 我们使用smbus这个库: 首先实例化 from smbus2 import SMBus i2c = SMBus(1) # 1 代表 /dev/i2c-1 然后打开一个设备 i2c = SMBus(1) 从设备读取一个值:read_byte(i2c_addr, force=None) 向设备写入一个值:write_byte(i2c_addr, value, force=None) 从指定的寄存器中读取一个字节:read_byte_data(i2c_addr, register, force=None) 从给定的寄存器中读取字节数据块:read_i2c_block_data(i2c_addr, register, length(数据块大小), force=None) 将字节数据块写入给定寄存器:write_i2c_block_data(i2c_addr, register(起始寄存器), data, force=None) 我们以arduino和树莓派的通讯为例: Arduino: // 直接在Arduino IDE选择“文件”→“示例”→Wire→slave_receiver,可以打开该文件 #include <Wire.h> void setup() { Wire…

    永久链接至 “使用IIC协议在Arduino和树莓派中传递字符串”
  • 画个麻衣先

    -e7-94-bb-e4-b8-aa-e9-ba-bb-e8-a1-a3-e5-85-88

    永久链接至 “画个麻衣先”

May 2023

  • Liunx…

    这个是一个关于Edgebroad的GPIO的操作来实现PWM的类。 这个板子主控其实是AMD的FPGA,所以操作方法其实和其他有GPIO的linux板子方法差不多吧(比如树莓派 操作更像是一种写入寄存器的操作,emmmm,写半天还是成了写单片机编程。 但是是在Liunx下面,所以其实都是对文件的操作和读写,所以读写文件的速度其实对代码执行的速度是有很大影响的,而python的sleep函数在这个地方因为使用cpu的主频来计数,所以时间延时并不是很准确,其他办法正在研究(比如用Ctos 暂时没有别的解释,等到暑假之后再写。 import os import time def wr(x): f = open('/sys/class/gpio/gpio423/value', 'w') f.write(str(x)) f.close() class edge_pwm(): def __init__(self,pin) -> None: pin = pin + 411 self.pin =pin # print(1) os.system("echo "+str(pin)+" > /sys/class/gpio/export") # print(pin) os.system("echo out > /sys/class/gpio/gpio"+str(pin)+"/direction") # print(1) def start(self,DutyCycle,Freq): self.DutyCycle = DutyCycle self.Freq = Freq self.flag = True self.pwm() def pwm(self): self.io_control(0) while True: cycle = 1/self.Freq high_cycle = cycle * (self.DutyCycle/100) low_cycle = cycle - high_cycle #print(low_cycle) self.io_control(1) time.sleep(high_cycle) #print(high_cycle) self.io_control(0) #print(low_cycle) time.sleep(low_cycle) def…

    永久链接至 “Liunx 下直接操作GPIO来操作PWM”
  • C语言期末考试自查手册

    前言 为了期末考试写的,纯自查。不会像百科全书一样事无巨细地罗列清楚,基本用法还是要写一些的。 Part 1 输入输出流C 标准库 – <stdio.h> 1.输入输出流 1.1 printf函数 传参的内容: printf("<格式化字符串>", <参量表>); 其中格式化字符串和参量表是什么捏? 格式化字符串传递打印的内容与用“%”来标识后面参量表中变量的数据类型 举个例子: int d = 114514;printf(“qwq%d”,d); format 标签属性是 %[flags][width][.precision][length]specifier 其中占位符已在下一章介绍 flags(标识)描述–在给定的字段宽度内左对齐,默认是右对齐(参见 width 子说明符)。+强制在结果之前显示加号或减号(+ 或 -),即正数前面会显示 + 号。默认情况下,只有负数前面会显示一个 – 号。空格如果没有写入任何符号,则在该值前面插入一个空格。#与 o、x 或 X 说明符一起使用时,非零值前面会分别显示 0、0x 或 0X。与 e、E 和 f 一起使用时,会强制输出包含一个小数点,即使后边没有数字时也会显示小数点。默认情况下,如果后边没有数字时候,不会显示显示小数点。与 g 或 G 一起使用时,结果与使用 e 或 E 时相同,但是尾部的零不会被移除。0在指定填充 padding 的数字左边放置零(0),而不是空格(参见 width 子说明符)。 1.2 占位符 printf()可以在输出文本中指定占位符。所谓“占位符”,就是这个位置可以用其他值代入。 %a:十六进制浮点数,字母输出为小写。 %A:十六进制浮点数,字母输出为大写。 %c:字符。 %d:十进制整数。 %e:使用科学计数法的浮点数,指数部分的e为小写。 %E:使用科学计数法的浮点数,指数部分的E为大写。 %i:整数,基本等同于%d。 %f:小数(包含float类型和double类型)。 %g:6个有效数字的浮点数。整数部分一旦超过6位,就会自动转为科学计数法,指数部分的e为小写。 %G:等同于%g,唯一的区别是指数部分的E为大写。 %hd:十进制 short int 类型。 %ho:八进制…

    永久链接至 “C语言期末考试自查手册”
  • 一些照片 初夏(照片很大,加载可能比较慢

    洪崖洞和千厮门大桥 一架重庆航空的飞机飞过千厮门大桥 一架海南航空的飞机飞过千厮门大桥 大坪电视塔,但是天气不太好 六节编组2号线驶出曾家岩站 另一辆六节编组二号线驶入李子坝站 矿大沙河校区晚上出现的一束罕见的光 还是这束光 一些照片 初夏

    永久链接至 “一些照片 初夏(照片很大,加载可能比较慢”

April 2023

  • 人是一根能思想的苇草

    作者:帕斯卡尔 高中课本上面的文章,当时读到被里面这种态度而感动,如今还是常常想起这篇文章,实在是很喜欢 Translation: Man is a Thinking Reed (Blaise Pascal) (assembled by: alexcwlin; reviewed by: Adam Lam) 思想形成人的伟大。 Thought constitutes the greatness of man. =============================================== 人 只不过是一根苇草,是自然界最脆弱的东西;但他是一根能思想的苇草。 Man is but a reed, the most feeble thing in nature, but he is a thinking reed. 用不着整个宇宙都拿起武器来才能毁灭; The entire universe need not arm itself to crush him. 一口气、一滴水就足以致他死命了。 A vapour, a drop of water suffices to kill him. 然而,纵使宇 宙毁灭了他,人却仍然要比致他于死命的东西高贵得多;因为他知道自己要死亡,以及宇宙对他所具有的优势,而宇宙对此却是一无所知。 But, if the universe were to crush him, man would still be more noble than that which killed him, because he knows that he dies and the advantage which the universe has over him; the universe knows nothing of this. 因而,我们全部的尊严就在于思想。 All our dignity consists then in thought. 正是由于它而不是由于我们所无法填充的空间和时间, By it we must elevate ourselves, and not by space and time which we cannot fill. 我们才必须提高自己。因此,我们要努力好好地思想;这就是道德的原则。 Let us…

    永久链接至 “人是一根能思想的苇草”
  • 深度学习 原理性实践

    前言 以前一直是调用,从来都是知其然而不知其所以然,不太好,正好最近一直在使用yolov5,又很想搓一个自然语言聊天机器人,就决定学一学: Part1 理论基础 1.1 正向传播 输入为矩阵,对矩阵进行仿射变换后加上激活函数,反复几层之后输入,经过Softmax输出结果。用交叉熵损失判断其模型好坏,并进行下一步操作 1.2 反向传播 首先明确反向传播即损失值对网络中仿射变换参数的改变 对于softmax层,反向传播softmax层输出预测与实际的差值 对于仿射变换层,引入正则化惩罚项:reg与学习率:epsilon来约束反向传播 这个时候对于一般仿射变换: H = W*X +B 与其反向传播的输入值dW,dB 有 dW = dW + reg * W 更新W与B有: W = W – epsilon * dW B = B – espsilon * dB 这样就能实现反向传播在仿射变换中的流动了

    永久链接至 “深度学习 原理性实践”
  • DIY激光雷达

    前言:用arduino 和舵机和激光测距搓的,具体实现明天再写,好困啊\ Part1 什么是激光雷达 雷达很好理解(这里不讨论相控阵那种怪物),想象成旋转的测距仪。用电磁波发射与返回的时间差测得距离,而波长变化的测量甚至可以使用开普勒效应来得知被测物体的速度。 而我们因为没有能够在实验室这么小范围内还能正常定向发射的电磁波原(有也买不起,买得起也会被抓去谈话)所以退而求其次使用了激光测距的方法,原理与电磁波一模一样,都是电磁波嘛(笑。但是测量速度的功能就给砍了。 Part2 搓一个 那么对于角度的感知本来想用步进电机的,但是考虑到丢步的问题,还得用霍尔或者别的啥方法来校准,实在不太优雅,所以选择了舵机作为旋转的底座。 理论存在,实践可行,返回的数据包括角度与距离,那么只需要可视化这两个数据就可以啦,显示我们使用了一块oled的小屏幕,基本所有的东西都是自己以前做过的,所以非常好写。 #include <Wire.h> #include <Servo.h> #include <SparkFun_VL6180X.h> #include <U8g2lib.h> #include <stdlib.h> #ifdef U8X8_HAVE_HW_I2C #include <Wire.h> #endif /*const float GAIN_1 = 1.01; // Actual ALS Gain of 1.01 const float GAIN_1_25 = 1.28; // Actual ALS Gain of 1.28 const float GAIN_1_67 = 1.72; // Actual ALS Gain of 1.72 const float GAIN_2_5 = 2.6; // Actual ALS Gain of 2.60 const float GAIN_5 = 5.21; // Actual ALS Gain of 5.21 const float GAIN_10 = 10.32; // Actual ALS Gain of 10.32 const float GAIN_20 = 20; // Actual ALS Gain of 20 const float GAIN_40…

    永久链接至 “DIY激光雷达”
  • 基于opencv的自动标注yolov5…

    前言: 具体使用请查看我的github仓库: https://github.com/qwqpap/auto_maker 再需要yolo识别物体之前,通常需要漫长的标注过程,而本程序主打一个自动化 把目标图片放进以目标名字命名的文件夹 把目标名字文件夹放在images文件夹下面 确保每个类别的图片数量是一致的 把背景图片放在back文件夹 Part 1 一点线性代数 我们可以发现在对图片进行仿射变换时,只需要对原图片的一组基向量进行变化即可 那么在进行透视变换的时候就需要对三个想来进行同时的变换即可 具体的数学计算看代码吧,太晚了我想睡一会了 这个:言って。好好听 下面有两个版本,分别是仿射变换和透视变换,效果都还行,目前GitHub上面是透视变换的版本qwq。 import pyautogui as gui import cv2 import numpy import os import time import glob import cv2 import numpy as np import random # import numba from numba import jit import shutil import re def pre_make(): src_folder = "images/" dst_folder = "target/" # 获取源文件夹中所有子文件夹的路径 subfolders = [f.path for f in os.scandir(src_folder) if f.is_dir()] shutil.rmtree(dst_folder) os.makedirs(dst_folder) # 遍历每个子文件夹,并将其中的第一张图片复制到目标文件夹中 for folder in subfolders: copied = False for file in os.listdir(folder): # 只处理jpg和png文件 if file.endswith(".jpg") or file.endswith(".png"): # 构建目标文件路径,以子文件夹名称作为文件名前缀 file_prefix = os.path.basename(folder) dst_file = os.path.join(dst_folder…

    永久链接至 “基于opencv的自动标注yolov5数据集”
  • ROS自查手册

    0.0 Readme 本文纯属我自己当笔记用,估计不会很有用吧(笑 1 ROS前置工作 通常各种教程这个时候就会要求用虚拟机或者双系统了,但是我一直觉得这是一个极其令人不解的行为,因为反正是学习,跑的都是仿真,装个双系统也没什么用,还要花掉很大一块硬盘空间,所以这里使用Docker在windows11下面部署ros的虚拟环境,那么图形化就使用vscode,ssh和xming来实现吧。 具体操作在之前的文章如何使用docker在windows上愉悦运行ROS/ROS2 – 天鹅绒房间 (qwqpap.com) 2 ROS文件结构 ROS的文件结构,在工作目录下/src中放置自己写的功能包(或者别的包),/build里面是编译项目所需文件,功能包中的/scripts则存放各种Python脚本(解释型语言存疑 WorkSpace --- 自定义的工作空间 |--- build:编译空间,用于存放CMake和catkin的缓存信息、配置信息和其他中间文件。 |--- devel:开发空间,用于存放编译后生成的目标文件,包括头文件、动态&静态链接库、可执行文件等。 |--- src: 源码 |-- package:功能包(ROS基本单元)包含多个节点、库与配置文件,包名所有字母小写,只能由字母、数字与下划线组成 |-- CMakeLists.txt 配置编译规则,比如源文件、依赖项、目标文件 |-- package.xml 包信息,比如:包名、版本、作者、依赖项...(以前版本是 manifest.xml) |-- scripts 存储python文件 |-- src 存储C++源文件 |-- include 头文件 |-- msg 消息通信格式文件 |-- srv 服务通信格式文件 |-- action 动作格式文件 |-- launch 可一次性运行多个节点 |-- config 配置信息 |-- CMakeLists.txt: 编译的基本配置 3 ROS通信机制 在ROS中通信方式有多种

    永久链接至 “ROS自查手册”

March 2023

  • 树莓派pico的无源蜂鸣器音乐库

    实验室有人买了一大堆蜂鸣器,手边正好又有pico,就写了个库 class Play_music: ''' 使用蜂鸣器来在pico上面播放最多八个声道的音乐 using buzzer to play music on raspberry pico channel_1~8的gpio引脚将设置为0,2,4,6,8,10,12,14 the channel_1~8 is for gpio 0,2,4,6,8,10,12,14 请确保列表长度相同(我懒了) please make sure that the len of list is same ''' def __init__(self, play_speed=120, channel_1=0, channel_2=0, channel_3=0, channel_4=0, channel_5=0, channel_6=0, channel_7=0, channel_8=0): from time import sleep from machine import Pin, PWM self.one_time = 60/play_speed self.c1 =channel_1 self.c2 =channel_2 self.c3 =channel_3 self.c4 =channel_4 self.c5 =channel_5 self.c6 =channel_6 self.c7 =channel_7 self.c8 =channel_8 #l means low,h means high ,s means # self.ldo = 262 self.ldos = 277 self.lre = 294 self.lres = 311 self.lmi = 330 self.lmis = 340 self.lfa = 349 self.lfas = 370 self.lso = 392 self.lsos = 415 self.lla = 440 self.llas = 466 self.lsi = 494 self.lsis = 524 self.do = 523 self.dos = 554 self.re = 578 self.res = 622 self.mi = 659 self.mis = 682 self.fa…

    永久链接至 “树莓派pico的无源蜂鸣器音乐库”
  • (还在写)电子DIY入门指北

    前言 编者自己の话 什么是电子DIY?其实我也没法有个很好的定义,但是可以通过讲故事的方法来讲讲。 有没有看过你买的电脑的接口?一台新的,漂亮的,现代的电脑的接口。比如我的surface pro8除了充电和耳机就只有两个雷电4接口了。或者说叫做usb4接口。USB-Universal Serial Bus通用串行总线协议,从u盘到打印机,相当通用,相当好用,但是你能不能使用这个接口来物理意义地控制一些设备呢? 答案是否定的,在接口的进化中早已失去了那种直接与物理设备进行控制的功能,这是合理且美好的,但是不可避免地,会少很多好玩的事情。 在上古时代(也就是十来年前我还在上幼儿园之前)那个时候的电脑是有很多很丑陋的接口的 一张神秘的AM2主板的io接口 那个小小的梯形可不是vga接口哦,这些都是COM口(串口),怎么说捏,这个东西的协议可多了TTL、RS-232、RS-485一堆,一般用来连打印机,各种奇奇怪怪的工控设备之类的玩意,现在已经基本见不到了。因为“通用串行总线协议”统一了这一大堆东西。 但是总是存在一些爱好者觉得生活中的东西应该被电脑控制:比如用手机开个灯,亮个电视之类的。诚然诸如米家之类的设备可以做到这些是吧,但是如果我的需求是“有人进入房间后把厕所门打开然后播放东雪莲的典中典,接着给千里之外的家里服务器屏幕显示现在昌平区的空气质量,把空气质量指数乘上114514对1919810取模后的数字的第三位有效数字作为歌单的第一首歌放给实验室的人听”这样的需求很明显米家就不太能办得到。 当然这个例子可能比较极端了 (你好像有点极端了.jpg) ,但是如果你想要自己做一些有趣的,实用性不一定很强的小玩意,那么恭喜,请接着读下去吧。 在做这些东西的时候,我常常在想是什么在驱动着我做出一个又一个或丑陋或奇怪的DIY小制作。不知道朱军有没有做过乐高,乐高积木能在我小的时候给予我一个可能的坐在那里安静地玩耍半天地机会(挺难得的),无论是拼的过程还是最后的成品,都有一种超级强的成就感。这种感受在后面漫长的寒窗苦读中苦读你会来北矿?短暂地在组装我的电脑地时候出现过,后面倒是阴差阳错地买了一个树莓派,从此踏上了不归路。但是说真的,从有一个需求,有一个想法,然后分析要怎么实现,哪些会,哪些不会,怎么学,然后一步一步实现,遇到错误,解决错误,最后完成地那一刻地成就感是无可比拟地…

    永久链接至 “(还在写)电子DIY入门指北”
  • 基于esp32和VFD屏的天气小电视重…

    去年做了个基于oled屏幕的小电视,但是受限于技术力和屏幕尺寸限制,做出来的东西只能说是很不完善。 正好看到了vfd屏幕,很酷,决定做一个。 1 用u8g2库点亮vfd屏幕 1.1 u8g2库的安装 淘宝卖家给了个魔改过的u8g2库,我很不解,但是很好用(bushi vfd屏u8g2库 – 天鹅绒房间 (qwqpap.com) 关于u8g2库的安装这里简略说明 解压放在你arduino ide 的\Arduino\libraries\下就可以。 1.2 u8g2库的使用方法 首先我们需要屏幕驱动的名字,然后创建对应的对象就可以啦。 对于本例而言,我们使用一块分辨率 256*50, 驱动为GP1287AI的vfd屏幕,故你的代码应该开头包含这样一段 #include <U8g2lib.h> U8G2_GP1287AI_256X50_1_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 15, /* reset=*/ 2); 那么传递的参数就是自定义的接线了 比如此例中SCK线接的18 SDA接的23,而CS和RESET如上,是自定义的15和2,还得记得给灯丝使能一个高电平信号才能亮熬。 具体的线如图,接反了可能会干烂不少东西( 然后是初始化和输出一行文字 我们需要了解的是u8g2的坐标系是以左上角为0点,→为x,↓为y,字体会在虚拟光标坐标的右上角开始打印。 这是一个知识水平不太高的实例。 #include <U8g2lib.h> U8G2_GP1287AI_256X50_1_3W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 15, /* reset=*/ 2); void setup(void) { u8g2.begin();//初始化u8g2库 u8g2.setContrast(255);//亮度设置 0-255 u8g2.enableUTF8Print();///使用utf8 } void loop(void) { u8g2.setFont(u8g2_font_wqy12_t_gb2312); //设置中文字体 //u8g2.firstPage(); do { u8g2.setCursor(0, 20);//设置光标位置 u8g2.print("苟利国家生死以");//打印文本 u8g2…

    永久链接至 “基于esp32和VFD屏的天气小电视重制版”

February 2023

  • 一些照片:重庆,但是春天

    春よ、来い 大坪电视塔 远处嘉华大桥和北滨路 鹅岭 北滨路 远处隐隐约约看得到观音桥的高楼 朝天门长江大桥 南坪 右边的鹅公岩大桥几乎看不到了 南纪门轨道桥和解放碑那边的高楼 垃圾

    永久链接至 “一些照片:重庆,但是春天”
  • 如何使用docker在windows上…

    1 安装docker,vscode 和VcXsrv 请自己去网上找吧( Docker: Accelerated, Containerized Application Development Visual Studio Code – Code Editing. Redefined https://github.com/ArcticaProject/vcxsrv 2 一些docker的概念和命令 2.1 Image和Containers Image是一个打包好的包含系统,环境。用户和别的一堆东西的镜像。非常好的是这个玩意在构建好之后就是只读的,对,猜你在找: 而镜像在运行之后就能在其上方生成一个容器,镜像和容器就如同面向对象的类和实例。对于此例而言,我们要一个ubuntu18系统装好ros的镜像来部署。 2.2 下载镜像,生成容器 首先我们可以在Explore Docker’s Container Image Repository | Docker Hub上面找到各种各样的镜像文件,然后就能部署了。 此例中我们使用这个大佬的镜像。 docker run -dit --name=ros_melodic -v d:/home/d -e DISPLAY=host.docker.internal:0.0 fishros2/ros:melodic-desktop-full 使用run 命令来下载镜像并且直接运行容器 当然也可以pull命令下下来再使用run docker pull fishros2/ros:melodic-desktop-full docker run ros_melodic 3 愉快使用 先愉快启动容器 docker run ros_melodic /bin/bash 然后你就能用roscore啦 进入已经启动的容器我们使用 ps -a PS C:\Users\m1573> docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES be7c44aec2b9 fishros2/ros:melodic-desktop-full "/bin/bash" 5 hours ago Exited (0) 5 hours ago pensive_sinoussi…

    永久链接至 “如何使用docker在windows上愉悦运行ROS/ROS2”

January 2023

  • Serface pro 8…

    众所周知,微软的品控常年一坨屎,那么这次又是什么傻卵问题呢? 是这样,由于铸币的intel显卡驱动会自己打开这个“面板自刷新”,这个玩意莫名其妙地和我这屏幕有点水土不服。 在官网下载intel核显驱动后 找到驱动面板 系统 功率 把使用电池和外接电源下的面板自刷新都给关了,这样就能解决这个问题 sucks

    永久链接至 “Serface pro 8 屏幕闪烁解决办法”
  • ESP32使用TFT屏幕全踩坑指南

    写在前面 前几天买了个tft屏幕,一路使用心路很曲折,故把踩坑过程写出来,方便日后查看 是一个st7789,240*240分辨率的屏幕 1 物理连接 网上全是各种各样不同的教程,给我整麻了,后面摸索出来了。 GPIO23—-SDA GPIO18—-SCK GPIO4—-RES GPIO2—-DC VCC—-5V(3V3都可以) GND—-GND 似乎是线最好要等长,短一点更好,好像干扰还不小。 2 TFT_eSPI库的初始化 很像u8g2库的使用。 2.1 安装库, 如果你用的是arduino ide 可以直接在库管理里面搜这个库就有了,如果不是的话可以去这个链接下。 2.2 设置库 下一步就是找到项目文件夹下的libraries文件夹(也就是库文件存放的地方),打开TFT_eSPI文件夹,打开User_Setup_Select.h文件,然后注释掉user_setup,取消setup24的注释,大概就改成了这样子: // This header file contains a list of user setup files and defines which one the // compiler uses when the IDE performs a Verify/Compile or Upload. // // Users can create configurations for different boards and TFT displays. // This makes selecting between hardware setups easy by "uncommenting" one line. // The advantage of this hardware configuration method is that the examples provided // with the library should work with immediately without any other changes being // needed. It also improves the portability of users sketches to other…

    永久链接至 “ESP32使用TFT屏幕全踩坑指南”
  • Pytorch学习笔记(纯方便自己看

    1 安装dataspell与anaconda 1安装dataspell与anaconda 这一步可以自己搞定。 但是你得把anaconda的环境变量添加进你的用户的path里面。 前面那里改成你的anaconda安装的位置就行。 Q:anaconda是什么鬼 A:是一个打包了很多深度学习库的环境管理软件(确信 1.2基本的anaconda操作 创建一个叫做py37,的python3.7版本的环境 conda create --name py37 python=3.7 启动这个环境 activate py37 关闭这个环境 deactivate py37 显示已经安装好的环境 conda info --envs 复制环境(不用加上尖括号哈) conda create --name <new_env_name> --clone <copied_env_name> 删除环境 conda remove --name <env_name> --all 查看已经安装的包 conda list 查找想要安装的包 conda search <text> 在当前环境下安装包 conda install <package_name> 2 张量 2.1 什么是张量 这里的张量和其他意义的张量没啥关系,只是一个多维的数据 张量是 PyTorch 中用来表示数据的构建块 2.2 张量的一些操作 这个代码编辑的插件一坨屎,我就直接截图了 同样的,把列表传递给张量也是可行的 试图用zeros函数函数构造多维数组(2维,一共三组数) 此时我们访问的数据不再是一个数字,而是一个二维的数组 索引张量,类似列表的操作方法(你说是那就是 2.3 张量的元素类型 torch.float32 或 torch.float:32 位浮点数。 torch.float64 或 torch.double:64 位双精度浮点数。 torch.float16 或 torch.half:16 位半精度浮点数。 torch.int8:8 位有符号整数。 torch.uint8:8 位无符号整数。 torch.int16 或 torch.short:16 位有符号整数。 torch.int32 或 torch.int:32 位有符号整数。 torch.int64 或…

    永久链接至 “Pytorch学习笔记(纯方便自己看”
  • 如何搭建自己的博客…

    你需要: 一台服务器 一个域名 一点小小的电脑知识 一些时间 写东西的热忱 Step1:租一台服务器 网站是需要部署在服务器上的,所以选择一个好的服务器提供商是很重要的。 这里我们务必选择不在大陆境内的服务器,可以避免要去备案/上课被打电话/时刻被王晶视奸的狗屎问题。香港和新加坡的服务器就不错,我选了阿里云的,比以前用的在新加坡的vps便宜多了。 (如果是其他vps请自行安装宝塔面板跳过以下步骤,基本就是ssh连接,安装,访问宝塔面板) 这里我们选他装好宝塔面板的,可以不用自己去装宝塔面板了。 直接买最便宜的(反正博客从来不会有人看qwq 之后我们进入控制台 之后全程按照阿里云这一堆操作来就行(基本就是复制命令,粘贴 请记住你的宝塔面板的登陆账号和密码,之后有用。 然后根据第2步“复制面板安全入口查询”的地址登陆宝塔面板,输入密码和账号,直接一键安装环境,去喝一杯茶一会再回来就行。 Step2:搞一个域名 我们访问的网站通常是诸如“www.cumtb.edu.cn”这样的,这个就是网站的域名,我们需要找一个合适的域名提供的地方买一个域名指向我们网站的ip地址。 我们在‘www.namesilo.com/’这个网站购买域名 注册完之后在这里输入你想买的域名,再选一个合理的,好看的,能付得起的下单(能支付宝来着) 下一步:解析域名 然后进入我的账户这个界面,选这个 进去之后看到自己的域名了,选后面那个地球(确信 然后用那个delete把原来的全删了,再edit 这样填写一次(绿色的就是网站的ip地址的地方,请填你自己的) 然后重复一次,这一次我们在hostname里面写上www 最后去喝一杯最少15分钟的茶 在终端里面试着ping自己的域名,看能不能解析到自己的ip地址上面,能的话就成了。 step3:部署!wordpress! 我们登录宝塔面板,这会应该已经装好了。 在软件商城–一键部署找到wordpress 然后在要求输入网址的界面输入 www.你的域名 你的域名 之后会有一个这样的界面 把这一堆东西记下来,马上就要用到,然后在宝塔面板–安全里面设置防火墙 把80端口放开 然后再去阿里云安全那里再设置一次防火墙,把80端口打开 然后再去喝一杯茶。 最好是自己煮的普洱,因为要一点时间。 回来登录上面记下来那堆东西最下面的网址…

    永久链接至 “如何搭建自己的博客(基于wordpress)”
  • 女神异闻录5通关感想

    写在前面:存在剧透,先看一看堇吧。 第一个舍不得通关的游戏qwq. =======大小=======☐ 百兆小游戏☐ 1-5 G☐ 5-10 G☐ 10-20 G✔ 20-50 G☐ 50-100 G☐ 100-200 G☐ GMOD =======图像=======☐ 像素党秒天秒地!☐ 无法和现实区分✔ 赏心悦目☐ 很美丽☐ 一般☐ 不怎么样☐ 别盯着看太久☐ 画图.exe =======游戏体验=======✔ 完美!!!☐ 不错!☐ 普普通通☐ 不怎么样☐ 盯着墙看都比玩它强☐ 锻炼你的精神抗打击能力 =======声音效果=======✔ 耳朵怀孕☐ 感动人心☐ 还不错☐ 一般☐ 不咋样☐ 耳朵流产☐ 音乐?什么音乐? =======受众群体=======☐ 儿童✔ 青少年✔ 成人 =======难度=======☐ 点点点突突突炸炸炸☐ 轻松愉快✔ 得动动脑子☐ 上手快精通难☐ 烧脑 =======游戏寿命=======☐ 玩完就退款☐ 5-10小时☐ 10-30小时☐ 30-50小时✔ 50-100小时✔ 刷到恶心为止✔ 我觉得我能比它先去世✔ ∞小时(10周目)=======操作=======✔有手就行☐ 简单☐ 中等☐ 困难☐ 反人类☐ 空洞骑士/蔚蓝 =======肝=======✔ 护肝☐ 如果你想玩出点花样☐ 肝与不肝并不影响剧情☐ 每关必肝☐ 肝痛☐ 必须24小时全天候地肝 =======肾=======✔ 护肾✔ 需要短暂休息了☐ 需要休息一段时间了☐ 每关必冲☐ 肾痛☐ 一时手冲一时爽,一直手冲一直爽 =======故事情节=======☐ 故事?什么故事?☐ 文字或语音剧情☐ 平庸☐ 还行☐ 精彩✔ 可以作为你的第二人生 =======平均一局游戏时间=======☐ 办公室必备☐ 短小精悍☐ 中等☐ 较长✔ 100h左右啦 =======联机=======✔ 孤独患者☐ 你唯一的沙雕网友☐ 2-5人☐ 5-10人☐ 10-30人☐ 30-64人☐ 行星边际2 =======语种=======☐ 你信不信我会八国语言?☐ 基础英文☐ 可以打汉化MOD或补丁✔ 自带汉化! =======价格=======☐ 免费游玩!☐ 业界良心!✔ 值这个价☐ 如果你有点闲钱的话可以一试☐ 不推荐原价入☐ 信仰无价 =======游戏整体评分…

    永久链接至 “女神异闻录5通关感想”
2022的档案