-
Notifications
You must be signed in to change notification settings - Fork 21
-
Understanding the Internals of MotoROS2 Trajectory ValidationI am investigating how MotoROS2 handles trajectory validation, focusing specifically on the following error:
Important Note: I am not seeking help to fix this error. Instead, my goal is to understand the internal mechanics within MotoROS2 that lead to this validation failure. By gaining this understanding, I aim to identify the "do's and don'ts" to avoid this error entirely in future implementations. ContextWhile executing trajectory plans to move a robot to specific (x, y, z) coordinates, I have observed inconsistent success rates. These seem to depend heavily on the robot's current state, even when the trajectory plans appear identical. What I’m Looking to Understand
GoalBy understanding the internals of MotoROS2, I hope to uncover why seemingly identical trajectory plans can result in different outcomes depending on the robot's initial state. Thanks in advance for any insights or explanations! |
Beta Was this translation helpful? Give feedback.
All reactions
Replies: 1 comment · 12 replies
-
While we can summarise it at a high-level, let me first just point you to the implementation: Lines 30 to 258 in 0f0a510
As to your specific questions:
see the above linked function.
immediately after receiving a new goal. As part of the goal 'acceptance' it's validated. Ideally we'd reject it immediately if validation failed, but instead we always accept it and then abort if/when needed without actually executing anything. We do it this way as a server can't provide any 'cause' code or other information to a client when rejecting a goal. This is a limitation in the ROS 2 action implementation. By first accepting it we can abort and send an action result along with the abort notification. That's where the That Lines 265 to 266 in 0f0a510
With motoros2/src/ActionServer_FJT.h Line 12 in 0f0a510
Does the link I included earlier answer this?
Are you using MoveIt, or are you creating I ask because MoveIt should always create trajectories with at least two points in them. If you're doing it manually, you need to make sure trajectories start at the current state of the robot (ie: |
Beta Was this translation helpful? Give feedback.
All reactions
-
I did the XRCE-DDS capture, and what I found is that for the first trajectory goal For the XRCE-DDS capture, I wanted to finalize a debugging tool where you could just run a shell script in the background while manipulating your robot, and after killing the shell script, have a Python script automatically parse through the generated pcap file. But it just turned into too much of a hassle. What I did end up finishing was a script that takes in hex packets (that you have to manually extract from the pcap file) and spits out the respective trajectory point values. The script only supports packets with exclusively trajectory goal points and does not parse the initial packets containing the initial joint values, joint names, or the world frame name. Here was the shell and python scripts, if interested: Click to expand#!/bin/bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CAPTURE_DIR="${SCRIPT_DIR}/captures"
XRCE_DDS_PORT=8888
DEBUG_PORT=21789
TIMESTAMP=$(date "+%H-%M-%S_%B-%d-%Y")
BASE_FILE="${CAPTURE_DIR}/motoros2_debug_${TIMESTAMP}"
PCAP_FILE="${BASE_FILE}.pcap"
TRAJECTORY_FILE="${PCAP_FILE}_trajectory_data.txt"
DEBUG_FILE="${PCAP_FILE}_debug.txt"
SUMMARY_FILE="${PCAP_FILE}_summary.txt"
for cmd in tshark capinfos; do
if ! command -v "$cmd" &>/dev/null; then
echo "Error: '$cmd' is not installed. Please install it (e.g., sudo apt-get install tshark)."
exit 1
fi
done
mkdir -p "$CAPTURE_DIR"
extract_data() {
local port="$1"
local output="$2"
tshark -r "$PCAP_FILE" -Y "udp.port == $port" -T fields \
-e frame.time_epoch -e data > "$output"
}
cleanup() {
echo -e "\nStopping capture..."
kill "$tshark_pid" 2>/dev/null || true
echo "Processing captured data..."
extract_data "$XRCE_DDS_PORT" "$TRAJECTORY_FILE"
extract_data "$DEBUG_PORT" "$DEBUG_FILE"
echo "Generating capture summary..."
capinfos "$PCAP_FILE" > "$SUMMARY_FILE"
echo "Capture complete. Files saved in: $CAPTURE_DIR"
exit 0
}
trap cleanup INT TERM
echo "Starting XRCE-DDS traffic capture..."
echo "Capturing ports:"
echo " - $XRCE_DDS_PORT (XRCE-DDS trajectory data)"
echo " - $DEBUG_PORT (debug logs)"
echo "Output will be saved to: $PCAP_FILE"
echo "Press Ctrl+C to stop capture."
echo "-----------------------------------"
tshark -i any -f "udp port $XRCE_DDS_PORT or udp port $DEBUG_PORT" \
-w "$PCAP_FILE" -P -s 0 -q &
tshark_pid=$!
wait "$tshark_pid" Python: Click to expandimport struct
from dataclasses import dataclass
from typing import List, Tuple
@dataclass
class JointStateSet:
positions: List[float]
velocities: List[float]
efforts: List[float]
class JointStateDecoder:
ARRAY_LENGTH_SIZE = 4 # bytes
DOUBLE_SIZE = 8 # bytes
VELOCITY_PADDING = 4 # bytes
EFFORT_PADDING = 4 # bytes
EFFORT_END_PADDING = 12 # bytes
JOINT_STATE_SET_SIZE = 176 # bytes
def __init__(self, hex_packets: List[str]):
self.hex_packets = hex_packets
self.joint_state_sets: List[JointStateSet] = []
def process_packets(self) -> bytes:
assembled_data = bytearray()
for hex_packet in self.hex_packets:
hex_string = ''.join(hex_packet.split())
packet_data = bytes.fromhex(hex_string)
# Skip the 8-byte header
assembled_data.extend(packet_data[8:])
return bytes(assembled_data)
def parse_array_section(
self,
data: bytes,
offset: int,
section_name: str,
padding_bytes: int = 0,
end_padding: int = 0,
debug: bool = False
) -> Tuple[List[float], int]:
# Read array length (4 bytes)
array_length = struct.unpack_from('<I', data, offset)[0]
array_length_hex = ' '.join(f"{byte:02x}" for byte in data[offset:offset + self.ARRAY_LENGTH_SIZE])
current_pos = offset + self.ARRAY_LENGTH_SIZE + padding_bytes
if debug:
print(f"{section_name} Array Length: {array_length:2d} → Hex: {array_length_hex}")
# Read values (8 bytes each)
values = []
for i in range(array_length):
value = struct.unpack_from('<d', data, current_pos)[0]
if debug:
hex_val = ' '.join(f"{byte:02x}" for byte in data[current_pos:current_pos + self.DOUBLE_SIZE])
print(f"Joint {i + 1} {section_name:<8}: {value:8.3f} → Hex: {hex_val}")
values.append(value)
current_pos += self.DOUBLE_SIZE
# Handle end padding if any
current_pos += end_padding
if debug:
print()
return values, current_pos
def parse_joint_state_set(
self,
data: bytes,
offset: int,
set_number: int,
debug: bool = False
) -> Tuple[JointStateSet, int]:
if debug:
print(f"\nJoint State Set {set_number}:")
print("═" * 80)
positions, current_pos = self.parse_array_section(
data, offset, "Position", debug=debug
)
velocities, current_pos = self.parse_array_section(
data, current_pos, "Velocity", padding_bytes=self.VELOCITY_PADDING, debug=debug
)
efforts, current_pos = self.parse_array_section(
data, current_pos, "Effort", padding_bytes=self.EFFORT_PADDING, end_padding=self.EFFORT_END_PADDING, debug=debug
)
if debug:
print("─" * 80)
joint_state_set = JointStateSet(positions, velocities, efforts)
return joint_state_set, current_pos
def format_joint_state_set(self, joint_state: JointStateSet, set_number: int) -> str:
set_header = f"Joint State Set {set_number}:"
pos_str = "Positions: [" + ", ".join(f"{p:>8.3f}" for p in joint_state.positions) + "]"
vel_str = "Velocities: [" + ", ".join(f"{v:>8.3f}" for v in joint_state.velocities) + "]"
eff_str = "Efforts: [" + ", ".join(f"{e:>8.3f}" for e in joint_state.efforts) + "]"
return f"{set_header}\n{pos_str}\n{vel_str}\n{eff_str}\n"
def decode_joint_state_message(self, debug: bool = False) -> List[JointStateSet]:
data = self.process_packets()
num_sets = len(data) // self.JOINT_STATE_SET_SIZE
if debug:
print("Message Information:")
print("═" * 80)
print(f"Total message length: {len(data)} bytes")
print(f"Number of complete sets: {num_sets}")
print("─" * 80)
joint_state_sets = []
current_pos = 0
for i in range(num_sets):
joint_state_set, current_pos = self.parse_joint_state_set(
data, current_pos, i + 1, debug=debug
)
joint_state_sets.append(joint_state_set)
if not debug:
print(self.format_joint_state_set(joint_state_set, i + 1))
self.joint_state_sets = joint_state_sets
return joint_state_sets
if __name__ == "__main__":
packets_1 = [
"""
81 80 73 00 0d 01 f4 01 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 38 10 13 42 df 44 f5 3e 6c 14 ae 47 e1 7a 84 bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 8a 90 90 90 90 90 d0 be 92 99 99 99 99 99 b9 bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 b6 c5 b4 b4 b4 b4 f4 be b2 0c 00 00 00 00 e0 bf 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c2 eb 0b 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 b5 8b 8e bd 5a c0 f4 3e f0 d6 a3 70 3d 0a 97 bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 50 d9 d8 d8 d8 d8 d8 be 91 33 33 33 33 33 c3 bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 b3 40 b5 b4 b4 b4 f4 be 6c 6b 00 00 00 00 e0 bf 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 a3 e1 11 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 fb 9e 6e 6a d4 06 f4 3e 6b 14 ae 47 e1 7a a4 bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 58 90 90 90 90 90 e0 be 45 99 99 99 99 99 c9 bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7c 3e b4 b4 b4 b4 f4 be
""",
"""
81 80 74 00 0d 01 f4 01 68 48 ff ff ff ff df bf 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 84 d7 17 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0d 4a b3 48 4c 18 f3 3e f3 ff ff ff ff ff af bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 09 b4 b4 b4 b4 b4 e4 be fb fe ff ff ff ff cf bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 33 3f b3 b4 b4 b4 f4 be e0 bd fd ff ff ff df bf 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 65 cd 1d 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ea 8c 5c 58 c2 f4 f1 3e 04 d7 a3 70 3d 0a b7 bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 fb d7 d8 d8 d8 d8 e8 be 8a 32 33 33 33 33 d3 bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 37 b3 b4 b4 b4 f4 be 28 b2 fd ff ff ff df bf 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 46 c3 23 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 fe 86 08 9e 36 9c f0 3e 52 e4 36 d9 28 5c bf bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 8b d2 b7 74 fc fc ec be 52 ae 19 fd 65 66 d6 bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00
""",
"""
81 80 75 00 0d 01 f4 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 78 53 b3 b4 b4 b4 f4 be eb e5 fd ff ff ff df bf 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 27 b9 29 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1a 77 96 2e 52 1d ee 3e fb e6 58 24 e1 7a c4 bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3f fb 6d 4c 90 90 f0 be 5f e1 4c 30 99 99 d9 bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f0 50 b3 b4 b4 b4 f4 be be de fd ff ff ff df bf 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff 07 af 2f 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 b4 a2 f5 83 33 98 ea 3e 3a 2f 3a e6 84 eb c9 bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 68 44 28 59 a2 a2 f2 be 2b 3b 3e 5b cc cc dc bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 53 ca b5 b4 b4 b4 f4 be 3f da 00 00 00 00 e0 bf 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff e8 a4 35 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 aa f9 1e 3d 11 a9 e6 3e 1c c0 cb b0 ff ff cf bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62 56 3a 6b b4 b4 f4 be
""",
"""
81 80 76 00 0d 01 f4 01 37 6e 71 8e ff ff df bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 bd ce b5 b4 b4 b4 f4 be 6d d3 00 00 00 00 e0 bf 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff c9 9a 3b 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5d 45 77 1b 3e 8e e2 3e 31 31 50 15 00 2c d3 bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 fa f1 61 86 ee 99 f3 be c6 bb 0b 44 fc 4a de bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 12 17 c3 b4 b4 b4 f4 3e 7d 1e 0b 00 00 00 e0 3f 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 ff e0 f5 05 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 68 93 64 9e 53 af dd 3e 06 68 28 f3 89 0a d6 bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 e2 4f 74 dc 87 f1 be 35 8c d8 10 c9 17 db bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90 94 a9 b4 b4 b4 f4 3e 2c c8 ee ff ff ff df 3f 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 c2 eb 0b 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ea 3c 48 40 32 16 d7 3e 88 e6 e1 4b 28 97 d8 bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00
""",
"""
81 80 77 00 0d 01 f4 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 b7 9c 7b c4 94 eb ee be 31 56 a5 dd 95 e4 d7 bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 cd 22 bf b4 b4 b4 f4 3e 00 0f 08 00 00 00 e0 3f 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 a3 e1 11 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2a 87 99 1c 18 51 d1 3e c1 ac 7c 1f db d1 da bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 e4 7b 57 a0 70 c7 ea be 8b 25 72 aa 62 b1 d4 bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 33 82 ad b4 b4 b4 f4 3e e0 db f4 ff ff ff df 3f 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 84 d7 17 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 82 e4 b0 66 0a c0 c8 3e a6 ba f8 6d a2 ba dc bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 87 55 33 7c 4c a3 e6 be a0 f0 3e 77 2f 7e d1 bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4d 1b bb b4 b4 b4 f4 3e 3d f4 04 00 00 00 e0 3f 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 65 cd 1d 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 39 fc 09 09 f3 85 c0 3e
""",
"""
81 80 78 00 0d 01 f4 01 3f 10 56 37 7e 51 de bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3d 33 0f 58 28 7f e2 be b7 7d 17 88 f8 95 cc bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 99 e0 b0 b4 b4 b4 f4 3e 64 19 fa ff ff ff df 3f 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 46 c3 23 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4e ab 7c 40 d4 e7 b3 3e 84 ad 94 7b 6e 96 df bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 57 1c d6 67 08 b6 dc be e4 15 b1 21 92 2f c6 bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 6d a4 b5 b4 b4 b4 f4 3e 02 ba 00 00 00 00 e0 3f 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 27 b9 29 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1f c3 37 b1 be 27 a4 3e 3a 49 5a 9d b9 44 e0 bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0e d5 8d 1f c0 6d d4 be 84 60 95 76 57 92 bf bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 87 84 b2 b4 b4 b4 f4 3e c8 9e fc ff ff ff df 3f 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 08 af 2f 06 00 00 00 00 00 00 00
""",
"""
81 80 79 00 0d 01 f4 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ec d8 8c d3 3a 80 8c 3e 8a df 5a 3a 46 95 e0 bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 cc 19 8b ae ef 4a c8 be ec 93 c8 a9 8a c5 b2 bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 9c a3 b2 b4 b4 b4 f4 3e b1 ce fc ff ff ff df 3f 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 e9 a4 35 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 bc fa 75 7f 11 13 57 3e b2 19 cc 14 dd bc e0 bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 24 1e ea 77 7c e9 ae be 46 17 ef 73 f7 e2 97 bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 a4 93 b5 b4 b4 b4 f4 3e 45 ac 00 00 00 00 e0 3f 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 65 73 2d 38 52 c1 e0 bf 00 00 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 00 00 00 80 00 00 00 00 00 00 00 80 74 28 3e a5 a5 e5 8e 3b f9 07 b0 ff ff df 77 3c 00 00 00 00 00 00 00 80 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 00 00 00 80 00 00 00 00 00 00 00 80 cf 22 c6 b4 b4 b4 f4 3e fb 77 0d 00 00 00 e0 3f
""",
"""
81 80 7a 00 0d 03 44 00 00 00 00 00 00 00 00 80 00 00 00 00 02 00 00 00 34 e0 c7 02 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
"""
]
packets_2 = [
"""
81 80 7d 00 0d 01 f4 01 06 00 00 00 80 ae 81 8f 78 0b 74 3f 78 67 05 21 0a 0a a1 3f 10 a4 44 8e fd 24 a6 3f 80 87 68 cc af fb 80 3f bc 4c 7e 94 1f 13 e1 bf 80 1a 9f 27 d1 9b 83 bf 06 00 00 00 00 00 00 00 70 15 89 71 6a af a7 3f 29 f2 cb cc 1e 98 d4 3f 8f 80 8d 23 53 f8 da 3f 25 20 4d 2c b6 ce b3 3f 46 49 45 ad 40 9b b9 bf 62 4a ec 09 ec dd b6 bf 06 00 00 00 00 00 00 00 6e cc 9b e4 02 98 c4 3f a5 d3 8b dc 14 1a f5 3f 66 ca 7d d8 40 07 fd 3f 79 3a 68 02 ab d5 ce 3f 04 10 94 cc 55 02 e0 bf 6e ef a8 5a 8f c7 d1 bf 00 00 00 00 00 00 00 00 00 c2 eb 0b 06 00 00 00 c0 d7 64 89 24 dc 84 3f 90 d5 11 08 39 4c b2 3f 88 de df b5 b0 08 b8 3f 00 1b 09 41 6a 5a 91 3f 9b 27 21 95 90 79 e1 bf c0 21 40 9e 30 08 94 bf 06 00 00 00 00 00 00 00 7c 5c da 03 b4 db ad 3f 89 fb 28 84 c8 f3 db 3f 9c 58 0b 93 1d bf e2 3f 8a b0 51 61 ed d4 b7 3f 07 c0 db 99 ab 35 c3 bf 6b 74 d9 45 72 7e bb bf 06 00 00 00 00 00 00 00 00 03 8e d4 e3 d9 b4 3f d7 7b 86 35 dc 71 ef 3f 67 d8 18 3f a2 9e f7 3f 9b 9b cb 33 76 77 b3 3f 89 fa 3c ce a3 01 e0 bf b6 21 e2 4e 2f 21 b6 bf 00 00 00 00 00 00 00 00 00 a3 e1 11 06 00 00 00 20 33 24 0e 41 b6 90 3f dc f8 9c bb ee 9e be 3f 70 d6 3e ae 17 67 c4 3f c0 4c 91 7c 67 0e 9b 3f 22 d4 44 72 01 09 e2 bf 80 b0 b9 99 6d 37 9f bf 06 00 00 00 00 00 00 00 1a 39 c0 1b e3 39 b0 3f d8 bf 47 1f b1 b0 e0 3f 7d e8 9d e1 85 0a e7 3f 33 7b 85 3a 5a 2a b8 3f 68 5a dc 5d 8f 9d c9 bf cf 77 cf 24 36 d2 bb bf 06 00 00 00 00 00 00 00 ce 3b 85 b6 59 0a 93 3f 68 9b f6 2b f9 a8 e6 3f 7d bf 6b b7 fd 39 f3 3f eb ab f9 9d 98 f1 aa bf
""",
"""
81 80 7e 00 0d 01 f4 01 5f 0d 0d 68 1f 01 e0 bf 97 40 89 98 06 5b b0 3f 00 00 00 00 00 00 00 00 00 84 d7 17 06 00 00 00 c0 10 5e 9e 14 42 97 3f 54 c7 67 f7 d6 69 c6 3f 54 f4 14 94 e5 5c ce 3f 00 c7 67 e7 69 31 a2 3f 1c 3c 14 bd 70 c1 e2 bf 00 e1 c5 e6 91 f7 a4 bf 06 00 00 00 00 00 00 00 02 21 e4 da 35 58 b0 3f 8f af a6 85 be ba e2 3f d8 1f 6b 27 5d aa ea 3f f0 79 08 2a cd 2f b6 3f 15 06 3f 71 97 02 d0 bf 37 50 54 e6 02 69 b9 bf 06 00 00 00 00 00 00 00 53 ea f6 ba ba f4 8b bf f5 6e ad dc a7 8b e1 3f 8e af 2e 69 c7 b7 f0 3f f3 3f 17 72 e5 21 bc bf 6b 68 57 73 10 02 e0 bf 80 74 14 76 b7 1e c1 3f 00 00 00 00 00 00 00 00 00 65 cd 1d 06 00 00 00 e0 77 d6 c6 33 ad 9d 3f 3c f5 d8 5e 0a 3a ce 3f e3 0d 9d cf 99 d5 d4 3f 80 b8 09 e0 32 4e a6 3f 4c c0 f5 f4 dc a2 e3 bf 00 0f bf 91 66 a7 a9 bf 06 00 00 00 00 00 00 00 98 59 40 c4 91 45 af 3f 87 bc a5 bc 33 44 e4 3f b4 d2 be dc 6e cb ed 3f 3a 1f 33 d5 2f c3 b2 3f be 10 b4 6e 4d 36 d3 bf cf 02 ef db 35 3d b5 bf 06 00 00 00 00 00 00 00 61 35 82 2e c2 c8 a6 bf fc 4a 7d ed cf a2 d9 3f 15 bd 66 4f 03 c4 ec 3f af 0f 85 7b 6b f2 c4 bf c9 72 33 47 ff 01 e0 bf 1e 7f 82 31 70 7a c9 3f 00 00 00 00 00 00 00 00 00 46 c3 23 06 00 00 00 b0 0b 70 a1 6d 9f a1 3f ac ae 31 b8 54 f1 d2 3f 58 f8 03 b3 c4 8b da 3f 00 91 d4 c3 11 70 a9 3f 18 02 96 f1 a3 95 e4 bf 00 9c b4 79 cb 2a ad bf 06 00 00 00 00 00 00 00 50 af 45 9e 09 3a a7 3f ef 0d 5f a4 2b fd e0 3f 46 a2 08 e0 b3 b3 e9 3f 11 c9 89 15 60 47 a8 3f f1 cf f4 c0 f1 8c d1 bf c6 57 16 85 77 e4 aa bf 06 00 00 00 00 00 00 00 70 76 d6 c0
""",
"""
81 80 7f 00 0d 01 f4 01 1e 5b c5 bf 4d 8b 47 65 03 b4 f5 bf 21 0b aa 65 94 96 fd bf 58 6f c1 ce de 96 ce bf 06 4d e5 65 a0 f2 df 3f dd 5b 94 9a 6f d6 d1 3f 00 00 00 00 00 00 00 00 00 27 b9 29 06 00 00 00 20 db e8 5f 2a 92 a3 3f 38 05 a3 c4 b4 ef d5 3f 66 b0 1b b0 ca 1f df 3f 20 16 a3 86 49 5a ab 3f b0 d9 01 39 d2 61 e5 bf 40 8e f3 5b bb 42 af bf 06 00 00 00 00 00 00 00 1c 57 78 c2 b4 30 a0 3f 8c 16 b1 6a bb 26 da 3f 99 ac ff 40 1a 35 e4 3f fa 22 b0 59 b6 c9 9d 3f a0 a7 08 4f 64 b4 cc bf f7 ef 91 21 94 03 a0 bf 06 00 00 00 00 00 00 00 a8 58 21 13 03 95 bd bf 92 77 eb 77 a6 f5 f1 bf 3a 4c 01 c5 40 df f9 bf c6 31 e6 ea 7d 3a c2 bf 68 41 68 e7 ce f7 df 3f 27 8e a2 b6 51 f5 c4 3f 00 00 00 00 00 00 00 00 ff 07 af 2f 06 00 00 00 70 aa c4 27 ed ec a4 3f 50 82 96 39 dd 35 d8 3f 44 56 dc 64 41 55 e1 3f 40 dc fe df 7c 88 ac 3f 74 a2 12 b2 0d 05 e6 bf c0 80 90 29 47 41 b0 bf 06 00 00 00 00 00 00 00 e5 20 f6 4a 92 56 96 3f 80 1e 6e 8b 12 7c d3 3f 8a 29 a6 a6 75 93 de 3f db da 7c 9c db 6a 92 3f 6a 4a aa 46 0d 4e c6 bf d9 be d5 b4 38 20 93 bf 06 00 00 00 00 00 00 00 20 a9 ed bf e4 d6 b5 bf 59 41 e5 85 71 6b ef bf 37 e5 75 1a b1 a4 f7 bf 20 e6 9d 49 be 9c b6 bf 3a 32 87 4b e5 fa df 3f 24 dc 86 b5 ed 41 b9 3f 00 00 00 00 00 00 00 00 ff e8 a4 35 06 00 00 00 d0 92 bc e3 26 d7 a5 3f 00 7f d9 2c bd da d9 3f f4 21 13 89 55 a1 e2 3f c0 ce 3e 2c 25 41 ad 3f 9c 58 3f fd 54 7f e6 bf 80 1b 95 3d 87 9f b0 bf 06 00 00 00 00 00 00 00 38 1f 63 69 55 1b 8d 3f f5 85 65 3d c7 f7 ca 3f ea 94 1d ba e7 65 d5 3f bf 85 81 36 e9 d1 85 3f
""",
"""
81 80 80 00 0d 01 f4 01 b8 65 53 4b 61 d0 bf bf d9 37 c7 d1 db d1 85 bf 06 00 00 00 00 00 00 00 a4 2c a9 73 aa 6b b1 bf 35 0f 3d c3 15 c8 ec bf 61 ac b9 90 e7 56 f6 bf 69 d1 55 91 de f1 ae bf d9 54 82 f4 ad fc df 3f c3 78 49 98 c6 7e b0 3f 00 00 00 00 00 00 00 00 ff c9 9a 3b 06 00 00 00 c6 4c 82 65 0e 6b a6 3f e2 89 b2 e0 f2 ed da 3f 4b 1e 00 85 dd 7b e3 3f eb 20 f8 ae 3c af ad 3f 64 80 6d 79 a8 d0 e6 bf ea 91 3f 44 68 d6 b0 bf 06 00 00 00 00 00 00 00 02 e9 cb 9d d2 48 81 3f c0 8a 51 d2 a6 15 c0 3f 38 16 11 fd 89 8b c9 3f 17 be d4 07 8e b8 79 3f e2 2e b8 2b b2 03 b3 bf 35 fe 32 dd 76 a3 79 bf 06 00 00 00 00 00 00 00 59 41 ba ae ac 16 ad bf b9 e3 2f 02 ba 11 eb bf 78 d9 24 81 cc 7e f5 bf e5 73 ab 97 ad a4 a5 bf 0c 63 01 00 00 00 e0 3f 8c 60 cd 60 ee 92 a5 3f 00 00 00 00 01 00 00 00 ff e0 f5 05 06 00 00 00 e6 84 bd 84 71 b4 a6 3f 28 d7 fd b7 88 76 db 3f b9 cb 79 67 53 e8 e3 3f 8a 6b de 30 d7 e5 ad 3f 51 b9 b1 38 06 f9 e6 bf 08 57 30 22 9f f1 b0 bf 06 00 00 00 00 00 00 00 09 7e d6 92 9c 98 66 3f 0d 1d ca 45 0b 07 a5 3f 0d 35 ea 91 99 b2 b0 3f bf c6 33 50 06 d0 60 3f 9a 8d ad 7b 95 db 98 bf 8f ca 86 1f 3d c2 60 bf 06 00 00 00 00 00 00 00 ce 82 b7 ae ac 16 ad bf 22 57 2d 02 ba 11 eb bf 49 d3 22 81 cc 7e f5 bf d4 69 a9 97 ad a4 a5 bf 1c c2 ff ff ff ff df 3f 9b 57 cb 60 ee 92 a5 3f 00 00 00 00 01 00 00 00 00 c2 eb 0b 06 00 00 00 e4 52 73 46 38 bd a6 3f f9 65 e1 4a de 86 db 3f 19 5e f2 ee 4b f5 e3 3f 7c e5 56 e2 5e ec ad 3f 2e 4c 72 09 da fd e6 bf c5 20 8d 4d e0 f4 b0 bf 06 00 00 00 00 00 00 00 27 bf 94 86
""",
"""
81 80 81 00 0d 03 a0 00 1f 20 5c bc f3 1c 6b 71 4a 2c 9a bc 07 a3 18 6a 9b c8 a4 bc e6 3b 38 71 3b ed 54 bc 6c a4 e4 8c c5 f0 8e 3c 1f 3c 1d a6 12 dc 54 3c 06 00 00 00 00 00 00 00 6e 3a b8 ae ac 16 ad bf 52 02 2e 02 ba 11 eb bf 2f 5b 23 81 cc 7e f5 bf a1 f2 a9 97 ad a4 a5 bf 3b 46 00 00 00 00 e0 3f 15 e0 cb 60 ee 92 a5 3f 00 00 00 00 01 00 00 00 94 93 d0 0e 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
""",
]
packets_3 = [
"""
81 80 84 00 0d 01 f4 01 06 00 00 00 10 c7 d6 60 f9 6a a6 3f 7e ae e9 93 b4 24 db 3f e6 95 98 07 04 ae e3 3f d2 71 2d 35 4a 7e ad 3f 8d 43 84 ed c2 ab e6 bf d8 9b 7c 19 03 b8 b0 bf 06 00 00 00 00 00 00 00 f2 9a fa 37 71 50 79 bf 9b 00 22 20 78 a6 ae bf 22 bd a0 c2 eb 38 b6 bf 92 76 05 8b e3 a6 80 bf 9b 99 99 99 99 99 b9 3f 26 ae ce f4 fb e0 82 3f 06 00 00 00 00 00 00 00 f4 4c f9 85 8d a4 9f bf 6b 47 15 14 0b 28 d3 bf d4 f6 48 b3 26 c7 db bf 70 dc c6 6d 9c d0 a4 bf dc 05 00 00 00 00 e0 3f fa 62 02 f2 3a 99 a7 3f 00 00 00 00 00 00 00 00 00 c2 eb 0b 06 00 00 00 a4 dc f6 9b b7 05 a6 3f 7b 26 69 b3 1a aa da 3f f2 12 8e 58 20 55 e3 3f 1c 46 d5 18 13 f9 ac 3f 26 dd 1d 87 5c 45 e6 bf 20 61 a9 29 7f 6c b0 bf 06 00 00 00 00 00 00 00 ae f3 fb e9 54 fc 82 bf d1 7f 19 18 da fc b6 bf 63 8d f8 d1 b0 aa c0 bf 29 31 88 50 55 fa 88 bf ac 32 33 33 33 33 c3 3f 6f 04 36 ef 79 51 8c 3f 06 00 00 00 00 00 00 00 36 1d f8 85 8d a4 9f bf 1c 90 14 14 0b 28 d3 bf d1 ec 47 b3 26 c7 db bf 2c 15 c6 6d 9c d0 a4 bf 08 db fe ff ff ff df 3f 9f 80 01 f2 3a 99 a7 3f 00 00 00 00 00 00 00 00 00 a3 e1 11 06 00 00 00 73 94 f0 21 f5 77 a5 3f 43 9b 1b 79 76 fe d9 3f 9b 5b 7f 63 ae d8 e2 3f 52 6f f3 bd 92 3e ac 3f 96 1a 28 5e 00 b6 e5 bf 83 a8 81 73 c6 02 b0 bf 06 00 00 00 00 00 00 00 8a 9b fa 37 71 50 89 bf 53 01 22 20 78 a6 be bf a8 bd a0 c2 eb 38 c6 bf f6 76 05 8b e3 a6 90 bf 35 9a 99 99 99 99 c9 3f 97 ae ce f4 fb e0 92 3f 06 00 00 00 00 00 00 00 9b 28 fa 85 8d a4 9f bf ed cb 15 14 0b 28 d3 bf 3d b9 49 b3 26 c7 db bf 82 6d c7 6d 9c d0 a4 bf
""",
"""
81 80 85 00 0d 01 f4 01 30 75 00 00 00 00 e0 3f 32 07 03 f2 3a 99 a7 3f 00 00 00 00 00 00 00 00 00 84 d7 17 06 00 00 00 7c ee c3 f2 b1 c1 a4 3f d8 0c 01 e5 c7 21 d9 3f e2 6f 6c 28 ae 38 e2 3f 72 ed 87 24 c9 4e ab 3f dc fb a2 72 ae fd e4 bf 06 e4 0a ee b1 f5 ae bf 06 00 00 00 00 00 00 00 13 42 f9 85 8d a4 8f bf 9e 40 15 14 0b 28 c3 bf c3 ec 48 b3 26 c7 cb bf 78 d4 c6 6d 9c d0 94 bf 33 00 00 00 00 00 d0 3f fa 59 02 f2 3a 99 97 3f 06 00 00 00 00 00 00 00 d7 9f f9 85 8d a4 9f bf 4e 79 15 14 0b 28 d3 bf ad 3d 49 b3 26 c7 db bf 59 10 c7 6d 9c d0 a4 bf e6 2d 00 00 00 00 e0 3f a8 9e 02 f2 3a 99 a7 3f 00 00 00 00 00 00 00 00 00 65 cd 1d 06 00 00 00 c1 ea 70 0e ee e2 a3 3f 36 7b 19 f7 0e 14 d8 3f c7 4f 55 a7 1f 75 e1 3f 7d c0 92 4c b6 29 aa 3f f9 80 8e c4 66 1c e4 bf 3e 7b 69 68 6d a9 ad bf 06 00 00 00 00 00 00 00 f9 f4 fb e9 54 fc 92 bf 61 81 19 18 da fc c6 bf 85 8e f8 d1 b0 aa d0 bf dc 32 88 50 55 fa 98 bf fa 33 33 33 33 33 d3 3f 5c 06 36 ef 79 51 9c 3f 06 00 00 00 00 00 00 00 3b ad fb 85 8d a4 9f bf aa b7 16 14 0b 28 d3 bf 91 0c 4b b3 26 c7 db bf 01 6c c8 6d 9c d0 a4 bf 80 38 01 00 00 00 e0 3f 3c 27 04 f2 3a 99 a7 3f 00 00 00 00 00 00 00 00 00 46 c3 23 06 00 00 00 36 cc 7e 78 a9 db a2 3f e0 8f aa b3 4b d5 d6 3f 34 eb 52 e3 02 8e e0 3f 01 41 b8 3a 5a cf a8 3f 4c 1f 7c 57 29 12 e3 bf 7e 5b 62 5b bf 20 ac bf 06 00 00 00 00 00 00 00 2b 7b db a8 62 26 96 bf 39 1e 0b 9e a8 d1 ca bf 76 96 e4 ee cd 71 d3 bf 94 bf 4c aa 0d 24 9d bf 22 af 19 fd 65 66 d6 3f e4 7b 8d 28 dc 84 a0 3f 06 00 00 00 00 00 00 00 a9 71 fa 85
""",
"""
81 80 86 00 0d 01 f4 01 8d a4 9f bf 47 f9 15 14 0b 28 d3 bf 66 f7 49 b3 26 c7 db bf 56 9b c7 6d 9c d0 a4 bf 40 9a 00 00 00 00 e0 3f a8 3a 03 f2 3a 99 a7 3f 00 00 00 00 00 00 00 00 00 27 b9 29 06 00 00 00 2f d7 13 2f e4 ab a1 3f 2d b3 76 18 7e 65 d5 3f 34 c6 8a b5 af 06 df 3f b4 2e 89 ec b4 3f a7 3f 13 c2 8c 29 f6 de e1 bf d6 ea 32 c4 a7 5b aa bf 06 00 00 00 00 00 00 00 70 cd da cf 70 50 99 bf f9 5c 0f a2 77 a6 ce bf 25 ad 38 67 eb 38 d6 bf e3 0d 87 46 e3 a6 a0 bf 39 e1 4c 30 99 99 d9 3f d7 50 27 a7 fb e0 a2 3f 06 00 00 00 00 00 00 00 ae 31 f4 85 8d a4 9f bf 6f 31 12 14 0b 28 d3 bf 70 7f 44 b3 26 c7 db bf f2 84 c3 6d 9c d0 a4 bf 41 e6 fa ff ff ff df 3f d1 91 fe f1 3a 99 a7 3f 00 00 00 00 00 00 00 00 ff 07 af 2f 06 00 00 00 64 d9 88 30 9e 53 a0 3f fa 7d 7d 23 a6 c4 d3 3f 43 6b 72 18 3d aa dc 3f f0 c5 d8 5f c6 7a a5 3f ff 6f 14 39 cd 82 e0 bf 3a f0 63 a0 26 5a a8 bf 06 00 00 00 00 00 00 00 c6 e0 af ee 7e 7a 9c bf 9e 60 18 4e a3 3d d1 bf 59 d2 61 d8 08 00 d9 bf d7 c0 88 b2 bf bb a2 bf 9d 3b 3e 5b cc cc dc 3f b9 48 aa 1f 1b 3d a5 3f 06 00 00 00 00 00 00 00 16 a5 fc 85 8d a4 9f bf 4f 49 17 14 0b 28 d3 bf 5d e4 4b b3 26 c7 db bf 95 13 c9 6d 9c d0 a4 bf e6 b7 01 00 00 00 e0 3f 49 dd 04 f2 3a 99 a7 3f 00 00 00 00 00 00 00 00 ff e8 a4 35 06 00 00 00 32 58 73 fa ae a5 9d 3f f3 25 2e d5 c3 f2 d1 3f 4c 08 fe ef ad 06 da 3f 28 dd 1f 95 8e 80 a3 3f 89 17 e0 0c 5d fb dd bf 1d 6b 7e f0 3b 1c a6 bf 06 00 00 00 00 00 00 00 84 34 af 15 8d a4 9f bf e2 80 1a d0 0a 28 d3 bf 52 ea b5 50 26 c7 db bf e7 6f e9 23 9c d0 a4 bf
""",
"""
81 80 87 00 0d 01 f4 01 31 6f 71 8e ff ff df 3f c5 1e 44 9e 3a 99 a7 3f 06 00 00 00 00 00 00 00 22 c6 00 86 8d a4 9f bf aa c7 19 14 0b 28 d3 bf 01 83 4f b3 26 c7 db bf 09 c2 cb 6d 9c d0 a4 bf df cb 03 00 00 00 e0 3f a1 f2 07 f2 3a 99 a7 3f 00 00 00 00 00 00 00 00 ff c9 9a 3b 06 00 00 00 3e 3f 8d 29 20 53 9a 3f d3 9f 29 5a ae df cf 3f c0 9d 85 3b 02 1c d7 3f 6c 91 e0 8b 0d 51 a1 3f 58 a2 7d 22 34 9f da bf b6 a2 f3 b3 e7 a1 a3 bf 06 00 00 00 00 00 00 00 bd b2 34 9c 4d 67 a1 bf 66 d9 86 4f 72 12 d5 bf 84 63 4a c5 43 8e de bf 10 0c 7b 92 78 e5 a6 bf 6b 94 a9 5e 99 99 e1 3f ac b7 ae 19 5a f5 a9 3f 06 00 00 00 00 00 00 00 98 d2 18 86 8d a4 9f bf ac 5f 28 14 0b 28 d3 bf f1 a0 64 b3 26 c7 db bf fe 96 db 6d 9c d0 a4 bf af f3 0f 00 00 00 e0 3f 16 e6 19 f2 3a 99 a7 3f 00 00 00 00 01 00 00 00 ff e0 f5 05 06 00 00 00 54 37 eb 51 93 af 96 3f 68 02 ce 70 c4 77 cb 3f ea ae 9e f4 3c ea d3 3f e6 73 91 fd 8a d8 9d 3f d6 81 58 20 23 f1 d6 bf 21 38 c3 71 2c eb a0 bf 06 00 00 00 00 00 00 00 67 8c b8 59 fa f1 a2 bf f5 8a f7 cf 50 f0 d6 bf 45 66 1d ff 99 a1 e0 bf f2 4c 68 30 b6 ec a8 bf 5a 02 d9 b6 ba 28 e3 3f e2 1d bc 75 08 42 ac 3f 06 00 00 00 00 00 00 00 92 b3 db 85 8d a4 9f 3f 58 64 03 14 0b 28 d3 3f 9c 05 2f b3 26 c7 db 3f 21 67 b3 6d 9c d0 a4 3f 61 28 e2 ff ff ff df bf 87 57 ec f1 3a 99 a7 bf 00 00 00 00 01 00 00 00 00 c2 eb 0b 06 00 00 00 00 13 53 28 15 0e 93 3f 15 b7 9c 3a 58 12 c7 3f 60 02 9d 07 46 ba d0 3f 4c 43 06 cc af 11 99 3f 1e 11 56 be 26 45 d3 bf 3b 00 3d f2 f3 6b 9c bf 06 00 00 00 00 00 00 00 4e e2 38 46
""",
"""
81 80 88 00 0d 01 f4 01 f3 5c a1 bf 6d 6a f5 4d e9 05 d5 bf 28 b4 e6 85 16 7c de bf 90 9d 07 bf d9 d7 a6 bf 56 68 3f 1d 21 8f e1 3f 81 47 22 f7 e8 e5 a9 3f 06 00 00 00 00 00 00 00 ee f1 e2 85 8d a4 9f 3f 3c b4 07 14 0b 28 d3 3f ff 54 35 b3 26 c7 db 3f 75 24 b8 6d 9c d0 a4 3f 1d 66 e9 ff ff ff df bf 72 aa f1 f1 3a 99 a7 bf 00 00 00 00 01 00 00 00 00 a3 e1 11 06 00 00 00 61 54 0f d2 30 7b 8f 3f 24 72 05 b8 00 0f c3 3f 2e 7d 47 4d d7 a2 cb 3f d6 68 8e 17 67 b5 94 3f 64 b1 e4 c2 2b d6 cf bf b9 87 45 1a 62 7a 97 bf 06 00 00 00 00 00 00 00 6b 70 72 65 d8 8f 9f bf e3 49 f3 cb 81 1b d3 bf cb 9b 92 0d f9 b4 db bf 34 ee a6 4d fd c2 a4 bf a3 9c 4b 07 0f eb df 3f 1e 71 88 78 c9 89 a7 3f 06 00 00 00 00 00 00 00 4b ff e9 85 8d a4 9f 3f bd 02 0c 14 0b 28 d3 3f 1f 83 3b b3 26 c7 db 3f 9a ca bc 6d 9c d0 a4 3f c7 8e f0 ff ff ff df bf 07 fa f6 f1 3a 99 a7 bf 00 00 00 00 01 00 00 00 00 84 d7 17 06 00 00 00 d6 f9 11 28 3a 7c 89 3f 38 67 10 d2 7b db be 3f 24 c7 65 a3 5b 5f c6 3f 8a e4 29 e0 b0 c3 90 3f 30 b1 5a 13 e1 c5 c9 bf c8 06 a0 5b a3 01 93 bf 06 00 00 00 00 00 00 00 37 1c 73 3e ca 65 9c bf 5c 29 f1 49 1a 31 d1 bf 6a 83 3e 95 db ed d8 bf da 3e 46 dc 20 ae a2 bf 9b 68 18 d4 db b7 dc 3f b6 9a ee f9 a9 2d a5 3f 06 00 00 00 00 00 00 00 90 21 f1 85 8d a4 9f 3f a6 59 10 14 0b 28 d3 3f 81 d2 41 b3 26 c7 db 3f e2 79 c1 6d 9c d0 a4 3f 82 cc f7 ff ff ff df bf ec 45 fc f1 3a 99 a7 bf 00 00 00 00 01 00 00 00 00 65 cd 1d 06 00 00 00 56 16 ae 52 46 1f 84 3f ef f6 49 9b 1f 5d b8 3f 9b e2 94 11 19 aa c1 3f c8 6c b1 4b 1a 79 8a 3f
""",
"""
81 80 89 00 0d 01 f4 01 98 21 0e 6e 6d 59 c4 bf bd fa 98 6c 6f 03 8e bf 06 00 00 00 00 00 00 00 16 c7 73 17 bc 3b 99 bf 82 10 de 8f 65 8d ce bf 3b 6a ea 1c be 26 d6 bf df 8e e5 6a 44 99 a0 bf a0 33 e5 a0 a8 84 d9 3f a1 c3 54 7b 8a d1 a2 3f 06 00 00 00 00 00 00 00 b4 02 ff 85 8d a4 9f 3f e8 bc 18 14 0b 28 d3 3f f9 fa 4d b3 26 c7 db 3f 06 a1 ca 6d 9c d0 a4 3f 4d e8 02 00 00 00 e0 bf d1 a7 06 f2 3a 99 a7 bf 00 00 00 00 01 00 00 00 00 46 c3 23 06 00 00 00 c1 53 c7 a3 aa c8 7e 3f 6e 93 b7 cb ec a2 b2 3f 23 9f a9 2f 1f 06 bb 3f c4 bc 35 d1 f7 3f 84 3f 3a 05 fe a5 a1 21 bf bf fa d6 95 54 3e f5 86 bf 06 00 00 00 00 00 00 00 d3 73 74 f0 ad 11 96 bf 8f d0 d9 8b 96 b8 ca bf ae 52 96 a4 a0 5f d3 bf 3e c0 09 f3 cf 08 9d bf 88 00 b2 6d 75 51 d6 3f f2 ed ba fc 6a 75 a0 3f 06 00 00 00 00 00 00 00 ca 1a 00 86 8d a4 9f 3f 55 65 19 14 0b 28 d3 3f 83 f5 4e b3 26 c7 db 3f 1c 54 cb 6d 9c d0 a4 3f bc 74 03 00 00 00 e0 bf 13 76 07 f2 3a 99 a7 bf 00 00 00 00 01 00 00 00 00 27 b9 29 06 00 00 00 ed 68 65 4b ce 96 76 3f 64 79 b2 c6 c6 59 ab 3f 0b 1c 4b 6c 7e d4 b3 3f 11 72 c1 a1 f4 b7 7d 3f 79 a8 5a 84 16 d8 b6 bf 43 a2 36 6f b3 d8 80 bf 06 00 00 00 00 00 00 00 8f 20 75 c9 9f e7 92 bf 9b 90 d5 87 c7 e3 c6 bf 2c 3b 42 2c 83 98 d0 bf bd 62 48 10 17 df 98 bf 71 cd 7e 3a 42 1e d3 3f 91 30 42 fc 96 32 9c 3f 06 00 00 00 00 00 00 00 9f 6a ff 85 8d a4 9f 3f 87 fa 18 14 0b 28 d3 3f a0 53 4e b3 26 c7 db 3f ae e1 ca 6d 9c d0 a4 3f f7 1c 03 00 00 00 e0 bf f5 ef 06 f2 3a 99 a7 bf 00 00 00 00 01 00 00 00 00 08 af 2f 06 00 00 00 85 d8 6c 38
""",
"""
81 80 8a 00 0d 01 f4 01 ef 51 6f 3f 96 e5 5d c4 06 f6 a2 3f 0f 78 1c b2 9f 7e ab 3f 49 c3 64 95 43 9a 74 3f 08 5a 64 ee 72 ac af bf 55 b9 f6 78 9d 5b 77 bf 06 00 00 00 00 00 00 00 9c 9a eb 44 23 7b 8f bf aa 50 d1 83 f8 0e c3 bf 40 47 dc 67 cb a2 cb bf 40 05 87 2d 5e b5 94 bf b5 34 97 0e 1e d6 cf 3f 33 85 0e ff 57 7a 97 3f 06 00 00 00 00 00 00 00 8c 74 fe 85 8d a4 9f 3f 54 66 18 14 0b 28 d3 3f 44 7d 4d b3 26 c7 db 3f 63 3d ca 6d 9c d0 a4 3f 54 a0 02 00 00 00 e0 bf 88 35 06 f2 3a 99 a7 bf 00 00 00 00 01 00 00 00 00 e9 a4 35 06 00 00 00 78 bb 74 2c 4d fe 63 3f cd d6 e2 20 33 35 98 3f 22 fe e5 eb 26 8d a1 3f 4e da aa fa b8 4d 6a 3f ac 25 09 fd 14 38 a4 bf b4 18 90 f1 40 d2 6d bf 06 00 00 00 00 00 00 00 f4 fa ec f6 06 27 89 bf bd 29 9a ff 52 74 be bf 2a 1e 34 77 90 14 c6 bf 43 ac c5 4a a5 8b 90 bf 75 d5 30 a8 b7 6f c9 3f ef de da 01 19 c2 92 3f 06 00 00 00 00 00 00 00 d5 81 e5 85 8d a4 9f 3f c5 4b 09 14 0b 28 d3 3f e5 97 37 b3 26 c7 db 3f b9 d5 b9 6d 9c d0 a4 3f af 04 ec ff ff ff df bf 48 9c f3 f1 3a 99 a7 bf 00 00 00 00 02 00 00 00 00 00 00 00 06 00 00 00 fc f4 c4 e5 6c 65 56 3f d9 2a b4 ab fc 1d 8b 3f 43 94 e5 0b 25 a9 93 3f 1d be 4d 66 fd 76 5d 3f 4c 67 47 69 26 a6 96 bf d7 7a c2 bb df b3 60 bf 06 00 00 00 00 00 00 00 c0 53 ee a8 ea d2 82 bf 04 a9 91 f7 b4 ca b6 bf 76 ee 8b 86 55 86 c0 bf 9f 9c 08 d0 d8 c3 88 bf 94 6e ca 41 51 09 c3 3f 16 66 4e 09 b4 13 8c 3f 06 00 00 00 00 00 00 00 36 91 ea 85 8d a4 9f 3f d9 5b 0c 14 0b 28 d3 3f 4c 06 3c b3 26 c7 db 3f 9a 2a bd 6d 9c d0 a4 3f bf 25 f1 ff ff ff df bf
""",
"""
81 80 8b 00 0d 01 f4 01 96 65 f7 f1 3a 99 a7 bf 00 00 00 00 02 00 00 00 00 e1 f5 05 06 00 00 00 0b 57 d8 2e ac bc 43 3f 19 1d 86 9e bc e5 77 3f f2 70 0b 01 8a 53 81 3f 4a 54 f6 50 61 f7 49 3f b1 10 d0 54 b6 f5 83 bf 7d 65 12 42 5d 70 4d bf 06 00 00 00 00 00 00 00 50 49 df b5 9c fd 78 bf 61 3d 12 df 2d 42 ae bf 7c 6f c7 2b 35 f0 b5 bf 50 d6 85 0a 67 70 80 bf 45 ff c7 b6 d5 45 b9 3f 74 02 e7 0e 36 a3 82 3f 06 00 00 00 00 00 00 00 40 32 01 86 8d a4 9f 3f 74 0f 1a 14 0b 28 d3 3f 14 e7 4f b3 26 c7 db 3f ee 0e cc 6d 9c d0 a4 3f cd 03 04 00 00 00 e0 bf 79 46 08 f2 3a 99 a7 bf 00 00 00 00 02 00 00 00 00 c2 eb 0b 06 00 00 00 3f d7 f8 6e af 3a 23 3f a0 c8 92 63 59 48 57 3f 14 49 63 ad 6d e1 60 3f 1c c9 ef de 5d 4c 29 3f 23 76 a1 eb 41 72 63 bf 5b 48 67 fd 7a ae 2c bf 06 00 00 00 00 00 00 00 4e 11 c4 33 c8 aa 68 bf 3d 99 02 9e e3 dd 9d bf 70 38 ee 94 7e a7 a5 bf f0 46 06 8a ea 39 70 bf fd 7e f6 d3 11 f2 a8 3f ec 69 ff 28 70 65 72 3f 06 00 00 00 00 00 00 00 65 12 f5 85 8d a4 9f 3f d8 b7 12 14 0b 28 d3 3f 9e 40 45 b3 26 c7 db 3f d0 13 c4 6d 9c d0 a4 3f e7 c4 fb ff ff ff df bf 78 3b ff f1 3a 99 a7 bf 00 00 00 00 02 00 00 00 00 a3 e1 11 06 00 00 00 00 61 07 45 f7 b2 02 3c a0 8b be 6c 05 a4 36 3c 60 25 8b 2a 49 6a 40 3c 40 10 e7 de cf 99 08 3c 00 af 92 87 01 e9 42 bc 00 d0 2f fc 0b e4 0b bc 06 00 00 00 00 00 00 00 12 1e 64 ab 3a 8a 47 3c 2a fc b4 f5 82 80 7c 3c b5 ee 96 79 2f aa 84 3c 3b 42 80 17 35 f8 4e 3c 9f ef bd 61 42 ce 87 bc 2e bf 85 bd 3d 8e 51 bc 06 00 00 00 00 00 00 00 66 62 22 86 8d a4 9f 3f 62 26 2e 14
""",
"""
81 80 8c 00 0d 03 60 00 0b 28 d3 3f 05 07 6d b3 26 c7 db 3f 10 e2 e1 6d 9c d0 a4 3f b4 cb 14 00 00 00 e0 bf b8 05 21 f2 3a 99 a7 bf 00 00 00 00 02 00 00 00 69 82 b0 17 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
"""
]
decoder_1 = JointStateDecoder(packets_1)
decoder_1.decode_joint_state_message(debug=False)
decoder_2 = JointStateDecoder(packets_2)
decoder_2.decode_joint_state_message(debug=False)
decoder_3 = JointStateDecoder(packets_3)
decoder_3.decode_joint_state_message(debug=False) And here is the outputted result: Click to expand
At least in this, I have learned that on the MotoROS side of things, it is very unlikely to be the issue, and I learned quite a bit about DDS. But that still leaves me wondering which avenue to tackle next. Any suggestions on pinpointing what the issue is—i.e., ruling out/identifying my system, MTC, or ROS? |
Beta Was this translation helpful? Give feedback.
All reactions
-
I assume you mean: a goal is submitted with a trajectory with only a single trajectory point? I'm sorry for being so pedantic about this, but when debugging network protocols, ROS RMWs and ROS APIs, there is a need to be very precise about this sort of thing.
If there is indeed a goal submitted with a single trajectory point, that would seem to point to something on the producing side, not MotoROS2.
thanks for including your code. Impressive result. We've done something similar in the past, which builds upon jseldent/wireshark-dds-xrce: gavanderhoorn/micro_xrce_dds_ros_idl_dissectors. That's also not necessarily trivial, but can be automated (code generation), at least partially.
I'm not sure I understand how to map these printouts to the trajectories in the goals you submit.
Have you tried logging the trajectory that's being submitted as part of the goal in your application? So before you construct the goal, or right before it gets submitted to MotoROS2? I would perhaps try to understand what makes the MTC (or MoveIt) generate a trajectory with only a single point. Perhaps the MoveIt and/or MTC maintainers could help you. Please be sure to provide them with sufficient detail, and it would be perfect if you could replicate what you see with MotoROS2 with a simulated robot (ie: the Panda setup used in the MoveIt tutorials fi) as that would make it easier for the MoveIt maintainers to figure out what's going on without needing your exact setup. |
Beta Was this translation helpful? Give feedback.
All reactions
-
@lkaising: would you have any update on whether you got things to work? |
Beta Was this translation helpful? Give feedback.
All reactions
-
Yes, I managed to resolve the issue by implementing additional validation checks in my task execution pipeline. While I didn't identify the exact source of the problem (whether MTC or my implementation), adding pre-execution validation has effectively prevented the single-point trajectory issues. Here's the solution I implemented:
TaskExecutionStatus TaskManager::performTask(Task& task,
const string& command,
TimerResults& timer_results) const {
{
ScopedTimer timer("Initialize and Plan Task Timer", timer_results);
auto status = planTask(task);
if (status != TaskExecutionStatus::Success) {
return status;
}
}
{
ScopedTimer timer("Execute Task Timer", timer_results);
return executeTask(task, command);
}
}
TaskExecutionStatus TaskManager::executeTask(Task& task,
const string& command) const {
const auto& solutions = task.solutions();
if (solutions.empty()) {
return TaskExecutionStatus::PlanningFailed;
}
auto valid_solution = findValidSolution(task, solutions);
if (!valid_solution) {
return TaskExecutionStatus::PlanningFailed;
}
task.introspection().publishSolution(*valid_solution->get());
const auto result = task.execute(*valid_solution->get());
return checkExecutionResult(result, command);
}
TaskManager::OptionalSolutionRef
TaskManager::findValidSolution(const Task& task,
const ordered<SolutionPtr>& solutions) const {
if (auto it = std::find_if(solutions.begin(), solutions.end(), [&](const auto& solution) {
return !solution->isFailure() && task_validator_->validateSolution(
task,
solution->start()->scene()->getCurrentState(),
solution->end()->scene()->getCurrentState());
}); it != solutions.end()) {
return std::cref(*it);
}
return std::nullopt;
} The validation consists of two checks:
Since implementing these checks, I haven't seen any instances of missing trajectory points. While I didn't uncover the root cause, this validation approach has provided a reliable safeguard against problematic trajectories being published. |
Beta Was this translation helpful? Give feedback.
Yes, I managed to resolve the issue by implementing additional validation checks in my task execution pipeline. While I didn't identify the exact source of the problem (whether MTC or my implementation), adding pre-execution validation has effectively prevented the single-point trajectory issues.
Here's the solution I implemented: