yarp-devices
Loading...
Searching...
No Matches
exampleOfflineTrajectoryAsync.py
See also
exampleOfflineTrajectoryAsync.cpp
Tutorial: Trajectory Execution (external)
1
8import argparse
9import math
10import time
11import yarp
12
13parser = argparse.ArgumentParser(description='perform an offline trajectory via position commands with a variable period')
14parser.add_argument('--remote', default='/teo/leftArm', type=str, help='remote port')
15parser.add_argument('--joint', default=5, type=int, help='joint id')
16parser.add_argument('--speed', default=2.0, type=float, help='trajectory speed (deg/s)')
17parser.add_argument('--target', default=-20.0, type=float, help='target position (deg)')
18parser.add_argument('--period', default=50, type=int, help='command period (ms)')
19parser.add_argument('--ip', default='pt', type=str, help='interpolation submode [pt|pvt]')
20args = parser.parse_args()
21
22yarp.Network.init()
23
24if not yarp.Network.checkNetwork():
25 print('Please start a yarp name server first')
26 raise SystemExit
27
28options = yarp.Property()
29options.put('device', 'remote_controlboard')
30options.put('local', '/exampleOfflineTrajectoryAsync')
31options.put('remote', args.remote)
32
33dd = yarp.PolyDriver(options)
34
35if not dd.isValid():
36 print('Remote device not available')
37 raise SystemExit
38
39mode = dd.viewIControlMode()
40enc = dd.viewIEncoders()
41posd = dd.viewIPositionDirect()
42var = dd.viewIRemoteVariables()
43
44if mode is None or enc is None or posd is None or var is None:
45 print('Unable to acquire robot interfaces')
46 raise SystemExit
47
48p = yarp.Property()
49p.put('ipMode', args.ip)
50p.put('enableIp', True) # important: place this last
51
52b = yarp.Bottle()
53b.addList().fromString(p.toString()) # additional nesting because of controlboardremapper
54
55if not var.setRemoteVariable('all', b):
56 print('Unable to set interpolation mode')
57 raise SystemExit
58
59if not mode.setControlMode(args.joint, yarp.VOCAB_CM_POSITION_DIRECT):
60 print('Unable to set position direct mode')
61 raise SystemExit
62
63time.sleep(0.1) # hacky, but we need to make sure remote data arrived prior to calling getEncoder()
64initialPos = enc.getEncoder(args.joint)
65
66print('Current enc value: %d' % initialPos)
67input('Press ENTER to start')
68print('Moving joint %d to %d degrees...' % (args.joint, args.target))
69
70distance = args.target - initialPos
71increment = math.copysign(args.speed * args.period * 0.001, distance)
72count = 1
73newDistance = 0.0
74start = time.time()
75
76while abs(distance) > abs(newDistance):
77 newDistance = count * increment
78 position = initialPos + newDistance
79 print("[%d] New target: %f" % (count, position))
80 posd.setPosition(args.joint, position)
81 count += 1
82 # https://stackoverflow.com/a/25251804/10404307
83 time.sleep(args.period * 0.001 - ((time.time() - start) % (args.period * 0.001)))
84
85dd.close()
86yarp.Network.fini()