Skip to content

qtm.data.object.trajectory

Access and modify trajectories.

import qtm

# - Create an empty labeled trajectory
trajectory_label = "trajectory"
trajectory_id = qtm.data.object.trajectory.add_trajectory(trajectory_label)

# - Get measurement range
measured_range = qtm.gui.timeline.get_measured_range()
print(measured_range)
# {'start': 0, 'end': 2999}

# - Generate dummy 3d data
dummy_3d_data = []
for x_value in range(measured_range["start"], measured_range["end"]+1):
        dummy_3d_data.append({"position": [x_value, 1000.0, 1000.0], "residual": 0.0})

# - Add generated 3d data to the trajectory
qtm.data.series._3d.set_samples(trajectory_id, measured_range, dummy_3d_data)

print(qtm.data.object.trajectory.get_parts(trajectory_id))
# [{'range': {'start': 0, 'end': 2999}, 'type': 'virtual'}]

# - Split the trajectory in 3 parts
split_index_1 = 1200
split_index_2 = 1300
qtm.data.object.trajectory.split_part(trajectory_id, split_index_1)
qtm.data.object.trajectory.split_part(trajectory_id, split_index_2)

print(qtm.data.object.trajectory.get_part_count(trajectory_id))
# 3
print(qtm.data.object.trajectory.get_parts(trajectory_id))
# [{'range': {'start': 0, 'end': 1200}, 'type': 'virtual'}, {'range': ... ...

# - Remove the middle part of the trajectory
parts_to_remove_indices = [1]
qtm.data.object.trajectory.delete_parts(trajectory_id, parts_to_remove_indices)

print(qtm.data.object.trajectory.get_part_count(trajectory_id))
# 2

# - Get the range of created gap
gap_ranges = qtm.data.series._3d.get_gap_ranges(trajectory_id)
print(gap_ranges)
# [{'start': 1201, 'end': 1300}]

# - Use fill_trajectory to fill the created gap
fill_algorithm = "polynomial"
qtm.data.object.trajectory.fill_trajectory(trajectory_id, fill_algorithm, gap_ranges[0])

print(qtm.data.object.trajectory.get_part_count(trajectory_id))
# 3
print(qtm.data.object.trajectory.get_parts(trajectory_id))
# [ ... ... {'range': {'start': 1201, 'end': 1300}, 'type': 'filled'}, ... ... ]
-- - Create an empty labeled trajectory
trajectory_label = "trajectory"
trajectory_id = qtm.data.object.trajectory.add_trajectory(trajectory_label)

-- - Get measurement range
measured_range = qtm.gui.timeline.get_measured_range()
print(measured_range)
-- {start = 0, end = 2999}

-- - Generate dummy 3d data
dummy_3d_data = {}
for x_value = measured_range["start"], measured_range["end"] do
    table.insert(dummy_3d_data, {position = {x_value, 1000.0, 1000.0}, residual = 0.0})
end

-- - Add generated 3d data to the trajectory
qtm.data.series._3d.set_samples(trajectory_id, measured_range, dummy_3d_data)

print(qtm.data.object.trajectory.get_parts(trajectory_id))
-- {{range = {start = 0, end = 2999}, type = "virtual"}}

-- - Split the trajectory in 3 parts
split_index_1 = 1200
split_index_2 = 1300
qtm.data.object.trajectory.split_part(trajectory_id, split_index_1)
qtm.data.object.trajectory.split_part(trajectory_id, split_index_2)

print(qtm.data.object.trajectory.get_part_count(trajectory_id))
-- 3
print(qtm.data.object.trajectory.get_parts(trajectory_id))
-- {{range = {start = 0, end = 1200}, type = "virtual"}, {range = ... ...

-- - Remove the middle part of the trajectory
parts_to_remove_indices = {1}
qtm.data.object.trajectory.delete_parts(trajectory_id, parts_to_remove_indices)

print(qtm.data.object.trajectory.get_part_count(trajectory_id))
-- 2

-- - Get the range of created gap
gap_ranges = qtm.data.series._3d.get_gap_ranges(trajectory_id)
print(gap_ranges)
-- {{end = 1300, start = 1201}}

-- - Use fill_trajectory to fill the created gap
fill_algorithm = "polynomial"
qtm.data.object.trajectory.fill_trajectory(trajectory_id, fill_algorithm, gap_ranges[1])

print(qtm.data.object.trajectory.get_part_count(trajectory_id))
-- 3
print(qtm.data.object.trajectory.get_parts(trajectory_id))
-- { ... ... {range = {start = 1201, end = 1300}, type = "filled"}, ... ...}
:: - Create an empty labeled trajectory
for /f "usebackq delims=" %%i in (`curl -s --json "[\"trajectory\"]" http://localhost:7979/api/scripting/qtm/data/object/trajectory/add_trajectory/`) do (
  set "trajectory_id=%%i"
)

:: - Get measurement range
curl --json "" http://localhost:7979/api/scripting/qtm/gui/timeline/get_measured_range/
:: {"end":24,"start":0}

set measured_range={\"start\": 0, \"end\": 24}

:: - Generate dummy 3d data
set dummy_3d_data=[{\"position\": [0, 1000.0, 1000.0], \"residual\": 0.0}, {\"position\": [1, 1000.0, 1000.0], \"residual\": 0.0}, {\"position\": [2, 1000.0, 1000.0], \"residual\": 0.0}, {\"position\": [3, 1000.0, 1000.0], \"residual\": 0.0}, {\"position\": [4, 1000.0, 1000.0], \"residual\": 0.0}, {\"position\": [5, 1000.0, 1000.0], \"residual\": 0.0}, {\"position\": [6, 1000.0, 1000.0], \"residual\": 0.0}, {\"position\": [7, 1000.0, 1000.0], \"residual\": 0.0}, {\"position\": [8, 1000.0, 1000.0], \"residual\": 0.0}, {\"position\": [9, 1000.0, 1000.0], \"residual\": 0.0}, {\"position\": [10, 1000.0, 1000.0], \"residual\": 0.0}, {\"position\": [11, 1000.0, 1000.0], \"residual\": 0.0}, {\"position\": [12, 1000.0, 1000.0], \"residual\": 0.0}, {\"position\": [13, 1000.0, 1000.0], \"residual\": 0.0}, {\"position\": [14, 1000.0, 1000.0], \"residual\": 0.0}, {\"position\": [15, 1000.0, 1000.0], \"residual\": 0.0}, {\"position\": [16, 1000.0, 1000.0], \"residual\": 0.0}, {\"position\": [17, 1000.0, 1000.0], \"residual\": 0.0}, {\"position\": [18, 1000.0, 1000.0], \"residual\": 0.0}, {\"position\": [19, 1000.0, 1000.0], \"residual\": 0.0}, {\"position\": [20, 1000.0, 1000.0], \"residual\": 0.0}, {\"position\": [21, 1000.0, 1000.0], \"residual\": 0.0}, {\"position\": [22, 1000.0, 1000.0], \"residual\": 0.0}, {\"position\": [23, 1000.0, 1000.0], \"residual\": 0.0}, {\"position\": [24, 1000.0, 1000.0], \"residual\": 0.0}]

:: - Add generated 3d data to the trajectory
curl --json "[%trajectory_id%, %measured_range%, %dummy_3d_data%]" http://localhost:7979/api/scripting/qtm/data/series/_3d/set_samples/

curl --json "[%trajectory_id%]" http://localhost:7979/api/scripting/qtm/data/object/trajectory/get_parts/
:: [{"range":{"end":24,"start":0},"type":"virtual"}]

:: - Split the trajectory in 3 parts
set split_index_1=10
set split_index_2=15
curl --json "[%trajectory_id%, %split_index_1%]" http://localhost:7979/api/scripting/qtm/data/object/trajectory/split_part/
curl --json "[%trajectory_id%, %split_index_2%]" http://localhost:7979/api/scripting/qtm/data/object/trajectory/split_part/

curl --json "[%trajectory_id%]" http://localhost:7979/api/scripting/qtm/data/object/trajectory/get_part_count/
:: 3
curl --json "[%trajectory_id%]" http://localhost:7979/api/scripting/qtm/data/object/trajectory/get_parts/
:: [{"range":{"end":10,"start":0},"type":"virtual"},{"range":{"end":15,"start":11},"type":"virtual"},{"range":{"end":24,"start":16},"type":"virtual"}]

:: - Remove the middle part of the trajectory
set parts_to_remove_indices=1
curl --json "[%trajectory_id%, [%parts_to_remove_indices%]]" http://localhost:7979/api/scripting/qtm/data/object/trajectory/delete_parts/
curl --json "[%trajectory_id%]" http://localhost:7979/api/scripting/qtm/data/object/trajectory/get_part_count/
:: 2

:: - Get the range of created gap
curl --json "[%trajectory_id%]" http://localhost:7979/api/scripting/qtm/data/series/_3d/get_gap_ranges/
:: [{"end":15,"start":11}]

set gap_range={\"end\":15,\"start\":11}

:: - Use fill_trajectory to fill the created gap
set fill_algorithm=\"polynomial\"
curl --json "[%trajectory_id%, %fill_algorithm%, %gap_range%]" http://localhost:7979/api/scripting/qtm/data/object/trajectory/fill_trajectory/

curl --json "[%trajectory_id%]" http://localhost:7979/api/scripting/qtm/data/object/trajectory/get_part_count/
:: 3
curl --json "[%trajectory_id%]" http://localhost:7979/api/scripting/qtm/data/object/trajectory/get_parts/
:: [ ... ... ,{"range":{"end":15,"start":11},"type":"filled"}, ... ...]

add_trajectory

Add a trajectory.

qtm.data.object.trajectory.add_trajectory(label?)

Parameters

label string?
The label of the trajectory (if null, the trajectory will be unidentified).

Returns

integer The identifier of the added trajectory.


delete_trajectory

Delete a trajectory.

qtm.data.object.trajectory.delete_trajectory(id)

Parameters

id integer
The identifier of the trajectory.


smooth_trajectory

Smooth a trajectory.

qtm.data.object.trajectory.smooth_trajectory(id, algorithm?, range?, settings?)

Parameters

id integer
The identifier of the trajectory.

algorithm "moving_average"|"butterworth"?
The smooth algorithm to use (if null, moving average will be used).

range {"start": integer, "end": integer}?
The sample index range to smooth (if null, entire trajectory will be smoothed).

settings {"window_size": integer?, "filter_order": integer?, "cutoff_frequency": float?}?
The smooth settings to use (if null, or if any individual setting is null, the following default values will be used: {window_size: 5, filter_order: 4, cutoff_frequency: 10.0}).


fill_trajectory

Fill a trajectory.

qtm.data.object.trajectory.fill_trajectory(id, algorithm?, range?, settings?)

All samples within the given range will be overwritten. To fill gaps only, use the ranges returned by 'qtm.data.series._3d.get_gap_ranges'.

Parameters

id integer
The identifier of the trajectory.

algorithm "static"|"linear"|"polynomial"|"relational"|"virtual"|"kinematic"?
The fill algorithm to use (if null, polynomial will be used).

range {"start": integer, "end": integer}?
The sample index range to fill (if null, the entire measurement range will be filled).

settings {"origin": integer?, "line": integer?, "plane": integer?, "offset": vec3f?, "is_rigid_body": bool?, "is_relative_offset": bool?}?
The fill settings to use (if null, or if any individual setting is null, the following default values will be used: {offset: [0.0, 0.0, 0.0], is_rigid_body: false, is_relative_offset: false}).


find_trajectory

Find a trajectory by label.

qtm.data.object.trajectory.find_trajectory(label)

Parameters

label string
The label of the trajectory.

Returns

integer? The identifier of the found trajectory (or null, if no trajectory was found).


clear_trajectories

Delete all trajectories.

qtm.data.object.trajectory.clear_trajectories()


get_trajectory_id

Get a trajectory identifier by index.

qtm.data.object.trajectory.get_trajectory_id(index)

This is equivalent to calling qtm.data.series._3d.get_series_id.

Parameters

index integer
The index of the trajectory.

Returns

integer


get_trajectory_ids

Get all trajectory identifiers.

qtm.data.object.trajectory.get_trajectory_ids()

This is equivalent to calling qtm.data.series._3d.get_series_ids.

Returns

[integer]


get_trajectory_count

Get the number of trajectories.

qtm.data.object.trajectory.get_trajectory_count()

This is equivalent to calling qtm.data.series._3d.get_series_count.

Returns

integer


get_part

Get a part of a trajectory by index.

qtm.data.object.trajectory.get_part(id, index)

Parameters

id integer
The identifier of the trajectory.

index integer
The index of the part.

Returns

{"range": {"start": integer, "end": integer}, "type": string}


get_parts

Get all parts of a trajectory.

qtm.data.object.trajectory.get_parts(id)

Parameters

id integer
The identifier of the trajectory.

Returns

[{"range": {"start": integer, "end": integer}, "type": string}]


get_part_count

Get the number of parts of a trajectory.

qtm.data.object.trajectory.get_part_count(id)

Parameters

id integer
The identifier of the trajectory.

Returns

integer


delete_parts

Delete parts of a trajectory.

qtm.data.object.trajectory.delete_parts(id, part_indices?)

Parameters

id integer
The identifier of the trajectory.

part_indices [integer]?
The indices of the parts to delete (if null, all parts will be deleted).


move_parts

Move parts from one trajectory to another.

qtm.data.object.trajectory.move_parts(id_from, id_to, part_indices?)

Parameters

id_from integer
The identifier of the trajectory to move from.

id_to integer
The identifier of the trajectory to move to.

part_indices [integer]?
The indices of the parts to move (if null, all parts will be moved).


swap_parts

Swap parts between two trajectories.

qtm.data.object.trajectory.swap_parts(id_1, id_2, part_indices_1?, part_indices_2?)

Parameters

id_1 integer
The identifier of the first trajectory.

id_2 integer
The identifier of the second trajectory.

part_indices_1 [integer]?
The indices of the parts to swap from the first trajectory (if null, all parts will be swapped).

part_indices_2 [integer]?
The indices of the parts to swap from the second trajectory (if null, all parts will be swapped).


split_part

Split a part of a trajectory.

qtm.data.object.trajectory.split_part(id, sample_index)

Parameters

id integer
The identifier of the trajectory.

sample_index integer
The index of the last sample before the split.


get_label

Get the label of a trajectory.

qtm.data.object.trajectory.get_label(id)

Parameters

id integer
The identifier of the trajectory.

Returns

string? The label of the trajectory (or null, if the trajectory is unidentified).


set_label

Set the label of a trajectory.

qtm.data.object.trajectory.set_label(id, label?)

Parameters

id integer
The identifier of the trajectory.

label string?
The label of the trajectory (if null, the trajectory will become unidentified).


get_color

Get the color of a trajectory.

qtm.data.object.trajectory.get_color(id)

Parameters

id integer
The identifier of the trajectory.

Returns

integer The color of the trajectory (in 0xbbggrr format).


set_color

Set the color of a trajectory.

qtm.data.object.trajectory.set_color(id, color)

Parameters

id integer
The identifier of the trajectory.

color integer
The color of the trajectory (in 0xbbggrr format, see 'qtm.utilities.color' module).


get_is_discarded

Get whether a trajectory is discarded.

qtm.data.object.trajectory.get_is_discarded(id)

Parameters

id integer
The identifier of the trajectory.

Returns

bool


set_is_discarded

Set whether a trajectory is discarded.

qtm.data.object.trajectory.set_is_discarded(id, is_discarded)

Parameters

id integer
The identifier of the trajectory.

is_discarded bool
True if the trajectory is discarded, otherwise false.


get_active_marker_id

Get the (sequence coded) active marker identifier of a trajectory.

qtm.data.object.trajectory.get_active_marker_id(id)

Parameters

id integer
The identifier of the trajectory.

Returns

integer? The active marker identifier (or null, if the marker is passive or actively unidentified).


get_rigid_body_id

Get the rigid body identifier of a trajectory.

qtm.data.object.trajectory.get_rigid_body_id(id)

Parameters

id integer
The identifier of the trajectory.

Returns

integer? The identifier of the rigid body (or null, if the trajectory isn't part of a rigid body).


get_skeleton_segment_id

Get the skeleton segment identifier of a trajectory.

qtm.data.object.trajectory.get_skeleton_segment_id(id)

If the trajectory is attached to multiple segments, only the identifier of the first found will be returned.

Parameters

id integer
The identifier of the trajectory.

Returns

integer? The identifier of the skeleton segment (or null, if the trajectory isn't part of a skeleton).


help

Get the documentation for a module or method.

qtm.data.object.trajectory.help(method?)

Parameters

method string?
The name of the method (if null, the documentation for the module will be returned instead).

Returns

string