It is still work in progress, but we already have a working prototype of this new Poppy Creature. It is based on the really low-cost dynamixel XL-320 motors. Those motors are now supported in pypot since version 2.2!
Thanks to @jgrizou, all the 3d printed parts were done using OpenSCAD and can thus be easily modified, hacked, tuned!
The hardware and software are already available on the github repository. It still needs some work but we are really excited to see what people will be able to do with this new creature. Or even better what kind of new creature they can imagine with this low-cost solution!
Oh and btw it can jump pretty well ^^
The code to make your own PoppyErgoJr jump is available as a notebook here.
c:\python27\lib\site-packages\pypot-2.7.1-py2.7.egg\pypot\dynamixel\io\abstract_io.pyc in scan(self, ids)
219 def scan(self, ids=xrange(254)):
220 āā" Pings all ids within the specified list, by default it finds all the motors connected to the bus. āā"
ā 221 return [id for id in ids if self.ping(id)]
222
223 # MARK: - Specific Getter / Setter
From what the error shows Iām guessing you did not configure your motors so they all have the same id: 1. Thus when you plugged multiple motors on the same line collisions occurs (DxlCommunicationError).
Yeah I have the same issue as you do. I interpret this very odd āNone Errorā on the XL-320 as a current issue.
A very simple way to circumvent the problem is to change the way errors are handled in pypot. You can add the following lines to the BaseErrorHandler:
def handle_none_error(self, packet):
pass
This should work but itās not really fixing the problem. Iām stil investigating why those issues are raised. I let you know if I found anything. Otherwise Iāll just try/catch the errorā¦
Another strange things (maybe a relation ?) The goto method doesnāt reach the position. The time is respected but the goal position is clearly not reach.
The difference is important in dummy mode and huge in minjerk mode. For example, this small sequence :
I guessed that with the wait argument the motor 3 (m3) should reach his position before to continue the running but in reality the wait=true act like a time.sleep=(3) and m3 never goes to 130 degrees. About 100 in dummy and less than 50 using minjerk.
Dummy
Minjerk
Is it a reproductible issue or a problem with my computer ?
EDIT 1 :
More info about my problem to control the motors : Pypot main update loop seems to run slowly than 50 Hz and this raise problem because the calculated time become different from the real time. Iāll need to investigated more.
Sorry @juju I still havenāt find time to check your problem in details.
Yet,
Yes! This a very important point! You can not force the run loop (or any other loops BTW) to really run at 50Hz except if you are running a real time OS.
Thus, if you want to do something time dependant, you should follow the examples we have used for the sinus primitive. The idea is not to suppose your update loop will be called every 20ms but to directly get the current time from the system. BTW, this is also the only way you will be able to have the same code running on the simulator (where times is not the same than in reality) and on the real robot: