I implemented a Warehouse 3D demo that demonstrates the integration capabilities of M3 with cool stuff from the software industry.
The Warehouse 3D demo displays racks and boxes with live data coming from Stock Location – MMS010, and Balance Identity – MMS060. The Location Aisle, Rack, and Level of MMS010 is written dynamically on each box. The Status Balance ID of MMS060 is rendered as the color of the box: 1=yellow, 2=green, 3=red, else brown. And the Item Number is generated dynamically as a real bar code that can be scanned on the front face of the box.
Here is a screenshot:
The demo uses the Google Earth plugin to render a 3D model that was modeled with Google SketchUp, Ruby scripts to geocode the boxes and identify the front faces of the boxes, PHP to make the 3D Collada model dynamic, SOAP-based Lawson Web Services that calls M3 API, and the PEAR and NuSOAP open source PHP libraries.
The result is useful for sales demos, and as a seed for customers interested in implementing such a solution.
Try for yourself
You can try the demo for yourself with your own M3 environment. For that, you will need several things. You will need to install the Google Earth plugin in your browser. You will also need to deploy the Lawson Web Service for MMS060MI provided here; note that your LWS server must be in a DMZ so that the http://www.ibrix.info web server can make the SOAP call over HTTP. Also, you will need to follow the Settings wizard to setup your own M3 environment, user, password, CONO, WHLO, etc. The result is a long URL that is specific to your settings.
Constructing the 3D model
I built a 3D model with Google SketchUp.
Here is the video of the 3D model being built in Google SketchUp:
You can download my resulting SketchUp model here.
Identifying Aisles, Racks, Levels
Then, I set the Aisle, Rack, and Level of each box as in MMS010 using a custom Ruby script for Google SketchUp.
Here is a video that shows the script in action:
You can download this Ruby script here.
You can download the resulting SketchUp model here.
Identifying front faces
Then, I identified each front face of each box so as to dynamically overlay information, such as the Item Number, Item Name, etc. For that, I implemented another Ruby script.
Here is a video of that process:
You can also download this Ruby script here.
Exporting the Collada model
The original model is a SKP filetype, which is binary. I exported the model to a Collada DAE filetype, which is XML. The file is very big, 30.000 lines of XML.
The Collada file contains this:
- Components (racks, boxes, walls, etc.)
- Homogenous coordinates (X, Y, Z, H) relative to the model
- Absolute coordinates (latitude, longitude)
- Orientation (azimut, etc.)
- Effects (surface, diffusion, textures, etc.)
- Colors in RGBA
From the top of my head, the Collada hierarchy in XML is something like this:
Node Instance Node Definition Instance Geometry Instance Material Material Instance Effect Color Surface Image
Making the model dynamic
The goal is to set the color of each box dynamically, based on the Location of the box, and based on the Inventory Status in MMS060.
Unfortunately, Google Earth doesn’t have an API to change the color of a component dynamically. So, I decided to change the XML dynamically on the server. There are certainly better solutions but that’s the one I chose at the time. And I chose PHP because that’s what I had available on my server ibrix.info; otherwise any dynamic web language (ASP, JSP, etc.) would have been suitable.
In the XML, I found the mapping between the box (
nodeDefinition) and its color (
material). So, I changed the mapping from hard-coded to dynamic with a PHP function getColor() that determines the color based on the Location and based on the result of the web service call.
The color is determined by the Balance ID: 1=yellow, 2=green, 3=red, else brown. The Balance ID is stored in the SOAP Response of the web service.
Lawson Web Service
I created a SOAP-based Lawson Web Service for MMS060MI. I invoke the SOAP Web Service at the top of the PHP script, and store the Response in a global variable. To call SOAP Web Services, I use NuSOAP, an open source PHP library.
Generating front faces
I dynamically generate a texture for each each front face as a PNG image with the Item Number, Item Description, Quantity, and the bar code. I set the True Type Font, the size, the XY coordinates, and the background color.
I generate an image of the bar code based on the Item Number using PEAR, an open source PHP library.
I made a Settings wizard to assist the user in setting up a demo with their own M3 environment, user, password, CONO, WHLO, etc.
This Warehouse 3D demo illustrates possible applications such as:
- Monitoring a warehouse
- Locating a box for item picking
- Implementing Augmented Reality to overlay relevant data on top of the boxes
Finally, I made a demo video using the back projection screen at the Lawson Schaumburg office, and using Johny Lee’s Low-Cost Multi-point Interactive Whiteboards Using the Wiimote and my home made IR pens to convert the back projection screen into a big touch screen. The 3D model in the demo has 10 Aisles, 6 Racks per Aisle (except the first aisle which only has 4 racks), and 4 Levels per Rack. That’s 224 boxes. There is also a floor plan that illustrates that structure.
The main limitation of this demo is performance. When programming with Google Earth we do not have the capability of dynamically changing a 3D model. I would have liked to dynamically set the color of a box, and dynamically overlay text on the face of a box. Because that capability is lacking – there’s no such API in the Google Earth API – I chose to generate the XML of the 3D model dynamically on the server. As a result, the server has to send 30k lines of XML to the web browser over HTTP, it has to generate 224 PNG images and transfer them over the network, and the Google Earth plugin has to render it all. As a consequence, it takes between one and four minutes to fully download and render the demo. This design turns out to be inadequate for this type of application. Worse, it is not scalable nor improvable. I would have to re-think the design from scratch to get a more performant result.
If I had to continue working on this project (which is not planned), I would implement the following:
- Also, we could use a better 3D client, like O3D.
- Also, we would need to implement easy keyboard navigation, like the First Person Camera demo, and like the Monster Milktruck demo.
- Also, we would need to implement hit detection, so as to click on a box and display more M3 data in a pop-up for example. Google Earth supports even listeners but doesn’t yet support hit detection.
- Finally, we would need to improve performance by an order of magnitude.
Special thanks to Gunilla A for sponsoring this project and making it possible.
- Download Ruby script to set the Aisle, Rack, and Level of each box as in MMS010
- Download Ruby script to identify each front face of each box so as to dynamically overlay information
- Download SketchUp model with floor plan, geo-location, racks, and walls
- Download SketchUp model of boxes identified by Stock Location
- Watch video of the 3D model being built in Google SketchUp
- Watch video of the process of setting the Aisle, Rack, and Level of each box as in MMS010
- Watch video of the process of identifying each front face of each box
- Watch video of the demo on the large touch screen
- Download Lawson Web Service for MMS060MI
2012-09-27: I added the SketchUp models and Ruby scripts for download.