Dynamic Obstacles for Powered Wheelchair
Single actor system
Project:
Description:
The objective of this project was to create dynamic obstacles for a Semi-autonomous wheelchair study. The wheelchair is equipped with a LUCI system which consists of an array of camera’s and sensors to enhance the capabilities of the wheelchair. The purpose of this project was to stress test the system by using robot robots as dynamic obstacles for the wheelchair to detect and record the reaction of the users and the system to these moving obstacles.
There were two major milestones for the project:
- Single robot interaction
- Swarm system with 3 robot emulating a crowd
Hardware used:
First Hardware iteration:
The Hardware used was a Mecanum wheel drive robot to emulate human like movement in both x-y directions. The hardware list included raspberry pi 4b as the controller, polulu motors and motor drivers and adafruit PWM board. The BOM is attached as an excel file here.
Machining HEX Mecanum Wheel Coupler
The first version of the coupler were 3D printed which were not the most reliable, so decided to machine aluminum hex coupler from a square bar. This was done using a Mill and a CNC lathe.
Second Hardware Iteration
For the second iteration, a control board from Yahboom was used with a ROS2 controller in-built for mecanum wheel robot. The BOM is attached as the excel sheet.
Both these iterations were used for the swarm system created.
Software Created:
- C++ driver for first iteration of hardware
- Created a custom ROS2 and C++ driver for the first Iteration of the robot. The hardware wasn’t ROS supported so I created a c++ driver which can supply required PWM to the controller for the robot speed control. I used open source packages to be able to control the pins for the raspberry Pi (Wiringpi) and also a c++ package create for the PWM driver.
- Kinematics Library for Mecanum Drive
- Created a c++ kinematics library using Modern Robotics to control the robot using a commanded twist. This allows a smooth control of the robot in the desired direction and using the driver allows the speed control of the robot. The library provides Inverse Kinematics and Forward Kinematics provided the radius of the wheel and the length and and width of the robot.
- ROS2 C++ package for robot control
- Integrated the driver and the library to create a package to control the robot using a commanded twist. The twist can be published on the /cmd_vel topic which will be read by the robot.
- For the video here to test all the possible movements, I used the teleop_twist_keyboard to command a twist.
- Joystick Control of the Robot
- Used a PS4 controller and the ros2 joy_node to create a joystick control of the robot. This was done with the use of the controller already created.
- Non Reactive Speed Control
- Created a package to create a non reactive speed control of the robot. This was done as the first iteration of the obstacle where the robot was completely un-reactive to the environment. This was a more uncontrolled version where the robot would move in a straight line. Multiple services were created to perform different kinds of speed control.
- The 4 speed versions were as follows:
- Slow Speed - The speed was set at 1000pwm, the slowest the robot could move.
- Fast Speed - The speed was set at 4095pwm, the fastest the 12 bit PWM can achieve.
- Human Speed - For a average human speed (3km/hr), the pwm was set for 2650.
- Erratic Speed - A set of 4 speed was created where the robot would cycle through them.
- Reactive Controller for Single Obstacle
- The reactive controller is set up around the car being controlled with a twist. The actors in the scene for a single robot are the robot car and the wheelchair.
- For the proof of concept a simulation was created in simulation where the robot car was controlled using twist and the wheelchair would be non reactive. The two scenarios which I tested were a static wheelchair and a wheelchair that moves in a straight line.
- The robot is commanded a twist towards the goal location which is set, while on its way there if the robot comes in the wheelchair collision radius, it receives a twist tangential twist which makes it avoid the wheelchair until it gets out of the collision radius. Once the obstacle is avoided it follows a path towards the goal pose and stops there.
- Here are the two videos side by side
- After this proof of concept, I tested the code in real env. To do that, I used a global camera (realsense 455d) which can look at the entire map where the experiment was conducted. To get the locations of the objects in the frame apriltags were used. A world frame apriltag was set up as the connection between the camera and the floor. The other apriltags were considered in relation to the world apriltag on the floor.
- To test the robot car reactivity to the movements in apriltags, without setting it up on the wheelchair, kyle moved around the wc apriltag to see how the robot car would react and reach the goal.
- Some fails and examples are as below:
- After some iterations and getting the right movements and things, Here are the final videos of the car reacting to the wc movement. This video has changed hardware in terms of the car chassis but not for the electronics. The video test is now with a powered wheelchair and the car.
- To get a better interaction an additional goal pose was added in front of the wheelchair, the controller was changed where the first task for the robot car is to reach in closer to the assigned pose, once it does that, it avoids the wheelchair and then follows a path towards the goal pose. This allows forces interaction with the wheelchair user and get better result.
- In the test below, the robot car will first path towards the wheelchair, avoid it and then path towards the goal pose.
Acknowledgements
- Larisa Loke
- Joel Goh
- Kyle Puckett, Demiana Barsoum - For help with testings
- Dr. Brenna Argall