diff --git a/.envrc b/.envrc
new file mode 100644
index 0000000..3550a30
--- /dev/null
+++ b/.envrc
@@ -0,0 +1 @@
+use flake
diff --git a/.gitignore b/.gitignore
index 960675a..71add28 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,4 +10,7 @@ log/
.vscode/
#Pycache folder
-__pycache__/
\ No newline at end of file
+__pycache__/
+
+#Direnv
+.direnv/
diff --git a/.gitmodules b/.gitmodules
index ccd1110..3c3b3a3 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,6 @@
[submodule "src/ros2_interfaces_pkg"]
path = src/ros2_interfaces_pkg
- url = git@github.com:SHC-ASTRA/ros2_interfaces_pkg.git
+ url = ../ros2_interfaces_pkg
+[submodule "src/astra_description"]
+ path = src/astra_descriptions
+ url = ../astra_descriptions
diff --git a/auto_start/auto_start_anchor.sh b/auto_start/auto_start_anchor.sh
index 724062c..0d7e9c2 100755
--- a/auto_start/auto_start_anchor.sh
+++ b/auto_start/auto_start_anchor.sh
@@ -21,4 +21,4 @@ source /home/clucky/rover-ros2/install/setup.bash
cd /home/clucky/rover-ros2/
# Launch the ROS 2 node with the desired mode
-ros2 launch rover_launch.py mode:=anchor
+ros2 launch anchor_pkg rover.launch.py mode:=anchor
diff --git a/flake.nix b/flake.nix
index 52c2c74..8e7b60f 100644
--- a/flake.nix
+++ b/flake.nix
@@ -1,30 +1,72 @@
{
+ description = "Development environment for ASTRA Anchor";
+
inputs = {
nix-ros-overlay.url = "github:lopsided98/nix-ros-overlay/master";
- nixpkgs.follows = "nix-ros-overlay/nixpkgs"; # IMPORTANT!!!
+ nixpkgs.follows = "nix-ros-overlay/nixpkgs"; # IMPORTANT!!!
};
- outputs = { self, nix-ros-overlay, nixpkgs }:
- nix-ros-overlay.inputs.flake-utils.lib.eachDefaultSystem (system:
+
+ outputs =
+ {
+ self,
+ nix-ros-overlay,
+ nixpkgs,
+ }:
+ nix-ros-overlay.inputs.flake-utils.lib.eachDefaultSystem (
+ system:
let
pkgs = import nixpkgs {
inherit system;
overlays = [ nix-ros-overlay.overlays.default ];
};
- in {
+ in
+ {
devShells.default = pkgs.mkShell {
name = "ASTRA Anchor";
- packages = [
- pkgs.colcon
- pkgs.python312Packages.pyserial
- pkgs.python312Packages.pygame
- (with pkgs.rosPackages.humble; buildEnv {
- paths = [
- ros-core ros2cli ros2run ros2bag ament-cmake-core python-cmake-module
- ];
- })
+ packages = with pkgs; [
+ colcon
+ (python312.withPackages (
+ p: with p; [
+ pyserial
+ pygame
+ scipy
+ crccheck
+ black
+ ]
+ ))
+ (
+ with rosPackages.humble;
+ buildEnv {
+ paths = [
+ ros-core
+ ros2cli
+ ros2run
+ ros2bag
+ rviz2
+ xacro
+ ament-cmake-core
+ python-cmake-module
+ diff-drive-controller
+ parameter-traits
+ generate-parameter-library
+ joint-state-publisher-gui
+ robot-state-publisher
+ ros2-control
+ controller-manager
+ # ros2-controllers nixpkg does not build :(
+ ];
+ }
+ )
];
+ shellHook = ''
+ # Display stuff
+ export DISPLAY=''${DISPLAY:-:0}
+ export QT_X11_NO_MITSHM=1
+ '';
};
- });
+ }
+ );
+
nixConfig = {
extra-substituters = [ "https://ros.cachix.org" ];
extra-trusted-public-keys = [ "ros.cachix.org-1:dSyZxI8geDCJrwgvCOHDoAfOm5sV1wCPjBkKL+38Rvo=" ];
diff --git a/src/anchor_pkg/anchor_pkg/anchor_node.py b/src/anchor_pkg/anchor_pkg/anchor_node.py
index aa46fdb..e4d1ff5 100644
--- a/src/anchor_pkg/anchor_pkg/anchor_node.py
+++ b/src/anchor_pkg/anchor_pkg/anchor_node.py
@@ -43,30 +43,10 @@ class SerialRelay(Node):
# Initalize node with name
super().__init__("anchor_node")#previously 'serial_publisher'
- # New pub/sub with VicCAN
- self.fromvic_debug_pub_ = self.create_publisher(String, '/anchor/from_vic/debug', 20)
- self.fromvic_core_pub_ = self.create_publisher(VicCAN, '/anchor/from_vic/core', 20)
- self.fromvic_arm_pub_ = self.create_publisher(VicCAN, '/anchor/from_vic/arm', 20)
- self.fromvic_bio_pub_ = self.create_publisher(VicCAN, '/anchor/from_vic/bio', 20)
-
- self.mock_mcu_sub_ = self.create_subscription(String, '/anchor/from_vic/mock_mcu', self.on_mock_fromvic, 20)
- self.tovic_sub_ = self.create_subscription(VicCAN, '/anchor/to_vic/relay', self.on_relay_tovic_viccan, 20)
- self.tovic_debug_sub_ = self.create_subscription(String, '/anchor/to_vic/relay_string', self.on_relay_tovic_string, 20)
-
-
- # Create publishers
- self.arm_pub = self.create_publisher(String, '/anchor/arm/feedback', 10)
- self.core_pub = self.create_publisher(String, '/anchor/core/feedback', 10)
- self.bio_pub = self.create_publisher(String, '/anchor/bio/feedback', 10)
-
- self.debug_pub = self.create_publisher(String, '/anchor/debug', 10)
-
- # Create a subscriber
- self.relay_sub = self.create_subscription(String, '/anchor/relay', self.on_relay_tovic_string, 10)
-
# Loop through all serial devices on the computer to check for the MCU
self.port = None
- # self.port = "/tmp/ttyACM9" # Fake port, for debugging
+ if port_override := os.getenv("PORT_OVERRIDE"):
+ self.port = port_override
ports = SerialRelay.list_serial_ports()
for i in range(4):
if self.port is not None:
@@ -97,6 +77,27 @@ class SerialRelay(Node):
self.ser.write(b"can_relay_mode,on\n")
atexit.register(self.cleanup)
+ # New pub/sub with VicCAN
+ self.fromvic_debug_pub_ = self.create_publisher(String, '/anchor/from_vic/debug', 20)
+ self.fromvic_core_pub_ = self.create_publisher(VicCAN, '/anchor/from_vic/core', 20)
+ self.fromvic_arm_pub_ = self.create_publisher(VicCAN, '/anchor/from_vic/arm', 20)
+ self.fromvic_bio_pub_ = self.create_publisher(VicCAN, '/anchor/from_vic/bio', 20)
+
+ self.mock_mcu_sub_ = self.create_subscription(String, '/anchor/from_vic/mock_mcu', self.on_mock_fromvic, 20)
+ self.tovic_sub_ = self.create_subscription(VicCAN, '/anchor/to_vic/relay', self.on_relay_tovic_viccan, 20)
+ self.tovic_debug_sub_ = self.create_subscription(String, '/anchor/to_vic/relay_string', self.on_relay_tovic_string, 20)
+
+
+ # Create publishers
+ self.arm_pub = self.create_publisher(String, '/anchor/arm/feedback', 10)
+ self.core_pub = self.create_publisher(String, '/anchor/core/feedback', 10)
+ self.bio_pub = self.create_publisher(String, '/anchor/bio/feedback', 10)
+
+ self.debug_pub = self.create_publisher(String, '/anchor/debug', 10)
+
+ # Create a subscriber
+ self.relay_sub = self.create_subscription(String, '/anchor/relay', self.on_relay_tovic_string, 10)
+
def run(self):
# This thread makes all the update processes run in the background
@@ -171,9 +172,37 @@ class SerialRelay(Node):
""" Relay a string message from the MCU to the appropriate VicCAN topic """
self.fromvic_debug_pub_.publish(String(data=msg))
parts = msg.strip().split(",")
- if len(parts) < 3 or parts[0] != "can_relay_fromvic":
+ if len(parts) > 0 and parts[0] != "can_relay_fromvic":
+ self.get_logger().debug(f"Ignoring non-VicCAN message: '{msg.strip()}'")
return
+ # String validation
+ malformed: bool = False
+ malformed_reason: str = ""
+ if len(parts) < 3 or len(parts) > 7:
+ malformed = True
+ malformed_reason = f"invalid argument count (expected [3,7], got {len(parts)})"
+ elif parts[1] not in ["core", "arm", "digit", "citadel", "broadcast"]:
+ malformed = True
+ malformed_reason = f"invalid mcu_name '{parts[1]}'"
+ elif not(parts[2].isnumeric()) or int(parts[2]) < 0:
+ malformed = True
+ malformed_reason = f"command_id '{parts[2]}' is not a non-negative integer"
+ else:
+ for x in parts[3:]:
+ try:
+ float(x)
+ except ValueError:
+ malformed = True
+ malformed_reason = f"data '{x}' is not a float"
+ break
+
+ if malformed:
+ self.get_logger().warning(f"Ignoring malformed from_vic message: '{msg.strip()}'; reason: {malformed_reason}")
+ return
+
+ # Have valid VicCAN message
+
output = VicCAN()
output.mcu_name = parts[1]
output.command_id = int(parts[2])
diff --git a/rover_launch.py b/src/anchor_pkg/launch/rover.launch.py
similarity index 100%
rename from rover_launch.py
rename to src/anchor_pkg/launch/rover.launch.py
diff --git a/src/anchor_pkg/package.xml b/src/anchor_pkg/package.xml
index 19dc42a..4903787 100644
--- a/src/anchor_pkg/package.xml
+++ b/src/anchor_pkg/package.xml
@@ -8,6 +8,10 @@
AGPL-3.0-only
rclpy
+ common_interfaces
+ python3-serial
+
+ black
ament_copyright
ament_flake8
diff --git a/src/anchor_pkg/setup.py b/src/anchor_pkg/setup.py
index e2844e7..f29392e 100644
--- a/src/anchor_pkg/setup.py
+++ b/src/anchor_pkg/setup.py
@@ -1,4 +1,6 @@
from setuptools import find_packages, setup
+from os import path
+from glob import glob
package_name = 'anchor_pkg'
@@ -9,7 +11,8 @@ setup(
data_files=[
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
- ('share/' + package_name, ['package.xml']),
+ (path.join("share", package_name), ['package.xml']),
+ (path.join("share", package_name, "launch"), glob("launch/*"))
],
install_requires=['setuptools'],
zip_safe=True,
diff --git a/src/arm_pkg/package.xml b/src/arm_pkg/package.xml
index 8982d81..efcb547 100644
--- a/src/arm_pkg/package.xml
+++ b/src/arm_pkg/package.xml
@@ -8,7 +8,11 @@
AGPL-3.0-only
rclpy
+ common_interfaces
+ python3-numpy
ros2_interfaces_pkg
+
+ python3-ikpy-pip
ament_copyright
ament_flake8
diff --git a/src/astra_descriptions b/src/astra_descriptions
new file mode 160000
index 0000000..4ab41e9
--- /dev/null
+++ b/src/astra_descriptions
@@ -0,0 +1 @@
+Subproject commit 4ab41e9c826b0495aa90d0df7972482a831b255b
diff --git a/src/bio_pkg/package.xml b/src/bio_pkg/package.xml
index d4a8515..d87859f 100644
--- a/src/bio_pkg/package.xml
+++ b/src/bio_pkg/package.xml
@@ -8,6 +8,7 @@
AGPL-3.0-only
rclpy
+ common_interfaces
ros2_interfaces_pkg
ament_copyright
diff --git a/src/core_gazebo/CMakeLists.txt b/src/core_gazebo/CMakeLists.txt
deleted file mode 100644
index 1aa734c..0000000
--- a/src/core_gazebo/CMakeLists.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-cmake_minimum_required(VERSION 3.8)
-project(core_gazebo)
-
-if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
- add_compile_options(-Wall -Wextra -Wpedantic)
-endif()
-
-# find dependencies
-find_package(ament_cmake REQUIRED)
-find_package(controller_manager REQUIRED)
-find_package(gripper_controllers REQUIRED)
-find_package(rclcpp REQUIRED)
-find_package(ros2_control REQUIRED)
-find_package(ros2_controllers REQUIRED)
-find_package(trajectory_msgs REQUIRED)
-find_package(xacro REQUIRED)
-
-# Copy necessary files to designated locations in the project
-install (
- DIRECTORY config launch models worlds
- DESTINATION share/${PROJECT_NAME}
-)
-
-if(BUILD_TESTING)
- find_package(ament_lint_auto REQUIRED)
- # the following line skips the linter which checks for copyrights
- # comment the line when a copyright and license is added to all source files
- set(ament_cmake_copyright_FOUND TRUE)
- # the following line skips cpplint (only works in a git repo)
- # comment the line when this package is in a git repo and when
- # a copyright and license is added to all source files
- set(ament_cmake_cpplint_FOUND TRUE)
- ament_lint_auto_find_test_dependencies()
-endif()
-
-ament_package()
diff --git a/src/core_gazebo/config/ros_gz_bridge.yaml b/src/core_gazebo/config/ros_gz_bridge.yaml
deleted file mode 100644
index 7b9c4eb..0000000
--- a/src/core_gazebo/config/ros_gz_bridge.yaml
+++ /dev/null
@@ -1,25 +0,0 @@
-# gz topic published by Sensors plugin
-- ros_topic_name: "camera_head/depth/camera_info"
- gz_topic_name: "camera_head/camera_info"
- ros_type_name: "sensor_msgs/msg/CameraInfo"
- gz_type_name: "gz.msgs.CameraInfo"
- direction: GZ_TO_ROS
- lazy: true # Determines whether connections are created immediately at startup (when false) or only when data is actually requested by a subscriber (when true), helping to conserve system resources at the cost of potential initial delays in data flow.
-
-# gz topic published by Sensors plugin
-- ros_topic_name: "camera_head/depth/color/points"
- gz_topic_name: "camera_head/points"
- ros_type_name: "sensor_msgs/msg/PointCloud2"
- gz_type_name: "gz.msgs.PointCloudPacked"
- direction: GZ_TO_ROS
- lazy: true
-
-# Clock configuration
-- ros_topic_name: "clock"
- gz_topic_name: "clock"
- ros_type_name: "rosgraph_msgs/msg/Clock"
- gz_type_name: "gz.msgs.Clock"
- direction: GZ_TO_ROS
- lazy: false
-
-
diff --git a/src/core_gazebo/launch/core.gazebo.launch.py b/src/core_gazebo/launch/core.gazebo.launch.py
deleted file mode 100644
index ebbf4ff..0000000
--- a/src/core_gazebo/launch/core.gazebo.launch.py
+++ /dev/null
@@ -1,286 +0,0 @@
-#!/usr/bin/env python3
-
-import os
-from launch import LaunchDescription
-from launch.actions import (
- AppendEnvironmentVariable,
- DeclareLaunchArgument,
- IncludeLaunchDescription
-)
-from launch.conditions import IfCondition
-from launch.launch_description_sources import PythonLaunchDescriptionSource
-from launch.substitutions import LaunchConfiguration, PathJoinSubstitution
-from launch_ros.actions import Node
-from launch_ros.substitutions import FindPackageShare
-
-
-def generate_launch_description():
- """
- Generate a launch description for the Gazebo simulation.
-
- This function sets up all necessary parameters, paths, and nodes required to launch
- the Gazebo simulation with a robot. It handles:
- 1. Setting up package paths and constants
- 2. Declaring launch arguments for robot configuration
- 3. Setting up the Gazebo environment
- 4. Spawning the robot in simulation
-
- Returns:
- LaunchDescription: A complete launch description for the simulation
- """
- # Constants for paths to different files and folders
- package_name_gazebo = 'core_gazebo'
- package_name_description = 'core_rover_description'
- # package_name_moveit = 'mycobot_moveit_config'
-
- default_robot_name = 'core_rover'
- gazebo_models_path = 'models'
- default_world_file = 'pick_and_place_demo.world'
- gazebo_worlds_path = 'worlds'
-
- ros_gz_bridge_config_file_path = 'config/ros_gz_bridge.yaml'
-
- # Set the path to different files and folders
- pkg_ros_gz_sim = FindPackageShare(package='ros_gz_sim').find('ros_gz_sim')
- pkg_share_gazebo = FindPackageShare(package=package_name_gazebo).find(package_name_gazebo)
- pkg_share_description = FindPackageShare(
- package=package_name_description).find(package_name_description)
- # pkg_share_moveit = FindPackageShare(package=package_name_moveit).find(package_name_moveit)
-
- gazebo_models_path = os.path.join(pkg_share_gazebo, gazebo_models_path)
- default_ros_gz_bridge_config_file_path = os.path.join(
- pkg_share_gazebo, ros_gz_bridge_config_file_path)
-
- # Get the parent directory of the package share to access all ROS packages
- ros_packages_path = os.path.dirname(pkg_share_description)
-
- # Launch configuration variables
- jsp_gui = LaunchConfiguration('jsp_gui')
- load_controllers = LaunchConfiguration('load_controllers')
- robot_name = LaunchConfiguration('robot_name')
- use_rviz = LaunchConfiguration('use_rviz')
- use_camera = LaunchConfiguration('use_camera')
- use_gazebo = LaunchConfiguration('use_gazebo')
- use_robot_state_pub = LaunchConfiguration('use_robot_state_pub')
- use_sim_time = LaunchConfiguration('use_sim_time')
- world_file = LaunchConfiguration('world_file')
-
- world_path = PathJoinSubstitution([
- pkg_share_gazebo,
- gazebo_worlds_path,
- world_file
- ])
-
- # Set the pose configuration variables
- x = LaunchConfiguration('x')
- y = LaunchConfiguration('y')
- z = LaunchConfiguration('z')
- roll = LaunchConfiguration('roll')
- pitch = LaunchConfiguration('pitch')
- yaw = LaunchConfiguration('yaw')
-
-
- ################################################################################################
- # Declare the launch arguments
-
- declare_robot_name_cmd = DeclareLaunchArgument(
- name='robot_name',
- default_value=default_robot_name,
- description='The name for the robot')
-
- declare_load_controllers_cmd = DeclareLaunchArgument(
- name='load_controllers',
- default_value='true',
- description='Flag to enable loading of ROS 2 controllers')
-
- declare_use_robot_state_pub_cmd = DeclareLaunchArgument(
- name='use_robot_state_pub',
- default_value='true',
- description='Flag to enable robot state publisher')
-
- # GUI and visualization arguments
- declare_jsp_gui_cmd = DeclareLaunchArgument(
- name='jsp_gui',
- default_value='false',
- description='Flag to enable joint_state_publisher_gui')
-
- declare_use_camera_cmd = DeclareLaunchArgument(
- name='use_camera',
- default_value='false',
- description='Flag to enable the RGBD camera for Gazebo point cloud simulation')
-
- declare_use_gazebo_cmd = DeclareLaunchArgument(
- name='use_gazebo',
- default_value='true',
- description='Flag to enable Gazebo')
-
- declare_use_rviz_cmd = DeclareLaunchArgument(
- name='use_rviz',
- default_value='true',
- description='Flag to enable RViz')
-
- declare_use_sim_time_cmd = DeclareLaunchArgument(
- name='use_sim_time',
- default_value='true',
- description='Use simulation (Gazebo) clock if true')
-
- declare_world_cmd = DeclareLaunchArgument(
- name='world_file',
- default_value=default_world_file,
- description='World file name (e.g., simple_demo.world, pick_and_place_demo.world)')
-
- # Pose arguments
- declare_x_cmd = DeclareLaunchArgument(
- name='x',
- default_value='0.0',
- description='x component of initial position, meters')
-
- declare_y_cmd = DeclareLaunchArgument(
- name='y',
- default_value='0.0',
- description='y component of initial position, meters')
-
- declare_z_cmd = DeclareLaunchArgument(
- name='z',
- default_value='0.75',
- description='z component of initial position, meters')
-
- declare_roll_cmd = DeclareLaunchArgument(
- name='roll',
- default_value='0.0',
- description='roll angle of initial orientation, radians')
-
- declare_pitch_cmd = DeclareLaunchArgument(
- name='pitch',
- default_value='0.0',
- description='pitch angle of initial orientation, radians')
-
- declare_yaw_cmd = DeclareLaunchArgument(
- name='yaw',
- default_value='0.0',
- description='yaw angle of initial orientation, radians')
-
-
- ################################################################################################
- # Launch stuff
-
- # Include Robot State Publisher launch file if enabled
- robot_state_publisher_cmd = IncludeLaunchDescription(
- PythonLaunchDescriptionSource([
- os.path.join(pkg_share_description, 'launch', 'robot_state_publisher.launch.py')
- ]),
- launch_arguments={
- 'jsp_gui': jsp_gui,
- 'use_camera': use_camera,
- 'use_gazebo': use_gazebo,
- 'use_rviz': use_rviz,
- 'use_sim_time': use_sim_time
- }.items(),
- condition=IfCondition(use_robot_state_pub)
- )
-
- # # Include ROS 2 Controllers launch file if enabled
- # load_controllers_cmd = IncludeLaunchDescription(
- # PythonLaunchDescriptionSource([
- # os.path.join(pkg_share_moveit, 'launch', 'load_ros2_controllers.launch.py')
- # ]),
- # launch_arguments={
- # 'use_sim_time': use_sim_time
- # }.items(),
- # condition=IfCondition(load_controllers)
- # )
-
- # Set Gazebo model path - include both models directory and ROS packages
- set_env_vars_resources = AppendEnvironmentVariable(
- 'GZ_SIM_RESOURCE_PATH',
- gazebo_models_path)
-
- # Add ROS packages path so Gazebo can resolve package:// URIs
- set_env_vars_packages = AppendEnvironmentVariable(
- 'GZ_SIM_RESOURCE_PATH',
- os.path.dirname(pkg_share_description))
-
- # Start Gazebo with optimized arguments
- start_gazebo_cmd = IncludeLaunchDescription(
- PythonLaunchDescriptionSource(
- os.path.join(pkg_ros_gz_sim, 'launch', 'gz_sim.launch.py')),
- launch_arguments=[('gz_args', [' -r -v 3 --render-engine ogre2 ', world_path])])
-
- # Bridge ROS topics and Gazebo messages for establishing communication
- start_gazebo_ros_bridge_cmd = Node(
- package='ros_gz_bridge',
- executable='parameter_bridge',
- parameters=[{
- 'config_file': default_ros_gz_bridge_config_file_path,
- }],
- output='screen'
- )
-
- # Includes optimizations to minimize latency and bandwidth when streaming image data
- start_gazebo_ros_image_bridge_cmd = Node(
- package='ros_gz_image',
- executable='image_bridge',
- arguments=[
- '/camera_head/depth_image',
- '/camera_head/image',
- ],
- remappings=[
- ('/camera_head/depth_image', '/camera_head/depth/image_rect_raw'),
- ('/camera_head/image', '/camera_head/color/image_raw'),
- ],
- condition=IfCondition(use_camera)
- )
-
- # Spawn the robot
- start_gazebo_ros_spawner_cmd = Node(
- package='ros_gz_sim',
- executable='create',
- output='screen',
- arguments=[
- '-topic', '/robot_description',
- '-name', robot_name,
- '-allow_renaming', 'true',
- '-x', x,
- '-y', y,
- '-z', z,
- '-R', roll,
- '-P', pitch,
- '-Y', yaw
- ])
-
-
- ################################################################################################
- # Launch description
-
- ld = LaunchDescription()
-
- # Declare the launch options
- ld.add_action(declare_robot_name_cmd)
- ld.add_action(declare_jsp_gui_cmd)
- ld.add_action(declare_load_controllers_cmd)
- ld.add_action(declare_use_camera_cmd)
- ld.add_action(declare_use_gazebo_cmd)
- ld.add_action(declare_use_rviz_cmd)
- ld.add_action(declare_use_robot_state_pub_cmd)
- ld.add_action(declare_use_sim_time_cmd)
- ld.add_action(declare_world_cmd)
-
- # Add pose arguments
- ld.add_action(declare_x_cmd)
- ld.add_action(declare_y_cmd)
- ld.add_action(declare_z_cmd)
- ld.add_action(declare_roll_cmd)
- ld.add_action(declare_pitch_cmd)
- ld.add_action(declare_yaw_cmd)
-
- # Add the actions to the launch description
- ld.add_action(set_env_vars_resources)
- ld.add_action(set_env_vars_packages)
- ld.add_action(robot_state_publisher_cmd)
- # ld.add_action(load_controllers_cmd)
- ld.add_action(start_gazebo_cmd)
- ld.add_action(start_gazebo_ros_bridge_cmd)
- ld.add_action(start_gazebo_ros_image_bridge_cmd)
- ld.add_action(start_gazebo_ros_spawner_cmd)
-
- return ld
diff --git a/src/core_gazebo/package.xml b/src/core_gazebo/package.xml
deleted file mode 100644
index a1ed1d4..0000000
--- a/src/core_gazebo/package.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
- core_gazebo
- 0.0.0
- TODO: Package description
- David
- AGPL-3.0-only
-
- ament_cmake
-
- ament_lint_auto
- ament_lint_common
-
-
- ament_cmake
-
-
diff --git a/src/core_gazebo/worlds/empty.world b/src/core_gazebo/worlds/empty.world
deleted file mode 100644
index d7d8bcc..0000000
--- a/src/core_gazebo/worlds/empty.world
+++ /dev/null
@@ -1,89 +0,0 @@
-
-
-
-
-
-
-
-
- libgz-physics-bullet-featherstone-plugin.so
-
-
-
-
-
-
-
-
-
-
-
-
-
- ogre2
-
-
-
-
-
-
-
- 0.0 0.0 -9.8
-
-
-
-
- https://fuel.gazebosim.org/1.0/OpenRobotics/models/Sun
-
-
-
-
-
- true
-
-
-
-
- 0 0 1
-
-
-
-
-
- 0.0
-
-
-
-
-
-
-
- 0 0 1
- 100 100
-
-
-
- 0.8 0.8 0.8 1
- 0.8 0.8 0.8 1
- 0.8 0.8 0.8 1
-
-
-
-
-
-
-
- false
-
-
-
-
diff --git a/src/core_gazebo/worlds/pick_and_place_demo.world b/src/core_gazebo/worlds/pick_and_place_demo.world
deleted file mode 100644
index e8f33c1..0000000
--- a/src/core_gazebo/worlds/pick_and_place_demo.world
+++ /dev/null
@@ -1,83 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ogre2
-
-
-
- 0.0 0.0 -9.8
-
-
-
-
- https://fuel.gazebosim.org/1.0/OpenRobotics/models/Sun
-
-
-
-
-
-
- https://fuel.gazebosim.org/1.0/OpenRobotics/models/Ground Plane
-
-
-
-
-
-
-
-
-
-
-
-
- false
-
-
-
-
diff --git a/src/core_pkg/core_pkg/core_node.py b/src/core_pkg/core_pkg/core_node.py
index 870bf1c..42c692d 100644
--- a/src/core_pkg/core_pkg/core_node.py
+++ b/src/core_pkg/core_pkg/core_node.py
@@ -14,12 +14,12 @@ import sys
import threading
import glob
from scipy.spatial.transform import Rotation
-from math import copysign
+from math import copysign, pi
from std_msgs.msg import String, Header
-from sensor_msgs.msg import Imu, NavSatFix, NavSatStatus
+from sensor_msgs.msg import Imu, NavSatFix, NavSatStatus, JointState
from geometry_msgs.msg import TwistStamped, Twist
-from ros2_interfaces_pkg.msg import CoreControl, CoreFeedback
+from ros2_interfaces_pkg.msg import CoreControl, CoreFeedback, RevMotorState
from ros2_interfaces_pkg.msg import VicCAN, NewCoreFeedback, Barometer, CoreCtrlState
@@ -28,7 +28,7 @@ thread = None
CORE_WHEELBASE = 0.836 # meters
CORE_WHEEL_RADIUS = 0.171 # meters
-CORE_GEAR_RATIO = 100 # Clucky: 100:1, Testbed: 64:1
+CORE_GEAR_RATIO = 100.0 # Clucky: 100:1, Testbed: 64:1
control_qos = qos.QoSProfile(
history=qos.QoSHistoryPolicy.KEEP_LAST,
@@ -41,6 +41,20 @@ control_qos = qos.QoSProfile(
liveliness_lease_duration=Duration(seconds=5)
)
+# Used to verify the length of an incoming VicCAN feedback message
+# Key is VicCAN command_id, value is expected length of data list
+viccan_msg_len_dict = {
+ 48: 1,
+ 49: 1,
+ 50: 2,
+ 51: 4,
+ 52: 4,
+ 53: 4,
+ 54: 4,
+ 56: 4, # really 3, but viccan
+ 58: 4 # ditto
+}
+
class SerialRelay(Node):
def __init__(self):
@@ -67,7 +81,7 @@ class SerialRelay(Node):
# Control
# autonomy twist -- m/s and rad/s -- for autonomy, in particular Nav2
- self.cmd_vel_sub_ = self.create_subscription(TwistStamped, '/cmd_vel', self.cmd_vel_callback, qos_profile=control_qos)
+ self.cmd_vel_sub_ = self.create_subscription(TwistStamped, '/cmd_vel', self.cmd_vel_callback, 1)
# manual twist -- [-1, 1] rather than real units
self.twist_man_sub_ = self.create_subscription(Twist, '/core/twist', self.twist_man_callback, qos_profile=control_qos)
# manual flags -- brake mode and max duty cycle
@@ -77,26 +91,28 @@ class SerialRelay(Node):
# Feedback
# Consolidated and organized core feedback
- self.feedback_new_pub_ = self.create_publisher(NewCoreFeedback, '/core/feedback_new', 10)
+ self.feedback_new_pub_ = self.create_publisher(NewCoreFeedback, '/core/feedback_new', qos_profile=qos.qos_profile_sensor_data)
self.feedback_new_state = NewCoreFeedback()
self.feedback_new_state.fl_motor.id = 1
self.feedback_new_state.bl_motor.id = 2
self.feedback_new_state.fr_motor.id = 3
self.feedback_new_state.br_motor.id = 4
self.telemetry_pub_timer = self.create_timer(1.0, self.publish_feedback) # TODO: not sure about this
+ # Joint states for topic-based controller
+ self.joint_state_pub_ = self.create_publisher(JointState, '/core/joint_states', qos_profile=qos.qos_profile_sensor_data)
# IMU (embedded BNO-055)
- self.imu_pub_ = self.create_publisher(Imu, '/core/imu', 10)
+ self.imu_pub_ = self.create_publisher(Imu, '/core/imu', qos_profile=qos.qos_profile_sensor_data)
self.imu_state = Imu()
self.imu_state.header.frame_id = "core_bno055"
# GPS (embedded u-blox M9N)
- self.gps_pub_ = self.create_publisher(NavSatFix, '/gps/fix', 10)
+ self.gps_pub_ = self.create_publisher(NavSatFix, '/gps/fix', qos_profile=qos.qos_profile_sensor_data)
self.gps_state = NavSatFix()
self.gps_state.header.frame_id = "core_gps_antenna"
self.gps_state.status.service = NavSatStatus.SERVICE_GPS
self.gps_state.status.status = NavSatStatus.STATUS_NO_FIX
self.gps_state.position_covariance_type = NavSatFix.COVARIANCE_TYPE_UNKNOWN
# Barometer (embedded BMP-388)
- self.baro_pub_ = self.create_publisher(Barometer, '/core/baro', 10)
+ self.baro_pub_ = self.create_publisher(Barometer, '/core/baro', qos_profile=qos.qos_profile_sensor_data)
self.baro_state = Barometer()
self.baro_state.header.frame_id = "core_bmp388"
@@ -355,102 +371,117 @@ class SerialRelay(Node):
def relay_fromvic(self, msg: VicCAN):
# Assume that the message is coming from Core
# skill diff if not
-
- # TODO: add len(msg.data) checks to each feedback message
- # GNSS
- if msg.command_id == 48: # GNSS Latitude
- self.gps_state.latitude = float(msg.data[0])
- elif msg.command_id == 49: # GNSS Longitude
- self.gps_state.longitude = float(msg.data[0])
- elif msg.command_id == 50: # GNSS Satellite count and altitude
- self.gps_state.status.status = NavSatStatus.STATUS_FIX if int(msg.data[0]) >= 3 else NavSatStatus.STATUS_NO_FIX
- self.gps_state.altitude = float(msg.data[1])
- self.gps_state.header.stamp = msg.header.stamp
- self.gps_pub_.publish(self.gps_state)
- # IMU
- elif msg.command_id == 51: # Gyro x, y, z, and imu calibration
- self.feedback_new_state.imu_calib = round(float(msg.data[3]))
- self.imu_state.angular_velocity.x = float(msg.data[0])
- self.imu_state.angular_velocity.y = float(msg.data[1])
- self.imu_state.angular_velocity.z = float(msg.data[2])
- self.imu_state.header.stamp = msg.header.stamp
- elif msg.command_id == 52: # Accel x, y, z, heading
- self.imu_state.linear_acceleration.x = float(msg.data[0])
- self.imu_state.linear_acceleration.y = float(msg.data[1])
- self.imu_state.linear_acceleration.z = float(msg.data[2])
- # Deal with quaternion
- r = Rotation.from_euler('z', float(msg.data[3]), degrees=True)
- q = r.as_quat()
- self.imu_state.orientation.x = q[0]
- self.imu_state.orientation.y = q[1]
- self.imu_state.orientation.z = q[2]
- self.imu_state.orientation.w = q[3]
- self.imu_state.header.stamp = msg.header.stamp
- self.imu_pub_.publish(self.imu_state)
- # REV Motors
- elif msg.command_id == 53: # REV SPARK MAX feedback
- motorId = round(float(msg.data[0]))
- temp = float(msg.data[1]) / 10.0
- voltage = float(msg.data[2]) / 10.0
- current = float(msg.data[3]) / 10.0
- if motorId == 1:
- self.feedback_new_state.fl_motor.temperature = temp
- self.feedback_new_state.fl_motor.voltage = voltage
- self.feedback_new_state.fl_motor.current = current
- self.feedback_new_state.fl_motor.header.stamp = msg.header.stamp
- elif motorId == 2:
- self.feedback_new_state.bl_motor.temperature = temp
- self.feedback_new_state.bl_motor.voltage = voltage
- self.feedback_new_state.bl_motor.current = current
- self.feedback_new_state.bl_motor.header.stamp = msg.header.stamp
- elif motorId == 3:
- self.feedback_new_state.fr_motor.temperature = temp
- self.feedback_new_state.fr_motor.voltage = voltage
- self.feedback_new_state.fr_motor.current = current
- self.feedback_new_state.fr_motor.header.stamp = msg.header.stamp
- elif motorId == 4:
- self.feedback_new_state.br_motor.temperature = temp
- self.feedback_new_state.br_motor.voltage = voltage
- self.feedback_new_state.br_motor.current = current
- self.feedback_new_state.br_motor.header.stamp = msg.header.stamp
- self.feedback_new_pub_.publish(self.feedback_new_state)
- # Board voltage
- elif msg.command_id == 54: # Voltages batt, 12, 5, 3, all * 100
- self.feedback_new_state.board_voltage.vbatt = float(msg.data[0]) / 100.0
- self.feedback_new_state.board_voltage.v12 = float(msg.data[1]) / 100.0
- self.feedback_new_state.board_voltage.v5 = float(msg.data[2]) / 100.0
- self.feedback_new_state.board_voltage.v3 = float(msg.data[3]) / 100.0
- # Baro
- elif msg.command_id == 56: # BMP temperature, altitude, pressure
- self.baro_state.temperature = float(msg.data[0])
- self.baro_state.altitude = float(msg.data[1])
- self.baro_state.pressure = float(msg.data[2])
- self.baro_state.header.stamp = msg.header.stamp
- self.baro_pub_.publish(self.baro_state)
- # REV Motors (pos and vel)
- elif msg.command_id == 58: # REV position and velocity
- motorId = round(float(msg.data[0]))
- position = float(msg.data[1])
- velocity = float(msg.data[2])
- if motorId == 1:
- self.feedback_new_state.fl_motor.position = position
- self.feedback_new_state.fl_motor.velocity = velocity
- self.feedback_new_state.fl_motor.header.stamp = msg.header.stamp
- elif motorId == 2:
- self.feedback_new_state.bl_motor.position = position
- self.feedback_new_state.bl_motor.velocity = velocity
- self.feedback_new_state.bl_motor.header.stamp = msg.header.stamp
- elif motorId == 3:
- self.feedback_new_state.fr_motor.position = position
- self.feedback_new_state.fr_motor.velocity = velocity
- self.feedback_new_state.fr_motor.header.stamp = msg.header.stamp
- elif motorId == 4:
- self.feedback_new_state.br_motor.position = position
- self.feedback_new_state.br_motor.velocity = velocity
- self.feedback_new_state.br_motor.header.stamp = msg.header.stamp
- else:
- return
+ # Check message len to prevent crashing on bad data
+ if msg.command_id in viccan_msg_len_dict:
+ expected_len = viccan_msg_len_dict[msg.command_id]
+ if len(msg.data) != expected_len:
+ self.get_logger().warning(f"Ignoring VicCAN message with id {msg.command_id} due to unexpected data length (expected {expected_len}, got {len(msg.data)})")
+ return
+
+ match msg.command_id:
+ # GNSS
+ case 48: # GNSS Latitude
+ self.gps_state.latitude = float(msg.data[0])
+ case 49: # GNSS Longitude
+ self.gps_state.longitude = float(msg.data[0])
+ case 50: # GNSS Satellite count and altitude
+ self.gps_state.status.status = NavSatStatus.STATUS_FIX if int(msg.data[0]) >= 3 else NavSatStatus.STATUS_NO_FIX
+ self.gps_state.altitude = float(msg.data[1])
+ self.gps_state.header.stamp = msg.header.stamp
+ self.gps_pub_.publish(self.gps_state)
+ # IMU
+ case 51: # Gyro x, y, z, and imu calibration
+ self.feedback_new_state.imu_calib = round(float(msg.data[3]))
+ self.imu_state.angular_velocity.x = float(msg.data[0])
+ self.imu_state.angular_velocity.y = float(msg.data[1])
+ self.imu_state.angular_velocity.z = float(msg.data[2])
+ self.imu_state.header.stamp = msg.header.stamp
+ case 52: # Accel x, y, z, heading
+ self.imu_state.linear_acceleration.x = float(msg.data[0])
+ self.imu_state.linear_acceleration.y = float(msg.data[1])
+ self.imu_state.linear_acceleration.z = float(msg.data[2])
+ # Deal with quaternion
+ r = Rotation.from_euler('z', float(msg.data[3]), degrees=True)
+ q = r.as_quat()
+ self.imu_state.orientation.x = q[0]
+ self.imu_state.orientation.y = q[1]
+ self.imu_state.orientation.z = q[2]
+ self.imu_state.orientation.w = q[3]
+ self.imu_state.header.stamp = msg.header.stamp
+ self.imu_pub_.publish(self.imu_state)
+ # REV Motors
+ case 53: # REV SPARK MAX feedback
+ motorId = round(float(msg.data[0]))
+ temp = float(msg.data[1]) / 10.0
+ voltage = float(msg.data[2]) / 10.0
+ current = float(msg.data[3]) / 10.0
+ motor: RevMotorState | None = None
+ match motorId:
+ case 1:
+ motor = self.feedback_new_state.fl_motor
+ case 2:
+ motor = self.feedback_new_state.bl_motor
+ case 3:
+ motor = self.feedback_new_state.fr_motor
+ case 4:
+ motor = self.feedback_new_state.br_motor
+ case _:
+ self.get_logger().warning(f"Ignoring REV motor feedback 53 with invalid motorId {motorId}")
+ return
+
+ if motor:
+ motor.temperature = temp
+ motor.voltage = voltage
+ motor.current = current
+ motor.header.stamp = msg.header.stamp
+
+ self.feedback_new_pub_.publish(self.feedback_new_state)
+ # Board voltage
+ case 54: # Voltages batt, 12, 5, 3, all * 100
+ self.feedback_new_state.board_voltage.vbatt = float(msg.data[0]) / 100.0
+ self.feedback_new_state.board_voltage.v12 = float(msg.data[1]) / 100.0
+ self.feedback_new_state.board_voltage.v5 = float(msg.data[2]) / 100.0
+ self.feedback_new_state.board_voltage.v3 = float(msg.data[3]) / 100.0
+ # Baro
+ case 56: # BMP temperature, altitude, pressure
+ self.baro_state.temperature = float(msg.data[0])
+ self.baro_state.altitude = float(msg.data[1])
+ self.baro_state.pressure = float(msg.data[2])
+ self.baro_state.header.stamp = msg.header.stamp
+ self.baro_pub_.publish(self.baro_state)
+ # REV Motors (pos and vel)
+ case 58: # REV position and velocity
+ motorId = round(float(msg.data[0]))
+ position = float(msg.data[1])
+ velocity = float(msg.data[2])
+ joint_state_msg = JointState() # TODO: not sure if all motors should be in each message or not
+ joint_state_msg.position = [position * (2 * pi) / CORE_GEAR_RATIO] # revolutions to radians
+ joint_state_msg.velocity = [velocity * (2 * pi / 60.0) / CORE_GEAR_RATIO] # RPM to rad/s
+
+ motor: RevMotorState | None = None
+
+ match motorId:
+ case 1:
+ motor = self.feedback_new_state.fl_motor
+ joint_state_msg.name = ["fl_motor_joint"]
+ case 2:
+ motor = self.feedback_new_state.bl_motor
+ joint_state_msg.name = ["bl_motor_joint"]
+ case 3:
+ motor = self.feedback_new_state.fr_motor
+ joint_state_msg.name = ["fr_motor_joint"]
+ case 4:
+ motor = self.feedback_new_state.br_motor
+ joint_state_msg.name = ["br_motor_joint"]
+ case _:
+ self.get_logger().warning(f"Ignoring REV motor feedback 58 with invalid motorId {motorId}")
+ return
+
+ joint_state_msg.header.stamp = msg.header.stamp
+ self.joint_state_pub_.publish(joint_state_msg)
+ case _:
+ return
def publish_feedback(self):
diff --git a/src/core_pkg/package.xml b/src/core_pkg/package.xml
index f97b13e..667ee58 100644
--- a/src/core_pkg/package.xml
+++ b/src/core_pkg/package.xml
@@ -8,6 +8,9 @@
AGPL-3.0-only
rclpy
+ common_interfaces
+ python3-scipy
+ python-crccheck-pip
ros2_interfaces_pkg
ament_copyright
diff --git a/src/core_rover_description/config/joint_names_core_rover_description.yaml b/src/core_rover_description/config/joint_names_core_rover_description.yaml
deleted file mode 100644
index a23613a..0000000
--- a/src/core_rover_description/config/joint_names_core_rover_description.yaml
+++ /dev/null
@@ -1 +0,0 @@
-controller_joint_names: ['', 'right_suspension_joint', 'br_wheel_axis', 'fr_wheel_joint', 'averaging_bar_axis', 'left_suspension_joint', 'bl_wheel_joint', 'fl_wheel_joint', ]
diff --git a/src/core_rover_description/config/rviz_basic_settings.rviz b/src/core_rover_description/config/rviz_basic_settings.rviz
deleted file mode 100644
index 0ca5048..0000000
--- a/src/core_rover_description/config/rviz_basic_settings.rviz
+++ /dev/null
@@ -1,229 +0,0 @@
-Panels:
- - Class: rviz_common/Displays
- Help Height: 78
- Name: Displays
- Property Tree Widget:
- Expanded:
- - /Global Options1
- - /Status1
- - /RobotModel1
- - /TF1
- - /TF1/Frames1
- Splitter Ratio: 0.5
- Tree Height: 617
- - Class: rviz_common/Selection
- Name: Selection
- - Class: rviz_common/Tool Properties
- Expanded:
- - /2D Goal Pose1
- - /Publish Point1
- Name: Tool Properties
- Splitter Ratio: 0.5886790156364441
- - Class: rviz_common/Views
- Expanded:
- - /Current View1
- Name: Views
- Splitter Ratio: 0.5
-Visualization Manager:
- Class: ""
- Displays:
- - Alpha: 0.5
- Cell Size: 1
- Class: rviz_default_plugins/Grid
- Color: 160; 160; 164
- Enabled: true
- Line Style:
- Line Width: 0.029999999329447746
- Value: Lines
- Name: Grid
- Normal Cell Count: 0
- Offset:
- X: 0
- Y: 0
- Z: 0
- Plane: XY
- Plane Cell Count: 10
- Reference Frame:
- Value: true
- - Alpha: 1
- Class: rviz_default_plugins/RobotModel
- Collision Enabled: false
- Description File: ""
- Description Source: Topic
- Description Topic:
- Depth: 5
- Durability Policy: Volatile
- History Policy: Keep Last
- Reliability Policy: Reliable
- Value: /robot_description
- Enabled: true
- Links:
- All Links Enabled: true
- Expand Joint Details: false
- Expand Link Details: false
- Expand Tree: false
- Link Tree Style: Links in Alphabetic Order
- base_footprint:
- Alpha: 1
- Show Axes: false
- Show Trail: false
- base_link:
- Alpha: 1
- Show Axes: false
- Show Trail: false
- Value: true
- drivewhl_l_link:
- Alpha: 1
- Show Axes: false
- Show Trail: false
- Value: true
- drivewhl_r_link:
- Alpha: 1
- Show Axes: false
- Show Trail: false
- Value: true
- front_caster:
- Alpha: 1
- Show Axes: false
- Show Trail: false
- Value: true
- gps_link:
- Alpha: 1
- Show Axes: false
- Show Trail: false
- imu_link:
- Alpha: 1
- Show Axes: false
- Show Trail: false
- lidar_link:
- Alpha: 1
- Show Axes: false
- Show Trail: false
- Value: true
- Name: RobotModel
- TF Prefix: ""
- Update Interval: 0
- Value: true
- Visual Enabled: true
- - Class: rviz_default_plugins/TF
- Enabled: true
- Frame Timeout: 15
- Frames:
- All Enabled: false
- base_footprint:
- Value: false
- base_link:
- Value: false
- drivewhl_l_link:
- Value: true
- drivewhl_r_link:
- Value: true
- front_caster:
- Value: false
- gps_link:
- Value: false
- imu_link:
- Value: false
- lidar_link:
- Value: false
- Marker Scale: 1
- Name: TF
- Show Arrows: false
- Show Axes: true
- Show Names: true
- Tree:
- base_footprint:
- base_link:
- drivewhl_l_link:
- {}
- drivewhl_r_link:
- {}
- front_caster:
- {}
- gps_link:
- {}
- imu_link:
- {}
- lidar_link:
- {}
- Update Interval: 0
- Value: true
- Enabled: true
- Global Options:
- Background Color: 48; 48; 48
- Fixed Frame: base_link
- Frame Rate: 30
- Name: root
- Tools:
- - Class: rviz_default_plugins/Interact
- Hide Inactive Objects: true
- - Class: rviz_default_plugins/MoveCamera
- - Class: rviz_default_plugins/Select
- - Class: rviz_default_plugins/FocusCamera
- - Class: rviz_default_plugins/Measure
- Line color: 128; 128; 0
- - Class: rviz_default_plugins/SetInitialPose
- Topic:
- Depth: 5
- Durability Policy: Volatile
- History Policy: Keep Last
- Reliability Policy: Reliable
- Value: /initialpose
- - Class: rviz_default_plugins/SetGoal
- Topic:
- Depth: 5
- Durability Policy: Volatile
- History Policy: Keep Last
- Reliability Policy: Reliable
- Value: /goal_pose
- - Class: rviz_default_plugins/PublishPoint
- Single click: true
- Topic:
- Depth: 5
- Durability Policy: Volatile
- History Policy: Keep Last
- Reliability Policy: Reliable
- Value: /clicked_point
- Transformation:
- Current:
- Class: rviz_default_plugins/TF
- Value: true
- Views:
- Current:
- Class: rviz_default_plugins/Orbit
- Distance: 4.434264183044434
- Enable Stereo Rendering:
- Stereo Eye Separation: 0.05999999865889549
- Stereo Focal Distance: 1
- Swap Stereo Eyes: false
- Value: false
- Focal Point:
- X: 0.31193429231643677
- Y: 0.11948385089635849
- Z: -0.4807402193546295
- Focal Shape Fixed Size: true
- Focal Shape Size: 0.05000000074505806
- Invert Z Axis: false
- Name: Current View
- Near Clip Distance: 0.009999999776482582
- Pitch: 0.490397572517395
- Target Frame:
- Value: Orbit (rviz)
- Yaw: 1.0503965616226196
- Saved: ~
-Window Geometry:
- Displays:
- collapsed: false
- Height: 846
- Hide Left Dock: false
- Hide Right Dock: false
- QMainWindow State: 000000ff00000000fd000000040000000000000156000002f4fc0200000008fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003d000002f4000000c900fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261000000010000010f000002f4fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073010000003d000002f4000000a400fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000004420000003efc0100000002fb0000000800540069006d00650100000000000004420000000000000000fb0000000800540069006d006501000000000000045000000000000000000000023f000002f400000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
- Selection:
- collapsed: false
- Tool Properties:
- collapsed: false
- Views:
- collapsed: false
- Width: 1200
- X: 246
- Y: 77
diff --git a/src/core_rover_description/export.log b/src/core_rover_description/export.log
deleted file mode 100644
index 8dd27a9..0000000
--- a/src/core_rover_description/export.log
+++ /dev/null
@@ -1,4674 +0,0 @@
-2025-09-29 22:31:35,300 INFO Logger.cs: 70 -
---------------------------------------------------------------------------------
-2025-09-29 22:31:35,321 INFO Logger.cs: 71 - Logging commencing for SW2URDF exporter
-2025-09-29 22:31:35,321 INFO Logger.cs: 73 - Commit version
-2025-09-29 22:31:35,321 INFO Logger.cs: 74 - Build version 1.6.9403.28032
-2025-09-29 22:31:35,321 INFO SwAddin.cs: 192 - Attempting to connect to SW
-2025-09-29 22:31:35,321 INFO SwAddin.cs: 197 - Setting up callbacks
-2025-09-29 22:31:35,321 INFO SwAddin.cs: 201 - Setting up command manager
-2025-09-29 22:31:35,321 INFO SwAddin.cs: 204 - Adding command manager
-2025-09-29 22:31:35,321 INFO SwAddin.cs: 263 - Adding Assembly export to file menu
-2025-09-29 22:31:35,321 INFO SwAddin.cs: 272 - Adding Part export to file menu
-2025-09-29 22:31:35,321 INFO SwAddin.cs: 210 - Adding event handlers
-2025-09-29 22:31:35,431 INFO SwAddin.cs: 217 - Connecting plugin to SolidWorks
-2025-09-29 22:32:16,313 INFO SwAddin.cs: 294 - Assembly export called for file A - CORE ROVER WITH PBS [FULL ROVER ASSEMBLY] (1).SLDASM
-2025-09-29 22:32:18,856 INFO SwAddin.cs: 313 - Saving assembly
-2025-09-29 22:32:23,662 INFO SwAddin.cs: 316 - Opening property manager
-2025-09-29 22:32:23,678 INFO ExportHelperExtension.cs: 1125 - Retrieving features of type [CoordSys] from A - CORE ROVER WITH PBS [FULL ROVER ASSEMBLY] (1).SLDASM
-2025-09-29 22:32:23,694 INFO ExportHelperExtension.cs: 1136 - Found 115 in A - CORE ROVER WITH PBS [FULL ROVER ASSEMBLY] (1).SLDASM
-2025-09-29 22:32:23,694 INFO ExportHelperExtension.cs: 1145 - Found 0 features of type [CoordSys] in A - CORE ROVER WITH PBS [FULL ROVER ASSEMBLY] (1).SLDASM
-2025-09-29 22:32:23,694 INFO ExportHelperExtension.cs: 1148 - Proceeding through assembly components
-2025-09-29 22:32:23,710 INFO ExportHelperExtension.cs: 1160 - 17 components to check
-2025-09-29 22:32:23,710 INFO ExportHelperExtension.cs: 1125 - Retrieving features of type [CoordSys] from A - AVERAGING BAR ASSEMBLY [CORE ROVER WITH PBS] (1)-1
-2025-09-29 22:32:23,710 INFO ExportHelperExtension.cs: 1136 - Found 107 in A - AVERAGING BAR ASSEMBLY [CORE ROVER WITH PBS] (1)-1
-2025-09-29 22:32:23,710 INFO ExportHelperExtension.cs: 1145 - Found 0 features of type [CoordSys] in A - AVERAGING BAR ASSEMBLY [CORE ROVER WITH PBS] (1)-1
-2025-09-29 22:32:23,710 INFO ExportHelperExtension.cs: 1125 - Retrieving features of type [RefAxis] from A - CORE ROVER WITH PBS [FULL ROVER ASSEMBLY] (1).SLDASM
-2025-09-29 22:32:23,712 INFO ExportHelperExtension.cs: 1136 - Found 115 in A - CORE ROVER WITH PBS [FULL ROVER ASSEMBLY] (1).SLDASM
-2025-09-29 22:32:23,712 INFO ExportHelperExtension.cs: 1145 - Found 7 features of type [RefAxis] in A - CORE ROVER WITH PBS [FULL ROVER ASSEMBLY] (1).SLDASM
-2025-09-29 22:32:23,712 INFO ExportHelperExtension.cs: 1148 - Proceeding through assembly components
-2025-09-29 22:32:23,712 INFO ExportHelperExtension.cs: 1160 - 17 components to check
-2025-09-29 22:32:23,712 INFO ExportHelperExtension.cs: 1125 - Retrieving features of type [RefAxis] from A - AVERAGING BAR ASSEMBLY [CORE ROVER WITH PBS] (1)-1
-2025-09-29 22:32:23,712 INFO ExportHelperExtension.cs: 1136 - Found 107 in A - AVERAGING BAR ASSEMBLY [CORE ROVER WITH PBS] (1)-1
-2025-09-29 22:32:23,712 INFO ExportHelperExtension.cs: 1145 - Found 0 features of type [RefAxis] in A - AVERAGING BAR ASSEMBLY [CORE ROVER WITH PBS] (1)-1
-2025-09-29 22:32:24,103 INFO SwAddin.cs: 339 - Loading config tree
-2025-09-29 22:32:24,119 INFO ConfigurationSerialization.cs: 276 - URDF Configuration found
-nametruebase_linkxyztrue000rpytrue000originfalsefalsevaluetrue0massfalseixxtrue0ixytrue0ixztrue0iyytrue0iyztrue0izztrue0inertiafalseinertialfalsexyztrue000rpytrue000originfalsefalsefilenametruemeshfalsegeometrytruenametruergbatrue1111colorfalsefilenametruetexturefalsematerialfalsevisualfalsexyztrue000rpytrue000originfalsefalsefilenametruemeshfalsegeometrytruecollisionfalsenametruetypetruexyztrue000rpytrue000originfalsefalselinktrueparenttruelinktruechildtruexyztrue000axisfalselowerfalseupperfalseefforttruevelocitytruelimitfalserisingfalsefallingfalsecalibrationfalsedampingfalsefrictionfalsedynamicsfalsesoft_upper_limitfalsesoft_lower_limitfalsek_positionfalsek_velocitytruesafety_controllerfalsejointtruemultiplierfalseoffsetfalsemimicfalsejointfalseAutomatically Generatelinktruenametrueleft_suspension_memberxyztrue000rpytrue000originfalsefalsevaluetrue0massfalseixxtrue0ixytrue0ixztrue0iyytrue0iyztrue0izztrue0inertiafalseinertialfalsexyztrue000rpytrue000originfalsefalsefilenametruemeshfalsegeometrytruenametruergbatrue1111colorfalsefilenametruetexturefalsematerialfalsevisualfalsexyztrue000rpytrue000originfalsefalsefilenametruemeshfalsegeometrytruecollisionfalsenametrueleft_suspension_jointtypetruerevolutexyztrue000rpytrue000originfalsefalselinktrueparenttruelinktruechildtruexyztrue000axisfalselowerfalseupperfalseefforttruevelocitytruelimitfalserisingfalsefallingfalsecalibrationfalsedampingfalsefrictionfalsedynamicsfalsesoft_upper_limitfalsesoft_lower_limitfalsek_positionfalsek_velocitytruesafety_controllerfalsejointtruemultiplierfalseoffsetfalsemimicfalsejointfalseleft_suspension_axisAutomatically Generatelinktruenametruebl_wheelxyztrue000rpytrue000originfalsefalsevaluetrue0massfalseixxtrue0ixytrue0ixztrue0iyytrue0iyztrue0izztrue0inertiafalseinertialfalsexyztrue000rpytrue000originfalsefalsefilenametruemeshfalsegeometrytruenametruergbatrue1111colorfalsefilenametruetexturefalsematerialfalsevisualfalsexyztrue000rpytrue000originfalsefalsefilenametruemeshfalsegeometrytruecollisionfalsenametruebl_wheel_jointtypetruecontinuousxyztrue000rpytrue000originfalsefalselinktrueparenttruelinktruechildtruexyztrue000axisfalselowerfalseupperfalseefforttruevelocitytruelimitfalserisingfalsefallingfalsecalibrationfalsedampingfalsefrictionfalsedynamicsfalsesoft_upper_limitfalsesoft_lower_limitfalsek_positionfalsek_velocitytruesafety_controllerfalsejointtruemultiplierfalseoffsetfalsemimicfalsejointfalsebl_wheel_axisAutomatically GeneratelinktruefalseUEYAAAUAAAD//v+NRwBlAGEAcgBiAG8AeAAtAFcAaABlAGUAbAAgAEEAcwBzAGUAbQBiAGwAeQAgAC0AIABNAEkAUgBSAE8AUgAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8AVQBwAGQAYQB0AGUAZAAgAFcAaABlAGUAbAAgAFMAdABhAHIAYgBvAGEAcgBkAC0AMQBAAEcAZQBhAHIAYgBvAHgALQBXAGgAZQBlAGwAIABBAHMAcwBlAG0AYgBsAHkAIAAtACAATQBJAFIAUgBPAFIABAAAABAAAAABAAAAAgAAAEQAAABYAAAAfalsefalsenametruefl_wheelxyztrue000rpytrue000originfalsefalsevaluetrue0massfalseixxtrue0ixytrue0ixztrue0iyytrue0iyztrue0izztrue0inertiafalseinertialfalsexyztrue000rpytrue000originfalsefalsefilenametruemeshfalsegeometrytruenametruergbatrue1111colorfalsefilenametruetexturefalsematerialfalsevisualfalsexyztrue000rpytrue000originfalsefalsefilenametruemeshfalsegeometrytruecollisionfalsenametruefl_wheel_jointtypetruecontinuousxyztrue000rpytrue000originfalsefalselinktrueparenttruelinktruechildtruexyztrue000axisfalselowerfalseupperfalseefforttruevelocitytruelimitfalserisingfalsefallingfalsecalibrationfalsedampingfalsefrictionfalsedynamicsfalsesoft_upper_limitfalsesoft_lower_limitfalsek_positionfalsek_velocitytruesafety_controllerfalsejointtruemultiplierfalseoffsetfalsemimicfalsejointfalsefl_wheel_axisAutomatically GeneratelinktruefalseUEYAAAUAAAD//v+NRwBlAGEAcgBiAG8AeAAtAFcAaABlAGUAbAAgAEEAcwBzAGUAbQBiAGwAeQAgAC0AIABNAEkAUgBSAE8AUgAtADIAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8AVQBwAGQAYQB0AGUAZAAgAFcAaABlAGUAbAAgAFMAdABhAHIAYgBvAGEAcgBkAC0AMQBAAEcAZQBhAHIAYgBvAHgALQBXAGgAZQBlAGwAIABBAHMAcwBlAG0AYgBsAHkAIAAtACAATQBJAFIAUgBPAFIABAAAABAAAAABAAAAAgAAAEUAAABYAAAAfalsefalsefalseUEYAAAUAAAD//v+jQQAtACAAUABPAFMAVAAgAEIATwBOAEQAIABTAFUAUwBQAEUATgBTAEkATwBOACAAKAAxACkALQAzAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAFAALQAgAEwARQBHACAAQQBUAFQAQQBDAEgATQBFAE4AVAAgAEMARgAgAEMATwBWAEUAUgAgAFsAUABPAFMAVAAgAEIATwBOAEQAIABTAFUAUwBQAEUATgBTAEkATwBOAF0AIAAoADEAKQAtADEAQABBAC0AIABQAE8AUwBUACAAQgBPAE4ARAAgAFMAVQBTAFAARQBOAFMASQBPAE4AIAAoADEAKQAEAAAAEAAAAAEAAAACAAAAygAAAC4AAAA=UEYAAAUAAAD//v+WQQAtACAAUABPAFMAVAAgAEIATwBOAEQAIABTAFUAUwBQAEUATgBTAEkATwBOACAAKAAxACkALQAzAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAFAALQAgAEMARQBOAFQARQBSACAATABFAEcAIABbAFAATwBTAFQAIABCAE8ATgBEACAAUwBVAFMAUABFAE4AUwBJAE8ATgBdACAAKAAxACkALQAxAEAAQQAtACAAUABPAFMAVAAgAEIATwBOAEQAIABTAFUAUwBQAEUATgBTAEkATwBOACAAKAAxACkABAAAABAAAAABAAAAAgAAAMoAAAAYAAAAUEYAAAUAAAD//v+jQQAtACAAUABPAFMAVAAgAEIATwBOAEQAIABTAFUAUwBQAEUATgBTAEkATwBOACAAKAAxACkALQAzAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAFAALQAgAEwARQBHACAAQQBUAFQAQQBDAEgATQBFAE4AVAAgAEMARgAgAEMATwBWAEUAUgAgAFsAUABPAFMAVAAgAEIATwBOAEQAIABTAFUAUwBQAEUATgBTAEkATwBOAF0AIAAoADEAKQAtADIAQABBAC0AIABQAE8AUwBUACAAQgBPAE4ARAAgAFMAVQBTAFAARQBOAFMASQBPAE4AIAAoADEAKQAEAAAAEAAAAAEAAAACAAAAygAAADIAAAA=UEYAAAUAAAD//v+VQQAtACAAUABPAFMAVAAgAEIATwBOAEQAIABTAFUAUwBQAEUATgBTAEkATwBOACAAKAAxACkALQAzAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAFAALQAgAFMASQBEAEUAIABMAEUARwBTACAAWwBQAE8AUwBUACAAQgBPAE4ARAAgAFMAVQBTAFAARQBOAFMASQBPAE4AXQAgACgAMQApAC0AMQBAAEEALQAgAFAATwBTAFQAIABCAE8ATgBEACAAUwBVAFMAUABFAE4AUwBJAE8ATgAgACgAMQApAAQAAAAQAAAAAQAAAAIAAADKAAAAHQAAAA==UEYAAAUAAAD//v+VQQAtACAAUABPAFMAVAAgAEIATwBOAEQAIABTAFUAUwBQAEUATgBTAEkATwBOACAAKAAxACkALQAzAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAFAALQAgAFMASQBEAEUAIABMAEUARwBTACAAWwBQAE8AUwBUACAAQgBPAE4ARAAgAFMAVQBTAFAARQBOAFMASQBPAE4AXQAgACgAMQApAC0AMgBAAEEALQAgAFAATwBTAFQAIABCAE8ATgBEACAAUwBVAFMAUABFAE4AUwBJAE8ATgAgACgAMQApAAQAAAAQAAAAAQAAAAIAAADKAAAAKAAAAA==UEYAAAUAAAD//v+ERwBlAGEAcgBiAG8AeAAtAFcAaABlAGUAbAAgAEEAcwBzAGUAbQBiAGwAeQAgAC0AIABNAEkAUgBSAE8AUgAtADIAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8ARwBlAGEAcgBiAG8AeAAgAEMAYQBzAGkAbgBnAC0AMQBAAEcAZQBhAHIAYgBvAHgALQBXAGgAZQBlAGwAIABBAHMAcwBlAG0AYgBsAHkAIAAtACAATQBJAFIAUgBPAFIABAAAABAAAAABAAAAAgAAAEUAAAAYAAAAUEYAAAUAAAD//v//DQFHAGUAYQByAGIAbwB4AC0AVwBoAGUAZQBsACAAQQBzAHMAZQBtAGIAbAB5ACAALQAgAE0ASQBSAFIATwBSAC0AMgBAAEEAIAAtACAAQwBPAFIARQAgAFIATwBWAEUAUgAgAFcASQBUAEgAIABQAEIAUwAgAFsARgBVAEwATAAgAFIATwBWAEUAUgAgAEEAUwBTAEUATQBCAEwAWQBdACAAKAAxACkALwAzACAAUwB0AGEAZwBlACAASABEACAALQAgADUANwAgAFMAcABvAHIAdAAtADEAQABHAGUAYQByAGIAbwB4AC0AVwBoAGUAZQBsACAAQQBzAHMAZQBtAGIAbAB5ACAALQAgAE0ASQBSAFIATwBSAC8AMwAgAFMAdABhAGcAZQAgAEgARAAgAC0AIAA1ADcAIABTAHAAbwByAHQALgBTAFQARQBQAC0AMQBAADMAIABTAHQAYQBnAGUAIABIAEQAIAAtACAANQA3ACAAUwBwAG8AcgB0AC8AYQBtAC0AWABYAFgAWAAgAC0AIAA1ADcAIABTAHAAbwByAHQAIAAzACAAUwB0AGEAZwBlACAAUgBpAG4AZwAgAEcAZQBhAHIAIABIAG8AdQBzAGkAbgBnAC4AUwBUAEUAUAAtADEAQAAzACAAUwB0AGEAZwBlACAASABEACAALQAgADUANwAgAFMAcABvAHIAdAAuAFMAVABFAFAABAAAABAAAAABAAAABAAAAEUAAAAtAAAAGAAAABwAAAA=UEYAAAUAAAD//v///wBHAGUAYQByAGIAbwB4AC0AVwBoAGUAZQBsACAAQQBzAHMAZQBtAGIAbAB5ACAALQAgAE0ASQBSAFIATwBSAC0AMgBAAEEAIAAtACAAQwBPAFIARQAgAFIATwBWAEUAUgAgAFcASQBUAEgAIABQAEIAUwAgAFsARgBVAEwATAAgAFIATwBWAEUAUgAgAEEAUwBTAEUATQBCAEwAWQBdACAAKAAxACkALwAzACAAUwB0AGEAZwBlACAASABEACAALQAgADUANwAgAFMAcABvAHIAdAAtADEAQABHAGUAYQByAGIAbwB4AC0AVwBoAGUAZQBsACAAQQBzAHMAZQBtAGIAbAB5ACAALQAgAE0ASQBSAFIATwBSAC8AMwAgAFMAdABhAGcAZQAgAEgARAAgAC0AIAA1ADcAIABTAHAAbwByAHQALgBTAFQARQBQAC0AMQBAADMAIABTAHQAYQBnAGUAIABIAEQAIAAtACAANQA3ACAAUwBwAG8AcgB0AC8AYQBtAC0AMwA3ADYANQAgAC0AIAA1ADcAIABTAHAAbwByAHQAIABNAG8AdABvAHIAIABCAGwAbwBjAGsALgBTAFQARQBQAC0AMQBAADMAIABTAHQAYQBnAGUAIABIAEQAIAAtACAANQA3ACAAUwBwAG8AcgB0AC4AUwBUAEUAUAAEAAAAEAAAAAEAAAAEAAAARQAAAC0AAAAYAAAAHgAAAA==UEYAAAUAAAD//v+ERwBlAGEAcgBiAG8AeAAtAFcAaABlAGUAbAAgAEEAcwBzAGUAbQBiAGwAeQAgAC0AIABNAEkAUgBSAE8AUgAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8ARwBlAGEAcgBiAG8AeAAgAEMAYQBzAGkAbgBnAC0AMQBAAEcAZQBhAHIAYgBvAHgALQBXAGgAZQBlAGwAIABBAHMAcwBlAG0AYgBsAHkAIAAtACAATQBJAFIAUgBPAFIABAAAABAAAAABAAAAAgAAAEQAAAAYAAAAUEYAAAUAAAD//v//DQFHAGUAYQByAGIAbwB4AC0AVwBoAGUAZQBsACAAQQBzAHMAZQBtAGIAbAB5ACAALQAgAE0ASQBSAFIATwBSAC0AMQBAAEEAIAAtACAAQwBPAFIARQAgAFIATwBWAEUAUgAgAFcASQBUAEgAIABQAEIAUwAgAFsARgBVAEwATAAgAFIATwBWAEUAUgAgAEEAUwBTAEUATQBCAEwAWQBdACAAKAAxACkALwAzACAAUwB0AGEAZwBlACAASABEACAALQAgADUANwAgAFMAcABvAHIAdAAtADEAQABHAGUAYQByAGIAbwB4AC0AVwBoAGUAZQBsACAAQQBzAHMAZQBtAGIAbAB5ACAALQAgAE0ASQBSAFIATwBSAC8AMwAgAFMAdABhAGcAZQAgAEgARAAgAC0AIAA1ADcAIABTAHAAbwByAHQALgBTAFQARQBQAC0AMQBAADMAIABTAHQAYQBnAGUAIABIAEQAIAAtACAANQA3ACAAUwBwAG8AcgB0AC8AYQBtAC0AWABYAFgAWAAgAC0AIAA1ADcAIABTAHAAbwByAHQAIAAzACAAUwB0AGEAZwBlACAAUgBpAG4AZwAgAEcAZQBhAHIAIABIAG8AdQBzAGkAbgBnAC4AUwBUAEUAUAAtADEAQAAzACAAUwB0AGEAZwBlACAASABEACAALQAgADUANwAgAFMAcABvAHIAdAAuAFMAVABFAFAABAAAABAAAAABAAAABAAAAEQAAAAtAAAAGAAAABwAAAA=UEYAAAUAAAD//v///wBHAGUAYQByAGIAbwB4AC0AVwBoAGUAZQBsACAAQQBzAHMAZQBtAGIAbAB5ACAALQAgAE0ASQBSAFIATwBSAC0AMQBAAEEAIAAtACAAQwBPAFIARQAgAFIATwBWAEUAUgAgAFcASQBUAEgAIABQAEIAUwAgAFsARgBVAEwATAAgAFIATwBWAEUAUgAgAEEAUwBTAEUATQBCAEwAWQBdACAAKAAxACkALwAzACAAUwB0AGEAZwBlACAASABEACAALQAgADUANwAgAFMAcABvAHIAdAAtADEAQABHAGUAYQByAGIAbwB4AC0AVwBoAGUAZQBsACAAQQBzAHMAZQBtAGIAbAB5ACAALQAgAE0ASQBSAFIATwBSAC8AMwAgAFMAdABhAGcAZQAgAEgARAAgAC0AIAA1ADcAIABTAHAAbwByAHQALgBTAFQARQBQAC0AMQBAADMAIABTAHQAYQBnAGUAIABIAEQAIAAtACAANQA3ACAAUwBwAG8AcgB0AC8AYQBtAC0AMwA3ADYANQAgAC0AIAA1ADcAIABTAHAAbwByAHQAIABNAG8AdABvAHIAIABCAGwAbwBjAGsALgBTAFQARQBQAC0AMQBAADMAIABTAHQAYQBnAGUAIABIAEQAIAAtACAANQA3ACAAUwBwAG8AcgB0AC4AUwBUAEUAUAAEAAAAEAAAAAEAAAAEAAAARAAAAC0AAAAYAAAAHgAAAA==UEYAAAUAAAD//v+GRwBlAGEAcgBiAG8AeAAtAFcAaABlAGUAbAAgAEEAcwBzAGUAbQBiAGwAeQAgAC0AIABNAEkAUgBSAE8AUgAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8AUgBFAFYALQAyADEALQAxADYANQAxAC4AcwB0AGUAcAAtADEAQABHAGUAYQByAGIAbwB4AC0AVwBoAGUAZQBsACAAQQBzAHMAZQBtAGIAbAB5ACAALQAgAE0ASQBSAFIATwBSAAQAAAAQAAAAAQAAAAIAAABEAAAAMgAAAA==UEYAAAUAAAD//v+CRwBlAGEAcgBiAG8AeAAtAFcAaABlAGUAbAAgAEEAcwBzAGUAbQBiAGwAeQAgAC0AIABNAEkAUgBSAE8AUgAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8AQgBvAG4AZABpAG4AZwAgAFQAdQBiAGUALQAxAEAARwBlAGEAcgBiAG8AeAAtAFcAaABlAGUAbAAgAEEAcwBzAGUAbQBiAGwAeQAgAC0AIABNAEkAUgBSAE8AUgAEAAAAEAAAAAEAAAACAAAARAAAABkAAAA=UEYAAAUAAAD//v+GRwBlAGEAcgBiAG8AeAAtAFcAaABlAGUAbAAgAEEAcwBzAGUAbQBiAGwAeQAgAC0AIABNAEkAUgBSAE8AUgAtADIAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8AUgBFAFYALQAyADEALQAxADYANQAxAC4AcwB0AGUAcAAtADEAQABHAGUAYQByAGIAbwB4AC0AVwBoAGUAZQBsACAAQQBzAHMAZQBtAGIAbAB5ACAALQAgAE0ASQBSAFIATwBSAAQAAAAQAAAAAQAAAAIAAABFAAAAMgAAAA==UEYAAAUAAAD//v+CRwBlAGEAcgBiAG8AeAAtAFcAaABlAGUAbAAgAEEAcwBzAGUAbQBiAGwAeQAgAC0AIABNAEkAUgBSAE8AUgAtADIAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8AQgBvAG4AZABpAG4AZwAgAFQAdQBiAGUALQAxAEAARwBlAGEAcgBiAG8AeAAtAFcAaABlAGUAbAAgAEEAcwBzAGUAbQBiAGwAeQAgAC0AIABNAEkAUgBSAE8AUgAEAAAAEAAAAAEAAAACAAAARQAAABkAAAA=UEYAAAUAAAD//v+bQQAtACAAUABPAFMAVAAgAEIATwBOAEQAIABTAFUAUwBQAEUATgBTAEkATwBOACAAKAAxACkALQAzAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAFAALQAgAEMATwBSAEUAIABBAFQAVABBAEMASABNAEUATgBUACAAWwBQAE8AUwBUACAAQgBPAE4ARAAgAFMAVQBTAFAARQBOAFMASQBPAE4AXQAgACgAMQApAC0AMQBAAEEALQAgAFAATwBTAFQAIABCAE8ATgBEACAAUwBVAFMAUABFAE4AUwBJAE8ATgAgACgAMQApAAQAAAAQAAAAAQAAAAIAAADKAAAAKQAAAA==UEYAAAUAAAD//v96UwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ALQAxAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAEEAdgBlAHIAYQBnAGkAbgBnACAAUwBoAGEAZgB0ACAAVgAzAC0AMgBAAFMAaABlAGwAbAAgACYAIABBAHYAZQByAGEAZwBpAG4AZwAgAFMAeQBzAHQAZQBtAAQAAAAQAAAAAQAAAAIAAAAYAAAAagAAAA==UEYAAAUAAAD//v+WQQAtACAAUABPAFMAVAAgAEIATwBOAEQAIABTAFUAUwBQAEUATgBTAEkATwBOACAAKAAxACkALQAzAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAFAALQAgAEEAWABJAFMAIABQAEwAQQBUAEUAIABbAFAATwBTAFQAIABCAE8ATgBEACAAUwBVAFMAUABFAE4AUwBJAE8ATgBdACAAKAAxACkALQAxAEAAQQAtACAAUABPAFMAVAAgAEIATwBOAEQAIABTAFUAUwBQAEUATgBTAEkATwBOACAAKAAxACkABAAAABAAAAABAAAAAgAAAMoAAAAzAAAAUEYAAAUAAAD//v/GQQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8ANgAwADQANQBOADEAMgAyAF8ATABvAHcALQBDAGEAcgBiAG8AbgAgAFMAdABlAGUAbAAgAFIAbwB1AG4AZAAgAFQAdQBiAGUAIAAyAC0AMgBAAEEAIAAtACAAQQBWAEUAUgBBAEcASQBOAEcAIABCAEEAUgAgAEEAUwBTAEUATQBCAEwAWQAgAFsAQwBPAFIARQAgAFIATwBWAEUAUgAgAFcASQBUAEgAIABQAEIAUwBdACAAKAAxACkABAAAABAAAAABAAAAAgAAALAAAADQAQAAUEYAAAUAAAD//v/TQQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8AOQA2ADEANAA0AEEAMgAzADkAXwBGAGkAbgBlAC0AVABoAHIAZQBhAGQAIABBAGwAbABvAHkAIABTAHQAZQBlAGwAIABTAG8AYwBrAGUAdAAgAEgAZQBhAGQAIABTAGMAcgBlAHcALQAyAEAAQQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAEAAAAEAAAAAEAAAACAAAAsAAAAM8BAAA=UEYAAAUAAAD//v/SQQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8AOQA0ADYANAA1AEEAMQAxADEAXwBIAGkAZwBoAC0AUwB0AHIAZQBuAGcAdABoACAAUwB0AGUAZQBsACAATgB5AGwAbwBuAC0ASQBuAHMAZQByAHQAIABMAG8AYwBrAG4AdQB0AC0AMgBAAEEAIAAtACAAQQBWAEUAUgBBAEcASQBOAEcAIABCAEEAUgAgAEEAUwBTAEUATQBCAEwAWQAgAFsAQwBPAFIARQAgAFIATwBWAEUAUgAgAFcASQBUAEgAIABQAEIAUwBdACAAKAAxACkABAAAABAAAAABAAAAAgAAALAAAADRAQAAfalsefalsenametrueright_suspension_memberxyztrue000rpytrue000originfalsefalsevaluetrue0massfalseixxtrue0ixytrue0ixztrue0iyytrue0iyztrue0izztrue0inertiafalseinertialfalsexyztrue000rpytrue000originfalsefalsefilenametruemeshfalsegeometrytruenametruergbatrue1111colorfalsefilenametruetexturefalsematerialfalsevisualfalsexyztrue000rpytrue000originfalsefalsefilenametruemeshfalsegeometrytruecollisionfalsenametrueright_suspension_jointtypetruerevolutexyztrue000rpytrue000originfalsefalselinktrueparenttruelinktruechildtruexyztrue000axisfalselowerfalseupperfalseefforttruevelocitytruelimitfalserisingfalsefallingfalsecalibrationfalsedampingfalsefrictionfalsedynamicsfalsesoft_upper_limitfalsesoft_lower_limitfalsek_positionfalsek_velocitytruesafety_controllerfalsejointtruemultiplierfalseoffsetfalsemimicfalsejointfalseright_suspension_axisAutomatically Generatelinktruenametruebr_wheelxyztrue000rpytrue000originfalsefalsevaluetrue0massfalseixxtrue0ixytrue0ixztrue0iyytrue0iyztrue0izztrue0inertiafalseinertialfalsexyztrue000rpytrue000originfalsefalsefilenametruemeshfalsegeometrytruenametruergbatrue1111colorfalsefilenametruetexturefalsematerialfalsevisualfalsexyztrue000rpytrue000originfalsefalsefilenametruemeshfalsegeometrytruecollisionfalsenametruebr_wheel_axistypetruecontinuousxyztrue000rpytrue000originfalsefalselinktrueparenttruelinktruechildtruexyztrue000axisfalselowerfalseupperfalseefforttruevelocitytruelimitfalserisingfalsefallingfalsecalibrationfalsedampingfalsefrictionfalsedynamicsfalsesoft_upper_limitfalsesoft_lower_limitfalsek_positionfalsek_velocitytruesafety_controllerfalsejointtruemultiplierfalseoffsetfalsemimicfalsejointfalsebr_wheel_axisAutomatically GeneratelinktruefalseUEYAAAUAAAD//v+NRwBlAGEAcgBiAG8AeAAtAFcAaABlAGUAbAAgAEEAcwBzAGUAbQBiAGwAeQAgAC0AIABNAEkAUgBSAE8AUgAtADcAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8AVQBwAGQAYQB0AGUAZAAgAFcAaABlAGUAbAAgAFMAdABhAHIAYgBvAGEAcgBkAC0AMQBAAEcAZQBhAHIAYgBvAHgALQBXAGgAZQBlAGwAIABBAHMAcwBlAG0AYgBsAHkAIAAtACAATQBJAFIAUgBPAFIABAAAABAAAAABAAAAAgAAAO8AAABYAAAAfalsefalsenametruefr_wheelxyztrue000rpytrue000originfalsefalsevaluetrue0massfalseixxtrue0ixytrue0ixztrue0iyytrue0iyztrue0izztrue0inertiafalseinertialfalsexyztrue000rpytrue000originfalsefalsefilenametruemeshfalsegeometrytruenametruergbatrue1111colorfalsefilenametruetexturefalsematerialfalsevisualfalsexyztrue000rpytrue000originfalsefalsefilenametruemeshfalsegeometrytruecollisionfalsenametruefr_wheel_jointtypetruecontinuousxyztrue000rpytrue000originfalsefalselinktrueparenttruelinktruechildtruexyztrue000axisfalselowerfalseupperfalseefforttruevelocitytruelimitfalserisingfalsefallingfalsecalibrationfalsedampingfalsefrictionfalsedynamicsfalsesoft_upper_limitfalsesoft_lower_limitfalsek_positionfalsek_velocitytruesafety_controllerfalsejointtruemultiplierfalseoffsetfalsemimicfalsejointfalsefr_wheel_axisAutomatically GeneratelinktruefalseUEYAAAUAAAD//v+NRwBlAGEAcgBiAG8AeAAtAFcAaABlAGUAbAAgAEEAcwBzAGUAbQBiAGwAeQAgAC0AIABNAEkAUgBSAE8AUgAtADYAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8AVQBwAGQAYQB0AGUAZAAgAFcAaABlAGUAbAAgAFMAdABhAHIAYgBvAGEAcgBkAC0AMQBAAEcAZQBhAHIAYgBvAHgALQBXAGgAZQBlAGwAIABBAHMAcwBlAG0AYgBsAHkAIAAtACAATQBJAFIAUgBPAFIABAAAABAAAAABAAAAAgAAAOYAAABYAAAAfalsefalsefalseUEYAAAUAAAD//v+WQQAtACAAUABPAFMAVAAgAEIATwBOAEQAIABTAFUAUwBQAEUATgBTAEkATwBOACAAKAAxACkALQA0AEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAFAALQAgAEMARQBOAFQARQBSACAATABFAEcAIABbAFAATwBTAFQAIABCAE8ATgBEACAAUwBVAFMAUABFAE4AUwBJAE8ATgBdACAAKAAxACkALQAxAEAAQQAtACAAUABPAFMAVAAgAEIATwBOAEQAIABTAFUAUwBQAEUATgBTAEkATwBOACAAKAAxACkABAAAABAAAAABAAAAAgAAAN8AAAAYAAAAUEYAAAUAAAD//v+jQQAtACAAUABPAFMAVAAgAEIATwBOAEQAIABTAFUAUwBQAEUATgBTAEkATwBOACAAKAAxACkALQA0AEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAFAALQAgAEwARQBHACAAQQBUAFQAQQBDAEgATQBFAE4AVAAgAEMARgAgAEMATwBWAEUAUgAgAFsAUABPAFMAVAAgAEIATwBOAEQAIABTAFUAUwBQAEUATgBTAEkATwBOAF0AIAAoADEAKQAtADEAQABBAC0AIABQAE8AUwBUACAAQgBPAE4ARAAgAFMAVQBTAFAARQBOAFMASQBPAE4AIAAoADEAKQAEAAAAEAAAAAEAAAACAAAA3wAAAC4AAAA=UEYAAAUAAAD//v+bQQAtACAAUABPAFMAVAAgAEIATwBOAEQAIABTAFUAUwBQAEUATgBTAEkATwBOACAAKAAxACkALQA0AEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAFAALQAgAEMATwBSAEUAIABBAFQAVABBAEMASABNAEUATgBUACAAWwBQAE8AUwBUACAAQgBPAE4ARAAgAFMAVQBTAFAARQBOAFMASQBPAE4AXQAgACgAMQApAC0AMQBAAEEALQAgAFAATwBTAFQAIABCAE8ATgBEACAAUwBVAFMAUABFAE4AUwBJAE8ATgAgACgAMQApAAQAAAAQAAAAAQAAAAIAAADfAAAAKQAAAA==UEYAAAUAAAD//v+WQQAtACAAUABPAFMAVAAgAEIATwBOAEQAIABTAFUAUwBQAEUATgBTAEkATwBOACAAKAAxACkALQA0AEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAFAALQAgAEEAWABJAFMAIABQAEwAQQBUAEUAIABbAFAATwBTAFQAIABCAE8ATgBEACAAUwBVAFMAUABFAE4AUwBJAE8ATgBdACAAKAAxACkALQAxAEAAQQAtACAAUABPAFMAVAAgAEIATwBOAEQAIABTAFUAUwBQAEUATgBTAEkATwBOACAAKAAxACkABAAAABAAAAABAAAAAgAAAN8AAAAzAAAAUEYAAAUAAAD//v+jQQAtACAAUABPAFMAVAAgAEIATwBOAEQAIABTAFUAUwBQAEUATgBTAEkATwBOACAAKAAxACkALQA0AEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAFAALQAgAEwARQBHACAAQQBUAFQAQQBDAEgATQBFAE4AVAAgAEMARgAgAEMATwBWAEUAUgAgAFsAUABPAFMAVAAgAEIATwBOAEQAIABTAFUAUwBQAEUATgBTAEkATwBOAF0AIAAoADEAKQAtADIAQABBAC0AIABQAE8AUwBUACAAQgBPAE4ARAAgAFMAVQBTAFAARQBOAFMASQBPAE4AIAAoADEAKQAEAAAAEAAAAAEAAAACAAAA3wAAADIAAAA=UEYAAAUAAAD//v+VQQAtACAAUABPAFMAVAAgAEIATwBOAEQAIABTAFUAUwBQAEUATgBTAEkATwBOACAAKAAxACkALQA0AEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAFAALQAgAFMASQBEAEUAIABMAEUARwBTACAAWwBQAE8AUwBUACAAQgBPAE4ARAAgAFMAVQBTAFAARQBOAFMASQBPAE4AXQAgACgAMQApAC0AMgBAAEEALQAgAFAATwBTAFQAIABCAE8ATgBEACAAUwBVAFMAUABFAE4AUwBJAE8ATgAgACgAMQApAAQAAAAQAAAAAQAAAAIAAADfAAAAKAAAAA==UEYAAAUAAAD//v+ERwBlAGEAcgBiAG8AeAAtAFcAaABlAGUAbAAgAEEAcwBzAGUAbQBiAGwAeQAgAC0AIABNAEkAUgBSAE8AUgAtADYAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8ARwBlAGEAcgBiAG8AeAAgAEMAYQBzAGkAbgBnAC0AMQBAAEcAZQBhAHIAYgBvAHgALQBXAGgAZQBlAGwAIABBAHMAcwBlAG0AYgBsAHkAIAAtACAATQBJAFIAUgBPAFIABAAAABAAAAABAAAAAgAAAOYAAAAYAAAAUEYAAAUAAAD//v+GRwBlAGEAcgBiAG8AeAAtAFcAaABlAGUAbAAgAEEAcwBzAGUAbQBiAGwAeQAgAC0AIABNAEkAUgBSAE8AUgAtADYAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8AUgBFAFYALQAyADEALQAxADYANQAxAC4AcwB0AGUAcAAtADEAQABHAGUAYQByAGIAbwB4AC0AVwBoAGUAZQBsACAAQQBzAHMAZQBtAGIAbAB5ACAALQAgAE0ASQBSAFIATwBSAAQAAAAQAAAAAQAAAAIAAADmAAAAMgAAAA==UEYAAAUAAAD//v+CRwBlAGEAcgBiAG8AeAAtAFcAaABlAGUAbAAgAEEAcwBzAGUAbQBiAGwAeQAgAC0AIABNAEkAUgBSAE8AUgAtADYAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8AQgBvAG4AZABpAG4AZwAgAFQAdQBiAGUALQAxAEAARwBlAGEAcgBiAG8AeAAtAFcAaABlAGUAbAAgAEEAcwBzAGUAbQBiAGwAeQAgAC0AIABNAEkAUgBSAE8AUgAEAAAAEAAAAAEAAAACAAAA5gAAABkAAAA=UEYAAAUAAAD//v//DQFHAGUAYQByAGIAbwB4AC0AVwBoAGUAZQBsACAAQQBzAHMAZQBtAGIAbAB5ACAALQAgAE0ASQBSAFIATwBSAC0ANgBAAEEAIAAtACAAQwBPAFIARQAgAFIATwBWAEUAUgAgAFcASQBUAEgAIABQAEIAUwAgAFsARgBVAEwATAAgAFIATwBWAEUAUgAgAEEAUwBTAEUATQBCAEwAWQBdACAAKAAxACkALwAzACAAUwB0AGEAZwBlACAASABEACAALQAgADUANwAgAFMAcABvAHIAdAAtADEAQABHAGUAYQByAGIAbwB4AC0AVwBoAGUAZQBsACAAQQBzAHMAZQBtAGIAbAB5ACAALQAgAE0ASQBSAFIATwBSAC8AMwAgAFMAdABhAGcAZQAgAEgARAAgAC0AIAA1ADcAIABTAHAAbwByAHQALgBTAFQARQBQAC0AMQBAADMAIABTAHQAYQBnAGUAIABIAEQAIAAtACAANQA3ACAAUwBwAG8AcgB0AC8AYQBtAC0AWABYAFgAWAAgAC0AIAA1ADcAIABTAHAAbwByAHQAIAAzACAAUwB0AGEAZwBlACAAUgBpAG4AZwAgAEcAZQBhAHIAIABIAG8AdQBzAGkAbgBnAC4AUwBUAEUAUAAtADEAQAAzACAAUwB0AGEAZwBlACAASABEACAALQAgADUANwAgAFMAcABvAHIAdAAuAFMAVABFAFAABAAAABAAAAABAAAABAAAAOYAAAAtAAAAGAAAABwAAAA=UEYAAAUAAAD//v///wBHAGUAYQByAGIAbwB4AC0AVwBoAGUAZQBsACAAQQBzAHMAZQBtAGIAbAB5ACAALQAgAE0ASQBSAFIATwBSAC0ANgBAAEEAIAAtACAAQwBPAFIARQAgAFIATwBWAEUAUgAgAFcASQBUAEgAIABQAEIAUwAgAFsARgBVAEwATAAgAFIATwBWAEUAUgAgAEEAUwBTAEUATQBCAEwAWQBdACAAKAAxACkALwAzACAAUwB0AGEAZwBlACAASABEACAALQAgADUANwAgAFMAcABvAHIAdAAtADEAQABHAGUAYQByAGIAbwB4AC0AVwBoAGUAZQBsACAAQQBzAHMAZQBtAGIAbAB5ACAALQAgAE0ASQBSAFIATwBSAC8AMwAgAFMAdABhAGcAZQAgAEgARAAgAC0AIAA1ADcAIABTAHAAbwByAHQALgBTAFQARQBQAC0AMQBAADMAIABTAHQAYQBnAGUAIABIAEQAIAAtACAANQA3ACAAUwBwAG8AcgB0AC8AYQBtAC0AMwA3ADYANQAgAC0AIAA1ADcAIABTAHAAbwByAHQAIABNAG8AdABvAHIAIABCAGwAbwBjAGsALgBTAFQARQBQAC0AMQBAADMAIABTAHQAYQBnAGUAIABIAEQAIAAtACAANQA3ACAAUwBwAG8AcgB0AC4AUwBUAEUAUAAEAAAAEAAAAAEAAAAEAAAA5gAAAC0AAAAYAAAAHgAAAA==UEYAAAUAAAD//v+ERwBlAGEAcgBiAG8AeAAtAFcAaABlAGUAbAAgAEEAcwBzAGUAbQBiAGwAeQAgAC0AIABNAEkAUgBSAE8AUgAtADcAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8ARwBlAGEAcgBiAG8AeAAgAEMAYQBzAGkAbgBnAC0AMQBAAEcAZQBhAHIAYgBvAHgALQBXAGgAZQBlAGwAIABBAHMAcwBlAG0AYgBsAHkAIAAtACAATQBJAFIAUgBPAFIABAAAABAAAAABAAAAAgAAAO8AAAAYAAAAUEYAAAUAAAD//v+VQQAtACAAUABPAFMAVAAgAEIATwBOAEQAIABTAFUAUwBQAEUATgBTAEkATwBOACAAKAAxACkALQA0AEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAFAALQAgAFMASQBEAEUAIABMAEUARwBTACAAWwBQAE8AUwBUACAAQgBPAE4ARAAgAFMAVQBTAFAARQBOAFMASQBPAE4AXQAgACgAMQApAC0AMQBAAEEALQAgAFAATwBTAFQAIABCAE8ATgBEACAAUwBVAFMAUABFAE4AUwBJAE8ATgAgACgAMQApAAQAAAAQAAAAAQAAAAIAAADfAAAAHQAAAA==UEYAAAUAAAD//v+GRwBlAGEAcgBiAG8AeAAtAFcAaABlAGUAbAAgAEEAcwBzAGUAbQBiAGwAeQAgAC0AIABNAEkAUgBSAE8AUgAtADcAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8AUgBFAFYALQAyADEALQAxADYANQAxAC4AcwB0AGUAcAAtADEAQABHAGUAYQByAGIAbwB4AC0AVwBoAGUAZQBsACAAQQBzAHMAZQBtAGIAbAB5ACAALQAgAE0ASQBSAFIATwBSAAQAAAAQAAAAAQAAAAIAAADvAAAAMgAAAA==UEYAAAUAAAD//v///wBHAGUAYQByAGIAbwB4AC0AVwBoAGUAZQBsACAAQQBzAHMAZQBtAGIAbAB5ACAALQAgAE0ASQBSAFIATwBSAC0ANwBAAEEAIAAtACAAQwBPAFIARQAgAFIATwBWAEUAUgAgAFcASQBUAEgAIABQAEIAUwAgAFsARgBVAEwATAAgAFIATwBWAEUAUgAgAEEAUwBTAEUATQBCAEwAWQBdACAAKAAxACkALwAzACAAUwB0AGEAZwBlACAASABEACAALQAgADUANwAgAFMAcABvAHIAdAAtADEAQABHAGUAYQByAGIAbwB4AC0AVwBoAGUAZQBsACAAQQBzAHMAZQBtAGIAbAB5ACAALQAgAE0ASQBSAFIATwBSAC8AMwAgAFMAdABhAGcAZQAgAEgARAAgAC0AIAA1ADcAIABTAHAAbwByAHQALgBTAFQARQBQAC0AMQBAADMAIABTAHQAYQBnAGUAIABIAEQAIAAtACAANQA3ACAAUwBwAG8AcgB0AC8AYQBtAC0AMwA3ADYANQAgAC0AIAA1ADcAIABTAHAAbwByAHQAIABNAG8AdABvAHIAIABCAGwAbwBjAGsALgBTAFQARQBQAC0AMQBAADMAIABTAHQAYQBnAGUAIABIAEQAIAAtACAANQA3ACAAUwBwAG8AcgB0AC4AUwBUAEUAUAAEAAAAEAAAAAEAAAAEAAAA7wAAAC0AAAAYAAAAHgAAAA==UEYAAAUAAAD//v//DQFHAGUAYQByAGIAbwB4AC0AVwBoAGUAZQBsACAAQQBzAHMAZQBtAGIAbAB5ACAALQAgAE0ASQBSAFIATwBSAC0ANwBAAEEAIAAtACAAQwBPAFIARQAgAFIATwBWAEUAUgAgAFcASQBUAEgAIABQAEIAUwAgAFsARgBVAEwATAAgAFIATwBWAEUAUgAgAEEAUwBTAEUATQBCAEwAWQBdACAAKAAxACkALwAzACAAUwB0AGEAZwBlACAASABEACAALQAgADUANwAgAFMAcABvAHIAdAAtADEAQABHAGUAYQByAGIAbwB4AC0AVwBoAGUAZQBsACAAQQBzAHMAZQBtAGIAbAB5ACAALQAgAE0ASQBSAFIATwBSAC8AMwAgAFMAdABhAGcAZQAgAEgARAAgAC0AIAA1ADcAIABTAHAAbwByAHQALgBTAFQARQBQAC0AMQBAADMAIABTAHQAYQBnAGUAIABIAEQAIAAtACAANQA3ACAAUwBwAG8AcgB0AC8AYQBtAC0AWABYAFgAWAAgAC0AIAA1ADcAIABTAHAAbwByAHQAIAAzACAAUwB0AGEAZwBlACAAUgBpAG4AZwAgAEcAZQBhAHIAIABIAG8AdQBzAGkAbgBnAC4AUwBUAEUAUAAtADEAQAAzACAAUwB0AGEAZwBlACAASABEACAALQAgADUANwAgAFMAcABvAHIAdAAuAFMAVABFAFAABAAAABAAAAABAAAABAAAAO8AAAAtAAAAGAAAABwAAAA=UEYAAAUAAAD//v+CRwBlAGEAcgBiAG8AeAAtAFcAaABlAGUAbAAgAEEAcwBzAGUAbQBiAGwAeQAgAC0AIABNAEkAUgBSAE8AUgAtADcAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8AQgBvAG4AZABpAG4AZwAgAFQAdQBiAGUALQAxAEAARwBlAGEAcgBiAG8AeAAtAFcAaABlAGUAbAAgAEEAcwBzAGUAbQBiAGwAeQAgAC0AIABNAEkAUgBSAE8AUgAEAAAAEAAAAAEAAAACAAAA7wAAABkAAAA=UEYAAAUAAAD//v96UwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ALQAxAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAEEAdgBlAHIAYQBnAGkAbgBnACAAUwBoAGEAZgB0ACAAVgAzAC0AMwBAAFMAaABlAGwAbAAgACYAIABBAHYAZQByAGEAZwBpAG4AZwAgAFMAeQBzAHQAZQBtAAQAAAAQAAAAAQAAAAIAAAAYAAAAygAAAA==UEYAAAUAAAD//v/GQQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8ANgAwADQANQBOADEAMgAyAF8ATABvAHcALQBDAGEAcgBiAG8AbgAgAFMAdABlAGUAbAAgAFIAbwB1AG4AZAAgAFQAdQBiAGUAIAAyAC0AMQBAAEEAIAAtACAAQQBWAEUAUgBBAEcASQBOAEcAIABCAEEAUgAgAEEAUwBTAEUATQBCAEwAWQAgAFsAQwBPAFIARQAgAFIATwBWAEUAUgAgAFcASQBUAEgAIABQAEIAUwBdACAAKAAxACkABAAAABAAAAABAAAAAgAAALAAAACxAQAAUEYAAAUAAAD//v/SQQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8AOQA0ADYANAA1AEEAMQAxADEAXwBIAGkAZwBoAC0AUwB0AHIAZQBuAGcAdABoACAAUwB0AGUAZQBsACAATgB5AGwAbwBuAC0ASQBuAHMAZQByAHQAIABMAG8AYwBrAG4AdQB0AC0AMQBAAEEAIAAtACAAQQBWAEUAUgBBAEcASQBOAEcAIABCAEEAUgAgAEEAUwBTAEUATQBCAEwAWQAgAFsAQwBPAFIARQAgAFIATwBWAEUAUgAgAFcASQBUAEgAIABQAEIAUwBdACAAKAAxACkABAAAABAAAAABAAAAAgAAALAAAAC1AQAAUEYAAAUAAAD//v/TQQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8AOQA2ADEANAA0AEEAMgAzADkAXwBGAGkAbgBlAC0AVABoAHIAZQBhAGQAIABBAGwAbABvAHkAIABTAHQAZQBlAGwAIABTAG8AYwBrAGUAdAAgAEgAZQBhAGQAIABTAGMAcgBlAHcALQAxAEAAQQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAEAAAAEAAAAAEAAAACAAAAsAAAAK0BAAA=falsefalsenametrueaveraging_barxyztrue000rpytrue000originfalsefalsevaluetrue0massfalseixxtrue0ixytrue0ixztrue0iyytrue0iyztrue0izztrue0inertiafalseinertialfalsexyztrue000rpytrue000originfalsefalsefilenametruemeshfalsegeometrytruenametruergbatrue1111colorfalsefilenametruetexturefalsematerialfalsevisualfalsexyztrue000rpytrue000originfalsefalsefilenametruemeshfalsegeometrytruecollisionfalsenametrueaveraging_bar_axistypetruerevolutexyztrue000rpytrue000originfalsefalselinktrueparenttruelinktruechildtruexyztrue000axisfalselowerfalseupperfalseefforttruevelocitytruelimitfalserisingfalsefallingfalsecalibrationfalsedampingfalsefrictionfalsedynamicsfalsesoft_upper_limitfalsesoft_lower_limitfalsek_positionfalsek_velocitytruesafety_controllerfalsejointtruemultiplierfalseoffsetfalsemimicfalsejointfalseaveraging_bar_axisAutomatically GeneratelinktruefalseUEYAAAUAAAD//v+8QQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8ATwBsAGQAIABBAHYAZQByAGEAZwBpAG4AZwAgAEIAYQByACAAKABNAG8AZABpAGYAaQBlAGQAKQAtADEAQABBACAALQAgAEEAVgBFAFIAQQBHAEkATgBHACAAQgBBAFIAIABBAFMAUwBFAE0AQgBMAFkAIABbAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAXQAgACgAMQApAAQAAAAQAAAAAQAAAAIAAACwAAAAGAAAAA==UEYAAAUAAAD//v/FQQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8AOQAyADkAOAAxAEEAMgAyADAAXwBBAGwAbABvAHkAIABTAHQAZQBlAGwAIABTAGgAbwB1AGwAZABlAHIAIABTAGMAcgBlAHcAcwAtADIAQABBACAALQAgAEEAVgBFAFIAQQBHAEkATgBHACAAQgBBAFIAIABBAFMAUwBFAE0AQgBMAFkAIABbAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAXQAgACgAMQApAAQAAAAQAAAAAQAAAAIAAACwAAAAyQEAAA==UEYAAAUAAAD//v/FQQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8AOQAyADkAOAAxAEEAMgAyADAAXwBBAGwAbABvAHkAIABTAHQAZQBlAGwAIABTAGgAbwB1AGwAZABlAHIAIABTAGMAcgBlAHcAcwAtADEAQABBACAALQAgAEEAVgBFAFIAQQBHAEkATgBHACAAQgBBAFIAIABBAFMAUwBFAE0AQgBMAFkAIABbAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAXQAgACgAMQApAAQAAAAQAAAAAQAAAAIAAACwAAAAggEAAA==UEYAAAUAAAD//v/EQQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8ANgAwADQANQBOADEAMgAyAF8ATABvAHcALQBDAGEAcgBiAG8AbgAgAFMAdABlAGUAbAAgAFIAbwB1AG4AZAAgAFQAdQBiAGUALQAyAEAAQQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAEAAAAEAAAAAEAAAACAAAAsAAAAMwBAAA=UEYAAAUAAAD//v/EQQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8ANgAwADQANQBOADEAMgAyAF8ATABvAHcALQBDAGEAcgBiAG8AbgAgAFMAdABlAGUAbAAgAFIAbwB1AG4AZAAgAFQAdQBiAGUALQAxAEAAQQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAEAAAAEAAAAAEAAAACAAAAsAAAAJUBAAA=falsefalsefalseUEYAAAUAAAD//v+cUwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ALQAxAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAEMAUwBDACAAUwBoAGUAbABsACAAQQBzAHMAZQBtAGIAbAB5AC0AMQBAAFMAaABlAGwAbAAgACYAIABBAHYAZQByAGEAZwBpAG4AZwAgAFMAeQBzAHQAZQBtAC8AQwBTAEMAIABWADQAIABTAGgAZQBsAGwALQAxAEAAQwBTAEMAIABTAGgAZQBsAGwAIABBAHMAcwBlAG0AYgBsAHkABAAAABAAAAABAAAAAwAAABgAAAAYAAAAGQAAAA==UEYAAAUAAAD//v9TTQBvAHQAbwByACAAYQBuAGQAIAA2ACAAcABpAG4AIABjAG8AbgBuAGUAYwB0AG8AcgAgAG0AbwB1AG4AdAAtADIAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAAQAAAAQAAAAAQAAAAEAAACoAAAAUEYAAAUAAAD//v9TTQBvAHQAbwByACAAYQBuAGQAIAA2ACAAcABpAG4AIABjAG8AbgBuAGUAYwB0AG8AcgAgAG0AbwB1AG4AdAAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAAQAAAAQAAAAAQAAAAEAAACfAAAAUEYAAAUAAAD//v9gSQBuAHMAaQBkAGUAIABNAG8AdABvAHIAIABhAG4AZAAgADYAIABwAGkAbgAgAGMAbwBuAG4AZQBjAHQAbwByACAAbQBvAHUAbgB0ACAAcABsAGEAdABlAC0AMQBAAEEAIAAtACAAQwBPAFIARQAgAFIATwBWAEUAUgAgAFcASQBUAEgAIABQAEIAUwAgAFsARgBVAEwATAAgAFIATwBWAEUAUgAgAEEAUwBTAEUATQBCAEwAWQBdACAAKAAxACkABAAAABAAAAABAAAAAQAAAKMAAAA=UEYAAAUAAAD//v+BUwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ALQAxAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAEQAaQBmAGYAIABCAG8AeAAgAEIAYQBjAGsAaQBuAGcAIABQAGwAYQB0AGUAIABWADIALQAxAEAAUwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ABAAAABAAAAABAAAAAgAAABgAAABXAwAAUEYAAAUAAAD//v+PUwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ALQAxAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0AIABPAHUAdABlAHIAIABQAGwAYQB0AGUAIABCAGEAYwBrAGkAbgBnACAAVgAxAC0AMQBAAFMAaABlAGwAbAAgACYAIABBAHYAZQByAGEAZwBpAG4AZwAgAFMAeQBzAHQAZQBtAAQAAAAQAAAAAQAAAAIAAAAYAAAAHQEAAA==UEYAAAUAAAD//v+vUwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ALQAxAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAEEAcgBtACAAQgByAGEAYwBrAGUAdAAgAEEAcwBzAGUAbQBiAGwAeQAgAFIAaQBnAGgAdAAgAFYAMwAtADEAQABTAGgAZQBsAGwAIAAmACAAQQB2AGUAcgBhAGcAaQBuAGcAIABTAHkAcwB0AGUAbQAvAEwAIABiAHIAYQBjAGsAZQB0AC0AMQBAAEEAcgBtACAAQgByAGEAYwBrAGUAdAAgAEEAcwBzAGUAbQBiAGwAeQAgAFIAaQBnAGgAdAAgAFYAMwAEAAAAEAAAAAEAAAADAAAAGAAAAG8DAAAYAAAAUEYAAAUAAAD//v+vUwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ALQAxAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAE0AaQByAHIAbwByAEEAcgBtACAAQgByAGEAYwBrAGUAdAAgAEEAcwBzAGUAbQBiAGwAeQAtADIAQABTAGgAZQBsAGwAIAAmACAAQQB2AGUAcgBhAGcAaQBuAGcAIABTAHkAcwB0AGUAbQAvAE0AaQByAHIAbwByAEEAcgBtACAAQgBvAGwAdABzAC0AMQBAAE0AaQByAHIAbwByAEEAcgBtACAAQgByAGEAYwBrAGUAdAAgAEEAcwBzAGUAbQBiAGwAeQAEAAAAEAAAAAEAAAADAAAAGAAAAHQDAAAbAAAAUEYAAAUAAAD//v+vUwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ALQAxAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAEEAcgBtACAAQgByAGEAYwBrAGUAdAAgAEEAcwBzAGUAbQBiAGwAeQAgAFIAaQBnAGgAdAAgAFYAMwAtADEAQABTAGgAZQBsAGwAIAAmACAAQQB2AGUAcgBhAGcAaQBuAGcAIABTAHkAcwB0AGUAbQAvAEEAcgBtACAAQgBvAGwAdABzAC0AMQBAAEEAcgBtACAAQgByAGEAYwBrAGUAdAAgAEEAcwBzAGUAbQBiAGwAeQAgAFIAaQBnAGgAdAAgAFYAMwAEAAAAEAAAAAEAAAADAAAAGAAAAG8DAAA3AAAAUEYAAAUAAAD//v9cRQBsAGUAYwBfAEIAbwB4AF8AQQBzAHMAZQBtAC0AMQBAAEEAIAAtACAAQwBPAFIARQAgAFIATwBWAEUAUgAgAFcASQBUAEgAIABQAEIAUwAgAFsARgBVAEwATAAgAFIATwBWAEUAUgAgAEEAUwBTAEUATQBCAEwAWQBdACAAKAAxACkALwBCAG8AeABfAEIAYQBzAGUALQAxAEAARQBsAGUAYwBfAEIAbwB4AF8AQQBzAHMAZQBtAAQAAAAQAAAAAQAAAAIAAABQAAAAGAAAAA==UEYAAAUAAAD//v9hRQBsAGUAYwBfAEIAbwB4AF8AQQBzAHMAZQBtAC0AMQBAAEEAIAAtACAAQwBPAFIARQAgAFIATwBWAEUAUgAgAFcASQBUAEgAIABQAEIAUwAgAFsARgBVAEwATAAgAFIATwBWAEUAUgAgAEEAUwBTAEUATQBCAEwAWQBdACAAKAAxACkALwBCAG8AeABfAEwAZQBmAHQAXwBXAGEAbABsAC0AMQBAAEUAbABlAGMAXwBCAG8AeABfAEEAcwBzAGUAbQAEAAAAEAAAAAEAAAACAAAAUAAAACgAAAA=UEYAAAUAAAD//v9iRQBsAGUAYwBfAEIAbwB4AF8AQQBzAHMAZQBtAC0AMQBAAEEAIAAtACAAQwBPAFIARQAgAFIATwBWAEUAUgAgAFcASQBUAEgAIABQAEIAUwAgAFsARgBVAEwATAAgAFIATwBWAEUAUgAgAEEAUwBTAEUATQBCAEwAWQBdACAAKAAxACkALwBCAG8AeABfAEYAcgBvAG4AdABfAFcAYQBsAGwALQAxAEAARQBsAGUAYwBfAEIAbwB4AF8AQQBzAHMAZQBtAAQAAAAQAAAAAQAAAAIAAABQAAAAHwAAAA==UEYAAAUAAAD//v9iRQBsAGUAYwBfAEIAbwB4AF8AQQBzAHMAZQBtAC0AMQBAAEEAIAAtACAAQwBPAFIARQAgAFIATwBWAEUAUgAgAFcASQBUAEgAIABQAEIAUwAgAFsARgBVAEwATAAgAFIATwBWAEUAUgAgAEEAUwBTAEUATQBCAEwAWQBdACAAKAAxACkALwBCAG8AeABfAFIAaQBnAGgAdABfAFcAYQBsAGwALQAxAEAARQBsAGUAYwBfAEIAbwB4AF8AQQBzAHMAZQBtAAQAAAAQAAAAAQAAAAIAAABQAAAAIwAAAA==UEYAAAUAAAD//v97RQBsAGUAYwBfAEIAbwB4AF8AQQBzAHMAZQBtAC0AMQBAAEEAIAAtACAAQwBPAFIARQAgAFIATwBWAEUAUgAgAFcASQBUAEgAIABQAEIAUwAgAFsARgBVAEwATAAgAFIATwBWAEUAUgAgAEEAUwBTAEUATQBCAEwAWQBdACAAKAAxACkALwBQAE8ARQAgAFMAdwBpAHQAYwBoACAAKABNAGUAYQBzAHUAcgBlAGQAIAB3AGkAdABoACAAaABvAGwAZQAgAHAAYQB0AHQAZQByAG4AKQAtADEAQABFAGwAZQBjAF8AQgBvAHgAXwBBAHMAcwBlAG0ABAAAABAAAAABAAAAAgAAAFAAAAAWBAAAUEYAAAUAAAD//v+ARQBsAGUAYwBfAEIAbwB4AF8AQQBzAHMAZQBtAC0AMQBAAEEAIAAtACAAQwBPAFIARQAgAFIATwBWAEUAUgAgAFcASQBUAEgAIABQAEIAUwAgAFsARgBVAEwATAAgAFIATwBWAEUAUgAgAEEAUwBTAEUATQBCAEwAWQBdACAAKAAxACkALwBFAHQAaABlAHIAbgBlAHQAIABTAHcAaQB0AGMAaAAgACgATQBlAGEAcwB1AHIAZQBkACAAdwBpAHQAaAAgAGgAbwBsAGUAIABwAGEAdAB0AGUAcgBuACkALQAxAEAARQBsAGUAYwBfAEIAbwB4AF8AQQBzAHMAZQBtAAQAAAAQAAAAAQAAAAIAAABQAAAAHwQAAA==UEYAAAUAAAD//v//1gFFAGwAZQBjAF8AQgBvAHgAXwBBAHMAcwBlAG0ALQAxAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAE4AVQBDADEAMwBBAE4ASABfAE4AVQBDADEAMwBMAEMASAAtADEAQABFAGwAZQBjAF8AQgBvAHgAXwBBAHMAcwBlAG0ALwBOAFUAQwAxADMAQQBOAEgAXwBOAFUAQwAxADMATABDAEgALgBTAFQAUAAtADEAQABOAFUAQwAxADMAQQBOAEgAXwBOAFUAQwAxADMATABDAEgALwAwADAAXwBXAFMAXwBBAEwATABfAEEAUwBNAF8AQwBIAEUAQwBLAF8AQQBTAE0AXwAxAF8AQQBTAE0AXwAxAC4AUwBUAFAALQAxAEAATgBVAEMAMQAzAEEATgBIAF8ATgBVAEMAMQAzAEwAQwBIAC4AUwBUAFAALwBXAFMAXwBNAEUAXwBQAEwAQQBDAEUATQBFAE4AVABfAEEAUwBNAF8AQQBTAE0AXwAxAF8AQQBTAE0AXwAyAC4AUwBUAFAALQAxAEAAMAAwAF8AVwBTAF8AQQBMAEwAXwBBAFMATQBfAEMASABFAEMASwBfAEEAUwBNAF8AMQBfAEEAUwBNAF8AMQAuAFMAVABQAC8AVwBTAF8ATQBFAF8AVABBAEwATABfAEEAUwBTAFkAXwBBAFMATQBfADEAXwBBAFMATQBfADEALgBTAFQAUAAtADEAQABXAFMAXwBNAEUAXwBQAEwAQQBDAEUATQBFAE4AVABfAEEAUwBNAF8AQQBTAE0AXwAxAF8AQQBTAE0AXwAyAC4AUwBUAFAALwBXAFMAXwBUAE8AUABfAEMATwBWAEUAUgBfAEEAUwBNAF8AQQBTAE0AXwAxAF8AQQBTAE0AXwAxAC4AUwBUAFAALQAxAEAAVwBTAF8ATQBFAF8AVABBAEwATABfAEEAUwBTAFkAXwBBAFMATQBfADEAXwBBAFMATQBfADEALgBTAFQAUAAvAEEATgBfAFQATwBQAF8AQwBPAFYARQBSAF8AMQBfADIALgBTAFQAUAAtADEAQABXAFMAXwBUAE8AUABfAEMATwBWAEUAUgBfAEEAUwBNAF8AQQBTAE0AXwAxAF8AQQBTAE0AXwAxAC4AUwBUAFAABAAAABAAAAABAAAACAAAAFAAAABYBAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAUEYAAAUAAAD//v//6QFFAGwAZQBjAF8AQgBvAHgAXwBBAHMAcwBlAG0ALQAxAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAE4AVQBDADEAMwBBAE4ASABfAE4AVQBDADEAMwBMAEMASAAtADEAQABFAGwAZQBjAF8AQgBvAHgAXwBBAHMAcwBlAG0ALwBOAFUAQwAxADMAQQBOAEgAXwBOAFUAQwAxADMATABDAEgALgBTAFQAUAAtADEAQABOAFUAQwAxADMAQQBOAEgAXwBOAFUAQwAxADMATABDAEgALwAwADAAXwBXAFMAXwBBAEwATABfAEEAUwBNAF8AQwBIAEUAQwBLAF8AQQBTAE0AXwAxAF8AQQBTAE0AXwAxAC4AUwBUAFAALQAxAEAATgBVAEMAMQAzAEEATgBIAF8ATgBVAEMAMQAzAEwAQwBIAC4AUwBUAFAALwBXAFMAXwBNAEUAXwBQAEwAQQBDAEUATQBFAE4AVABfAEEAUwBNAF8AQQBTAE0AXwAxAF8AQQBTAE0AXwAyAC4AUwBUAFAALQAxAEAAMAAwAF8AVwBTAF8AQQBMAEwAXwBBAFMATQBfAEMASABFAEMASwBfAEEAUwBNAF8AMQBfAEEAUwBNAF8AMQAuAFMAVABQAC8AVwBTAF8ATQBFAF8AVABBAEwATABfAEEAUwBTAFkAXwBBAFMATQBfADEAXwBBAFMATQBfADEALgBTAFQAUAAtADEAQABXAFMAXwBNAEUAXwBQAEwAQQBDAEUATQBFAE4AVABfAEEAUwBNAF8AQQBTAE0AXwAxAF8AQQBTAE0AXwAyAC4AUwBUAFAALwBXAFMAXwBUAEEATABMAF8ATQBJAEQAXwBGAFIAQQBNAEUAXwBBAFMATQBfAEEAUwBNAF8AMQBfAEEAUwBNAF8AMQAuAFMAVABQAC0AMQBAAFcAUwBfAE0ARQBfAFQAQQBMAEwAXwBBAFMAUwBZAF8AQQBTAE0AXwAxAF8AQQBTAE0AXwAxAC4AUwBUAFAALwBXAFMAXwBUAEEATABMAF8ATQBJAEQAXwBGAFIAQQBNAEUAXwBOAEUAVwBfADEAXwAxAC4AUwBUAFAALQAxAEAAVwBTAF8AVABBAEwATABfAE0ASQBEAF8ARgBSAEEATQBFAF8AQQBTAE0AXwBBAFMATQBfADEAXwBBAFMATQBfADEALgBTAFQAUAAEAAAAEAAAAAEAAAAIAAAAUAAAAFgEAAAYAAAAGAAAABgAAAAYAAAAGgAAABoAAAA=UEYAAAUAAAD//v9jRQBsAGUAYwBfAEIAbwB4AF8AQQBzAHMAZQBtAC0AMQBAAEEAIAAtACAAQwBPAFIARQAgAFIATwBWAEUAUgAgAFcASQBUAEgAIABQAEIAUwAgAFsARgBVAEwATAAgAFIATwBWAEUAUgAgAEEAUwBTAEUATQBCAEwAWQBdACAAKAAxACkALwBTAG8AbABpAGQAUwB0AGEAdABlAFIAZQBsAGEAeQAtADEAQABFAGwAZQBjAF8AQgBvAHgAXwBBAHMAcwBlAG0ABAAAABAAAAABAAAAAgAAAFAAAACTBAAAUEYAAAUAAAD//v9cRQBsAGUAYwBfAEIAbwB4AF8AQQBzAHMAZQBtAC0AMQBAAEEAIAAtACAAQwBPAFIARQAgAFIATwBWAEUAUgAgAFcASQBUAEgAIABQAEIAUwAgAFsARgBVAEwATAAgAFIATwBWAEUAUgAgAEEAUwBTAEUATQBCAEwAWQBdACAAKAAxACkALwAxADAAMABBAEYAdQBzAGUALQAxAEAARQBsAGUAYwBfAEIAbwB4AF8AQQBzAHMAZQBtAAQAAAAQAAAAAQAAAAIAAABQAAAAlwQAAA==UEYAAAUAAAD//v9hRQBsAGUAYwBfAEIAbwB4AF8AQQBzAHMAZQBtAC0AMQBAAEEAIAAtACAAQwBPAFIARQAgAFIATwBWAEUAUgAgAFcASQBUAEgAIABQAEIAUwAgAFsARgBVAEwATAAgAFIATwBWAEUAUgAgAEEAUwBTAEUATQBCAEwAWQBdACAAKAAxACkALwBCAG8AeABfAEIAYQBjAGsAXwBXAGEAbABsAC0AMQBAAEUAbABlAGMAXwBCAG8AeABfAEEAcwBzAGUAbQAEAAAAEAAAAAEAAAACAAAAUAAAABkAAAA=UEYAAAUAAAD//v9KUgBlAGEAcgBfAFcAYQBsAGwAXwBTAGgAZQBhAHQAaABfAE8AdQB0AGUAcgAtADIAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAAQAAAAQAAAAAQAAAAEAAACQAAAAUEYAAAUAAAD//v9KUgBlAGEAcgBfAFcAYQBsAGwAXwBTAGgAZQBhAHQAaABfAE8AdQB0AGUAcgAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAAQAAAAQAAAAAQAAAAEAAAB4AAAAUEYAAAUAAAD//v+vUwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ALQAxAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAE0AaQByAHIAbwByAEEAcgBtACAAQgByAGEAYwBrAGUAdAAgAEEAcwBzAGUAbQBiAGwAeQAtADIAQABTAGgAZQBsAGwAIAAmACAAQQB2AGUAcgBhAGcAaQBuAGcAIABTAHkAcwB0AGUAbQAvAE0AaQByAHIAbwByAEwAIABiAHIAYQBjAGsAZQB0AC0AMQBAAE0AaQByAHIAbwByAEEAcgBtACAAQgByAGEAYwBrAGUAdAAgAEEAcwBzAGUAbQBiAGwAeQAEAAAAEAAAAAEAAAADAAAAGAAAAHQDAAAYAAAAUEYAAAUAAAD//v98UwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ALQAxAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAEMAaABhAHMAaQBzACAAQwAtAEMAaABhAG4AbgBlAGwAIABMAGkAcAAtADEAQABTAGgAZQBsAGwAIAAmACAAQQB2AGUAcgBhAGcAaQBuAGcAIABTAHkAcwB0AGUAbQAEAAAAEAAAAAEAAAACAAAAGAAAAOgDAAA=UEYAAAUAAAD//v+2QQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8AQwBvAHIAZQAgAE0AbwB1AG4AdAAgAEYAcgBvAG4AdAAgAFAAbABhAHQAZQAtADEAQABBACAALQAgAEEAVgBFAFIAQQBHAEkATgBHACAAQgBBAFIAIABBAFMAUwBFAE0AQgBMAFkAIABbAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAXQAgACgAMQApAAQAAAAQAAAAAQAAAAIAAACwAAAAlgAAAA==UEYAAAUAAAD//v+2QQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8AQwBvAHIAZQAgAE0AbwB1AG4AdAAgAEYAcgBvAG4AdAAgAFAAbABhAHQAZQAtADIAQABBACAALQAgAEEAVgBFAFIAQQBHAEkATgBHACAAQgBBAFIAIABBAFMAUwBFAE0AQgBMAFkAIABbAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAXQAgACgAMQApAAQAAAAQAAAAAQAAAAIAAACwAAAAqwAAAA==UEYAAAUAAAD//v+4QQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8ARQBhAHMAeQAgAFQAbwAgAHcAZQBsAGQAIABUAHUAYgBlACAAUwBwAGEAYwBlAHIALQAxAEAAQQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAEAAAAEAAAAAEAAAACAAAAsAAAAJsAAAA=UEYAAAUAAAD//v+4QQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8ARQBhAHMAeQAgAFQAbwAgAHcAZQBsAGQAIABUAHUAYgBlACAAUwBwAGEAYwBlAHIALQA5AEAAQQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAEAAAAEAAAAAEAAAACAAAAsAAAADYBAAA=UEYAAAUAAAD//v+5QQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8ARQBhAHMAeQAgAFQAbwAgAHcAZQBsAGQAIABUAHUAYgBlACAAUwBwAGEAYwBlAHIALQAxADAAQABBACAALQAgAEEAVgBFAFIAQQBHAEkATgBHACAAQgBBAFIAIABBAFMAUwBFAE0AQgBMAFkAIABbAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAXQAgACgAMQApAAQAAAAQAAAAAQAAAAIAAACwAAAANwEAAA==UEYAAAUAAAD//v+4QQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8ARQBhAHMAeQAgAFQAbwAgAHcAZQBsAGQAIABUAHUAYgBlACAAUwBwAGEAYwBlAHIALQA4AEAAQQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAEAAAAEAAAAAEAAAACAAAAsAAAADUBAAA=UEYAAAUAAAD//v+HUwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ALQAxAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0AIABPAHUAdABlAHIAIABQAGwAYQB0AGUAIABWADMALQAxAEAAUwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ABAAAABAAAAABAAAAAgAAABgAAABNAAAAUEYAAAUAAAD//v+RUwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ALQAxAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAEQAaQBmAGYAIABWADUAIABBAHMAcwBlAG0ALQAyAEAAUwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ALwBEAGkAZgBmACAAQgBvAHgAIABWADUALQAxAEAARABpAGYAZgAgAFYANQAgAEEAcwBzAGUAbQAEAAAAEAAAAAEAAAADAAAAGAAAAI4CAAAYAAAAUEYAAAUAAAD//v+HUwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ALQAxAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0AIABPAHUAdABlAHIAIABQAGwAYQB0AGUAIABWADMALQAyAEAAUwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ABAAAABAAAAABAAAAAgAAABgAAABQAAAAUEYAAAUAAAD//v91UwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ALQAxAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAHAAaQBjAGEAdABpAG4AbgB5ADkANQBtAG0ALQAxAEAAUwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ABAAAABAAAAABAAAAAgAAABgAAAA3BAAAUEYAAAUAAAD//v91UwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ALQAxAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvAHAAaQBjAGEAdABpAG4AbgB5ADkANQBtAG0ALQAyAEAAUwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ABAAAABAAAAABAAAAAgAAABgAAABFBAAAUEYAAAUAAAD//v/TQQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8AOQAwADAANAA0AEEANAAyADUAXwBCAGwAYQBjAGsALQBPAHgAaQBkAGUAIABBAGwAbABvAHkAIABTAHQAZQBlAGwAIABTAG8AYwBrAGUAdAAgAEgAZQBhAGQAIABTAGMAcgBlAHcALQAxAEAAQQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAEAAAAEAAAAAEAAAACAAAAsAAAAMYAAAA=UEYAAAUAAAD//v/TQQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8AOQAwADAANAA0AEEANAAyADUAXwBCAGwAYQBjAGsALQBPAHgAaQBkAGUAIABBAGwAbABvAHkAIABTAHQAZQBlAGwAIABTAG8AYwBrAGUAdAAgAEgAZQBhAGQAIABTAGMAcgBlAHcALQAzAEAAQQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAEAAAAEAAAAAEAAAACAAAAsAAAAM8AAAA=UEYAAAUAAAD//v/TQQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8AOQAwADAANAA0AEEANAAyADUAXwBCAGwAYQBjAGsALQBPAHgAaQBkAGUAIABBAGwAbABvAHkAIABTAHQAZQBlAGwAIABTAG8AYwBrAGUAdAAgAEgAZQBhAGQAIABTAGMAcgBlAHcALQA0AEAAQQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAEAAAAEAAAAAEAAAACAAAAsAAAANAAAAA=UEYAAAUAAAD//v/TQQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAC8AOQAwADAANAA0AEEANAAyADUAXwBCAGwAYQBjAGsALQBPAHgAaQBkAGUAIABBAGwAbABvAHkAIABTAHQAZQBlAGwAIABTAG8AYwBrAGUAdAAgAEgAZQBhAGQAIABTAGMAcgBlAHcALQAyAEAAQQAgAC0AIABBAFYARQBSAEEARwBJAE4ARwAgAEIAQQBSACAAQQBTAFMARQBNAEIATABZACAAWwBDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTAF0AIAAoADEAKQAEAAAAEAAAAAEAAAACAAAAsAAAAM4AAAA=UEYAAAUAAAD//v9/UwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ALQAxAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvADYANAAzADYASwAxADQAIAAuADUAIABTAGgAYQBmAHQAIABDAG8AbABsAGEAcgAtADIAQABTAGgAZQBsAGwAIAAmACAAQQB2AGUAcgBhAGcAaQBuAGcAIABTAHkAcwB0AGUAbQAEAAAAEAAAAAEAAAACAAAAGAAAADMDAAA=UEYAAAUAAAD//v9/UwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ALQAxAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvADYANAAzADYASwAxADQAIAAuADUAIABTAGgAYQBmAHQAIABDAG8AbABsAGEAcgAtADQAQABTAGgAZQBsAGwAIAAmACAAQQB2AGUAcgBhAGcAaQBuAGcAIABTAHkAcwB0AGUAbQAEAAAAEAAAAAEAAAACAAAAGAAAADcDAAA=UEYAAAUAAAD//v9/UwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ALQAxAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvADYANAAzADYASwAxADQAIAAuADUAIABTAGgAYQBmAHQAIABDAG8AbABsAGEAcgAtADMAQABTAGgAZQBsAGwAIAAmACAAQQB2AGUAcgBhAGcAaQBuAGcAIABTAHkAcwB0AGUAbQAEAAAAEAAAAAEAAAACAAAAGAAAADYDAAA=UEYAAAUAAAD//v9/UwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ALQAxAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvADYANAAzADYASwAxADQAIAAuADUAIABTAGgAYQBmAHQAIABDAG8AbABsAGEAcgAtADEAQABTAGgAZQBsAGwAIAAmACAAQQB2AGUAcgBhAGcAaQBuAGcAIABTAHkAcwB0AGUAbQAEAAAAEAAAAAEAAAACAAAAGAAAADADAAA=UEYAAAUAAAD//v9KUgBlAGEAcgBfAFcAYQBsAGwAXwBTAGgAZQBhAHQAaABfAEkAbgBuAGUAcgAtADEAQABBACAALQAgAEMATwBSAEUAIABSAE8AVgBFAFIAIABXAEkAVABIACAAUABCAFMAIABbAEYAVQBMAEwAIABSAE8AVgBFAFIAIABBAFMAUwBFAE0AQgBMAFkAXQAgACgAMQApAAQAAAAQAAAAAQAAAAEAAAB3AAAAUEYAAAUAAAD//v+BUwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ALQAxAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvADgAOAA5ADYAVAA2ADkAIABTAFMAIABVACAAQgBvAGwAdAAgADEALgAzADcANQBpAG4ALQAxAEAAUwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ABAAAABAAAAABAAAAAgAAABgAAABCAgAAUEYAAAUAAAD//v+BUwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ALQAxAEAAQQAgAC0AIABDAE8AUgBFACAAUgBPAFYARQBSACAAVwBJAFQASAAgAFAAQgBTACAAWwBGAFUATABMACAAUgBPAFYARQBSACAAQQBTAFMARQBNAEIATABZAF0AIAAoADEAKQAvADgAOAA5ADYAVAA2ADkAIABTAFMAIABVACAAQgBvAGwAdAAgADEALgAzADcANQBpAG4ALQAyAEAAUwBoAGUAbABsACAAJgAgAEEAdgBlAHIAYQBnAGkAbgBnACAAUwB5AHMAdABlAG0ABAAAABAAAAABAAAAAgAAABgAAABDAgAAfalsefalse
-2025-09-29 22:32:24,229 INFO LinkNode.cs: 35 - Building node base_link
-2025-09-29 22:32:24,229 INFO LinkNode.cs: 35 - Building node left_suspension_member
-2025-09-29 22:32:24,229 INFO LinkNode.cs: 35 - Building node bl_wheel
-2025-09-29 22:32:24,229 INFO LinkNode.cs: 35 - Building node fl_wheel
-2025-09-29 22:32:24,229 INFO LinkNode.cs: 35 - Building node right_suspension_member
-2025-09-29 22:32:24,229 INFO LinkNode.cs: 35 - Building node br_wheel
-2025-09-29 22:32:24,229 INFO LinkNode.cs: 35 - Building node fr_wheel
-2025-09-29 22:32:24,229 INFO LinkNode.cs: 35 - Building node averaging_bar
-2025-09-29 22:32:24,229 INFO CommonSwOperations.cs: 221 - Loading SolidWorks components for base_link from C:\Users\David\Documents\ASTRA BILT\01. MECHANICAL 2025-2026\01. CORE ROVER\00. CORE ROVER ASSEMBLY\POST BOND SUSPENSION\A - CORE ROVER WITH PBS [FULL ROVER ASSEMBLY] (1).SLDASM
-2025-09-29 22:32:24,229 INFO CommonSwOperations.cs: 245 - Loading component with PID PF ????S h e l l &