如何将 python 程序的输出传递给处理程序

How to pass output from a python program into a processing program

我正在通过可以输出字符串位置的 python 程序读取陀螺仪 (sense-hat) 的方向。我正在尝试将此数据用作处理程序中的输入,以使其根据陀螺仪的方向进行交互。我如何让 Processing 与 python 程序交互?

我在 bash 脚本中使用了以下代码片段来获取 python 程序的输出。我希望这有帮助。

OUTPUT="$(python your_program.py)"
print($OUTPUT)

我以前从未使用过 Sense HAT,但我猜它在幕后使用 I2C。从理论上讲,应该可以使用它的 I2C io library, but in practice it may take quite a bit of effort, looking at the sense-hat library uses RTIMU 和它自己执行的所有花式过滤来重新实现 Processing 中的代码。

要让您的 Python 程序与 Processing 对话,您至少有两个选择:

  1. pipe the output 从 python 程序进入 Processing 的 stdin 并解析通过
  2. 的内容
  3. 使用套接字。

第二个选项应该更简单,我可以想到多个选项:

  1. 原始 UDP 套接字
  2. OSC 使用 PyOSC for the Python and oscP5 进行处理
  3. 使用 WebSockets

我再次推荐第二个选项:UDP 非常快,而且 OSC 使传递带参数的消息变得容易。

Python 脚本将:

  • 投票方向数据
  • 通过 /orientation
  • 等消息分享方向值

处理草图将:

  • 做OSC Server服务器等待数据
  • 从接收到的 /orientation 消息中获取 3 个浮点参数并绘制

这是 未经测试的 概念验证发件人脚本 Python:

import time
from sense_hat import SenseHat
from OSC import OSCClient, OSCMessage

#update 60 times a second -> feel free to adjust this what works best
delay = 1.0/60.0 
# sense hat
sense = SenseHat()
# OSC client -> Processing
client = OSCClient()
client.connect( ("localhost", 12000) )


while True:
    # read sense hat
    orientation = sense.get_orientation_degrees()
    print("p: {pitch}, r: {roll}, y: {yaw}".format(**orientation))
    # send data to Processing
    client.send( OSCMessage("/orientation", [orientation["pitch"],orientation["roll"],orientation["yaw"] ] ) )
    # wait
    time.sleep(delay)

和处理接收器:

import oscP5.*;
import netP5.*;

OscP5 oscP5;

float pitch,roll,yaw;

void setup() {
  size(400,400,P3D);
  frameRate(25);
  /* start oscP5, listening for incoming messages at port 12000 */
  oscP5 = new OscP5(this,12000);
}


void draw() {
  background(0);  
  text("pitch: " + pitch + "\nroll: " + roll + "\nyaw: " + yaw,10,15);
}

/* incoming osc message are forwarded to the oscEvent method. */
void oscEvent(OscMessage message) {
  message.print();
  if(message.checkAddrPattern("/orientation")==true) {
    /* check if the typetag is the right one. -> expecting float (pitch),float (roll), float (yaw)*/
    if(message.checkTypetag("fff")) {
      pitch = message.get(0).floatValue();
      roll  = message.get(1).floatValue();
      yaw   = message.get(2).floatValue();
    }
  }
}

注意您需要先安装 PyOSC 和 运行 Processing sketch,否则您可能会收到关于 OSCClient 的 Python 错误无法连接。这个想法是 Processing 成为一个 OSC Server 而 Python Script 是一个 OSCClient 并且服务器需要可供客户端连接。 (如果需要,您可以将 Python 脚本设为 OSC 服务器,如果这样更适合您,则可以将 Processing sketch 设为客户端)

要安装 PyOSC,请尝试:

sudo pip install pyosc

否则:

cd ~/Downloads
wget https://pypi.python.org/packages/7c/e4/6abb118cf110813a7922119ed0d53e5fe51c570296785ec2a39f37606d85/pyOSC-0.3.5b-5294.tar.gz
tar xvzf pyOSC-0.3.5b-5294.tar.gz
cd pyOSC-0.3.5b-5294
sudo python setup.py install

同样,以上内容未经测试,但想法是:

  1. 下载库
  2. 解压缩
  3. 导航到解压缩的文件夹
  4. 通过sudo python setup.py install
  5. 安装