Introduction: The RADbot

A project by Jackson Breakell, Tyler McCubbins and Jakob Thaler for EF 230

On Mars, astronauts will be subjected to a variety of dangers, ranging from extreme temperatures to dust storms. One factor often overlooked, however, is the danger presented by powerful radioisotopes residing on the planet's surface. The RADbot provides assistance to exploring astronauts on Mars' surface by identifying rock samples with high activities as it travels, and also has programmed-in safety features that utilize its cliff sensors, light sensors, bumper sensors and a camera, preventing the robot from damage on the unforgiving Martian terrain. Besides warning astronauts of possible radioactive dangers on the surface, the robot's radioactive sample location feature could be implemented as a tool to identify areas that could hold large deposits of Uranium and other actinides. Astronauts could mine these elements, enrich them sufficiently and use them in nuclear reactors and thermoelectric generators, which could help power a permanent, self-sustaining colony on the planet.

Unlike the typical Mars rover, our design features off-the-shelf components and a reasonable price tag. Provided you have the funds and the desire, you can even build one yourself by following this guide. Please read on to learn how to make your own RADbot.

Step 1: Acquire Necessary Parts and Materials

What you'll need to get started (Images placed in order they are listed)

1. One Roomba (any newer model)

2. One Geiger-Mueller Counter

3. One Raspberry Pi

4. One board camera with a USB outlet

5. One micro USB to USB cable

6. One USB to USB cable

7. One radioactive sample of sufficient activity (~5μSv or higher)

8. One computer with Matlab installed

9. Adhesive (Preferably duct tape for easy removability)

Step 2: Configuring the Camera and Geiger-Muller Counter

Now that you have all of the required materials to create the RADbot, we'll start by simply placing the camera so that it can read the activity on the counter. Place the Geiger-Muller counter as close to the end of the Roomba as possible, and make sure its sensor is not blocked. Secure the counter in place firmly with the adhesive you chose, and proceed to mount the camera to face it. Place the camera as close as possible to the counter's display to prevent outside inputs from affecting the program, and secure it in place once you feel comfortable. We recommend you save the securing of the camera for last, though, because, when your code is finished, you can display an image from the camera onto your computer, allowing you to position the camera based on its field of view. Once both the camera and counter are firmly in place, plug the camera into one of the USB inputs of the Raspberry Pi with the USB to USB cable, and plug the Raspberry Pi into the Roomba with the micro USB to USB cable.

Step 3: Connect to Your Roomba and Create Light Sensor Code

First, download the Roomba toolbox of the EF 230 website, and make sure to place it into the specified folders. To connect to your Roomba, simply reference the sticker attached to the Raspberry Pi and enter "r=roomba(x)" into the command window, without the quotation marks, and where x stands for the Roomba's number. The Roomba should play a tune, and the clean button should display a green ring around it. Start your code with a "while" statement, and refer to the light sensors as they appear in the sensor list. Open the sensor list by typing "r.testSensors" in the command window.

Based on the color of our object, which determines how much light is reflected, set the requirements for the while statement to be executed as a > function. In our case, we set the front light sensor to run the code in the while statement if the reading on the left or right center light sensors was >25. For the executable statement, set the velocity of the Roomba to slow down by typing "r.setDriveVelocity(x,y)" where x and y are the velocities of the left and right wheels respectively. Insert an "else" statement, so that the Roomba does not slow for unspecified values, and enter the set drive velocity command again, except with a different speed. End the while statement with an "end". This code segment will make the Roomba approach the object, and slow down once it reaches a certain range to minimize impact.

Attached is a screenshot of our code, but feel free to edit it to best suit your mission parameters.

Step 4: Create Bumper Code

As the Roomba is slowing down, it will minimize the impact it has on the object, although not so much that it doesn't trigger the physical bumper. For this segment of code, begin with a "while" loop again, and set its expression to be true. For the statement, set the variable T equal to the output of the bumper, either 0 or 1, for false and true. You can use the "T=r.getBumpers" for this. T will output as a structure. Enter an "if" statement, and set its expression for the substructure T.front to equal 1, and set the statement to either set the drive velocity at 0, using "r.setDriveVelocity(x,y)" or "r.stop". Enter a "break" so the Roomba can move after the condition in the next code is met. Add an "else", and set its statement to set the drive velocity to the normal cruising velocity of the Roomba.

Attached is a screenshot of our code, but feel free to edit it to best suit your mission parameters.

Step 5: Create Code to Read Counter Screen, Interpret It and Retreat From the Source

At the heart of our project is the Geiger-Muller counter and the following code segment is used to determine what the data on the screen means using the camera. Given our counter's screen changes color based on the activity of the source, we will set the camera to interpret the color of the screen. Start your code by setting a variable equal to the command "r.getImage". The variable will contain a 3d array of color values of the picture it took in red, green and blue. Set variables equal to the averages these respective color matrixes by using the command "mean(mean(img1(:,:,x)))" where x is an integer from 1 to 3. 1, 2 and 3 represent red, green and blue respectively. As with all the commands referenced, do not include quotation marks.

Have the program pause for 20 seconds using "pause(20)" so the counter can obtain an accurate reading of the sample, and then begin an "if" statement. We had our Roomba beep several times by using "r.beep" before having it display a menu with the text, "Radioisotope found! Caution!" this can be accomplished with the command "waitfor(helpdlg({'texthere'})". After clicking ok, the Roomba will continue to follow the rest of the code in the "if" statement. Have the Roomba drive around the sample using a combination of the commands "r.moveDistance" and "r.turnAngle". Make sure to end your if statement with an "end".

Attached is a screenshot of our code, but feel free to edit it to best suit your mission parameters.

Step 6: Create a Cliff Sensor Code

To create a code to make use of the Roomba's built-in cliff sensors, begin with a "while" loop, and set its expression to be true. Set a variable to be equal to "r.getCliffSensors", and this will result in a structure. Start an "if" statement, and set the variables "X.leftFront" and "X.rightFront" from the structure to be greater than some predetermined value, where "X" is the variable you chose the command "r.getCliffSensors" to be equal to. In our case, we used 1000, as a piece of white paper was used to represent a cliff, and, as the sensors approached, the paper, the values grew to well over 1000, ensuring the code will only execute when a cliff is detected. Add the command "break" after, and then insert an "else" statement. For the "else" statement, which will be executed if no cliff is detected, set the drive velocity to the normal cruising velocity for each wheel. If the Roomba does detect a cliff, the "break" will be executed, and then the code outside the while loop will be executed. After placing the "end" for the "if" and "while" loop, set the Roomba to move backward using the move distance command. In order to warn astronauts that a cliff is nearby, set the drive velocities of each wheel, x and y in the drive velocity command, to be a and -a, where a is a real number. This will cause the Roomba to spin, alerting the astronaut to the cliff.

Attached is a screenshot of our code, but feel free to edit it to best suit your mission parameters.

Step 7: Conclusion

The RADbot's ultimate goal on Mars is to assist astronauts in their exploration and colonization of the red planet. By identifying radioactive samples on the surface, our hopes are that the robot, or rover, in this case, can truly keep astronauts safe and help identify power sources for their base(s). After following all of these steps, and perhaps with some trial and error, your RADbot should be up and running. Place the radioactive sample somewhere within your testing area, execute your code, and watch the rover do what it was designed to do. Enjoy your RADbot!

-The EF230 RADbot Team