111 lines
2.7 KiB
Python
Executable File
111 lines
2.7 KiB
Python
Executable File
#! /usr/bin/env python
|
|
import os
|
|
import json
|
|
from time import sleep
|
|
|
|
import rospy
|
|
import tf
|
|
from naoqi import ALProxy
|
|
|
|
from controller import inform_controller_factory
|
|
|
|
|
|
FW = None
|
|
BK = None
|
|
LT = None
|
|
RT = None
|
|
LR = None
|
|
RR = None
|
|
|
|
VMIN = 0.3
|
|
VMAX = 1.0
|
|
|
|
|
|
def thirdway(a, b):
|
|
return a + (b - a) / 3
|
|
|
|
|
|
def global_init():
|
|
global FW, BK, LT, RT, LR, RR
|
|
here = os.path.dirname(os.path.realpath(__file__))
|
|
with open('{}/../config/default.yaml'.format(here)) as f:
|
|
x = json.load(f)
|
|
|
|
cx, cy, cz = x['cr']
|
|
FW = thirdway(cx, x['fw']), x['fw']
|
|
BK = thirdway(cx, x['bk']), x['bk']
|
|
LT = thirdway(cy, x['lt']), x['lt']
|
|
RT = thirdway(cy, x['rt']), x['rt']
|
|
LR = thirdway(cz, x['lr']), x['lr']
|
|
RR = thirdway(cz, x['rr']), x['rr']
|
|
|
|
|
|
_inform_controller = inform_controller_factory('walker')
|
|
|
|
|
|
def _speed(pos, interval):
|
|
int_dir = 1 if interval[1] > interval[0] else -1
|
|
if int_dir * (pos - interval[0]) < 0:
|
|
return 0.0
|
|
elif int_dir * (pos - interval[1]) > 0:
|
|
return 1.0
|
|
else:
|
|
return (VMAX - VMIN) * abs(pos - interval[0]) / (
|
|
abs(interval[1] - interval[0])
|
|
) + VMIN
|
|
|
|
|
|
if __name__ == '__main__':
|
|
rospy.init_node('walker')
|
|
global_init()
|
|
rospy.wait_for_service('inform_controller')
|
|
ll = tf.TransformListener()
|
|
mp = ALProxy('ALMotion', os.environ['NAO_IP'], 9559)
|
|
mp.wakeUp()
|
|
mp.moveInit()
|
|
mp.setMoveArmsEnabled(False, False)
|
|
|
|
while not rospy.is_shutdown():
|
|
sleep(0.3)
|
|
try:
|
|
trans, q = ll.lookupTransform('odom',
|
|
'Aruco_0_frame',
|
|
rospy.Time(0))
|
|
rot = tf.transformations.euler_from_quaternion(q)
|
|
|
|
except Exception as e:
|
|
mp.stopMove()
|
|
_inform_controller('stop')
|
|
continue
|
|
|
|
movement = [0, 0, 0]
|
|
ref_vec = trans[:2] + rot[2:]
|
|
#-1 1 -1 1 -1 1
|
|
for i, dr in enumerate((BK, FW, RT, LT, RR, LR)):
|
|
idx = i // 2
|
|
sign = 1 if (i % 2) else -1
|
|
speed = _speed(ref_vec[idx], dr)
|
|
if speed:
|
|
movement[idx] = sign * speed
|
|
break
|
|
|
|
rospy.loginfo('WALKER: TRANS: {}'.format(trans))
|
|
rospy.loginfo('WALKER: ROTTN: {}'.format(rot))
|
|
rospy.loginfo('WALKER: MOVMT: {}\n'.format(movement))
|
|
|
|
if not any(movement):
|
|
rospy.logdebug('WALKER: STOP')
|
|
_inform_controller('stop')
|
|
mp.move(0, 0, 0)
|
|
continue
|
|
|
|
permission = _inform_controller('move')
|
|
|
|
if not permission:
|
|
mp.stopMove()
|
|
else:
|
|
mp.moveToward(*movement) # DON'T DELETE THIS ONE
|
|
pass
|
|
|
|
mp.rest()
|