Figure 1: Annotated Assembly of Walker
The Walker Wizard was able to drive to a user with a single push of a button and navigate through a single story apartment without bumping into walls or obstacles. This task required a knowledge of position and environment. Pozyx was used to obtain positional data. The data was initially very noisy, but with a median and low pass filter an accuracy of 10 cm was obtained.
The logic of the walker was run on a Raspberry Pi. This module was chosen since it has more processing power than other microprocessors in that price range. Also, it has inputs for cameras, which will allow future engineers to integrate cameras to get better obstacle avoidance and localization. The microprocessor, connected sensors, and drive motors were powered by a 12 V rechargeable lithium ion battery. A step-up voltage regulator to 24 V was included onboard for powering the drivetrain engagement clutches. To recharge its battery, the Walker needed to locate and dock into its charging base without user input. This was done by creating a custom charging base that fits the Walker form factor. Contacts were designed and mounted on the Walker as well as the charging base in order to charge the battery.
Ultrasonic sensors with a sensing capability of over 1 meter were selected to allow the Walker to come to a complete stop before impacting any obstacles.
Drivetrain
The walker must be powered in order to move autonomously. Two electric 12 V DC motors drove the rear (fixed) wheels as seen in Figure 1. The front wheels pivoted freely, allowing for simple differential steering when driving the rear wheels independently. Locomotion was achieved through friction drive: the motors turned a wheel that was pressed by springs into the rear tires. Friction drive was selected to facilitate the add-on kit aspect of the project. A top speed of 0.8 m/s was targeted. Gear reduction of 27:1 through the gearbox and 64:1 to the ground was achieved by using an off-the-shelf geared motor equipped with a planetary gearbox. Traction from the gearbox was transmitted through an electromagnetic clutch that was only engaged when the Walker system was in its self-driving mode, allowing for Walker manual use without backdriving the motors.
Figure 2: Exploded Diagram of Drivetrain with Annotations (see Parts List for annotation references)
The Pozyx system was used to obtain positioning data. Two filters were applied to filter the incoming positioning data. For one there was a median filter used. The median filter filtered out large irregularities in the incoming stream of data. In addition a first order low-pass filter was applied to reduce high frequency noise. The filter was designed for a 20 Hz sampling rate and a 2 rad/s cutoff frequency. The 2 rad/s were chosen, because the walker doesn't oscillate at high frequencies. Making those assumptions the following filter was obtained:
Figure 3: Overview of Pozyx system
The learning algorithm helps the Walker map out its environment. It learns what paths are safe to traject in a single story apartment. It should output safe nodes as well as the connection between those safe nodes. The Learning algorithm was tested and established the nodes and connections as intended. The output is saved in a .csv file and can be read by the motion algorithm. The learning algorithm was implemented in Python to match the language of the other functions programmed. The Learning algorithm learns with the user. The user has to toggle learning mode by pushing the button for 3 seconds. Once learning mode is activated the robot should be driven around the apartment as thoroughly as possible to get the best mapping. A new node is established when a threshold distance is exceeded. The node position and node connections are then added to corresponding arrays. If a path intersects already existing paths the algorithm will take note of that and establish connections in the adjacency table. The learning algorithm also integrated a function that graphically displays the nodes that were established as well as the BFS algorithm that calculates a tree from the established nodes, making it easy to find the shortest connection between two arbitrary nodes. One should try to avoid trajecting paths that will in the future be permanently blocked such as by a moving table.
While the learning algorithm creates a map of nodes that the Walker can traverse, it still needs another algorithm to know how to navigate to and from those nodes. The resulting motion algorithm needs to do the following:
Read data from the file produced by the learning algorithm to obtain node information.
Locate the node closest to the Walker and drive it to that node.
Locate the node closest to the remote and calculate a path to that node from the map of nodes.
Drive the Walker along the aforementioned node path.
The motion algorithm in its entirety can be found in the appendix.
The .csv file created by the learning algorithm describes the coordinates of each node and how they connect to one another. Figure 4 demonstrates how the algorithm navigates to a node. The motion algorithm calculates the closest node to its current location by simply comparing the distances between its current coordinate, as given by the Pozyx system. In Figure 4, the nearest node is designated as the target node.
Figure 5: Diagram of System Logic
The left side of the above figure including the Pozyx, filter, BFS and learning algorithm are one separate program. This is the first program that is run. This will allow the user to map out the single story apartment. The different subsections of this program are split up in threads. The threads share the information among themselves using queues. Threading was chosen opposed to ROS, because it is easier to implement. The functions are able to be timed as wished with defined delays.
After the learning algorithm has been run and the environment was mapped, the motion program will use this reference data in conjunction with its current filtered position data to traverse its environment to the target location. If there is a new unknown obstacle in the way the algorithm will trigger the ultrasonic sensor and the robot will either try to traverse the path or fail.
Charging System
A 12 V lithium ion battery was purchased and utilized to power the microprocessor, motors and Raspberry Pi. The battery needed to be recharged without human intervention. This was done by creating a custom charging base for the walker. The base consists of copper contacts placed on both the walker and the base. The base was a wooden prototype with a groove to hold the wheels. Once the walker reached the groove, it would sit in place and charge until called upon. Copper plates were mounted to the raised platform behind the groove as shown in the figure below. Springs were hose clamped onto the walker, and on the end of these springs compressed copper pipes were closed into place. This provided a completed circuit and charged the battery.
Figure 4: Illustration of Node Navigation
Once the closest node has been identified, the algorithm navigates the Walker to the node by turning the Walker so that the front of the Walker is directly facing the node. To do so, the Pi calculates the angle between the vector protruding out the front of the Walker and the vector going from the center of the Walker to the target node. This angle is illustrated as θ in box 1 of figure 11. The Pi then commands the Walker to turn until that angle is equal to 0. The final configuration of this step is illustrated in box 2 of Figure 4, where the black bar portion is the front of the Walker.
Then, the algorithm commands the motors to drive the Walker forward. This corresponds to box 3 of Figure 4. As it is doing this, the Raspberry Pi on the walker continuously calls to the Pozyx system to get information on the current coordinate of the Walker. The Pi uses that information to calculate the distance between the Walker and the coordinate in real time, as the Walker drives forward.
How the logic comes together
Figure 6: Charging Base Design
Testing our final design
We found that the walker drives at 0.59 m/s. The target was 0.8 m/s.
The walker can localize its position through the Pozyx within an accuracy of 10 cm using the combination of a median filter and a lowpass filter
The walker can be called to specified coordinates with the single push of a keyboard button. It will navigate to the nearest node.
The walker can be summoned to the location of a second Pozyx tag such as the position of a user button. It will navigate to the nearest node.
The walker is safe to use, with a positively disengaging drivetrain, capacitive touch sensors, ultrasonic sensors, and bright flashing lights as well as sounds when in motion autonomously.