After arriving at Georgia Tech for my junior year, I wanted to gain experience in robotics and integrated systems. As such, I bought an arduino kit and broke out my old Raspberry Pi, and started working my way through some online tutorials. As I developed my skills, getting comfortable working with servos and writing low-level C++ and Python code, I decided to take on a larger project, leading me on my journey detailed below.
I knew that I wanted to build a device that would test and improve my knowledge of both mechanical and software engineering, so some sort of robot was a clear choice. I was (and still am) also interested in computer vision, particularly in how satellites can use their cameras to relay information for use on Earth. These two ideas together led me to create a relatively simple (compared to satellite technology) computer vision robot that could track and follow a green ball, rotating in the pitch and yaw axes via servos.
The first step in this project was creating an assembly of the system in Solidworks, so that I could not only visualize the project, but also print the needed parts on my printer. My initial designs were optimized to minimize the time to print and use minimal PLA. This paradigm, along with the practice of making pieces one at a time and not synthesizing them into one singular assembly, led to a disappointing final structure that was unstable and could not stand on its own.
For my second round of CAD designing, I was equipped with more knowledge of gimbal design, as well as far more Solidworks experience in general. As such, I knew that I could save time and cost overall by taking extra care in the beginning of the process and creating quality parts, and making sure they fit together properly before any manufacturing began. Additionally, with a high-quality model of the servo itself, designing components to properly interface would be easier. The cumulation of my design was the project’s structural assembly shown below. It consists of a base, three servos and their horns, three unique servo holders, a camera mount and cap, and two connecting pieces.
Once all pieces were printed, now the build could be assembled. All servos were attached to their respective holders, and the device at large was built from the base upwards. Unfortunately, there was a gap between the left connector and the upper servo holder, likely due to printing errors. Thankfully, the gap was secured by the necessary screws and did not present a stability issue.
After constructing the device, I had to wire the servos and install the camera. The base and upside-down camera mount were intentionally designed to properly integrate my Raspberry Pi with minimal wire twist. Each of the servos’ control wires were connected to a GPIO pin, and the servos were powered with an auxiliary Arduino acting as a 5V power supply, as the Raspberry Pi could not support the camera module and all three servos. Once all grounds were linked, I could start developing software beyond initial testing files.
The code for this project was completed in Python, taking particular advantage of the pigpio, openCV, and picamera2 modules. Aside from unit tests of the individual components, the code consisted of three files: camera functionality, servo control, and the master file utilizing methods from both.
The camera controller takes the output of the camera, transitions it through several filters to improve contrast, then masks the image to only show pixels of the intended color. A box is then drawn around the predicted position of the ball, which informs the position of it on the screen. The servo controller simply compartmentalizes methods for moving the pitch and yaw angles of the camera, so that the device can follow its target over a larger field of view. The final file acts as the controller, using the position of the ball on the screen to find an error, and move the servos in such a way as to minimize the error.
I am very happy with how this project turned out. The process of transforming an idea to a 3D model to a physical, working device is extremely satisfying to me. This was also the first robot that I have made, and I am excited to explore the field further for future projects. The knowledge in the fields of CAD, computer vision, and mechanical engineering that I have gained will surely aid me in future professional, academic, and personal goals. This project could easily be modified to pertain to several aerospace applications, such as a rocket or drone tracker, or a targeting system on an orbiting drone.
I have a number of goals and ways to improve this project in the future. Firstly, the current controller uses only proportional control, which causes some unwanted oscillations when the position of the ball changes quickly. Added integral and derivative terms would smooth out these oscillations, and give me more experience with a more modern form of control that is very applicable to parts of the aerospace industry, such as GNC. Secondly, I would like to redesign some of the parts such that the build is cleaner, and cuts down on some of the unnecessary fasteners. Finally, I believe that I could extend the functionality of this device to predicting the position of the ball at future points, applying kinematic equations to the observed motion. This may involve significant software difficulties, and possibly another camera to define the ball’s position in 3D space, but it would be a fun challenge that would test my knowledge of optics and 3-dimensional motion.
Over the summer, I had the idea to do my first of several aerospace-related personal projects, all of which are outlined on this page. For my initial project, I chose to create and analyze a solid rocket motor, from the fuel composition to the grain geometry and testing. In preparation for this project, I created a presentation to outline the fuel creation process and safety measures, which is linked below:
As one can see, my first step was to create a simple rocket fuel, known as rocket candy or R-Candy. All rocket fuels consist primarily of oxidizers and fuel components, in addition to small amounts of additives. R-Candy uses potassium nitrate (KNO3) as oxidizer and powdered sugar as fuel. The typical, most basic recipe for this fuel consists of 60% potassium nitrate and 40% sugar. The two ingredients are first (separately) blended, then mixed together well as powdered. Then, the mixture is heated until the sugar is melted, and the slurry is cast into the motor. The cooked mixture does have the appearance and smell of caramel, thus giving the fuel its name.
Initial tests were exciting, and I was determined to improve the fuel and make it more useful. As the result of much testing, I determined a few additives to improve the burn of the fuel. One of these is iron oxide powder (rust). This acts as a catalyst to the reaction, since the rust particles are effective at transferring heat around the motor, and it lowers the activation energy of the decomposition process, both of which increase the burn rate. This is optimal for rocket design since a faster reaction increases both chamber pressure and exit velocity, increasing thrust. An additional additive used was corn syrup, to increase viscosity, and make casting easier.
With my recipe fully ready, I now moved to thinking of grain geometry. To achieve a balance of ease of manufacturing and good burn profile, I chose a BATES, or toroidal pattern. To create the new version of my motor casing, I first cut a 30mm-diameter aluminum pipe into a 150mm height section. After pouring the cooked fuel into the tube, a lubricated rod can be inserted, creating the inner cavity in the motor. This cavity allows the motor to produce much more thrust in the beginning of the burn than otherwise.
Now, I proceeded to create a test stand to measure and plot the thrust. I modelled a stand with Solidworks, then created an assembly with load cells and a few other helper parts. The load cells would then be attached to amplifier modules and connected to an Arduino Uno, which would record the data for analysis.
Since the aluminum tube containing the fuel reached extreme temperatures, I added wood segments as insulators around the upper ring and base plate. The complete testing setup, along with an action shot are shown below:
The given specific impulse of R-candy is about 120 seconds. With a mass close to 250 grams, I should obtain a total impulse of 120s * .25kg * 9.81 m/s^2 = 294.3 Ns. To calculate my total impulse, I had to integrate the load cell’s data through the burn time. I subtracted the weight of the motor casing for all times, then subtracted propellant weight, assuming the propellant was burned linearly throughout the burn (-250g at t = 0, -0g at end of burn). After this, I can approximate the integral of the thrust curve using a Riemann Sum. After this, I found a total impulse of 200.1 Newton seconds, corresponding to a specific impulse of 92.7 seconds. As such, the percent difference is %25.7.
This project was a very exciting journey for me. I learned a lot about the testing of aerospace systems, along with lessons on optimizing propellant and characterizing thrust. The most important lesson I learned, however, was the importance of a top-down approach when starting a project. Since this was my first project of this type, I started with something I thought was interesting and only later thought of how to obtain academic value or knowledge from it. This led to delays, wasted time/trials, and unnecessary costs. Going forward, I now know the importance of a proper plan and timeline before I begin any physical purchasing or building in a project.
Going forward, I do want to expand on this project. I would love to create a full model rocket around this motor and fuel data. I would also create a nozzle for this motor out of graphite or heat-resistant clay to get closer to the ideal ISP of the fuel. As for what I would have changed during this project, I would have created a horizontal test stand so that I would not have had to subtract casing/motor weights. I also would have purchased a phenolic tube to make insulation less of an issue.