从 Python 中的 UDP 端口读取数组

Read an array from a UDP port in Python

我有以下 Simulink 模型: Simulink Model with UDP

有了这个模型和一个操纵杆,我想向我将从另一个应用程序读取的 UDP 端口提供输入;在我的例子中是 Blender。

所以在 Blender,我有以下代码,可以完美地处理来自 Simulink 的 1 个提供的输入。

import bpy
import math
import socket
import struct

port = 12009
address = "127.0.0.1"
base = 0
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((address, port))
cube = bpy.data.objects['Cube']
cube.location = (base, 0, 0)

class ModalTimerOperator(bpy.types.Operator):
    """Operator which runs its self from a timer"""
    bl_idname = "wm.modal_timer_operator"
    bl_label = "Modal Timer Operator"

    _timer = None

    def modal(self, context, event):
        if event.type in {'RIGHTMOUSE', 'ESC'}:
            self.cancel(context)
            s.close()
            cube.location = (base, 0, 0)
            return {'CANCELLED'}

        if event.type == 'TIMER':
            data, addr = s.recvfrom(1024)
            data = struct.unpack('!d', data)
            x = data[0]
            print(data)
            cube.location = (x, 0, 0)
            print("X:", x)

        return {'PASS_THROUGH'}

    def execute(self, context):
        wm = context.window_manager
        self._timer = wm.event_timer_add(0.001, window = context.window)
        wm.modal_handler_add(self)
        return {'RUNNING_MODAL'}

    def cancel(self, context):
        wm = context.window_manager
        wm.event_timer_remove(self._timer)


def register():
    bpy.utils.register_class(ModalTimerOperator)


def unregister():
    bpy.utils.unregister_class(ModalTimerOperator)


if __name__ == "__main__":
    register()

    # test call
    bpy.ops.wm.modal_timer_operator()

当我尝试 运行 时,出现以下错误:

struct.error: unpack requires a buffer of 8 bytes

如何使用 struct.unpack 解压一个数组而不是一个双精度数组? 我应该对代码进行哪些更改才能实现此目的?

我自己找到了答案。 不需要使用矩阵连接;只需简单地通过 UDP 连接所需发送信号的多路复用器信号。然后在代码中将 struct.unpack 的行更改为以下内容(如果您有 3 个信号):

    data = struct.unpack('!ddd', data)
    x = data[0]*100
    y = data[1]*100
    z = data[2]*100