尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

基于树莓派Pico与GPS模块的嵌入式轨迹记录系统设计与实现

基于树莓派Pico与GPS模块的嵌入式轨迹记录系统设计与实现
📅 发布时间:2026/7/28 3:01:58

1. 从零开始:为什么选择Pico来玩GPS轨迹记录?

最近手头正好有个项目需要记录一些户外设备的移动轨迹,要求不高,但得足够小巧、省电,还得能自己折腾。市面上现成的GPS记录仪要么功能臃肿,要么数据封闭,想自己加点逻辑或者导出原始数据都麻烦。于是,我把目光投向了手边那几块吃灰的树莓派Pico。你可能觉得,Pico就是个单片机,搞GPS记录是不是有点“杀鸡用牛刀”?恰恰相反,对于这种需要长时间运行、实时处理串口数据、还得存点东西的应用,Pico的RP2040双核处理器和264KB的SRAM,配上外部存储,简直是量身定做。

这个项目的核心,就是用一块树莓派Pico,连接一个常见的NEO-6M或NEO-7M这类GPS模块,把接收到的经纬度、时间、速度等信息,以一定的间隔记录到SD卡里,最终生成一个可以在电脑地图软件(比如Google Earth)上打开的轨迹文件。听起来简单,但里面有几个关键点值得琢磨:GPS模块的选型和数据解析、Pico如何高效且不掉帧地读取串口数据、数据以什么格式存储最通用、以及如何让这个小东西在电池供电下撑得更久。这不仅仅是“点亮模块”,更是一次对嵌入式系统数据采集、电源管理和文件系统操作的综合实践。无论你是想做个自行车轨迹记录器,还是给宠物做个“防丢”跟踪器,或者单纯想学习单片机与传感器的实战结合,这个项目都能给你一套清晰的思路和可复现的代码。

2. 硬件选型与连接:不只是接上线那么简单

动手之前,得先把家伙事备齐。硬件清单很简单:一块树莓派Pico(带焊好排针的版本更方便)、一个GPS模块(推荐NEO-6M,经典且资料多)、一张Micro SD卡(建议Class 10以上,容量不需要太大,8GB或16GB足够)、一个SD卡模块(SPI接口的)、以及必要的杜邦线和一块电池(如3.7V锂电池配合充放电管理模块)。

2.1 GPS模块的“门道”:NMEA协议与PPS信号

市面上几十块的GPS模块,核心大多是u-blox的NEO-6M/7M/8M系列。它们通过串口(UART)输出遵循NMEA 0183标准的数据帧。你不需要理解全部,但必须认识两个“明星句子”:$GPRMC和$GPGGA。$GPRMC包含了最核心的推荐最小定位信息:UTC时间、定位状态(A=有效,V=无效)、纬度、经度、地面速度、地面航向和日期。$GPGGA则提供了定位质量指示(GPS定位模式、使用卫星数)和海拔高度等信息。我们的轨迹记录,主要就是解析$GPRMC里的时间、经纬度和状态。

注意:很多模块出厂默认波特率是9600,但有些可能是38400或115200。务必先查阅你的模块手册,或者用USB转TTL工具连接电脑,用串口助手软件(如Putty、CoolTerm)查看原始输出确认。

还有一个容易被忽略但很有用的引脚:PPS(Pulse Per Second)。这是一个每秒输出一次高精度脉冲的信号,常用于时间同步。在我们的项目里,如果不需要极高精度的时间戳,可以暂时不用连接它,只接VCC、GND、TX、RX四根线即可。

2.2 Pico的引脚分配策略:避免冲突与预留空间

树莓派Pico有26个多功能GPIO,我们需要合理分配,为GPS、SD卡以及可能的未来扩展(比如一个状态指示灯)留出位置,同时避免功能冲突(例如,某些引脚有特殊ADC或I2C功能)。

一个稳妥的连接方案如下:

  • GPS模块:
    • VCC -> Pico的3V3(OUT)(引脚36)。绝对不要接5V,会烧坏模块!
    • GND -> Pico的任意GND(如引脚3, 8, 13, 18, 23, 28, 33, 38)。
    • TX -> Pico的GP1(UART0 RX, 引脚2)。GPS模块的TX(发送端)要接到Pico的RX(接收端)。
    • RX -> Pico的GP0(UART0 TX, 引脚1)。如果需要向模块发送配置指令(如更改波特率、输出频率),才需要连接此线,仅记录数据时可悬空。
  • SD卡模块 (SPI接口):
    • VCC -> Pico的VBUS(引脚40) 或VSYS(引脚39)。SD卡模块通常需要5V供电才能稳定工作,尤其是进行写操作时。Pico的VBUS直接来自USB的5V,是最佳选择。
    • GND -> Pico的GND。
    • CS (片选) -> Pico的GP13(引脚17)。
    • MOSI (主出从入) -> Pico的GP11(引脚15)。
    • MISO (主入从出) -> Pico的GP12(引脚16)。
    • SCK (时钟) -> Pico的GP10(引脚14)。
  • 其他:
    • 可以接一个LED到GP25(Pico板载LED)或另一个GPIO,通过闪烁频率来指示不同的状态(如搜索卫星、定位成功、正在写入)。

这样分配,UART0和SPI0都使用了默认的引脚组,代码编写最方便。所有数字IO都避开了ADC专用引脚,为后续可能添加模拟传感器留出了余地。

3. 软件架构设计:高效、可靠的数据流水线

硬件连好了,接下来是软件的头脑风暴。我们不能简单地在一个while循环里又读串口又写文件,那样很容易因为文件写入的延迟导致串口数据丢失(串口缓冲区溢出)。Pico的双核在这里可以派上用场,但为了逻辑清晰和跨平台兼容性,我们先采用“中断+缓冲区+主循环处理”的单核经典架构。这个架构的核心是构建一个高效、不阻塞的数据流水线。

3.1 数据流与核心模块划分

整个程序可以划分为三个逻辑层:

  1. 数据采集层:负责通过UART中断服务程序(ISR)实时接收GPS模块发送的每一个字符,并将其填充到一个环形缓冲区(Ring Buffer)中。中断程序必须非常短小,只做最简单的存储动作。
  2. 数据处理层:在主循环中,定期检查环形缓冲区。一旦发现一条完整的NMEA语句(以$开头,以\r\n结尾),就将其提取出来,进行校验和验证,然后解析出我们需要的时间、经纬度、定位状态等字段。
  3. 数据存储层:将解析后的有效数据,按照预定的格式(如每秒一条,或每移动5米一条)写入到SD卡上的文件中。文件操作(打开、写入、关闭)是相对耗时的,需要小心处理,避免影响数据采集的实时性。

3.2 关键数据结构:环形缓冲区与NMEA解析器

环形缓冲区是解决生产者(中断)和消费者(主循环)速度不匹配问题的利器。我们可以定义一个固定大小的字符数组(比如1024字节)和两个指针(写索引和读索引)。中断到来时,将字符存入写索引位置并后移写索引;主循环中,从读索引位置读取字符并后移读索引。当索引到达数组末尾时,绕回开头。这样只要缓冲区不满,就不会丢失数据。

NMEA解析看似复杂,实则规律性强。以$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A为例:

  1. 找到起始符$和结束符\r\n。
  2. 计算*号前的所有字符的异或校验和,与*后的两位十六进制数比较,确保数据在传输过程中没有出错。
  3. 用逗号分割字符串,得到一个字段数组。
  4. 根据NMEA标准,$GPRMC的字段含义是固定的:
    • 字段1:UTC时间,123519表示12:35:19。
    • 字段2:状态,A表示有效定位。
    • 字段3:纬度,4807.038表示48度07.038分。需要转换为十进制度数:48 + 7.038/60 = 48.1173度。
    • 字段4:纬度半球,N为北纬。
    • 字段5:经度,01131.000表示11度31.000分。转换:11 + 31.000/60 = 11.5167度。
    • 字段6:经度半球,E为东经。
    • (其他字段如速度、航向、日期本次项目可暂不记录)

解析成功后,我们就得到了一个包含时间、纬度、经度和状态的结构体。只有状态为A时,这条数据才是可用的定位数据。

4. 实战代码剖析:从初始化到文件写入

理论说再多,不如看代码。这里我用MicroPython来演示,因为它开发快速,易于理解。如果你追求极致的性能和功耗,可以用C/C++和Pico SDK重写,但整体逻辑是相通的。

4.1 硬件初始化与环形缓冲区实现

首先,导入必要的库并初始化硬件。

import machine import uos from machine import Pin, SPI, UART import utime # 1. 初始化UART用于GPS (波特率9600, 使用GP0, GP1) uart = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1)) uart.init(bits=8, parity=None, stop=1, timeout=100) # 设置超时,防止read阻塞 # 2. 初始化SPI用于SD卡 spi = SPI(0, baudrate=1000000, polarity=0, phase=0, bits=8, firstbit=SPI.MSB, sck=Pin(10), mosi=Pin(11), miso=Pin(12)) cs = Pin(13, Pin.OUT) cs.value(1) # 初始时取消片选 # 3. 挂载SD卡文件系统 try: uos.mount(uos.VfsFat(spi, cs), '/sd') print('SD card mounted at /sd') except OSError as e: print('Failed to mount SD card:', e) # 这里可以加入错误处理,比如闪烁LED报警 # 4. 环形缓冲区实现 class RingBuffer: def __init__(self, size): self.size = size self.buffer = bytearray(size) self.head = 0 # 写指针 self.tail = 0 # 读指针 self.count = 0 # 缓冲区中数据量 def put(self, data): """放入一个字节,如果缓冲区满则丢弃最旧的数据(覆写)""" self.buffer[self.head] = data self.head = (self.head + 1) % self.size if self.count < self.size: self.count += 1 else: # 缓冲区满,尾指针也需要前进,丢弃最旧数据 self.tail = (self.tail + 1) % self.size def get(self): """获取一个字节,如果缓冲区空则返回None""" if self.count == 0: return None data = self.buffer[self.tail] self.tail = (self.tail + 1) % self.size self.count -= 1 return data def available(self): return self.count # 创建环形缓冲区实例 rx_buffer = RingBuffer(1024)

4.2 UART中断服务程序与主循环数据提取

我们需要设置一个UART接收中断,每当收到一个字符,就触发中断将其存入环形缓冲区。

def uart_rx_handler(uart): """UART接收中断处理函数""" while uart.any(): # 读取所有当前可用的字符 char = uart.read(1) if char: rx_buffer.put(char[0]) # 存入环形缓冲区 # 设置UART中断回调 uart.irq(trigger=UART.RX_ANY, handler=uart_rx_handler) # 主循环中提取完整NMEA语句的函数 def get_nmea_sentence(): """从环形缓冲区中提取一条完整的NMEA语句(以$开头,以\r\n结尾)""" sentence = b'' in_sentence = False while rx_buffer.available() > 0: char = rx_buffer.get() if char is None: break if char == ord('$'): # 找到语句开始 sentence = bytearray([char]) in_sentence = True elif in_sentence: sentence.append(char) # 检查是否到达语句结尾 if len(sentence) >= 2 and sentence[-2:] == b'\r\n': # 找到完整语句,返回字节串 return bytes(sentence) # 如果既不在语句中,也没找到$,就继续消耗字符,直到找到$ return None

4.3 NMEA解析与校验和验证

拿到一条完整的NMEA语句后,需要验证并解析它。

def parse_nmea_sentence(sentence_bytes): """解析NMEA语句,返回字典或None""" try: sentence = sentence_bytes.decode('ascii').strip() except UnicodeDecodeError: return None # 1. 校验和验证 if '*' not in sentence: return None data_part, checksum_received = sentence.split('*') # 校验和计算:从$之后到*之前所有字符的异或值 checksum_calculated = 0 for char in data_part[1:]: # 跳过开头的$ checksum_calculated ^= ord(char) if f'{checksum_calculated:02X}' != checksum_received.upper(): print(f'Checksum error: calc {checksum_calculated:02X}, recv {checksum_received}') return None # 2. 分割字段 fields = data_part.split(',') sentence_type = fields[0] # 3. 解析GPRMC语句 if sentence_type == '$GPRMC' and len(fields) >= 10: status = fields[2] # A=有效,V=无效 if status != 'A': return {'type': 'GPRMC', 'valid': False} # 解析时间 HHMMSS.sss utc_time = fields[1] # 解析纬度 DDMM.mmmm 和 半球 lat_str = fields[3] lat_hemi = fields[4] # 解析经度 DDDMM.mmmm 和 半球 lon_str = fields[5] lon_hemi = fields[6] # 转换为十进制度数 def nmea_to_decimal(nmea_str, hemi): if not nmea_str or nmea_str == '': return 0.0 deg = int(float(nmea_str) // 100) minutes = float(nmea_str) - deg * 100 decimal = deg + minutes / 60.0 if hemi in ['S', 'W']: decimal = -decimal return decimal latitude = nmea_to_decimal(lat_str, lat_hemi) longitude = nmea_to_decimal(lon_str, lon_hemi) return { 'type': 'GPRMC', 'valid': True, 'time': utc_time, 'latitude': latitude, 'longitude': longitude, 'speed': fields[7] if len(fields) > 7 else None, # 地面速度(节) 'course': fields[8] if len(fields) > 8 else None, # 地面航向 'date': fields[9] if len(fields) > 9 else None, # DDMMYY } # 可以在这里添加对其他NMEA语句(如GPGGA)的解析 return None

4.4 数据记录策略与文件操作

解析出有效数据后,我们需要决定何时、以何种格式写入文件。最简单的策略是每秒记录一条有效数据。但为了节省存储空间和电力,也可以采用“变化记录”策略,比如位置移动超过5米才记录。

# 文件操作相关 LOG_FILE = '/sd/gps_log.csv' LOG_INTERVAL_MS = 1000 # 记录间隔,单位毫秒 last_log_time = utime.ticks_ms() last_lat = None last_lon = None DISTANCE_THRESHOLD = 0.00005 # 大约5米的经纬度变化阈值(粗略估算,赤道附近) def haversine_distance(lat1, lon1, lat2, lon2): """粗略计算两点间距离(米),用于过滤微小移动。简化版,适用于短距离。""" if lat1 is None or lon1 is None: return float('inf') # 简化计算,实际应用建议使用完整公式 from math import radians, cos, sqrt dlat = radians(lat2 - lat1) dlon = radians(lon2 - lon1) a = dlat * dlat + dlon * dlon * cos(radians((lat1+lat2)/2)) return 6371000 * sqrt(a) # 地球平均半径约6371km def write_to_file(data_dict): """将数据字典写入CSV文件""" try: # 尝试以追加模式打开文件,如果不存在则创建 with open(LOG_FILE, 'a') as f: # 如果是第一次写入,可以写入表头 if f.tell() == 0: f.write('UTC_Time,Latitude,Longitude,Speed_knots,Course,Date\n') # 写入数据行 line = f"{data_dict['time']},{data_dict['latitude']:.6f},{data_dict['longitude']:.6f}," line += f"{data_dict['speed'] or ''},{data_dict['course'] or ''},{data_dict['date'] or ''}\n" f.write(line) return True except OSError as e: print('File write error:', e) return False # 主循环 print("GPS Tracker Started. Logging to", LOG_FILE) led = Pin(25, Pin.OUT) while True: current_time = utime.ticks_ms() # 1. 尝试获取并解析一条NMEA语句 sentence = get_nmea_sentence() if sentence: parsed_data = parse_nmea_sentence(sentence) if parsed_data and parsed_data['valid']: # 获取到有效定位数据 led.toggle() # 用LED闪烁指示数据接收 current_lat = parsed_data['latitude'] current_lon = parsed_data['longitude'] # 2. 判断是否满足记录条件(时间间隔+距离变化) time_elapsed = utime.ticks_diff(current_time, last_log_time) distance_moved = haversine_distance(last_lat, last_lon, current_lat, current_lon) if time_elapsed >= LOG_INTERVAL_MS and distance_moved >= DISTANCE_THRESHOLD: # 3. 写入文件 if write_to_file(parsed_data): print(f"Logged: {parsed_data['time']}, ({current_lat:.4f}, {current_lon:.4f})") last_log_time = current_time last_lat = current_lat last_lon = current_lon else: print("Write failed!") # 主循环可以做一些其他低优先级任务,或者直接休眠以省电 utime.sleep_ms(10) # 短暂休眠,降低CPU占用

5. 功耗优化与实战踩坑心得

让这个小设备靠电池跑上一天甚至更久,是项目成功的关键。Pico的RP2040在低功耗方面有不错的表现,但需要正确配置。

5.1 软硬件省电技巧

  1. 降低系统时钟频率:在MicroPython中,可以通过machine.freq()降低CPU主频。对于GPS数据记录(每秒才处理几条短字符串),将频率从125MHz降到几十MHz甚至几MHz,能大幅降低动态功耗。可以在初始化时设置machine.freq(20_000_000)(20MHz)。
  2. 利用休眠模式:Pico支持machine.lightsleep()和machine.deepsleep()。在我们的场景中,因为要持续监听串口,不能深度睡眠。但可以在主循环的utime.sleep_ms(10)处,如果判断短时间内不会有数据,可以考虑进入极短的光睡眠。更高级的做法是利用PIO(可编程IO)来监控串口,当收到起始符$时产生中断唤醒核心,但这需要更复杂的编程。
  3. 关闭未用外设:初始化后,将不用的GPIO设置为输入模式并禁用上拉/下拉。如果SD卡不是一直写入,可以在每次写入操作前后动态初始化SPI外设,写完后关闭。
  4. 硬件层面:
    • 使用高效率的LDO或DC-DC降压模块为Pico供电,而不是简单的线性稳压器。
    • GPS模块本身也有功耗。有些模块支持$PMTK命令进入低功耗模式或设定定位频率(如每5秒定位一次)。在满足应用需求的前提下,可以发送$PMTK225,4*2F(休眠模式)或$PMTK220,5000*1B(设置定位更新周期为5000ms)等命令来降低GPS模块功耗。
    • 选择低功耗的SD卡,并在不读写时,通过控制CS引脚将其置于高阻态。

5.2 那些我踩过的坑和解决方案

  1. SD卡写入失败或文件损坏:
    • 问题:在移动设备(如自行车)上,振动可能导致SD卡接触不良,写操作中断。
    • 解决:确保SD卡座接触良好;每次写入文件后,执行f.flush()和os.sync()(在MicroPython中可能是uos.sync())来确保数据从缓存写入物理介质。更稳妥的方法是,不在每次定位时都打开关闭文件,而是打开文件后,定期(如每10条记录)执行一次flush()和sync(),并在程序安全退出(如检测到关机按钮)时关闭文件。
  2. GPS模块在室内或城市峡谷无信号:
    • 问题:模块一直输出无效(V)状态,程序不断解析但无有效数据,空耗电。
    • 解决:在解析到状态为V时,增加一个计数器。如果连续无效次数超过阈值(如60次,代表1分钟),可以让系统进入更深的休眠一段时间(如30秒),然后再恢复监听。同时,LED可以改用慢闪模式指示“搜索中”。
  3. 时间戳混乱:
    • 问题:GPS模块输出的时间是UTC时间,且日期可能不是本地日期。直接记录会导致轨迹时间不对。
    • 解决:在解析$GPRMC时,同时解析日期字段(DDMMYY)。在写入文件时,可以将UTC时间和日期组合成一个标准的时间字符串(如2023-10-27T12:35:19Z)。如果需要本地时间,必须在Pico上维护一个时区偏移量进行转换,但这要求Pico的RTC有电池备份或每次上电后从GPS获取时间初始化。
  4. 轨迹文件格式选择:
    • 问题:CSV通用,但无法直接在地图软件中显示为路径。
    • 解决:可以同时生成两种格式。CSV用于原始数据分析。另外,可以按照GPX(GPS Exchange Format)格式生成一个.gpx文件。GPX是XML格式,包含航点(wpt)、轨迹(trk)等元素,能被绝大多数地图软件(如Google Earth, Garmin BaseCamp, 各种手机骑行APP)直接识别和渲染。在每次记录有效点时,除了写CSV,也向一个GPX文件追加一个<trkpt>节点。项目结束时,补全GPX文件头尾即可。

6. 成果可视化:从数据文件到地图轨迹

记录了一天的数据后,把SD卡插到电脑上,你会看到一个gps_log.csv文件。用Excel或文本编辑器打开,可以看到规整的数据列。但这还不够直观,我们需要把它变成地图上的线。

使用Google Earth Pro(免费):

  1. 将CSV文件另存为gps_log.txt(确保是纯文本,UTF-8编码)。
  2. 打开Google Earth Pro,点击左上角“文件” -> “导入”。
  3. 选择你的文本文件,在导入向导中:
    • 选择“分隔符”为“逗号”。
    • 为经度、纬度字段选择正确的列。
    • 在“字段类型”中,将时间字段设置为“日期/时间”,并指定格式(如HHMMSS)。
  4. 导入后,所有点会以“临时位置”显示。右键点击它,选择“另存为”,保存为.kml或.kmz文件,即可永久保留这条轨迹。Google Earth会自动将这些点连接成路径。

使用在线工具或Python脚本: 如果你喜欢编程,可以用Python的pandas和folium库轻松生成一个交互式的HTML地图。

import pandas as pd import folium # 读取CSV df = pd.read_csv('gps_log.csv') # 假设你的列名是 UTC_Time, Latitude, Longitude # 筛选出有效数据(经纬度不为0) df = df[(df['Latitude'] != 0) & (df['Longitude'] != 0)] # 创建地图,以第一个点为中心 if not df.empty: center_lat, center_lon = df.iloc[0]['Latitude'], df.iloc[0]['Longitude'] mymap = folium.Map(location=[center_lat, center_lon], zoom_start=15) # 将轨迹点转换为列表 points = df[['Latitude', 'Longitude']].values.tolist() # 添加轨迹线 folium.PolyLine(points, color='red', weight=2.5, opacity=0.8).add_to(mymap) # 标记起点和终点 folium.Marker(points[0], popup='Start', icon=folium.Icon(color='green')).add_to(mymap) folium.Marker(points[-1], popup='End', icon=folium.Icon(color='red')).add_to(mymap) # 保存为HTML文件 mymap.save('my_gps_track.html') print('Map saved as my_gps_track.html. Open it in your browser.')

运行这个脚本,你会得到一个my_gps_track.html文件,用浏览器打开就能看到清晰的轨迹线。

7. 进阶扩展:让记录仪更智能

基础功能跑通后,你可以根据兴趣添加更多功能:

  1. 数据压缩与过滤:在存储前,对连续且位置接近的点进行道格拉斯-普克算法抽稀,在几乎不损失轨迹形状的前提下大幅减少数据量。
  2. 状态显示与交互:增加一个小型OLED屏幕(I2C接口),实时显示速度、坐标、卫星数、电池电压等信息。增加一个按钮,用于切换模式(如开始/停止记录、标记航点)。
  3. 无线数据传输:增加一个ESP-01S(ESP8266)Wi-Fi模块,让Pico具备AP或STA模式。可以搭建一个简单的Web服务器,通过手机浏览器实时查看位置,或者将数据定时上传到云服务器(如Thingspeak、Blynk)。
  4. 地理围栏与报警:在代码中预设一个安全区域(多边形或圆形),当设备移动超出该区域时,通过蜂鸣器或连接的GSM模块发送报警短信。
  5. 融合其他传感器:接入一个BMP280气压计记录海拔变化,或者一个MPU6050陀螺仪记录姿态,丰富轨迹数据维度。

这个项目就像一把钥匙,打开了嵌入式数据采集与物联网应用的大门。从最基础的接线、读数据,到考虑功耗、可靠性、数据格式,每一步都是对实际工程思维的锻炼。最关键的是,你得到了一个完全受自己控制、数据透明、可以任意修改的硬件工具。下次出门骑行、徒步,或者需要追踪某个设备的移动路径时,带上你自己做的这个小盒子,成就感绝对远超购买任何成品。

相关新闻

  • 国内全域信息流广告监测方案:中小企业低成本落地大厂级数据能力 - 芈只AI研究院
  • 用Micro:bit与纸板制作红外感应击掌机器人:从传感器原理到动手实践
  • AI聊天应用的技术本质与商业价值分析

最新新闻

  • mGBA终极故障排查指南:快速解决模拟器常见问题
  • mGBA模拟器终极指南:3大技巧让GBA游戏体验提升200%
  • 解决Git克隆失败:OpenClaw等大型AI项目的完整克隆指南
  • 基于CH32V208 RISC-V的双USB串口数据交换器设计与实现
  • 无人机编程与斐波那契搜索算法在居家救援模拟教学中的应用
  • 影刀RPA定时截图监控:自动记录网页变化完全指南

日新闻

  • 力旷智能:伺服驱动系统在制药收瓶设备中的应用解析
  • 2026 网安入门避坑指南,零基础如何避开无效学习直接上手实战
  • 揭秘CFC项目:如何通过手机摄像头实现850kbps无网络文件传输

周新闻

  • 大连理工大学与东京大学联手打造的“主动型AI助手“
  • 170.2026年国家级科研瓶颈:超精密单点金刚石切削(SPDT)光学表面生成
  • SongBloom:革命性歌曲生成框架深度解析——如何通过交织自回归与扩散模型创作完整音乐

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号