Update natnet SDK. (#3249)

This commit is contained in:
Fabien-B
2024-06-06 11:31:06 +02:00
committed by GitHub
parent c158c856f3
commit 7f2d374c4f
5 changed files with 3494 additions and 399 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -38,6 +38,8 @@ import argparse
# import NatNet client # import NatNet client
from NatNetClient import NatNetClient from NatNetClient import NatNetClient
import DataDescriptions
import MoCapData
# if PAPARAZZI_HOME not set, then assume the tree containing this # if PAPARAZZI_HOME not set, then assume the tree containing this
# file is a reasonable substitute # file is a reasonable substitute
@@ -108,14 +110,14 @@ def is_moving(old_pos, new_pos):
# if failing, update position # if failing, update position
return True return True
def receiveMarkerSet(name, posList): def receiveMarkerSet(data: MoCapData.MarkerSetData):
''' '''
callback for markerset with name and marker position as input callback for markerset with name and marker position as input
''' '''
global current_index global current_index
for marker_data in data.marker_data_list:
# check if name is matching regexp # check if name is matching regexp
name = name.decode('utf-8') name = marker_data.model_name.decode('utf-8')
if re.fullmatch(args.name, name) is not None: if re.fullmatch(args.name, name) is not None:
# check if message should be sent (first time or period) # check if message should be sent (first time or period)
@@ -127,27 +129,27 @@ def receiveMarkerSet(name, posList):
if dt >= period: if dt >= period:
# period elapsed, check if moved # period elapsed, check if moved
markerset[name]['time'] = now markerset[name]['time'] = now
moved = is_moving(markerset[name]['pos'], posList) moved = is_moving(markerset[name]['pos'], marker_data.marker_pos_list)
if moved: if moved:
send = True send = True
markerset[name]['pos'] = posList markerset[name]['pos'] = marker_data.marker_pos_list
if dt_refresh >= args.refresh_period: if dt_refresh >= args.refresh_period:
# refresh period elapsed, send anyway # refresh period elapsed, send anyway
send = True send = True
else: else:
send = True send = True
markerset[name] = {'time_refresh': now, 'time': now, 'id': current_index, 'pos': posList } markerset[name] = {'time_refresh': now, 'time': now, 'id': current_index, 'pos': marker_data.marker_pos_list }
current_index += 1 current_index += 1
if args.very_verbose: if args.very_verbose:
print(name, posList, time) print(name, marker_data.marker_pos_list, time)
if send: if send:
if args.verbose and (not args.very_verbose): if args.verbose and (not args.very_verbose):
print(name, posList, now) print(name, marker_data.marker_pos_list, now)
# build list of 2D points and compute convex hull # build list of 2D points and compute convex hull
points = [(pos[X_AXIS], Y_SIGN*pos[Y_AXIS]) for pos in posList] points = [(pos[X_AXIS], Y_SIGN*pos[Y_AXIS]) for pos in marker_data.marker_pos_list]
hull = ConvexHull(points) hull = ConvexHull(points)
# build lists of polygon corners to display in lat long # build lists of polygon corners to display in lat long
latitudes = [ int(1e7 * (lat0 + np.rad2deg(points[i][1] / R_earth))) for i in hull.vertices ] latitudes = [ int(1e7 * (lat0 + np.rad2deg(points[i][1] / R_earth))) for i in hull.vertices ]
@@ -196,16 +198,14 @@ def check_timeout():
# start natnet interface # start natnet interface
natnet_version = (3,0,0,0) natnet = NatNetClient()
if args.old_natnet: natnet.set_server_address(args.server)
natnet_version = (2,9,0,0) natnet.set_client_address('0.0.0.0')
natnet = NatNetClient( natnet.marker_set_listener = receiveMarkerSet
server=args.server, if args.verbose:
markerSetListener=receiveMarkerSet, natnet.set_print_level(1) # print all frames
dataPort=args.data_port, else:
commandPort=args.command_port, natnet.set_print_level(0)
verbose=args.very_verbose,
version=natnet_version)
print("Starting Object Display interface at %s" % (args.server)) print("Starting Object Display interface at %s" % (args.server))
@@ -218,11 +218,11 @@ try:
check_timeout() check_timeout()
except (KeyboardInterrupt, SystemExit): except (KeyboardInterrupt, SystemExit):
print("Shutting down ivy and natnet interfaces...") print("Shutting down ivy and natnet interfaces...")
natnet.stop() natnet.shutdown()
ivy.shutdown() ivy.shutdown()
except OSError: except OSError:
print("Natnet connection error") print("Natnet connection error")
natnet.stop() natnet.shutdown()
ivy.stop() ivy.stop()
exit(-1) exit(-1)
@@ -156,6 +156,8 @@ import argparse
# import NatNet client # import NatNet client
from NatNetClient import NatNetClient from NatNetClient import NatNetClient
import DataDescriptions
import MoCapData
# if PAPARAZZI_HOME not set, then assume the tree containing this # if PAPARAZZI_HOME not set, then assume the tree containing this
# file is a reasonable substitute # file is a reasonable substitute
@@ -288,16 +290,19 @@ def performTransformation( pos, vel, quat ):
return pos, vel, quat return pos, vel, quat
def receiveRigidBodyList( rigidBodyList, stamp ): def receiveRigidBodyList( rigid_body_data, stamp ):
for (ac_id, pos, quat, valid) in rigidBodyList: for rigid_body in rigid_body_data.rigid_body_list:
if not valid: if not rigid_body.tracking_valid:
# skip if rigid body is not valid # skip if rigid body is not valid
continue continue
i = str(ac_id) i = str(rigid_body.id_num)
if i not in id_dict.keys(): if i not in id_dict.keys():
continue continue
pos = rigid_body.pos
quat = rigid_body.rot
store_track(i, pos, stamp) store_track(i, pos, stamp)
if timestamp[i] is None or abs(stamp - timestamp[i]) < period: if timestamp[i] is None or abs(stamp - timestamp[i]) < period:
if timestamp[i] is None: if timestamp[i] is None:
@@ -380,32 +385,44 @@ if not run_test_cases:
ivy = IvyMessagesInterface("natnet2ivy") ivy = IvyMessagesInterface("natnet2ivy")
# start natnet interface # start natnet interface
natnet_version = (3,0,0,0) natnet = NatNetClient()
if args.old_natnet: natnet.set_server_address(args.server)
natnet_version = (2,9,0,0) natnet.set_client_address('0.0.0.0')
natnet = NatNetClient( natnet.rigid_body_list_listener = receiveRigidBodyList
server=args.server,
rigidBodyListListener=receiveRigidBodyList,
dataPort=args.data_port,
commandPort=args.command_port,
verbose=args.verbose,
version=natnet_version)
if args.verbose:
natnet.set_print_level(1) # print all frames
else:
natnet.set_print_level(0)
if args.old_natnet:
natnet.set_nat_net_version(2,9)
print("Starting Natnet3.x to Ivy interface at %s" % (args.server)) print("Starting Natnet3.x to Ivy interface at %s" % (args.server))
try: try:
# Start up the streaming client. # Start up the streaming client.
# This will run perpetually, and operate on a separate thread. # This will run perpetually, and operate on a separate thread.
id_dict, timestamp, period, track, q_total, q_nose_correction = process_args(args) id_dict, timestamp, period, track, q_total, q_nose_correction = process_args(args)
natnet.run() is_running = natnet.run()
if not is_running:
print("Natnet error: Could not start streaming client.")
exit(-1)
sleep(1)
if not natnet.connected():
print("Natnet error: Fail to connect to natnet")
exit(-1)
if args.verbose:
print_configuration(natnet)
while True: while True:
sleep(1) sleep(1)
except (KeyboardInterrupt, SystemExit): except (KeyboardInterrupt, SystemExit):
print("Shutting down ivy and natnet interfaces...") print("Shutting down ivy and natnet interfaces...")
natnet.stop() natnet.shutdown()
ivy.shutdown() ivy.shutdown()
except OSError: except OSError:
print("Natnet connection error") print("Natnet connection error")
natnet.stop() natnet.shutdown()
ivy.stop() ivy.stop()
exit(-1) exit(-1)