diff --git a/README.md b/README.md index da06b89..674ac0f 100644 --- a/README.md +++ b/README.md @@ -77,26 +77,13 @@ Add the following to your `~/.bashrc` (adjust the variables for your setup): ``` export ROS_DOMAIN_ID=73 # any free domain id export ROS_DISTRO=jazzy # {jazzy, humble} -export MOVENSYS_ROS_VERSION=isaac-ros_4.1 # {isaac-ros_4.1, isaac-ros_3.2, general} export CPU_ARCH=amd64 # {amd64, arm64} -export NAVIGATION_MODEL=diffbot # {diffbot} - -export HOST_USER_UID=$(id -u) -export HOST_USER_GID=$(id -g) export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp -export MOVENSYS_NAVIGATION_PACKAGES=~/workspaces/movensys_ws/src/movensys-navigation -export ISAAC_ROS_WS=~/workspaces/isaac_ros-dev +export MOVENSYS_ROS_VERSION=isaac-ros_4.1 # {general, isaac-ros_4.1, isaac-ros_3.2} +export NAVIGATION_MODEL=diffbot # {diffbot} -nros() { - if [ $# -eq 0 ]; then - docker exec -it -u admin movensys_navigation_container \ - bash -lc 'source /opt/ros/${ROS_DISTRO}/setup.bash && source /home/admin/workspaces/movensys_ws/install/setup.bash && exec bash -i' - else - docker exec -it -u admin movensys_navigation_container \ - bash -lc "source /opt/ros/\${ROS_DISTRO}/setup.bash && source /home/admin/workspaces/movensys_ws/install/setup.bash && $*" - fi -} +source ~/workspaces/movensys_ws/src/movensys-navigation/docker/nros.bash ``` ``` @@ -128,7 +115,7 @@ git clone https://github.com/movensys/movensys-navigation.git ### 4. Build and start the container ``` -cd ${MOVENSYS_NAVIGATION_PACKAGES}/docker +cd ~/workspaces/movensys_ws/src/movensys-navigation/docker docker compose -f ${MOVENSYS_ROS_VERSION}.yaml -f movensys_navigation.${CPU_ARCH}.yaml down docker compose -f ${MOVENSYS_ROS_VERSION}.yaml -f movensys_navigation.${CPU_ARCH}.yaml build docker compose -f ${MOVENSYS_ROS_VERSION}.yaml -f movensys_navigation.${CPU_ARCH}.yaml up -d diff --git a/doc/1_setup.md b/doc/1_setup.md index 9daabcf..ed99e81 100644 --- a/doc/1_setup.md +++ b/doc/1_setup.md @@ -1,30 +1,16 @@ # Host Environment Setup -## 1. Bashrc Configuration -- Add the following environment variables to your `~/.bashrc`: +## 1. Bashrc Configuration [~/.bashrc] ``` export ROS_DOMAIN_ID=73 #use any number export ROS_DISTRO=jazzy #support {jazzy, humble} -export MOVENSYS_ROS_VERSION=isaac-ros_4.1 #support {isaac-ros_4.1, isaac-ros_3.2, general} export CPU_ARCH=amd64 #support {amd64, arm64} -export NAVIGATION_MODEL=diffbot #support {diffbot} - -export HOST_USER_UID=$(id -u) -export HOST_USER_GID=$(id -g) export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp -export MOVENSYS_NAVIGATION_PACKAGES=~/workspaces/movensys_ws/src/movensys-navigation -export ISAAC_ROS_WS=~/workspaces/isaac_ros-dev +export MOVENSYS_ROS_VERSION=isaac-ros_4.1 #support {general, isaac-ros_4.1, isaac-ros_3.2} +export NAVIGATION_MODEL=diffbot #support {diffbot} -nros() { - if [ $# -eq 0 ]; then - docker exec -it -u admin movensys_navigation_container \ - bash -lc 'source /opt/ros/${ROS_DISTRO}/setup.bash && source /home/admin/workspaces/movensys_ws/install/setup.bash && exec bash -i' - else - docker exec -it -u admin movensys_navigation_container \ - bash -lc "source /opt/ros/\${ROS_DISTRO}/setup.bash && source /home/admin/workspaces/movensys_ws/install/setup.bash && $*" - fi -} +source ~/workspaces/movensys_ws/src/movensys-navigation/docker/nros.bash ``` ``` xhost +local:docker @@ -44,7 +30,7 @@ sudo sysctl -p /etc/sysctl.d/99-network-buffers.conf sysctl net.core.rmem_max net.core.rmem_default net.core.wmem_max net.core.wmem_default ``` -## 4. Clone Repository +## 3. Clone Repository ``` mkdir -p ~/workspaces/movensys_ws/src cd ~/workspaces/movensys_ws/src diff --git a/doc/2_docker.md b/doc/2_docker.md index 86dad49..3f3bf65 100644 --- a/doc/2_docker.md +++ b/doc/2_docker.md @@ -5,10 +5,10 @@ please follow this isaac-ros setup first: # 2. Docker setup ``` -cd ${MOVENSYS_NAVIGATION_PACKAGES}/docker +cd ~/workspaces/movensys_ws/src/movensys-navigation/docker docker compose -f ${MOVENSYS_ROS_VERSION}.yaml -f movensys_navigation.${CPU_ARCH}.yaml down docker compose -f ${MOVENSYS_ROS_VERSION}.yaml -f movensys_navigation.${CPU_ARCH}.yaml build -docker compose -f ${MOVENSYS_ROS_VERSION}.yaml -f movensys_navigation.${CPU_ARCH}.yaml up -d +docker compose -f ${MOVENSYS_ROS_VERSION}.yaml -f movensys_navigation.${CPU_ARCH}.yaml up -d ``` # 3. Checking Docker diff --git a/docker/.env b/docker/.env index f2a8f90..57a55ae 100644 --- a/docker/.env +++ b/docker/.env @@ -1,4 +1,6 @@ CONTAINER_NAME=movensys_navigation_container IMAGE_NAME=movensys_navigation_image -CYCLONEDDS_DIR=${MOVENSYS_NAVIGATION_PACKAGES}/docker/cyclonedds.xml -USER=admin + +MOVENSYS_NAVIGATION_PACKAGES=.. +ISAAC_ROS_WS=../../../../isaac_ros-dev +CYCLONEDDS_DIR=./cyclonedds.xml diff --git a/docker/general.yaml b/docker/general.yaml index 3f259b3..8aa388c 100644 --- a/docker/general.yaml +++ b/docker/general.yaml @@ -1,3 +1,5 @@ +name: movensys_navigation + services: movensys_navigation: restart: unless-stopped @@ -7,8 +9,6 @@ services: network: host args: - ROS_DISTRO=${ROS_DISTRO:-humble} - - HOST_USER_UID=${HOST_USER_UID:-1000} - - HOST_USER_GID=${HOST_USER_GID:-1000} image: ${IMAGE_NAME} container_name: ${CONTAINER_NAME} privileged: true @@ -20,9 +20,7 @@ services: tty: true environment: - ROS_DOMAIN_ID=${ROS_DOMAIN_ID} - - HOST_USER_UID=${HOST_USER_UID} - - HOST_USER_GID=${HOST_USER_GID} - - USER=${USER} + - USER=admin - RMW_IMPLEMENTATION=${RMW_IMPLEMENTATION} - CYCLONEDDS_URI=file:///home/admin/workspaces/cyclonedds.xml - DISPLAY @@ -38,7 +36,23 @@ services: devices: - /dev/dri command: ["/bin/bash","-lc", - "sudo chown -R admin:admin /home/admin/workspaces/movensys_ws && \ + "SRC=/home/admin/workspaces/movensys_ws/src/movensys-navigation && \ + DDS=/home/admin/workspaces/cyclonedds.xml && \ + HOST_UID=$$(stat -c %u $$SRC) && HOST_GID=$$(stat -c %g $$SRC) && \ + if [ \"$$HOST_UID\" = 0 ]; then \ + echo \"WARN: $$SRC is root-owned, keeping admin $$(id -u admin):$$(id -g admin)\"; \ + HOST_UID=$$(id -u admin); HOST_GID=$$(id -g admin); fi && \ + echo ====== Map admin to host $$HOST_UID:$$HOST_GID ======= && \ + if [ \"$$HOST_GID\" != \"$$(id -g admin)\" ]; then \ + sudo groupmod -g $$HOST_GID admin \ + || echo \"NOTE: groupmod reported an error, continuing\"; fi && \ + if [ \"$$HOST_UID\" != \"$$(id -u admin)\" ]; then \ + sudo usermod -u $$HOST_UID admin \ + || echo \"NOTE: usermod home chown skipped (read-only mounts)\"; fi && \ + sudo find /home/admin -xdev \ + -path $$SRC -prune -o -path $$DDS -prune -o \ + ! -user admin -exec chown -h admin:admin {} + \ + || echo \"WARN: ownership fixup under /home/admin incomplete\" && \ source /opt/ros/${ROS_DISTRO}/setup.bash && \ cd /home/admin/workspaces/movensys_ws/src && \ diff --git a/docker/isaac-ros_3.2.yaml b/docker/isaac-ros_3.2.yaml index ea13498..dd54b71 100644 --- a/docker/isaac-ros_3.2.yaml +++ b/docker/isaac-ros_3.2.yaml @@ -1,3 +1,5 @@ +name: movensys_navigation + services: movensys_navigation: restart: unless-stopped @@ -14,14 +16,22 @@ services: ipc: host runtime: nvidia working_dir: /home/admin/workspaces/movensys_ws - entrypoint: ["/usr/local/bin/scripts/workspace-entrypoint.sh"] + entrypoint: + - /bin/bash + - -c + - | + SRC=/home/admin/workspaces/movensys_ws/src/movensys-navigation + HOST_USER_UID=$$(stat -c %u $$SRC 2>/dev/null || echo 1000) + HOST_USER_GID=$$(stat -c %g $$SRC 2>/dev/null || echo 1000) + if [ "$$HOST_USER_UID" = 0 ]; then HOST_USER_UID=1000; HOST_USER_GID=1000; fi + export HOST_USER_UID HOST_USER_GID + exec /usr/local/bin/scripts/workspace-entrypoint.sh "$$@" + - -- stdin_open: true tty: true environment: - ROS_DOMAIN_ID=${ROS_DOMAIN_ID} - - HOST_USER_UID=${HOST_USER_UID} - - HOST_USER_GID=${HOST_USER_GID} - - USER=${USER} + - USER=admin - RMW_IMPLEMENTATION=${RMW_IMPLEMENTATION} - ISAAC_ROS_WS=/home/admin/workspaces/isaac_ros-dev - CYCLONEDDS_URI=file:///home/admin/workspaces/cyclonedds.xml @@ -47,7 +57,24 @@ services: - | set -e [ -f ~/.bashrc ] && source ~/.bashrc || true - sudo chown -R admin:admin /home/admin/workspaces/movensys_ws + SRC=/home/admin/workspaces/movensys_ws/src/movensys-navigation + DDS=/home/admin/workspaces/cyclonedds.xml + HOST_UID=$$(stat -c %u $$SRC); HOST_GID=$$(stat -c %g $$SRC) + if [ "$$HOST_UID" = 0 ]; then + echo "WARN: $$SRC is root-owned, keeping admin $$(id -u admin):$$(id -g admin)" + HOST_UID=$$(id -u admin); HOST_GID=$$(id -g admin) + fi + echo ====== Map admin to host $$HOST_UID:$$HOST_GID ======= + if [ "$$HOST_GID" != "$$(id -g admin)" ]; then + sudo groupmod -g $$HOST_GID admin || echo "NOTE: groupmod reported an error, continuing" + fi + if [ "$$HOST_UID" != "$$(id -u admin)" ]; then + sudo usermod -u $$HOST_UID admin || echo "NOTE: usermod home chown skipped (read-only mounts)" + fi + sudo find /home/admin -xdev \ + -path $$SRC -prune -o -path $$DDS -prune -o \ + ! -user admin -exec chown -h admin:admin {} + \ + || echo "WARN: ownership fixup under /home/admin incomplete" source /opt/ros/humble/setup.bash echo "ISAAC_ROS_WS=$$ISAAC_ROS_WS" diff --git a/docker/isaac-ros_4.1.yaml b/docker/isaac-ros_4.1.yaml index d8fe7cc..ccd5cc9 100644 --- a/docker/isaac-ros_4.1.yaml +++ b/docker/isaac-ros_4.1.yaml @@ -1,3 +1,5 @@ +name: movensys_navigation + services: movensys_navigation: restart: unless-stopped @@ -14,14 +16,22 @@ services: ipc: host runtime: nvidia working_dir: /home/admin/workspaces/movensys_ws - entrypoint: ["/usr/local/bin/scripts/workspace-entrypoint.sh"] + entrypoint: + - /bin/bash + - -c + - | + SRC=/home/admin/workspaces/movensys_ws/src/movensys-navigation + HOST_USER_UID=$$(stat -c %u $$SRC 2>/dev/null || echo 1000) + HOST_USER_GID=$$(stat -c %g $$SRC 2>/dev/null || echo 1000) + if [ "$$HOST_USER_UID" = 0 ]; then HOST_USER_UID=1000; HOST_USER_GID=1000; fi + export HOST_USER_UID HOST_USER_GID + exec /usr/local/bin/scripts/workspace-entrypoint.sh "$$@" + - -- stdin_open: true tty: true environment: - ROS_DOMAIN_ID=${ROS_DOMAIN_ID} - - HOST_USER_UID=${HOST_USER_UID} - - HOST_USER_GID=${HOST_USER_GID} - - USER=${USER} + - USER=admin - RMW_IMPLEMENTATION=${RMW_IMPLEMENTATION} - ISAAC_ROS_WS=/home/admin/workspaces/isaac_ros-dev - CYCLONEDDS_URI=file:///home/admin/workspaces/cyclonedds.xml @@ -42,7 +52,23 @@ services: devices: - /dev/dri command: ["/bin/bash","-lc", - "sudo chown -R admin:admin /home/admin/workspaces/movensys_ws && \ + "SRC=/home/admin/workspaces/movensys_ws/src/movensys-navigation && \ + DDS=/home/admin/workspaces/cyclonedds.xml && \ + HOST_UID=$$(stat -c %u $$SRC) && HOST_GID=$$(stat -c %g $$SRC) && \ + if [ \"$$HOST_UID\" = 0 ]; then \ + echo \"WARN: $$SRC is root-owned, keeping admin $$(id -u admin):$$(id -g admin)\"; \ + HOST_UID=$$(id -u admin); HOST_GID=$$(id -g admin); fi && \ + echo ====== Map admin to host $$HOST_UID:$$HOST_GID ======= && \ + if [ \"$$HOST_GID\" != \"$$(id -g admin)\" ]; then \ + sudo groupmod -g $$HOST_GID admin \ + || echo \"NOTE: groupmod reported an error, continuing\"; fi && \ + if [ \"$$HOST_UID\" != \"$$(id -u admin)\" ]; then \ + sudo usermod -u $$HOST_UID admin \ + || echo \"NOTE: usermod home chown skipped (read-only mounts)\"; fi && \ + sudo find /home/admin -xdev \ + -path $$SRC -prune -o -path $$DDS -prune -o \ + ! -user admin -exec chown -h admin:admin {} + \ + || echo \"WARN: ownership fixup under /home/admin incomplete\" && \ source /opt/ros/jazzy/setup.bash && \ cd /home/admin/workspaces/movensys_ws/src && \ diff --git a/docker/nros.bash b/docker/nros.bash new file mode 100644 index 0000000..59e7274 --- /dev/null +++ b/docker/nros.bash @@ -0,0 +1,18 @@ +MOVENSYS_NAVIGATION_CONTAINER="${MOVENSYS_NAVIGATION_CONTAINER:-movensys_navigation_container}" +MOVENSYS_NAVIGATION_WORKSPACE="${MOVENSYS_NAVIGATION_WORKSPACE:-/home/admin/workspaces/movensys_ws}" + +nros() { + local flags=(-i) + [ -t 0 ] && flags=(-it) + + local setup='source /opt/ros/${ROS_DISTRO}/setup.bash' + setup="${setup} && source ${MOVENSYS_NAVIGATION_WORKSPACE}/install/setup.bash" + + if [ $# -eq 0 ]; then + docker exec "${flags[@]}" -u admin "${MOVENSYS_NAVIGATION_CONTAINER}" \ + bash -lc "${setup} && exec bash -i" + else + docker exec "${flags[@]}" -u admin "${MOVENSYS_NAVIGATION_CONTAINER}" \ + bash -lc "${setup} && \"\$@\"" nros "$@" + fi +}