从 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
我有以下 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