|
The Problem
There are injured victims inside of a room and we must build at least one autonomous robot to enter the room and humanely rescue the injured victims and bring them back to the safe zone, then exit the room within 10 minutes while it is still safe to do so.
|
|
|
Our Solution
We built a robot that would rescue one or two victims at a time by holding them inside its hollow frame, and then drop them off in the safe zone.
We used a camera calibrated in RGB mode to sense the green color of our victim dolls. This camera was attached to a servo motor that we had preset to face the camera in two directions: forward for searching and down for checking that the robot is currently carrying a victim before returning home. (See the center of Figure 1, or the top center of Figure 2).
To pick up the victims, we had a conveyor belt run by a continuous servo and asynchronous paddles in the front with horizontal axes. They were asynchronously controlled by separate motors in case one paddle got jammed or stuck on a victim; this way, there would still be one paddle. The paddles would scoop the victims up onto the conveyor belt when rescuing them. The conveyor belt would then pull the victims into the holding bay. (See the bottom center of Figure 1 and Figure 2 to see both). In the reverse direction, the conveyor would expel victims when in the safe zone. An IR sensor would indicate when the robot had passed into or out of the safe zone, marked by black electrical tape along the floor. (This was located on the back of the robot, see the bottom center of Figure 3).
A unique thing about our robot was the manner in which the continuous servo was attached to the conveyor belts and robot itself. We first put together the conveyor belt to fit our robot. It had 5 axels going across our robot, each with 5 gears across it. The gears were connected by linked chain, creating the conveyor belt. (Again, see the bottom centers of Figures 1 and 2.) The backmost axel was geared and connected to a sixth, shorter axel, which was connected to the servo using u-joints. This can be pictured better on the center of Figure 3, which is labeled for your convenience. We decided to do this because the placement of the back axel made lining the servo up tremendously difficult. Using the u-joint allowed us to mount it where it was easy, slightly not lined up with the sixth axel, and it was still strong enough to turn it. Furthermore, after the first few test runs, we realized that if the victims went onto the conveyor belt length-wise, their head/feet would get caught in our u-joint assembly. To fix this we added the paper in between the bay where the victims were held and the servo/u-joint/axel assembly. You can see this modification in Figure 1, behind the camera assembly, as well as in the backgrounds of Figures 2 and 3.
Our robot used a compass and bend sensors to navigate. Based on our knowledge of the field, we created a search algorithm such that the robot would search in a circuit around the field based on pre-calibrated compass headings. You can see the compass clearly in the top right of Figure 1. Each turn it made in the circuit had a certain assigned number, so the robot knew which turn it made last. This made it easier for the robot to resume its search after rescuing victims without restarting the search by keeping track of where in the circuit it left off. Instead of scanning from the beginning location, it would drive to its last turn of the circuit and then resume scanning. Bend sensors in front would tell the robot it had run into a wall and needed to back up and change direction. (The bend sensors can be seen in the front left and right of Figure 1). This was also when the current “turn” number was updated. Bumpers on the sides kept the robot from getting stuck when it ran into the center island at just the wrong angle. This also served to gently nudge victims out of the way instead of pushing them forward several tiles, such as the worst-case-scenarios where the camera does not see a victim. (You can slightly see the colorful blue and green bumpers on the bottom sides of the robot in Figures 1 and 2).
To exit the field, our robot found the northeast corner of the field (the upper right corner next to the door) and followed the wall with a side-mounted bend sensor until it could exit. This bend sensor is clearly seen to the left of the robot in Figure 1.
|
|
|
What Worked & What Didn't
Our paddles with conveyor belt worked very well at picking up and dropping off victims. Our holding bay was not quite deep enough to hold one sideways victim and a second lengthwise victim, so we added a last minute paper tray just in front of the robot that would keep the head or feet of victims held like this from dragging on the ground. This paper can clearly be seen in the bottoms of both Figure 1 and 2. As mentioned above we also added paper in between the conveyor belt bay area and the servo/u-joint assembly to prevent the victims from being caught and snapping the axel off (and murdering the victim in the process.
Additionally, since our robot was so wide, we were having trouble with the wheels. They would not stay on their rims, and that made the robot not tall enough to clear the ground. We first tried to mend this by buying drywall foam, and filling them. That did not work, however, so we filled the two wheels with hot-glue, and then glued them to the rims. This actually worked very well, as you can see in Figure 3, even when the wheels were bowed slightly, the robot still cleared the ground.
Our search algorithm was very complete and – in the right conditions where the robot does not get thrown off course – can rescue all victims. Unfortunately, one of our motors was stronger than the other – particularly when the battery dropped below 10 volts – and so sometimes our robot would veer to one side (despite our efforts to compensate in our code). Coupled with a wide margin of error when turning to specific headings, this led to instances where the robot hit the middle island before reaching the back wall of the field, so it thought it was in a different place that it was, and this invalidated our search algorithm. Fortunately, our algorithm was complete enough that our robot would eventually get back on track, but it would waste a lot of time and not all victims would be rescued in 10 minutes.
Our exit routine worked well but it had one main bug. It would get stuck while using the side bend sensor to follow the wall, and not be able to move or make it out. However, for the last run we added an additional bumper on the right side of the robot to keep it far enough away from the wall that it would not get caught on it, and it allowed the algorithm running the exit routine to work very well. The wall bumper can be seen in Figure 1, slightly in front of the side bend sensor. Aside from the instances where it was caught on the wall (before we added the bumper) the exit routine worked perfect nearly every time.
Using sonar, we could have programmed our robot to follow walls and always know where it was. Issues with our sonar lab due to drivers shied us away from trying to implement sonar in our search algorithm.
|
|
|
Figures (click to enlarge)
Figure 1: Full Robot
Figure 2: Front View
Figure 3: Back View
Final Project Code ("workingversion")
|
|
|
|
|