bon ça y est, ça marche : il faut effectivement ne pas déclarer dans le json le motor que l’on veut piloter par dxlio
.
Voici le détail d’une manip test que j’ai faite avec une Raspberry pi 2 et 2 moteurs : le moteur numéro 10 est déclaré dans le json et le moteur numéro 11 (celui avec un étrier plastique gris) est piloté low-level par dxlio
.
Le json est :
{
"controllers": {
"upper_body_controller": {
"sync_read": true,
"attached_motors": ["one"],
"port": "auto"
}
},
"motorgroups": {"one": ["m11"]},
"motors": {
"m11": {
"offset": 0.0,
"type": "MX-28",
"id": 11,
"angle_limit": [-180,180],
"orientation": "direct"
}
}
}
donc uniquement le moteur 10 !!!
J’ai fait un jupyter notebook pour faire tourner le moteur en mode “wheel” à 80 degrés par seconde, et si je tente de l’empêcher de tourner en bloquant l’étrier en plastique, la charge du moteur augmente et on sort de la boucle avec le moteur arrété et non compliant :
from __future__ import print_function
import time,
import pypot
pypot.__version__
'2.11.7'
from pypot.robot import from_json
jsonFile = "wheel.json"
poppy = from_json(jsonFile)
poppy.motors
[<DxlMotor name=m11 id=11 pos=-37.49>]
dxl_io = poppy._controllers[0].io # LA ligne qui permet d'attraper le contrôleur dxl
dxl_io.scan(range(15))
[10, 11]
dxl_io.set_max_torque({10: 90})
dxl_io.enable_torque((10,))
dxl_io.set_moving_speed({10: 100}) # 100 degrés par seconde
dxl_io.set_control_mode({10: "wheel"}) # fait tourner le moteur en continu
# tant qu'on ne met pas la vitesse à zéro...
dxl_io.set_moving_speed({10: 0}) # ici le moteur s'arrête !
#
# moteur tourne en free wheel et s'arrête quand la charge devient supérieure
# à un pourcentage donné (entre 0 et 100%) de la charge de démarrage...
#
import time
motor = 10 # motor number
percent = 10 # percent [0-100] of startLoad that will trigger a "motor stop"
dxl_io.enable_torque((motor,))
dxl_io.set_control_mode({motor: "wheel"}) # make motor go in "wheel" mode to make many turns
dxl_io.set_moving_speed({motor: 80}) # rotation speed in degree/seconde
time.sleep(0.2)
startLoad = abs(dxl_io.get_present_load((motor,))[0])
print("startLoad:", startLoad)
while True:
load = abs(dxl_io.get_present_load((10,))[0])
print(load, end=" ")
if load - startLoad > startLoad*(1 + percent/100) :
dxl_io.set_moving_speed({motor: 0}) # stop the motor and leave the loop
time.sleep(0.1)
break
time.sleep(.5)
print("\n out with startLoad:{} and load:{}".format(startLoad,load))
startLoad: 4.4
3.7 4.4 3.7 4.4 4.4 3.7 7.5 28.3
out with startLoad:4.4 and load:28.3
poppy.close()
Et hop !