|
| 1 | +<?xml version='1.0' encoding='UTF-8'?> |
| 2 | +<root> |
| 3 | + <tabbed_widget name="Main Window" parent="main_window"> |
| 4 | + <Tab containers="1" tab_name="CONFIGS"> |
| 5 | + <Container> |
| 6 | + <DockSplitter orientation="-" count="1" sizes="1"> |
| 7 | + <DockArea name="..."> |
| 8 | + <plot flip_y="false" flip_x="false" mode="TimeSeries" line_width="1.0"> |
| 9 | + <range bottom="-0.200000" left="33.517104" top="8.200000" right="93.485880"/> |
| 10 | + <limitY/> |
| 11 | + <curve color="#1f77b4" name="/arm/moteus_feedback/config[0]/max_current_amps"/> |
| 12 | + <curve color="#d62728" name="/arm/moteus_feedback/config[1]/max_current_amps"/> |
| 13 | + <curve color="#1ac938" name="/arm/moteus_feedback/config[2]/max_current_amps"/> |
| 14 | + <curve color="#ff7f0e" name="/arm/moteus_feedback/config[3]/max_current_amps"/> |
| 15 | + <curve color="#f14cc1" name="/arm/moteus_feedback/config[4]/max_current_amps"/> |
| 16 | + <curve color="#9467bd" name="/arm/moteus_feedback/config[5]/max_current_amps"/> |
| 17 | + <curve color="#17becf" name="/arm/moteus_feedback/config[6]/max_current_amps"/> |
| 18 | + </plot> |
| 19 | + </DockArea> |
| 20 | + </DockSplitter> |
| 21 | + </Container> |
| 22 | + </Tab> |
| 23 | + <Tab containers="1" tab_name="tab2"> |
| 24 | + <Container> |
| 25 | + <DockSplitter orientation="-" count="2" sizes="0.500426;0.499574"> |
| 26 | + <DockArea name="TORQUE"> |
| 27 | + <plot flip_y="false" flip_x="false" mode="TimeSeries" line_width="1.0"> |
| 28 | + <range bottom="-0.880068" left="33.517104" top="0.829475" right="93.485880"/> |
| 29 | + <limitY/> |
| 30 | + <curve color="#bcbd22" name="/arm/moteus_feedback/status[0]/curr_torque"/> |
| 31 | + <curve color="#1f77b4" name="/arm/moteus_feedback/status[1]/curr_torque"/> |
| 32 | + <curve color="#d62728" name="/arm/moteus_feedback/status[2]/curr_torque"/> |
| 33 | + <curve color="#1ac938" name="/arm/moteus_feedback/status[3]/curr_torque"/> |
| 34 | + <curve color="#ff7f0e" name="/arm/moteus_feedback/status[4]/curr_torque"/> |
| 35 | + <curve color="#f14cc1" name="/arm/moteus_feedback/status[5]/curr_torque"/> |
| 36 | + <curve color="#9467bd" name="/arm/moteus_feedback/status[6]/curr_torque"/> |
| 37 | + </plot> |
| 38 | + </DockArea> |
| 39 | + <DockArea name="POSITION"> |
| 40 | + <plot flip_y="false" flip_x="false" mode="TimeSeries" line_width="1.0"> |
| 41 | + <range bottom="-0.001633" left="33.517104" top="0.024643" right="93.485880"/> |
| 42 | + <limitY/> |
| 43 | + <curve color="#17becf" name="/arm/moteus_feedback/status[0]/curr_position"/> |
| 44 | + <curve color="#bcbd22" name="/arm/moteus_feedback/status[1]/curr_position"/> |
| 45 | + <curve color="#1f77b4" name="/arm/moteus_feedback/status[2]/curr_position"/> |
| 46 | + <curve color="#d62728" name="/arm/moteus_feedback/status[3]/curr_position"/> |
| 47 | + <curve color="#1ac938" name="/arm/moteus_feedback/status[4]/curr_position"/> |
| 48 | + <curve color="#ff7f0e" name="/arm/moteus_feedback/status[5]/curr_position"/> |
| 49 | + <curve color="#f14cc1" name="/arm/moteus_feedback/status[6]/curr_position"/> |
| 50 | + </plot> |
| 51 | + </DockArea> |
| 52 | + </DockSplitter> |
| 53 | + </Container> |
| 54 | + </Tab> |
| 55 | + <currentTabIndex index="1"/> |
| 56 | + </tabbed_widget> |
| 57 | + <use_relative_time_offset enabled="1"/> |
| 58 | + <!-- - - - - - - - - - - - - - - --> |
| 59 | + <!-- - - - - - - - - - - - - - - --> |
| 60 | + <Plugins> |
| 61 | + <plugin ID="DataLoad CSV"> |
| 62 | + <parameters time_axis="" delimiter="0"/> |
| 63 | + </plugin> |
| 64 | + <plugin ID="DataLoad MCAP"/> |
| 65 | + <plugin ID="DataLoad ROS2 bags"> |
| 66 | + <use_header_stamp value="false"/> |
| 67 | + <discard_large_arrays value="true"/> |
| 68 | + <max_array_size value="100"/> |
| 69 | + <boolean_strings_to_number value="true"/> |
| 70 | + <remove_suffix_from_strings value="true"/> |
| 71 | + <selected_topics value=""/> |
| 72 | + </plugin> |
| 73 | + <plugin ID="DataLoad ULog"/> |
| 74 | + <plugin ID="ROS2 Topic Subscriber"> |
| 75 | + <use_header_stamp value="false"/> |
| 76 | + <discard_large_arrays value="true"/> |
| 77 | + <max_array_size value="100"/> |
| 78 | + <boolean_strings_to_number value="true"/> |
| 79 | + <remove_suffix_from_strings value="true"/> |
| 80 | + <selected_topics value="/arm/moteus_feedback"/> |
| 81 | + </plugin> |
| 82 | + <plugin ID="UDP Server"/> |
| 83 | + <plugin ID="WebSocket Server"/> |
| 84 | + <plugin ID="ZMQ Subscriber"/> |
| 85 | + <plugin ID="Fast Fourier Transform"/> |
| 86 | + <plugin ID="Quaternion to RPY"/> |
| 87 | + <plugin ID="Reactive Script Editor"> |
| 88 | + <library code="--[[ Helper function to create a series from arrays

 new_series: a series previously created with ScatterXY.new(name)
 prefix: prefix of the timeseries, before the index of the array
 suffix_X: suffix to complete the name of the series containing the X value. If [nil], use the index of the array.
 suffix_Y: suffix to complete the name of the series containing the Y value
 timestamp: usually the tracker_time variable
 
 Example:
 
 Assuming we have multiple series in the form:
 
 /trajectory/node.{X}/position/x
 /trajectory/node.{X}/position/y
 
 where {N} is the index of the array (integer). We can create a reactive series from the array with:
 
 new_series = ScatterXY.new("my_trajectory") 
 CreateSeriesFromArray( new_series, "/trajectory/node", "position/x", "position/y", tracker_time );
--]]

function CreateSeriesFromArray( new_series, prefix, suffix_X, suffix_Y, timestamp )
 
 --- clear previous values
 new_series:clear()
 
 --- Append points to new_series
 index = 0
 while(true) do

 x = index;
 -- if not nil, get the X coordinate from a series
 if suffix_X ~= nil then 
 series_x = TimeseriesView.find( string.format( "%s.%d/%s", prefix, index, suffix_X) )
 if series_x == nil then break end
 x = series_x:atTime(timestamp)	 
 end
 
 series_y = TimeseriesView.find( string.format( "%s.%d/%s", prefix, index, suffix_Y) )
 if series_y == nil then break end 
 y = series_y:atTime(timestamp)
 
 new_series:push_back(x,y)
 index = index+1
 end
end

--[[ Similar to the built-in function GetSeriesNames(), but select only the names with a give prefix. --]]

function GetSeriesNamesByPrefix(prefix)
 -- GetSeriesNames(9 is a built-in function
 all_names = GetSeriesNames()
 filtered_names = {}
 for i, name in ipairs(all_names) do
 -- check the prefix
 if name:find(prefix, 1, #prefix) then
 table.insert(filtered_names, name);
 end
 end
 return filtered_names
end

--[[ Modify an existing series, applying offsets to all their X and Y values

 series: an existing timeseries, obtained with TimeseriesView.find(name)
 delta_x: offset to apply to each x value
 delta_y: offset to apply to each y value 
 
--]]

function ApplyOffsetInPlace(series, delta_x, delta_y)
 -- use C++ indices, not Lua indices
 for index=0, series:size()-1 do
 x,y = series:at(index)
 series:set(index, x + delta_x, y + delta_y)
 end
end
"/> |
| 89 | + <scripts/> |
| 90 | + </plugin> |
| 91 | + <plugin ID="CSV Exporter"/> |
| 92 | + <plugin ID="ROS2 Topic Re-Publisher"/> |
| 93 | + </Plugins> |
| 94 | + <!-- - - - - - - - - - - - - - - --> |
| 95 | + <previouslyLoaded_Datafiles/> |
| 96 | + <previouslyLoaded_Streamer name="ROS2 Topic Subscriber"/> |
| 97 | + <!-- - - - - - - - - - - - - - - --> |
| 98 | + <customMathEquations/> |
| 99 | + <snippets/> |
| 100 | + <!-- - - - - - - - - - - - - - - --> |
| 101 | +</root> |
| 102 | + |
0 commit comments