树莓派双通道CAN HAT实战指南:从硬件连接到Python编程
1. 项目概述当树莓派遇上CAN总线如果你手头有一个树莓派并且想让它和汽车、工业设备或者机器人“对话”那么一个2-CH CAN HAT绝对是你工具箱里不可或缺的宝贝。简单来说它就是一个插在树莓派GPIO接口上的扩展板专门用来让树莓派具备CAN总线通信能力而且是双通道的。CAN总线你可能听说过它是汽车电子和工业自动化领域的“普通话”负责连接各种控制器、传感器和执行器特点是抗干扰能力强、可靠性高。但树莓派本身并没有这个“语言”能力所以这块HATHardware Attached on Top就扮演了翻译官的角色。我最早接触CAN HAT是因为一个机器人底盘项目需要同时读取两个电机的编码器数据和发送控制指令。市面上的单通道CAN模块要么不够用要么需要复杂的扩展而这块双通道的板子正好解决了我的痛点。它基于经典的MCP2515 CAN控制器和TJA1050 CAN收发器通过SPI接口与树莓派通信这意味着你几乎不用关心底层硬件时序只需要通过软件配置就能轻松收发CAN报文。对于嵌入式开发者、汽车电子爱好者、机器人工程师甚至是物联网项目的学生来说这都是一块能极大扩展项目可能性的低成本、高集成度模块。接下来我就结合自己踩过的坑和实际项目经验带你从零开始玩转这块2-CH CAN HAT。2. 硬件解析与选型考量2.1 核心芯片MCP2515与TJA1050的黄金组合这块HAT的核心是两颗芯片MCP2515和TJA1050。理解它们的分工是后续一切软件配置和问题排查的基础。MCP2515是一颗独立的CAN控制器。你可以把它想象成一个“协议处理器”。它的主要工作是处理复杂的CAN协议层事务比如报文缓冲内部有多个发送和接收缓冲区可以暂存待发送或已接收的CAN帧减轻主控树莓派的实时性压力。验收过滤这是CAN总线一个非常强大的功能。MCP2515可以设置过滤规则只接收特定ID的报文从而避免主控被海量不相关的总线消息淹没。对于树莓派这种运行着复杂操作系统的设备来说这个功能至关重要。错误处理自动检测总线错误如位错误、填充错误等并管理错误计数器和错误状态。树莓派通过SPI接口与MCP2515通信。SPI是一种高速、全双工的同步串行总线主从架构。树莓派作为SPI主机通过SCLK时钟、MOSI主机输出从机输入、MISO主机输入从机输出和CS片选这四根线来控制MCP2515。这里有个关键点这块HAT是双通道的意味着它有两套MCP2515TJA1050。通常它们会连接到树莓派同一个SPI总线的两个不同片选CS引脚上通过切换片选信号来选择与哪个通道通信。TJA1050则是一个CAN收发器你可以把它看作是“电平转换器”和“物理层驱动器”。它的职责是电平转换将MCP2515输出的逻辑电平0-3.3V或0-5V转换成符合ISO 11898标准的CAN总线差分信号CAN_H和CAN_L。总线驱动提供足够的电流驱动能力确保信号能在长达数十米的双绞线上稳定传输。抗干扰与保护内部集成了各种保护电路如总线引脚防短路、防电池反接、热关断等保护控制器免受恶劣的汽车或工业电气环境干扰。注意不同厂商的HAT可能使用不同型号的收发器如TJA1051带静默模式、SN65HVD2303.3V供电等。TJA1050是5V供电的经典型号兼容性最好。购买或使用时务必确认其供电电压是否与你的总线网络匹配。2.2 硬件连接与供电细节拿到板子后第一步是正确连接。除了将HAT对准树莓派的40针GPIO座子插牢之外还有几个关键点终端电阻CAN总线两端必须各接一个120欧姆的终端电阻以消除信号反射。大多数2-CH CAN HAT都会为每个通道设计一个跳线帽或拨码开关来控制是否启用板载的120欧姆电阻。如果你的设备处于总线网络的末端就需要通过跳线启用这个电阻如果处于中间位置则通常禁用板载电阻依靠网络两端的设备提供终端电阻。我踩过的坑在一次多节点测试中所有节点都启用了板载终端电阻导致总线负载过重通信完全失败。务必确保整条总线只有两个120欧姆电阻。供电HAT的供电通常直接从树莓派的GPIO引脚获取3.3V和5V。TJA1050收发器需要5V供电才能输出标准的CAN总线电平。请确保你的树莓派能提供稳定的5V电源特别是在连接多个外设时。对于功耗较大的项目建议使用官方或足额的电源适配器。总线连接每个CAN通道都有两个螺丝端子分别标有HCAN_H和LCAN_L。连接时务必使用双绞线非网线将H接HL接L。屏蔽层如果可用建议单点接地。隔离版本在一些工业或汽车测试场景中电气噪声可能很大。市面上有带光耦或磁耦隔离的CAN HAT。这种板子在MCP2515和TJA1050之间增加了隔离芯片能有效防止地环路干扰和高压浪涌损坏树莓派。如果你的应用环境比较“脏”强烈建议多花点钱选择隔离版本它能省去很多莫名其妙的通信故障。3. 软件环境搭建与驱动配置硬件连接妥当后下一步就是在树莓派操作系统通常是Raspberry Pi OS上配置软件环境。这个过程的核心是启用SPI接口并加载针对MCP2515的Linux内核CAN驱动。3.1 启用SPI接口与安装工具首先通过SSH或直接连接显示器键盘登录到你的树莓派。启用SPIsudo raspi-config在配置界面中依次选择Interface Options-SPI-Yes来启用SPI内核模块。完成后重启。 重启后可以检查SPI设备是否出现ls /dev/spi*你应该能看到类似/dev/spidev0.0和/dev/spidev0.1的设备文件。这两个文件对应SPI总线0上的两个片选。我们的双通道HAT通常就占用其中两个。安装CAN工具集Linux系统提供了强大的SocketCAN框架它将CAN设备抽象为网络接口使得我们可以像操作网络套接字一样操作CAN总线。安装必备工具sudo apt update sudo apt install can-utilscan-utils包含了一系列命令行工具如candump监听总线数据、cansend发送单帧数据、canplayer回放日志等是调试的利器。3.2 配置与加载MCP2515驱动树莓派内核已经集成了MCP2515的驱动我们需要通过设备树Device Tree覆盖层Overlay来配置并加载它。这是最关键的一步。编辑配置文件sudo nano /boot/config.txt在文件末尾添加以下行来加载驱动并指定SPI和中断引脚。这里需要根据你的HAT实际接线来调整。假设通道1使用SPI0 CS0CE0GPIO8和中断引脚GPIO25通道2使用SPI0 CS1CE1GPIO7和中断引脚GPIO24晶振频率为8MHzdtparamspion dtoverlaymcp2515,spi0-0,interrupt25,oscillator8000000 dtoverlaymcp2515,spi0-1,interrupt24,oscillator8000000spi0-0表示SPI总线0片选0。对应设备文件/dev/spidev0.0。spi0-1表示SPI总线0片选1。对应设备文件/dev/spidev0.1。interrupt指定MCP2515通知树莓派有数据到达的中断引脚号。必须与HAT硬件连接一致否则无法触发接收中断只能轮询效率极低。oscillator是MCP2515芯片外部晶振的频率常见的有8MHz、16MHz、20MHz等。这个参数必须100%准确它直接决定了CAN总线波特率计算的基准时钟。参数错误会导致波特率严重偏差无法通信。查看你的HAT板载晶振上印的数字。重启并检查sudo reboot重启后使用ifconfig -a或ip link show命令查看网络接口。你应该能看到两个新的CAN接口通常命名为can0和can1。ip link show输出中应有类似3: can0: NOARP,ECHO mtu 16 qdisc noop state DOWN mode DEFAULT group default qlen 10 link/can 4: can1: NOARP,ECHO mtu 16 qdisc noop state DOWN mode DEFAULT group default qlen 10 link/can看到can0和can1说明驱动加载成功目前状态是DOWN接下来需要配置波特率并启动它们。实操心得驱动加载失败最常见的原因有两个。一是interrupt引脚号配置错误务必对照HAT原理图或说明书确认。二是oscillator频率填错用错频率会导致波特率不对这是最隐蔽的坑。我曾因为把16MHz晶振错看成10MHz调试了一下午。4. 总线配置与基础通信测试驱动加载成功后can0和can1接口还处于未配置状态。我们需要设置正确的波特率并将其启动。4.1 设置波特率与启动接口CAN总线波特率需要所有节点一致。常见的波特率有125kbps、250kbps、500kbps、1Mbps等。这里以500kbps为例# 设置can0波特率为500kbps并启动 sudo ip link set can0 type can bitrate 500000 sudo ip link set can0 up # 设置can1波特率为500kbps并启动 sudo ip link set can1 type can bitrate 500000 sudo ip link set can1 up再次使用ip link show can0查看状态应变为UP。波特率计算背后的原理bitrate参数背后的驱动会帮你完成计算但了解原理有助于排查问题。MCP2515的波特率由几个寄存器CNF1 CNF2 CNF3配置它们共同决定了位时间中各段同步段、传播段、相位缓冲段1和2的时钟周期数。计算公式基于晶振频率。例如对于8MHz晶振目标500kbps预分频器通常设为2每个位时间就是16个Tq时间份额从而得出500kbps。驱动内部完成了这个换算。如果你发现通信不稳定可以尝试降低波特率或者检查晶振频率配置。4.2 使用can-utils进行基础测试现在可以进行最简单的自发自收测试验证整个链路是否通畅。打开一个终端监听can0总线candump can0打开另一个终端向can0发送一帧数据cansend can0 123#1122334455667788这帧数据的ID是0x123标准帧数据是8个字节0x11, 0x22, ..., 0x88。在第一个终端candump中你应该能看到刚刚发送的报文被接收回来。这是因为我们只连接了树莓派一个节点报文发出后没有其他节点应答但总线是通的自己会收到自己发出的报文自发自收。测试双通道用同样的方法测试can1。你还可以尝试从一个通道发送在另一个通道监听需要将两个通道的H和L分别短接但这并不是标准用法仅作测试。标准用法是两个通道接入不同的CAN网络。常用can-utils命令速查candump can0持续监听并打印can0上的所有报文。candump can0 -l监听并记录到日志文件默认candump.log。cansend can0 123#1122发送标准帧。cansend can0 1F334455#R发送远程帧RTR帧。cansend can0 “123##2112233”发送扩展帧ID为29位。cangen can0 -g 10 -I 100 -L 4以10ms间隔随机生成ID为100数据长度4字节的测试报文。canbusload can0 500000估算总线负载需指定波特率。5. 高级应用与编程实战命令行工具适合测试和调试真正的项目需要编程。SocketCAN框架让我们可以用标准的Berkeley套接字API来操作CAN就像写TCP/UDP网络程序一样简单。这里以Python为例因为它上手快在树莓派上非常流行。5.1 Python SocketCAN编程示例首先确保安装了Python的socket模块通常内置和python-can库。python-can是一个功能强大的CAN库提供了统一的接口。pip install python-can示例1发送单帧数据import can # 创建总线实例指定通道和波特率 bus can.interface.Bus(channelcan0, bustypesocketcan, bitrate500000) # 构造一帧消息 msg can.Message( arbitration_id0x123, # CAN ID data[0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88], is_extended_idFalse # 标准帧 ) try: bus.send(msg) print(fMessage sent on {bus.channel_info}) except can.CanError: print(Message发送失败) finally: bus.shutdown()示例2异步接收消息推荐import can def on_message_received(msg): print(f收到消息: ID{hex(msg.arbitration_id)}, Data{msg.data.hex()}) bus can.interface.Bus(channelcan0, bustypesocketcan, bitrate500000) listener can.Listener() notifier can.Notifier(bus, [listener]) # 添加自定义监听器 bus.set_filters([{can_id: 0x100, can_mask: 0x7F0}]) # 设置硬件过滤只接收ID在0x100-0x10F范围内的帧 reader can.AsyncBufferedReader() notifier.add_listener(reader) notifier.add_listener(on_message_received) print(监听中按CtrlC退出...) try: while True: # 使用reader非阻塞获取消息 msg reader.get_message(timeout1.0) if msg is not None: # 处理消息 pass except KeyboardInterrupt: pass finally: notifier.stop() bus.shutdown()示例3双通道数据转发桥接一个常见的应用是将两个不同波特率或不同网络的CAN总线连接起来。import can import threading def forward_messages(source_bus, dest_bus, source_name): try: while True: msg source_bus.recv(timeout1.0) # 阻塞接收 if msg is not None: print(f[{source_name}] 转发: ID{hex(msg.arbitration_id)}) dest_bus.send(msg) except KeyboardInterrupt: pass # 创建两个总线对象 bus_a can.interface.Bus(channelcan0, bustypesocketcan, bitrate250000) bus_b can.interface.Bus(channelcan1, bustypesocketcan, bitrate500000) # 创建两个转发线程 thread_a_to_b threading.Thread(targetforward_messages, args(bus_a, bus_b, CAN0-CAN1)) thread_b_to_a threading.Thread(targetforward_messages, args(bus_b, bus_a, CAN1-CAN0)) thread_a_to_b.start() thread_b_to_a.start() thread_a_to_b.join() thread_b_to_a.join() bus_a.shutdown() bus_b.shutdown()5.2 硬件过滤器的妙用MCP2515支持硬件验收过滤。在总线负载很高时启用硬件过滤可以极大减少传输到Linux内核和应用层的中断和报文数量降低CPU负载。配置过滤通常在初始化总线时通过set_filters方法完成如示例2所示。掩码can_mask决定了ID的哪些位需要精确匹配。例如can_id0x100, can_mask0x7F0表示只接收ID的高7位bit10-bit4与0x100的高7位匹配的帧即ID范围是0x100到0x10F。6. 故障排查与性能优化实录在实际使用中你肯定会遇到各种问题。下面是我总结的一些常见故障和排查思路。6.1 常见问题速查表现象可能原因排查步骤ip link看不到can0/can11. SPI未启用2. 设备树覆盖层配置错误3. 驱动加载失败1.ls /dev/spi*检查SPI设备2. 检查/boot/config.txt中的dtoverlay行确认引脚和频率3.dmesg | grep -i can查看内核日志接口状态为DOWN接口未启动使用sudo ip link set can0 up启动接口启动失败1. 波特率设置不支持2. 物理层问题终端电阻、接线1. 尝试一个更低的波特率如125k2. 检查终端电阻跳线测量CAN_H和CAN_L之间电阻应为60欧左右candump收不到任何数据1. 总线无活动2. 硬件过滤器屏蔽了所有报文3. 中断引脚配置错误1. 用cansend自发自收测试2. 检查是否设置了过滤器尝试清除过滤器sudo ip link set can0 type can accept-all on3. 检查dtoverlay中的interrupt参数收到大量错误帧1. 波特率不匹配2. 总线物理层干扰3. 供电不稳1.首要怀疑对象确认所有节点波特率一致检查oscillator参数2. 检查接线使用双绞线远离强电3. 使用示波器观察总线波形通信时好时坏1. 地线环路或共模干扰2. 总线负载过高3. 电源噪声1. 确保所有节点共地考虑使用隔离型CAN HAT2. 用canbusload监控负载优化发送频率3. 为树莓派和HAT提供干净、稳定的电源Python程序报错OSError: [Errno 100]1. 接口未启动或不存在2. 另一个进程已占用该接口1. 用ip link show can0确认状态2. 使用sudo lsof /dev/spidev0.0查看占用进程6.2 性能优化与稳定性技巧增大Socket缓冲区在高负载下默认的Socket缓冲区可能溢出导致丢帧。可以调整sudo ip link set can0 txqueuelen 1000将发送队列长度从默认的10增加到1000。在Python中也可以在创建总线时设置receive_own_messagesFalse和增大内核缓冲区参数通过setsockopt。合理使用硬件过滤这是减轻CPU负担最有效的手段。尽量在驱动层过滤掉不需要的ID而不是在应用层。选择合适的中断引脚确保interrupt引脚配置正确且唯一。避免使用那些有特殊复用功能如I2C、UART的GPIO作中断以免冲突。电源去耦在HAT的电源入口处靠近芯片的位置并联一个10uF的电解电容和一个0.1uF的陶瓷电容可以有效滤除电源噪声提升收发器稳定性。总线保护如果环境恶劣可以在CAN_H和CAN_L对地之间加TVS管如SMBJ24CA在总线入口串联共模电感以增强抗浪涌和抗静电能力。监控总线状态使用ip -details -statistics link show can0可以查看详细的错误计数、丢包统计等是诊断总线健康状态的重要依据。7. 项目实战构建简易CAN数据记录仪最后我们用一个综合性的小项目来串联所有知识制作一个双通道CAN数据记录仪将两个独立CAN网络上的数据实时记录到CSV文件中并附带时间戳。需求同时监听can0和can1。将收到的每帧CAN报文ID、数据长度、数据、帧类型以及精确的接收时间戳保存到CSV文件。程序需稳定运行并在退出时妥善关闭资源。代码实现import can import csv import signal import sys from datetime import datetime from threading import Thread, Event stop_event Event() def can_listener(channel, csv_writer, stop_event): 监听指定CAN通道并将数据写入CSV bus None try: bus can.interface.Bus(channelchannel, bustypesocketcan, bitrate500000) print(f开始监听 {channel}...) while not stop_event.is_set(): msg bus.recv(timeout1.0) # 超时1秒便于响应停止事件 if msg is not None: timestamp datetime.now().strftime(%Y-%m-%d %H:%M:%S.%f)[:-3] frame_type EXT if msg.is_extended_id else STD if msg.is_remote_frame: frame_type RTR data_hex msg.data.hex().upper() row [timestamp, channel, hex(msg.arbitration_id), frame_type, msg.dlc, data_hex] csv_writer.writerow(row) print(f{timestamp} [{channel}] ID:{hex(msg.arbitration_id)} Data:{data_hex}) except KeyboardInterrupt: pass except Exception as e: print(f{channel} 监听出错: {e}) finally: if bus: bus.shutdown() print(f{channel} 监听已停止.) def signal_handler(sig, frame): print(\n收到停止信号正在关闭...) stop_event.set() if __name__ __main__: signal.signal(signal.SIGINT, signal_handler) # 捕获CtrlC signal.signal(signal.SIGTERM, signal_handler) csv_file open(fcan_log_{datetime.now().strftime(%Y%m%d_%H%M%S)}.csv, w, newline) csv_writer csv.writer(csv_file) csv_writer.writerow([Timestamp, Channel, CAN_ID, Type, DLC, Data]) # 写入表头 # 创建并启动两个监听线程 threads [] for channel in [can0, can1]: t Thread(targetcan_listener, args(channel, csv_writer, stop_event)) t.start() threads.append(t) try: # 等待所有线程结束由stop_event触发 for t in threads: t.join() finally: csv_file.close() print(日志文件已保存程序退出。)运行与使用将上述代码保存为can_logger.py。确保can0和can1已正确配置并启动。运行脚本python3 can_logger.py。程序开始运行后会在当前目录生成一个以时间命名的CSV文件如can_log_20231027_143022.csv并实时打印收到的报文。按CtrlC可以优雅地停止程序关闭文件和CAN总线。这个项目虽然简单但涵盖了双通道操作、多线程、资源管理、数据持久化等关键点。你可以在此基础上扩展比如添加Web界面实时显示、基于特定ID触发动作、或者与数据库结合进行长期数据存储和分析。玩转2-CH CAN HAT的关键在于吃透“硬件连接-驱动配置-软件操作-问题排查”这条主线。从点亮第一个LED到让树莓派在复杂的CAN网络中可靠通信每一步的细节都决定着最终的稳定性。希望这篇长文能帮你绕过我当年踩过的那些坑顺利地把树莓派的能力延伸到汽车、工厂或是任何一个需要可靠通信的角落。

相关新闻

C语言结构体数组赋值:安全处理字符串的三种方法与实践

C语言结构体数组赋值:安全处理字符串的三种方法与实践

1. 从“赋值”说起:为什么结构体数组的赋值是个技术活? 在C语言或者C的开发里,结构体数组是再常见不过的数据组织了。你可能用它来管理学生信息、设备配置、日志条目,或者任何需要批量处理、属性固定的数据集合。但就是这个看似基…

2026/10/17 22:00:33 阅读更多 →
软件工程期末试题全解析:从UML建模到AI浪潮下的职业思考

软件工程期末试题全解析:从UML建模到AI浪潮下的职业思考

1. 项目概述:一份期末试题背后的软件工程全景图 又到了期末季,看着手头这份《软件工程》期末试题,你是不是感觉既熟悉又陌生?熟悉的是那些反复出现的名词:生命周期、UML、敏捷、测试……陌生的是,当这些概念…

2026/10/20 15:15:47 阅读更多 →
Windows 7用户终极指南:iperf3网络性能测试工具兼容性解决方案

Windows 7用户终极指南:iperf3网络性能测试工具兼容性解决方案

Windows 7用户终极指南:iperf3网络性能测试工具兼容性解决方案 【免费下载链接】iperf3-win-builds iperf3 binaries for Windows. Benchmark your network limits. 项目地址: https://gitcode.com/gh_mirrors/ip/iperf3-win-builds iperf3是一款专业的网络性…

2026/10/20 19:05:15 阅读更多 →

最新新闻

C语言上机考试题库实战:数字组合、数位判断与字符串大数运算

C语言上机考试题库实战:数字组合、数位判断与字符串大数运算

简介:这份文档面向西北工业大学及理工科院校正在备考C语言上机考试的学生,也可供希望系统梳理C语言核心知识点的自学者使用。内容围绕西工大上机题库中的典型题目展开,涵盖数字组合、数字特性检查、字符串乘法、N边形面积、竞赛逻辑推理、插入…

2026/10/21 5:52:19 阅读更多 →
S7-200 PLC锅炉控制系统:安全闭环设计与硬件联调实战

S7-200 PLC锅炉控制系统:安全闭环设计与硬件联调实战

简介:本资源是一份面向电气自动化专业本科生及PLC初学者的课程设计实践文档,聚焦燃油锅炉这一典型工业热力设备,解决传统继电器控制精度低、可靠性差的问题,提供基于PLC的全自动安全控制完整方案。文档为单文件Word格式&#xff0…

2026/10/21 5:52:19 阅读更多 →
化工自动化控制仪表考试核心知识框架与备考策略

化工自动化控制仪表考试核心知识框架与备考策略

1. 化工自动化控制仪表考试的核心知识框架化工自动化控制仪表这个方向,在流程工业里属于典型的“窄而深”领域。它不像通用PLC或者DCS那么宽泛,而是聚焦在温度、压力、流量、液位、成分这几大类参数的检测、变送、调节和执行环节。考试试卷的命题逻辑&am…

2026/10/21 5:52:19 阅读更多 →
AIGC检测与论文降AI率全攻略:从原理到实操的完整指南

AIGC检测与论文降AI率全攻略:从原理到实操的完整指南

又到了一年一度“被查重支配”的季节。我手里的不少同学和年轻同事,最近都在群里发同一类截图:明明是靠自己写出来的初稿,扔进系统一测,AIGC检测标红一大片,降AI率降重服务问了一圈不是爆单就是涨价。标题里那句“崩溃…

2026/10/21 5:52:19 阅读更多 →
Spring Security登录认证实战:过滤器链与Session会话管理

Spring Security登录认证实战:过滤器链与Session会话管理

说实话,只要是做Java后端的朋友,基本都绕不开登录认证这块。早期我还在用拦截器加Session手动判断用户是否登录,后来项目切到Spring Boot,就老老实实把Spring Security用起来了。刚开始确实有点劝退,过滤器链、认证管理…

2026/10/21 5:52:19 阅读更多 →
职业经验建模:用声明式YAML构建可复用AI Agent

职业经验建模:用声明式YAML构建可复用AI Agent

1. 这不是又一个“AI Agent 框架”,而是一套可复用的职业经验建模方法论你有没有试过让大模型写一份市场总监的季度复盘报告?或者模拟一位资深HR在薪酬谈判中的应答逻辑?多数时候,结果要么是泛泛而谈的模板话术,要么是…

2026/10/21 5:51:19 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →