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
英文地址,請注明出處:http://en.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爬蟲 設計求…