{"id":388,"date":"2025-05-26T22:36:11","date_gmt":"2025-05-26T14:36:11","guid":{"rendered":"https:\/\/blog.keruone.cn\/?p=388"},"modified":"2025-05-26T23:39:56","modified_gmt":"2025-05-26T15:39:56","slug":"k230-vision","status":"publish","type":"post","link":"https:\/\/blog.keruone.cn\/index.php\/2025\/05\/26\/k230-vision\/","title":{"rendered":"\u6d59\u6c5f\u7701\u673a\u5668\u4eba\u6bd4\u8d5b-K230 \u89c6\u89c9\u65b9\u6848"},"content":{"rendered":"<h1>\u6d59\u6c5f\u7701\u673a\u5668\u4eba\u6bd4\u8d5b-K230 \u89c6\u89c9\u65b9\u6848<\/h1>\n<p>\u64b0\u5199\u4eba\uff1aKeruone<br \/>\n\u64b0\u5199\u65e5\u671f 2025.5.26<\/p>\n<blockquote><p>\n  \u7531\u4e8e\u603b\u7ed3\u5206\u6790\u90e8\u5206\u4e2d k230\u7684\u7bc7\u5e45\u5360\u7684\u6709\u70b9\u592a\u5927\u4e86\uff0c\u6240\u4ee5\u5c06\u89c6\u89c9\u65b9\u6848\u5355\u72ec\u62ff\u51fa\u6765\u5199\u3002<br \/>\n  \u53ef\u4ee5\u9605\u8bfb<a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/blog.keruone.cn\/wp-content\/uploads\/2025\/05\/K230\u89c6\u89c9.html\">\u6b64\u5904<\/a>\u4e0b\u8f7dhtml\n<\/p><\/blockquote>\n\n<hr \/>\n<h2>1. k230 \u89c6\u89c9\u65b9\u6848<\/h2>\n<p>\u89c6\u89c9\u597d\u554a\uff0c\u53ef\u60dc\u6211\u4eec\u63a2\u7d22\u7684\u4e0d\u7b97\u592a\u591a\u3002<br \/>\n\u6ce8\u610f\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u9ed8\u8ba4\u7684\u6444\u50cf\u5934\uff0c\u4f60\u4f1a\u53d1\u73b0\u89c6\u91ce\u975e\u5e38\u72ed\u9698\uff0c\u6240\u4ee5\u6211\u4eec\u4f7f\u7528\u7684\u662f<strong>160\u5ea6\u7684\u5e7f\u89d2\u955c\u5934<\/strong>\u3002<\/p>\n<h3>1.1 \u89c6\u89c9\u65b9\u6848\u4ecb\u7ecd<\/h3>\n<p>\u5728\u672c\u9879\u76ee\u4e2d\uff0c\u6211\u4eec\u89c6\u89c9\u4e3b\u8981\u662f\u6709\u4ee5\u4e0b\u51e0\u4e2a\u76ee\u6807\uff1a<br \/>\n1. \u53ef\u4ee5\u6446\u8131\u5faa\u8ff9\u7684\u9650\u5236\uff0c\u81ea\u7531\u79fb\u52a8<br \/>\n2. \u53ef\u4ee5\u8bc6\u522b\u5706\u67f1\uff0c\u9632\u6b62\u673a\u68b0\u81c2\u9632\u6b62\u5706\u73af\u65f6\u5b58\u5728\u504f\u5dee\uff0c\u5bfc\u81f4\u9632\u6b62\u5931\u8d25<br \/>\n3. \u53ef\u4ee5\u901a\u8fc7\u89c6\u89c9\u7684\u65b9\u6848\uff0c\u5b9e\u73b0\u6293\u53d6\u5bf9\u65b9\u5f97\u5206\u533a\u7684\u5706\u73af\u548c\u7269\u5757<\/p>\n<p>\u4e3a\u4e86\u8f7b\u4fbf\u5feb\u901f\uff0c\u6211\u4eec\u6700\u7ec8\u51b3\u5b9a\u4f7f\u7528yolov11\u4f5c\u4e3a\u89e3\u51b3\u65b9\u6848\u3002\u6bd5\u7adf\u6bd4\u8f83\u4e0eSAM\u7b49\u89c6\u89c9\u65b9\u6848\uff0cyolo\u5b9e\u5728\u5feb\u7684\u4e0d\u5f97\u4e86\u3002<\/p>\n<h3>1.2 k230 \u4ee3\u7801\u5b9e\u73b0\u548c\u5206\u6790<\/h3>\n<h4>1.2.1 k230 \u6444\u50cf\u5934\u914d\u7f6e<\/h4>\n<p>\u7531\u4e8e\u5b83\u7684\u5bf9\u4e8e\u5355\u4e2a\u6444\u50cf\u5934\u7684\u6848\u4f8b\u8fd8\u80fd\u7528\uff0c\u5c31\u53c2\u8003<a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/wiki.lckfb.com\/zh-hans\/lushan-pi-k230\/image-recog\/use-sensor.html\">\u8fd9\u91cc<\/a>\u5427\u3002\u4e0d\u8fc7\u8fd9\u91cc\u53ea\u662f\u5355\u7eaf\u7684\u4f7f\u7528\u6444\u50cf\u5934\u3002<br \/>\n\u6444\u50cf\u5934\u4e0eyolo(\u6216\u8005\u5176\u5b83AI\u65b9\u6848)\u7684\u7ed3\u5408\u53ef\u4ee5\u4f7f\u7528pipeline\u6765\u642d\u5efa\uff0c\u53ef\u4ee5\u53c2\u8003<a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/www.kendryte.com\/k230_canmv\/zh\/dev\/zh\/example\/ai\/YOLO%E5%A4%A7%E4%BD%9C%E16%88%98.html\">\u8fd9\u91cc<\/a>\u3002<\/p>\n<p>\u4f46\u662f\u8fd9\u6709\u4e00\u4e2a\u95ee\u9898\uff0c\u5b83\u4ee5\u4e0a\u7684\u4ee3\u7801\u9488\u5bf9\u7684\u90fd\u662f\u5355\u6444\u50cf\u5934\uff0c\u5bf9\u4e8e\u591a\u6444\u50cf\u5934\u7684\u914d\u7f6e\u5e76\u6ca1\u6709\u7ed9\u51fa\u3002\u5982\u679c\u4f60\u76f4\u63a5\u4f7f\u7528\u4e24\u6b21pipeline\uff0c\u90a3\u5c31\u5b8c\u4e86\u3002\u8fd9\u91cc\u6211\u89c9\u5f97\u662f\u8fd9\u677f\u5b50\u505a\u7684\u6700\u62c9\u8de8\u7684\u5730\u65b9\u3002<\/p>\n<p>\u5177\u4f53\u7684\u591a\u6444\u50cf\u5934\u914d\u7f6e\u53ef\u4ee5\u53c2\u8003\u540e\u6587<a class=\"wp-editor-md-post-content-link\" href=\"#vision-code\">\u89c6\u89c9\u4ee3\u7801<\/a><br \/>\n<strong>\u4e0d\u8fc7\u9700\u8981\u6ce8\u610f\uff01\u4f7f\u7528\u4e86\u591a\u6444\u50cf\u5934\u540e\uff0c\u5ef6\u8fdf\u4f1a\u5927\u5927\u589e\u52a0\uff01\u672c\u6765\u5355\u6444\u50cf\u5934\u4e00\u8f6e\u7684\u95f4\u9694\u5927\u7ea6\u4e3a50ms\uff0c\u73b0\u5728\u4e00\u8f6e\u5927\u7ea6\u4e3a200ms\uff01<\/strong><\/p>\n<h4>1.2.2 k230 yolov11\u914d\u7f6e<\/h4>\n<p>\u6570\u636e\u5f88\u91cd\u8981\uff0c\u4f46\u662f\u975e\u5e38\u53ef\u60dc\uff0c\u6211\u4eec\u53ea\u80fd\u81ea\u5df1\u62cd\u6444\u6570\u636e\u96c6\u3002\u6240\u4ee5\u5148\u5206\u4eab\u6211\u4eec\u83b7\u53d6\u56fe\u7247\u7684\u4ee3\u7801<\/p>\n<pre><code class=\"language-python line-numbers\"># \u83b7\u53d6\u56fe\u7247\u7684\u4ee3\u7801\nimport time, os, sys\n\nfrom machine import Pin\nfrom machine import FPIOA\nfrom media.sensor import *\nfrom media.display import *\nfrom media.media import *\n\nsensor_id = 1\nsensor = None\n\n# \u521b\u5efaFPIOA\u5bf9\u8c61\uff0c\u7528\u4e8e\u521d\u59cb\u5316\u5f15\u811a\u529f\u80fd\u914d\u7f6e\nfpioa = FPIOA()\nfpioa.set_function(53,FPIOA.GPIO53)\n\n# \u6309\u952e\u5f15\u811a\u4e3a53\uff0c\u6309\u4e0b\u65f6\u4e3a\u9ad8\u7535\u5e73\uff0c\u6240\u4ee5\u8fd9\u91cc\u8bbe\u7f6e\u4e3a\u4e0b\u62c9\u5e76\u8bbe\u7f6e\u4e3a\u8f93\u5165\u6a21\u5f0f\nbutton = Pin(53, Pin.IN, Pin.PULL_DOWN)  # \u4f7f\u7528\u4e0b\u62c9\u7535\u963b\n\n# \u663e\u793a\u6a21\u5f0f\u9009\u62e9\uff1a\u53ef\u4ee5\u662f \"VIRT\"\u3001\"LCD\" \u6216 \"HDMI\"\nDISPLAY_MODE = \"LCD\"\n\n# \u6839\u636e\u6a21\u5f0f\u8bbe\u7f6e\u663e\u793a\u5bbd\u9ad8\nif DISPLAY_MODE == \"VIRT\":\n    # \u865a\u62df\u663e\u793a\u5668\u6a21\u5f0f\n    DISPLAY_WIDTH = ALIGN_UP(1920, 16)\n    DISPLAY_HEIGHT = 1080\nelif DISPLAY_MODE == \"LCD\":\n    # 3.1\u5bf8\u5c4f\u5e55\u6a21\u5f0f\n    DISPLAY_WIDTH = 800\n    DISPLAY_HEIGHT = 480\nelif DISPLAY_MODE == \"HDMI\":\n    # HDMI\u6269\u5c55\u677f\u6a21\u5f0f\n    DISPLAY_WIDTH = 1920\n    DISPLAY_HEIGHT = 1080\nelse:\n    raise ValueError(\"\u672a\u77e5\u7684 DISPLAY_MODE\uff0c\u8bf7\u9009\u62e9 'VIRT', 'LCD' \u6216 'HDMI'\")\n\n# \u5b9a\u4e49\u4fdd\u5b58\u76ee\u5f55\nsave_dir = \".\/sdcard\/saved_photos\"\n\ntry:\n    # \u6784\u9020\u4e00\u4e2a\u5177\u6709\u9ed8\u8ba4\u914d\u7f6e\u7684\u6444\u50cf\u5934\u5bf9\u8c61\n    sensor = Sensor(id=sensor_id)\n    # \u91cd\u7f6e\u6444\u50cf\u5934sensor\n    sensor.reset()\n\n    # \u65e0\u9700\u8fdb\u884c\u955c\u50cf\u7ffb\u8f6c\n    # \u8bbe\u7f6e\u6c34\u5e73\u955c\u50cf\n    # sensor.set_hmirror(False)\n    # \u8bbe\u7f6e\u5782\u76f4\u7ffb\u8f6c\n    sensor.set_vflip(False)\n\n    # \u8bbe\u7f6e\u901a\u90530\u7684\u8f93\u51fa\u5c3a\u5bf8\u4e3a\u663e\u793a\u5206\u8fa8\u7387\n    sensor.set_framesize(width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, chn=CAM_CHN_ID_0)\n    # \u8bbe\u7f6e\u901a\u90530\u7684\u8f93\u51fa\u50cf\u7d20\u683c\u5f0f\u4e3aRGB565\n    sensor.set_pixformat(Sensor.RGB565, chn=CAM_CHN_ID_0)\n\n    sensor.set_framesize(width=1920, height=1080, chn=CAM_CHN_ID_1)\n    # \u8bbe\u7f6e\u901a\u90530\u7684\u8f93\u51fa\u50cf\u7d20\u683c\u5f0f\u4e3aRGB565\n    sensor.set_pixformat(Sensor.RGB565, chn=CAM_CHN_ID_1)\n\n    # \u6839\u636e\u6a21\u5f0f\u521d\u59cb\u5316\u663e\u793a\u5668\n    if DISPLAY_MODE == \"VIRT\":\n        Display.init(Display.VIRT, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, fps=60)\n    elif DISPLAY_MODE == \"LCD\":\n        Display.init(Display.ST7701, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)\n    elif DISPLAY_MODE == \"HDMI\":\n        Display.init(Display.LT9611, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)\n\n    # \u521d\u59cb\u5316\u5a92\u4f53\u7ba1\u7406\u5668\n    MediaManager.init()\n    # \u542f\u52a8\u4f20\u611f\u5668\n    sensor.run()\n\n    try:\n        files = os.listdir(save_dir)\n        photo_files = [f for f in files if f.startswith(\"photo\") and f.endswith(\".jpg\")]\n        max_idx = -1\n        for f in photo_files:\n            try:\n                idx = int(f.replace(\"photo\", \"\").replace(\".jpg\", \"\"))\n                if idx &gt; max_idx:\n                    max_idx = idx\n            except:\n                pass\n\n        i = max_idx + 1\n        print(f\"\u68c0\u6d4b\u5230{len(photo_files)}\u5f20\u7167\u7247\uff0c\u5c06\u4ece\u7f16\u53f7{i}\u5f00\u59cb\u4fdd\u5b58\")\n    except:\n        i = 0\n\n\n    while True:\n        os.exitpoint()\n\n        # \u6355\u83b7\u901a\u90530\u7684\u56fe\u50cf\n        img = sensor.snapshot(chn=CAM_CHN_ID_0)\n\n        img1 = sensor.snapshot(chn=CAM_CHN_ID_1)\n\n        # \u663e\u793a\u6355\u83b7\u7684\u56fe\u50cf\uff0c\u4e2d\u5fc3\u5bf9\u9f50\uff0c\u5c45\u4e2d\u663e\u793a\n        Display.show_image(img)\n        #\u6309\u952e\u6309\u4e0b\u4fdd\u5b58\u56fe\u7247\n        if button.value() == 1:\n            time.sleep(0.02)\n            if button.value() == 1:\n                try:\n                    save_path = f\".\/sdcard\/saved_photos\/photo{i}.jpg\"\n                    img1.save(save_path)\n                    print(f\"\u4fdd\u5b58\u5230\u5f53\u524d\u76ee\u5f55\u6210\u529f: {save_path}\")\n                except Exception as e:\n                    print(f\"\u4fdd\u5b58\u5230\u5f53\u524d\u76ee\u5f55\u5931\u8d25: {e}\")\n\n                time.sleep(0.1)\n                i += 1\n\n\nexcept KeyboardInterrupt as e:\n    print(\"\u7528\u6237\u505c\u6b62: \", e)\nexcept BaseException as e:\n    print(f\"\u5f02\u5e38: {e}\")\nfinally:\n    # \u505c\u6b62\u4f20\u611f\u5668\u8fd0\u884c\n    if isinstance(sensor, Sensor):\n\n        sensor.stop()\n    # \u53cd\u521d\u59cb\u5316\u663e\u793a\u6a21\u5757\n    Display.deinit()\n    os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)\n    time.sleep_ms(100)\n    # \u91ca\u653e\u5a92\u4f53\u7f13\u51b2\u533a\n    MediaManager.deinit()\n\n<\/code><\/pre>\n<p>\u6b64\u5916\uff0c\u4e3a\u4e86\u65b9\u4fbf\u56fe\u7247\u7684\u5904\u7406\uff0c\u6211\u4eec\u8fd8\u7f16\u5199\u4e86\u5982\u4e0b\u51e0\u6bb5\u5c0f\u4ee3\u7801<\/p>\n<details>\n<summary>yolo\u8bad\u7ec3\u7684yaml\u6587\u4ef6<\/summary>\n<pre><code class=\"language-yaml line-numbers\">train: C:\\\\Users\\\\G\\\\Desktop\\\\robot-git\\\\yoloRobot\\\\data\\\\images\\\\train\nval: C:\\\\Users\\\\G\\\\Desktop\\\\robot-git\\\\yoloRobot\\\\data\\\\images\\\\val\ntest: C:\\\\Users\\\\G\\\\Desktop\\\\robot-git\\\\yoloRobot\\\\data\\\\images\\\\test\n\nnc: 9\n\n# Classes\nnames: \n  0: platform\n  1: column\n  2: block\n  3: red_score\n  4: blue_score\n  5: red_circle\n  6: blue_circle\n  7: platform_red\n  8: platform_blue\n\n\n<\/code><\/pre>\n<\/details>\n<details>\n<summary>0 \u56fe\u7247\u6279\u91cf\u6dfb\u52a0\u524d\u540e\u7f00<\/summary>\n<pre><code class=\"language-python line-numbers\">import os\nimport datetime\n\n# ====== \u5728\u8fd9\u91cc\u4fee\u6539\u914d\u7f6e ======\nFOLDER_PATH = \"train_photo0523_2\"  # \u8981\u5904\u7406\u7684\u6587\u4ef6\u5939\u8def\u5f84\nADD_PREFIX = \"0523\"             # \u8981\u6dfb\u52a0\u7684\u524d\u7f00\uff0c\u7559\u7a7a\u5219\u4e0d\u6dfb\u52a0\nADD_SUFFIX = \"\"               # \u8981\u5728\u6269\u5c55\u540d\u524d\u6dfb\u52a0\u7684\u540e\u7f00\uff0c\u7559\u7a7a\u5219\u4e0d\u6dfb\u52a0\nADD_DATE = False                  # \u662f\u5426\u6dfb\u52a0\u65e5\u671f\nDATE_FORMAT = \"%Y%m%d\"           # \u65e5\u671f\u683c\u5f0f\nDATE_POSITION = \"prefix\"         # \u65e5\u671f\u4f4d\u7f6e\uff1a\"prefix\"\u6dfb\u52a0\u5230\u5f00\u5934\uff0c\"suffix\"\u6dfb\u52a0\u5230\u6269\u5c55\u540d\u524d\n# ===========================\n\ndef batch_rename_files():\n    \"\"\"\u6279\u91cf\u4fee\u6539\u6587\u4ef6\u540d\"\"\"\n    # \u83b7\u53d6\u5f53\u524d\u65e5\u671f\n    date_str = datetime.datetime.now().strftime(DATE_FORMAT) if ADD_DATE else ''\n\n    # \u904d\u5386\u6587\u4ef6\u5939\n    for filename in os.listdir(FOLDER_PATH):\n        # \u83b7\u53d6\u6587\u4ef6\u5b8c\u6574\u8def\u5f84\n        old_path = os.path.join(FOLDER_PATH, filename)\n\n        # \u8df3\u8fc7\u76ee\u5f55\n        if os.path.isdir(old_path):\n            continue\n\n        # \u5206\u79bb\u6587\u4ef6\u540d\u548c\u6269\u5c55\u540d\n        name, ext = os.path.splitext(filename)\n\n        # \u6784\u5efa\u65b0\u6587\u4ef6\u540d\n        if DATE_POSITION == 'prefix':\n            new_name = f\"{ADD_PREFIX}{date_str}{name}{ADD_SUFFIX}{ext}\"\n        else:  # suffix\n            new_name = f\"{ADD_PREFIX}{name}{ADD_SUFFIX}{date_str}{ext}\"\n\n        # \u65b0\u6587\u4ef6\u5b8c\u6574\u8def\u5f84\n        new_path = os.path.join(FOLDER_PATH, new_name)\n\n        # \u91cd\u547d\u540d\u6587\u4ef6\n        try:\n            os.rename(old_path, new_path)\n            print(f\"Renamed: {filename} -&gt; {new_name}\")\n        except Exception as e:\n            print(f\"Error renaming {filename}: {e}\")\n\nif __name__ == '__main__':\n    # \u786e\u8ba4\u914d\u7f6e\n    print(\"=== \u6587\u4ef6\u91cd\u547d\u540d\u914d\u7f6e ===\")\n    print(f\"\u5904\u7406\u6587\u4ef6\u5939: {FOLDER_PATH}\")\n    print(f\"\u6dfb\u52a0\u524d\u7f00: '{ADD_PREFIX}'\")\n    print(f\"\u6dfb\u52a0\u540e\u7f00: '{ADD_SUFFIX}'\")\n    print(f\"\u6dfb\u52a0\u65e5\u671f: {ADD_DATE} ({DATE_FORMAT})\")\n    print(f\"\u65e5\u671f\u4f4d\u7f6e: {DATE_POSITION}\")\n    print(\"====================\")\n\n    input(\"\u6309Enter\u952e\u5f00\u59cb\u91cd\u547d\u540d\uff0c\u6216Ctrl+C\u53d6\u6d88...\")\n\n    # \u8c03\u7528\u51fd\u6570\n    batch_rename_files()\n    print(\"\u6587\u4ef6\u91cd\u547d\u540d\u5b8c\u6210\uff01\")\n<\/code><\/pre>\n<\/details>\n<details>\n<summary>1 \u81ea\u5df1\u64b0\u5199\u7684\u56fe\u7247\u589e\u5f3a\uff08\u53ef\u4ee5\u4e0d\u7528\uff09\uff08\u5f53\u7136\u4f60\u4e5f\u53ef\u4ee5\u4f7f\u7528Albumentations\u7b49\u73b0\u6210\u7684\u5305\uff09<\/summary>\n<pre><code class=\"language-python line-numbers\"><\/code><\/pre>\n<\/details>\n<details>\n<summary>2.yolo\u8bad\u7ec3\u4ee3\u7801<\/summary>\n<pre><code class=\"language-python line-numbers\">import os\nfrom ultralytics import YOLO\n\n# \u5207\u6362\u5f53\u524d\u5de5\u4f5c\u76ee\u5f55\u5230changed_path\ncurrent_path = \"C:\\\\Users\\\\G\\\\Desktop\\\\robot-git\\\\yoloRobot\"\nimgSavePath = \"\/ImgDetectResult\"\nos.chdir(current_path)\n\n# Load a pretrained YOLO11n model\nmodel = YOLO(\"yolov11\\weights\\yolo11s.pt\")\n\n\ntrain_results = model.train(\n    data=\"data.yaml\",  # Path to dataset configuration file\n    epochs=100,  # Number of training epochs\n    imgsz=224,  # Image size for training\n    device='cpu',  # Device to run on (e.g., 'cpu', 0, [0,1,2,3])\n)  \n# \u5982\u679c\u4f60\u8981\u7528GPU\uff0c\u90a3\u5c31\u7f51\u4e0a\u81ea\u5df1\u4e86\u89e3\u5427\uff01\n\n<\/code><\/pre>\n<\/details>\n<details>\n<summary>3. yolo\u8bad\u7ec3\u6a21\u578b\u8f6c\u6362\u4e3ak230\u7684kmodel\u4ee3\u7801\uff0c\u53ca\u9519\u8bef\u5206\u6790<\/summary>\n<pre><code class=\"language-python line-numbers\"># \u5c06 pt \u6a21\u578b\u8f6c\u6362\u4e3a kmodel \u6a21\u578b\n# \u53c2\u8003https:\/\/developer.canaan-creative.com\/k230_canmv\/zh\/main\/zh\/example\/ai\/YOLO%E5%A4%A7%E4%BD%9C%E6%88%98.html#yolo11\n\n# \u6309\u7167\u5982\u4e0b\u547d\u4ee4\uff0c\u5bf9 runs\/classify\/exp\/weights \u4e0b\u7684 pt \u6a21\u578b\u5148\u5bfc\u51fa\u4e3a onnx \u6a21\u578b\uff0c\u518d\u8f6c\u6362\u6210 kmodel \u6a21\u578b\uff1a\n\n# # \u5bfc\u51faonnx\uff0cpt\u6a21\u578b\u8def\u5f84\u8bf7\u81ea\u884c\u9009\u62e9\n# yolo export model=runs\/classify\/train\/weights\/best.pt format=onnx imgsz=224\n# cd test_yolo11\/classify\n# # \u8f6c\u6362kmodel,onnx\u6a21\u578b\u8def\u5f84\u8bf7\u81ea\u884c\u9009\u62e9\uff0c\u751f\u6210\u7684kmodel\u5728onnx\u6a21\u578b\u540c\u7ea7\u76ee\u5f55\u4e0b\n# python to_kmodel.py --target k230 --model ..\/..\/runs\/classify\/train\/weights\/best.onnx --dataset ..\/test --input_width 224 --input_height 224 --ptq_option 0\n# cd ..\/..\/\n# \"\"\"\n# # Error list 1\uff1a\n# Traceback (most recent call last):\n#   File \"C:\\Users\\G\\Desktop\\robot-git\\yoloRobot\\test_yolo11\\classify\\to_kmodel.py\", line 7, in &lt;module&gt;\n#     import nncase\n#   File \"C:\\Users\\G\\.conda\\envs\\yoloRobot\\lib\\site-packages\\nncase\\__init__.py\", line 34, in &lt;module&gt;\n#     import _nncase\n# ImportError: DLL load failed while importing _nncase: \u627e\u4e0d\u5230\u6307\u5b9a\u7684\u6a21\u5757\u3002\n# \u89e3\u51b3\u65b9\u6cd5\uff1a https:\/\/github.com\/kendryte\/nncase\/issues\/451\n#   \u6211\u4e0b\u8f7d\u4e86 \u76f8\u5173 dll \u6587\u4ef6\uff0c\u5e76 Place 64-bit DLLs in the '\/Windows\/System32' directory.\n# \"\"\"\n\n# \"\"\"\n# # Error list 2\uff1a\n# warn: Nncase.Hosting.PluginLoader[0]\n#       NNCASE_PLUGIN_PATH is not set.\n# C:\\Users\\G\\Desktop\\robot-git\\yoloRobot\\test_yolo11\\classify\\to_kmodel.py:24: DeprecationWarning: `mapping.TENSOR_TYPE_TO_NP_TYPE` is now deprecated and will be removed in a future release.To silence this warning, please use `helper.tensor_dtype_to_np_dtype` instead.\n#   input_dict['dtype'] = onnx.mapping.TENSOR_TYPE_TO_NP_TYPE[onnx_type.elem_type]\n# WARNING: The argument `input_shapes` is deprecated. Please use `overwrite_input_shapes` and\/or `test_input_shapes` instead. An \n# error will be raised in the future.\n# Unhandled exception. System.Collections.Generic.KeyNotFoundException: The given key 'k230' was not present in the dictionary.\n#    at System.Collections.Generic.Dictionary`2.get_Item(TKey key)\n#    at Nncase.Targets.TargetProvider.GetTarget(String name)\n#    at Nncase.CompilerServicesProvider.GetTarget(String name)\n#    at Nncase.Compiler.Interop.CApi.TargetCreate(Byte* targetNamePtr, UIntPtr targetNameLength)\n# # \u89e3\u51b3\u65b9\u6cd5\uff1a\n#   1. \u89e3\u51b3NNCASE_PLUGIN_PATH is not set.\n#       \u5b89\u88c5&lt;2.0.0\u7248\u672c\u7684nncase\n#       \u53c2\u8003\uff1ahttps:\/\/blog.csdn.net\/Lieber_0402\/article\/details\/132021911\n#   2. \u89e3\u51b3WARNING: The argument `input_shapes` is deprecated. Please use `overwrite_input_shapes` and\/or `test_input_shapes` instead. An error will be raised in the future.\n#       onnx-simplifier\u6539\u62100.3.6.\uff08\u5176\u5b9e\u6211\u672c\u6765\u4f3c\u4e4e\u90fd\u6ca1\u6709\u8fd9\u4e2a\u5305\uff09\n#       \u53c2\u8003\uff1ahttps:\/\/github.com\/kendryte\/nncase\/issues\/909\n# * \u6700\u7ec8\u89e3\u51b3\u65b9\u6cd5\uff1a****************************************************************************\n#   1. \u95ee\u9898\u4ea7\u751f\u539f\u56e0\uff1anncase_kpu-2.9.0-py2.py3-none-win_amd64.whl \u8bef\u88c5\u4e3a nncase-2.9.0-cp310-cp310-win_amd64.whl\n#   2. \u5378\u8f7dnncase-2.9.0-cp310-cp310-win_amd64.whl\n#   3. \u5b89\u88c5nncase_kpu-2.9.0-py2.py3-none-win_amd64.whl\n# \"\"\"\nimport os\nimport shutil\n\n\nworking_path = \"C:\\\\Users\\\\G\\\\Desktop\\\\robot-git\"\npt_model_path = \"yoloRobot\/runs\/detect\/train20\/weights\/best.pt\"\ntempConvertPath = \"yoloRobot\/tempForConvert\"\ntest_yolo11_path = \"yoloRobot\/test_yolo11\"\ndataset_path = \"yoloRobot\/data\/images\/train\"\ndataset_path = os.path.join(working_path, dataset_path)\n\nos.chdir(working_path)\n\nif __name__ == \"__main__\":\n    ## Step 1: Copy the pt model to the tempConvertPath\n    command1 = f\"yolo export model={pt_model_path} format=onnx imgsz=224\"   # \u6ce8\u610f\uff0c\u8be5\u547d\u4ee4\u751f\u6210\u7684\u4f4d\u7f6e\u540cpt\u6a21\u578b\u540c\u7ea7\u76ee\u5f55\u4e0b\n    os.system(command1)  # \u5bfc\u51faonnx\u6a21\u578b\n    # \u751f\u6210\u7684onnx\u6a21\u578b\u8def\u5f84\n    onnx_model_path = os.path.join(working_path, pt_model_path.replace(\".pt\", \".onnx\"))\n\n    # ## Step 2: Change directory to test_yolo11\/classify\n    # # \u5207\u6362\u5230 test_yolo11\/classify \u76ee\u5f55\n    # classify_path = os.path.join(test_yolo11_path, \"classify\")\n    # os.chdir(classify_path)\n\n    ## Step 2: Change directory to test_yolo11\/detect\n    # \u5207\u6362\u5230 test_yolo11\/detect \u76ee\u5f55\n    classify_path = os.path.join(test_yolo11_path, \"detect\")\n    os.chdir(classify_path)\n\n    ## Step 3: Convert the onnx model to kmodel\n    command3 = f\"python to_kmodel.py --target k230 --model {onnx_model_path} --dataset {dataset_path} --input_width 224 --input_height 224 --ptq_option 0\"\n    os.system(command3)  # \u8f6c\u6362kmodel\u6a21\u578b\n\n\"\"\"\n\u867d\u7136\u4f1a\u6709\u4e00\u4e9b\u8b66\u544a\u4fe1\u606f\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u80fd\u6210\u529f\u8f6c\u6362\u4e3akmodel\u6a21\u578b\u7684\u3002\n\u6ce8\u610f\uff1a\u8f6c\u6362\u540e\u7684kmodel\u6a21\u578b\u5728onnx\u6a21\u578b\u540c\u7ea7\u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u4e3a best.kmodel\u3002\n\"\"\"\n<\/code><\/pre>\n<\/details>\n<h4>1.2.3 k230 \u4e32\u53e3\u914d\u7f6e<\/h4>\n<p>\u6211\u4eec\u662f\u6253\u7b97\u4f7f\u7528\u4e32\u53e3\uff0c\u6765\u5c06\u6700\u7ec8\u7684\u8bc6\u522b\u7ed3\u679c\u4f20\u8f93\u7ed9\u5355\u7247\u673a\u7684\uff0c\u591a\u4ee5\u4e32\u53e3\u662f\u5fc5\u4e0d\u53ef\u5c11\u7684<\/p>\n<pre><code class=\"language-python line-numbers\">fpioa = FPIOA()\nfpioa.set_function(11, FPIOA.UART2_TXD)\nfpioa.set_function(12, FPIOA.UART2_RXD)\nuart = UART(UART.UART2, baudrate=115200, bits=UART.EIGHTBITS, parity=UART.PARITY_NONE, stop=UART.STOPBITS_ONE)\n#---------------- \u6570\u636e\u53d1\u9001\u914d\u7f6e ----------------\nframe_header = 0xAA\nuartDataRead = None\nyoloTarget = 10\n\n# \u53d1\u9001\u6570\u636e\u51fd\u6570\nimport ustruct\n\ndef k230_yolo_send_data(single_yolo_data, uart, Sensor_Num):\n    \"\"\"\u672c\u51fd\u6570\u4e13\u95e8\u6839\u636e\u5f53\u524d\u4ee3\u7801\u7684yolodata\u683c\u5f0f\u53d1\u9001\u6570\u636e\uff0c\n    \u53d1\u9001\u683c\u5f0f\u4e3a\uff1a\u5e27\u5934+\u6570\u636e\u4e2a\u6570+\u6570\u636e+\u6821\u9a8c\u548c\n    \u53d1\u9001 [center_x, center_y, bbx_width, bbx_height, \u5206\u7c7b\u53f7]\n    \u7f6e\u4fe1\u5ea6\u5c0f\u4e8e0.5\u7684\u6570\u636e\u4e0d\u53d1\u9001\n\n    args:\n        single_yolo_data: yolodata\u6570\u636e[center_x, center_y, bbx_width, bbx_height, \u7f6e\u4fe1\u5ea6, \u5206\u7c7b\u53f7]\n        uart: UART\u5bf9\u8c61\uff0c\u7528\u4e8e\u53d1\u9001\u6570\u636e\n    \"\"\"\n    # \u5e27\u5934\u4f7f\u7528 frame_header\n    # \u5c06\u5750\u6807\u8f6c\u6362\u4e3a\u5b9e\u9645\u50cf\u7d20\u503c\uff0c\u5e76\u786e\u4fdd\u5728u16\u8303\u56f4\u5185(0-65535)\n    center_x = int(single_yolo_data[0]) &amp; 0xFFFF  # 16\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n    center_y = int(single_yolo_data[1]) &amp; 0xFFFF  # 16\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n    bbx_width = int(single_yolo_data[2]) &amp; 0xFFFF  # 16\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n    bbx_height = int(single_yolo_data[3]) &amp; 0xFFFF  # 16\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n    # \u4e0d\u53d1\u9001\u7f6e\u4fe1\u5ea6\n    class_id = int(single_yolo_data[5]) &amp; 0xFF  # 8\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n    Sensor_Num = int(Sensor_Num) &amp; 0xFF  # 8\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n\n    # \u7f6e\u4fe1\u5ea6\u5c0f\u4e8e0.5\u7684\u6570\u636e\u4e0d\u53d1\u9001\n    if single_yolo_data[4] &lt; 0.5:\n        return\n\n\n    data_num = 10\n    # \u8ba1\u7b97\u6821\u9a8c\u548c\n    checksum = (frame_header +\n               (data_num &amp; 0xFF) +\n               ((center_x &gt;&gt; 8) &amp; 0xFF) + (center_x &amp; 0xFF) +\n               ((center_y &gt;&gt; 8) &amp; 0xFF) + (center_y &amp; 0xFF) +\n               ((bbx_width &gt;&gt; 8) &amp; 0xFF) + (bbx_width &amp; 0xFF) +\n               ((bbx_height &gt;&gt; 8) &amp; 0xFF) + (bbx_height &amp; 0xFF) +\n               class_id + Sensor_Num) &amp; 0xFF\n\n\n    # \u521b\u5efa\u6570\u636e\u5305\n    data = bytearray()\n#    data.append(0x00)\n    data.append(frame_header)  # \u5e27\u5934\n    data.append(data_num)  # \u6570\u636e\u4e2a\u6570\n\n    # \u4f7f\u7528ustruct\u6253\u5305u16\u6570\u636e\n    data.extend(ustruct.pack('&lt;B', (center_x&gt;&gt;8 &amp; 0XFF)))  # \u5c0f\u7aef\u5e8f16\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n    data.extend(ustruct.pack('&lt;B', center_x &amp; 0XFF))  # \u5c0f\u7aef\u5e8f16\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n    data.extend(ustruct.pack('&lt;B', (center_y&gt;&gt;8) &amp; 0XFF))  # \u5c0f\u7aef\u5e8f16\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n    data.extend(ustruct.pack('&lt;B', center_y &amp; 0XFF))  # \u5c0f\u7aef\u5e8f16\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n    data.extend(ustruct.pack('&lt;B', (bbx_width&gt;&gt;8) &amp; 0XFF))  # \u5c0f\u7aef\u5e8f16\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n    data.extend(ustruct.pack('&lt;B', bbx_width &amp; 0XFF))  # \u5c0f\u7aef\u5e8f16\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n    data.extend(ustruct.pack('&lt;B', (bbx_height&gt;&gt;8) &amp; 0XFF))  # \u5c0f\u7aef\u5e8f16\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n    data.extend(ustruct.pack('&lt;B', bbx_height &amp; 0XFF))  # \u5c0f\u7aef\u5e8f16\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n    data.append(class_id)  # \u5206\u7c7b\u53f7(8\u4f4d)\n    data.append(Sensor_Num)  # \u5206\u7c7b\u53f7(8\u4f4d)\n\n    # \u6dfb\u52a0\u6821\u9a8c\u548c\n    data.append(checksum)\n\n    # \u53d1\u9001\u6570\u636e\n    uart.write(data)\n#----------------------------------------------\n\n<\/code><\/pre>\n<p>\u4f46\u662f\u53ea\u6709\u8fd9\u6837\u8fd8\u4e0d\u591f\uff0c\u7531\u4e8e\u4e00\u6b21\u53ea\u80fd\u53d1\u9001\u4e00\u4e2a\u5bf9\u8c61\uff0c\u6240\u4ee5\u6211\u4eec\u9700\u8981\u4e00\u4e2a\u9014\u5f84\uff0c\u80fd\u591f\u8ba9\u63a5\u6536\u65b9\u81ea\u52a8\u9009\u62e9\u9700\u8981\u4ec0\u4e48\u6837\u7684\u6570\u636e\u3002<br \/>\n\u56e0\u6b64\uff0c\u6211\u4eec\u5728\u4ee3\u7801\u4e2d\uff0c\u6dfb\u52a0\u4e00\u4e2a\u63a5\u6536\u7684\u90e8\u5206\u3002\u5355\u7247\u673a\u53ef\u4ee5\u901a\u8fc7\u4e32\u53e3\u5411k230\u53d1\u9001\u4fe1\u606f\uff0c\u7d22\u8981\u6307\u5b9a\u5bf9\u8c61\u7684\u6570\u636e\u3002<\/p>\n<pre><code class=\"language-python line-numbers\">       uartDataRead = uart.read()\n        if uartDataRead:  # \u68c0\u67e5\u6570\u636e\u662f\u5426\u975e\u7a7a\n            try:\n                # \u786e\u4fdd\u7b2c\u4e00\u4e2a\u5b57\u7b26\u662f\u6570\u5b57\uff0c\u5e76\u8f6c\u6362\u4e3a\u6574\u6570\n#                uartDataRead = int(uartDataRead.decode('ascii')[0])\n                uartDataRead = uartDataRead[0]  # \u83b7\u53d6\u7b2c\u4e00\u4e2a\u5b57\u8282\u7684\u6574\u6570\u503c\n                print(\"Received: {}\".format(uartDataRead))\n                yoloTarget = uartDataRead\n            except (IndexError, ValueError) as e:\n                # \u5904\u7406\u53ef\u80fd\u7684\u9519\u8bef\uff1a\n                # - IndexError: uartDataRead \u662f\u7a7a\u5b57\u7b26\u4e32\uff08\u65e0\u6cd5\u53d6 [0]\uff09\n                # - ValueError: \u9996\u5b57\u7b26\u4e0d\u662f\u6570\u5b57\uff08int() \u8f6c\u6362\u5931\u8d25\uff09\n                print(\"Error: Invalid data received -\", e)\n                yoloTarget = None  # \u6216\u8bbe\u7f6e\u9ed8\u8ba4\u503c\n        else:\n            print(\"Warning: No data received from UART\")\n#                yoloTarget = None  # \u6216\u8bbe\u7f6e\u9ed8\u8ba4\u503c\n\n        print(f\"YoloTargetNow:{yoloTarget}\")\n<\/code><\/pre>\n<p><span id=\"\u4f7f\u7528\u4e8e\u5c0f\u8f66\u7684\u89c6\u89c9\u4ee3\u7801\"><\/span><\/p>\n<details>\n<summary id=\"vision-code\">\u4f7f\u7528\u4e8e\u5c0f\u8f66\u7684\u89c6\u89c9\u4ee3\u7801\u5982\u4e0b\uff1a<\/summary>\n<pre><code class=\"language-python line-numbers\">import time\nimport os\nimport sys\n\nfrom media.sensor import *\nfrom media.display import *\nfrom media.media import *\n\nfrom libs.YOLO import YOLO11\nimport os,sys,gc\nimport image\n\nimport ulab.numpy as np\n#----------------- \u4e32\u53e3\u5bfc\u5165 -----------------\nimport time\nfrom machine import UART\nfrom machine import FPIOA\nfrom machine import Pin\n#----------------- \u4e32\u53e3\u914d\u7f6e -----------------\nfpioa = FPIOA()\nfpioa.set_function(11, FPIOA.UART2_TXD)\nfpioa.set_function(12, FPIOA.UART2_RXD)\nuart = UART(UART.UART2, baudrate=115200, bits=UART.EIGHTBITS, parity=UART.PARITY_NONE, stop=UART.STOPBITS_ONE)\n#data = b''\n#---------------- kmodel \u914d\u7f6e ------------------\nkmodel_path1 = \"\/data\/yoloKmodel\/best.kmodel\"\nkmodel_path2 = \"\/data\/yoloKmodel\/best2.kmodel\"\nkmodel_path3 = \"\/data\/yoloKmodel\/best3.kmodel\"\nkmodel_path4 = \"\/data\/yoloKmodel\/best0523.kmodel\"\n\nlabels1 =  [\"floor\", \"pile\", \"column\", \"platform\", \"red_score\", \"blue_score\", \"red_start\", \"blue_start\", \"block\", \"red_circle\", \"blue_circle\"]\nlabels2 =  [\"platform\", \"column\", \"block\", \"red_score\", \"blue_score\", \"red_circle\", \"blue_circle\", \"platform_red\", \"platform_blue\"]\n\n#----------------- LED\u914d\u7f6e -----------------\nfpioa.set_function(62,FPIOA.GPIO62)\nLED = Pin(20, Pin.OUT, pull=Pin.PULL_NONE, drive=7)  # \u7ea2\u706f62 \u84dd\u706f63 \u7eff\u706f20\nLED.high()  # \u5173\u95ed\u7ea2\u706f\n#---------------- \u6570\u636e\u53d1\u9001\u914d\u7f6e ----------------\nframe_header = 0xAA\nuartDataRead = None\nyoloTarget = 10\n\n# \u53d1\u9001\u6570\u636e\u51fd\u6570\nimport ustruct\n\ndef k230_yolo_send_data(single_yolo_data, uart, Sensor_Num):\n    \"\"\"\u672c\u51fd\u6570\u4e13\u95e8\u6839\u636e\u5f53\u524d\u4ee3\u7801\u7684yolodata\u683c\u5f0f\u53d1\u9001\u6570\u636e\uff0c\n    \u53d1\u9001\u683c\u5f0f\u4e3a\uff1a\u5e27\u5934+\u6570\u636e\u4e2a\u6570+\u6570\u636e+\u6821\u9a8c\u548c\n    \u53d1\u9001 [center_x, center_y, bbx_width, bbx_height, \u5206\u7c7b\u53f7]\n    \u7f6e\u4fe1\u5ea6\u5c0f\u4e8e0.5\u7684\u6570\u636e\u4e0d\u53d1\u9001\n\n    args:\n        single_yolo_data: yolodata\u6570\u636e[center_x, center_y, bbx_width, bbx_height, \u7f6e\u4fe1\u5ea6, \u5206\u7c7b\u53f7]\n        uart: UART\u5bf9\u8c61\uff0c\u7528\u4e8e\u53d1\u9001\u6570\u636e\n    \"\"\"\n    # \u5e27\u5934\u4f7f\u7528 frame_header\n    # \u5c06\u5750\u6807\u8f6c\u6362\u4e3a\u5b9e\u9645\u50cf\u7d20\u503c\uff0c\u5e76\u786e\u4fdd\u5728u16\u8303\u56f4\u5185(0-65535)\n    center_x = int(single_yolo_data[0]) &amp; 0xFFFF  # 16\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n    center_y = int(single_yolo_data[1]) &amp; 0xFFFF  # 16\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n    bbx_width = int(single_yolo_data[2]) &amp; 0xFFFF  # 16\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n    bbx_height = int(single_yolo_data[3]) &amp; 0xFFFF  # 16\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n    # \u4e0d\u53d1\u9001\u7f6e\u4fe1\u5ea6\n    class_id = int(single_yolo_data[5]) &amp; 0xFF  # 8\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n    Sensor_Num = int(Sensor_Num) &amp; 0xFF  # 8\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n\n    # \u7f6e\u4fe1\u5ea6\u5c0f\u4e8e0.5\u7684\u6570\u636e\u4e0d\u53d1\u9001\n    if single_yolo_data[4] &lt; 0.5:\n        return\n\n\n    data_num = 10\n    # \u8ba1\u7b97\u6821\u9a8c\u548c\n    checksum = (frame_header +\n               (data_num &amp; 0xFF) +\n               ((center_x &gt;&gt; 8) &amp; 0xFF) + (center_x &amp; 0xFF) +\n               ((center_y &gt;&gt; 8) &amp; 0xFF) + (center_y &amp; 0xFF) +\n               ((bbx_width &gt;&gt; 8) &amp; 0xFF) + (bbx_width &amp; 0xFF) +\n               ((bbx_height &gt;&gt; 8) &amp; 0xFF) + (bbx_height &amp; 0xFF) +\n               class_id + Sensor_Num) &amp; 0xFF\n\n\n    # \u521b\u5efa\u6570\u636e\u5305\n    data = bytearray()\n#    data.append(0x00)\n    data.append(frame_header)  # \u5e27\u5934\n    data.append(data_num)  # \u6570\u636e\u4e2a\u6570\n\n    # \u4f7f\u7528ustruct\u6253\u5305u16\u6570\u636e\n    data.extend(ustruct.pack('&lt;B', (center_x&gt;&gt;8 &amp; 0XFF)))  # \u5c0f\u7aef\u5e8f16\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n    data.extend(ustruct.pack('&lt;B', center_x &amp; 0XFF))  # \u5c0f\u7aef\u5e8f16\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n    data.extend(ustruct.pack('&lt;B', (center_y&gt;&gt;8) &amp; 0XFF))  # \u5c0f\u7aef\u5e8f16\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n    data.extend(ustruct.pack('&lt;B', center_y &amp; 0XFF))  # \u5c0f\u7aef\u5e8f16\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n    data.extend(ustruct.pack('&lt;B', (bbx_width&gt;&gt;8) &amp; 0XFF))  # \u5c0f\u7aef\u5e8f16\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n    data.extend(ustruct.pack('&lt;B', bbx_width &amp; 0XFF))  # \u5c0f\u7aef\u5e8f16\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n    data.extend(ustruct.pack('&lt;B', (bbx_height&gt;&gt;8) &amp; 0XFF))  # \u5c0f\u7aef\u5e8f16\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n    data.extend(ustruct.pack('&lt;B', bbx_height &amp; 0XFF))  # \u5c0f\u7aef\u5e8f16\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\n    data.append(class_id)  # \u5206\u7c7b\u53f7(8\u4f4d)\n    data.append(Sensor_Num)  # \u5206\u7c7b\u53f7(8\u4f4d)\n\n    # \u6dfb\u52a0\u6821\u9a8c\u548c\n    data.append(checksum)\n\n    # \u53d1\u9001\u6570\u636e\n    uart.write(data)\n#----------------------------------------------\n\n# sensor0 \u4e3a\u722a\u5b50\u6444\u50cf\u5934\nsensor0 = None\nsensor0_id = 0\nsensor0_AI_chn = CAM_CHN_ID_2\n\n# sensor1 \u4e3a\u5706\u53f0\u6444\u50cf\u5934\nsensor1 = None\nsensor1_id = 1\nsensor1_AI_chn = CAM_CHN_ID_1\n\n\ntry:\n    print(\"camera_test\")\n\n    # \u6784\u5efa Sensor \u5bf9\u8c61 sensor0\n    sensor0 = Sensor(id=sensor0_id)\n    sensor0.reset()\n    sensor0.set_hmirror(1)\n    sensor0.set_vflip(1)\n    # \u7ed1\u5b9a\u901a\u9053 0 \u5230\u663e\u793a VIDEO1 \u5c42\n    sensor0.set_framesize(width=960, height=540)\n    sensor0.set_pixformat(PIXEL_FORMAT_YUV_SEMIPLANAR_420)\n    #    # \u7ed1\u5b9a\u901a\u9053 2 \u5230AI\n    sensor0.set_framesize(width=1280, height=720, chn=sensor0_AI_chn)\n    sensor0.set_pixformat(PIXEL_FORMAT_RGB_888_PLANAR, chn=sensor0_AI_chn)\n\n    bind_info = sensor0.bind_info(x=0, y=0, chn=CAM_CHN_ID_0)\n    Display.bind_layer(**bind_info, layer=Display.LAYER_VIDEO1)\n\n    # \u6784\u5efa Sensor \u5bf9\u8c61 sensor1\n    sensor1 = Sensor(id=sensor1_id)\n    sensor1.reset()\n    # \u7ed1\u5b9a\u901a\u9053 0 \u5230\u663e\u793a VIDEO1 \u5c42\n    sensor1.set_framesize(width=960, height=540)\n    sensor1.set_pixformat(PIXEL_FORMAT_YUV_SEMIPLANAR_420)\n    #    # \u7ed1\u5b9a\u901a\u9053 2 \u5230AI\n    sensor1.set_framesize(width=1280, height=720, chn=sensor1_AI_chn)\n    sensor1.set_pixformat(PIXEL_FORMAT_RGB_888_PLANAR, chn=sensor1_AI_chn)\n\n    bind_info = sensor1.bind_info(x=960, y=0, chn=CAM_CHN_ID_0)\n    Display.bind_layer(**bind_info, layer=Display.LAYER_VIDEO2)\n\n    # \u521d\u59cb\u5316 HDMI \u548c IDE \u8f93\u51fa\u663e\u793a\uff0c\u82e5\u5c4f\u5e55\u65e0\u6cd5\u70b9\u4eae\uff0c\u8bf7\u53c2\u8003 API \u6587\u6863\u4e2d\u7684 K230_CanMV_Display \u6a21\u5757 API \u624b\u518c\u8fdb\u884c\u914d\u7f6e\n    Display.init(Display.LT9611, to_ide=True)\n    # \u521d\u59cb\u5316\u5a92\u4f53\u7ba1\u7406\u5668\n    MediaManager.init()\n\n    # \u591a\u6444\u573a\u666f\u4ec5\u9700\u6267\u884c\u4e00\u6b21 run\n    sensor0.run()\n\n\n    # ------------------------ YOLO\u914d\u7f6e -----------------------------\n    display_mode=\"lcd\"\n    rgb888p_size=[1280,720]\n    if display_mode==\"hdmi\":\n        display_size=[1920,1080]\n        screen_width = 1920\n        screen_height = 1080\n    else:\n        display_size=[800,480]\n        screen_width = 800\n        screen_height = 480\n    kmodel_path=kmodel_path4    # path\n    labels = labels2\n    confidence_threshold = 0.8\n    model_input_size=[224,224]\n    yolo=YOLO11(task_type=\"detect\",mode=\"video\",kmodel_path=kmodel_path,labels=labels,rgb888p_size=rgb888p_size,model_input_size=model_input_size,display_size=display_size,conf_thresh=confidence_threshold,debug_mode=0)\n    yolo.config_preprocess()\n\n    if labels == labels2:\n        platform_num = 0\n    else:\n        platform_num = 3\n\n    rgb888p_img  = None\n    img_data = None\n#    temptime = time.ticks_ms()\n    while True:\n        # ========================== \u8bfb\u53d6\u6570\u636e ==========================\n        uartDataRead = uart.read()\n        if uartDataRead:  # \u68c0\u67e5\u6570\u636e\u662f\u5426\u975e\u7a7a\n            try:\n                # \u786e\u4fdd\u7b2c\u4e00\u4e2a\u5b57\u7b26\u662f\u6570\u5b57\uff0c\u5e76\u8f6c\u6362\u4e3a\u6574\u6570\n#                uartDataRead = int(uartDataRead.decode('ascii')[0])\n                uartDataRead = uartDataRead[0]  # \u83b7\u53d6\u7b2c\u4e00\u4e2a\u5b57\u8282\u7684\u6574\u6570\u503c\n                print(\"Received: {}\".format(uartDataRead))\n                yoloTarget = uartDataRead\n            except (IndexError, ValueError) as e:\n                # \u5904\u7406\u53ef\u80fd\u7684\u9519\u8bef\uff1a\n                # - IndexError: uartDataRead \u662f\u7a7a\u5b57\u7b26\u4e32\uff08\u65e0\u6cd5\u53d6 [0]\uff09\n                # - ValueError: \u9996\u5b57\u7b26\u4e0d\u662f\u6570\u5b57\uff08int() \u8f6c\u6362\u5931\u8d25\uff09\n                print(\"Error: Invalid data received -\", e)\n                yoloTarget = None  # \u6216\u8bbe\u7f6e\u9ed8\u8ba4\u503c\n        else:\n            print(\"Warning: No data received from UART\")\n#                yoloTarget = None  # \u6216\u8bbe\u7f6e\u9ed8\u8ba4\u503c\n\n        print(f\"YoloTargetNow:{yoloTarget}\")\n        # ========================== \u722a\u5b50\u6444\u50cf\u5934 ==========================\n        LED.low()   # \u70b9\u4eae\u5f53\u524d\u9009\u62e9\u7684LED\n        rgb888p_img = sensor0.snapshot(chn=sensor0_AI_chn)\n        img_data = rgb888p_img.to_numpy_ref()\n#        print(f\"sen1\u8f6c\u6362\u6570\u636e\u65f6\u7684\u65f6\u95f4\uff1a{time.ticks_ms() - temptime}\")\n        res = yolo.run(img_data)\n#        print(f\"sen1 yolo \u65f6\u95f4\uff1a{time.ticks_ms() - temptime}\")\n        if len(res)!=0:\n            for sub_res in res:\n                if sub_res[5]==yoloTarget:    # \u6b64\u5904\u4e3a\u6d4b\u8bd5\uff0c\u5b9e\u9645\u4f7f\u7528\u5e94\u9009\u62e9\u5706\u53f0\uff0c\u5373\u7f16\u53f73\n                    k230_yolo_send_data(sub_res, uart, 0)\n#                    print(\"0 Send Successful\")\n#                    print(f\"sen1 yolo \u95f4\u9694\uff1a{time.ticks_ms() - temptime}\")\n#                    temptime = time.ticks_ms()\n\n        # ========================== \u5faa\u8ff9\u6444\u50cf\u5934 ==========================\n        LED.high()  # \u7184\u706d\u5f53\u524d\u9009\u62e9\u7684LED\n        rgb888p_img = sensor1.snapshot(chn=sensor1_AI_chn)\n        img_data = rgb888p_img.to_numpy_ref()\n        res = yolo.run(img_data)\n        if len(res)!=0:\n            for sub_res in res:\n                if sub_res[5]==platform_num:    # \u6b64\u5904\u4e3a\u6d4b\u8bd5\uff0c\u5b9e\u9645\u4f7f\u7528\u5e94\u9009\u62e9\u5706\u53f0\uff0c\u5373\u7f16\u53f73\n                    k230_yolo_send_data(sub_res, uart, 1)\n#                    print(\"1 Send Successful\")\n#                    print(f\"sen1 yolo \u95f4\u9694\uff1a{time.ticks_ms() - temptime}\")\n#                    temptime = time.ticks_ms()\n\n        os.exitpoint()\n#        print(f\"\u4e00\u8f6e\u7684\u65f6\u95f4\uff1a{time.ticks_ms() - temptime}\")\n#        temptime = time.ticks_ms()\n#        time.sleep(1)\nexcept KeyboardInterrupt as e:\n    print(\"\u7528\u6237\u505c\u6b62\")\nexcept BaseException as e:\n    print(f\"\u5f02\u5e38: '{e}'\")\nfinally:\n    # \u6bcf\u4e2a sensor \u90fd\u9700\u8981\u6267\u884c stop\n    if isinstance(sensor0, Sensor):\n        sensor0.stop()\n    if isinstance(sensor1, Sensor):\n        sensor1.stop()\n    # \u9500\u6bc1\u663e\u793a\n    Display.deinit()\n    os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)\n    time.sleep_ms(100)\n    # \u91ca\u653e\u5a92\u4f53\u7f13\u51b2\u533a\n    MediaManager.deinit()\n\n\n<\/code><\/pre>\n<\/details>\n<p>\u5927\u8f66\u540c\u7406\u3002<\/p>\n<h3>1.3 \u5355\u7247\u673a\u63a5\u6536&amp;\u5904\u7406 K230 \u4ee3\u7801<\/h3>\n<h4>1.3.1 \u5355\u7247\u673a\u4e32\u53e3\u63a5\u6536\u6570\u636e<\/h4>\n<p>\u9996\u5148\uff0c\u6211\u4eec\u5148\u8fdb\u884c\u4e32\u53e3\u7684\u914d\u7f6e\uff0c\u5982\u4e0b\u6240\u793a\uff0c\u6bd4\u65b9\u6211\u4eec\u8981\u4f7f\u7528USART1\uff1a<\/p>\n<pre><code class=\"language-c line-numbers\">\/* USART1 init function *\/\n\nvoid MX_USART1_UART_Init(void)\n{\n  huart1.Instance = USART1;\n  huart1.Init.BaudRate = 115200;\n  huart1.Init.WordLength = UART_WORDLENGTH_8B;\n  huart1.Init.StopBits = UART_STOPBITS_1;\n  huart1.Init.Parity = UART_PARITY_NONE;\n  huart1.Init.Mode = UART_MODE_TX_RX;\n  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;\n  huart1.Init.OverSampling = UART_OVERSAMPLING_16;\n  if (HAL_UART_Init(&amp;huart1) != HAL_OK)\n  {\n    Error_Handler();\n  }\n    HAL_UART_Receive_IT(&amp;huart1,(uint8_t *)&amp;uart1_rx,1);\n    \/\/ \u542f\u52a8\u4e32\u53e3\u63a5\u6536\u4e2d\u65ad\uff0c\u63a5\u65361\u4e2a\u5b57\u8282\n    \/\/ \u6ce8\u610f\uff1a\u8fd9\u91cc\u7684uart1_rx\u662f\u4e00\u4e2a\u5168\u5c40\u53d8\u91cf\uff0c\u7528\u4e8e\u5b58\u50a8\u63a5\u6536\u5230\u7684\u6570\u636e\n    \/\/       \u4f60\u9700\u8981\u5728\u4ee3\u7801\u4e2d\u5b9a\u4e49\u8fd9\u4e2a\u53d8\u91cf\uff0c\u5982\uff1auint8_t uart1_rx = 0;\n}\n<\/code><\/pre>\n<p>\u63a5\u7740\uff0c\u6211\u4eec\u5148\u5b9a\u4e49\u4e00\u4e9btype\uff0c\u5206\u522b\u7528\u6765\u8868\u793a\u63a5\u6536\u5230\u7684\u6570\u636e\u548c\u5904\u7406\u540e\u7684\u6570\u636e<\/p>\n<pre><code class=\"language-c line-numbers\">\/\/ \u76f8\u5173\u5b9a\u4e49\n\/\/ \u7528\u4e8e\u63a5\u6536\ntypedef struct\n{\n    uint8_t RxDataPtr;      \/\/ \u63a5\u6536\u6570\u636e\u6307\u9488\n    uint8_t RxData[DataNum];      \/\/ \u63a5\u6536\u5230\u7684\u6570\u636e\n    uint8_t ValidData[DataNum];   \/\/ \u6709\u6548\u7684\u6570\u636e\n\n}k230_UART_Rx_t;\n\n\/\/ \u7528\u4e8e\u5904\u7406\u540e\u7684\u6570\u636e\ntypedef struct\n{\n    uint16_t x_center;\n    uint16_t y_center;\n    uint16_t x_width;\n    uint16_t y_height;\n    uint8_t label_num;\n    uint8_t sensor_num;\n\n    uint16_t x_left;\n    uint16_t y_up;\n    uint16_t x_right;\n    uint16_t y_down;\n\n}k230_Item_Type;\n\n\/\/ \u76f8\u5173\u53d8\u91cf\nk230_UART_Rx_t k230_1_Rx;\nk230_UART_Rx_t k230_1_Rx_0;\nk230_UART_Rx_t k230_1_Rx_1;\nk230_UART_Rx_t* k230_1_Rx_x;\n\nk230_Item_Type k230_Item_0; \/\/ \u722a\u5b50\nk230_Item_Type k230_Item_1; \/\/ \u5706\u53f0\nk230_Item_Type k230_Item_2; \/\/ \u5907\u7528\nk230_Item_Type k230_Item_3; \/\/ \u5907\u7528\n<\/code><\/pre>\n<p>\u5b9e\u9645\u7684\u63a5\u6536\u4ee3\u7801\u5982\u4e0b<\/p>\n<pre><code class=\"language-c line-numbers\">\/**\n * @brief: \u4e00\u4e2a\u5b57\u8282\u4e2d\u65ad\u63a5\u6536\uff0c\u5728 \u56de\u8c03\u51fd\u6570\u4e2d\u8c03\u7528\n * @param {type}\n * @retval: None\n *\/\nvoid k230_GetChar(uint8_t pData, k230_UART_Rx_t* k230_UART_Rx) {\n    \/\/ \u4e32\u53e3\n    if (k230_UART_Rx-&gt;RxDataPtr &gt;= DataNum) {\n        k230_UART_Rx-&gt;RxDataPtr = 0;\n        return;\n    }\n    \/\/ \u4fe1\u606f\u7ed3\u6784\uff1a\u5e27\u5934+\u6570\u636e\u957f\u5ea6+\u6570\u636e+\u6821\u9a8c\u548c\n    if (k230_UART_Rx-&gt;RxDataPtr == 0 &amp;&amp; pData == k230_FRAME_START) {  \/\/ \u5e27\u5934\n        \/\/ \u5982\u679c\u662f\u5e27\u5934\n        k230_UART_Rx-&gt;RxData[k230_UART_Rx-&gt;RxDataPtr++] = pData;\n    } else if (k230_UART_Rx-&gt;RxDataPtr == 1) {\n        \/\/ \u5982\u679c\u662f\u6570\u636e\u957f\u5ea6\n        k230_UART_Rx-&gt;RxData[k230_UART_Rx-&gt;RxDataPtr++] = pData;  \/\/ num\n    } else if (k230_UART_Rx-&gt;RxDataPtr !=0 &amp;&amp; k230_UART_Rx-&gt;RxDataPtr &lt; ((k230_UART_Rx-&gt;RxData[1] &amp; 0x0f) + 3)) {\n        \/\/ \u5982\u679c\u662f\u6570\u636e ( \u5224\u65ad\u6761\u4ef6\u662f\u6570\u636e\u957f\u5ea6+3\uff0c3\u662f\u5e27\u5934+\u6570\u636e\u957f\u5ea6+\u6821\u9a8c\u548c )\n        k230_UART_Rx-&gt;RxData[k230_UART_Rx-&gt;RxDataPtr++] = pData;\n\n        \/\/ \u5982\u679c\u662f\u6700\u540e\u4e00\u4e2a\u6570\u636e\uff08\u5373\u6821\u9a8c\u548c\uff09\n        if (k230_UART_Rx-&gt;RxDataPtr == ((k230_UART_Rx-&gt;RxData[1] &amp; 0x0f) + 3)) {  \/\/ \u63a5\u6536\u5b8c\u6210\n            \/\/ \u6821\u9a8c\n            if (k230_check_SUM(k230_UART_Rx-&gt;RxData, k230_UART_Rx-&gt;RxDataPtr)) {\n                tickGetData = HAL_GetTick();\n                for (uint8_t i = 0; i &lt; ((k230_UART_Rx-&gt;RxData[1] &amp; 0x0f) + 3); i++){\n                    k230_UART_Rx-&gt;ValidData[i] = k230_UART_Rx-&gt;RxData[i];  \/\/ \u6570\u636e\u5b58\u50a8\n\/\/                    printf (\"%d\\n\", k230_UART_Rx-&gt;ValidData[i]);\n                }\n                \/\/ New Added 2025.5.3\n                if(k230_UART_Rx-&gt;ValidData[11] == 0){\n                    k230_1_Rx_0 = *k230_UART_Rx;\n                }\n                else{\n                    k230_1_Rx_1 = *k230_UART_Rx;\n                }\n            }\n            else{\n\/\/                printf(\"error\\n\");\n            }\n            k230_UART_Rx-&gt;RxDataPtr = 0;\n        }\n    } else\n        k230_UART_Rx-&gt;RxDataPtr = 0;\n}\n<\/code><\/pre>\n<p>\u6821\u9a8c\u548c\u8ba1\u7b97\u5982\u4e0b:<\/p>\n<pre><code class=\"language-c line-numbers\">\/**\n * @brief: SUM\u6821\u9a8c\uff0c\u4f20\u8f93\u6821\u9a8c\n * @param {type}\n * @retval: None\n *\/\nuint8_t k230_check_SUM(uint8_t* pData, uint8_t length) {\n    uint16_t sum = 0;\n    for (uint8_t i = 0; i &lt; length - 1; i++) {\n        sum += pData[i];\n    }\n    if ((uint8_t)sum == pData[length - 1])\n        return 1;\n    return 0;\n}\n<\/code><\/pre>\n<p>\u5176\u6b21\uff0c\u8bb0\u5f97\u5728hal\u7684\u4e2d\u65ad\u4e2d\u8c03\u7528\u76f8\u5173\u51fd\u6570\uff0c\u5982<\/p>\n<pre><code class=\"language-c line-numbers\">  if (huart-&gt;Instance == USART1)\n  {\n        k230_GetChar(uart1_rx,&amp;k230_1_Rx);\n      __HAL_UART_CLEAR_OREFLAG(&amp;huart1);\n        HAL_UART_Receive_IT(&amp;huart1, (uint8_t *)&amp;uart1_rx, 1);  \n  }\n<\/code><\/pre>\n<p>\u63a5\u7740\uff0c\u5bf9\u5f97\u5230\u7684\u6570\u636e\u8fdb\u884c\u5904\u7406<\/p>\n<pre><code class=\"language-c line-numbers\">\/**\n * @brief: \u7528\u4e8e\u5728\u7a0b\u5e8f\u4e2d\u8c03\u7528\u5e76\u5904\u7406\u7684\u51fd\u6570\n * \n*\/\nvoid k230_GetData(k230_Item_Type * k230_Item, uint8_t sensor_num) {\n    if (sensor_num == 0)\n        k230_1_Rx_x = &amp;k230_1_Rx_0;\n    else\n        k230_1_Rx_x = &amp;k230_1_Rx_1;\n\n    k230_Item-&gt;sensor_num = k230_1_Rx_x-&gt;ValidData[11];\n    if (HAL_GetTick() - tickGetData &gt; NO_TRANSMIT_TIME){    \n        k230_ClearData(k230_Item);\n    }\n    else{\n        k230_Item-&gt;x_left = (k230_1_Rx_x-&gt;ValidData[2]&lt;&lt;8) + k230_1_Rx_x-&gt;ValidData[3];\n        k230_Item-&gt;y_up = (k230_1_Rx_x-&gt;ValidData[4]&lt;&lt;8) + k230_1_Rx_x-&gt;ValidData[5];\n        k230_Item-&gt;x_right = (k230_1_Rx_x-&gt;ValidData[6]&lt;&lt;8) + k230_1_Rx_x-&gt;ValidData[7];\n        k230_Item-&gt;y_down = (k230_1_Rx_x-&gt;ValidData[8]&lt;&lt;8) + k230_1_Rx_x-&gt;ValidData[9];\n        k230_Item-&gt;label_num = k230_1_Rx_x-&gt;ValidData[10];\n        k230_Item-&gt;x_center = (k230_Item-&gt;x_left + k230_Item-&gt;x_right)\/2;\n        k230_Item-&gt;y_center = (k230_Item-&gt;y_up + k230_Item-&gt;y_down)\/2;\n        k230_Item-&gt;x_width = k230_Item-&gt;x_right - k230_Item-&gt;x_left;\n        k230_Item-&gt;y_height = k230_Item-&gt;y_down - k230_Item-&gt;y_up;\n    }   \/\/\u66f4\u6539\u62ec\u53f7\u4f4d\u7f6e\u4ece\u4e0b\u9762\u79fb\u52a8\u5230\u4e0a\u9762\n\n}\n<\/code><\/pre>\n<p>\u81f3\u6b64\uff0c\u5355\u7247\u673a\u83b7\u53d6\u6570\u636e\u7684\u4ee3\u7801\u5df2\u7ecf\u64b0\u5199\u5b8c\u6bd5<\/p>\n<h4>1.3.2 \u5355\u7247\u673a\u4e32\u53e3\u53d1\u9001\u9700\u8981\u7684\u6570\u636e<\/h4>\n<p>\u9996\u5148\uff0c\u6211\u4eec\u5148\u8fdb\u884c\u7b80\u5355\u7684\u5b8f\u5b9a\u4e49\uff0c\u8868\u9762\u6211\u4eec\u9700\u8981\u7684yolo\u8bc6\u522b\u5bf9\u8c61<\/p>\n<pre><code class=\"language-c line-numbers\">#define LABEL0_PLATFORM            0\n#define LABEL0_COLUMN          1\n#define LABEL0_BLOCK           2\n#define LABEL0_RED_SCORE       3\n#define LABEL0_BLUE_SCORE      4\n#define LABEL0_RED_CIRCLE      5\n#define LABEL0_BLUE_CIRCLE     6\n#define LABEL0_PLATFORM_RED        7\n#define LABEL0_PLATFORM_BLUE   8\n<\/code><\/pre>\n<p>\u63a5\u7740\uff0c\u6211\u4eec\u9700\u8981\u4e00\u4e2a\u51fd\u6570\uff0c\u6765\u53d1\u9001\u6570\u636e\u7ed9k230<\/p>\n<pre><code class=\"language-c line-numbers\">HAL_StatusTypeDef k230_SendData(uint8_t number)\n{\n  return HAL_UART_Transmit(&amp;huart1, &amp;number, 1, 100); \/\/ 100ms\u8d85\u65f6\n}\n\n<\/code><\/pre>\n<h4>1.3.3 \u4e00\u4e9b\u57fa\u4e8ek230\u4f20\u8f93\u6570\u636e\u7684\u5e94\u7528<\/h4>\n<p>\u6839\u636e\u8fd9\u4e9b\u6570\u636e\uff0c\u5176\u5b9e\u53ef\u4ee5\u505a\u7684\u5904\u7406\u5df2\u7ecf\u6709\u5f88\u591a\u4e86<br \/>\n\u5b9e\u9645\uff0c\u6211\u4eec\u5b8c\u6210\u4e86\u5c0f\u8f66\u6839\u636e\u5de6\u4fa7\u6444\u50cf\u5934\u7684\u5bf9\u4e8e\u5706\u53f0\u7684\u8bc6\u522b\u7ed3\u679c\uff0c\u6765\u81ea\u52a8\u65cb\u8f6c\u9a7e\u9a76,\u5373\uff1a\u5f53\u5706\u53f0\u56fe\u50cf\u592a\u5927\uff0c\u8bf4\u660e\u5c0f\u8f66\u592a\u8fd1\u4e86\uff0c\u6b64\u65f6\u5c0f\u8f66\u5e94\u8be5\u8fdc\u79bb\uff1b\u5f53\u5706\u53f0\u56fe\u50cf\u592a\u5c0f\uff0c\u8bf4\u660e\u5c0f\u8f66\u592a\u8fdc\u4e86\uff0c\u6b64\u65f6\u5c0f\u8f66\u5e94\u8be5\u9760\u8fd1\u3002\u5982\u679c\u5706\u53f0\u9760\u5de6\uff0c\u8bf4\u660e\u5c0f\u8f66\u7684\u8f66\u5934\u6709\u70b9\u5f80\u5916\u504f\uff0c\u5e94\u8be5\u77eb\u6b63\u56de\u6765\uff0c\u53cd\u4e4b\u540c\u7406\u3002<br \/>\n\u5982:<\/p>\n<pre><code class=\"language-c line-numbers\">\/**\n * @brief: \u6839\u636e\u89c6\u89c9\u5185\u5bb9pid\u77eb\u6b63\n * @param {None}\n * @retval: Speed Correct\n *\/\nint32_t k230_PID(k230_Item_Type * k230_Item){\n    int32_t diff_x_cent, diff_y_cent, diff_width, diff_height;\n    int32_t speed_correct = 0;  \/\/ outter plus this value, inner sub this value\n\n    if(k230_Item-&gt;x_left == 0 &amp;&amp; k230_Item-&gt;x_right == 0)\n        return 0;\n\n    \/\/ postive mean too far down\n    \/\/ shoule inner increase, outter decrease\n    diff_x_cent =   SCREEN_X_CENTER -   k230_Item-&gt;x_center ;\n    \/\/ postive mean too close\n    \/\/ shoule inner increase, outter decrease   \n    diff_width  =   PLATFORM_WIDTH  -   k230_Item-&gt;x_width      ;\n\n\n\/\/  printf(\"%d %d\\n\",x_center, x_width);    \/\/ \u8c03\u8bd5\u63a5\u53e3\n    diff_cent_acc   +=  diff_x_cent;\n    diff_width_acc  +=  diff_width;\n\n    \/\/ \u8ba1\u7b97\u77eb\u6b63\u503c\n    speed_correct   =   k230_KP_CENT    *   diff_x_cent     + \\\n                        k230_KI_CENT    *   diff_cent_acc   + \\\n                        k230_KD_CENT    *   (diff_x_cent - diff_cent_last)  ;\n    speed_correct   +=  k230_KP_WIDTH   *   diff_width      + \\\n                        k230_KI_WIDTH   *   diff_width_acc  + \\\n                        k230_KD_WIDTH   *   (diff_width - diff_width_last)  ;\n\n    \/\/ \u66f4\u6539\u4e0a\u4e00\u6b21\u504f\u5dee\u91cf\n    diff_cent_last  =   diff_x_cent;\n    diff_width_last =   diff_width;\n\n    return speed_correct;\n}\n\n\/**\n* @brief: \u8ba9\u5c0f\u8f66\u8f6c\u5708\n* @param {int32_t S_Speed} \u5c0f\u8f66\u7684\u901f\u5ea6\n* @retval: None\n*\/\nuint8_t BreakFlag = 0;\nvoid Go_Circle(int32_t S_Speed)\n{\n    int32_t PID_Correct;\n    int32_t inner_speed;\n    int32_t outter_speed;\n    uint32_t in_while_Time = 0;\n    k230_Item_Type *k230_Item_Ptr = &amp;k230_Item_1;\n\n    while (1)\n    {\n        k230_GetData(k230_Item_Ptr, SENSOR_Platform);\n        if (k230_Item_Ptr-&gt;x_center == 0 &amp;&amp; k230_Item_Ptr-&gt;x_width == 0)\n        {\n            \/\/ \u5982\u679c\u6ca1\u6709\u4f20\u8f93\u6570\u636e\n            \/\/ 1. \u5148\u4fdd\u6301\u539f\u6709\u901f\u5ea6\u884c\u8fdb\u4e00\u6bb5\u65f6\u95f4\n            Set_speed(500, 500, 500, 500);\n            OSTimeDly(1000);\n            \/\/ 2. \u518d\u6b21\u68c0\u6d4b\n            k230_GetData(k230_Item_Ptr, SENSOR_Platform);\n            \/\/ 3. \u5982\u679c\u4ecd\u7136\u68c0\u6d4b\u4e0d\u5230\uff0c\u5219\u539f\u5730\u8f6c\u5708\u76f4\u5230\u68c0\u6d4b\u5230\n            if (k230_Item_Ptr-&gt;x_center == 0 &amp;&amp; k230_Item_Ptr-&gt;x_width == 0)\n            {\n                Set_speed(500, -500, -500, 500);\n                in_while_Time = HAL_GetTick();\n                while (k230_Item_Ptr-&gt;x_center == 0 &amp;&amp; k230_Item_Ptr-&gt;x_width == 0)\n                {\n                    if (HAL_GetTick() - in_while_Time &gt; 1500)\n                        break;\n                    k230_GetData(k230_Item_Ptr, SENSOR_Platform);\n                }\n            }\n        }\n        \/\/      else{\n        \/\/ \u5982\u679c\u6709\u6570\u636e\u4f20\u8f93\n        PID_Correct = k230_PID(k230_Item_Ptr);\n        inner_speed = (OUT_RATIO_IN * S_Speed - PID_Correct);\n        outter_speed = (S_Speed + PID_Correct);\n        \/\/ \u5de6\u4e0a \u53f3\u4e0a \u53f3\u4e0b \u5de6\u4e0b\n        Set_speed(inner_speed, outter_speed, outter_speed, inner_speed);\n        \/\/      }\n        OSTimeDly(1);\n        if(BreakFlag == 1)\n            break;\n    }\n}\n ```\n\u722a\u5b50\u8ddf\u968f\u540c\u7406\uff0c\u4ee5\u4e0b\u662f\u722a\u5b50\u8ddf\u968f\u7684\u4ee3\u7801\n```c\nfloat k230_Arm4_Column_Correct(k230_Item_Type * k230_Item){\n    \/\/ \u5982\u679c\u6ca1\u6709\u6570\u636e\uff0c\u5219\u9000\u51fa\n    if (k230_Item-&gt;x_left == 0 &amp;&amp; k230_Item-&gt;x_right == 0)\n        return 0;\n\n    printf(\"y_center: %d\", (int)(k230_Item-&gt;y_center));\n    printf(\"y_height: %d\", (int)(k230_Item-&gt;y_height));\n    return (float)(k230_Item-&gt;x_center - Column_Target_x_center) * Arm4_Cofficient; \/\/ \u8ba1\u7b97\u8235\u673a\u8f6c\u52a8\u7684\u89d2\u5ea6\n}\nvoid Arm_See() \/\/\u673a\u68b0\u81c2\u8c03\u6574\u89d2\u5ea6\uff0ck230\u770b\n{\n    \/\/ \u66f4\u6539\u53c2\u6570\uff0c\u539f\u6765\u53c2\u6570\u89c1\u8001\u7248\u4ee3\u7801\n    \/\/ \u89c2\u5bdf\u673a\u68b0\u81c2\u6a2a\u5411\u4f4d\u7f6e\n    SetServoAngle(4,174);   \/\/ 177\n    SetServoAngle(1,180);\n    while(ServoTunnerOK() != 1);    \n    SetServoAngle(2,162);   \/\/ \u539f\u6765157\n    SetServoAngle(3,111);   \/\/ \u539f\u676596\n    Correct_Arm4_With_K230(174,20); \/\/ \u8c03\u6574\u4e91\u53f0\uff08\u8235\u673a4\uff09\n\n\n    \/\/ \u4e2d\u95f4\u6001\n    SetServoAngle(3,120);\n    while(ServoTunnerOK() != 1);\n    SetServoAngle(2,148);\n    SetServoAngle(1,87);    \/\/ 0522\n    while(ServoTunnerOK() != 1);\n\/\/  OSTimeDly(500);\n\n    \/\/ \u653e\u7f6e\u524d\u594f\n    float temp1 = 107;\n    float temp2 = 175;\n    float temp3 = 96;\n\/\/  SetServoAngle(1,121);   \/\/ 103 \n\/\/  while(ServoTunnerOK() != 1);\n    SetServoAngle(2,170);   \/\/ 175  173\n    while(ServoTunnerOK() != 1);    \n    SetServoAngle(3,82);    \/\/ 96   84\n    while(ServoTunnerOK() != 1);\n\n    SetServoAngle(1,110); \n    while(ServoTunnerOK() != 1);\n\n\/\/  OSTimeDly(500);\n\/\/  for(uint8_t i = 0;i &lt; 20; i ++){\n\/\/      temp1--;\n\/\/      temp3--;\n\/\/      SetServoAngle(1,temp1); \n\/\/      SetServoAngle(3,temp3); \n\/\/  }\n\n    \/\/ \u7b49\u5f85\u7a33\u5b9a\uff0c\u653e\u7f6e\u5706\u73af\n    OSTimeDly(200);\n    SetServoAngle(0,97); \n    OSTimeDly(500);\n\n\n}\n<\/code><\/pre>\n<p>\u8fd9\u662f\u4e24\u8005\u7684\u6f14\u793a\u6548\u679c<br \/>\n<center><br \/>\n<div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/blog.keruone.cn\/wp-content\/uploads\/2025\/05\/\u7ed5\u5706\u67f1.gif'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/blog.keruone.cn\/wp-content\/uploads\/2025\/05\/\u7ed5\u5706\u67f1.gif\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\u7ed5\u5706\u67f1\u52a8\u753b\" style=\"display: block; margin: 0 auto;\"><\/div> <img decoding=\"async\" src=\"https:\/\/blog.keruone.cn\/wp-content\/uploads\/2025\/05\/\u722a\u5b50\u8ddf\u968f.gif\" alt=\"\u722a\u5b50\u8ddf\u968f\u52a8\u753b\" style=\"display: block; margin: 0 auto;\"><br \/>\n<\/center><\/p>\n<p>\u9664\u6b64\u4e4b\u5916\uff0c\u8fd8\u6709\u8ddf\u968f\u5706\u53f0\u989c\u8272\u8bc6\u522b\u4ee3\u7801\uff1a<\/p>\n<pre><code class=\"language-c line-numbers\">typedef enum{\n    BLUE_TEAM = 0,\n    RED_TEAM\n}TEAM_COLOR_TYPE;\ntypedef enum{\n    IS_OUR_COLOR = 0,   \/\/ \u662f\u6211\u65b9\u7684\uff0c\u5219\u6267\u884c\u653e\u7f6e\n    NOT_OUR_COLOR,      \/\/ \u4e0d\u662f\u6211\u65b9\uff0c\u5219\u79fb\u52a8\n    NOT_DETECT_COLOR    \/\/ \u4e0d\u786e\u5b9a\uff0c\u516b\u6210\u6444\u50cf\u5934\u574f\u4e86\uff0c\u90a3\u5efa\u8bae\u5148\u653e\u7f6e\n} IS_OURCOLOR_TYPE;\n\nextern TEAM_COLOR_TYPE OUR_COLOR;\n\nIS_OURCOLOR_TYPE ArmCheckPlatformColor(uint8_t maxDetectTimes,uint8_t toward){\n    uint8_t i = 0;\n    IS_OURCOLOR_TYPE colorType;\n    uint8_t isOurColor_Count = 0;\n    uint8_t notOurColor_Count = 0;\n    uint8_t notDetectColor_Count = 0;\n    k230_Item_Type *k230_Item_Ptr_Our = &amp;k230_Item_0;\n    k230_Item_Type *k230_Item_Ptr_Other = &amp;k230_Item_2;\n    k230_Item_Type *k230_Item_Ptr_Recycle = &amp;k230_Item_3;\n\n    \/\/ \u53d1\u9001\u68c0\u6d4b\u5bf9\u8c61\n    if(OUR_COLOR == BLUE_TEAM)\n        k230_SendData(LABEL0_PLATFORM_BLUE);\n    else \n        k230_SendData(LABEL0_PLATFORM_RED); \/\/ \u53d1\u9001\u8bf7\u6c42\uff0c\u9700\u8981\u5706\u67f1\u7684\u5750\u6807\n    OSTimeDly(200);\n\n    \/\/ \u6bd4\u5bf9\n    for( i = 0; i &lt; maxDetectTimes; i++){\n        if(OUR_COLOR == BLUE_TEAM)\n            k230_SendData(LABEL0_PLATFORM_BLUE);\n        else \n            k230_SendData(LABEL0_PLATFORM_RED); \/\/ \u53d1\u9001\u8bf7\u6c42\uff0c\u9700\u8981\u5706\u67f1\u7684\u5750\u6807\n        OSTimeDly(200);\n        k230_GetDataWithClear(k230_Item_Ptr_Recycle, SENSOR_Gripper);   \/\/ \u6e05\u9664\u53ef\u80fd\u662f\u524d\u4e00\u4e2a\u8bf7\u6c42\u7684\u8fd4\u56de\u7ed3\u679c\uff08\u8d27\u4e0d\u5bf9\u677f\uff09\n        OSTimeDly(300);\n        k230_GetDataWithClear(k230_Item_Ptr_Our, SENSOR_Gripper);\n        printf(\"A-&gt;OurColor:\\n\");\n        printf(\"x_left: %d, x_right: %d\\n\",(int)k230_Item_Ptr_Our-&gt;x_left,(int)k230_Item_Ptr_Our-&gt;x_right);\n        printf(\"y_up: %d, y_down: %d\\n\",(int)k230_Item_Ptr_Our-&gt;y_up,(int)k230_Item_Ptr_Our-&gt;y_down);\n        printf(\"x_center: %d, x_width: %d\\n\",(int)k230_Item_Ptr_Our-&gt;x_center,(int)k230_Item_Ptr_Our-&gt;x_width);\n        printf(\"y_center: %d, y_height: %d\\n\",(int)k230_Item_Ptr_Our-&gt;y_center,(int)k230_Item_Ptr_Our-&gt;y_height);\n        OSTimeDly(10);\n\n        if(OUR_COLOR == BLUE_TEAM)\n            k230_SendData(LABEL0_PLATFORM_RED);\n        else \n            k230_SendData(LABEL0_PLATFORM_BLUE);    \/\/ \u53d1\u9001\u8bf7\u6c42\uff0c\u9700\u8981\u5706\u67f1\u7684\u5750\u6807\n        OSTimeDly(200);\n        k230_GetDataWithClear(k230_Item_Ptr_Recycle, SENSOR_Gripper);   \/\/ \u6e05\u9664\u53ef\u80fd\u662f\u524d\u4e00\u4e2a\u8bf7\u6c42\u7684\u8fd4\u56de\u7ed3\u679c\uff08\u8d27\u4e0d\u5bf9\u677f\uff09\n        OSTimeDly(300);\n        k230_GetDataWithClear(k230_Item_Ptr_Other, SENSOR_Gripper);\n        printf(\"B-&gt;OtherColor:\\n\");\n        printf(\"x_left: %d, x_right: %d\\n\",(int)k230_Item_Ptr_Other-&gt;x_left,(int)k230_Item_Ptr_Other-&gt;x_right);\n        printf(\"y_up: %d, y_down: %d\\n\",(int)k230_Item_Ptr_Other-&gt;y_up,(int)k230_Item_Ptr_Other-&gt;y_down);\n        printf(\"x_center: %d, x_width: %d\\n\",(int)k230_Item_Ptr_Other-&gt;x_center,(int)k230_Item_Ptr_Other-&gt;x_width);\n        printf(\"y_center: %d, y_height: %d\\n\",(int)k230_Item_Ptr_Other-&gt;y_center,(int)k230_Item_Ptr_Other-&gt;y_height);\n        OSTimeDly(10);\n\n        if(toward == platformInRight)\n            colorType = CheckPlatformColor_Right(k230_Item_Ptr_Our,k230_Item_Ptr_Other);\n        else\n            colorType = CheckPlatformColor_Left(k230_Item_Ptr_Our,k230_Item_Ptr_Other);\n        if(colorType == IS_OUR_COLOR)\n            isOurColor_Count++;\n        else if(colorType == NOT_OUR_COLOR)\n            notOurColor_Count++;\n        else if(colorType == NOT_DETECT_COLOR)\n            notDetectColor_Count++;\n    }\n    if(isOurColor_Count &gt; notOurColor_Count &amp;&amp; isOurColor_Count &gt; notDetectColor_Count){\n        printf(\"colorType:IS_OUR_COLOR\\n\\n\");\n        return IS_OUR_COLOR;\n    }\n    if(notOurColor_Count &gt; isOurColor_Count &amp;&amp; notOurColor_Count &gt; notDetectColor_Count){\n            printf(\"colorType:NOT_OUR_COLOR\\n\\n\");\n        return NOT_OUR_COLOR;\n    }\n    if(notDetectColor_Count &gt; isOurColor_Count &amp;&amp; notDetectColor_Count &gt; notOurColor_Count){\n            printf(\"colorType:NOT_DETECT_COLOR\\n\\n\");\n        return NOT_DETECT_COLOR;\n    }\n    return colorType;\n}\n<\/code><\/pre>\n<p>\u6700\u540e\uff0c\u8fd8\u6709\u73af\u6e38\u8fc7\u7a0b\u4e2d\u68c0\u6d4b\u662f\u5426\u662f\u5bf9\u65b9\u5f97\u5206\u533a\uff0c\u5e76\u5224\u65ad\u6709\u65e0\u4e94\u5757\u7684\u4ee3\u7801\uff0c\u4e0d\u8fc7\u6bd4\u8f83\u53ef\u60dc\u7684\u662f\u4ee3\u7801\u76ee\u524d\u8fd8\u6709\u4e00\u5b9a\u95ee\u9898\uff0c\u4ee5\u540e\u6709\u7a7a\u518d\u4fee\u6b63\u5427<\/p>\n<pre><code class=\"language-c line-numbers\">void CircleTaskSensor0(void *p_arg){\n    OSTimeDly(20);\n\n    while(1){\n        if(CIRCLE_FLAG == 1){\n            Go_Circle(500);\n        }\n        else{\n            BreakFlag = 1;\n        }\n        OSTimeDly(1);\n    }\n}\n\/\/ k230\u68c0\u6d4b\u662f\u5426\u662f\u654c\u65b9\u5f97\u5206\u533a\nvoid CheckOtherScoreRegionInCenter(void){\n    uint8_t i = 0;\n    uint8_t j = 0;\n    uint8_t NoneItem_Num = 0;\n    int32_t allSpinDelayTime = 0;\n    int32_t allForwardDelayTime = 0;\n    int32_t tempDelayTime = 0;\n    k230_Item_Type *k230_Item_Ptr = &amp;k230_Item_0;\n\n    \/\/ \u5bfb\u627e\u654c\u65b9\u5f97\u5206\u533a\u4f4d\u7f6e\n    if(OUR_COLOR == BLUE_TEAM){\n        k230_SendData(LABEL0_RED_SCORE);\n    }\n    else if(OUR_COLOR == RED_TEAM){\n        k230_SendData(LABEL0_BLUE_SCORE);\n    }\n\n    \/\/ \u5224\u65ad\u662f\u5426\u662f\u5728\u4e2d\u5fc3\u504f\u5dee\u4e00\u5b9a\u8303\u56f4\u5185\u90e8\n    k230_GetData(k230_Item_Ptr, SENSOR_Gripper);\n    if(k230_Item_Ptr-&gt;x_center &gt; 573 &amp;&amp; k230_Item_Ptr-&gt;x_center &lt; 706){ \/\/\u5224\u65ad\u662f\u5426\u662f\u654c\u65b9\u5f97\u5206\u533a\n        \/\/ \u5173\u95ed\u7ed5\u5708\u8d70\n        CIRCLE_FLAG = 0;\n        Set_speed(0,0,0,0);\n        \/\/ \u5f00\u59cb\u68c0\u6d4b\u7269\u5757\n        k230_SendData(LABEL0_BLOCK);\n        OSTimeDly(100);\n\n        \/\/ \u9632\u6b62\u8bfb\u53d6\u5230\u6ca1\u7528\u7684\u4fe1\u606f\n        k230_GetDataWithClear(k230_Item_Ptr, SENSOR_Gripper);\n        OSTimeDly(100);\n\n        \/\/ \u65cb\u8f6c\n        spin_right(H_SPEED);\n            OSTimeDly(100);\n\n        while(j++&lt;5 &amp;&amp; k230_Item_Ptr-&gt;x_center!=0){\n            \/\/ \u653e\u7f6e\u673a\u68b0\u81c2\n            k230_SendData(LABEL0_BLOCK);\n            Arm_Grab_rectangle();\n            OSTimeDly(1000);\n\n            \/\/ \u5f00\u59cb\u68c0\u6d4b\u7269\u5757\n            k230_SendData(LABEL0_BLOCK);\n            OSTimeDly(100);\n\n            \/\/ \u9632\u6b62\u8bfb\u53d6\u5230\u6ca1\u7528\u7684\u4fe1\u606f\n            k230_GetDataWithClear(k230_Item_Ptr, SENSOR_Gripper);\n            OSTimeDly(100);\n\n            \/\/ ***\u53ef\u4ee5\u8003\u8651\u5728\u6b64\u6dfb\u52a0\u63d0\u524d\u9000\u51fa***\n\n            \/\/ \u4f7f\u5f97\u8f66\u5934\u5bf9\u51c6\u7269\u5757\n            for(i = 0; i &lt; 10; i++){\n                \/\/ \u8bfb\u53d6\u65b9\u5757\u4f4d\u7f6e\n                k230_GetDataWithClear(k230_Item_Ptr, SENSOR_Gripper);\n                tempDelayTime=k230_CarSpin_Block_Correct(k230_Item_Ptr);\n                printf(\"1:tDT:%d\\n\", tempDelayTime);\n                Circle_ClockType_with_Delay(100,tempDelayTime);\n                allSpinDelayTime += tempDelayTime;\n                OSTimeDly(tempDelayTime);\n                OSTimeDly(100);\n            }\n            Set_speed(0,0,0,0);\n            \/\/ \u79fb\u52a8\u5230\u7269\u5757\n            for(i = 0; i &lt; 10; i++){\n                \/\/ \u8bfb\u53d6\u65b9\u5757\u4f4d\u7f6e\n                k230_GetDataWithClear(k230_Item_Ptr, SENSOR_Gripper);\n                tempDelayTime=k230_CarForward_Block_Correct(k230_Item_Ptr);\n                printf(\"2:tDT:%d\\n\", tempDelayTime);\n                Circle_Goxx_with_Delay(200,tempDelayTime);\n                allForwardDelayTime += tempDelayTime;\n                OSTimeDly(tempDelayTime);\n                OSTimeDly(100);\n            }\n\n            Set_speed(0,0,0,0);\n            \/\/ \u5b58\u50a8\u7269\u5757\n            Arm_Store_Rectangle();\n\n            \/\/ \u5927\u6982\u6062\u590d\u521d\u59cb\u4f4d\u7f6e\n            Circle_Goxx_with_Delay(200,-allForwardDelayTime);\n            Circle_ClockType_with_Delay(100,-allSpinDelayTime);\n            Set_speed(0,0,0,0);\n        }       \n\n        spin_left(H_SPEED);\n        CIRCLE_FLAG = 1;\n        OSTimeDly(1000);\n    }\n    OSTimeDly(10);\n}\nvoid CircleTaskSensor1(void *p_arg){\n    OSTimeDly(20);\n\n    while(1){\n        if(CIRCLE_FLAG == 1){\n            Arm_Set_Circle_See_Side();\n            CheckOtherScoreRegionInCenter();\n        }\n        OSTimeDly(1);\n\n    }\n}\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u6d59\u6c5f\u7701\u673a\u5668\u4eba\u6bd4\u8d5b-K230 \u89c6\u89c9\u65b9\u6848 \u64b0\u5199\u4eba\uff1aKeruone \u64b0\u5199\u65e5\u671f 2025.5.26 \u7531\u4e8e\u603b\u7ed3\u5206\u6790\u90e8\u5206\u4e2d [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[5,1],"tags":[],"class_list":["post-388","post","type-post","status-publish","format-standard","hentry","category-articles","category-uncategorized"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/blog.keruone.cn\/index.php\/wp-json\/wp\/v2\/posts\/388","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.keruone.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.keruone.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.keruone.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.keruone.cn\/index.php\/wp-json\/wp\/v2\/comments?post=388"}],"version-history":[{"count":4,"href":"https:\/\/blog.keruone.cn\/index.php\/wp-json\/wp\/v2\/posts\/388\/revisions"}],"predecessor-version":[{"id":412,"href":"https:\/\/blog.keruone.cn\/index.php\/wp-json\/wp\/v2\/posts\/388\/revisions\/412"}],"wp:attachment":[{"href":"https:\/\/blog.keruone.cn\/index.php\/wp-json\/wp\/v2\/media?parent=388"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.keruone.cn\/index.php\/wp-json\/wp\/v2\/categories?post=388"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.keruone.cn\/index.php\/wp-json\/wp\/v2\/tags?post=388"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}