最近的一些小项目,需要在一些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() { // 连接到本地机器 5204端口 要保证端口一致 myClient = new Client(this, "127.0. 0.1", 5204); // Say hello , 向后端发送 myClient.write("Hi there");} void mouseReleased() { // 记录点击次数 clicks ; // 向后端发送按键次数 myClient.write("Mouse pressed " clicks " times.n"); //读取后端回报消息 inString = myClient.readString(); println(inString); }void draw() { // Change the background if the mouse is pressed if (mousePressed) { background(255); } else { background(0); }}
Python端
client_data = conn.recv(1024).decode() 接受消息
conn.sendall(recall.encode()) 发送消息
import socketip_port = ('127.0.0.1', 5204)sk = socket.socket() # 创建套接字sk.bind(ip_port) # 绑定服务地址sk.listen(5) # 监听连接请求print('启动socket服务,等待客户端连接...')conn, address = sk.accept() # 等待连接,此处自动阻塞while True: # 一个死循环,直到客户端发送‘exit’的信号,才关闭连接 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的工程师们也是可以加入进来一起共同完成项目了。这样就不用买那些贵贵的商业软件了。