In this personal project, I transformed my DSLR into a 3D Scanner using Python (OpenCV) and TwinCAT. The goal was to allow a 100$ digital camera to achieve similar results to $20,000 3D-scanning equipment. First I created a linear actuator assembly that can accept any consumer camera. This is optional however, a simple manual macro rail would suffice. The camera takes a set of shallow DOF macro images at different depths (focus bracketing).
The images can then be sent through my Python code. Given the depth increment, sensor size, and magnification, the Python program can quite accurately create a functional depth map of the object at nearly any resolution desired. The program slices up every image into quadrants, and uses Laplacian or Sobel edge detection to find the most in-focus areas of the image. It can then use the depth information to estimate where these areas are in 3D space. Finally, a 16-bit grayscale depth-map image is created which can then be viewed in a variety of programs (see below for output in Aurora Vision).
This work project was designed to automate the task of creating complex and dynamic pneumatic AutoCAD drawings for any machine. Machine I/O and devices were already being entered into an Excel spreadsheet where PLC base programs and HMI screens could then be generated based off that info. However, generating pneumatic drawings from the data on the Excel spreadsheets was most complex task of all, which I undertook single-handedly.
Inside this program, users could enter device names and their attributes into a database. These attributes included its general type, how many pneumatic lines, default valve type, regulators, flow controls, and more. Users could also enter in their own custom blocks for a device.
The Python program would read a machine’s Excel I/O spreadsheet and match the device names to the database to generate the drawings. This was a particularly challenging task, as the dynamic sizes of each device meant that the program had to intelligently place objects on the page and avoid collisions, while maintaining readability. Pythons “shapely” package was used extensively, as well as “matplotlib” and interaction with Windows’ COM.
Unfortunately, I cannot share many details about this project, so there will be no pictures, code, or video. Recently, I worked directly with a major aerospace/defense company to create a server that would acquire and handle data from a large robotic manufacturing cell for advanced items destined to go outside of earth’s atmosphere. I selected the hardware, designed the database, worked with internal and customer engineers to ensure compliance, deployed the hardware, and wrote/deployed the code for this server.
This clean room server could actively communicate and gather data from a Siemens PLC, Cognex machine-learning machine-vision camera hardware, robot-mounted screwdrivers, thread inspection transducers, and more. The server checks and sends the data to a local MS SQL database, as well as creates CFX messages that are relayed to a RabbitMQ broker. The server also communicates long-term alarm histories back to the Siemens PLC for displaying on the HMI.
I also worked on various other aspects of this manufacturing cell, including fully handling the Cognex machine learning inspections. I only wish I could give more details, as this was an extremely exciting project.
This very large custom spooler included 19 Kinetix drives powering 38 different servo motors. Large rolls of foam (used in N95 masks) were loaded into the unwind section where they were unwound and slit into strips in an isolated tension loop between the unwind and pull roll motors (using a pressurized “dancer” roll on a hinge as the positional feedback). Each strip would then get wound up in one of the 18 different sections, where in each one a small spring-loaded dancer roll would help keep a much more delicate tension loop between the winder and pull roll stable as the rolls grew to 25″ in diameter. While this was happening, “traverse” motors that were electronically cammed to the winder motors would shift back and forth to create a stable spool pattern.
I was the main controls engineer for this very exciting project that was custom-built for one of the largest producers of N95 masks on the planet, a company that is a household name in the USA. Besides commuticating with the customer to ensure rigid specifications were met, managing cross-functional teams, creating the HMI, and programming the complex motion processes and PLC code, I also worked directly with Allen-Bradley to help create a spooling function block for Studio 5000. This function block allowed a highly customizeable spool to be made, using techniques such as lobing, tapering, adjustable cross-hatch widths, and more.
Once finished, I also commisioned this project at the customer site. Despite the many challenges that occur when shipping a machine of this size and complexity across the country, the customer offered me a high ranking job before I left.
I have many personal and work projects I plan on adding here (very soon). This website is still in its infant stages. While its not my most impressive website, it in itself is a testament to my wide range of skills.
I instlled Linux and built my first website when I was 10 years old. This one I am hosting off a Linux (Ubuntu Server) VM where I configured the domain and DNS, LAMP stack, installed WordPress, and had the site running in less than an hour.
I have been obsessed with learning everything about programming and technology for as long as I’ve been alive. Whether its software, networking, hacking, controls and automation, robotics, computer 2D/3D vision, machine learning, or even programs like Photoshop/Resolve/AutoCAD Inventor and Electrical/Studio One/Logic Pro/etc. I am never done teaching myself and bringing myself to greater challenges, and I deeply enjoy guiding and teaching others as well.
I created this website in an effort to find the ultimate career path. While my career has been very fulfilling thus far, I hope to find a place where I can be challenged to heights I can’t yet imagine. As a fellow engineer once told me, “there is not a problem behind a screen that I have not seen you solve.”
Please feel free to reach out: