diff --git a/README.md b/README.md index 1114fce3..b6a697b9 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ git clone https://github.com/husarion/rosbot_ros src/rosbot_ros Building: ```bash -export HUSARION_ROS_BUILD=hardware +export HUSARION_ROS_BUILD_TYPE=hardware source /opt/ros/$ROS_DISTRO/setup.bash @@ -69,7 +69,7 @@ rm -r src/rosbot_ros/rosbot_gazebo sudo rosdep init rosdep update --rosdistro $ROS_DISTRO rosdep install -i --from-path src --rosdistro $ROS_DISTRO -y -colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release +colcon build --symlink-install --packages-up-to rosbot --cmake-args -DCMAKE_BUILD_TYPE=Release ``` Flash firmware: @@ -93,7 +93,7 @@ ros2 launch rosbot_bringup combined.launch.py Building: ```bash -export HUSARION_ROS_BUILD=simulation +export HUSARION_ROS_BUILD_TYPE=simulation source /opt/ros/$ROS_DISTRO/setup.bash @@ -106,7 +106,7 @@ cp -r src/ros2_controllers/imu_sensor_broadcaster src && rm -rf src/ros2_control sudo rosdep init rosdep update --rosdistro $ROS_DISTRO rosdep install -i --from-path src --rosdistro $ROS_DISTRO -y -colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release +colcon build --symlink-install --packages-up-to rosbot --cmake-args -DCMAKE_BUILD_TYPE=Release ``` Running: diff --git a/docker/.env b/docker/.env index 9a9566ef..05b532ca 100644 --- a/docker/.env +++ b/docker/.env @@ -1,2 +1 @@ -SERIAL_PORT=/dev/ttyUSB0 -ROS_NAMESPACE=robot1 +ROBOT_NAMESPACE=rosbot diff --git a/docker/Dockerfile b/docker/Dockerfile deleted file mode 100644 index 3dfb0f67..00000000 --- a/docker/Dockerfile +++ /dev/null @@ -1,29 +0,0 @@ -ARG ROS_DISTRO=humble - -FROM husarnet/ros:${ROS_DISTRO}-ros-base - -SHELL ["/bin/bash", "-c"] - -WORKDIR /ros2_ws - -COPY . src/ - -RUN apt-get update && apt-get install -y \ - python3-pip \ - stm32flash \ - ros-${ROS_DISTRO}-teleop-twist-keyboard - -RUN vcs import src < src/rosbot/rosbot_hardware.repos && \ - rm -r src/rosbot_gazebo - -# Create a script to install runtime dependencies for final image -RUN apt update && \ - rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} --reinstall --simulate -y --dependency-types exec >> /rosdep_install.sh && \ - chmod +x /rosdep_install.sh - -RUN apt update && \ - rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y && \ - source /opt/ros/$ROS_DISTRO/setup.bash && \ - colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release && \ - echo $(cat /ros2_ws/src/rosbot/package.xml | grep '' | sed -r 's/.*([0-9]+.[0-9]+.[0-9]+)<\/version>/\1/g') >> /version.txt && \ - rm -rf build log src diff --git a/docker/Dockerfile.hardware b/docker/Dockerfile.hardware new file mode 100644 index 00000000..19d85ec2 --- /dev/null +++ b/docker/Dockerfile.hardware @@ -0,0 +1,34 @@ +ARG ROS_DISTRO=humble + +FROM husarnet/ros:${ROS_DISTRO}-ros-core + +WORKDIR /ros2_ws + +ENV HUSARION_ROS_BUILD_TYPE=hardware + +COPY .. src/rosbot_ros + +RUN apt-get update && apt-get install -y \ + python3-pip \ + ros-dev-tools \ + stm32flash \ + ros-${ROS_DISTRO}-teleop-twist-keyboard && \ + # Setup workspace + vcs import src < src/rosbot_ros/rosbot/rosbot_hardware.repos && \ + rm -r src/rosbot_ros/rosbot_gazebo && \ + # Install dependencies + rosdep init && \ + rosdep update --rosdistro $ROS_DISTRO && \ + rosdep install --from-paths src -y -i && \ + # Build + source /opt/ros/$ROS_DISTRO/setup.bash && \ + colcon build --symlink-install --packages-up-to rosbot --cmake-args -DCMAKE_BUILD_TYPE=Release && \ + # Get version + echo $(cat /ros2_ws/src/rosbot/package.xml | grep '' | sed -r 's/.*([0-9]+.[0-9]+.[0-9]+)<\/version>/\1/g') >> /version.txt && \ + # Size optimization + export SUDO_FORCE_REMOVE=yes && \ + apt-get remove -y \ + ros-dev-tools && \ + apt-get autoremove -y && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* diff --git a/docker/Dockerfile.simulation b/docker/Dockerfile.simulation new file mode 100644 index 00000000..dc90ab5b --- /dev/null +++ b/docker/Dockerfile.simulation @@ -0,0 +1,35 @@ +ARG ROS_DISTRO=humble + +FROM husarnet/ros:${ROS_DISTRO}-ros-core + +WORKDIR /ros2_ws + +ENV HUSARION_ROS_BUILD_TYPE=simulation + +COPY .. src/rosbot_ros + +RUN apt-get update && apt-get install -y \ + python3-pip \ + ros-dev-tools \ + stm32flash \ + ros-${ROS_DISTRO}-teleop-twist-keyboard && \ + # Setup workspace + vcs import src < src/rosbot_ros/rosbot/rosbot_hardware.repos && \ + vcs import src < src/rosbot_ros/rosbot/rosbot_simulation.repos && \ + cp -r src/ros2_controllers/imu_sensor_broadcaster src && rm -rf src/ros2_controllers && \ + # Install dependencies + rosdep init && \ + rosdep update --rosdistro $ROS_DISTRO && \ + rosdep install --from-paths src -y -i && \ + # Build + source /opt/ros/$ROS_DISTRO/setup.bash && \ + colcon build --symlink-install --packages-up-to rosbot --cmake-args -DCMAKE_BUILD_TYPE=Release && \ + # Get version + echo $(cat /ros2_ws/src/rosbot/package.xml | grep '' | sed -r 's/.*([0-9]+.[0-9]+.[0-9]+)<\/version>/\1/g') >> /version.txt && \ + # Size optimization + export SUDO_FORCE_REMOVE=yes && \ + apt-get remove -y \ + ros-dev-tools && \ + apt-get autoremove -y && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* \ No newline at end of file diff --git a/docker/compose.hardware.yaml b/docker/compose.hardware.yaml new file mode 100644 index 00000000..3ebcf58e --- /dev/null +++ b/docker/compose.hardware.yaml @@ -0,0 +1,22 @@ +# Quick Start +# +# 1. Run `docker compose -f compose.hardware.yaml up` on the ROSbot +# 2. Open a shell inside a docker container `docker compose -f compose.hardware.yaml exec -it rosbot bash` +# 3. Run `ros2 run teleop_twist_keyboard teleop_twist_keyboard` inside the container + +services: + rosbot: + build: + context: .. + dockerfile: docker/Dockerfile.hardware + network_mode: host + ipc: host + restart: unless-stopped + devices: + - ${SERIAL_PORT:-/dev/ttyUSB0} + - /dev/bus/usb/ # FTDI + command: > + ros2 launch rosbot_bringup combined.launch.py + mecanum:=${MECANUM:-False} + namespace:=${ROBOT_NAMESPACE:-rosbot} + serial_port:=${SERIAL_PORT:-/dev/ttyUSB0} diff --git a/docker/compose.simulation.yaml b/docker/compose.simulation.yaml new file mode 100644 index 00000000..9194cda1 --- /dev/null +++ b/docker/compose.simulation.yaml @@ -0,0 +1,32 @@ +# Quick Start +# +# 1. Run `xhost +local:docker && docker compose -f compose.simulation.yaml up` on the laptop +# (optionally you can chang `gpu-config` -> `cpu config`). +# 2. Open a shell inside a docker container `docker compose -f compose.simulation.yaml exec -it rosbot bash` +# 3. Run `ros2 run teleop_twist_keyboard teleop_twist_keyboard` inside the container + +x-gpu-config: + &gpu-config + runtime: nvidia + environment: + - DISPLAY=${DISPLAY:?err} + - NVIDIA_VISIBLE_DEVICES=all + - NVIDIA_DRIVER_CAPABILITIES=all + +x-cpu-config: + &cpu-config + environment: + - DISPLAY=${DISPLAY:?err} + +services: + rosbot: + build: + context: .. + dockerfile: docker/Dockerfile.simulation + network_mode: host + ipc: host + <<: [ *gpu-config] + command: > + ros2 launch rosbot_gazebo simulation.launch.py + mecanum:=${MECANUM:-False} + namespace:=${ROBOT_NAMESPACE:-rosbot} diff --git a/docker/compose.yaml b/docker/compose.yaml deleted file mode 100644 index fb9aaf96..00000000 --- a/docker/compose.yaml +++ /dev/null @@ -1,19 +0,0 @@ -services: - rosbot: - build: - context: .. - dockerfile: docker/Dockerfile - network_mode: host - ipc: host - devices: - - ${SERIAL_PORT:?err} - - /dev/bus/usb/ # FTDI - # environment: - # - ROS_NAMESPACE - # command: tail -f /dev/null - command: > - ros2 launch rosbot_bringup combined.launch.py - mecanum:=${MECANUM:-False} - serial_port:=$SERIAL_PORT - serial_baudrate:=576000 - # namespace:=${ROS_NAMESPACE:-rosbot} diff --git a/docker/justfile b/docker/justfile index 50fbe34d..0e6f5ef4 100644 --- a/docker/justfile +++ b/docker/justfile @@ -13,7 +13,7 @@ alias teleop := run-teleop-docker # run teleop_twist_keybaord (inside rviz2 container) run-teleop-docker: _run-as-user #!/bin/bash - docker compose exec rosbot /bin/bash -c "/ros_entrypoint.sh ros2 run teleop_twist_keyboard teleop_twist_keyboard --ros-args -r __ns:=/${ROS_NAMESPACE}" + docker compose exec rosbot /bin/bash -c "/ros_entrypoint.sh ros2 run teleop_twist_keyboard teleop_twist_keyboard --ros-args -r __ns:=/${ROBOT_NAMESPACE}" flash-firmware: _install-yq _run-as-user #!/bin/bash @@ -29,9 +29,9 @@ flash-firmware: _install-yq _run-as-user gpio_chip=/dev/gpiochip4 serial_port=/dev/ttyS4 else - echo "Probably user laptop" + echo "Probably user computer" gpio_chip=/dev/bus/usb - serial_port=$SERIAL_PORT + serial_port=/dev/ttyUSB0 enable_usb="--usb" fi @@ -42,13 +42,13 @@ flash-firmware: _install-yq _run-as-user docker-rosbot \ ros2 run rosbot_utils flash_firmware ${enable_usb} -run: +run_hardware: #/bin/bash - docker compose up + docker compose -f compose.hardware.yaml up -build: +build_hardware: #/bin/bash - docker compose build + docker compose -f compose.hardware.yaml build _run-as-root: #!/bin/bash diff --git a/rosbot/package.xml b/rosbot/package.xml index 6533fef6..7bfc85c3 100644 --- a/rosbot/package.xml +++ b/rosbot/package.xml @@ -18,9 +18,8 @@ rosbot_bringup rosbot_controller rosbot_description - rosbot_utils - - rosbot_gazebo + rosbot_gazebo + rosbot_utils ament_cmake