Klipper-probe模块

配置信息

[probe]  
pin: !PD4
x_offset: 0 
y_offset: 0 
z_offset: -0.20 #the distance between nozzle and level switch
speed: 10
samples: 2 #probe one point three times get an average
samples_result: average  
sample_retract_dist: 5
samples_tolerance: 0.05 # precision
samples_tolerance_retries: 5 
入口
def load_config(config):return PrinterProbe(config, ProbeEndstopWrapper(config))
初始化
class PrinterProbe:def __init__(self, config, mcu_probe):self.printer = config.get_printer()self.name = config.get_name()self.mcu_probe = mcu_probeself.speed = config.getfloat('speed', 5.0, above=0.)self.lift_speed = config.getfloat('lift_speed', self.speed, above=0.)self.x_offset = config.getfloat('x_offset', 0.)self.y_offset = config.getfloat('y_offset', 0.)self.z_offset = config.getfloat('z_offset')self.probe_calibrate_z = 0.self.multi_probe_pending = Falseself.last_state = Falseself.last_z_result = 0.self.gcode_move = self.printer.load_object(config, "gcode_move")# Infer Z position to move to during a probeif config.has_section('stepper_z'):zconfig = config.getsection('stepper_z')self.z_position = zconfig.getfloat('position_min', 0.,note_valid=False)else:pconfig = config.getsection('printer')self.z_position = pconfig.getfloat('minimum_z_position', 0.,note_valid=False)# Multi-sample support (for improved accuracy)self.sample_count = config.getint('samples', 1, minval=1)self.sample_retract_dist = config.getfloat('sample_retract_dist', 2.,above=0.)atypes = {'median': 'median', 'average': 'average'}self.samples_result = config.getchoice('samples_result', atypes,'average')self.samples_tolerance = config.getfloat('samples_tolerance', 0.100,minval=0.)self.samples_retries = config.getint('samples_tolerance_retries', 0,minval=0)# Register z_virtual_endstop pinself.printer.lookup_object('pins').register_chip('probe', self)# Register homing event handlersself.printer.register_event_handler("homing:homing_move_begin",self._handle_homing_move_begin)self.printer.register_event_handler("homing:homing_move_end",self._handle_homing_move_end)self.printer.register_event_handler("homing:home_rails_begin",self._handle_home_rails_begin)self.printer.register_event_handler("homing:home_rails_end",self._handle_home_rails_end)self.printer.register_event_handler("gcode:command_error",self._handle_command_error)# Register PROBE/QUERY_PROBE commandsself.gcode = self.printer.lookup_object('gcode')self.gcode.register_command('PROBE', self.cmd_PROBE,desc=self.cmd_PROBE_help)self.gcode.register_command('QUERY_PROBE', self.cmd_QUERY_PROBE,desc=self.cmd_QUERY_PROBE_help)self.gcode.register_command('PROBE_CALIBRATE', self.cmd_PROBE_CALIBRATE,desc=self.cmd_PROBE_CALIBRATE_help)self.gcode.register_command('PROBE_ACCURACY', self.cmd_PROBE_ACCURACY,desc=self.cmd_PROBE_ACCURACY_help)self.gcode.register_command('Z_OFFSET_APPLY_PROBE',self.cmd_Z_OFFSET_APPLY_PROBE,desc=self.cmd_Z_OFFSET_APPLY_PROBE_help)
  • 初始化打印机对象和探针参数
    • self.printer:通过 config.get_printer() 获取打印机对象。
    • self.name:通过 config.get_name() 获取探针名称。
    • self.mcu_probe:保存传入的 MCU 探针对象。
    • 速度设置:speedlift_speedx_offsety_offsetz_offsetprobe_calibrate_z 等控制探针的移动速度和偏移。
  • 推断探针的 Z 轴位置
    • 根据配置文件,确定探针在探测过程中的 Z 轴移动位置。
    • 如果配置中有 stepper_z 段,使用其中 position_min 定义的 Z 轴最小位置。
    • 否则,从 printer 配置的 minimum_z_position 获取 Z 轴最小位置。配置里minimum_z_position: -5
  • 多重采样设置(提高测量精度)
    • sample_count:设定采样次数,以便进行多次测量来提高精度。
    • sample_retract_dist:设定每次采样后探针提升的距离。
    • samples_result:采样结果的处理方式,可以选择 ‘median’(中位数)或 ‘average’(平均值)。
    • samples_tolerancesamples_retries:设定采样的误差容忍度和重试次数,用于提高多重采样的稳定性。
  • 注册探针的 Z 虚拟端点
    • 使用 self.printer.lookup_object('pins').register_chip('probe', self) 将探针注册为 Z 虚拟端点,使其在打印机控制系统中可以作为端点来使用。
  • 注册归位事件处理器
    • homing 相关事件处理器会在归位过程的不同阶段触发,分别在归位移动开始和结束时执行 _handle_homing_move_begin_handle_homing_move_end,在归位轨道的开始和结束时执行 _handle_home_rails_begin_handle_home_rails_end。如果在 GCode 命令中遇到错误,则会触发 _handle_command_error
  • 注册 GCode 命令
    • PROBE:触发一次探针操作。
    • QUERY_PROBE:查询探针状态。
    • PROBE_CALIBRATE:校准探针的 Z 轴偏移。
    • PROBE_ACCURACY:测量探针的精度。
    • Z_OFFSET_APPLY_PROBE:将当前 Z 轴偏移应用到探针。
class ProbeEndstopWrapper:def __init__(self, config):self.printer = config.get_printer()self.position_endstop = config.getfloat('z_offset')self.stow_on_each_sample = config.getboolean('deactivate_on_each_sample', True)gcode_macro = self.printer.load_object(config, 'gcode_macro')self.activate_gcode = gcode_macro.load_template(config, 'activate_gcode', '')self.deactivate_gcode = gcode_macro.load_template(config, 'deactivate_gcode', '')# Create an "endstop" object to handle the probe pinppins = self.printer.lookup_object('pins')pin = config.get('pin')pin_params = ppins.lookup_pin(pin, can_invert=True, can_pullup=True)mcu = pin_params['chip']self.mcu_endstop = mcu.setup_pin('endstop', pin_params)self.printer.register_event_handler('klippy:mcu_identify',self._handle_mcu_identify)# Wrappersself.get_mcu = self.mcu_endstop.get_mcuself.add_stepper = self.mcu_endstop.add_stepperself.get_steppers = self.mcu_endstop.get_steppersself.home_start = self.mcu_endstop.home_startself.home_wait = self.mcu_endstop.home_waitself.query_endstop = self.mcu_endstop.query_endstop# multi probes stateself.multi = 'OFF'
  1. 初始化打印机对象和配置参数
    • self.printer 使用 config.get_printer() 获取打印机对象。
    • self.position_endstop 设定了 z_offset(Z 轴端点偏移量),用于定义探针的初始位置或偏移。
    • self.stow_on_each_sample 用于配置探针是否在每次采样后停放,默认为 True
  2. 加载 GCode 宏
    • 使用 gcode_macro 对象从配置中加载探针激活和停用的 GCode 模板:
      • activate_gcode:在探针激活时执行的 GCode。
      • deactivate_gcode:在探针停用时执行的 GCode。
  3. 创建端点对象
    • 使用 pins 对象(通过 self.printer.lookup_object('pins') 获得)查找探针的 pin(引脚)配置。
    • 通过 lookup_pin() 配置引脚参数,包括是否可以反转或上拉电阻,随后得到引脚参数 pin_params
    • 使用引脚所在的 mcu 芯片设置一个 endstop 引脚对象 mcu_endstop,负责处理探针状态。
  4. 注册事件处理程序
    • 注册事件 klippy:mcu_identify,当触发该事件时调用 _handle_mcu_identify 方法。这个方法通常用于在初始化或连接时对探针或端点进行识别和确认。
  5. 简化调用的包装函数
    • 定义一些包装函数用于直接调用 mcu_endstop 对象的相关方法,包括:
      • get_mcu:获取探针所在的 MCU 对象。
      • add_stepper:将步进电机添加到探针控制中。
      • get_steppers:获取当前与探针关联的步进电机。
      • home_starthome_wait:用于控制探针的归位和等待状态。
      • query_endstop:查询端点的当前状态(是否被触发)。
  6. 多重探针状态
    • 定义 self.multi,表示多重探针采样状态,默认为 'OFF'
class ProbePointsHelper:def __init__(self, config, finalize_callback, default_points=None):self.printer = config.get_printer()self.finalize_callback = finalize_callbackself.probe_points = default_pointsself.name = config.get_name()self.gcode = self.printer.lookup_object('gcode')# Read config settingsif default_points is None or config.get('points', None) is not None:self.probe_points = config.getlists('points', seps=(',', '\n'),parser=float, count=2)self.horizontal_move_z = config.getfloat('horizontal_move_z', 5.)self.speed = config.getfloat('speed', 50., above=0.)self.use_offsets = False# Internal probing stateself.lift_speed = self.speedself.probe_offsets = (0., 0., 0.)self.results = []
  • 该对象会在 bed_mesh 和 delta_calibrate 模块加载时进行初始化,并传入回调函数和探测点points等信息。
探测判断
# delta 校准
ProbePointsHelper.start_probe (probe.py) -> ProbePointsHelper._move_next (probe.py) -> 
DeltaCalibrate.probe_finalize (delta_calibrate.py)# bed_mesh 校准
ProbePointsHelper.start_probe (probe.py) -> ProbePointsHelper._move_next (probe.py) -> 
BedMeshCalibrate.probe_finalize (bed_mesh.py)
探测是否结束代码逻辑
def _move_next(self):toolhead = self.printer.lookup_object('toolhead')# Lift toolheadspeed = self.lift_speedif not self.results:# Use full speed to first probe positionspeed = self.speedtoolhead.manual_move([None, None, self.horizontal_move_z], speed)# Check if done probingif len(self.results) >= len(self.probe_points):toolhead.get_last_move_time()res = self.finalize_callback(self.probe_offsets, self.results)if res != "retry":return Trueself.results = []# Move to next XY probe pointnextpos = list(self.probe_points[len(self.results)])if self.use_offsets:nextpos[0] -= self.probe_offsets[0]nextpos[1] -= self.probe_offsets[1]toolhead.manual_move(nextpos, self.speed)return False
  • 提升探针或工具头
    • 通过调用 toolhead.manual_move,将探针或工具头移动到指定的高度 self.horizontal_move_z
    • 如果这是第一次探测(self.results为空),会使用较快的初始速度(self.speed)。否则使用探针提升速度(self.lift_speed)。
  • 检查探测是否完成
    • 检查已完成探测点的数量是否达到预定的探测点总数(len(self.probe_points))。
    • 如果所有点都探测完成:
      • 调用 toolhead.get_last_move_time() 记录最后的移动时间。
      • 执行 self.finalize_callback,处理探测结果(如计算网格调整数据等)。
  • 处理探测结果
    • finalize_callback 返回值决定后续操作:
    • 如果返回值不是 "retry",探测结束,方法返回 True
    • 如果返回值为 "retry",表示需要重新探测,清空结果 self.results 并从头开始。
  • 移动到下一个探测点
    • 确定下一个探测点的坐标:
      • self.probe_points 列表中取出对应位置的点。
      • 如果启用了偏移(self.use_offsets),会调整 X、Y 坐标以考虑探针的实际偏移量。
    • 将探针移动到下一个点,准备进行探测。
  • 返回继续探测
    • 方法返回 False,表示探测未完成,需要继续执行探测流程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/918855.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/918855.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Excel多级数据结构导入导出工具

Excel多级数据结构导入导出工具 这是一个功能强大的Excel导入导出工具库,专门用于处理复杂的多级嵌套数据结构。通过自定义注解配置,可以轻松实现Java对象与Excel文件之间的双向转换。 核心功能特性 1. 多级数据结构支持 嵌套对象处理: 支持任意层级的对…

基于UniApp的新大陆物联网平台温湿度检测系统开发方案

新大陆物联网平台对接要点 认证方式: 使用AccessToken进行API认证 Token存储在本地缓存中 数据格式: 温度数据单位:摄氏度(C) 湿度数据单位:百分比(%) 时间格式:ISO 8601或时间戳 设备状态: online:…

Git、JSON、MQTT

GIT简介:Git是什么?Git是目前世界上最先进的分布式版本控制系统作用:版本控制(版本的备份--->版本的回溯和前进)多人协作优势:SVN(集中式)劣势:过度依赖服务器和网络,容灾性差Git…

yolo目标检测技术之yolov11项目实战(三)

yolo目标检测技术之yolov11项目实战(三) 文章目录yolo目标检测技术之yolov11项目实战(三)一、 基于 YOLO11 的火焰与烟雾检测系统(实战代码)项目目标环境搭建创建虚拟环境安装依赖1.1 数据集准备1. 下载地址…

CF思维小训练(二)

清晰的缤纷的都可以 脏兮兮的甜的也都有转机 不想太小心 错过第一百零一场美丽 CF思维小训练(二) 书接上回CF思维小训练-CSDN博客 虽然代码很短,都是每一道题的背后都思维满满; 目录CF思维小训练(二)Arbo…

分布式锁:从理论到实战的深度指南

1. 分布式锁是啥?为什么它比单机锁更“硬核”?分布式锁,听起来高大上,其实核心问题很简单:在多个机器、进程或服务同时抢夺资源时,怎么保证不打架? 想象一下,你在双十一抢购限量款球…

基于UniApp的智能在线客服系统前端设计与实现

了解更多,搜索“程序员老狼”一、引言在当今数字化时代,客户服务已成为企业竞争力的重要组成部分。本文将详细介绍一款基于UniApp框架开发的跨平台智能客服系统前端实现方案,该系统不仅具备传统客服功能,还融入了现代即时通讯和人…

react与vue的对比,来实现标签内部类似v-for循环,v-if等功能

前言:在vue中我们提供了很多标签方法,比如用的比较多的v-for循环内容,v-if/v-show等判断,可以直接写在标签中,大大提高了我们的开发效率,那么在react中有没有类似的方法呢?我们这里来说一说。re…

PCB工艺-四层板制作流程(简单了解下)

一)流程:四层板的内层芯板,是由一张双面覆铜板PP*2铜箔*2覆铜板蚀刻好线路,就是我们的芯板了PP全名叫半固化片,主体是玻璃纤维布环氧树脂,是绝缘介质铜箔片,是单独一张铜箔,很薄&…

无人机三维路径规划

文章目录 1、引言 2、背景知识 3、核心算法 4、挑战与优化 5、初始效果 6、需要改进地方 7、水平方向优化路线 8、垂直方向优化路线 9、与经过路线相交的网格都绘制出来 1、引言 介绍三维路径规划的定义和重要性:在无人机、机器人导航、虚拟现实等领域的应用。 概述文章目标和…

Spring-解决项目依赖异常问题

一.检查项目的Maven路径是否正确在确保新项目中的依赖在自己的电脑中已经存在的情况下:可以检查项目的Maven路径是否正确在拿到一个新项目时,要检查这个项目的Maven路径是自己电脑上设置好的Maven路径吗?如果不是,项目依赖会出问题…

系统设计——DDD领域模型驱动实践

摘要本文主要介绍了DDD(领域驱动设计)在系统设计中的实践应用,包括其在编码规范、分层架构设计等方面的具体要求和建议。重点强调了应用层的命名规范,如避免使用模糊的Handler、Processor等命名,推荐使用动词加业务动作…

开源卫星软件平台LibreCube技术深度解析

LibreCube技术深度解析:开源卫星软件平台的完整指南 LibreCube是一个专为CubeSat设计的模块化开源卫星软件平台,它通过整合姿态控制、通信管理和任务调度等核心功能,为立方星开发者提供了完整的解决方案。本文将全面剖析LibreCube的技术架构…

React(四):事件总线、setState的细节、PureComponent、ref

React(四) 一、事件总线 二、关于setState的原理 1. setState的三种使用方式 (1)基本使用 (2)传入一个回调 (3)第一个参数是对象,第二个参数是回调 2. 为什么setState要设置成异步 (1)提升性能,减少render次数 (2)避免state和props数据不同步 3. 获取异步修改完数…

CPUcores-【硬核优化】CPU增强解锁全部内核!可优化游戏性能、提升帧数!启用CPU全内核+超线程,以更高优先级运行游戏!支持各种游戏和应用优化~

软件介绍(文末获取)CPUCores:游戏性能优化利器‌这款工具,专为优化提升中低配电脑的帧数而生。其独创的CPU资源调度技术,能让老旧硬件焕发新生核心技术原理‌采用「内核级隔离」方案,通过:系统进…

HQA-Attack: Toward High Quality Black-Box Hard-Label Adversarial Attack on Text

文本对抗性攻击分为白盒攻击和黑盒攻击,其中黑盒攻击更贴近现实,又可分为软标签和硬标签设置,。这些名词分别是什么意思 在文本对抗性攻击中,“白盒攻击”“黑盒攻击”以及黑盒攻击下的“软标签”“硬标签”设置,核心差…

PyCharm性能优化与大型项目管理指南

1. PyCharm性能深度调优 1.1 内存与JVM配置优化 PyCharm基于JVM运行,合理配置JVM参数可显著提升性能: # 自定义VM选项文件位置 # Windows: %USERPROFILE%\AppData\Roaming\JetBrains\<product><version>\pycharm64.exe.vmoptions # macOS: ~/Library/Applicat…

基于Java飞算AI的Spring Boot聊天室系统全流程实战

在当今数字化时代&#xff0c;实时通讯已成为现代应用不可或缺的核心功能。从社交平台到企业协作&#xff0c;从在线客服到游戏互动&#xff0c;实时聊天功能正以前所未有的速度渗透到各行各业。然而&#xff0c;开发一个功能完善的聊天室系统绝非易事——传统开发模式下&#…

在 Conda 环境下编译 C++ 程序时报错:version `GLIBCXX_3.4.30‘ not found

报错信息如下 ERROR:/root/SVF/llvm-16.0.4.obj/bin/clang: /opt/miniconda3/envs/py38/lib/libstdc.so.6: version GLIBCXX_3.4.30 not found (required by /root/SVF/llvm-16.0.4.obj/bin/clang)根据错误信息&#xff0c;问题是由于 Conda 环境中的libstdc.so.6缺少GLIBCXX_3…

vue+flask基于Apriori算法规则的求职推荐系统

文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站&#xff0c;有好处&#xff01;编号&#xff1a;F069 基于Apriori关联规则职位相似度的推荐算法进行职位推荐 基于决策树、随机森林的预测薪资 vueflaskmysql爬虫 设计求…