OpenPoolOpen-source Billiard Table as an Interactive Surface
Abstract
People love playing games. Games have been a good way to build social relations with others. Therefore, studying the impact of digital augmentation on such experience has been an interesting research topic in the field of Human-Computer Interaction. Ishii et al. proposed PingPongPlus[1], a novel way of augmenting ping pong table with a set of microphone array in 1999. The project later became an open-source project in 2011[2], which needed some soldering to be deployed. We walk the same line with PingPongPlus, but with a billiard table and off-the-shelf hardware products.
In this page, we introduce OpenPool, an open-source project that augments a standard billiard table with the cutting-edge computing technologies to provide the "super-billiard" experience.
Implementation
OpenPool is an open-source project that aims to be installed at as many places as possible so that more people can enjoy the super-billiard experience. Its hardware is easy to be deployed at any billiard tables and its software is easy to be installed on personal computers running Windows or Mac.
Furthermore, the basic features of the software such as ball detection and pocket detection are exposed as simple APIs of Processing libraries. Therefore, the programmer can easily design his/her own super-billiard experience. There are currently two libraries: base library and pocket detection library. In the following subsections, we describe these libraries in detail.
OpenPool core library
OpenPool op = new OpenPool(this); op.updateBalls(); for (int i = 0; i < op.balls; i ++) { Ball ball = op.balls[i]; ellipse(ball.x, ball.y, 10, 10); if (ball.prev != null) { line(ball.x, ball.y, ball.prev.x, ball.prev.y); } }
Minimum hardware setup of OpenPool consists of off-the-shelf products: two depth cameras ("Kinect" by Microsoft), a projector and a personal computer. Given the hardware setup, OpenPool base library computes ball positions and provide the information through simple APIs.
The computation is a simple image processing pipeline. First, with some callibrations of the camera positions, two depth images from the cameras form one depth map on the billiard table. Then, the ball positions on the table are estimated from the depth map by background substraction and blob detection.
OpenPool pocket detection library
OpenpoolBoostPocket p = new OpenpoolBoostPocket(this, "COM4"); p.start(); int[] pockets = p.getPockets(); for (int i = 0; i < pockets.length; i++) { if (pockets[i] > 0) { print(pockets[i]); print(" balls fell in the pocket no."); println(i + 1); } }
With the base library, the programmer can design a basic effect that responds to the ball positions. Though, the ball detection is not always stable due to environmental noise. This stability issue makes it difficult to design effect that fires when a ball falls into a pocket.
To address the issue, we provide a set of additional hardware and software named "boost kit." The hardware is implemented with mbed and some basic sensors, whose circuit design is published as an open-hardware project. Future work includes devleopment of more boost kits for various purposes such as collision detection.