{"id":278,"date":"2026-08-04T10:41:07","date_gmt":"2026-08-04T02:41:07","guid":{"rendered":"https:\/\/geocommunity.vip\/?p=278"},"modified":"2026-08-04T10:42:03","modified_gmt":"2026-08-04T02:42:03","slug":"2026%e5%9b%bd%e8%b5%9b-%e6%b5%8b%e9%87%8f%e8%ae%be%e5%a4%87%e5%a7%bf%e6%80%81%e8%a7%92%e4%bc%b0%e8%ae%a1","status":"publish","type":"post","link":"https:\/\/geocommunity.vip\/index.php\/2026\/08\/04\/2026%e5%9b%bd%e8%b5%9b-%e6%b5%8b%e9%87%8f%e8%ae%be%e5%a4%87%e5%a7%bf%e6%80%81%e8%a7%92%e4%bc%b0%e8%ae%a1\/","title":{"rendered":"2026\u56fd\u8d5b-\u6d4b\u91cf\u8bbe\u5907\u59ff\u6001\u89d2\u4f30\u8ba1"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\u4e00\u3001\u539f\u59cb\u6570\u636e\u7ba1\u7406<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1\u3001\u8bbe\u8ba1\u601d\u8def<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u516d\u4e2a\u6570\u636e\u6587\u4ef6\u90fd\u5305\u542b\u5927\u91cf\u89c2\u6d4b\u6570\u636e\u3002\u5982\u679c\u5c06\u6240\u6709\u539f\u59cb\u6587\u672c\u76f4\u63a5\u663e\u793a\u5728 Qt \u754c\u9762\u4e2d\uff0c<code>QTextEdit<\/code> \u9700\u8981\u4fdd\u5b58\u3001\u6392\u7248\u548c\u7ed8\u5236\u5de8\u91cf\u6587\u672c\uff0c\u5bb9\u6613\u9020\u6210\u754c\u9762\u5361\u987f\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u672c\u7a0b\u5e8f\u4e0d\u5728\u754c\u9762\u4e2d\u5c55\u793a\u5168\u90e8\u539f\u59cb\u6570\u636e\uff0c\u800c\u662f\u5148\u4fdd\u5b58\u6587\u4ef6\u8def\u5f84\uff0c\u518d\u7531 Python \u5728\u540e\u53f0\u9010\u884c\u8bfb\u53d6\u548c\u5904\u7406\u3002\u754c\u9762\u53ea\u663e\u793a\u6587\u4ef6\u6570\u91cf\u3001\u5904\u7406\u72b6\u6001\u548c\u6700\u7ec8\u7ed3\u679c\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7a0b\u5e8f\u4e2d\u7684\u4e24\u4e2a\u6838\u5fc3\u5b57\u5178\u5982\u4e0b\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u5b57\u5178<\/th><th>\u952e<\/th><th>\u503c<\/th><th>\u4f5c\u7528<\/th><\/tr><\/thead><tbody><tr><td><code>file_paths<\/code><\/td><td>\u6570\u636e\u540d<\/td><td>\u6587\u4ef6\u7edd\u5bf9\u8def\u5f84<\/td><td>\u8bb0\u5f55\u7528\u6237\u9009\u62e9\u7684\u6587\u4ef6\u4f4d\u7f6e<\/td><\/tr><tr><td><code>sensor_data<\/code><\/td><td>\u6570\u636e\u540d<\/td><td><code>DataPoint<\/code> \u5bf9\u8c61\u5217\u8868<\/td><td>\u4fdd\u5b58\u5171\u540c\u65f6\u95f4\u6bb5\u5185\u7684\u89c2\u6d4b\u6570\u636e<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e24\u4e2a\u5b57\u5178\u5747\u4ee5 <code>acc_x<\/code>\u3001<code>acc_y<\/code>\u3001<code>acc_z<\/code>\u3001<code>gyro_x<\/code>\u3001<code>gyro_y<\/code>\u3001<code>gyro_z<\/code> \u7b49\u6570\u636e\u540d\u4f5c\u4e3a\u952e\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2\u3001\u8bfb\u53d6\u5e76\u5b58\u50a8\u6570\u636e\u6587\u4ef6\u8def\u5f84\u5230file_paths<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>def open_file(self):\n    global file_paths\n\n    paths, _ = QFileDialog.getOpenFileNames(\n        self,\n        \"\u9009\u62e9\u516d\u8f74\u6570\u636e\u6587\u4ef6\",\n        \"\",\n        \"\u6587\u672c\u6587\u4ef6(*.txt)\"\n    )\n\n    for path in paths:\n        name = os.path.splitext(os.path.basename(path))&#91;0]\n        file_paths&#91;name] = path\n\n    self.original_text_area.setText(\n        f\"\u540e\u53f0\u5df2\u6210\u529f\u8bfb\u53d6{len(file_paths)}\u4e2a\u6570\u636e\u6587\u4ef6\u3002\"\n    )\n    self.result_text_area.setText(\"\u7b49\u5f85\u5904\u7406\u6570\u636e...\")\n    self.status_label.setText(\"\u6570\u636e\u6587\u4ef6\u8bfb\u53d6\u5b8c\u6210\u3002\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8be5\u51fd\u6570\u53ea\u8bb0\u5f55\u6587\u4ef6\u8def\u5f84\u5230file_paths\uff0c\u4e0d\u8bfb\u53d6\u548c\u663e\u793a\u5168\u90e8\u6587\u4ef6\u5185\u5bb9\uff0c\u56e0\u6b64\u8fd0\u884c\u901f\u5ea6\u8f83\u5feb\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3\u3001\u6570\u636e\u70b9\u7c7b<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>class DataPoint:\n    __slots__ = (\"t\", \"v\")\n\n    def __init__(self, t, v):\n        self.t = t\n        self.v = v<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>t<\/code>\uff1a\u89c2\u6d4b\u65f6\u523b\u3002<\/li>\n\n\n\n<li><code>v<\/code>\uff1a\u5bf9\u5e94\u8f74\u7684\u89c2\u6d4b\u503c\u3002<\/li>\n\n\n\n<li><code>__slots__<\/code>\uff1a\u51cf\u5c11\u5927\u91cf <code>DataPoint<\/code> \u5bf9\u8c61\u7684\u5185\u5b58\u5f00\u9500\u3002<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0d\u4f7f\u7528 <code>__slots__<\/code> \u65f6\uff0c\u7c7b\u7684\u5c5e\u6027\u66f4\u52a0\u7075\u6d3b\uff0c\u4f46\u6bcf\u4e2a\u5bf9\u8c61\u4f1a\u5360\u7528\u66f4\u591a\u5185\u5b58\uff1b\u4f7f\u7528 <code>__slots__<\/code> \u540e\uff0c\u5b9e\u4f8b\u5c5e\u6027\u56fa\u5b9a\uff0c\u5185\u5b58\u5360\u7528\u66f4\u4f4e\u3002\u9700\u8981\u6dfb\u52a0\u65b0\u5c5e\u6027\u65f6\uff0c\u5e94\u5148\u5728 <code>__slots__<\/code> \u4e2d\u58f0\u660e\uff0c\u4f8b\u5982\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>__slots__ = (\"t\", \"v\", \"name\")<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">4\u3001\u8bfb\u53d6\u5e76\u5b58\u50a8\u5171\u540c\u65f6\u95f4\u6bb5\u6570\u636e\u5230sensor_data<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>def read_(path, start_time, end_time):\n    points = &#91;]\n    start_ = start_time\n    end_ = end_time\n\n    with open(path, \"r\", encoding=\"utf-8\") as file:\n        for line_number, line in enumerate(file, 1):\n            line = line.strip()\n            if not line:\n                continue\n\n            parts = line.split(\",\", 1)\n            time_value = float(parts&#91;0])\n            time_ = time_value\n\n            if time_ &lt; start_:\n                continue\n            if time_ > end_:\n                break\n\n            points.append(\n                DataPoint(time_value, float(parts&#91;1]))\n            )\n\n    return points<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8bfb\u53d6\u65f6\u91c7\u7528\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>for name, file_path in file_paths.items():\n    self.status_label.setText(\n        f\"\u6b63\u5728\u8bfb\u53d6\u4e0e\u8ba1\u7b97{name}\u76f8\u5173\u6570\u636e...\"\n    )\n    QApplication.processEvents()\n\n    sensor_data&#91;name] = read_(\n        file_path,\n        start_time,\n        end_time\n    )<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u6b64\u65f6\u6240\u6709\u6570\u636e\u90fd\u5b58\u50a8\u5230\u4e86sensor_data\u5b57\u5178\u4e2d\uff0c\u952e\u4e3a\u6570\u636e\u540d\uff0c\u503c\u4e3a\u5217\u8868\u6570\u636e\u3002\uff08\u6700\u96be\u7684\u90e8\u5206\u5b8c\u6210\u4e86\uff09<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e8c\u3001\u6570\u636e\u9884\u5904\u7406\u4e0e\u7edf\u8ba1<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1\u3001\u5171\u540c\u65f6\u95f4\u6bb5<\/h3>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"216\" src=\"https:\/\/geocommunity.vip\/wp-content\/uploads\/2026\/08\/image.png\" alt=\"\" class=\"wp-image-281\" style=\"aspect-ratio:2.963152835629606;width:610px;height:auto\" srcset=\"https:\/\/geocommunity.vip\/wp-content\/uploads\/2026\/08\/image.png 640w, https:\/\/geocommunity.vip\/wp-content\/uploads\/2026\/08\/image-300x101.png 300w, https:\/\/geocommunity.vip\/wp-content\/uploads\/2026\/08\/image-421x142.png 421w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u516d\u4e2a\u6570\u636e\u6587\u4ef6\u7684\u65f6\u95f4\u8f74\u4e0d\u540c\uff0c\u5171\u540c\u65f6\u95f4\u6bb5\u5e94\u6ee1\u8db3\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u5171\u540c\u8d77\u59cb\u65f6\u523b = \u516d\u4e2a\u6587\u4ef6\u8d77\u59cb\u65f6\u523b\u7684\u6700\u5927\u503c\n\u5171\u540c\u7ec8\u6b62\u65f6\u523b = \u516d\u4e2a\u6587\u4ef6\u7ec8\u6b62\u65f6\u523b\u7684\u6700\u5c0f\u503c<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u672c\u9898\u6570\u636e\u7684\u5171\u540c\u65f6\u95f4\u6bb5\u4e3a\uff1a220657.870 \uff5e 221860.555<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2\u3001\u5355\u4f4d\u8f6c\u6362<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u9898\u76ee\u89c4\u5b9a\u540e\u7eed\u7b97\u6cd5\u5fc5\u987b\u4f7f\u7528\u8f6c\u6362\u540e\u7684\u5355\u4f4d\uff0c\u56e0\u6b64\u53ef\u4ee5\u76f4\u63a5\u8986\u76d6 <code>DataPoint.v<\/code>\uff0c\u4e0d\u5fc5\u989d\u5916\u4fdd\u5b58\u539f\u59cb\u503c\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def convert_(data):\n    for name, points in data.items():\n        if name.startswith(\"acc_\"):\n            for point in points:\n                point.v \/= interval\n        else:\n            for point in points:\n                point.v = (\n                    pi \/ 180\n                ) * (point.v \/ interval)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3\u3001\u5f02\u5e38\u70b9\u5224\u65ad\u4e0e\u5254\u9664<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u91cd\u590d\u70b9\u9700\u8981\u7edf\u8ba1\u5e76\u5254\u9664\u3002<\/li>\n\n\n\n<li>\u4e2d\u65ad\u70b9\u53ea\u7edf\u8ba1\uff0c\u4e0d\u5254\u9664\u5df2\u6709\u7684\u6709\u6548\u6570\u636e\u3002<\/li>\n\n\n\n<li>\u7c97\u5dee\u70b9\u9700\u8981\u7edf\u8ba1\u5e76\u5254\u9664\u3002<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">\uff081\uff09\u91cd\u590d\u70b9<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fde\u7eed\u6570\u636e\u7684\u65f6\u95f4\u6233\u548c\u89c2\u6d4b\u503c\u5b8c\u5168\u76f8\u540c\u65f6\uff0c\u540e\u7eed\u8bb0\u5f55\u89c6\u4e3a\u91cd\u590d\u70b9\u3002\u6bcf\u7ec4\u91cd\u590d\u6570\u636e\u4fdd\u7559\u7b2c\u4e00\u6761\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def remove_duplicate_(points):\n    normal_points = &#91;points&#91;0]]\n    count = 0\n\n    for point in points&#91;1:]:\n        previous = normal_points&#91;-1]\n\n        if point.t == previous.t and point.v == previous.v:\n            count += 1\n        else:\n            normal_points.append(point)\n\t# \u539f\u5730\u66ff\u6362\n    points&#91;:] = normal_points\n    return count<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\uff082\uff09\u4e2d\u65ad\u70b9<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u76f8\u90bb\u65f6\u95f4\u95f4\u9694\u8d85\u8fc7\u91c7\u6837\u95f4\u9694\u7684 <code>1.5<\/code> \u500d\u65f6\uff0c\u8bb0\u4e3a\u4e00\u4e2a\u4e2d\u65ad\u70b9\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def cnt_interrupt(points):\n    count = 0\n    threshold = interval * 1.5\n\n    for i in range(1, len(points)):\n        previous = points&#91;i - 1]\n        current = points&#91;i]\n\n        if current.t - previous.t > threshold:\n            count += 1\n\n    return count<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\uff083\uff09\u7c97\u5dee\u70b9<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">\u9640\u87ba\u5404\u8f74\u5206\u522b\u8ba1\u7b97\u5747\u503c\u548c\u603b\u4f53\u6807\u51c6\u5dee\u3002\u5f53\u6570\u636e\u6ee1\u8db3 <code>|x - mean| > 3 * standard<\/code> \u65f6\uff0c\u5224\u5b9a\u4e3a\u7c97\u5dee\u70b9\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def remove_error(points):\n    mean_ = sum(point.v for point in points) \/ len(points)\n\n    standard_ = math.sqrt(\n        sum(\n            (point.v - mean_) ** 2\n            for point in points\n        ) \/ len(points)\n    )\n\n    normal_points = &#91;]\n    count = 0\n\n    for point in points:\n        if abs(point.v - mean_) > 3 * standard_:\n            count += 1\n        else:\n            normal_points.append(point)\n\t# \u539f\u5730\u66ff\u6362\n    points&#91;:] = normal_points\n    return count<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">4\u3001\u6570\u636e\u5747\u503c<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5f02\u5e38\u6570\u636e\u5904\u7406\u5b8c\u6210\u540e\uff0c\u8ba1\u7b97\u5404\u8f74\u6b63\u5e38\u65f6\u95f4\u5e8f\u5217\u7684\u5747\u503c\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def calculate_mean(points):\n    return sum(point.v for point in points) \/ len(points)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u9640\u87ba\u5747\u503c\u5728\u7b97\u6cd5\u4e2d\u5fc5\u987b\u4fdd\u6301 <code>rad\/s<\/code>\uff0c\u4ec5\u5728\u7ed3\u679c\u8f93\u51fa\u65f6\u4e58\u4ee5 <code>1E6<\/code>\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e09\u3001\u59ff\u6001\u89d2\u4f30\u8ba1<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u59ff\u6001\u89d2\u91c7\u7528\u65b9\u6cd5 A \u548c\u65b9\u6cd5 B \u5206\u522b\u8ba1\u7b97\u3002\u4e24\u79cd\u65b9\u6cd5\u90fd\u9700\u8981\u8ba1\u7b97\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5171\u540c\u8d77\u59cb\u65f6\u523b\u5355\u4e2a\u6570\u636e\u7684\u59ff\u6001\u89d2\u3002<\/li>\n\n\n\n<li>\u5f02\u5e38\u5904\u7406\u540e\u5171\u540c\u65f6\u6bb5\u5747\u503c\u7684\u59ff\u6001\u89d2\u3002<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e09\u89d2\u51fd\u6570\u7684\u8f93\u5165\u548c\u4e2d\u95f4\u7ed3\u679c\u4f7f\u7528\u5f27\u5ea6\uff0c\u6700\u7ec8\u8f93\u51fa\u65f6\u8f6c\u6362\u4e3a\u5ea6\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1\u3001\u65b9\u6cd5A\uff1a\u52a0\u8ba1\u8c03\u5e73\u548c\u9640\u87ba\u5bfb\u5317<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>def method_a(ax, ay, az, wx, wy, wz):\n    # \u52a0\u8ba1\u8c03\u5e73\n    pitch = math.atan(\n        -ay \/ math.sqrt(ax ** 2 + az ** 2)\n    )\n    roll = math.atan2(ax, az)\n\n    # \u9640\u87ba\u8c03\u5e73\n    wx_level = (\n        wx * math.cos(roll)\n        - wz * math.sin(roll)\n    )\n\n    wy_level = (\n        wx * math.sin(pitch) * math.sin(roll)\n        + wy * math.cos(pitch)\n        + wz * math.sin(pitch) * math.cos(roll)\n    )\n\n    # \u9640\u87ba\u5bfb\u5317\n    yaw = math.atan2(-wx_level, wy_level)\n\n    rad_to_deg = 180 \/ pi\n\n    return (\n        pitch * rad_to_deg,\n        roll * rad_to_deg,\n        yaw * rad_to_deg\n    )<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2\u3001\u65b9\u6cd5B\uff1a\u65cb\u8f6c\u77e9\u9635\u8f6c\u59ff\u6001\u89d2<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>def method_b(ax, ay, az, wx, wy, wz):\n    # \u5df2\u77e5\u53c2\u6570\u53ca\u5355\u4f4d\u8f6c\u6362\n    gravity = 9.794\n    latitude = 30.5 * pi \/ 180\n    earth_rate = 15.041 * pi \/ 180 \/ 3600\n\n    cos_b = math.cos(latitude)\n    tan_b = math.tan(latitude)\n\n    # v = a x omega\n    vx = ay * wz - az * wy\n    vy = az * wx - ax * wz\n    vz = ax * wy - ay * wx\n\n    # \u8ba1\u7b97\u65cb\u8f6c\u77e9\u9635\n    denominator1 = gravity * earth_rate * cos_b\n    denominator2 = earth_rate * cos_b\n\n    c11 = -vx \/ denominator1\n    c12 = -vy \/ denominator1\n    c13 = -vz \/ denominator1\n\n    c21 = -ax * tan_b \/ gravity + wx \/ denominator2\n    c22 = -ay * tan_b \/ gravity + wy \/ denominator2\n    c23 = -az * tan_b \/ gravity + wz \/ denominator2\n\n    c31 = ax \/ gravity\n    c32 = ay \/ gravity\n    c33 = az \/ gravity\n\n    matrix = (\n        (c11, c12, c13),\n        (c21, c22, c23),\n        (c31, c32, c33)\n    )\n\n    # \u65cb\u8f6c\u77e9\u9635\u8f6c\u59ff\u6001\u89d2\n    pitch = -math.asin(c32)\n    roll = math.atan2(c31, c33)\n    yaw = math.atan2(c12, c22)\n\n    rad_to_deg = 180 \/ pi\n\n    return (\n        pitch * rad_to_deg,\n        roll * rad_to_deg,\n        yaw * rad_to_deg,\n        matrix\n    )<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u56db\u3001\u5b9e\u73b0\u8981\u70b9<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u4e0d\u8981\u5c06\u5168\u90e8\u539f\u59cb\u6570\u636e\u653e\u5165 Qt \u6587\u672c\u6846\uff0c\u754c\u9762\u53ea\u663e\u793a\u72b6\u6001\u3001\u7edf\u8ba1\u4fe1\u606f\u548c\u8ba1\u7b97\u7ed3\u679c\u3002<\/li>\n\n\n\n<li>\u4f7f\u7528 <code>file_paths<\/code> \u7ba1\u7406\u6587\u4ef6\u4f4d\u7f6e\uff0c\u4f7f\u7528 <code>sensor_data<\/code> \u7ba1\u7406\u53c2\u4e0e\u7b97\u6cd5\u7684\u6570\u636e\u3002<\/li>\n\n\n\n<li>\u4f7f\u7528 <code>DataPoint<\/code> \u7edf\u4e00\u4fdd\u5b58\u65f6\u95f4\u548c\u89c2\u6d4b\u503c\uff0c\u5e76\u901a\u8fc7 <code>__slots__<\/code> \u964d\u4f4e\u5185\u5b58\u5f00\u9500\u3002<\/li>\n\n\n\n<li>\u8bfb\u53d6\u6587\u4ef6\u65f6\u9010\u884c\u5904\u7406\uff0c\u5e76\u5728\u8d85\u8fc7\u5171\u540c\u7ec8\u6b62\u65f6\u523b\u540e\u7acb\u5373\u505c\u6b62\u3002<\/li>\n\n\n\n<li>\u5355\u4f4d\u8f6c\u6362\u540e\u518d\u8fdb\u884c\u5f02\u5e38\u68c0\u6d4b\u3001\u5747\u503c\u8ba1\u7b97\u548c\u59ff\u6001\u89d2\u4f30\u8ba1\u3002<\/li>\n\n\n\n<li>\u91cd\u590d\u70b9\u548c\u7c97\u5dee\u70b9\u9700\u8981\u5254\u9664\uff0c\u4e2d\u65ad\u70b9\u53ea\u8fdb\u884c\u7edf\u8ba1\u3002<\/li>\n\n\n\n<li>\u9640\u87ba\u5747\u503c\u5728\u7b97\u6cd5\u4e2d\u4f7f\u7528 <code>rad\/s<\/code>\uff0c\u4ec5\u5728\u6307\u5b9a\u7ed3\u679c\u8f93\u51fa\u65f6\u4e58\u4ee5 <code>1E6<\/code>\u3002<\/li>\n\n\n\n<li><code>atan()<\/code>\u3001<code>atan2()<\/code>\u3001<code>asin()<\/code> \u7684\u8f93\u5165\u548c\u8fd4\u56de\u503c\u5747\u4e3a\u5f27\u5ea6\uff0c\u6700\u7ec8\u7ed3\u679c\u9700\u8981\u8f6c\u6362\u4e3a\u5ea6\u3002<\/li>\n\n\n\n<li>\u9488\u5bf9\u8be5\u9898\u76ee\uff0c\u4e2d\u95f4\u7ed3\u679c\u53ef\u4ee5\u4f7f\u7528\u5b57\u5178\u7ba1\u7406\uff08\u5bf9\u540e\u7eed\u7b97\u6cd5\u4ecd\u6709\u7528\u9014\u7684\u6570\u636e\u5fc5\u987b\u4fdd\u5b58\uff1b\u4ec5\u7528\u4e8e\u6700\u7ec8\u5c55\u793a\u7684\u7ed3\u679c\u4e5f\u5e94\u7edf\u4e00\u7ec4\u7ec7\uff0c\u4ee5\u4fbf\u8f93\u51faQt\u754c\u9762\u3002\uff09\uff0c\u4f8b\u5982\uff1aduplicate_count = {}interrupt_count = {}error_count = {}mean_results = {}<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e94\u3001\u7ed3\u679c\u6587\u4ef6\u548c\u6e90\u7a0b\u5e8f<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">1\u3001result.txt<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"852\" height=\"632\" src=\"https:\/\/geocommunity.vip\/wp-content\/uploads\/2026\/08\/QQ_1785811102552.png\" alt=\"\" class=\"wp-image-279\" style=\"aspect-ratio:1.3481323665853406;width:642px;height:auto\" srcset=\"https:\/\/geocommunity.vip\/wp-content\/uploads\/2026\/08\/QQ_1785811102552.png 852w, https:\/\/geocommunity.vip\/wp-content\/uploads\/2026\/08\/QQ_1785811102552-300x223.png 300w, https:\/\/geocommunity.vip\/wp-content\/uploads\/2026\/08\/QQ_1785811102552-768x570.png 768w, https:\/\/geocommunity.vip\/wp-content\/uploads\/2026\/08\/QQ_1785811102552-404x300.png 404w\" sizes=\"auto, (max-width: 852px) 100vw, 852px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>\u5e8f\u53f7,\u8bf4\u660e,\u8ba1\u7b97\u7ed3\u679c\n1,\u6570\u636e\u5171\u540c\u65f6\u95f4\u6bb5\u7684\u8d77\u59cb\u65f6\u523b,220657.870\n2,\u6570\u636e\u5171\u540c\u65f6\u95f4\u6bb5\u7684\u7ec8\u6b62\u65f6\u523b,221860.555\n3,\u8d77\u59cb\u65f6\u523b\u8f6c\u5316\u540e\u7684\u4e09\u8f74\u52a0\u8ba1\u6570\u636e\u6a21\u957f,9.7938\n4,\u8d77\u59cb\u65f6\u523b\u8f6c\u5316\u540e\u7684\u4e09\u8f74\u9640\u87ba\u6570\u636e\u6a21\u957f,92.602\n5,\u52a0\u8ba1X\u8f74\u6570\u636e\u91cd\u590d\u70b9\u603b\u6570,114\n6,\u52a0\u8ba1Y\u8f74\u6570\u636e\u91cd\u590d\u70b9\u603b\u6570,112\n7,\u52a0\u8ba1Z\u8f74\u6570\u636e\u91cd\u590d\u70b9\u603b\u6570,111\n8,\u52a0\u8ba1Y\u8f74\u6570\u636e\u4e2d\u65ad\u70b9\u603b\u6570,105\n9,\u52a0\u8ba1Z\u8f74\u6570\u636e\u4e2d\u65ad\u70b9\u603b\u6570,99\n10,\u9640\u87baY\u8f74\u6570\u636e\u7c97\u5dee\u603b\u6570,758\n11,\u9640\u87baZ\u8f74\u6570\u636e\u7c97\u5dee\u603b\u6570,691\n12,\u9640\u87baY\u8f74\u7684\u5747\u503c,-26.1474\n13,\u9640\u87baZ\u8f74\u7684\u5747\u503c,54.1405\n14,\u52a0\u8ba1Y\u8f74\u7684\u5747\u503c,-6.9254\n15,\u52a0\u8ba1Z\u8f74\u7684\u5747\u503c,5.9976\n16,\u65b9\u6cd5A(\u8d77\u59cb\u65f6\u523b)\u6a2a\u6eda\u89d2,30.0183\n17,\u65b9\u6cd5A(\u8d77\u59cb\u65f6\u523b)\u822a\u5411\u89d2,85.7761\n18,\u65b9\u6cd5A(\u5171\u540c\u65f6\u6bb5)\u6a2a\u6eda\u89d2,30.0001\n19,\u65b9\u6cd5A(\u5171\u540c\u65f6\u6bb5)\u4fef\u4ef0\u89d2,45.0001\n20,\u65b9\u6cd5A(\u5171\u540c\u65f6\u6bb5)\u822a\u5411\u89d2,89.9402\n21,\u65b9\u6cd5B(\u8d77\u59cb\u65f6\u523b)\u6a2a\u6eda\u89d2,30.0183\n22,\u65b9\u6cd5B(\u8d77\u59cb\u65f6\u523b)\u822a\u5411\u89d2,92.1449\n23,\u65b9\u6cd5B(\u8d77\u59cb\u65f6\u523b)\u59ff\u6001\u77e9\u9635\u7b2c1\u884c\u7b2c1\u5217\u5143\u7d20,0.533202\n24,\u65b9\u6cd5B(\u8d77\u59cb\u65f6\u523b)\u59ff\u6001\u77e9\u9635\u7b2c2\u884c\u7b2c1\u5217\u5143\u7d20,-1.021525\n25,\u65b9\u6cd5B(\u8d77\u59cb\u65f6\u523b)\u59ff\u6001\u77e9\u9635\u7b2c1\u884c\u7b2c3\u5217\u5143\u7d20,0.734439\n26,\u65b9\u6cd5B(\u8d77\u59cb\u65f6\u523b)\u59ff\u6001\u77e9\u9635\u7b2c1\u884c\u7b2c2\u5217\u5143\u7d20,0.902237\n27,\u65b9\u6cd5B(\u8d77\u59cb\u65f6\u523b)\u59ff\u6001\u77e9\u9635\u7b2c3\u884c\u7b2c3\u5217\u5143\u7d20,0.612099\n28,\u65b9\u6cd5B(\u5171\u540c\u65f6\u6bb5)\u6a2a\u6eda\u89d2,30.0001\n29,\u65b9\u6cd5B(\u5171\u540c\u65f6\u6bb5)\u4fef\u4ef0\u89d2,45.0000\n30,\u65b9\u6cd5B(\u5171\u540c\u65f6\u6bb5)\u822a\u5411\u89d2,89.9707<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">2\u3001\u6e90\u7801\u6587\u4ef6<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>import os\nimport sys\nfrom PyQt5.QtWidgets import *\nimport math\n\n# \u4e00\u3001\u6570\u636e\u9884\u5904\u7406\u90e8\u5206\nclass DataPoint:\n    __slots__ = (\"t\", \"v\")\n    def __init__(self, t, v):\n        self.t = t\n        self.v = v\n\nsensor_data = {}\nfile_paths = {}\n\ndef read_(path, start_time, end_time):\n    points = &#91;]\n    # \uff081\uff09\u5c06\u8d77\u6b62\u65f6\u95f4\u8f6c\u5316\u4e3a\u6574\u6570\uff0c\u907f\u514d\u6d6e\u70b9\u7cbe\u5ea6\u95ee\u9898\n    start_ = start_time\n    end_ = end_time\n    # \uff082\uff09\u8bfb\u53d6\u5e76\u5b58\u50a8\u5171\u540c\u65f6\u95f4\u6bb5\u6570\u636e\n    with open(path, \"r\", encoding=\"utf-8\") as file:\n        for line_number, line in enumerate(file, 1):\n            # \u7a7a\u884c\u5224\u65ad\u4e0e\u8df3\u8fc7\n            line = line.strip()\n            if not line:\n                continue\n            parts = line.split(\",\", 1)\n            time_value = float(parts&#91;0])\n            time_ = time_value\n            # \u6838\u5fc3\u8fc7\u6ee4\n            if time_ &lt; start_:\n                continue\n            if time_ > end_:\n                break\n            # \u5b58\u50a8\u5171\u540c\u65f6\u95f4\u6bb5\u6570\u636e\n            points.append(DataPoint(time_value, float(parts&#91;1])))\n    return points\n\npi = 3.141592653589790\ninterval = 0.005\n\n# \u4e8c\u3001\u7b97\u6cd5\u90e8\u5206\n# 1\u3001\u5355\u4f4d\u8f6c\u6362\u51fd\u6570\uff08\u76f4\u63a5\u8986\u76d6v\u5c5e\u6027\uff09\ndef convert_(m_dict):\n    for name, points in m_dict.items():\n        if name.startswith(\"acc_\"):\n            for p in points:\n                p.v \/= interval\n        else:\n            for p in points:\n                p.v  = (pi \/ 180) * (p.v \/ 0.005)\n\n# 2\u3001\u7edf\u8ba1\u5e76\u5254\u9664\u91cd\u590d\u70b9\ndef remove_duplicate_(points):\n    # \uff081\uff09\n    normal_points = &#91;points&#91;0]]\n    cnt = 0\n    # \uff082\uff09\n    for point in points&#91;1:]:\n        previous = normal_points&#91;-1]\n        if point.t == previous.t and point.v == previous.v:\n            cnt += 1\n        else:\n            normal_points.append(point)\n    # \uff083\uff09\u539f\u5730\u4fee\u6539\u5217\u8868\n    points&#91;:] = normal_points\n    # \uff084\uff09\n    return cnt\n\n# 3\u3001\u7edf\u8ba1\u4e2d\u65ad\u70b9\ndef cnt_interrupt(points):\n    cnt = 0\n    flag = interval * 1.5\n    for i in range(1, len(points)):\n        previous = points&#91;i - 1]\n        current = points&#91;i]\n        t_d = current.t - previous.t\n        if t_d > flag:\n            cnt += 1\n    return cnt\n\n# 4\u3001\u7edf\u8ba1\u5e76\u5254\u9664\u7c97\u5dee\u70b9\ndef remove_error(points):\n    mean_ = sum(p.v for p in points) \/ len(points)\n    standard_ = math.sqrt(sum((p.v - mean_) ** 2 for p in points) \/ len(points))\n    normal_points = &#91;]\n    cnt = 0\n    for p in points:\n        if abs(p.v - mean_) > 3 * standard_:\n            cnt += 1\n        else:\n            normal_points.append(p)\n    # \u539f\u5730\u5254\u9664\u7c97\u5dee\u70b9\n    points&#91;:] = normal_points\n    return cnt\n\n# 5\u3001\u8ba1\u7b97\u65f6\u95f4\u5e8f\u5217\u5747\u503c\ndef calculate_mean(datum):\n    return sum(data.v for data in datum) \/ len(datum)\n\n# 6\u3001\u65b9\u6cd5A\ndef method_a(ax, ay, az, wx, wy, wz):\n    # \uff081\uff09\n    p = math.atan(-ay \/ math.sqrt(ax ** 2 + az ** 2))\n    r = math.atan2(ax, az)\n    # \uff082\uff09\n    wx_l = wx * math.cos(r) - wz * math.sin(r)\n    wy_l = wx * math.sin(p) * math.sin(r) + wy * math.cos(p) + wz * math.sin(p) * math.cos(r)\n    # \uff083\uff09\n    y = math.atan2(-wx_l, wy_l)\n    # \uff084\uff09\n    flag = 180 \/ pi\n    return p * flag, r * flag, y * flag\n\n# 7\u3001\u65b9\u6cd5B\ndef method_b(ax, ay, az, wx, wy, wz):\n    # \uff081\uff09\u6570\u636e\u51c6\u5907\n    g = 9.794\n    b = 30.5 * (pi \/ 180)\n    w = 15.041 * (pi \/ 180) \/ 3600\n    cos_b = math.cos(b)\n    tan_b = math.tan(b)\n    # \uff082\uff09\u53c9\u4e58\n    vx = ay * wz - az * wy\n    vy = az * wx - ax * wz\n    vz = ax * wy - ay * wx\n    # \uff083\uff09\u8ba1\u7b97\u65cb\u8f6c\u77e9\u9635\n    flag1 = g * w * cos_b\n    flag2 = w * cos_b\n    c11 = -vx \/ flag1\n    c12 = -vy \/ flag1\n    c13 = -vz \/ flag1\n    c21 = -ax * tan_b \/ g + wx \/ flag2\n    c22 = -ay * tan_b \/ g + wy \/ flag2\n    c23 = -az * tan_b \/ g + wz \/ flag2\n    c31 = ax \/ g\n    c32 = ay \/ g\n    c33 = az \/ g\n    matrix = &#91;&#91;c11, c12, c13], &#91;c21, c22, c23], &#91;c31, c32, c33]]\n    # \uff084\uff09\u65cb\u8f6c\u77e9\u9635\u8f6c\u59ff\u6001\u89d2\n    p = -math.asin(c32)\n    r = math.atan2(c31, c33)\n    y = math.atan2(c12, c22)\n    flag = 180 \/ pi\n    return p * flag, r * flag, y * flag, matrix\n\nclass App(QMainWindow):\n    def __init__(self):\n        super().__init__()\n        self.setGeometry(100,100,850,600)\n        self.setWindowTitle(\"\u6d4b\u91cf\u8bbe\u5907\u59ff\u6001\u89d2\u4f30\u8ba1\")\n        self._init_ui()\n    def _init_ui(self):\n        menu_bar = self.menuBar()\n        file_menu = menu_bar.addMenu(\"\u6587\u4ef6\")\n        file_menu.addAction(\"\ud83d\udcc2\u6253\u5f00\", self.open_file)\n        file_menu.addAction(\"\ud83d\uddc3\ufe0f\u4fdd\u5b58\", self.save_file)\n        file_menu.addSeparator()\n        file_menu.addAction(\"\u274c\u5173\u95ed\", self.close)\n        show_menu = menu_bar.addMenu(\"\u663e\u793a\")\n        show_menu.addAction(\"\ud83d\udda5\ufe0f\u663e\u793a\u7ed3\u679c\", self.process_data)\n        show_menu.addAction(\"\ud83e\uddf9\u6e05\u9664\u7ed3\u679c\", self.clear)\n        menu_bar.addMenu(\"\u7b97\u6cd5\").addAction(\"\u26f7\ufe0f\u8fd0\u884c\u7b97\u6cd5\", self.process_data)\n        toolbar = self.addToolBar(\"\u5de5\u5177\u680f\")\n        toolbar.addAction(\"\ud83d\udcc2\u6253\u5f00\u6587\u4ef6\", self.open_file)\n        toolbar.addAction(\"\u26f7\ufe0f\u8fd0\u884c\u7b97\u6cd5\", self.process_data)\n        toolbar.addAction(\"\ud83d\uddc3\ufe0f\u4fdd\u5b58\u7ed3\u679c\", self.save_file)\n        self.status_label = QLabel(\"\u2705\u5c31\u7eea\")\n        self.statusBar().addPermanentWidget(self.status_label, 1)\n        self.statusBar().setStyleSheet(\"background:#e8f4fd;\")\n        tab = QWidget()\n        layout = QVBoxLayout(tab)\n        layout.setContentsMargins(5,5,5,5)\n        splitter = QSplitter()\n        splitter.addWidget(self._make_panel(\"\u6570\u636e\u5904\u7406\"))\n        splitter.addWidget(self._make_panel(\"\u8fd0\u884c\u7b97\u6cd5\"))\n        splitter.setSizes(&#91;425,425])\n        layout.addWidget(splitter)\n        notebook = QTabWidget()\n        notebook.addTab(tab, \"\u6570\u636e\u5904\u7406\")\n        self.setCentralWidget(notebook)\n        self.original_text_area = self.panels&#91;0]\n        self.result_text_area = self.panels&#91;1]\n    def _make_panel(self, title):\n        frame = QFrame()\n        frame.setFrameShape(QFrame.StyledPanel)\n        layout = QVBoxLayout(frame)\n        layout.addWidget(QLabel(title))\n        text = QTextEdit()\n        text.setReadOnly(True)\n        text.setStyleSheet(\"font-family:Consolas;font-size:10pt;\")\n        layout.addWidget(text)\n        if not hasattr(self, 'panels'):\n            self.panels = &#91;]\n        self.panels.append(text)\n        return frame\n    def open_file(self):\n        global file_paths\n        # \uff081\uff09\n        paths, _ = QFileDialog.getOpenFileNames(self, \"\u9009\u62e9\u516d\u8f74\u6570\u636e\u6587\u4ef6\",\"\",\"\u6587\u672c\u6587\u4ef6(*.txt)\")\n        # \uff082\uff09\n        for path in paths:\n            name = os.path.splitext(os.path.basename(path))&#91;0]\n            file_paths&#91;name] = path\n        # \uff083\uff09\n        self.original_text_area.setText(f\"\u540e\u53f0\u5df2\u6210\u529f\u8bfb\u53d6{len(file_paths)}\u4e2a\u6570\u636e\u6587\u4ef6\u3002\")\n        self.result_text_area.setText(\"\u231b\ufe0f\u7b49\u5f85\u5904\u7406\u6570\u636e...\")\n        self.status_label.setText(\"\u2705\u6570\u636e\u6587\u4ef6\u8bfb\u53d6\u5b8c\u6210\u3002\")\n    def save_file(self):\n        path, _ = QFileDialog.getSaveFileName(self, \"\u4fdd\u5b58\u6587\u4ef6\", \"\", \"\u6587\u672c\u6587\u4ef6(*.txt)\")\n        with open(path, \"w\", encoding = \"utf-8\") as f:\n            f.write(self.result_text_area.toPlainText())\n        self.status_label.setText(f\"\u2705\u5df2\u5c06\u7ed3\u679c\u4fdd\u5b58\u81f3\uff1a{path}\u3002\")\n    def clear(self):\n        self.result_text_area.clear()\n        self.status_label.setText(\"\u2705\u6570\u636e\u5df2\u6e05\u9664\u3002\")\n    def process_data(self):\n        try:\n            processed_lines = &#91;\"\u5e8f\u53f7,\u8bf4\u660e,\u8ba1\u7b97\u7ed3\u679c\"]\n\n            # \u4e00\u3001\u6570\u636e\u8bfb\u53d6\u4e0e\u5b58\u50a8\n            # sensor_data = {} # \u503c\u4e3a\u5217\u8868\uff0c\u5217\u8868\u5143\u7d20\u4e3a\u7c7b\u5bf9\u8c61\n            # file_paths = {} # \u503c\u4e3a\u7edd\u5bf9\u8def\u5f84\n            # \u4ee5\u4e0a\u4e09\u4e2a\u5b57\u5178\u7684\u952e\u90fd\u662f\u6570\u636e\u540d\n            # 1\u3001\u89c2\u5bdf\u5f97\u5230\u5171\u540c\u65f6\u95f4\u6bb5\u7684\u8d77\u59cb\u65f6\u523b\u4e0e\u7ec8\u6b62\u65f6\u523b\n            start_time = 220657.870\n            end_time = 221860.555\n            processed_lines.append(\"1,\u6570\u636e\u5171\u540c\u65f6\u95f4\u6bb5\u7684\u8d77\u59cb\u65f6\u523b,220657.870\")\n            processed_lines.append(\"2,\u6570\u636e\u5171\u540c\u65f6\u95f4\u6bb5\u7684\u7ec8\u6b62\u65f6\u523b,221860.555\")\n            # 2\u3001\u8bfb\u53d6\u6240\u6709\u6587\u4ef6\n            for name, file_path in file_paths.items():\n                # \uff081\uff09\u72b6\u6001\u680f\u66f4\u65b0\n                self.status_label.setText(f\"\u231b\ufe0f\u6b63\u5728\u8bfb\u53d6\u4e0e\u8ba1\u7b97{name}\u76f8\u5173\u6570\u636e...\")\n                QApplication.processEvents()\n                # \uff082\uff09\u8bfb\u53d6\u5e76\u5b58\u50a8\u5230sensor_data\u5b57\u5178\n                path = file_paths&#91;name]\n                sensor_data&#91;name] = read_(path, start_time, end_time)\n            # 3\u3001\u73b0\u5728\u7684\u6240\u6709\u6570\u636e\u90fd\u5b58\u50a8\u5230\u4e86sensor_data\u5b57\u5178\u4e2d\uff0c\u952e\u4e3a\u6570\u636e\u540d\uff0c\u503c\u4e3a\u5217\u8868\u6570\u636e\n\n            # \u4e8c\u3001\u6570\u636e\u9884\u5904\u7406\u4e0e\u7edf\u8ba1\n            # 1\u3001\u5355\u4f4d\u8f6c\u6362\n            convert_(sensor_data)\n            acc_start_norm = math.sqrt(sensor_data&#91;\"acc_x\"]&#91;0].v ** 2 + sensor_data&#91;\"acc_y\"]&#91;0].v ** 2 + sensor_data&#91;\"acc_z\"]&#91;0].v ** 2)\n            gyro_start_norm = (math.sqrt(sensor_data&#91;\"gyro_x\"]&#91;0].v ** 2 + sensor_data&#91;\"gyro_y\"]&#91;0].v ** 2 + sensor_data&#91;\"gyro_z\"]&#91;0].v ** 2)) * 1e6\n            processed_lines.append(f\"3,\u8d77\u59cb\u65f6\u523b\u8f6c\u5316\u540e\u7684\u4e09\u8f74\u52a0\u8ba1\u6570\u636e\u6a21\u957f,{acc_start_norm:.4f}\")\n            processed_lines.append(f\"4,\u8d77\u59cb\u65f6\u523b\u8f6c\u5316\u540e\u7684\u4e09\u8f74\u9640\u87ba\u6570\u636e\u6a21\u957f,{gyro_start_norm:.3f}\")\n            # 2\u3001\u5f02\u5e38\u70b9\u5224\u65ad\u4e0e\u5254\u9664\n            # \uff081\uff09\u91cd\u590d\u70b9\n            duplicate_cnt = {}\n            for name in &#91;\"acc_x\", \"acc_y\", \"acc_z\"]:\n                duplicate_cnt&#91;name] = remove_duplicate_(sensor_data&#91;name])\n            processed_lines.append(f\"5,\u52a0\u8ba1X\u8f74\u6570\u636e\u91cd\u590d\u70b9\u603b\u6570,{duplicate_cnt&#91;'acc_x']}\")\n            processed_lines.append(f\"6,\u52a0\u8ba1Y\u8f74\u6570\u636e\u91cd\u590d\u70b9\u603b\u6570,{duplicate_cnt&#91;'acc_y']}\")\n            processed_lines.append(f\"7,\u52a0\u8ba1Z\u8f74\u6570\u636e\u91cd\u590d\u70b9\u603b\u6570,{duplicate_cnt&#91;'acc_z']}\")\n            # \uff082\uff09\u4e2d\u65ad\u70b9\n            interrupt_cnt = {}\n            for name in &#91;\"acc_x\", \"acc_y\", \"acc_z\"]:\n                interrupt_cnt&#91;name] = cnt_interrupt(sensor_data&#91;name])\n            processed_lines.append(f\"8,\u52a0\u8ba1Y\u8f74\u6570\u636e\u4e2d\u65ad\u70b9\u603b\u6570,{interrupt_cnt&#91;'acc_y']}\")\n            processed_lines.append(f\"9,\u52a0\u8ba1Z\u8f74\u6570\u636e\u4e2d\u65ad\u70b9\u603b\u6570,{interrupt_cnt&#91;'acc_z']}\")\n            # \uff083\uff09\u7c97\u5dee\u70b9\n            error_cnt = {}\n            for name in &#91;\"gyro_x\", \"gyro_y\", \"gyro_z\"]:\n                error_cnt&#91;name] = remove_error(sensor_data&#91;name])\n            processed_lines.append(f\"10,\u9640\u87baY\u8f74\u6570\u636e\u7c97\u5dee\u603b\u6570,{error_cnt&#91;'gyro_y']}\")\n            processed_lines.append(f\"11,\u9640\u87baZ\u8f74\u6570\u636e\u7c97\u5dee\u603b\u6570,{error_cnt&#91;'gyro_z']}\")\n            # 3\u3001\u6570\u636e\u5747\u503c\u8ba1\u7b97\n            mean_results = {}\n            for name in &#91;\"acc_x\", \"acc_y\", \"acc_z\", \"gyro_x\", \"gyro_y\", \"gyro_z\"]:\n                mean_results&#91;name] = calculate_mean(sensor_data&#91;name])\n            processed_lines.append(f\"12,\u9640\u87baY\u8f74\u7684\u5747\u503c,{mean_results&#91;'gyro_y'] * 1e6:.4f}\")\n            processed_lines.append(f\"13,\u9640\u87baZ\u8f74\u7684\u5747\u503c,{mean_results&#91;'gyro_z'] * 1e6:.4f}\")\n            processed_lines.append(f\"14,\u52a0\u8ba1Y\u8f74\u7684\u5747\u503c,{mean_results&#91;'acc_y']:.4f}\")\n            processed_lines.append(f\"15,\u52a0\u8ba1Z\u8f74\u7684\u5747\u503c,{mean_results&#91;'acc_z']:.4f}\")\n\n            # \u4e09\u3001\u59ff\u6001\u89d2\u4f30\u8ba1\n            # 1\u3001\u65b9\u6cd5A\uff0c\u89e3\u7b97\u8d77\u59cb\u65f6\u523b\u59ff\u6001\u89d2\n            start_p, start_r, start_y = method_a(sensor_data&#91;\"acc_x\"]&#91;0].v, sensor_data&#91;\"acc_y\"]&#91;0].v, sensor_data&#91;\"acc_z\"]&#91;0].v, sensor_data&#91;\"gyro_x\"]&#91;0].v, sensor_data&#91;\"gyro_y\"]&#91;0].v, sensor_data&#91;\"gyro_z\"]&#91;0].v)\n            processed_lines.append(f\"16,\u65b9\u6cd5A(\u8d77\u59cb\u65f6\u523b)\u6a2a\u6eda\u89d2,{start_r:.4f}\")\n            processed_lines.append(f\"17,\u65b9\u6cd5A(\u8d77\u59cb\u65f6\u523b)\u822a\u5411\u89d2,{start_y:.4f}\")\n            # 2\u3001\u65b9\u6cd5A\uff0c\u89e3\u7b97\u5171\u540c\u65f6\u523b\u59ff\u6001\u89d2\n            mean_p, mean_r, mean_y = method_a(mean_results&#91;\"acc_x\"], mean_results&#91;\"acc_y\"], mean_results&#91;\"acc_z\"], mean_results&#91;\"gyro_x\"], mean_results&#91;\"gyro_y\"], mean_results&#91;\"gyro_z\"])\n            processed_lines.append(f\"18,\u65b9\u6cd5A(\u5171\u540c\u65f6\u6bb5)\u6a2a\u6eda\u89d2,{mean_r:.4f}\")\n            processed_lines.append(f\"19,\u65b9\u6cd5A(\u5171\u540c\u65f6\u6bb5)\u4fef\u4ef0\u89d2,{mean_p:.4f}\")\n            processed_lines.append(f\"20,\u65b9\u6cd5A(\u5171\u540c\u65f6\u6bb5)\u822a\u5411\u89d2,{mean_y:.4f}\")\n            # 3\u3001\u65b9\u6cd5B\uff0c\u89e3\u7b97\u8d77\u59cb\u65f6\u523b\u59ff\u6001\u89d2\n            start_b_p, start_b_r, start_b_y, start_matrix = method_b(sensor_data&#91;\"acc_x\"]&#91;0].v, sensor_data&#91;\"acc_y\"]&#91;0].v, sensor_data&#91;\"acc_z\"]&#91;0].v, sensor_data&#91;\"gyro_x\"]&#91;0].v, sensor_data&#91;\"gyro_y\"]&#91;0].v, sensor_data&#91;\"gyro_z\"]&#91;0].v)\n            processed_lines.append(f\"21,\u65b9\u6cd5B(\u8d77\u59cb\u65f6\u523b)\u6a2a\u6eda\u89d2,{start_b_r:.4f}\")\n            processed_lines.append(f\"22,\u65b9\u6cd5B(\u8d77\u59cb\u65f6\u523b)\u822a\u5411\u89d2,{start_b_y:.4f}\")\n            processed_lines.append(f\"23,\u65b9\u6cd5B(\u8d77\u59cb\u65f6\u523b)\u59ff\u6001\u77e9\u9635\u7b2c1\u884c\u7b2c1\u5217\u5143\u7d20,{start_matrix&#91;0]&#91;0]:.6f}\")\n            processed_lines.append(f\"24,\u65b9\u6cd5B(\u8d77\u59cb\u65f6\u523b)\u59ff\u6001\u77e9\u9635\u7b2c2\u884c\u7b2c1\u5217\u5143\u7d20,{start_matrix&#91;1]&#91;0]:.6f}\")\n            processed_lines.append(f\"25,\u65b9\u6cd5B(\u8d77\u59cb\u65f6\u523b)\u59ff\u6001\u77e9\u9635\u7b2c1\u884c\u7b2c3\u5217\u5143\u7d20,{start_matrix&#91;0]&#91;2]:.6f}\")\n            processed_lines.append(f\"26,\u65b9\u6cd5B(\u8d77\u59cb\u65f6\u523b)\u59ff\u6001\u77e9\u9635\u7b2c1\u884c\u7b2c2\u5217\u5143\u7d20,{start_matrix&#91;0]&#91;1]:.6f}\")\n            processed_lines.append(f\"27,\u65b9\u6cd5B(\u8d77\u59cb\u65f6\u523b)\u59ff\u6001\u77e9\u9635\u7b2c3\u884c\u7b2c3\u5217\u5143\u7d20,{start_matrix&#91;2]&#91;2]:.6f}\")\n            # 4\u3001\u65b9\u6cd5B\uff0c\u89e3\u7b97\u5171\u540c\u65f6\u523b\u59ff\u6001\u89d2\n            mean_b_p, mean_b_r, mean_b_y, mean_matrix = method_b(mean_results&#91;\"acc_x\"], mean_results&#91;\"acc_y\"], mean_results&#91;\"acc_z\"], mean_results&#91;\"gyro_x\"], mean_results&#91;\"gyro_y\"], mean_results&#91;\"gyro_z\"])\n            processed_lines.append(f\"28,\u65b9\u6cd5B(\u5171\u540c\u65f6\u6bb5)\u6a2a\u6eda\u89d2,{mean_b_r:.4f}\")\n            processed_lines.append(f\"29,\u65b9\u6cd5B(\u5171\u540c\u65f6\u6bb5)\u4fef\u4ef0\u89d2,{mean_b_p:.4f}\")\n            processed_lines.append(f\"30,\u65b9\u6cd5B(\u5171\u540c\u65f6\u6bb5)\u822a\u5411\u89d2,{mean_b_y:.4f}\")\n\n            self.result_text_area.setPlainText(\"\\n\".join(processed_lines))\n            self.status_label.setText(\"\u2705\u6570\u636e\u5904\u7406\u6210\u529f\uff01\")\n        except Exception as e:\n            self.status_label.setText(f\"\u274c\u6570\u636e\u5904\u7406\u5931\u8d25\uff1a{e}\u3002\")\nif __name__ == \"__main__\":\n    app = QApplication(sys.argv)\n    window = App()\n    window.show()\n    sys.exit(app.exec_())<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00\u3001\u539f\u59cb\u6570\u636e\u7ba1\u7406 1\u3001\u8bbe\u8ba1\u601d\u8def \u516d\u4e2a\u6570\u636e\u6587\u4ef6\u90fd\u5305\u542b &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,8,7],"tags":[],"class_list":["post-278","post","type-post","status-publish","format-standard","hentry","category-gis","category-8","category-7"],"_links":{"self":[{"href":"https:\/\/geocommunity.vip\/index.php\/wp-json\/wp\/v2\/posts\/278","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/geocommunity.vip\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/geocommunity.vip\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/geocommunity.vip\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/geocommunity.vip\/index.php\/wp-json\/wp\/v2\/comments?post=278"}],"version-history":[{"count":2,"href":"https:\/\/geocommunity.vip\/index.php\/wp-json\/wp\/v2\/posts\/278\/revisions"}],"predecessor-version":[{"id":283,"href":"https:\/\/geocommunity.vip\/index.php\/wp-json\/wp\/v2\/posts\/278\/revisions\/283"}],"wp:attachment":[{"href":"https:\/\/geocommunity.vip\/index.php\/wp-json\/wp\/v2\/media?parent=278"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/geocommunity.vip\/index.php\/wp-json\/wp\/v2\/categories?post=278"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/geocommunity.vip\/index.php\/wp-json\/wp\/v2\/tags?post=278"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}