From 43a4d53f0ec42052af0eb06a3a4b77d35b5b2633 Mon Sep 17 00:00:00 2001 From: Naza Date: Sat, 6 Aug 2022 15:29:36 +0100 Subject: [PATCH 01/27] Added novnc proxy --- Dockerfile | 7 +++++-- README.md | 46 ++++--------------------------------------- compose/vnc/dwm | Bin 0 -> 61408 bytes compose/vnc/setup.sh | 9 +++++++++ compose/vnc/st | Bin 0 -> 101592 bytes docker-compose.yml | 16 +++++++++++++++ 6 files changed, 34 insertions(+), 44 deletions(-) create mode 100755 compose/vnc/dwm create mode 100644 compose/vnc/setup.sh create mode 100755 compose/vnc/st create mode 100644 docker-compose.yml diff --git a/Dockerfile b/Dockerfile index 053f1a7..e86045e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,17 +2,20 @@ FROM ros:melodic-robot-bionic # install dependencies for the F1Tenth simulator and wget (and now pip) -RUN sudo apt-get update +RUN sudo apt update -RUN sudo apt-get -y install ros-melodic-ackermann-msgs ros-melodic-tf2-geometry-msgs ros-melodic-interactive-markers ros-melodic-cv-bridge ros-melodic-image-transport ros-melodic-rviz ros-melodic-joy ros-melodic-map-server wget vim python3-pip +RUN sudo apt install -y ros-melodic-ackermann-msgs ros-melodic-tf2-geometry-msgs ros-melodic-interactive-markers ros-melodic-cv-bridge ros-melodic-image-transport ros-melodic-rviz ros-melodic-joy ros-melodic-map-server wget neovim python3-pip netcat x11vnc xvfb # switch to bash for running commands # mightn't be necessary RUN pip3 install -U pip +EXPOSE 5900 + RUN rm /bin/sh && ln -s /bin/bash /bin/sh # initialise ROS, pull useful scripts from our repo and clone the F1Tenth simulator into a new catkin workspace RUN source /ros_entrypoint.sh && \ + git clone https://github.com/novnc/noVNC.git /noVNC && \ source /opt/ros/melodic/setup.bash && \ git clone https://github.com/FT-Autonomous/f1tenth-ros-setup.git && \ mv f1tenth-ros-setup/utils /utils && \ diff --git a/README.md b/README.md index 3c3a12a..ec855e6 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ The build might take a while to load the first time you run it. ``` cd f1tenth-ros-setup -docker build -t f1tenth-ros . +docker compose build ``` #### 4. Run a Container @@ -70,7 +70,7 @@ docker build -t f1tenth-ros . This step will ensure the build has worked by running a container. Later we will run the simulator in this container. ``` -docker run -it f1tenth-ros +docker compse run f1tenth-ros ``` You should see your terminal display something like @@ -195,46 +195,8 @@ chmod +x ## Enabling the container to display GUIs on the host machine (Windows) -Prerequisite: Chocolatey must be installed on your computer. - -Warning: Some firewalls may block access so it might be necessary to disable your firewall when running the simulator. - -Open Windows Powershell as Administrator and install the `xming` package - -``` -choco install xming -``` - -Open the XLaunch Application - - - -Follow the default settings for each step except the following - - - -Once the XLaunch setup is finished, find your local IP Address by entering an ipconfig command in your local terminal - ``` -ipconfig +docker compose run -p 6080:6080 sh setup.sh ``` -Your local IP should be found similarly to where its shown below (ignore the white marks) - - - -Execute the setup-display script in the container passing your local IP Address as a parameter. - -``` -source /utils/set-display.sh -``` - -Now when you run the simulator you should see the display open in a new window. - -### Enabling the Container to display GUIs on the host machine (Ubuntu, and other) - -First, install [Rocker](https://github.com/osrf/rocker), then after you have built your image (step 3), run the following command in your Terminal to run the Docker image: - -``` -rocker [optional: --nvidia or --devices /dev/dri/card0] --x11 docker-ros -``` +Then open `localhost:6080` in your browser. diff --git a/compose/vnc/dwm b/compose/vnc/dwm new file mode 100755 index 0000000000000000000000000000000000000000..8638c8bc8ef2513f08b242c0912fd86d2d9e50e5 GIT binary patch literal 61408 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 F{{_6myo3M% literal 0 HcmV?d00001 diff --git a/compose/vnc/setup.sh b/compose/vnc/setup.sh new file mode 100644 index 0000000..4b52bba --- /dev/null +++ b/compose/vnc/setup.sh @@ -0,0 +1,9 @@ +export DISPLAY=:0 WINDOW_MANAGER=dwm +sleep 1 +Xvfb "$DISPLAY" -screen 0 1440x900x16 -ac -pn -noreset & 2> /dev/null +sleep 1 +nohup $WINDOW_MANAGER >/tmp/${WINDOW_MANAGER}.log & 2> /dev/null +sleep 1 +x11vnc -display $DISPLAY & +sleep 1 +./noVNC/utils/novnc_proxy --vnc localhost:5900 --listen 6080 diff --git a/compose/vnc/st b/compose/vnc/st new file mode 100755 index 0000000000000000000000000000000000000000..8b0892dcab08c0a9f69c645896b3497c79e59181 GIT binary patch literal 101592 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 literal 0 HcmV?d00001 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..e856e84 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,16 @@ +version: '3' + +services: + f1tenth-ros: + build: + context: . + dockerfile: Dockerfile + stdin_open: true + volumes: + - ./compose/vnc/dwm:/usr/bin/dwm + - ./compose/vnc/st:/usr/bin/st + - ./compose/vnc/setup.sh:/setup.sh + expose: [5900] + ports: + - 5900:5900 + - 6080:6080 From 8bc887bdbc85da9a813d1f026e8ded05f10e3cbd Mon Sep 17 00:00:00 2001 From: Naza Date: Sat, 6 Aug 2022 15:35:00 +0100 Subject: [PATCH 02/27] Added instructions on how to install docker-compose --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ec855e6..130fb57 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ A simplified setup and workspace for using F1Tenth with ROS and Docker. ### Windows/Mac * [git](https://www.atlassian.com/git/tutorials/install-git) * [Docker Desktop](https://www.docker.com/products/docker-desktop) +* [Docker Compose](https://docs.docker.com/compose/install/) ### Editor * [Visual Studio Code](https://www.toolsqa.com/blogs/install-visual-studio-code/) (unless you have some other preference) @@ -26,11 +27,12 @@ A simplified setup and workspace for using F1Tenth with ROS and Docker. * [Docker](https://www.docker.com/products/docker-desktop) * [Debian based](https://docs.docker.com/engine/install/ubuntu/) + * See [here](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-compose-on-ubuntu-20-04) for instructions on how to install docker compose on ubuntu. * [Arch based](https://wiki.archlinux.org/title/Docker) * `sudo pacman -S yay base-devel` - * `yay -S docker-git` + * `yay -S docker-git docker-compose` * [Gentoo based](https://wiki.gentoo.org/wiki/Docker) - * `sudo emerge app-containers/docker app-containers/docker-cli` + * `sudo emerge app-containers/docker app-containers/docker-cli app-containers/docker-compose` #### Systemd based - Debian/Arch etc * `sudo systemctl enable docker` From 3a39f4febb6f643d391d9b69ecbc96ca275f97e2 Mon Sep 17 00:00:00 2001 From: Naza Date: Sat, 6 Aug 2022 15:38:35 +0100 Subject: [PATCH 03/27] Added DWM guide --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 130fb57..34d595c 100644 --- a/README.md +++ b/README.md @@ -202,3 +202,7 @@ docker compose run -p 6080:6080 sh setup.sh ``` Then open `localhost:6080` in your browser. + +Use `Alt+Shift+Enter` to open the terminal. + +Type in `source /utils/run-simulator.sh Silverstone` From 59dca536559c38ea413a313cc0127f0f34bfee49 Mon Sep 17 00:00:00 2001 From: Naza Date: Sat, 6 Aug 2022 15:38:59 +0100 Subject: [PATCH 04/27] Fixed typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 34d595c..5046563 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ docker compose build This step will ensure the build has worked by running a container. Later we will run the simulator in this container. ``` -docker compse run f1tenth-ros +docker compose run f1tenth-ros ``` You should see your terminal display something like From 7e7a5e342bd9015ab9d2545dfdcdd16e3ffb925f Mon Sep 17 00:00:00 2001 From: Naza Date: Sat, 6 Aug 2022 15:45:32 +0100 Subject: [PATCH 05/27] Small fixes --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 5046563..f852dfa 100644 --- a/README.md +++ b/README.md @@ -195,13 +195,13 @@ chmod +x * Having multiple terminals open can get confusing, luckily in VSCode you can rename each terminal to something more convenient: Right-click terminal name -> rename. -## Enabling the container to display GUIs on the host machine (Windows) +## Enabling the container to display GUIs on the host machine ``` -docker compose run -p 6080:6080 sh setup.sh +docker compose run -p 6080:6080 f1tenth-ros sh setup.sh ``` -Then open `localhost:6080` in your browser. +Then open `localhost:6080/vnc.html` in your browser. Use `Alt+Shift+Enter` to open the terminal. From 5ebe4ffe5a19b1119038a04533964e6cc23255d7 Mon Sep 17 00:00:00 2001 From: Naza Date: Sat, 6 Aug 2022 16:01:01 +0100 Subject: [PATCH 06/27] 5900 doesnt need to be exposed --- Dockerfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index e86045e..94750d1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,8 +10,6 @@ RUN sudo apt install -y ros-melodic-ackermann-msgs ros-melodic-tf2-geometry-msgs # mightn't be necessary RUN pip3 install -U pip -EXPOSE 5900 - RUN rm /bin/sh && ln -s /bin/bash /bin/sh # initialise ROS, pull useful scripts from our repo and clone the F1Tenth simulator into a new catkin workspace RUN source /ros_entrypoint.sh && \ From ad2ff27fe60e6b94a12191010e791ed4f2f526ff Mon Sep 17 00:00:00 2001 From: alexandersep Date: Sat, 6 Aug 2022 16:04:56 +0100 Subject: [PATCH 07/27] Added and Changed Dwm help guide --- README.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f852dfa..36a6208 100644 --- a/README.md +++ b/README.md @@ -203,6 +203,20 @@ docker compose run -p 6080:6080 f1tenth-ros sh setup.sh Then open `localhost:6080/vnc.html` in your browser. -Use `Alt+Shift+Enter` to open the terminal. +Use `Win/Command+Shift+Enter` to open the terminal. + +Use `Win/Command+Shift+C` close applications + +Use `Win/Command+NUM` changes tags (where NUM is any number) + +Use `Win/Command+Shift+NUM` move application to tag (broken slightly for tags 2 and 3) + +Use `Win/Command+Shift+NUM` move application to tag + +Use `Win/Command+j` changes focus to application on the bottom + +Use `Win/Command+k` changes focus to application on the top + +Use `Win/Command+Enter` move application to main focus Type in `source /utils/run-simulator.sh Silverstone` From f48c4cbe07fe2cfdf8e82c669ffee5894bca5794 Mon Sep 17 00:00:00 2001 From: alexandersep Date: Sat, 6 Aug 2022 16:10:25 +0100 Subject: [PATCH 08/27] Changed dwm help guide to have a markdown table --- README.md | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 36a6208..cf66d76 100644 --- a/README.md +++ b/README.md @@ -203,20 +203,16 @@ docker compose run -p 6080:6080 f1tenth-ros sh setup.sh Then open `localhost:6080/vnc.html` in your browser. -Use `Win/Command+Shift+Enter` to open the terminal. -Use `Win/Command+Shift+C` close applications - -Use `Win/Command+NUM` changes tags (where NUM is any number) - -Use `Win/Command+Shift+NUM` move application to tag (broken slightly for tags 2 and 3) - -Use `Win/Command+Shift+NUM` move application to tag - -Use `Win/Command+j` changes focus to application on the bottom - -Use `Win/Command+k` changes focus to application on the top - -Use `Win/Command+Enter` move application to main focus +| Commands | Action | +|:--------------------------|:-----------------------------------------------------------| +| `Win/Command+Shift+Enter` | to open the terminal. | +| `Win/Command+Shift+c` | close applications | +| `Win/Command+NUM` | changes tags (where NUM is any number) | +| `Win/Command+Shift+NUM` | move application to tag (broken slightly for tags 2 and 3) | +| `Win/Command+Shift+NUM` | move application to tag | +| `Win/Command+j` | changes focus to application on the bottom | +| `Win/Command+k` | changes focus to application on the top | +| `Win/Command+Enter` | move application to main focus | Type in `source /utils/run-simulator.sh Silverstone` From d451735fb58a9cd3b0643bdef91cbf7b33a1f996 Mon Sep 17 00:00:00 2001 From: Naza Date: Sat, 6 Aug 2022 16:12:49 +0100 Subject: [PATCH 09/27] Make last line more helpful --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cf66d76..92c7b43 100644 --- a/README.md +++ b/README.md @@ -215,4 +215,4 @@ Then open `localhost:6080/vnc.html` in your browser. | `Win/Command+k` | changes focus to application on the top | | `Win/Command+Enter` | move application to main focus | -Type in `source /utils/run-simulator.sh Silverstone` +Open a terminal and then type in `source /utils/run-simulator.sh Silverstone`. From 3cc672574c36d1df0cf841df5fb4518b12b34501 Mon Sep 17 00:00:00 2001 From: Naza Date: Sat, 6 Aug 2022 16:21:50 +0100 Subject: [PATCH 10/27] Now using super instead of alt for mod key --- compose/vnc/dwm | Bin 61408 -> 61408 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/compose/vnc/dwm b/compose/vnc/dwm index 8638c8bc8ef2513f08b242c0912fd86d2d9e50e5..4f3a659ff41f4bc22a802af129c212a6c6ace5e4 100755 GIT binary patch delta 460 zcmXxaJxat-6o%oPNhN3@3SuF{bRt$3g5AB~?7>2i?7~?CwitAy1lTM+Dq-F_Vh&0 l^g_2+_ELMPz0{tb=$T&Vwq!50m)cA1>4~1lyD!V1<6p+jnlu0a delta 460 zcmXZSze>YU7>04brb7blQ0n4T3LTxDTrzqCx(JdBaPtO&uARQc^$f0(8vk@Xh?9#T zI0@|;1i_2YH;>8i%g1xx?Izo9vgT^A`~ERK98OM;Pm1Ny^K!8`|9t&!uLq-B%l)RA z$rt=;&iw6XSlG`0cj=SWv@3gAU-mEhqyObzuVz+wkhw=pXm?$iV~G{k7%_DD~3dtfieUP|qy_VhrH^hCEu_ELMPz0{r_ n=#if2_QYOlFSVE2(*r%y6W!MArS?*LsXaZ=V|TY{{d@2S2?CJD From 4a6adee8fcd50d12bfda79194d74b52bcd286765 Mon Sep 17 00:00:00 2001 From: Naza Date: Sat, 6 Aug 2022 17:05:52 +0100 Subject: [PATCH 11/27] Build suckless software locally to prevent binary incompatibility --- Dockerfile | 5 ++++- compose/vnc/dwm | Bin 61408 -> 0 bytes compose/vnc/st | Bin 101592 -> 0 bytes docker-compose.yml | 2 -- 4 files changed, 4 insertions(+), 3 deletions(-) delete mode 100755 compose/vnc/dwm delete mode 100755 compose/vnc/st diff --git a/Dockerfile b/Dockerfile index 94750d1..1ad7d18 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,7 @@ FROM ros:melodic-robot-bionic # install dependencies for the F1Tenth simulator and wget (and now pip) RUN sudo apt update -RUN sudo apt install -y ros-melodic-ackermann-msgs ros-melodic-tf2-geometry-msgs ros-melodic-interactive-markers ros-melodic-cv-bridge ros-melodic-image-transport ros-melodic-rviz ros-melodic-joy ros-melodic-map-server wget neovim python3-pip netcat x11vnc xvfb +RUN sudo apt install -y ros-melodic-ackermann-msgs ros-melodic-tf2-geometry-msgs ros-melodic-interactive-markers ros-melodic-cv-bridge ros-melodic-image-transport ros-melodic-rviz ros-melodic-joy ros-melodic-map-server wget neovim python3-pip netcat x11vnc xvfb xorg-dev # switch to bash for running commands # mightn't be necessary @@ -12,6 +12,9 @@ RUN pip3 install -U pip RUN rm /bin/sh && ln -s /bin/bash /bin/sh # initialise ROS, pull useful scripts from our repo and clone the F1Tenth simulator into a new catkin workspace +RUN git clone https://git.suckless.org/st/ && cd st && make install +RUN git clone https://github.com/FT-Autonomous/dwm && cd dwm && make install + RUN source /ros_entrypoint.sh && \ git clone https://github.com/novnc/noVNC.git /noVNC && \ source /opt/ros/melodic/setup.bash && \ diff --git a/compose/vnc/dwm b/compose/vnc/dwm deleted file mode 100755 index 4f3a659ff41f4bc22a802af129c212a6c6ace5e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61408 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 diff --git a/docker-compose.yml b/docker-compose.yml index e856e84..6187890 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,8 +7,6 @@ services: dockerfile: Dockerfile stdin_open: true volumes: - - ./compose/vnc/dwm:/usr/bin/dwm - - ./compose/vnc/st:/usr/bin/st - ./compose/vnc/setup.sh:/setup.sh expose: [5900] ports: From 6f8efbfd2eda69f296a433e4efbd3473c9297734 Mon Sep 17 00:00:00 2001 From: Naza Date: Sat, 6 Aug 2022 17:06:07 +0100 Subject: [PATCH 12/27] Change workflow to reflect new method of building the container --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index af37d2d..c8e90d8 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -10,4 +10,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - - run: docker build . \ No newline at end of file + - run: docker compose build From fd60f17d67a43b6ad61804ffb077f6c984fa2b4b Mon Sep 17 00:00:00 2001 From: alexandersep Date: Sat, 6 Aug 2022 17:15:07 +0100 Subject: [PATCH 13/27] Changed dockerFile to properly isntall dwm and st --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 1ad7d18..696d16e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,8 +12,8 @@ RUN pip3 install -U pip RUN rm /bin/sh && ln -s /bin/bash /bin/sh # initialise ROS, pull useful scripts from our repo and clone the F1Tenth simulator into a new catkin workspace -RUN git clone https://git.suckless.org/st/ && cd st && make install -RUN git clone https://github.com/FT-Autonomous/dwm && cd dwm && make install +RUN git clone https://git.suckless.org/st/ && cd st && make clean install +RUN git clone https://github.com/FT-Autonomous/dwm && cd dwm && make clean install RUN source /ros_entrypoint.sh && \ git clone https://github.com/novnc/noVNC.git /noVNC && \ From 1a755a3d35e63d4dc882622258f20a17e220fdfd Mon Sep 17 00:00:00 2001 From: alexandersep Date: Sat, 6 Aug 2022 17:27:34 +0100 Subject: [PATCH 14/27] modified dwm section to point to our forked repository --- README.md | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/README.md b/README.md index 92c7b43..c400846 100644 --- a/README.md +++ b/README.md @@ -203,16 +203,6 @@ docker compose run -p 6080:6080 f1tenth-ros sh setup.sh Then open `localhost:6080/vnc.html` in your browser. - -| Commands | Action | -|:--------------------------|:-----------------------------------------------------------| -| `Win/Command+Shift+Enter` | to open the terminal. | -| `Win/Command+Shift+c` | close applications | -| `Win/Command+NUM` | changes tags (where NUM is any number) | -| `Win/Command+Shift+NUM` | move application to tag (broken slightly for tags 2 and 3) | -| `Win/Command+Shift+NUM` | move application to tag | -| `Win/Command+j` | changes focus to application on the bottom | -| `Win/Command+k` | changes focus to application on the top | -| `Win/Command+Enter` | move application to main focus | +[DWM Keybinding](https://github.com/FT-Autonomous/dwm) (keybindings for general use in the docker container) Open a terminal and then type in `source /utils/run-simulator.sh Silverstone`. From 7f381b566090f568fa6b464cb5408e95e8d7f843 Mon Sep 17 00:00:00 2001 From: Naza Date: Sat, 6 Aug 2022 17:44:42 +0100 Subject: [PATCH 15/27] Suggest using a VNC client if using a web browser doesn't work --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index c400846..aee6475 100644 --- a/README.md +++ b/README.md @@ -206,3 +206,16 @@ Then open `localhost:6080/vnc.html` in your browser. [DWM Keybinding](https://github.com/FT-Autonomous/dwm) (keybindings for general use in the docker container) Open a terminal and then type in `source /utils/run-simulator.sh Silverstone`. + +You may experience problems when running the sim in a browser, such as modifier keys not being captured properlies. +If this is the case, you can install a dedicated VNC client. +On linux, you can use remmina. +MacOS has a built in VNC client which you can use in the terminal via `open vnc://ADDRESS:PORT`. + +Once you have installed a VNC client, run: + +``` +docker compose run -p 5900:5900 f1tenth-ros sh setup.sh +``` + +Then, in your VNC client, connect to `localhost:5900`. From 381dac9a8678f55bf7dc8e7ec2500e71145319f0 Mon Sep 17 00:00:00 2001 From: Naza Date: Sat, 6 Aug 2022 20:55:28 +0100 Subject: [PATCH 16/27] H7 english -> H6 english --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index aee6475..4a1c7d2 100644 --- a/README.md +++ b/README.md @@ -203,12 +203,11 @@ docker compose run -p 6080:6080 f1tenth-ros sh setup.sh Then open `localhost:6080/vnc.html` in your browser. -[DWM Keybinding](https://github.com/FT-Autonomous/dwm) (keybindings for general use in the docker container) +[DWM Keybindings](https://github.com/FT-Autonomous/dwm) (keybindings for general use in the docker container) Open a terminal and then type in `source /utils/run-simulator.sh Silverstone`. -You may experience problems when running the sim in a browser, such as modifier keys not being captured properlies. -If this is the case, you can install a dedicated VNC client. +You may experience problems when running the sim in a browser, such as modifier keys not being captured properly, you can install a dedicated VNC client. On linux, you can use remmina. MacOS has a built in VNC client which you can use in the terminal via `open vnc://ADDRESS:PORT`. From abd2dcf2f107e88175cec696c69618c7bdbe7498 Mon Sep 17 00:00:00 2001 From: alexandersep Date: Sat, 6 Aug 2022 22:00:42 +0100 Subject: [PATCH 17/27] Added/Modified information regarding VNC client section --- README.md | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4a1c7d2..b1d68a5 100644 --- a/README.md +++ b/README.md @@ -198,7 +198,7 @@ chmod +x ## Enabling the container to display GUIs on the host machine ``` -docker compose run -p 6080:6080 f1tenth-ros sh setup.sh +docker compose run -p 5900:5900 f1tenth-ros sh setup.sh ``` Then open `localhost:6080/vnc.html` in your browser. @@ -207,9 +207,21 @@ Then open `localhost:6080/vnc.html` in your browser. Open a terminal and then type in `source /utils/run-simulator.sh Silverstone`. -You may experience problems when running the sim in a browser, such as modifier keys not being captured properly, you can install a dedicated VNC client. -On linux, you can use remmina. -MacOS has a built in VNC client which you can use in the terminal via `open vnc://ADDRESS:PORT`. +### VNC +Make sure to use a VNC client in order to run the sim. + +#### MacOS +A VNC client exists which you can use in the terminal via `open vnc://ADDRESS:PORT`. + +#### Linux +A VNC client can be installed called remmina + * [Debian based](https://remmina.org/how-to-install-remmina/) + * It is not found in the apt repository but you can use snap/flatpaks or adding it to the apt repository + * Arch based + * `sudo pacman -S remmina libvncserver` + * [Gentoo based](https://wiki.gentoo.org/wiki/USE_flag) (see more on how to use use flags) + * Make sure to update USE flag for package to include the `vnc` USE Flag + * `sudo emerge net-misc/remmina net-libs/libvncserver` Once you have installed a VNC client, run: @@ -218,3 +230,6 @@ docker compose run -p 5900:5900 f1tenth-ros sh setup.sh ``` Then, in your VNC client, connect to `localhost:5900`. + +On Remmina if some keystrokes are not captured such as modifier keys like shift/ctrl/alt. Make sure to turn on `Grab all keyboard events` on the left hand side. +You can also activate it by pressing `Control_R` From 817ad8ca99431006a321e81558efe13a58ae520d Mon Sep 17 00:00:00 2001 From: Alex <71922720+alexandersep@users.noreply.github.com> Date: Sat, 6 Aug 2022 21:08:56 +0000 Subject: [PATCH 18/27] Fixed markdown alignment on section VNC --- README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index b1d68a5..262b6a0 100644 --- a/README.md +++ b/README.md @@ -207,21 +207,21 @@ Then open `localhost:6080/vnc.html` in your browser. Open a terminal and then type in `source /utils/run-simulator.sh Silverstone`. -### VNC +## VNC Make sure to use a VNC client in order to run the sim. -#### MacOS +### MacOS A VNC client exists which you can use in the terminal via `open vnc://ADDRESS:PORT`. -#### Linux +### Linux A VNC client can be installed called remmina - * [Debian based](https://remmina.org/how-to-install-remmina/) - * It is not found in the apt repository but you can use snap/flatpaks or adding it to the apt repository - * Arch based - * `sudo pacman -S remmina libvncserver` - * [Gentoo based](https://wiki.gentoo.org/wiki/USE_flag) (see more on how to use use flags) - * Make sure to update USE flag for package to include the `vnc` USE Flag - * `sudo emerge net-misc/remmina net-libs/libvncserver` + * [Debian based](https://remmina.org/how-to-install-remmina/) + * It is not found in the apt repository but you can use snap/flatpaks or adding it to the apt repository + * Arch based + * `sudo pacman -S remmina libvncserver` + * [Gentoo based](https://wiki.gentoo.org/wiki/USE_flag) (see more on how to use use flags) + * Make sure to update USE flag for package to include the `vnc` USE Flag + * `sudo emerge net-misc/remmina net-libs/libvncserver` Once you have installed a VNC client, run: From 22e6c71508a07acacd2358aa1207ba41abfde24c Mon Sep 17 00:00:00 2001 From: Naza Date: Sat, 6 Aug 2022 23:47:33 +0100 Subject: [PATCH 19/27] Windows should no longer clobber line endings --- .gitattributes | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..552642c --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.sh text eol=lf From dad0166d936b579d7cfb56c701c8d4e668e86c7a Mon Sep 17 00:00:00 2001 From: Naza Date: Sat, 6 Aug 2022 23:56:07 +0100 Subject: [PATCH 20/27] Expose directive redundant here --- docker-compose.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 6187890..e628a40 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,7 +8,6 @@ services: stdin_open: true volumes: - ./compose/vnc/setup.sh:/setup.sh - expose: [5900] ports: - 5900:5900 - 6080:6080 From 5a0d14fbea06e575a8a06bd60cf8e6c251889b19 Mon Sep 17 00:00:00 2001 From: Naza Date: Sun, 7 Aug 2022 09:13:52 +0100 Subject: [PATCH 21/27] Restructured VNC section. The command given now exposes both the VNC port and the NoVNC port. The in-browser approach is listed among the platform specific approaches --- README.md | 47 +++++++++++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 262b6a0..8e0d2ab 100644 --- a/README.md +++ b/README.md @@ -5,14 +5,17 @@ A simplified setup and workspace for using F1Tenth with ROS and Docker. ## Prerequisites ### Windows/Mac + * [git](https://www.atlassian.com/git/tutorials/install-git) * [Docker Desktop](https://www.docker.com/products/docker-desktop) * [Docker Compose](https://docs.docker.com/compose/install/) ### Editor + * [Visual Studio Code](https://www.toolsqa.com/blogs/install-visual-studio-code/) (unless you have some other preference) ### Linux + * Make sure to sync packages before installing new packages * [git](https://www.atlassian.com/git/tutorials/install-git) * Debian based @@ -195,26 +198,27 @@ chmod +x * Having multiple terminals open can get confusing, luckily in VSCode you can rename each terminal to something more convenient: Right-click terminal name -> rename. -## Enabling the container to display GUIs on the host machine +## Using the GUI within the Docker Container via VNC + +First, run the container with the VNC ports exposed. ``` -docker compose run -p 5900:5900 f1tenth-ros sh setup.sh +docker compose run -p 5900:5900 -p 6080:6080 f1tenth-ros sh setup.sh ``` -Then open `localhost:6080/vnc.html` in your browser. +### Connecting to the Docker Container Using a VNC Client -[DWM Keybindings](https://github.com/FT-Autonomous/dwm) (keybindings for general use in the docker container) +There is a universal method, though you will have a better experience using a dedicated VNC client. -Open a terminal and then type in `source /utils/run-simulator.sh Silverstone`. +#### MacOS -## VNC -Make sure to use a VNC client in order to run the sim. +MacOS comes with a built in VNC client. +Once the docker container is running, you can open it using `open vnc://localhost:5900`. -### MacOS -A VNC client exists which you can use in the terminal via `open vnc://ADDRESS:PORT`. +#### Linux + +A VNC client can be installed called remmina: -### Linux -A VNC client can be installed called remmina * [Debian based](https://remmina.org/how-to-install-remmina/) * It is not found in the apt repository but you can use snap/flatpaks or adding it to the apt repository * Arch based @@ -223,13 +227,20 @@ A VNC client can be installed called remmina * Make sure to update USE flag for package to include the `vnc` USE Flag * `sudo emerge net-misc/remmina net-libs/libvncserver` -Once you have installed a VNC client, run: +Create a new connection to `localhost:5900` using the VNC plugin. -``` -docker compose run -p 5900:5900 f1tenth-ros sh setup.sh -``` +On Remmina if some keystrokes are not captured such as modifier keys like shift/ctrl/alt. +Make sure to turn on `Grab all keyboard events` on the left hand side. +You can also activate it by pressing `Control_R` -Then, in your VNC client, connect to `localhost:5900`. +#### Universal -On Remmina if some keystrokes are not captured such as modifier keys like shift/ctrl/alt. Make sure to turn on `Grab all keyboard events` on the left hand side. -You can also activate it by pressing `Control_R` +Open `localhost:6080/vnc_light.html` in your browser. + +*Key combinations may work properly if you use the in browser VNC client* + +### Running the Simulator + +[DWM Keybindings](https://github.com/FT-Autonomous/dwm) (keybindings for general use in the docker container) + +Open a terminal and then type in `source /utils/run-simulator.sh Silverstone`. From 70d20b164f31bc4a12b9aaf0c014599627ee51c6 Mon Sep 17 00:00:00 2001 From: Naza Date: Thu, 11 Aug 2022 23:31:12 +0100 Subject: [PATCH 22/27] Added python3-numpy --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 696d16e..b1b0636 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,7 @@ FROM ros:melodic-robot-bionic # install dependencies for the F1Tenth simulator and wget (and now pip) RUN sudo apt update -RUN sudo apt install -y ros-melodic-ackermann-msgs ros-melodic-tf2-geometry-msgs ros-melodic-interactive-markers ros-melodic-cv-bridge ros-melodic-image-transport ros-melodic-rviz ros-melodic-joy ros-melodic-map-server wget neovim python3-pip netcat x11vnc xvfb xorg-dev +RUN sudo apt install -y ros-melodic-ackermann-msgs ros-melodic-tf2-geometry-msgs ros-melodic-interactive-markers ros-melodic-cv-bridge ros-melodic-image-transport ros-melodic-rviz ros-melodic-joy ros-melodic-map-server wget neovim python3-pip netcat x11vnc xvfb xorg-dev python3-numpy # switch to bash for running commands # mightn't be necessary From dd92d6b2df91651c337f220f056a3677d9f765b8 Mon Sep 17 00:00:00 2001 From: Naza Date: Thu, 11 Aug 2022 23:33:21 +0100 Subject: [PATCH 23/27] Reintroduced rocker tutorial since as its better than VNC, added password and -noxrecord so that things work properly on osx --- README.md | 21 ++++++++++++++++----- compose/vnc/setup.sh | 9 --------- docker-compose.yml | 4 +++- utils/setup-vnc.sh | 9 +++++++++ 4 files changed, 28 insertions(+), 15 deletions(-) delete mode 100644 compose/vnc/setup.sh create mode 100755 utils/setup-vnc.sh diff --git a/README.md b/README.md index 8e0d2ab..5ed9e63 100644 --- a/README.md +++ b/README.md @@ -75,10 +75,10 @@ docker compose build This step will ensure the build has worked by running a container. Later we will run the simulator in this container. ``` -docker compose run f1tenth-ros +docker compose run f1tenth-ros bash ``` -You should see your terminal display something like +You should see your terminal display something like: ``` root@...:/# @@ -203,7 +203,7 @@ chmod +x First, run the container with the VNC ports exposed. ``` -docker compose run -p 5900:5900 -p 6080:6080 f1tenth-ros sh setup.sh +docker compose run --rm --service-ports f1tenth-ros ``` ### Connecting to the Docker Container Using a VNC Client @@ -213,7 +213,7 @@ There is a universal method, though you will have a better experience using a de #### MacOS MacOS comes with a built in VNC client. -Once the docker container is running, you can open it using `open vnc://localhost:5900`. +Once the docker container is running, you can open it using `open vnc://root:f1tenth@localhost:5900`. #### Linux @@ -227,7 +227,7 @@ A VNC client can be installed called remmina: * Make sure to update USE flag for package to include the `vnc` USE Flag * `sudo emerge net-misc/remmina net-libs/libvncserver` -Create a new connection to `localhost:5900` using the VNC plugin. +Create a new connection to `localhost:5900` with the password `f1tenth` using the VNC plugin. On Remmina if some keystrokes are not captured such as modifier keys like shift/ctrl/alt. Make sure to turn on `Grab all keyboard events` on the left hand side. @@ -236,6 +236,7 @@ You can also activate it by pressing `Control_R` #### Universal Open `localhost:6080/vnc_light.html` in your browser. +Enter the password `f1tenth` when prompted. *Key combinations may work properly if you use the in browser VNC client* @@ -244,3 +245,13 @@ Open `localhost:6080/vnc_light.html` in your browser. [DWM Keybindings](https://github.com/FT-Autonomous/dwm) (keybindings for general use in the docker container) Open a terminal and then type in `source /utils/run-simulator.sh Silverstone`. + +## Enabling the Container to display GUIs on the host machine using rocker (Linux) + +Rocker integrates much better with the host machine than a VNC client. + +First, install [Rocker](https://github.com/osrf/rocker), then after you have built your image (step 3), run the following command in your Terminal to run the Docker image: + +``` +rocker [optional: --nvidia or --devices /dev/dri/card0] --x11 +``` diff --git a/compose/vnc/setup.sh b/compose/vnc/setup.sh deleted file mode 100644 index 4b52bba..0000000 --- a/compose/vnc/setup.sh +++ /dev/null @@ -1,9 +0,0 @@ -export DISPLAY=:0 WINDOW_MANAGER=dwm -sleep 1 -Xvfb "$DISPLAY" -screen 0 1440x900x16 -ac -pn -noreset & 2> /dev/null -sleep 1 -nohup $WINDOW_MANAGER >/tmp/${WINDOW_MANAGER}.log & 2> /dev/null -sleep 1 -x11vnc -display $DISPLAY & -sleep 1 -./noVNC/utils/novnc_proxy --vnc localhost:5900 --listen 6080 diff --git a/docker-compose.yml b/docker-compose.yml index e628a40..536357b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,12 +2,14 @@ version: '3' services: f1tenth-ros: + user: root build: context: . dockerfile: Dockerfile stdin_open: true volumes: - - ./compose/vnc/setup.sh:/setup.sh + - ./utils:/utils + - ./utils/setup-vnc.sh:/setup.sh ports: - 5900:5900 - 6080:6080 diff --git a/utils/setup-vnc.sh b/utils/setup-vnc.sh new file mode 100755 index 0000000..addc362 --- /dev/null +++ b/utils/setup-vnc.sh @@ -0,0 +1,9 @@ +#!/bin/sh +export SCREEN=0 DISPLAY=:0 WINDOW_MANAGER=dwm +source /ros_entrypoint.sh +[ -f /tmp/.X* ] && rm /tmp.X* +Xvfb "$DISPLAY" -screen $SCREEN 1280x720x16 -ac -pn -noreset & sleep 1 +nohup $WINDOW_MANAGER > /tmp/${WINDOW_MANAGER}.log & +x11vnc -forever -noxdamage -noxrecord -display $DISPLAY -passwd f1tenth & +./noVNC/utils/novnc_proxy --vnc localhost:5900 --listen 6080 & +exec "${@-sh}" From 257c0c0e2fddef6a769df96510c22f56c7d0ce7f Mon Sep 17 00:00:00 2001 From: Naza Date: Thu, 11 Aug 2022 23:33:37 +0100 Subject: [PATCH 24/27] Light=>lite --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5ed9e63..4825a61 100644 --- a/README.md +++ b/README.md @@ -235,7 +235,7 @@ You can also activate it by pressing `Control_R` #### Universal -Open `localhost:6080/vnc_light.html` in your browser. +Open `localhost:6080/vnc_lite.html` in your browser. Enter the password `f1tenth` when prompted. *Key combinations may work properly if you use the in browser VNC client* From 4fddb93995a36be0b220bbfa80c934650e3cf2e6 Mon Sep 17 00:00:00 2001 From: Naza Date: Thu, 11 Aug 2022 23:57:03 +0100 Subject: [PATCH 25/27] Use docker compose services for VSCode users --- README.md | 53 ++++++++++++++++++++++++---------------------- docker-compose.yml | 6 +++++- 2 files changed, 33 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 4825a61..46578bf 100644 --- a/README.md +++ b/README.md @@ -16,33 +16,36 @@ A simplified setup and workspace for using F1Tenth with ROS and Docker. ### Linux -* Make sure to sync packages before installing new packages -* [git](https://www.atlassian.com/git/tutorials/install-git) - * Debian based - * `sudo apt update` (syncing packages) - * `sudo apt install git` - * Arch based - * `sudo pacman -Sy` (syncing packages) - * `sudo pacman -S git` - * Gentoo based - * `sudo emerge --sync` (syncing packages) - * `sudo emerge git` +Make sure to sync packages before installing new packages + +#### Git - + +* Debian based + * `sudo apt update` (syncing packages) + * `sudo apt install git` +* Arch based + * `sudo pacman -Sy` (syncing packages) + * `sudo pacman -S git` +* Gentoo based + * `sudo emerge --sync` (syncing packages) + * `sudo emerge git` -* [Docker](https://www.docker.com/products/docker-desktop) - * [Debian based](https://docs.docker.com/engine/install/ubuntu/) - * See [here](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-compose-on-ubuntu-20-04) for instructions on how to install docker compose on ubuntu. - * [Arch based](https://wiki.archlinux.org/title/Docker) - * `sudo pacman -S yay base-devel` - * `yay -S docker-git docker-compose` - * [Gentoo based](https://wiki.gentoo.org/wiki/Docker) - * `sudo emerge app-containers/docker app-containers/docker-cli app-containers/docker-compose` - -#### Systemd based - Debian/Arch etc +#### Docker - + +* [Debian based](https://docs.docker.com/engine/install/ubuntu/) + * See [here](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-compose-on-ubuntu-20-04) for instructions on how to install docker compose on ubuntu. +* [Arch based](https://wiki.archlinux.org/title/Docker) + * `sudo pacman -S yay base-devel` + * `yay -S docker-git docker-compose` +* [Gentoo based](https://wiki.gentoo.org/wiki/Docker) + * `sudo emerge app-containers/docker app-containers/docker-cli app-containers/docker-compose` + +#### Starting the Docker daemon + +##### Systemd based - Debian/Ubuntu/Arch etc * `sudo systemctl enable docker` * `sudo systemctl start docker` -#### Init Systems - ##### OpenRC - Gentoo * `sudo rc-update add docker` * `sudo rc-service docker start` @@ -75,7 +78,7 @@ docker compose build This step will ensure the build has worked by running a container. Later we will run the simulator in this container. ``` -docker compose run f1tenth-ros bash +docker compose run f1tenth-ros ``` You should see your terminal display something like: @@ -203,7 +206,7 @@ chmod +x First, run the container with the VNC ports exposed. ``` -docker compose run --rm --service-ports f1tenth-ros +docker compose run --rm --service-ports f1tenth-ros-vnc ``` ### Connecting to the Docker Container Using a VNC Client diff --git a/docker-compose.yml b/docker-compose.yml index 536357b..1ff910d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: '3' services: - f1tenth-ros: + f1tenth-ros: &f1tenth-ros user: root build: context: . @@ -13,3 +13,7 @@ services: ports: - 5900:5900 - 6080:6080 + + f1tenth-ros-vnc: + <<: *f1tenth-ros + entrypoint: /setup.sh From 85128eba35793b34630d307562617e5275063ee3 Mon Sep 17 00:00:00 2001 From: Naza Date: Fri, 12 Aug 2022 22:16:16 +0100 Subject: [PATCH 26/27] Everything is now conditional because apparently some processes are persistent --- utils/setup-vnc.sh | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/utils/setup-vnc.sh b/utils/setup-vnc.sh index addc362..4c4b834 100755 --- a/utils/setup-vnc.sh +++ b/utils/setup-vnc.sh @@ -1,9 +1,7 @@ #!/bin/sh export SCREEN=0 DISPLAY=:0 WINDOW_MANAGER=dwm source /ros_entrypoint.sh -[ -f /tmp/.X* ] && rm /tmp.X* -Xvfb "$DISPLAY" -screen $SCREEN 1280x720x16 -ac -pn -noreset & sleep 1 -nohup $WINDOW_MANAGER > /tmp/${WINDOW_MANAGER}.log & -x11vnc -forever -noxdamage -noxrecord -display $DISPLAY -passwd f1tenth & -./noVNC/utils/novnc_proxy --vnc localhost:5900 --listen 6080 & -exec "${@-sh}" +pgrep Xvfb || (rm -fr /tmp/.X* && Xvfb "$DISPLAY" -screen $SCREEN 1280x720x16 -ac -pn -noreset) & sleep 1 +pgrep $WINDOW_MANAGER || nohup $WINDOW_MANAGER > /tmp/${WINDOW_MANAGER}.log & +pgrep x11vnc || x11vnc -forever -noxdamage -noxrecord -display $DISPLAY -passwd f1tenth & +pgrep novnc_proxy || ./noVNC/utils/novnc_proxy --vnc localhost:5900 --listen 6080 From dab17dacb4eb411ed97090a07249e506965d6b78 Mon Sep 17 00:00:00 2001 From: Naza Date: Sat, 3 Sep 2022 11:20:29 +0100 Subject: [PATCH 27/27] Fix update step --- Dockerfile | 39 +++++++++++---------------------------- utils/setup-workspace.sh | 6 ++++++ 2 files changed, 17 insertions(+), 28 deletions(-) create mode 100755 utils/setup-workspace.sh diff --git a/Dockerfile b/Dockerfile index b1b0636..9ab4394 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,30 +1,13 @@ # pull container from https://hub.docker.com/_/ros, choosing the melodic-robot-bionic version -FROM ros:melodic-robot-bionic - +FROM ros:noetic # install dependencies for the F1Tenth simulator and wget (and now pip) -RUN sudo apt update - -RUN sudo apt install -y ros-melodic-ackermann-msgs ros-melodic-tf2-geometry-msgs ros-melodic-interactive-markers ros-melodic-cv-bridge ros-melodic-image-transport ros-melodic-rviz ros-melodic-joy ros-melodic-map-server wget neovim python3-pip netcat x11vnc xvfb xorg-dev python3-numpy -# switch to bash for running commands - -# mightn't be necessary -RUN pip3 install -U pip - -RUN rm /bin/sh && ln -s /bin/bash /bin/sh -# initialise ROS, pull useful scripts from our repo and clone the F1Tenth simulator into a new catkin workspace -RUN git clone https://git.suckless.org/st/ && cd st && make clean install -RUN git clone https://github.com/FT-Autonomous/dwm && cd dwm && make clean install - -RUN source /ros_entrypoint.sh && \ - git clone https://github.com/novnc/noVNC.git /noVNC && \ - source /opt/ros/melodic/setup.bash && \ - git clone https://github.com/FT-Autonomous/f1tenth-ros-setup.git && \ - mv f1tenth-ros-setup/utils /utils && \ - rm -rf f1tenth-ros-setup && \ - mkdir -p f1tenth_workspace/src && \ - cd f1tenth_workspace/src && \ - git clone https://github.com/f1tenth/f1tenth_simulator.git && \ - cd f1tenth_simulator/maps && \ - git init && \ - git remote add racetracks https://github.com/f1tenth/f1tenth_racetracks && \ - git pull racetracks main +RUN apt update && apt install -y ros-noetic-xacro ros-noetic-ackermann-msgs ros-noetic-tf2-geometry-msgs ros-noetic-interactive-markers ros-noetic-cv-bridge ros-noetic-image-transport ros-noetic-rviz ros-noetic-joy ros-noetic-map-server wget neovim python3-pip x11vnc xvfb xorg-dev git python3-numpy +# Initialise code for geting graphical output from the docker container +RUN git clone https://git.suckless.org/st/ && cd st && make clean install ; \ + git clone https://github.com/FT-Autonomous/dwm && cd dwm && make clean install ; \ + git clone https://github.com/novnc/noVNC.git /noVNC ; \ + git clone https://github.com/novnc/websockify /noVNC/utils/websockify +# Pull in utility scripts +COPY ./utils /utils +RUN cp -f /bin/bash /bin/sh +RUN /utils/setup-workspace.sh /f1tenth_workspace diff --git a/utils/setup-workspace.sh b/utils/setup-workspace.sh new file mode 100755 index 0000000..22aa660 --- /dev/null +++ b/utils/setup-workspace.sh @@ -0,0 +1,6 @@ +workspace_dir="${1-f1tenth_shared_workspace}/src" +mkdir -p "$workspace_dir" +cd "$workspace_dir" +git clone https://github.com/f1tenth/f1tenth_simulator.git +cd f1tenth_simulator/maps +git init && git pull https://github.com/f1tenth/f1tenth_racetracks