Hello all! I have been following the InMoov and MyRobotLab projects for a couple years now. This was the main reason I bought a 3d printer and I started with a hand and forarm. Then life got busy and I took a break for a bit. Since the beginning of the year I have been plugging away on the head, torso and shoulders.
Before I start with my topic, I wanted to send out a thousand thank you's to everyone who has contributed to these two communities. Gael (@hairygael) has been an amazing thought leader with all his creative designs and community support. Greg (@GroG) has built out a massive code base that provides the underlying framework to enable development which bridges the gaps between the digital and physical worlds. I see a lot of great work currently being submitted by Kevin (@kwatters), @astro and many others. However the list of contributors over the years is far too long to call out individually. Thank you all for your dedication, curiosity and patience. You have all made this world better.
Now to bring it back on topic, one of the design decisions I have been focused on achieving is to keep the various components somewhat isolated with their own PCA9685 servo controller. This design is similar to @ray.edgley. This will simplyify the wiring throughout the body and will help improve isolated experamentation with each significant component (head, left arm, right arm, torso). I have had no issues with getting the components connected and individually managed through MyRobotLab.
My challenges begin when I try using some of the aggregate services like InMoovHead as that seems to have a strong opinion on how the servos are connected. Since my background is build engineering, I happily jumped into the code and started tweaking to eliminate the hardcoded dependencies on particular named controllers (i01.left) and instead provide my PCA9685 (headdrvr). Although I seem to have some success, I keep finding implementation nuances that seem to be different between the Adafruit16CServoDriver ServoController implementation and the Arduino ServoController implementation that seems to be causing some issues. For example, when the onServoSetSpeed() method is called from the Adafruit16CServoDriver it seems to be setting the velocity attribute on the servo pulled from the servoMap. However in the Arduino implementation, it appears to put a message on the bus with the new speed that is interpreted by MrlComm (still a little fuzzy here).
I am happy to keep hacking my way through here, but I wanted to throw my current status out there in case there were any fundamental flaws in the way I am thinking about this problem. If I am heading in the right direction, I will send a follow up post once I have something fully working with all the necessary code changes. I'd be happy to submit a pull request upstream if that would be helpful as well.