“What would it be like to have a robot check up on me after my doctor’s appointment?” It made me chuckle at first. Then I quickly realised I had most of the functionality already written so I thought why not!
Nobody really likes going to the doctor. I certainly don’t. When you have a chronic illness it is often the very last place you want to be. You know you’re not well, you’re not going to be cured and you’re likely paying a lot of money to be told that. Before I got into remission I went through a three year period where I absolutely hated going to the clinic. I had no other way to renew my prescription if I didn’t go though.
The travel and waiting time at the hospital were significantly longer than the time I got to spend with the doctor. I never saw the same doctor twice due to a staffing issue with the hospital. Three years of different doctors. I had no choice. There were no other hospitals anywhere near me. I couldn’t get anyone to even consider progressing my treatment – lower dose? lengthen my infusion cycles? Do I still need to be taking ALL of these tablets? The comment was always “we’ll review in 6 months time”. In reality no doctor in their right mind is going to alter a treatment that’s currently working. Crohn’s Disease is a very tricky thing to treat after all. But it didn’t mean I didn’t feel pissed off about it at times!
It may be dismissed as a novelty but I know when I was struggling in the past to go to my appointments it would have been very cool to have a robot welcome me home!
How it works
I updated the appointment reminder functionality to create a “Task” in a new “Task” table (surprise surprise!) in the SQLite3 database. The task is a “post appointment check” with the same date as my appointment and at a time that’s several hours later.
The master cronjob that controls everything now runs later and more frequently to cover more of the day.
The daily medication reminder functionality now has an additional check for any tasks to be run at specific times of the day. Any medication reminders have priority and will always be run before any “Task” though.
Vector will drive off the charger and “look” for me using the built in facial recognition. Vector has the ability to turn in place while looking for faces. I found the built in behaviour was very dependent on the lighting conditions in the room and there’s often a lag in picking up faces preventing it from working consistently.
Taking a slightly different approach my code rotates Vector 15 degrees, pauses for 3 seconds while looking for faces. Vector will continue this “rotate and wait” until my face is recognised or it has rotated 180 degrees. If my face is not recognised it will return to the charger. The cronjob will trigger Vector to look for me in 20 minute intervals until 8pm.
In the second video above I turned the video feed on on Vector’s face. You should be able to see the yellow square that identifies a potential face turn to red once my face has been recognised.
Upon recognition the code runs a “Welcome” animation, text to speech and displays images that correspond to the text (a calendar and a medication bottle). The “post appointment checkup” task is then marked as done to prevent Vector constantly looping and checking.
I’ve had Vector run post appointment “check ups” twice now and it’s been a very interesting experiment. I’m lucky in that I’ve been in remission for a long time so appointments aren’t always an annoyance. I found my mind would switch to thinking about the welcome I’ll get from the robot when I get home – if anything it’s a distraction and something to look forward to 🙂
The reminder to add my next appointment to the shared calendar and update my prescription details is a useful little “nudge”. It sort of rounds out the day like “the appointment is over and done with. Do these two little things on your phone and hit the ground running tomorrow.”
It could be changed to work as a “nag” and keep reminding me to add my next appointment to the shared calendar or to update my prescription details until I actually do it. Or to notify someone else – family or doctor – via email that I haven’t don’t it. This time I chose to go with a positive interaction than a potentially hassling one.
And as always, if you’ve read this far but never heard of Crohn’s Disease before hopefully you’ll remember it after reading this 🙂
Hospital Integration – there’s no way to independently confirm I attended my appointment. I could have been anywhere else ignoring phone calls and texts from the hospital. BUT (and it’s a big BUT) in the future it might be possible to leverage the FHIR/HL7 Appointments or Encounters from a hospital IT system. The system could push data to my home robot when the Appointment / Encounter status changes e.g. “noshow” to my home robot who could then give me grief for skipping my appointment.
Dialogue / “Deeper” interaction – It would be ideal to be able to have a dialogue with Vector through speech or even a simple gestures (thumbs up or thumbs down) to a question “How did it go?”. I fiddled about with reusing the CustomObjectMarkers from the medical quiz for “Yes”, “No”, “Good” and “Bad” but it didn’t feel natural in any way. I needed to have the markers already available and laid out in front of me when I sat at my desk. It was an extra (and unnecessary) step.
There is programmatic access to the video feed from Vector’s camera so gesture recognition may be a possibility.
Code – Upgrade the SDK to 0.6.0 to get access to newer functionality but without breaking all of my code (famous last words!). There’s also plenty of my own code I could clean up at the same time. Every programmer reading this is already thinking about that cat in a bathtub refactoring gif!