Micro Sawppy Beta 3 Running With HTML Control
After I established websocket communication between an ESP32 server and a phone browser JavaScript client, I needed to translate that data into my rover's joystick command message modeled after ROS joy_msg. For HTML control, I decided to send data as JSON. This is not the most bandwidth-efficient format. In theory I could encode everything into binary with two signed 8-bit integers. One byte for speed and one byte for steering is all I really need. However I have ambition for more complex communication in the future, thus JSON's tolerance for extra fields has merit from the perspective of forward compatibility.
Of course, that meant I had to parse my simple JSON on the ESP32 server. The first rule of writing my own parser is: DON'T. It's a recurring theme in software development: every time someone thinks "Oh I can just whip up a quick parser and it'll be fine" they have been wrong. Fortunately Espressif packaged the open source cJSON library in ESP-IDF and it is as easy as adding #include "cJSON.h"
to pull it into my project. Using it to extract steering and speed input data from my JSON, I could translate that into a joy_msg
data structure for posting to the joystick queue. And the little rover is up and running on HTML control!
The biggest advantage of using ESP32's WiFi capability to turn my old Nokia Lumia 920 phone into a handheld controller is cost. Most people I know already have a touchscreen phone with a browser, many of whom actually own several with older retired phones gathering dust in a drawer somewhere. Certainly I do! And yeah I also have a Spektrum ground radio transmitter/receiver combo gathering dust, but that is far less typical.
Of course, there are tradeoffs. A real radio control transmitter unit has highly sensitive inputs and tactile feedback. It's much easier to control my rover precisely when I have a large physical wheel to turn and a centering spring providing resistance depending on how far off center I am. I have some ideas on how to update the browser interface to make control more precise, but a touchscreen will never have the spring-loaded feedback. Having used a RC transmitter a few days before bringing up my HTML touch pad, I can really feel the difference in control precision. I understand why a lot of Sawppy rover builders went through the effort of adapting their RC gear to their rovers. It's a tradeoff between cost and performance, and I want to leave both options open so each builder can decide what's best for themselves. But that doesn't mean I shouldn't try to improve my HTML control precision.
[Code for this project is publicly available on GitHub.]