diff --git a/CMakeLists.txt b/CMakeLists.txt
deleted file mode 100644
index 6da01b4..0000000
--- a/CMakeLists.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-cmake_minimum_required(VERSION 3.8)
-project(my_robot)
-
-find_package(ament_cmake REQUIRED)
-find_package(ament_cmake_python REQUIRED)
-
-ament_python_install_package(${PROJECT_NAME})
-
-ament_package()
diff --git a/Dockerfile b/Dockerfile
index 51cbf14..b3b010b 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -3,25 +3,18 @@
# ── Stage 1: build ────────────────────────────────────────────────────────────
FROM ros:kilted AS builder
+SHELL ["/bin/bash", "-c"]
+
RUN apt-get update && apt-get install -y --no-install-recommends \
python3-colcon-common-extensions \
- python3-pip \
- ros-${ROS_DISTRO}-ament-cmake-python \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /ws
-# Install the vendored Raspbot hardware library
-COPY raspbot_v2_interface/ raspbot_v2_interface/
-# PEP 668: newer Debian/Ubuntu marks the system Python as externally managed and blocks pip
-# by default. --break-system-packages overrides this; safe here as the container is isolated.
-RUN pip3 install --no-cache-dir --break-system-packages ./raspbot_v2_interface
-
# Copy the ROS package into the standard colcon src/ layout and build it
-COPY package.xml setup.py setup.cfg CMakeLists.txt src/my_robot/
-COPY my_robot/ src/my_robot/my_robot/
+COPY src/my_robot/ src/my_robot/
-RUN . /opt/ros/${ROS_DISTRO}/setup.sh && \
+RUN source /opt/ros/${ROS_DISTRO}/setup.bash && \
colcon build --packages-select my_robot
# ── Stage 2: runtime ──────────────────────────────────────────────────────────
@@ -31,10 +24,13 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
ros-${ROS_DISTRO}-rclpy \
ros-${ROS_DISTRO}-geometry-msgs \
ros-${ROS_DISTRO}-std-msgs \
+ python3-smbus \
&& rm -rf /var/lib/apt/lists/*
-# Bring across the installed Raspbot library and the built ROS overlay
-COPY --from=builder /usr/local/lib /usr/local/lib
+# Install the Raspbot hardware library directly into site-packages
+COPY raspbot_v2_interface/ /usr/local/lib/python3.12/dist-packages/raspbot_v2_interface/
+
+# Bring across the built ROS overlay
COPY --from=builder /ws/install /ws/install
# Source both ROS base and the workspace overlay on every shell/exec
diff --git a/my_robot/__init__.py b/src/my_robot/my_robot/__init__.py
similarity index 100%
rename from my_robot/__init__.py
rename to src/my_robot/my_robot/__init__.py
diff --git a/my_robot/motor_controller_node.py b/src/my_robot/my_robot/motor_controller_node.py
similarity index 99%
rename from my_robot/motor_controller_node.py
rename to src/my_robot/my_robot/motor_controller_node.py
index 7d07d8a..777431a 100644
--- a/my_robot/motor_controller_node.py
+++ b/src/my_robot/my_robot/motor_controller_node.py
@@ -1,3 +1,4 @@
+#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
from geometry_msgs.msg import Twist
diff --git a/package.xml b/src/my_robot/package.xml
similarity index 81%
rename from package.xml
rename to src/my_robot/package.xml
index 9ab40c3..e5fe654 100644
--- a/package.xml
+++ b/src/my_robot/package.xml
@@ -10,8 +10,11 @@
geometry_msgs
std_msgs
- ament_cmake
- ament_cmake_python
+ ament_python
+
+
+ ament_python
+
ament_copyright
ament_flake8
ament_pep257
diff --git a/src/my_robot/resource/my_robot b/src/my_robot/resource/my_robot
new file mode 100644
index 0000000..e69de29
diff --git a/setup.cfg b/src/my_robot/setup.cfg
similarity index 100%
rename from setup.cfg
rename to src/my_robot/setup.cfg
diff --git a/setup.py b/src/my_robot/setup.py
similarity index 67%
rename from setup.py
rename to src/my_robot/setup.py
index 4a9e3d1..1934ed2 100644
--- a/setup.py
+++ b/src/my_robot/setup.py
@@ -6,6 +6,10 @@ setup(
name=package_name,
version='0.0.1',
packages=[package_name],
+ data_files=[
+ ('share/ament_index/resource_index/packages', ['resource/' + package_name]),
+ ('share/' + package_name, ['package.xml']),
+ ],
install_requires=['setuptools'],
zip_safe=True,
entry_points={