跟着思兼学习Klipper(04) 解决新版 Klipper 不支持中文 gcode 文件问题
前言
原创文章,转载引用请务必注明链接,水平有限,如有疏漏,欢迎指正交流。【思兼 sjqlwy#gmail.com 2021年11月28日】
由于 Klipper 更新频率太高,新功能无法充分在各种情况下进行测试,所以经常有朋友升级之后出现各种报错,无法使用。这里介绍如何解决升级新版 Klipper v0.10.0-167 之后,无法使用含有中文(或者其他特殊符号) gcode 文件的问题。
【2021年12月5日 更新】修复使用 Klipper Python3 后,内存占用显示不正确的问题。
【2021年12月18日 更新】
1、精简版
-
修改 KIAUH 助手脚本,使能 Klipper Python3
# Switch to Python3
sed -i 's|python2|python3|g' ~/kiauh/scripts/install_klipper.sh
-
使用 KIAUH 助手删除旧版 Klipper Python2
-
重新安装 Klipper(Python3)
2、详解版
我之前一直使用的是 0.91 没升级,这次趁着重新调整主板,就想着顺便升级下主板固件,看看新的温敏传感器配置 sensor_type: Generic 3950
是否效果更好。于是问题来了,开始报错。总结一下升级之后会出现的问题及原因:
- Q1:树莓派和主板固件版本不一致 | Klipper 固件由运行在树莓派上的【Klippy】和运行在主板上的【固件】组成,两者相辅相成,并且需要版本尽量一致。并且不管你使用多少块主板都要同步升降级,包括将树莓派作为 MCU 使用的情况。
- Q2:新版 Klipper 固件不支持中文 gcode 文件 | 随着 Python2 停止维护,作者之前说过 新版的 Klipper v0.10.0 会逐渐转向使用 Python3,这次的问题就是 Python2 转 Python3 带来的 non-ASCII 编码问题。Moonraker 则一直使用Python3 开发。
其实关于版本升级,由于 Klipper 更新太快,有些功能用不到,我们挑有用的功能对应的版本升级就可以了。具体可以在四处找到更新信息:
一般大家关注前 2 个就行,第 4 个有些改动则没有被合并到主分支。
2.1 问题描述
我之前上传有中文名称的 gcode 文件正常使用,升级到 v0.10.0-167
后报错,内容如下:
{'message': "'ascii' codec can't decode byte 0xe6 in position 3: ordinal not in range(128)", 'error': 'WebRequestError'} Internal error on command:"M20"
查询手册发现 M20
命令是列出 SD 卡内文件,手动执行也报错,搜索也发现有其他人遇到这个问题(一、二、三)。
2.2 解决方法
方法么,有两种:
2.2.1 使用 Release 版本
cd ~/klipper
# 注意会固定使用 Release 版本无法自动更新
git checkout v0.10.0
# 如果想恢复使用最新版本
git checkout master
2.2.2 使用 Klipper Python3
Klipper 其实一直都在测试迁移到 Python3,相关讨论:
要求是系统安装有 Python v3.6 及以上。对应的开发分支为:work-python3-20211001
我们参考 Python3 support 里面介绍的方法,切换到 Klipper Python3:
# 停止 Klipper 服务
sudo service klipper stop
# 克隆最新的 work-python3-20211001 分支
cd ~/klipper && git fetch && git checkout origin/work-python3-20211001
# 创建 Python 虚拟环境
virtualenv -p python3 ~/python3-env
~/python3-env/bin/pip install -r ~/klipper/scripts/klippy-requirements.txt
# ~/python3-env/bin/python ~/klipper/klippy/klippy.py ~/printer.cfg -l /tmp/klippy.log
# 修改 Klipper 服务内容
sudo nano /etc/systemd/system/klipper.service
# ExecStart=/home/pi/python3-env/bin/python /home/pi/klipper/klippy/klippy.py /home/pi/klipper_config/printer.cfg -l /home/pi/klipper_logs/klippy.log -a /tmp/klippy_uds
# 重新载入 Klipper 配置并重启
sudo systemctl daemon-reload
sudo systemctl restart klipper
此时我们可以看到 Klipper 0.10.0 正常启动,并且 M20
可以正常列出 SD 卡带中文名称的 gcode 文件了。但是这种有个问题,我无法使用最新版的 Klipper 所带来的新功能。于是我们继续查看该分支的最新提交,发现其实新版 Klipper 已经可以较好地运行在 Python2/Python3 上了,只要修改安装脚本 install-octopi.sh
中为 python3
即可。
对应查看 KIAUH 助手,也不支持 Klipper Python3,修改 install_klipper.sh
重新安装,成功。
注意,此种情况会出现在 KIAUH 助手
以及 FluiddPI OS
上,前者是因为尚未切换到 Klipper Python3,后者是因为最新的 Fluidd v1.16.2 发布于2021年07月10日,彼时还停留在 Klipper v0.91 Python2
。
3、修复内存占用显示不正确的问题【已解决】
如下图所示,迁移到 Klipper Python3 后,偶然发现内存占用一直是 100%,参考 statistics: Fix memory usage reading on Python 3 ,进行修复,后续版本估计会更新。
如下图所示修改 klipper/klippy/extras/statistics.py
:
sed -i 's/import os, time, logging/import os, time, logging, io/g' ~/klipper/klippy/extras/statistics.py
sed -i '0,/meminfo/{s/open/io.open/}' ~/klipper/klippy/extras/statistics.py
sed -i '0,/meminfo/{s/rb/r/}' ~/klipper/klippy/extras/statistics.py
sudo systemctl restart klipper
4、 关于自动共振抑制测试的问题
有朋友提问说切换到 Klipper Python3 后,使用 SHAPER_CALIBRATE
命令执行自动测试时会报错,类似 import matplotlib
时提示缺少库。我们以 SHAPER_CALIBRATE
为关键词搜索 Klipper 源码,锁定 klipper/scripts/calibrate_shaper.py
脚本,前两行内容如下:
#!/usr/bin/env python2
# Shaper auto-calibration script
#
# Copyright (C) 2020 Dmitry Butyugin <dmbutyugin@google.com>
# Copyright (C) 2020 Kevin O'Connor <kevin@koconnor.net>
#
# This file may be distributed under the terms of the GNU GPLv3 license.
from __future__ import print_function
import importlib, optparse, os, sys
from textwrap import wrap
import numpy as np, matplotlib
其它共振抑制相关脚本也是如此:
#!/usr/bin/env python
# Script to plot input shapers
我们回过来看 官方文档 关于软件安装部分的命令:
~/klippy-env/bin/pip install -v numpy
sudo apt update
sudo apt install python-numpy python-matplotlib
真相大白:
- Klipper 默认使用 Python2 创建虚拟环境,位于
~/klippy-env/bin/
- numpy 包主要用于数学计算,安装两次:
- 第 1 次安装到 Klipper 虚拟环境,用于测量加速度计噪音等,根据创建时使用 Python2 还是 Python3 安装对应版本
- 第 2 次安装到系统,python-numpy 一般是 Python2,python3-numpy 一般是 Python3
- matplotlib 包主要用于绘图,所以只安装一次
- 默认自动测定命令调用系统的 Python2 而不是虚拟环境中的,当没有安装相关包时就会报错
解决方法:
-
如果继续使用 Python2 来生成数据,请注意正常安装 python-numpy
和 python-matplotlib
包即可
-
如果想使用 Python3 来运行脚本,请不要使用自动测定命令,参考 文档 手动使用 TEST_RESONANCES AXIS=
命令测定 X/Y 即可
sudo apt update
sudo apt install python3-numpy python3-matplotlib
python3 ~/klipper/scripts/calibrate_shaper.py /tmp/resonances_x_*.csv -o /tmp/shaper_calibrate_x.png
python3 ~/klipper/scripts/calibrate_shaper.py /tmp/resonances_y_*.csv -o /tmp/shaper_calibrate_y.png
也可以修改 calibrate_shaper.py
内容为 #!/usr/bin/env python3
,但是使用默认 python2 的脚本比较多,需要一个个修改,相对麻烦一些。
-
可能有用的调试命令:
python -V
~/klippy-env/bin/python -V
# 查看软件包安装状态,第二列 i 代表软件包安装并完成配置,下图代表 python2/3 版本的 numpy 已经正确安装
pi@blv:~ $ dpkg -l *numpy
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-===============-============-============-==================================================================
ii python-numpy 1:1.16.2-1 armhf Numerical Python adds a fast array facility to the Python language
un python2.7-numpy <none> <none> (no description available)
ii python3-numpy 1:1.16.2-1 armhf Fast array facility to the Python 3 language
un python3.7-numpy <none> <none> (no description available)
题外话
欢迎对 Klipper 固件感兴趣,以及对改版 CNC 加工的 Voron 三叉戟、v0、v2.4 感兴趣的朋友加群交流(QQ Group:490111638)