From 8d80073c803719bf44fbcc154db0710754c7cf07 Mon Sep 17 00:00:00 2001 From: nchan18 Date: Tue, 17 Sep 2024 22:41:48 -0400 Subject: [PATCH 1/5] version bump --- .devcontainer/devcontainer.json | 2 +- .devcontainer/init.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 842aaad..2fdd5e6 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,6 +1,6 @@ { "name": "DevEnv", - "image": "ghcr.io/roboeagles4828/developer-environment:7", + "image": "ghcr.io/roboeagles4828/developer-environment:8", "workspaceMount": "source=${localWorkspaceFolder},target=/workspace/DevEnv,type=bind", "workspaceFolder": "/workspace/DevEnv", "containerEnv": { diff --git a/.devcontainer/init.sh b/.devcontainer/init.sh index d216d3c..150c1e0 100644 --- a/.devcontainer/init.sh +++ b/.devcontainer/init.sh @@ -1,5 +1,5 @@ #!/bin/bash # Pull the actual image so it is saved locally -docker pull ghcr.io/roboeagles4828/developer-environment:7 +docker pull ghcr.io/roboeagles4828/developer-environment:8 mkdir -p ~/docker/vscode echo "Display to use: $DISPLAY" From fa5c9166bb2797f41675e582b4c50c8c3b643e96 Mon Sep 17 00:00:00 2001 From: nchan18 Date: Tue, 17 Sep 2024 23:37:28 -0400 Subject: [PATCH 2/5] crlf to lf --- .devcontainer/init.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.devcontainer/init.sh b/.devcontainer/init.sh index 150c1e0..985648d 100644 --- a/.devcontainer/init.sh +++ b/.devcontainer/init.sh @@ -1,5 +1,5 @@ -#!/bin/bash -# Pull the actual image so it is saved locally -docker pull ghcr.io/roboeagles4828/developer-environment:8 -mkdir -p ~/docker/vscode -echo "Display to use: $DISPLAY" +#!/bin/bash +# Pull the actual image so it is saved locally +docker pull ghcr.io/roboeagles4828/developer-environment:8 +mkdir -p ~/docker/vscode +echo "Display to use: $DISPLAY" From 21f7a4fd69741f0388eefb7971c4bb17b387590f Mon Sep 17 00:00:00 2001 From: nchan18 Date: Wed, 1 Jan 2025 16:02:28 -0500 Subject: [PATCH 3/5] jazzy migration --- .devcontainer/devcontainer.json | 5 +- .devcontainer/init.sh | 2 +- .devcontainer/postCreate.sh | 10 +- .devcontainer/postStart.sh | 26 - .gitattributes | 1 - .gitignore | 2 - ...1fd538b6-d6eb-4c5d-9643-9fe0b2226647.vsidx | Bin 141676 -> 0 bytes .vs/DevEnv/config/applicationhost.config | 1026 ----------------- .vs/DevEnv/v17/.wsuo | Bin 18944 -> 0 bytes .vs/ProjectSettings.json | 3 - .vs/VSWorkspaceState.json | 8 - .vs/slnx.sqlite | Bin 90112 -> 0 bytes .vscode/settings.json | 12 +- .wslconfig | 2 - README.md | 22 +- code-setup.ps1 | 44 - docker/developer-isaac-ros/Dockerfile | 76 -- docker/developer-isaac-ros/README.md | 13 - docker/developer-isaac-ros/build | 30 - .../config/rtps_udp_profile.xml | 30 - docker/developer-isaac-ros/entrypoint.sh | 6 - .../install-scripts/install-isaac-pkgs | 16 - docker/developer-zed/Dockerfile | 111 -- docker/developer-zed/build | 24 - docker/developer-zed/ros_entrypoint_jetson.sh | 17 - docker/developer/Dockerfile | 121 -- docker/developer/README.md | 18 - docker/developer/build | 32 - docker/developer/config/rtps_udp_profile.xml | 30 - .../developer/install-scripts/install-common | 180 --- .../developer/install-scripts/install-docker | 15 - .../developer/install-scripts/install-rosdeps | 11 - docker/developer/install-scripts/install-rtab | 20 - docker/isaac-sim/Dockerfile | 7 - docker/isaac-sim/build | 23 - docker/jetson-isaac-ros/Dockerfile | 1 - docker/jetson-isaac-ros/README.md | 1 - docker/jetson-zed/Dockerfile | 88 -- docker/jetson-zed/build | 24 - docker/jetson-zed/config/rtps_udp_profile.xml | 30 - docker/jetson-zed/ros_entrypoint_jetson.sh | 17 - docker/jetson/README.md | 1 - docker/jetson/build | 42 - docker/jetson/entrypoint.sh | 4 - docker/vision-devel/Dockerfile | 41 - docker/vision-devel/build | 23 - isaac.bat | 4 - isaac_setup.ps1 | 21 - .../read.lock => jazzy_ws/src/README.MD | 0 scripts/config/SN39192289.conf | 129 --- scripts/config/remote-config | 6 - scripts/config/remote-config-orin | 6 - scripts/dds-ping | 4 - scripts/launch | 8 - scripts/local-setup.sh | 71 -- scripts/quickpub.py | 47 - scripts/real-startup/README.md | 0 scripts/real-startup/jetson/startup.sh | 3 - scripts/real-startup/jetson/stop.sh | 3 - scripts/real-startup/pi/edna.service | 15 - scripts/real-startup/pi/post-recieve | 5 - scripts/real-startup/pi/startup.sh | 7 - scripts/remote | 242 ---- scripts/remote-rebuild | 72 -- scripts/restart-ros2 | 3 - scripts/tests | 7 - scripts/yolo | 0 67 files changed, 14 insertions(+), 2854 deletions(-) delete mode 100644 .devcontainer/postStart.sh delete mode 100644 .gitattributes delete mode 100644 .gitignore delete mode 100644 .vs/DevEnv/FileContentIndex/1fd538b6-d6eb-4c5d-9643-9fe0b2226647.vsidx delete mode 100644 .vs/DevEnv/config/applicationhost.config delete mode 100644 .vs/DevEnv/v17/.wsuo delete mode 100644 .vs/ProjectSettings.json delete mode 100644 .vs/VSWorkspaceState.json delete mode 100644 .vs/slnx.sqlite delete mode 100644 .wslconfig delete mode 100644 code-setup.ps1 delete mode 100644 docker/developer-isaac-ros/Dockerfile delete mode 100644 docker/developer-isaac-ros/README.md delete mode 100644 docker/developer-isaac-ros/build delete mode 100644 docker/developer-isaac-ros/config/rtps_udp_profile.xml delete mode 100644 docker/developer-isaac-ros/entrypoint.sh delete mode 100644 docker/developer-isaac-ros/install-scripts/install-isaac-pkgs delete mode 100644 docker/developer-zed/Dockerfile delete mode 100644 docker/developer-zed/build delete mode 100644 docker/developer-zed/ros_entrypoint_jetson.sh delete mode 100644 docker/developer/Dockerfile delete mode 100644 docker/developer/README.md delete mode 100755 docker/developer/build delete mode 100644 docker/developer/config/rtps_udp_profile.xml delete mode 100644 docker/developer/install-scripts/install-common delete mode 100644 docker/developer/install-scripts/install-docker delete mode 100644 docker/developer/install-scripts/install-rosdeps delete mode 100644 docker/developer/install-scripts/install-rtab delete mode 100644 docker/isaac-sim/Dockerfile delete mode 100644 docker/isaac-sim/build delete mode 100644 docker/jetson-isaac-ros/Dockerfile delete mode 100644 docker/jetson-isaac-ros/README.md delete mode 100644 docker/jetson-zed/Dockerfile delete mode 100644 docker/jetson-zed/build delete mode 100644 docker/jetson-zed/config/rtps_udp_profile.xml delete mode 100644 docker/jetson-zed/ros_entrypoint_jetson.sh delete mode 100644 docker/jetson/README.md delete mode 100644 docker/jetson/build delete mode 100644 docker/jetson/entrypoint.sh delete mode 100644 docker/vision-devel/Dockerfile delete mode 100644 docker/vision-devel/build delete mode 100644 isaac.bat delete mode 100644 isaac_setup.ps1 rename .vs/DevEnv/FileContentIndex/read.lock => jazzy_ws/src/README.MD (100%) delete mode 100644 scripts/config/SN39192289.conf delete mode 100644 scripts/config/remote-config delete mode 100644 scripts/config/remote-config-orin delete mode 100644 scripts/dds-ping delete mode 100644 scripts/launch delete mode 100644 scripts/local-setup.sh delete mode 100644 scripts/quickpub.py delete mode 100644 scripts/real-startup/README.md delete mode 100644 scripts/real-startup/jetson/startup.sh delete mode 100644 scripts/real-startup/jetson/stop.sh delete mode 100644 scripts/real-startup/pi/edna.service delete mode 100644 scripts/real-startup/pi/post-recieve delete mode 100644 scripts/real-startup/pi/startup.sh delete mode 100644 scripts/remote delete mode 100644 scripts/remote-rebuild delete mode 100644 scripts/restart-ros2 delete mode 100644 scripts/tests delete mode 100644 scripts/yolo diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 2fdd5e6..28dbfb5 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,6 +1,6 @@ { "name": "DevEnv", - "image": "ghcr.io/roboeagles4828/developer-environment:8", + "image": "ghcr.io/gold-rush-robotics/dev_env:2", "workspaceMount": "source=${localWorkspaceFolder},target=/workspace/DevEnv,type=bind", "workspaceFolder": "/workspace/DevEnv", "containerEnv": { @@ -16,7 +16,7 @@ }, "postCreateCommand": "sh .devcontainer/postCreate.sh", - "postStartCommand": " sh .devcontainer/postStart.sh", + // "postStartCommand": " sh .devcontainer/postStart.sh", "initializeCommand": "sh .devcontainer/init.sh", "securityOpt": [ "seccomp=unconfined" ], "capAdd": ["SYS_PTRACE"], @@ -37,7 +37,6 @@ "extensions": [ "ms-azuretools.vscode-docker", "ms-iot.vscode-ros", - "GitHub.copilot", "eamodio.gitlens", "appulate.filewatcher", "formulahendry.code-runner", diff --git a/.devcontainer/init.sh b/.devcontainer/init.sh index 985648d..b04dc80 100644 --- a/.devcontainer/init.sh +++ b/.devcontainer/init.sh @@ -1,5 +1,5 @@ #!/bin/bash # Pull the actual image so it is saved locally -docker pull ghcr.io/roboeagles4828/developer-environment:8 +docker pull ghcr.io/gold-rush-robotics/dev_env:2 mkdir -p ~/docker/vscode echo "Display to use: $DISPLAY" diff --git a/.devcontainer/postCreate.sh b/.devcontainer/postCreate.sh index 4f75f5d..5362c7b 100644 --- a/.devcontainer/postCreate.sh +++ b/.devcontainer/postCreate.sh @@ -1,18 +1,16 @@ #!/bin/bash -echo "source /opt/ros/humble/setup.bash" +echo "source /opt/ros/jazzy/setup.bash" git config --global core.filemode false -git config --global user.email "git@swiftcreekrobotics.onmicrosoft.com" -git config --global user.name "roboeagles" git config devcontainers-theme.show-dirty 1 sed -i 's/ZSH_THEME="devcontainers"/ZSH_THEME="eastwood"/' ~/.zshrc -echo "source /opt/ros/humble/setup.zsh" >> ~/.zshrc +echo "source /opt/ros/jazzy/setup.zsh" >> ~/.zshrc echo "source /home/admin/workspaces/rtab_ws/install/setup.zsh" >> ~/.zshrc # echo "if [ ! -d /workspaces/edna2023/install ]; then" >> ~/.zshrc echo "echo -e 'No install folder found remember to build with ctrl + shift + b\n';" >> ~/.zshrc # echo "else source /workspaces/edna2023/install/setup.zsh; fi" >> ~/.zshrc -echo "export ROS_DISTRO=humble" >> ~/.zshrc +echo "export ROS_DISTRO=jazzy" >> ~/.zshrc echo "export RCUTILS_COLORIZED_OUTPUT=1" >> ~/.zshrc echo 'complete -o nospace -o default -F _python_argcomplete "ros2"' >> ~/.zshrc echo 'alias python="python3"' >> ~/.zshrc @@ -21,6 +19,6 @@ echo 'alias python="python3"' >> ~/.zshrc # Update apt list and rosdep # Skipping since this will be done recently in docker file # sudo apt-get update -# rosdep update --rosdistro=humble +# rosdep update --rosdistro=jazzy # rosdep install --from-paths src --ignore-src -r -y # rm -rf /workspaces/edna2023/install /workspaces/edna2023/build /workspaces/edna2023/log diff --git a/.devcontainer/postStart.sh b/.devcontainer/postStart.sh deleted file mode 100644 index 18e56c3..0000000 --- a/.devcontainer/postStart.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash -ORANGE='\033[0;33m' -RED='\033[0;31m' -GREEN='\033[0;32m' -NC='\033[0m' - -# Change permissions on any joystick devices -# sudo chmod a+rw /dev/input/js* -source /opt/ros/humble/setup.bash - -echo -e "\n----JOYSTICKS CONNECTED----" -ros2 run joy joy_enumerate_devices - - -echo -e "\n----COMMANDS----" -echo "launch : Launch sim teleop code" -# echo "launch isaac : Launch sim teleop code" -echo "launch real : Launch real teleop code" -# echo "launch test_hw : Launch rviz with teleop code" -echo "restart-ros2 : restart ros2 daemon" - -echo -e "\n----Build Command----" -echo -e "ctrl + shift + b : Build" - -echo -e "\n----ROS DOMAIN ID: ${GREEN}$ROS_DOMAIN_ID${NC}" -echo -e "----ROS NAMESPACE: ${GREEN}$ROS_NAMESPACE${NC}" \ No newline at end of file diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 1b5543b..0000000 --- a/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -kernel.zip filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore deleted file mode 100644 index e99a8e0..0000000 --- a/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -vmlinux -kernel.zip diff --git a/.vs/DevEnv/FileContentIndex/1fd538b6-d6eb-4c5d-9643-9fe0b2226647.vsidx b/.vs/DevEnv/FileContentIndex/1fd538b6-d6eb-4c5d-9643-9fe0b2226647.vsidx deleted file mode 100644 index 33113bbdf27dbf974b88613da73aa57a82599c12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141676 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

5l)dzPteQTI@6*aY{JS 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 E0pH}O5dZ)H diff --git a/.vs/DevEnv/config/applicationhost.config b/.vs/DevEnv/config/applicationhost.config deleted file mode 100644 index a369b95..0000000 --- a/.vs/DevEnv/config/applicationhost.config +++ /dev/null @@ -1,1026 +0,0 @@ - - - - - - - -
    -
    -
    -
    -
    -
    -
    -
    - - - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    -
    - - -
    -
    -
    -
    -
    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.vs/DevEnv/v17/.wsuo b/.vs/DevEnv/v17/.wsuo deleted file mode 100644 index d671d4c75f2ec0c577609cdecb62b6967ee4ccf4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18944 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 RKmZ5;0U!VbfWUnx@IUd?1uOsn diff --git a/.vscode/settings.json b/.vscode/settings.json index b2aeec7..0a013f3 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,11 +4,11 @@ { "match": "\\.xacro*$", "isAsync": true, - "cmd": "/bin/bash -c \u0027source /opt/ros/humble/setup.sh \u0026\u0026 source ${workspaceRoot}/install/setup.bash \u0026\u0026 xacro ${workspaceRoot}/src/edna_description/urdf/robots/edna.urdf.xacro \u003e ${workspaceRoot}/src/edna_description/urdf/edna.urdf namespace:=$ROS_NAMESPACE\u0027", + "cmd": "/bin/bash -c \u0027source /opt/ros/jazzy/setup.sh \u0026\u0026 source ${workspaceRoot}/install/setup.bash \u0026\u0026 xacro ${workspaceRoot}/src/edna_description/urdf/robots/edna.urdf.xacro \u003e ${workspaceRoot}/src/edna_description/urdf/edna.urdf namespace:=$ROS_NAMESPACE\u0027", "event": "onFileChange" } ], - "ros.distro": "humble", + "ros.distro": "jazzy", "ros.rosSetupScript": "${workspaceFolder}/install/setup.bash", "files.associations": { "string": "cpp", @@ -98,12 +98,12 @@ "/workspaces/edna2023/build/edna_debugger", "/workspaces/edna2023/install/edna_debugger/lib/python3.10/site-packages", "/home/admin/workspaces/rtab_ws/install/rtabmap_ros/local/lib/python3.10/dist-packages", - "/opt/ros/humble/lib/python3.10/site-packages", - "/opt/ros/humble/local/lib/python3.10/dist-packages" + "/opt/ros/jazzy/lib/python3.10/site-packages", + "/opt/ros/jazzy/local/lib/python3.10/dist-packages" ], "python.analysis.extraPaths": [ - "/opt/ros/humble/lib/python3.10/site-packages", - "/opt/ros/humble/local/lib/python3.10/dist-packages" + "/opt/ros/jazzy/lib/python3.10/site-packages", + "/opt/ros/jazzy/local/lib/python3.10/dist-packages" ] }, null, diff --git a/.wslconfig b/.wslconfig deleted file mode 100644 index 26d18a9..0000000 --- a/.wslconfig +++ /dev/null @@ -1,2 +0,0 @@ -[wsl2] -kernel=C:\\sources\\vmlinux diff --git a/README.md b/README.md index e13556f..cc17b6b 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,3 @@ # DevEnv -1) Ensure that virtualization is turned on in bios -2) Open Powershell as Administrator and run -```Set-ExecutionPolicy unrestricted``` -3) cd into the DevEnv directory -```cd C:\path\to\DevEnv``` -3) Run setup.ps1 which installs - - WSL2 - - WSL2 kernel that support cameras, multicasting, xbox controllers and blueooth - - winget - - docker-desktop - - git - - usbipd -4) Run code-setup.ps1 - - vscode - - dev container extension - - remote explorer extension -5) Restart your PC - -6) Open the DevEnv folder in vscode and reopen container - - Installs ROS2 Humble docker image - + diff --git a/code-setup.ps1 b/code-setup.ps1 deleted file mode 100644 index 23d040c..0000000 --- a/code-setup.ps1 +++ /dev/null @@ -1,44 +0,0 @@ -if ((Get-Location).Path -notmatch 'DevEnv$') { - Write-Error "This script must be run from the DevEnv directory" - exit 1 -} -code --install-extension ms-vscode.remote-explorer -code --install-extension ms-vscode-remote.remote-containers -# Get the path to the settings.json file -$path = "C:\Users\$env:UserName\AppData\Roaming\Code\User\settings.json" - -# Check if the file exists -if (-not (Test-Path $path)) { - # Write-Error "File not found: $path" - # return - "Vscode settings does not exist, creating new settings file." - New-Item C:\Users\$env:UserName\AppData\Roaming\Code\User\settings.json -type file - Set-Content $path "{`n`"dev.containers.executeInWSL`":true`n}" -} - -# Read the contents of the file -$content = Get-Content $path -Raw - -# Convert the contents to a JSON object -$json = ConvertFrom-Json $content - - -# Check if the property already exists - -if ($json | Get-Member -Name 'dev.containers.executeInWSL') { - Write-Host "Property already exists in $path" - return -} - -# Add the new property to the existing object -$json | add-member -Name "dev.containers.executeInWSL" -value $true -MemberType NoteProperty - -# Convert the JSON object back to a string -$newContent = ConvertTo-Json $json -Depth 100 - -# Write the new contents to the file -Set-Content $path $newContent - -Write-Host "Property added to $path" - -code \ No newline at end of file diff --git a/docker/developer-isaac-ros/Dockerfile b/docker/developer-isaac-ros/Dockerfile deleted file mode 100644 index 0287c77..0000000 --- a/docker/developer-isaac-ros/Dockerfile +++ /dev/null @@ -1,76 +0,0 @@ -FROM nvcr.io/nvidia/isaac/ros:x86_64-humble-nav2_7356480e8a4f3484b21ae13ec5c959ee -RUN mkdir -p /opt/install-scripts - -################ -# Config Setup # -################ - -# Copy middleware profiles -RUN mkdir -p /usr/local/share/middleware_profiles -COPY config/*_profile.xml /usr/local/share/middleware_profiles/ - -###################### -# User configuration # -###################### - -ARG USERNAME=admin -ARG USER_UID=1000 -ARG USER_GID=1000 - -# Install prerequisites -RUN apt-get update && apt-get install -y \ - sudo \ -&& rm -rf /var/lib/apt/lists/* \ -&& apt-get clean - -# Reuse triton-server user as 'admin' user if exists -RUN if [ $(getent group triton-server) ]; then \ - groupmod --gid ${USER_GID} -n ${USERNAME} triton-server ; \ - usermod -l ${USERNAME} -u ${USER_UID} -m -d /home/${USERNAME} triton-server ; \ - mkdir -p /home/${USERNAME} ; \ - sudo chown ${USERNAME}:${USERNAME} /home/${USERNAME} ; \ - fi - -# Create the 'admin' user if not already exists -RUN if [ ! $(getent passwd ${USERNAME}) ]; then \ - groupadd --gid ${USER_GID} ${USERNAME} ; \ - useradd --uid ${USER_UID} --gid ${USER_GID} -m ${USERNAME} ; \ - fi - -# Update 'admin' user -RUN echo ${USERNAME} ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/${USERNAME} \ - && chmod 0440 /etc/sudoers.d/${USERNAME} \ - && adduser ${USERNAME} video && adduser ${USERNAME} sudo - -# Add docker group -RUN groupadd --system docker -RUN usermod -aG docker ${USERNAME} - -ENV USERNAME=${USERNAME} -ENV USER_GID=${USER_GID} -ENV USER_UID=${USER_UID} - -#################################### -# Install and Build Isaac ROS Pkgs # -#################################### -USER ${USERNAME} - -# Download -COPY install-scripts/install-isaac-pkgs /opt/install-scripts/install-isaac-pkgs -RUN sudo chmod +x /opt/install-scripts/install-isaac-pkgs -RUN /opt/install-scripts/install-isaac-pkgs - -# Build -RUN sudo rm /usr/lib/x86_64-linux-gnu/libcuda.so.1 -RUN sudo ln -s /usr/local/cuda/lib64/stubs/libcuda.so /usr/lib/x86_64-linux-gnu/libcuda.so.1 -RUN cd /home/${USERNAME}/workspaces/isaac_ros-dev && source /opt/ros/${ROS_DISTRO}/setup.bash && colcon build --symlink-install - -##################### -# Interactive Setup # -##################### - -WORKDIR /home/${USERNAME}/workspaces/isaac_ros-dev -RUN echo "source /opt/ros/${ROS_DISTRO}/setup.bash" >> /home/${USERNAME}/.bashrc -RUN echo "source /home/${USERNAME}/workspaces/isaac_ros-dev/install/setup.bash" >> /home/${USERNAME}/.bashrc -COPY entrypoint.sh /home/${USERNAME}/entrypoint.sh -RUN sudo chmod +x /home/${USERNAME}/entrypoint.sh \ No newline at end of file diff --git a/docker/developer-isaac-ros/README.md b/docker/developer-isaac-ros/README.md deleted file mode 100644 index 1938b65..0000000 --- a/docker/developer-isaac-ros/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Docker for isaac ros - -This directory has the configuration for building the image used for isaac utilities that require l4t. -It uses the isaac ros common container as a base and installs edna related software on top. - -# Build - -1. Docker Login to the nvidia NGC registry. [Guide](https://docs.nvidia.com/ngc/ngc-catalog-user-guide/index.html)\ -This will be used to download nvidia images. -2. Docker Login to github registry. [Guide](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry#authenticating-with-a-personal-access-token-classic) \ -This will be used to push the image to the registry -3. Run `./build` to build the image. \ -The script will prompt you if you would like to do a quick test or push to the registry. \ No newline at end of file diff --git a/docker/developer-isaac-ros/build b/docker/developer-isaac-ros/build deleted file mode 100644 index d6a7c9c..0000000 --- a/docker/developer-isaac-ros/build +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash -VERSION="1" # Increment manually for now -GITHUB_REGISTRY="ghcr.io/roboeagles4828" -IMAGE_NAME="developer-isaac-ros:$VERSION" - -nvidia-docker build -t "$GITHUB_REGISTRY/$IMAGE_NAME" \ - --network host . - -echo "Build finished" - -echo "Would you like to run the image in interactive mode? (y/n)" -read INTERACTIVE - -if [ "$INTERACTIVE" = "y" ]; then - docker run --rm -it \ - --privileged \ - --network host \ - --runtime nvidia \ - -e NVIDIA_VISIBLE_DEVICES=all \ - -e NVIDIA_DRIVER_CAPABILITIES=all \ - -e FASTRTPS_DEFAULT_PROFILES_FILE="/usr/local/share/middleware_profiles/rtps_udp_profile.xml" \ - -e ACCEPT_EULA=y "$GITHUB_REGISTRY/$IMAGE_NAME" '/bin/bash' -fi - -echo "Would you like to push the image to the registry? (y/n)" -read PUSH - -if [ "$PUSH" = "y" ]; then - docker push "$GITHUB_REGISTRY/$IMAGE_NAME" -fi \ No newline at end of file diff --git a/docker/developer-isaac-ros/config/rtps_udp_profile.xml b/docker/developer-isaac-ros/config/rtps_udp_profile.xml deleted file mode 100644 index 9a66187..0000000 --- a/docker/developer-isaac-ros/config/rtps_udp_profile.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - -NVIDIA Isaac ROS Software License - - - - UdpTransport - UDPv4 - - - - - - - UdpTransport - - false - - - \ No newline at end of file diff --git a/docker/developer-isaac-ros/entrypoint.sh b/docker/developer-isaac-ros/entrypoint.sh deleted file mode 100644 index 18f127a..0000000 --- a/docker/developer-isaac-ros/entrypoint.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -source /opt/ros/${ROS_DISTRO}/setup.bash -if [ -d "/home/${USERNAME}/workspaces/isaac_ros-dev/install" ]; then - source /home/${USERNAME}/workspaces/isaac_ros-dev/install/setup.bash -fi -$@ \ No newline at end of file diff --git a/docker/developer-isaac-ros/install-scripts/install-isaac-pkgs b/docker/developer-isaac-ros/install-scripts/install-isaac-pkgs deleted file mode 100644 index d12958d..0000000 --- a/docker/developer-isaac-ros/install-scripts/install-isaac-pkgs +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -# Followed basic instructions from isaac ros github - -# Create workspace -mkdir -p ~/workspaces/isaac_ros-dev/src - -# Deps -cd ~/workspaces/isaac_ros-dev/src && \ - git clone https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_nitros && \ - git clone https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_image_pipeline && \ - git clone https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_dnn_inference && \ - git clone https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_common && \ - git clone https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_visual_slam && \ - git clone https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_pose_estimation && \ - git clone https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_apriltag && \ - git clone https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_compression \ No newline at end of file diff --git a/docker/developer-zed/Dockerfile b/docker/developer-zed/Dockerfile deleted file mode 100644 index a24dcf7..0000000 --- a/docker/developer-zed/Dockerfile +++ /dev/null @@ -1,111 +0,0 @@ -ARG IMAGE_NAME=nvcr.io/nvidia/cuda:11.7.1-devel-ubuntu22.04 - -FROM ${IMAGE_NAME} - -ARG UBUNTU_RELEASE_YEAR=22 -ARG CUDA_MAJOR=11 -ARG CUDA_MINOR=7 -ARG ZED_SDK_MAJOR=3 -ARG ZED_SDK_MINOR=8 - -ARG ROS2_DIST=humble # ROS2 distribution - -ARG DEBIAN_FRONTEND=noninteractive - -ENV NVIDIA_DRIVER_CAPABILITIES \ - ${NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,}compute,video,utility - -# Disable apt-get warnings -RUN apt-get update || true && apt-get install -y --no-install-recommends apt-utils dialog && \ - rm -rf /var/lib/apt/lists/* - -ENV TZ=Europe/Paris - -RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && \ - apt-get update && \ - apt-get install --yes lsb-release wget less udev sudo build-essential cmake python3 python3-dev python3-pip python3-wheel git jq libopencv-dev libpq-dev zstd usbutils && \ - rm -rf /var/lib/apt/lists/* - -############ Install ROS2 ############ - -# Set and Check Locale -RUN apt-get update || true && \ - apt-get install --no-install-recommends -y locales && \ - locale-gen en_US en_US.UTF-8 && \ - update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 && \ - export LANG=en_US.UTF-8 && \ - locale # verify settings && \ - rm -rf /var/lib/apt/lists/* - -# Setup Sources -RUN apt-get update || true && \ - apt-get install --no-install-recommends -y software-properties-common && \ - add-apt-repository universe && \ - apt-get install -y curl && \ - curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg && \ - echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | tee /etc/apt/sources.list.d/ros2.list > /dev/null && \ - rm -rf /var/lib/apt/lists/* - -# Install ROS 2 Base packages and Python dependencies -RUN apt-get update || true && \ - apt-get install --no-install-recommends -y \ - ros-${ROS2_DIST}-ros-base \ - ros-${ROS2_DIST}-ament-cmake-clang-format \ - ros-${ROS2_DIST}-image-transport \ - ros-${ROS2_DIST}-image-transport-plugins \ - ros-${ROS2_DIST}-diagnostic-updater \ - ros-${ROS2_DIST}-xacro \ - python3-flake8-docstrings \ - python3-pip \ - python3-pytest-cov \ - ros-dev-tools && \ - pip3 install \ - argcomplete \ - numpy \ - empy \ - lark && \ - rm -rf /var/lib/apt/lists/* - -# Initialize rosdep -RUN rosdep init && rosdep update - -# Install the ZED SDK -RUN echo "CUDA Version $CUDA_VERSION" > /usr/local/cuda/version.txt - -# Setup the ZED SDK -RUN apt-get update -y || true && \ - apt-get install --no-install-recommends dialog bash-completion lsb-release wget less udev sudo build-essential cmake zstd python3 python3-pip libpng-dev libgomp1 -y && \ - python3 -m pip install --upgrade pip; python3 -m pip install numpy opencv-python-headless && \ - wget -q -O ZED_SDK_Linux_Ubuntu.run https://download.stereolabs.com/zedsdk/$ZED_SDK_MAJOR.$ZED_SDK_MINOR/cu$CUDA_MAJOR$CUDA_MINOR/ubuntu$UBUNTU_RELEASE_YEAR && \ - chmod +x ZED_SDK_Linux_Ubuntu.run && \ - ./ZED_SDK_Linux_Ubuntu.run -- silent skip_tools skip_cuda && \ - ln -sf /lib/x86_64-linux-gnu/libusb-1.0.so.0 /usr/lib/x86_64-linux-gnu/libusb-1.0.so && \ - rm ZED_SDK_Linux_Ubuntu.run && \ - rm -rf /var/lib/apt/lists/* - -# Install the ZED ROS2 Wrapper -ENV ROS_DISTRO ${ROS2_DIST} - -# Copy the sources in the Docker image -WORKDIR /root/ros2_ws/src -RUN git clone --recursive https://github.com/stereolabs/zed-ros2-wrapper.git - -# RUN ls -lah /root/ros2_ws/src/ -WORKDIR /root/ros2_ws/ - -RUN /bin/bash -c "source /opt/ros/$ROS_DISTRO/setup.bash && \ - rosdep install --from-paths src --ignore-src -r -y && \ - colcon build --parallel-workers $(nproc) --symlink-install \ - --event-handlers console_direct+ --base-paths src \ - --cmake-args ' -DCMAKE_BUILD_TYPE=Release' \ - ' -DCMAKE_LIBRARY_PATH=/usr/local/cuda/lib64/stubs' \ - ' -DCMAKE_CXX_FLAGS="-Wl,--allow-shlib-undefined"' " - -WORKDIR /root/ros2_ws - -# Setup environment variables -COPY ros_entrypoint.sh /sbin/ros_entrypoint.sh -RUN sudo chmod 755 /sbin/ros_entrypoint.sh - -ENTRYPOINT ["/sbin/ros_entrypoint.sh"] -CMD ["bash"] \ No newline at end of file diff --git a/docker/developer-zed/build b/docker/developer-zed/build deleted file mode 100644 index 0ab7e3a..0000000 --- a/docker/developer-zed/build +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash -echo "ONLY USE THIS SCRIPT ON THE JETSON" - -VERSION=1 -GITHUB_REGISTRY="ghcr.io/roboeagles4828" -IMAGE_NAME="developer-zed" - -docker build -t $GITHUB_REGISTRY/$IMAGE_NAME:$VERSION . - -echo "Build finished" - -echo "Would you like to run the image in interactive mode? (y/n)" -read INTERACTIVE - -if [ "$INTERACTIVE" = "y" ]; then - docker run --rm -it -e ACCEPT_EULA=y $GITHUB_REGISTRY/$IMAGE_NAME:$VERSION -fi - -echo "Would you like to push the image to the registry? (y/n)" -read PUSH - -if [ "$PUSH" = "y" ]; then wxxd - docker push $GITHUB_REGISTRY/$IMAGE_NAME:$VERSION -fi \ No newline at end of file diff --git a/docker/developer-zed/ros_entrypoint_jetson.sh b/docker/developer-zed/ros_entrypoint_jetson.sh deleted file mode 100644 index 30d1aae..0000000 --- a/docker/developer-zed/ros_entrypoint_jetson.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -set -e - -# setup ros2 environment -source "/opt/ros/$ROS_DISTRO/install/setup.bash" -- -source "/root/ros2_ws/install/local_setup.bash" -- - -# Welcome information -echo "ZED ROS2 Docker Image" -echo "---------------------" -echo 'ROS distro: ' $ROS_DISTRO -echo 'DDS middleware: ' $RMW_IMPLEMENTATION -echo "---" -echo 'Available ZED packages:' -ros2 pkg list | grep zed -echo "---------------------" -exec "$@" \ No newline at end of file diff --git a/docker/developer/Dockerfile b/docker/developer/Dockerfile deleted file mode 100644 index a753bab..0000000 --- a/docker/developer/Dockerfile +++ /dev/null @@ -1,121 +0,0 @@ -ARG BASE_IMAGE=osrf/ros:humble-desktop -FROM $BASE_IMAGE -RUN mkdir -p /opt/install-scripts -ARG INSTALL_COMMON="true" -ARG INSTALL_DOCKER="true" -ARG INSTALL_RTAB="true" - -###################### -# User configuration # -###################### - -ARG USERNAME=admin -ARG USER_UID=1000 -ARG USER_GID=1000 - -# Install prerequisites -RUN apt-get update && apt-get install -y \ - sudo \ -&& rm -rf /var/lib/apt/lists/* \ -&& apt-get clean - -# Create the 'admin' user if not already exists -RUN if [ ! $(getent passwd ${USERNAME}) ]; then \ - groupadd --gid ${USER_GID} ${USERNAME} ; \ - useradd --uid ${USER_UID} --gid ${USER_GID} -m ${USERNAME} ; \ - fi - -# Update 'admin' user -RUN echo ${USERNAME} ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/${USERNAME} \ - && chmod 0440 /etc/sudoers.d/${USERNAME} \ - && adduser ${USERNAME} video && adduser ${USERNAME} sudo - -ENV USERNAME=${USERNAME} -ENV USER_GID=${USER_GID} -ENV USER_UID=${USER_UID} - -################ -# Config Setup # -################ - -# Copy middleware profiles -RUN mkdir -p /usr/local/share/middleware_profiles -COPY config/*_profile.xml /usr/local/share/middleware_profiles/ - -################## -# Common Utility # -################## - -# Copy and install common -COPY install-scripts/install-common /opt/install-scripts/install-common -RUN chmod +x /opt/install-scripts/install-common -RUN /opt/install-scripts/install-common ${INSTALL_COMMON} - -############## -# Docker CLI # -############## - -# Copy and isntall docker -COPY install-scripts/install-docker /opt/install-scripts/install-docker -RUN chmod +x /opt/install-scripts/install-docker -RUN /opt/install-scripts/install-docker ${INSTALL_DOCKER} - -# Add docker group -RUN groupadd --system docker -RUN usermod -aG docker ${USERNAME} - -################ -# Install RTAB # -################ - - -COPY install-scripts/install-rtab /opt/install-scripts/install-rtab -RUN chmod +x /opt/install-scripts/install-rtab -USER ${USERNAME} -RUN sudo apt update && sudo apt-get install -y python3-pip -RUN /opt/install-scripts/install-rtab ${INSTALL_RTAB} -USER root - -#################### -# Preload ROS Deps # -#################### - -# Copy and install workspace rosdeps -COPY install-scripts/install-rosdeps /opt/install-scripts/install-rosdeps -RUN chmod +x /opt/install-scripts/install-rosdeps -COPY src /tmp/src -USER ${USERNAME} -RUN /opt/install-scripts/install-rosdeps -USER root -RUN mkdir -p /opt/workspace - -####################### -# Install Python deps # -####################### -RUN pip install rticonnextdds-connector \ -robotpy==2023.4.2.1 \ -robotpy[ctre] \ -robotpy[all] \ -robotpy[commands2] \ -robotpy[navx] \ -wpilib==2023.4.2.0 - -###################### -# Docker Permissions # -###################### -RUN echo "#!/bin/sh\n\ -sudoIf() { if [ \"\$(id -u)\" -ne 0 ]; then sudo \"\$@\"; else \"\$@\"; fi }\n\ -SOCKET_GID=\$(stat -c '%g' /var/run/docker.sock) \n\ -if [ \"${SOCKET_GID}\" != '0' ]; then\n\ - if [ \"\$(cat /etc/group | grep :\${SOCKET_GID}:)\" = '' ]; then sudoIf groupadd --gid \${SOCKET_GID} docker-host; fi \n\ - if [ \"\$(id ${USERNAME} | grep -E \"groups=.*(=|,)\${SOCKET_GID}\(\")\" = '' ]; then sudoIf usermod -aG \${SOCKET_GID} ${USERNAME}; fi\n\ -fi\n\ -exec \"\$@\"" > /usr/local/share/docker-init.sh \ -&& chmod +x /usr/local/share/docker-init.sh - -# VS Code overrides ENTRYPOINT and CMD when executing `docker run` by default. -# Setting the ENTRYPOINT to docker-init.sh will configure non-root access to -# the Docker socket if "overrideCommand": false is set in devcontainer.json. -# The script will also execute CMD if you need to alter startup behaviors. -ENTRYPOINT [ "/usr/local/share/docker-init.sh" ] -CMD [ "sleep", "infinity" ] \ No newline at end of file diff --git a/docker/developer/README.md b/docker/developer/README.md deleted file mode 100644 index c2c410a..0000000 --- a/docker/developer/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# Docker for Development - -This directory has the configuration for building the image used in the edna devcontainer. -It uses the osrf ros humble image as a base and installs edna related software on top. - - -When loading the devcontainer the common utils feature is used to update the user GID/UID to match local and setup zsh and other terminal nice to haves. - -**Common Utils**: `devcontainers/features/common-utils` \ -**URL**: https://github.com/devcontainers/features/tree/main/src/common-utils - - -# Build - -1. Docker Login to github registry. [Guide](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry#authenticating-with-a-personal-access-token-classic) \ -This will be used to push the image to the registry -2. Run `./build` to build the image. \ -The script will prompt you if you would like to do a quick test or push to the registry. \ No newline at end of file diff --git a/docker/developer/build b/docker/developer/build deleted file mode 100755 index 13634c3..0000000 --- a/docker/developer/build +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash -VERSION=7 # Increment manually for now -PREV_VERSION="$((VERSION-1))" -GITHUB_REGISTRY="ghcr.io/roboeagles4828" -IMAGE_NAME="developer-environment" - -echo "Building image $GITHUB_REGISTRY/$IMAGE_NAME:$VERSION from $GITHUB_REGISTRY/$IMAGE_NAME:$PREV_VERSION" - -rm -rf ./src -cp -r ../../src . -# Copy rio requirements to be installed -cp ../../rio/requirements.txt ./src/requirements.txt - -docker build -t $GITHUB_REGISTRY/$IMAGE_NAME:$VERSION --cache-from $GITHUB_REGISTRY/$IMAGE_NAME:$PREV_VERSION . - -echo "Build finished" - -echo "Would you like to run the image in interactive mode? (y/n)" -read INTERACTIVE - -if [ "$INTERACTIVE" = "y" ]; then - docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock:rw --user="1000:1000" $GITHUB_REGISTRY/$IMAGE_NAME:$VERSION zsh -fi - -echo "Would you like to push the image to the registry? (y/n)" -read PUSH - -if [ "$PUSH" = "y" ]; then - docker push $GITHUB_REGISTRY/$IMAGE_NAME:$VERSION -fi - -rm -rf src diff --git a/docker/developer/config/rtps_udp_profile.xml b/docker/developer/config/rtps_udp_profile.xml deleted file mode 100644 index 9a66187..0000000 --- a/docker/developer/config/rtps_udp_profile.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - -NVIDIA Isaac ROS Software License - - - - UdpTransport - UDPv4 - - - - - - - UdpTransport - - false - - - \ No newline at end of file diff --git a/docker/developer/install-scripts/install-common b/docker/developer/install-scripts/install-common deleted file mode 100644 index 84862b4..0000000 --- a/docker/developer/install-scripts/install-common +++ /dev/null @@ -1,180 +0,0 @@ -#!/bin/bash -# Installs Common dev packages. -# These are the same packages used in common devcontainer features. -# They are added into the docker image to speed up build times but does not have user setup config. - -set -e - -INSTALL_COMMON=$1 -if [ "$INSTALL_COMMON" != "true" ]; then - echo "Skipping common packages" - exit 0 -fi - -INSTALL_ZSH="true" -INSTALL_OH_MY_ZSH="true" -CONFIGURE_ZSH_AS_DEFAULT_SHELL="true" - -# Debian / Ubuntu packages -install_debian_packages() { - # Ensure apt is in non-interactive to avoid prompts - export DEBIAN_FRONTEND=noninteractive - - local package_list="apt-utils \ - openssh-client \ - gnupg2 \ - dirmngr \ - iproute2 \ - procps \ - lsof \ - htop \ - net-tools \ - psmisc \ - curl \ - tree \ - wget \ - rsync \ - ca-certificates \ - unzip \ - bzip2 \ - zip \ - nano \ - vim-tiny \ - less \ - jq \ - lsb-release \ - apt-transport-https \ - dialog \ - libc6 \ - libgcc1 \ - libkrb5-3 \ - libgssapi-krb5-2 \ - libicu[0-9][0-9] \ - liblttng-ust[0-9] \ - libstdc++6 \ - zlib1g \ - locales \ - sudo \ - ncdu \ - man-db \ - strace \ - manpages \ - manpages-dev \ - libnss3 \ - init-system-helpers" - - # Include libssl1.1 if available - if [[ ! -z $(apt-cache --names-only search ^libssl1.1$) ]]; then - package_list="${package_list} libssl1.1" - fi - - # Include libssl3 if available - if [[ ! -z $(apt-cache --names-only search ^libssl3$) ]]; then - package_list="${package_list} libssl3" - fi - - # Include appropriate version of libssl1.0.x if available - local libssl_package=$(dpkg-query -f '${db:Status-Abbrev}\t${binary:Package}\n' -W 'libssl1\.0\.?' 2>&1 || echo '') - if [ "$(echo "$libssl_package" | grep -o 'libssl1\.0\.[0-9]:' | uniq | sort | wc -l)" -eq 0 ]; then - if [[ ! -z $(apt-cache --names-only search ^libssl1.0.2$) ]]; then - # Debian 9 - package_list="${package_list} libssl1.0.2" - elif [[ ! -z $(apt-cache --names-only search ^libssl1.0.0$) ]]; then - # Ubuntu 18.04 - package_list="${package_list} libssl1.0.0" - fi - fi - - # Include git if not already installed (may be more recent than distro version) - if ! type git > /dev/null 2>&1; then - package_list="${package_list} git" - fi - - # Install the list of packages - echo "Packages to verify are installed: ${package_list}" - rm -rf /var/lib/apt/lists/* - apt-get update -y - apt-get -y install --no-install-recommends ${package_list} 2> >( grep -v 'debconf: delaying package configuration, since apt-utils is not installed' >&2 ) - - # Install zsh (and recommended packages) if needed - if [ "${INSTALL_ZSH}" = "true" ] && ! type zsh > /dev/null 2>&1; then - apt-get install -y zsh - fi - - # Ensure at least the en_US.UTF-8 UTF-8 locale is available = common need for both applications and things like the agnoster ZSH theme. - if [ "${LOCALE_ALREADY_SET}" != "true" ] && ! grep -o -E '^\s*en_US.UTF-8\s+UTF-8' /etc/locale.gen > /dev/null; then - echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen - locale-gen - LOCALE_ALREADY_SET="true" - fi - - # Clean up - apt-get -y clean - rm -rf /var/lib/apt/lists/* - PACKAGES_ALREADY_INSTALLED="true" -} -install_debian_packages - -# ********************************* -# ** Shell customization section ** -# ********************************* -group_name="${USERNAME}" -if [ "${USERNAME}" = "root" ]; then - user_rc_path="/root" -else - user_rc_path="/home/${USERNAME}" - if [ ! -d "${user_rc_path}" ]; then - mkdir -p "${user_rc_path}" - chown ${USERNAME}:${group_name} "${user_rc_path}" - fi -fi - -# Restore user .bashrc / .profile / .zshrc defaults from skeleton file if it doesn't exist or is empty -possible_rc_files=( ".bashrc" ".profile" ".zshrc" ) -for rc_file in "${possible_rc_files[@]}"; do - if [ -f "/etc/skel/${rc_file}" ]; then - if [ ! -e "${user_rc_path}/${rc_file}" ] || [ ! -s "${user_rc_path}/${rc_file}" ]; then - cp "/etc/skel/${rc_file}" "${user_rc_path}/${rc_file}" - chown ${USERNAME}:${group_name} "${user_rc_path}/${rc_file}" - fi - fi -done - -# Optionally configure zsh and Oh My Zsh! -if [ "${INSTALL_ZSH}" = "true" ]; then - - if [ "${CONFIGURE_ZSH_AS_DEFAULT_SHELL}" == "true" ]; then - chsh --shell /bin/zsh ${USERNAME} - fi - - # Adapted, simplified inline Oh My Zsh! install steps that adds, defaults to a codespaces theme. - # See https://github.com/ohmyzsh/ohmyzsh/blob/master/tools/install.sh for official script. - oh_my_install_dir="${user_rc_path}/.oh-my-zsh" - if [ ! -d "${oh_my_install_dir}" ] && [ "${INSTALL_OH_MY_ZSH}" = "true" ]; then - template_path="${oh_my_install_dir}/templates/zshrc.zsh-template" - user_rc_file="${user_rc_path}/.zshrc" - umask g-w,o-w - mkdir -p ${oh_my_install_dir} - git clone --depth=1 \ - -c core.eol=lf \ - -c core.autocrlf=false \ - -c fsck.zeroPaddedFilemode=ignore \ - -c fetch.fsck.zeroPaddedFilemode=ignore \ - -c receive.fsck.zeroPaddedFilemode=ignore \ - "https://github.com/ohmyzsh/ohmyzsh" "${oh_my_install_dir}" 2>&1 - echo -e "$(cat "${template_path}")\nDISABLE_AUTO_UPDATE=true\nDISABLE_UPDATE_PROMPT=true" > ${user_rc_file} - sed -i -e 's/ZSH_THEME=.*/ZSH_THEME="devcontainers"/g' ${user_rc_file} - - - # Shrink git while still enabling updates - cd "${oh_my_install_dir}" - git repack -a -d -f --depth=1 --window=1 - # Copy to non-root user if one is specified - if [ "${USERNAME}" != "root" ]; then - cp -rf "${user_rc_file}" "${oh_my_install_dir}" /root - chown -R ${USERNAME}:${group_name} "${oh_my_install_dir}" "${user_rc_file}" - fi - fi -fi - -echo "Done!" diff --git a/docker/developer/install-scripts/install-docker b/docker/developer/install-scripts/install-docker deleted file mode 100644 index f4ea500..0000000 --- a/docker/developer/install-scripts/install-docker +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -INSTALL_DOCKER=$1 -if [ "$INSTALL_DOCKER" != "true" ]; then - echo "Skipping docker install" - exit 0 -fi - - -curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg -echo \ - "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ - $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null -apt-get update -apt-get install -y --no-install-recommends docker-ce-cli diff --git a/docker/developer/install-scripts/install-rosdeps b/docker/developer/install-scripts/install-rosdeps deleted file mode 100644 index 6018c8f..0000000 --- a/docker/developer/install-scripts/install-rosdeps +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -# Get pip -sudo apt-get install -y python3-pip - -# Preload workspace dependencies -cd /tmp && - sudo apt-get update -y && - rosdep update --rosdistro=humble && - rosdep install --from-paths src --ignore-src -r -y && - pip install -r src/requirements.txt && - sudo rm -rf /tmp/src diff --git a/docker/developer/install-scripts/install-rtab b/docker/developer/install-scripts/install-rtab deleted file mode 100644 index ccefa5f..0000000 --- a/docker/developer/install-scripts/install-rtab +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -INSTALL_RTAB=$1 -if [ "$INSTALL_RTAB" != "true" ]; then - echo "Skipping rtab install" - exit 0 -fi - -mkdir -p ~/workspaces/rtab_ws/src - -export MAKEFLAGS="-j6" - -sudo apt-get update -y && rosdep update --rosdistro=humble - -source /opt/ros/humble/setup.bash -cd ~/workspaces/rtab_ws && \ - git clone --branch humble-devel https://github.com/introlab/rtabmap.git src/rtabmap && \ - git clone --branch humble-devel https://github.com/introlab/rtabmap_ros.git src/rtabmap_ros && \ - rosdep install --from-paths src --ignore-src -r -y && \ - colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release diff --git a/docker/isaac-sim/Dockerfile b/docker/isaac-sim/Dockerfile deleted file mode 100644 index 051933e..0000000 --- a/docker/isaac-sim/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM nvcr.io/nvidia/isaac-sim:2022.2.1 - -# Set ROS2 Humble as the default ROS Bridge -RUN sed -i 's/# "omni.isaac.ros_bridge/"omni.isaac.ros2_bridge-humble/' /isaac-sim/apps/omni.isaac.sim.base.kit - -# Add allow root to warm up -RUN echo " --allow-root" >> /isaac-sim/omni.isaac.sim.warmup.sh \ No newline at end of file diff --git a/docker/isaac-sim/build b/docker/isaac-sim/build deleted file mode 100644 index 125c9ab..0000000 --- a/docker/isaac-sim/build +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -GITHUB_REGISTRY="ghcr.io/roboeagles4828" -VERSION="2022.2.1" -IMAGE_NAME="isaac-sim:$VERSION" - -docker build -t $GITHUB_REGISTRY/$IMAGE_NAME --cache-from $GITHUB_REGISTRY/$IMAGE_NAME . - -echo "Build finished" - -echo "Would you like to run the image in interactive mode? (y/n)" -read INTERACTIVE - -if [ "$INTERACTIVE" = "y" ]; then - docker run --rm -it -e ACCEPT_EULA=y --entrypoint /bin/bash $GITHUB_REGISTRY/$IMAGE_NAME -fi - -echo "Would you like to push the image to the registry? (y/n)" -read PUSH - -if [ "$PUSH" = "y" ]; then - docker push $GITHUB_REGISTRY/$IMAGE_NAME -fi \ No newline at end of file diff --git a/docker/jetson-isaac-ros/Dockerfile b/docker/jetson-isaac-ros/Dockerfile deleted file mode 100644 index 072476a..0000000 --- a/docker/jetson-isaac-ros/Dockerfile +++ /dev/null @@ -1 +0,0 @@ -FROM nvcr.io/nvidia/isaac/ros:aarch64-humble-nav2_6dfaf7adbe190f1181c3a0a2f2418760 \ No newline at end of file diff --git a/docker/jetson-isaac-ros/README.md b/docker/jetson-isaac-ros/README.md deleted file mode 100644 index f972d06..0000000 --- a/docker/jetson-isaac-ros/README.md +++ /dev/null @@ -1 +0,0 @@ -# Jetson Docker Image with Isaac ROS \ No newline at end of file diff --git a/docker/jetson-zed/Dockerfile b/docker/jetson-zed/Dockerfile deleted file mode 100644 index 10ad062..0000000 --- a/docker/jetson-zed/Dockerfile +++ /dev/null @@ -1,88 +0,0 @@ -ARG IMAGE_NAME=dustynv/ros:humble-ros-base-l4t-r35.1.0 - -FROM ${IMAGE_NAME} - -ARG ZED_SDK_MAJOR=3 -ARG ZED_SDK_MINOR=8 -ARG JETPACK_MAJOR=5 -ARG JETPACK_MINOR=0 -ARG L4T_MAJOR=35 -ARG L4T_MINOR=1 - -ARG ROS2_DIST=humble # ROS2 distribution - -# ZED ROS2 Wrapper dependencies version -ARG XACRO_VERSION=2.0.8 -ARG DIAGNOSTICS_VERSION=3.0.0 -ARG AMENT_LINT_VERSION=0.12.4 - -ENV DEBIAN_FRONTEND noninteractive - -# Enable required NVIDIA drivers -#ENV NVIDIA_DRIVER_CAPABILITIES \ -# ${NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,}compute,video,utility - -# Disable apt-get warnings - -RUN apt-get update --allow-unauthenticated || true && apt-get install --allow-unauthenticated -y --no-install-recommends apt-utils dialog - -ENV TZ=Europe/Paris - -RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && \ - apt-get install --allow-unauthenticated --yes lsb-release wget less udev sudo build-essential cmake python3 python3-dev python3-pip python3-wheel git jq libpq-dev zstd usbutils && \ - rm -rf /var/lib/apt/lists/* - -# Install the ZED SDK -RUN echo "# R${L4T_MAJOR} (release), REVISION: ${L4T_MINOR}" > /etc/nv_tegra_release && \ - apt-get update -y --allow-unauthenticated || true && \ - apt-get install -y --allow-unauthenticated --no-install-recommends zstd wget less cmake curl gnupg2 \ - build-essential python3 python3-pip python3-dev python3-setuptools libusb-1.0-0-dev -y && \ - pip install protobuf && \ - wget -q --no-check-certificate -O ZED_SDK_Linux_JP.run \ - https://download.stereolabs.com/zedsdk/${ZED_SDK_MAJOR}.${ZED_SDK_MINOR}/l4t${L4T_MAJOR}.${L4T_MINOR}/jetsons && \ - chmod +x ZED_SDK_Linux_JP.run ; ./ZED_SDK_Linux_JP.run silent skip_tools && \ - rm -rf /usr/local/zed/resources/* && \ - rm -rf ZED_SDK_Linux_JP.run && \ - rm -rf /var/lib/apt/lists/* - -# Install the ZED ROS2 Wrapper -ENV ROS_DISTRO ${ROS2_DIST} - -# Copy the sources in the Docker image -WORKDIR /root/ros2_ws/src -RUN git clone --recursive https://github.com/stereolabs/zed-ros2-wrapper.git - -# Install missing dependencies -WORKDIR /root/ros2_ws/src -RUN wget https://github.com/ros/xacro/archive/refs/tags/${XACRO_VERSION}.tar.gz -O - | tar -xvz && mv xacro-${XACRO_VERSION} xacro && \ - wget https://github.com/ros/diagnostics/archive/refs/tags/${DIAGNOSTICS_VERSION}.tar.gz -O - | tar -xvz && mv diagnostics-${DIAGNOSTICS_VERSION} diagnostics && \ - wget https://github.com/ament/ament_lint/archive/refs/tags/${AMENT_LINT_VERSION}.tar.gz -O - | tar -xvz && mv ament_lint-${AMENT_LINT_VERSION} ament-lint - - -# Check that all the dependencies are satisfied -WORKDIR /root/ros2_ws -RUN apt-get update -y --allow-unauthenticated || true && rosdep update && \ - rosdep install --from-paths src --ignore-src -r -y && \ - rm -rf /var/lib/apt/lists/* - -# Build the dependencies and the ZED ROS2 Wrapper -RUN /bin/bash -c "source /opt/ros/$ROS_DISTRO/install/setup.bash && \ - colcon build --parallel-workers $(nproc) --symlink-install \ - --event-handlers console_direct+ --base-paths src \ - --cmake-args ' -DCMAKE_BUILD_TYPE=Release' \ - ' -DCMAKE_LIBRARY_PATH=/usr/local/cuda/lib64/stubs' \ - ' -DCMAKE_CXX_FLAGS="-Wl,--allow-shlib-undefined"' \ - ' --no-warn-unused-cli' " - -WORKDIR /root/ros2_ws - -# Copy middleware profiles -RUN mkdir -p /usr/local/share/middleware_profiles -COPY config/*_profile.xml /usr/local/share/middleware_profiles/ - -# Setup environment variables -COPY ros_entrypoint_jetson.sh /sbin/ros_entrypoint.sh -RUN sudo chmod 755 /sbin/ros_entrypoint.sh - -ENTRYPOINT ["/sbin/ros_entrypoint.sh"] -CMD ["bash"] diff --git a/docker/jetson-zed/build b/docker/jetson-zed/build deleted file mode 100644 index 257e362..0000000 --- a/docker/jetson-zed/build +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash -echo "ONLY USE THIS SCRIPT ON THE JETSON" - -VERSION=1 -GITHUB_REGISTRY="ghcr.io/roboeagles4828" -IMAGE_NAME="jetson-zed" - -docker build -t $GITHUB_REGISTRY/$IMAGE_NAME:$VERSION . - -echo "Build finished" - -echo "Would you like to run the image in interactive mode? (y/n)" -read INTERACTIVE - -if [ "$INTERACTIVE" = "y" ]; then - docker run --rm -it -e ACCEPT_EULA=y $GITHUB_REGISTRY/$IMAGE_NAME:$VERSION -fi - -echo "Would you like to push the image to the registry? (y/n)" -read PUSH - -if [ "$PUSH" = "y" ]; then - docker push $GITHUB_REGISTRY/$IMAGE_NAME:$VERSION -fi \ No newline at end of file diff --git a/docker/jetson-zed/config/rtps_udp_profile.xml b/docker/jetson-zed/config/rtps_udp_profile.xml deleted file mode 100644 index 9a66187..0000000 --- a/docker/jetson-zed/config/rtps_udp_profile.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - -NVIDIA Isaac ROS Software License - - - - UdpTransport - UDPv4 - - - - - - - UdpTransport - - false - - - \ No newline at end of file diff --git a/docker/jetson-zed/ros_entrypoint_jetson.sh b/docker/jetson-zed/ros_entrypoint_jetson.sh deleted file mode 100644 index 30d1aae..0000000 --- a/docker/jetson-zed/ros_entrypoint_jetson.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -set -e - -# setup ros2 environment -source "/opt/ros/$ROS_DISTRO/install/setup.bash" -- -source "/root/ros2_ws/install/local_setup.bash" -- - -# Welcome information -echo "ZED ROS2 Docker Image" -echo "---------------------" -echo 'ROS distro: ' $ROS_DISTRO -echo 'DDS middleware: ' $RMW_IMPLEMENTATION -echo "---" -echo 'Available ZED packages:' -ros2 pkg list | grep zed -echo "---------------------" -exec "$@" \ No newline at end of file diff --git a/docker/jetson/README.md b/docker/jetson/README.md deleted file mode 100644 index 8dce4da..0000000 --- a/docker/jetson/README.md +++ /dev/null @@ -1 +0,0 @@ -# Jetson Docker Image \ No newline at end of file diff --git a/docker/jetson/build b/docker/jetson/build deleted file mode 100644 index d8b6b77..0000000 --- a/docker/jetson/build +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash - -echo "ONLY USE THIS SCRIPT ON THE JETSON" -VERSION=3 # Increment manually for now -PREV_VERSION="$((VERSION-1))" -GITHUB_REGISTRY="ghcr.io/roboeagles4828" -IMAGE_NAME="jetson" - -# Build Image -echo "Building image : jetson-base:$VERSION" -cd ../developer - -rm -rf ./src -cp -r ../../src . -# Copy rio requirements to be installed -touch ./src/requirements.txt - -# Build from the Dockerfile in the developer folder making an intermediate image -docker build -t $GITHUB_REGISTRY/$IMAGE_NAME:$VERSION \ - --cache-from $GITHUB_REGISTRY/$IMAGE_NAME:$PREV_VERSION \ - --build-arg BASE_IMAGE=ros:humble-ros-base \ - --build-arg INSTALL_RTAB="false" \ - --build-arg INSTALL_DOCKER="false" . - -echo "Build finished" -cd ../jetson - -echo "Would you like to run the image in interactive mode? (y/n)" -read INTERACTIVE - -if [ "$INTERACTIVE" = "y" ]; then - docker run --rm -it $GITHUB_REGISTRY/$IMAGE_NAME:$VERSION -fi - -echo "Would you like to push the image to the registry? (y/n)" -read PUSH - -if [ "$PUSH" = "y" ]; then - docker push $GITHUB_REGISTRY/$IMAGE_NAME:$VERSION -fi - -rm -rf ../developer/src \ No newline at end of file diff --git a/docker/jetson/entrypoint.sh b/docker/jetson/entrypoint.sh deleted file mode 100644 index 9500ab9..0000000 --- a/docker/jetson/entrypoint.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -source /opt/ros/${ROS_DISTRO}/setup.bash -source install/setup.bash -ros2 launch edna_bringup real.launch.py \ No newline at end of file diff --git a/docker/vision-devel/Dockerfile b/docker/vision-devel/Dockerfile deleted file mode 100644 index f84cac3..0000000 --- a/docker/vision-devel/Dockerfile +++ /dev/null @@ -1,41 +0,0 @@ -FROM stereolabs/zed:4.0-devel-cuda11.8-ubuntu22.04 - -# Install dependencies -RUN apt-get update && apt-get install -y \ - sudo \ - wget \ - git \ - software-properties-common \ -&& rm -rf /var/lib/apt/lists/* \ -&& apt-get clean -# Install libcudnn8 -ENV OS=ubuntu2204 - -RUN wget https://developer.download.nvidia.com/compute/cuda/repos/${OS}/x86_64/cuda-${OS}.pin - -RUN mv cuda-${OS}.pin /etc/apt/preferences.d/cuda-repository-pin-600 -RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/${OS}/x86_64/7fa2af80.pub -RUN add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/${OS}/x86_64/ /" -RUN apt-get update -ENV cudnn_version=8.9.3.28 -ENV cuda_version=cuda11.8 - -RUN apt-get install libcudnn8=${cudnn_version}-1+${cuda_version} -RUN pip install pyyaml -WORKDIR /usr/local -RUN git clone --recursive https://github.com/pytorch/pytorch -WORKDIR /usr/local/pytorch -RUN git submodule sync && git submodule update --init --recursive -RUN python3 setup.py develop -WORKDIR /usr/local -RUN git clone https://github.com/pytorch/vision.git -WORKDIR /usr/local/vision -RUN python3 setup.py develop -WORKDIR /usr/local -RUN git clone https://github.com/ultralytics/ultralytics -WORKDIR /usr/local/ultralytics -RUN sed -i 's/torch>=1.7.0/# torch>=1.7.0/g' requirements.txt -RUN sed -i 's/torchvision>=0.8.1/# torchvision>=0.8.1/g' requirements.txt -RUN pip install -e . -WORKDIR /usr/local - diff --git a/docker/vision-devel/build b/docker/vision-devel/build deleted file mode 100644 index 5c93004..0000000 --- a/docker/vision-devel/build +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -GITHUB_REGISTRY="ghcr.io/roboeagles4828" -VERSION="2" -IMAGE_NAME="vision-devel:$VERSION" - -docker build -t $GITHUB_REGISTRY/$IMAGE_NAME --cache-from $GITHUB_REGISTRY/$IMAGE_NAME . - -echo "Build finished" - -echo "Would you like to run the image in interactive mode? (y/n)" -read INTERACTIVE - -if [ "$INTERACTIVE" = "y" ]; then - docker run --rm -it -e ACCEPT_EULA=y --entrypoint /bin/bash $GITHUB_REGISTRY/$IMAGE_NAME -fi - -echo "Would you like to push the image to the registry? (y/n)" -read PUSH - -if [ "$PUSH" = "y" ]; then - docker push $GITHUB_REGISTRY/$IMAGE_NAME -fi \ No newline at end of file diff --git a/isaac.bat b/isaac.bat deleted file mode 100644 index 6b1ae3a..0000000 --- a/isaac.bat +++ /dev/null @@ -1,4 +0,0 @@ -@echo off -call C:\opt\ros\foxy\x64\setup.bat -call C:\Users\%USERNAME%\AppData\Local\ov\pkg\isaac_sim-2022.2.1\isaac-sim.bat -``` \ No newline at end of file diff --git a/isaac_setup.ps1 b/isaac_setup.ps1 deleted file mode 100644 index d1cf683..0000000 --- a/isaac_setup.ps1 +++ /dev/null @@ -1,21 +0,0 @@ -$ProgressPreference = 'SilentlyContinue' -if (-not (Test-Path "$env:LOCALAPPDATA\ov")) { - "Omniverse not installed. Installing..." - Invoke-WebRequest 'https://install.launcher.omniverse.nvidia.com/installers/omniverse-launcher-win.exe' -OutFile isaac_sim_windows.exe - ./isaac_sim_windows.exe - "Omniverse installed!" -} -while (-not (Test-Path "$env:LOCALAPPDATA\ov\pkg\isaac_sim-2022.2.1")) { - "Isaac sim not installed. Please install it" - Write-Host "Press Enter when installed" - $null = Read-Host - -} -"Install ROS2..." -Invoke-WebRequest 'https://www.dropbox.com/scl/fi/chckfua0ontxc9t2hnvrk/ROS2_foxy.zip?rlkey=1zk4u7kjgzfxw85n24pavj9r7&dl=1' -OutFile ROS2_foxy.zip -Expand-Archive -LiteralPath .\ROS2_foxy.zip -DestinationPath .\C:\ -"ROS 2 installed!" -"Setup Isaac sim..." -(Get-Content -Path "$env:LOCALAPPDATA\ov\pkg\isaac_sim-2022.2.1/apps/omni.isaac.sim.base.kit") | ForEach-Object {$_ -replace 'isaac.startup.ros_bridge_extension = ""', 'isaac.startup.ros_bridge_extension = "omni.isaac.ros2_bridge"'} | Set-Content -Path "$env:LOCALAPPDATA\ov\pkg\isaac_sim-2022.2.1/apps/omni.isaac.sim.base.kit" -"Setup Done!" -"To run isaac sim, run isaac.bat outside of dev container" \ No newline at end of file diff --git a/.vs/DevEnv/FileContentIndex/read.lock b/jazzy_ws/src/README.MD similarity index 100% rename from .vs/DevEnv/FileContentIndex/read.lock rename to jazzy_ws/src/README.MD diff --git a/scripts/config/SN39192289.conf b/scripts/config/SN39192289.conf deleted file mode 100644 index 4a3e37f..0000000 --- a/scripts/config/SN39192289.conf +++ /dev/null @@ -1,129 +0,0 @@ -[LEFT_CAM_2K] -fx=1066.47 -fy=1066.69 -cx=1096.4 -cy=608.35 -k1=-0.0481392 -k2=0.0204418 -p1=-0.000164085 -p2=-0.000320881 -k3=-0.00848405 - -[RIGHT_CAM_2K] -fx=1067.68 -fy=1067.68 -cx=1119.35 -cy=638.421 -k1=-0.0488906 -k2=0.0210952 -p1=-0.000111085 -p2=-2.85138e-05 -k3=-0.00867969 - -[LEFT_CAM_FHD] -fx=1066.47 -fy=1066.69 -cx=952.4 -cy=527.35 -k1=-0.0481392 -k2=0.0204418 -p1=-0.000164085 -p2=-0.000320881 -k3=-0.00848405 - -[RIGHT_CAM_FHD] -fx=1067.68 -fy=1067.68 -cx=975.35 -cy=557.421 -k1=-0.0488906 -k2=0.0210952 -p1=-0.000111085 -p2=-2.85138e-05 -k3=-0.00867969 - -[LEFT_CAM_HD] -fx=533.235 -fy=533.345 -cx=634.7 -cy=352.175 -k1=-0.0481392 -k2=0.0204418 -p1=-0.000164085 -p2=-0.000320881 -k3=-0.00848405 - -[RIGHT_CAM_HD] -fx=533.84 -fy=533.84 -cx=646.175 -cy=367.2105 -k1=-0.0488906 -k2=0.0210952 -p1=-0.000111085 -p2=-2.85138e-05 -k3=-0.00867969 - -[LEFT_CAM_VGA] -fx=266.6175 -fy=266.6725 -cx=332.85 -cy=183.5875 -k1=-0.0481392 -k2=0.0204418 -p1=-0.000164085 -p2=-0.000320881 -k3=-0.00848405 - -[RIGHT_CAM_VGA] -fx=266.92 -fy=266.92 -cx=338.5875 -cy=191.10525 -k1=-0.0488906 -k2=0.0210952 -p1=-0.000111085 -p2=-2.85138e-05 -k3=-0.00867969 - -[LEFT_DISTO] -k1=-1.09881 -k2=2.26482 -k3=0.121642 -k4=-1.00398 -k5=2.11774 -k6=0.27731 -p1=-0.000104778 -p2=-0.00019719 - -[RIGHT_DISTO] -k1=-1.23005 -k2=2.54131 -k3=0.146487 -k4=-1.13444 -k5=2.38549 -k6=0.319041 -p1=-1.45179e-05 -p2=-0.000258106 - -[STEREO] -Baseline=119.769 -TY=-0.234338 -TZ=0.0178837 -CV_2K=0.00274884 -CV_FHD=0.00274884 -CV_HD=0.00274884 -CV_VGA=0.00274884 -RX_2K=0.00227577 -RX_FHD=0.00227577 -RX_HD=0.00227577 -RX_VGA=0.00227577 -RZ_2K=0.00172762 -RZ_FHD=0.00172762 -RZ_HD=0.00172762 -RZ_VGA=0.00172762 - -[MISC] -Sensor_ID=0 - - diff --git a/scripts/config/remote-config b/scripts/config/remote-config deleted file mode 100644 index 6b43d94..0000000 --- a/scripts/config/remote-config +++ /dev/null @@ -1,6 +0,0 @@ -USERNAME="roboeagles" -IP_ADDRESS="10.48.28.22" -PORT="5800" -REMOTE_PATH="/home/$USERNAME/edna2023" - -MACHINE_NAME=${5:-""} \ No newline at end of file diff --git a/scripts/config/remote-config-orin b/scripts/config/remote-config-orin deleted file mode 100644 index 6ce7b47..0000000 --- a/scripts/config/remote-config-orin +++ /dev/null @@ -1,6 +0,0 @@ -USERNAME="sorineagle" -IP_ADDRESS="192.168.1.171" -PORT="22" -REMOTE_PATH="/home/$USERNAME/edna2023" - -MACHINE_NAME=${5:-""} \ No newline at end of file diff --git a/scripts/dds-ping b/scripts/dds-ping deleted file mode 100644 index e12fdde..0000000 --- a/scripts/dds-ping +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/bash - -# Topic Publish -ros2 topic pub /ping std_msgs/msg/Header "{'stamp': 'now', frame_id: 'PING' }" \ No newline at end of file diff --git a/scripts/launch b/scripts/launch deleted file mode 100644 index d399d84..0000000 --- a/scripts/launch +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/bash - -default="isaac" -input=$1 -bringup=${input:-$default} - -echo "Quick Launching... ${bringup}" -ros2 launch edna_bringup $bringup.launch.py \ No newline at end of file diff --git a/scripts/local-setup.sh b/scripts/local-setup.sh deleted file mode 100644 index f353d3b..0000000 --- a/scripts/local-setup.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/bash -ORANGE='\033[0;33m' -RED='\033[0;31m' -GREEN='\033[0;32m' -NC='\033[0m' -SCRIPT_PATH=$(dirname "$0") -devenv_path="$SCRIPT_PATH/../.devcontainer/.env" - -# Graphics Driver Check -hasDriver=$(nvidia-smi | grep "Version: 525") -if [[ -z "$hasDriver" ]]; then - echo -e "${RED}Please install nvidia driver 525 before this install script${NC}" - exit 1 -fi - -echo -e "${ORANGE}INSTALLING APT PACKAGES${NC}" -sudo apt-get update -sudo apt-get install \ - apt-transport-https \ - ca-certificates \ - curl \ - gnupg-agent \ - software-properties-common \ - git-lfs -y - -# Stop ubuntu pop ups that applications are not responding -gsettings set org.gnome.mutter check-alive-timeout 60000 - -# Setup a unique domain -# Avoids conflicts with others on the same network -if [ -z "$(cat $devenv_path | grep ROS_NAMESPACE)" ]; then - echo -e "${ORANGE}SETTING ROS_NAMESPACE${NC}" - read -p "Enter a name for your ROS_NAMESPACE: " ros_namespace - echo "ROS_NAMESPACE=${ros_namespace}" >> $devenv_path -else - echo -e "${GREEN}ROS_NAMESPACE ALREADY SET${NC}" -fi - -# Docker -if [[ -z "$(which docker)" ]]; then - echo -e "${ORANGE}INSTALLING DOCKER${NC}" - curl https://get.docker.com | sh \ - && sudo systemctl --now enable docker - sudo usermod -aG docker $USER -else - echo -e "${GREEN}DOCKER ALREADY INSTALLED${NC}" -fi - - -# Nividia Docker -if ! dpkg -s nvidia-docker2 > /dev/null; then - echo -e "${ORANGE}INSTALLING NVIDIA DOCKER${NC}" - distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \ - && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \ - && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \ - sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ - sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list - sudo apt-get update - sudo apt-get install -y nvidia-docker2 - sudo systemctl restart docker -else - echo -e "${GREEN}NVIDIA DOCKER ALREADY INSTALLED${NC}" -fi - -# Deployment Keys -if [ ! -f ~/.ssh/robot_deploy ]; then - echo -e "${ORANGE}SETTING UP DEPLOY KEYS${NC}" - ssh-keygen -b 2048 -t rsa -f ~/.ssh/robot_deploy -q -N "" -else - echo -e "${GREEN}DEPLOY KEYS ALREADY SET${NC}" -fi \ No newline at end of file diff --git a/scripts/quickpub.py b/scripts/quickpub.py deleted file mode 100644 index a9ccdc9..0000000 --- a/scripts/quickpub.py +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/python3 -import time -import rclpy -from rclpy.node import Node -from sensor_msgs.msg import JointState -from threading import Thread - -JOINT_NAMES = [ - # Pneumatics - 'arm_roller_bar_joint', - 'top_slider_joint', - 'top_gripper_left_arm_joint', - 'bottom_gripper_left_arm_joint', - # Wheels - 'elevator_center_joint', - 'bottom_intake_joint', -] - -class ROSNode(Node): - def __init__(self): - super().__init__('quickpublisher') - self.publish_positions = [0.0]*6 - self.publisher = self.create_publisher(JointState, "/real/real_arm_commands", 10) - self.publishTimer = self.create_timer(0.5, self.publish) - - def publish(self): - msg = JointState() - msg.name = JOINT_NAMES - msg.position = self.publish_positions - self.publisher.publish(msg) - - -def main(): - rclpy.init() - node = ROSNode() - Thread(target=rclpy.spin, args=(node,)).start() - while True: - try: - joint_index = int(input("Joint index: ")) - position = float(input("Position: ")) - node.publish_positions[joint_index] = position - except: - print("Invalid input") - continue - -if __name__ == '__main__': - main() \ No newline at end of file diff --git a/scripts/real-startup/README.md b/scripts/real-startup/README.md deleted file mode 100644 index e69de29..0000000 diff --git a/scripts/real-startup/jetson/startup.sh b/scripts/real-startup/jetson/startup.sh deleted file mode 100644 index 58b655f..0000000 --- a/scripts/real-startup/jetson/startup.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -cd /home/sorineagle/edna2023/ -docker compose up \ No newline at end of file diff --git a/scripts/real-startup/jetson/stop.sh b/scripts/real-startup/jetson/stop.sh deleted file mode 100644 index 5d99f1c..0000000 --- a/scripts/real-startup/jetson/stop.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -cd /home/sorineagle/edna2023/ -docker compose down \ No newline at end of file diff --git a/scripts/real-startup/pi/edna.service b/scripts/real-startup/pi/edna.service deleted file mode 100644 index 1f70761..0000000 --- a/scripts/real-startup/pi/edna.service +++ /dev/null @@ -1,15 +0,0 @@ -[Unit] -Description=edna launch real on startup -Wants=network-online.target -After=network.target network-online.target - -[Service] -Type=simple -User=ubuntu -RemainAfterExit=yes -ExecStart=/usr/bin/bash /home/ubuntu/edna2023/scripts/real-startup/pi/startup.sh -Restart=always -RestartSec=1 - -[Install] -WantedBy=multi-user.target \ No newline at end of file diff --git a/scripts/real-startup/pi/post-recieve b/scripts/real-startup/pi/post-recieve deleted file mode 100644 index 7d1916b..0000000 --- a/scripts/real-startup/pi/post-recieve +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -cd /home/ubuntu/edna2023 -source /opt/ros/humble/setup.bash -colcon build --symlink-install --paths src/* -sudo systemctl restart edna.service \ No newline at end of file diff --git a/scripts/real-startup/pi/startup.sh b/scripts/real-startup/pi/startup.sh deleted file mode 100644 index ba712ce..0000000 --- a/scripts/real-startup/pi/startup.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -cd /home/ubuntu/edna2023/ -source /opt/ros/humble/setup.bash -source ./install/setup.bash -export ROS_NAMESPACE=real -export ROS_DOMAIN_ID=0 -ros2 launch edna_bringup real.launch.py \ No newline at end of file diff --git a/scripts/remote b/scripts/remote deleted file mode 100644 index e22f507..0000000 --- a/scripts/remote +++ /dev/null @@ -1,242 +0,0 @@ -#!/bin/bash - -ORANGE='\033[0;33m' -GREEN='\033[0;32m' -RED='\033[0;31m' -PURPLE='\033[0;35m' -NC='\033[0m' - -# Check /scripts/config/remote-config for script configuration -source /workspaces/edna2023/scripts/config/remote-config - -smart-deploy() { - echo "Deploying to $USERNAME@$IP_ADDRESS:$REMOTE_PATH (port $PORT) via rsync..." - - echo "Generating rsync metadata..." - rsync -azPin --checksum -e "ssh -p $PORT" \ - --exclude .git/ \ - --exclude .vscode/ \ - --exclude .devcontainer/ \ - --exclude build/ \ - --exclude install/ \ - --exclude log/ \ - --exclude rio/ \ - --exclude isaac/ \ - --exclude *.rviz \ - --exclude __pycache__ \ - --exclude joy \ - --exclude edna_debugger \ - --exclude edna_tests \ - --exclude .rsyncmetadata \ - /workspaces/edna2023/ $USERNAME@$IP_ADDRESS:$REMOTE_PATH \ - | egrep -v "sending incremental file list" | egrep -v "^\." | awk '{print $2}' | tr ' ' '\n' >> /workspaces/edna2023/.rsyncmetadata - - echo "Files that will be changed:" - printf '%s\n' $( /dev/null -ros2 daemon start \ No newline at end of file diff --git a/scripts/tests b/scripts/tests deleted file mode 100644 index 33ff582..0000000 --- a/scripts/tests +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -default="arm-tests" -input=$1 -test=${input:-$default} - -echo "Quick Running Test ${test}..." -ros2 run edna_tests $test \ No newline at end of file diff --git a/scripts/yolo b/scripts/yolo deleted file mode 100644 index e69de29..0000000 From 503d7454800a096aa5df504b60153a0513660f3b Mon Sep 17 00:00:00 2001 From: nchan18 Date: Wed, 26 Mar 2025 07:32:32 +0000 Subject: [PATCH 4/5] fixed permission issue --- .devcontainer/devcontainer.json | 9 +++++---- .devcontainer/postCreate.sh | 28 +++++++--------------------- 2 files changed, 12 insertions(+), 25 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 28dbfb5..f969c2f 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,10 +1,10 @@ { "name": "DevEnv", - "image": "ghcr.io/gold-rush-robotics/dev_env:2", + "image": "ghcr.io/gold-rush-robotics/dev_env:4", "workspaceMount": "source=${localWorkspaceFolder},target=/workspace/DevEnv,type=bind", "workspaceFolder": "/workspace/DevEnv", "containerEnv": { - "SHELL": "/usr/bin/zsh", + "SHELL": "zsh", "ROS_DOMAIN_ID": "0", "FASTRTPS_DEFAULT_PROFILES_FILE": "/usr/local/share/middleware_profiles/rtps_udp_profile.xml", "WORKSPACE_LOCAL_PATH": "${localWorkspaceFolder}", @@ -22,8 +22,8 @@ "capAdd": ["SYS_PTRACE"], "mounts": [ "source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind", // docker - "source=${localEnv:HOME}/docker/vscode,target=/home/admin/.vscode-server,type=bind", // vscode - "source=${localEnv:HOME}/.ssh,target=/home/admin/.ssh,type=bind" // vscode + // "source=${localEnv:HOME}/docker/vscode,target=/home/admin/.vscode-server,type=bind", // vscode + // "source=${localEnv:HOME}/.ssh,target=/home/admin/.ssh,type=bind" // vscode ], "runArgs": [ "--privileged", @@ -43,4 +43,5 @@ ] } } + } \ No newline at end of file diff --git a/.devcontainer/postCreate.sh b/.devcontainer/postCreate.sh index 5362c7b..1935aba 100644 --- a/.devcontainer/postCreate.sh +++ b/.devcontainer/postCreate.sh @@ -1,24 +1,10 @@ #!/bin/bash -echo "source /opt/ros/jazzy/setup.bash" - -git config --global core.filemode false -git config devcontainers-theme.show-dirty 1 +echo "source /opt/ros/jazzy/setup.zsh" | sudo tee -a ~/.zshrc > /dev/null +echo 'export ZSH="$HOME/.oh-my-zsh"' | sudo tee -a ~/.zshrc > /dev/null sed -i 's/ZSH_THEME="devcontainers"/ZSH_THEME="eastwood"/' ~/.zshrc +echo "source /opt/ros/jazzy/setup.zsh" | sudo tee -a ~/.zshrc > /dev/null +echo "export ROS_DISTRO=jazzy" | sudo tee -a ~/.zshrc > /dev/null +echo "export RCUTILS_COLORIZED_OUTPUT=1" | sudo tee -a ~/.zshrc > /dev/null +echo 'complete -o nospace -o default -F _python_argcomplete "ros2"' | sudo tee -a ~/.zshrc > /dev/null +echo 'alias python="python3"' | sudo tee -a ~/.zshrc > /dev/null -echo "source /opt/ros/jazzy/setup.zsh" >> ~/.zshrc -echo "source /home/admin/workspaces/rtab_ws/install/setup.zsh" >> ~/.zshrc -# echo "if [ ! -d /workspaces/edna2023/install ]; then" >> ~/.zshrc -echo "echo -e 'No install folder found remember to build with ctrl + shift + b\n';" >> ~/.zshrc -# echo "else source /workspaces/edna2023/install/setup.zsh; fi" >> ~/.zshrc -echo "export ROS_DISTRO=jazzy" >> ~/.zshrc -echo "export RCUTILS_COLORIZED_OUTPUT=1" >> ~/.zshrc -echo 'complete -o nospace -o default -F _python_argcomplete "ros2"' >> ~/.zshrc -echo 'alias python="python3"' >> ~/.zshrc - - -# Update apt list and rosdep -# Skipping since this will be done recently in docker file -# sudo apt-get update -# rosdep update --rosdistro=jazzy -# rosdep install --from-paths src --ignore-src -r -y -# rm -rf /workspaces/edna2023/install /workspaces/edna2023/build /workspaces/edna2023/log From 3cf88e39678d5df1c5a5fdfb68c215bb3a0cdfcb Mon Sep 17 00:00:00 2001 From: ZacHowardUNCC Date: Tue, 4 Nov 2025 20:28:33 -0500 Subject: [PATCH 5/5] image changed --- .devcontainer/devcontainer.json | 2 +- .devcontainer/init.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index f969c2f..a73eb5d 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,6 +1,6 @@ { "name": "DevEnv", - "image": "ghcr.io/gold-rush-robotics/dev_env:4", + "image": "ghcr.io/gold-rush-robotics/dev_env:5", "workspaceMount": "source=${localWorkspaceFolder},target=/workspace/DevEnv,type=bind", "workspaceFolder": "/workspace/DevEnv", "containerEnv": { diff --git a/.devcontainer/init.sh b/.devcontainer/init.sh index b04dc80..ba20e2c 100644 --- a/.devcontainer/init.sh +++ b/.devcontainer/init.sh @@ -1,5 +1,5 @@ #!/bin/bash # Pull the actual image so it is saved locally -docker pull ghcr.io/gold-rush-robotics/dev_env:2 +docker pull ghcr.io/gold-rush-robotics/dev_env:5 mkdir -p ~/docker/vscode echo "Display to use: $DISPLAY"