diff --git a/.fish/activate.fish b/.fish/activate.fish
new file mode 100755
index 0000000..deb03a8
--- /dev/null
+++ b/.fish/activate.fish
@@ -0,0 +1,75 @@
+# Self-contained environment: ros2-lectures
+# Exported on: Sat Dec 13 05:03:27 PM CET 2025
+# Original environment from: /home/wessel/.config/fish/environments/configs/ros2-lectures
+
+# ROS2 development environment (requires distrobox)
+# Environment: ros2-lectures
+
+# First check if running inside distrobox
+if not test -f /run/.containerenv; and test -z "$CONTAINER_ID"
+ echo (set_color red)"This ROS2 environment should only be run inside a distrobox container"(set_color normal)
+ return 1
+end
+
+# Check if a previous initialization has occurred
+if test -n "$__ENV_INITIALIZED"
+ echo (set_color yellow)"Environment already initialized"(set_color normal)
+ return 0
+end
+
+# Mark as initialized (only after distrobox check passes)
+set -gx __ENV_INITIALIZED "1"
+set -gx CURRENT_ENV "ros2-lectures"
+# Source ROS2 setup files using bass
+if type -q bass
+ bass source /opt/ros/jazzy/setup.bash
+ if test -f ./install/setup.bash
+ bass source ./install/setup.bash
+ end
+else
+ echo (set_color red)"Error: bass is required for ROS2 environment. Install with: fisher install edc/bass"(set_color normal)
+ return 1
+end
+
+# Set environment variable for the prompt prefix
+set -gx ROS2_ACTIVE 1
+
+# Save the original prompt function if it exists
+# Only save if we don't already have a backup or if current prompt is not from an environment
+if not functions -q __env_orig_prompt
+ if functions -q fish_prompt
+ functions -c fish_prompt __env_orig_prompt
+ else
+ function __env_orig_prompt
+ echo -n (whoami)'@'(prompt_hostname)' '(set_color $fish_color_cwd)(prompt_pwd)(set_color normal)'> '
+ end
+ end
+else
+ # If we already have a backup, we're switching environments
+ # No need to create a new backup
+end
+
+# Define new prompt with ROS2 prefix
+function fish_prompt
+ echo -n (set_color magenta)'(ros2-lectures)'(set_color normal)' '
+ __env_orig_prompt
+end
+
+# ROS2 aliases and functions
+alias cb="colcon build"
+alias cbe="colcon build && env deactivate && cd ."
+alias cbs="colcon build --symlink-install"
+alias cbt="colcon build --packages-select"
+alias ct="colcon test"
+alias ctr="colcon test-result"
+
+echo (set_color green)"Activated ROS2 environment: ros2-lectures"(set_color normal)
+
+# Custom deactivation function
+function __env_custom_deactivate
+ # Remove ROS2-specific variables and aliases
+ set -e ROS2_ACTIVE
+ functions -e cb cbs cbt ct ctr 2>/dev/null
+
+ echo (set_color blue)"ROS2 environment cleanup completed"(set_color normal)
+end
diff --git a/.fish/readme.norg b/.fish/readme.norg
new file mode 100644
index 0000000..cc3d876
--- /dev/null
+++ b/.fish/readme.norg
@@ -0,0 +1,60 @@
+* Exported Fish Environment: ros2-lectures
+This directory contains a self-contained fish environment.
+
+** Files Structure
+ @code
+ .fish/
+ |-- activate.fish
+ |-- readme.norg
+ |-- bin/
+ @end
+
+** Usage
+
+*** Automatic Activation (Recommended)
+ The environment will automatically activate when you `cd` into this directory
+ if your Fish shell is configured with the auto-activation script.
+
+ @code fish
+ function check_and_source_activate
+ if test -f (pwd)/.fish/activate.fish
+ source (pwd)/.fish/activate.fish
+ elif test -f (pwd)/activate.fish
+ source (pwd)/activate.fish
+ end
+ end
+
+ function cd
+ builtin cd $argv && check_and_source_activate
+ end
+ @end
+
+*** Manual Activation
+ To manually activate the environment, run from the project root:
+ @code bash
+ source ./.fish/activate.fish
+ @end
+
+*** Deactivation
+ To deactivate the environment, run:
+ @code bash
+ env deactivate
+ @end
+
+ Or simply `cd` to a different directory if using auto-activation.
+
+** What This Environment Provides
+ - Prompt showing the environment name
+ - Environment-specific aliases and functions
+ - Custom environment variables
+ - Automatic cleanup when deactivated
+
+** Requirements
+ - Fish shell
+ - `bass` plugin (`fisher install edc/bass`) for compatibility with bash scripts
+
+** Sharing
+ This environment is completely self-contained. You can:
+ - Copy this directory to another machine
+ - Share it with others
+ - Version control it with your project (add .fish/ to your repo)
\ No newline at end of file
diff --git a/src/pose_calculator/CMakeLists.txt b/src/pose_calculator/CMakeLists.txt
new file mode 100644
index 0000000..eb28a88
--- /dev/null
+++ b/src/pose_calculator/CMakeLists.txt
@@ -0,0 +1,36 @@
+cmake_minimum_required(VERSION 3.8)
+project(pose_calculator)
+
+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(rclcpp REQUIRED)
+find_package(tf2_ros REQUIRED)
+find_package(geometry_msgs REQUIRED)
+find_package(sensor_msgs REQUIRED)
+
+# set dependencies
+set(dependencies
+rclcpp
+tf2_ros
+geometry_msgs
+sensor_msgs
+)
+
+# add executables for scripts
+add_executable(ik_node src/InverseKinematicNode.cpp)
+ament_target_dependencies(ik_node ${dependencies})
+
+# install the scripts
+install(TARGETS
+ik_node
+DESTINATION lib/${PROJECT_NAME})
+install(
+DIRECTORY launch
+DESTINATION share/${PROJECT_NAME}
+)
+
+ament_package()
diff --git a/src/pose_calculator/launch/inverse_kinematic.launch.xml b/src/pose_calculator/launch/inverse_kinematic.launch.xml
new file mode 100644
index 0000000..40d504f
--- /dev/null
+++ b/src/pose_calculator/launch/inverse_kinematic.launch.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pose_calculator/package.xml b/src/pose_calculator/package.xml
new file mode 100644
index 0000000..243634b
--- /dev/null
+++ b/src/pose_calculator/package.xml
@@ -0,0 +1,22 @@
+
+
+
+ pose_calculator
+ 0.0.0
+ TODO: Package description
+ wessel
+ TODO: License declaration
+
+ ament_cmake
+ rclcpp
+ tf2_ros
+ geometry_msgs
+ sensor_msgs
+
+ ament_lint_auto
+ ament_lint_common
+
+
+ ament_cmake
+
+
diff --git a/src/pose_calculator/src/InverseKinematicNode.cpp b/src/pose_calculator/src/InverseKinematicNode.cpp
new file mode 100644
index 0000000..6e6ea66
--- /dev/null
+++ b/src/pose_calculator/src/InverseKinematicNode.cpp
@@ -0,0 +1,193 @@
+#include
+
+#include
+#include
+
+class InverseKinematicNode : public rclcpp::Node {
+public:
+ InverseKinematicNode() : Node("skyentific_pose_calculator_node") {
+ auto target_x_desc = rcl_interfaces::msg::ParameterDescriptor();
+ target_x_desc.description = "Target X position";
+ target_x_desc.read_only = false;
+ target_x_desc.floating_point_range.resize(1);
+ target_x_desc.floating_point_range[0].from_value = -0.5;
+ target_x_desc.floating_point_range[0].to_value = 0.5;
+ target_x_desc.floating_point_range[0].step = 0.01;
+
+ auto target_y_desc = rcl_interfaces::msg::ParameterDescriptor();
+ target_y_desc.description = "Target Y position";
+ target_y_desc.read_only = false;
+ target_y_desc.floating_point_range.resize(1);
+ target_y_desc.floating_point_range[0].from_value = -0.5;
+ target_y_desc.floating_point_range[0].to_value = 0.5;
+ target_y_desc.floating_point_range[0].step = 0.01;
+
+ target_x_ = this->declare_parameter("target_x", 0.29, target_x_desc);
+ target_y_ = this->declare_parameter("target_y", 0.29, target_y_desc);
+
+ link1_ = this->declare_parameter("L1", 0.225);
+ link2_ = this->declare_parameter("L2", 0.383);
+
+ // Set up parameter callback for dynamic reconfigure
+ param_callback_handle_ = this->add_on_set_parameters_callback(
+ std::bind(&InverseKinematicNode::callback_parameters, this, std::placeholders::_1)
+ );
+
+ if (!calculate_2dpose(target_x_, target_y_)) {
+ RCLCPP_ERROR(this->get_logger(), "failed calculating pose (x=%f, y=%f)", target_x_, target_y_);
+ } else {
+ RCLCPP_INFO(this->get_logger(),
+ "target position (x=%f, y=%f) [j1=%f, j2=%f, j3=%f, j4=%f, j5=%f, j6=%f]",
+ target_x_, target_y_, joint_1_, joint_2_, joint_3_, joint_4_, joint_5_, joint_6_
+ );
+ }
+
+ joint_state_publisher_ = this->create_publisher("joint_states", 10);
+
+ timer_ = this->create_wall_timer(
+ std::chrono::milliseconds(100),
+ std::bind(&InverseKinematicNode::publish_joint_state, this));
+ }
+
+private:
+ rcl_interfaces::msg::SetParametersResult callback_parameters(
+ const std::vector ¶meters
+ ) {
+
+ rcl_interfaces::msg::SetParametersResult result;
+ result.successful = true;
+
+ bool recalculate = false;
+ double new_x = target_x_;
+ double new_y = target_y_;
+
+ for (const auto ¶m : parameters) {
+ if (param.get_name() == "target_x") {
+ new_x = param.as_double();
+ recalculate = true;
+ RCLCPP_INFO(this->get_logger(), "changed 'target_x' -> %.4f", new_x);
+ } else if (param.get_name() == "target_y") {
+ new_y = param.as_double();
+ recalculate = true;
+ RCLCPP_INFO(this->get_logger(), "changed 'target_y' -> %.4f", new_y);
+ }
+ }
+
+ if (recalculate) {
+ if (calculate_2dpose(new_x, new_y)) {
+ target_x_ = new_x;
+ target_y_ = new_y;
+ result.successful = true;
+ result.reason = "pose calculation successful";
+ } else {
+ result.successful = false;
+ result.reason = "target position unreachable";
+ RCLCPP_WARN(this->get_logger(), "failed to calculate pose, keeping previous values");
+ }
+ }
+
+ return result;
+ }
+
+private:
+ OnSetParametersCallbackHandle::SharedPtr param_callback_handle_;
+ rclcpp::Publisher::SharedPtr joint_state_publisher_;
+ rclcpp::TimerBase::SharedPtr timer_;
+
+ double target_x_, target_y_;
+ double link1_, link2_;
+ double joint_1_, joint_2_, joint_3_, joint_4_, joint_5_, joint_6_;
+
+ bool calculate_2dpose(double x, double y) {
+ RCLCPP_INFO(this->get_logger(), "0. x=%.4f, y=%.4f, l1=%.4f, l2=%.4f", x, y, link1_, link2_);
+
+ double r = std::sqrt(x * x + y * y);
+ RCLCPP_INFO(this->get_logger(), "1. r=%.6f", r);
+
+ // joint 1 = base rotation
+ joint_1_ = 0.0;
+ // joint_1_ = std::atan2(y, x);
+
+ // Check if target is reachable
+ double max_reach = link1_ + link2_;
+ double min_reach = std::abs(link1_ - link2_);
+ RCLCPP_INFO(this->get_logger(), "3. reach_min=%.4f, reach_max=%.4f", min_reach, max_reach);
+
+ if (r > max_reach || r < min_reach) {
+ RCLCPP_ERROR(this->get_logger(), "e. target out of reach, aborting");
+ return false;
+ }
+
+ // Joint 2: cos(Joint2) = (r^2 - Link1^2 - Link2^2) / (2 * Link1 * Link2)
+ double r_squared = r * r;
+ double link1_squared = link1_ * link1_;
+ double link2_squared = link2_ * link2_;
+
+ double cos_joint2 = (r_squared - link1_squared - link2_squared) / (2.0 * link1_ * link2_);
+
+ RCLCPP_INFO(this->get_logger(),
+ "4. cos_joint2=(%.6f - %.6f - %.6f) / (2*%.3f*%.3f) = %.6f",
+ r_squared, link1_squared, link2_squared, link1_, link2_, cos_joint2
+ );
+
+ joint_2_ = std::acos(cos_joint2);
+ RCLCPP_INFO(this->get_logger(), "4. joint_2=%.6f rad", joint_2_);
+
+ // Joint 3: Joint3 = atan2(y, x) - atan2(Link2*sin(Joint2), Link1 + Link2*cos(Joint2))
+ double atan2_yx = std::atan2(y, x);
+ double link2_sin_j2 = link2_ * std::sin(joint_2_);
+ double link1_plus_link2_cos_joint2 = link1_ + link2_ * std::cos(joint_2_);
+ double atan2_term = std::atan2(link2_sin_j2, link1_plus_link2_cos_joint2);
+
+ RCLCPP_INFO(this->get_logger(), "5. atan2(%.2f, %.2f) = %.6f", y, x, atan2_yx);
+ RCLCPP_INFO(this->get_logger(), "5. atan2(%.3f*sin(%.6f), %.3f + %.3f*cos(%.6f))",
+ link2_, joint_2_, link1_, link2_, joint_2_
+ );
+ RCLCPP_INFO(this->get_logger(), "5. atan2(%.6f, %.6f) = %.6f",
+ link2_sin_j2, link1_plus_link2_cos_joint2, atan2_term
+ );
+
+ joint_3_ = atan2_yx - atan2_term;
+ RCLCPP_INFO(this->get_logger(), "5. joint_3=%.6f - %.6f=%.6f rad", atan2_yx, atan2_term, joint_3_);
+
+ // joints 4-6 related to gripper
+ joint_4_ = 0.0;
+ joint_5_ = 0.0;
+ joint_6_ = 0.0;
+
+ return true;
+ }
+
+ void publish_joint_state() {
+ auto joint_state = sensor_msgs::msg::JointState();
+ joint_state.header.stamp = this->get_clock()->now();
+
+ joint_state.name = {
+ "joint_1",
+ "joint_2",
+ "joint_3",
+ "joint_4",
+ "joint_5",
+ "joint_6"
+ };
+
+ joint_state.position = {
+ joint_1_,
+ joint_2_,
+ joint_3_,
+ joint_4_,
+ joint_5_,
+ joint_6_
+ };
+
+ joint_state_publisher_->publish(joint_state);
+ }
+};
+
+int main(int argc, char** argv) {
+ rclcpp::init(argc, argv);
+ auto node = std::make_shared();
+ rclcpp::spin(node);
+ rclcpp::shutdown();
+ return 0;
+}
diff --git a/src/robot_description/CMakeLists.txt b/src/robot_description/CMakeLists.txt
new file mode 100644
index 0000000..5dda467
--- /dev/null
+++ b/src/robot_description/CMakeLists.txt
@@ -0,0 +1,17 @@
+cmake_minimum_required(VERSION 3.8)
+project(robot_description)
+
+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)
+
+# Install directories
+install(
+ DIRECTORY launch meshes urdf rviz
+ DESTINATION share/${PROJECT_NAME}
+)
+
+ament_package()
diff --git a/src/robot_description/launch/display.launch.xml b/src/robot_description/launch/display.launch.xml
new file mode 100644
index 0000000..bc24810
--- /dev/null
+++ b/src/robot_description/launch/display.launch.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/robot_description/meshes/base_z_ob.stl b/src/robot_description/meshes/base_z_ob.stl
new file mode 100644
index 0000000..dfa501b
Binary files /dev/null and b/src/robot_description/meshes/base_z_ob.stl differ
diff --git a/src/robot_description/meshes/leftjaw.stl b/src/robot_description/meshes/leftjaw.stl
new file mode 100644
index 0000000..44babb8
Binary files /dev/null and b/src/robot_description/meshes/leftjaw.stl differ
diff --git a/src/robot_description/meshes/link_1.stl b/src/robot_description/meshes/link_1.stl
new file mode 100644
index 0000000..0850780
Binary files /dev/null and b/src/robot_description/meshes/link_1.stl differ
diff --git a/src/robot_description/meshes/link_2.stl b/src/robot_description/meshes/link_2.stl
new file mode 100644
index 0000000..6cc88ed
Binary files /dev/null and b/src/robot_description/meshes/link_2.stl differ
diff --git a/src/robot_description/meshes/link_3.stl b/src/robot_description/meshes/link_3.stl
new file mode 100644
index 0000000..c26ff03
Binary files /dev/null and b/src/robot_description/meshes/link_3.stl differ
diff --git a/src/robot_description/meshes/link_4.stl b/src/robot_description/meshes/link_4.stl
new file mode 100644
index 0000000..9ceff75
Binary files /dev/null and b/src/robot_description/meshes/link_4.stl differ
diff --git a/src/robot_description/meshes/link_5.stl b/src/robot_description/meshes/link_5.stl
new file mode 100644
index 0000000..e0a5cba
Binary files /dev/null and b/src/robot_description/meshes/link_5.stl differ
diff --git a/src/robot_description/meshes/link_5_gripper.stl b/src/robot_description/meshes/link_5_gripper.stl
new file mode 100644
index 0000000..89f9573
Binary files /dev/null and b/src/robot_description/meshes/link_5_gripper.stl differ
diff --git a/src/robot_description/meshes/readme.md b/src/robot_description/meshes/readme.md
new file mode 100644
index 0000000..a0fcb91
--- /dev/null
+++ b/src/robot_description/meshes/readme.md
@@ -0,0 +1 @@
+meshes to be used with lesson 1
diff --git a/src/robot_description/meshes/rightjaw.stl b/src/robot_description/meshes/rightjaw.stl
new file mode 100644
index 0000000..8ba9789
Binary files /dev/null and b/src/robot_description/meshes/rightjaw.stl differ
diff --git a/src/robot_description/package.xml b/src/robot_description/package.xml
new file mode 100644
index 0000000..2d02cbd
--- /dev/null
+++ b/src/robot_description/package.xml
@@ -0,0 +1,15 @@
+
+
+
+ robot_description
+ 0.0.0
+ TODO: Package description
+ wessel
+ TODO: License declaration
+
+ ament_cmake
+
+
+ ament_cmake
+
+
diff --git a/src/robot_description/rviz/display.rviz b/src/robot_description/rviz/display.rviz
new file mode 100644
index 0000000..630b469
--- /dev/null
+++ b/src/robot_description/rviz/display.rviz
@@ -0,0 +1,239 @@
+Panels:
+ - Class: rviz_common/Displays
+ Help Height: 85
+ Name: Displays
+ Property Tree Widget:
+ Expanded:
+ - /Global Options1
+ - /Status1
+ - /RobotModel1/Description Topic1
+ Splitter Ratio: 0.5
+ Tree Height: 517
+ - 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
+ - Class: rviz_common/Time
+ Experimental: false
+ Name: Time
+ SyncMode: 0
+ SyncSource: ""
+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
+ arm_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ base_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ elbow_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ forearm_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ hand_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ shoulder_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ tool_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ wrist_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ Mass Properties:
+ Inertia: false
+ Mass: false
+ Name: RobotModel
+ TF Prefix: ""
+ Update Interval: 0
+ Value: true
+ Visual Enabled: true
+ - Class: rviz_default_plugins/TF
+ Enabled: true
+ Filter (blacklist): ""
+ Filter (whitelist): ""
+ Frame Timeout: 15
+ Frames:
+ All Enabled: true
+ arm_link:
+ Value: true
+ base_link:
+ Value: true
+ elbow_link:
+ Value: true
+ forearm_link:
+ Value: true
+ hand_link:
+ Value: true
+ shoulder_link:
+ Value: true
+ tool_link:
+ Value: true
+ wrist_link:
+ Value: true
+ Marker Scale: 1
+ Name: TF
+ Show Arrows: true
+ Show Axes: true
+ Show Names: false
+ Tree:
+ base_link:
+ shoulder_link:
+ arm_link:
+ elbow_link:
+ forearm_link:
+ wrist_link:
+ hand_link:
+ tool_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
+ Covariance x: 0.25
+ Covariance y: 0.25
+ Covariance yaw: 0.06853891909122467
+ 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: 2.5
+ Enable Stereo Rendering:
+ Stereo Eye Separation: 0.05999999865889549
+ Stereo Focal Distance: 1
+ Swap Stereo Eyes: false
+ Value: false
+ Focal Point:
+ X: 0.0
+ Y: 0.0
+ Z: 0.5
+ Focal Shape Fixed Size: true
+ Focal Shape Size: 0.05000000074505806
+ Invert Z Axis: false
+ Name: Current View
+ Near Clip Distance: 0.009999999776482582
+ Pitch: 0.4
+ Target Frame:
+ Value: Orbit (rviz)
+ Yaw: 0.785
+ Saved: ~
+Window Geometry:
+ Displays:
+ collapsed: false
+ Height: 854
+ Hide Left Dock: false
+ Hide Right Dock: false
+ QMainWindow State: 000000ff00000000fd000000040000000000000160000002a3fc0200000008fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000006f00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c0061007900730100000048000002a3000000f300fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261000000010000010f000002a3fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a005600690065007700730000000048000002a3000000c500fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000004bd00000042fc0100000002fb0000000800540069006d00650100000000000004bd000002dc00fffffffb0000000800540069006d0065010000000000000450000000000000000000000356000002a300000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
+ Selection:
+ collapsed: false
+ Time:
+ collapsed: false
+ Tool Properties:
+ collapsed: false
+ Views:
+ collapsed: false
+ Width: 1213
+ X: 400
+ Y: 84
diff --git a/src/robot_description/rviz/readme.md b/src/robot_description/rviz/readme.md
new file mode 100644
index 0000000..39de2eb
--- /dev/null
+++ b/src/robot_description/rviz/readme.md
@@ -0,0 +1 @@
+rviz2 config file
diff --git a/src/robot_description/urdf/skyentific_robot.urdf.xacro b/src/robot_description/urdf/skyentific_robot.urdf.xacro
new file mode 100644
index 0000000..d449382
--- /dev/null
+++ b/src/robot_description/urdf/skyentific_robot.urdf.xacro
@@ -0,0 +1,263 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/robot_description/urdf/skyentific_robot_ros2_control.xacro b/src/robot_description/urdf/skyentific_robot_ros2_control.xacro
new file mode 100644
index 0000000..a678fc8
--- /dev/null
+++ b/src/robot_description/urdf/skyentific_robot_ros2_control.xacro
@@ -0,0 +1,50 @@
+
+
+
+
+ mock_components/GenericSystem
+
+
+
+
+ 0.0
+
+
+
+
+
+ 0.0
+
+
+
+
+
+ 0.0
+
+
+
+
+
+ 0.0
+
+
+
+
+
+ 0.0
+
+
+
+
+
+
+ mock_components/GenericSystem
+
+
+
+
+ 0.0
+
+
+
+