最近的一些小项目,需要在一些processing上面接入一些额外的硬件,比如摄像头的识别定位,激光雷达,手势控制,当然这些processing也是有一些自带的库可以处理,不过如果再把大量CV的判断,硬件串口给一起集成,还是会有较大的延迟。特别是processing的串口库,个人感觉并不非常高效。同时processing的编程机制,导致在等待硬件串口,不能保持稳定的帧率。
leap motion-processing-LED灯带的case,可以感觉到有明显的延迟
为了避免这种情况,当然是专业的事情交给专业的工具,模块化处理功能,再通过接口进行拼接即可。
就以python到processing为例,因为processing是支持Client的,那么就可以直接通过socket进行通信了,这个就好像一个网页的前后端一样,前端的网页 - processing 和后端的服务器 - 本地server。关于什么是socket,这个可以自行查询资料,展开说那就是另外一个大坑。
也不用担心,代码还是很简单的,注意就是保证端口的一致,具体操作起来甚至感觉比串口还要容易。
Processing端
myClient.write("Hi there"); 发送
inString = myClient.readString(); 读取回报
import processing.net.*;
Client myClient;
int clicks;
String inString;
void setup() {
myClient = new Client(this, "127.0. 0.1", 5204);
myClient.write("Hi there");
}
void mouseReleased() {
clicks++;
myClient.write("Mouse pressed " + clicks + " times.\n");
inString = myClient.readString();
println(inString);
}
void draw() {
if (mousePressed) {
background(255);
} else {
background(0);
}
}
Python端
client_data = conn.recv(1024).decode() 接受消息
conn.sendall(recall.encode()) 发送消息
import socket
ip_port = ('127.0.0.1', 5204)
sk = socket.socket()
sk.bind(ip_port)
sk.listen(5)
print('启动socket服务,等待客户端连接...')
conn, address = sk.accept()
while True:
client_data = conn.recv(1024).decode()
if client_data == "exit":
exit("通信结束")
print("来自%s的客户端向你发来信息:%s" % (address, client_data))
recall="Recall data = %s" % client_data
conn.sendall(recall.encode())
conn.close()
具体实际效果,完成点击鼠标动作的回传
这只是一个例子,显然不至于python,其他各种语言也都是可以实现的,选择专业的环境,做专业的事!
这种的通信方式,不仅可以完成本地的数据的调取,其实也可以完成远程的数据传输。通过把“前端” “后端”的切分,让processing更加专注于视觉效果的展示,同时让代码模块化,不熟悉的processing的工程师们也是可以加入进来一起共同完成项目了。这样就不用买那些贵贵的商业软件了。
回复 py2ps ,获取完整案例,如果你对今天的内容感兴趣或者有疑问,欢迎在公众号后台回复“UDM Club”,加入群聊和我们交流。