diff --git a/dockerfiles/devenv.Dockerfile b/dockerfiles/devenv.Dockerfile index ce0bfa292cc650923762cbe597c19e5730afbe4b..3ae4b0faaf9d11ebb871707b8eabe3f043ca6168 100644 --- a/dockerfiles/devenv.Dockerfile +++ b/dockerfiles/devenv.Dockerfile @@ -37,6 +37,7 @@ RUN apt-get update && \ # ccmake cmake-curses-gui \ direnv \ + gawk \ gdb \ git \ git-lfs \ @@ -54,26 +55,6 @@ RUN if [ "$EXT_SHELL" = "zsh" ]; \ apt-get -y install zsh; \ fi -# Install extra libs from .deb files -WORKDIR /tmp/srcs/ -COPY /extra_libs/* ./ - -# Enviroment tools based on ubuntu version -RUN if [ -f "common_libs.txt" ]; \ - then \ - grep -v '^#' common_libs.txt | xargs dpkg -i ;\ - fi - -# Extra libs, e.g. vtk-7.1_20221201-1_amd64.deb -RUN if [ -f "${ROS_DISTRO}_libs.txt" ]; \ - then \ - grep -v '^#' ${ROS_DISTRO}_libs.txt | xargs dpkg -i ;\ - fi - -RUN rm -rf * - -RUN apt-get --reinstall install -y libnotify-bin notify-osd - # Configure system to look for debian packages in the Artifactory repository COPY auth.conf /etc/apt/auth.conf.d/tecnalia.conf @@ -106,17 +87,20 @@ RUN if [ "${ROS_DISTRO}" = "melodic" ]; \ python-osrf-pycommon\ python-vcstool; \ else\ - apt-get update && \ - apt-get -y install \ - ipython3 \ - python-is-python3 \ - python3-click \ - python3-numpy \ - python3-osrf-pycommon \ - python3-vcstool \ - python3-pip \ - # clang - clangd liblldb-dev libllvm-ocaml-dev python3-clang; \ + if [ "${ROS_DISTRO}" = "noetic" ]; \ + then \ + apt-get update && \ + apt-get -y install \ + ipython3 \ + python-is-python3 \ + python3-click \ + python3-numpy \ + python3-osrf-pycommon \ + python3-vcstool \ + python3-pip \ + # clang + clangd liblldb-dev libllvm-ocaml-dev python3-clang; \ + fi \ fi # Install ROS 1 tools @@ -149,8 +133,45 @@ RUN if [ -f "${ROS_DISTRO}_requirements.txt" ]; \ RUN rm -rf * +# Install extra libs from .deb files +WORKDIR /tmp/srcs/ +COPY /extra_libs/* ./ + +# Enviroment tools based on ubuntu version +RUN if [ -f "common_libs.txt" ]; \ + then \ + grep -v '^#' common_libs.txt | xargs dpkg -i ;\ + fi + +# Extra libs, e.g. vtk-7.1_20221201-1_amd64.deb +RUN if [ -f "${ROS_DISTRO}_libs.txt" ]; \ + then \ + grep -v '^#' ${ROS_DISTRO}_libs.txt | xargs dpkg -i ;\ + fi + +# Read the plugin list and copy the plugins to their destinations +RUN if [ -f "${ROS_DISTRO}_plugins.txt" ]; \ + then \ + while IFS= read -r line; \ + do \ + echo "Processing line: $line"; \ + if [[ "$line" == \#* ]]; \ + then \ + echo "Skipping ${line}"; \ + else \ + plugin_name=$(echo "$line" | awk '{print $1}'); \ + destination=$(echo "$line" | awk '{print $2}'); \ + echo "Coping ${plugin_name} into ${destination}"; \ + mkdir -p "$destination" && cp -r "$plugin_name" "$destination/"; \ + fi; \ + done < ${ROS_DISTRO}_plugins.txt ; \ + fi + +RUN rm -rf * +RUN apt-get --reinstall install -y libnotify-bin notify-osd + # Update this date to re-run the image final update -LABEL image.date=23-10-2023 +LABEL image.date=25-10-2023 # Update final image RUN apt-get update \ diff --git a/dockerfiles/extra_libs/humble_plugins.txt b/dockerfiles/extra_libs/humble_plugins.txt new file mode 100644 index 0000000000000000000000000000000000000000..3cb37c3ba79c2223d9155028ff92db10a0c16e43 --- /dev/null +++ b/dockerfiles/extra_libs/humble_plugins.txt @@ -0,0 +1,2 @@ +# list of files and destination folders +librealsense_gazebo_plugin.so /usr/lib/x86_64-linux-gnu/gazebo-11/plugins diff --git a/dockerfiles/extra_libs/librealsense_gazebo_plugin.so b/dockerfiles/extra_libs/librealsense_gazebo_plugin.so new file mode 100755 index 0000000000000000000000000000000000000000..26917074b53ed1328ef820e7dad37043b5be3c53 Binary files /dev/null and b/dockerfiles/extra_libs/librealsense_gazebo_plugin.so differ diff --git a/dotfiles/docker.bck b/dotfiles/docker.bck new file mode 100644 index 0000000000000000000000000000000000000000..29feba47877c6ea5ebd51c485ab96e00f63c28a8 --- /dev/null +++ b/dotfiles/docker.bck @@ -0,0 +1,112 @@ +# docker common commands +export dockerfiles_DIR=~/srcs/development_environment/dockerfiles; + +alias dim="docker images" +alias dpsa="docker ps -a" +alias dps="docker ps" +alias drm="docker rm" +alias drmi="docker rmi" +alias dsp="docker system prune --all" +alias dimp="docker image prune" + +# Build docker image +# usage: dockbuild {noetic, melodic} +function dockbuild(){ + if [ $# -lt 1 ]; then + echo "Usage: dockbuild <ROS_DISTRO> [build_args]" + echo "build_args:" + echo " SHELL - zsh (default) or bash" + return 1 + fi + + cd $dockerfiles_DIR; + + if [ $# -lt 2 ]; then + echo "Building ROS_DISTRO:"$1 "with SHELL_VERISON: zsh" + docker build -t devenv:$1 --build-arg ROS_DISTRO=$1 --build-arg SHELL="zsh" -f devenv.Dockerfile . + else + if [ $2 = "bash" ]; then + echo "Building ROS_DISTRO:"$1 "with SHELL_VERISON:"$2 + docker build -t devenv:$1 --build-arg ROS_DISTRO=$1 --build-arg SHELL=$2 -f devenv.Dockerfile . + else + echo "SHELL_VERISON:"$2 "not supported" + fi + fi +} + +# Run container with rocker +# usage: rundock {noetic, melodic} [{remodel_ws, odin_ws}] [cmd] +# ToDo Add extra parameters by arg +# To share docker --volume /var/run/docker.sock:/var/run/docker.sock:ro +# To share video (usb-cam) --volume /dev/video0:/dev/video0 +function dockrun() { + # Check if the image exist + if [[ "$(docker images -q devenv:$1 2> /dev/null)" == "" ]]; then + # build the image + dockbuild $1 + fi + + # Check if the container exist + if [[ $(docker ps -aq -f name=$1) ]]; then + # Attach to conayiner + docker exec -it $1 bash -c "cd ~/ros/$1/$2 && $ext" + else + # Launch container + cd ~/ros/$1/$2; + rocker --home --ssh --git --user --privileged --nvidia --x11 --network host --name $1 devenv:$1 $3 + fi +} + +# Remove all stoped containers +function drma() { + drm $(docker ps -a -f status=exited -q) +} + + +# Remove all unused or dangling immages +function drmui(){ + drmi $(dim --filter "dangling=true" -q --no-trunc) +} + +# Stop and remove +function dsr() { + docker stop $1; + docker rm $1 +} + +# function runpythonsyntax(){ +# rocker --home --name python_syntax tecnalia-docker-dev.artifact.tecnalia.com/docker:git +# } + +# function runremodel() { +# rocker --x11 --nvidia --privileged --network=host --name remodel_docker --oyr-run-arg " -v iiwa_state_recorder:/home/remodel/iiwa_state_recorder -v /home/andres/test/remodel_shared:/home/remodel/remodel_shared" -- remodel_app:melodic bash -c "'roslaunch remodel_app remodel_app.launch use_sim:=true docker:=true skill_manager:=true collision_detector:=true ui:=true cad:=true joystick:=false'" +# } + +# function docrun() { +# rocker --nvidia --pulse --x11 --volume /dev/video0:/dev/video0 --privileged --oyr-run-arg " -v odin_robot_volume:/root/" --name odin_robot --network host odin_robot:melodic $1 +# } + +# function runodin() { +# rocker --nvidia --pulse --x11 --privileged --volume /dev/video0:/dev/video0 --name odin_melodic --network host devenv:melodic $1 +# } + +#DOCKER +alias dexec='f(){ docker exec -w /root/ --detach-keys="ctrl-@" -e DISPLAY=$DISPLAY -it $1 /bin/bash -c "terminator --no-dbus"; unset -f f; }; f' +alias dexec_nt='f(){ docker exec --detach-keys="ctrl-@" -e DISPLAY=$DISPLAY -it $1 /bin/bash ; unset -f f; }; f' +alias dstart='f(){ docker start $1; dexec $1; unset -f f; }; f' +# Run using same X and .ssh folder +alias drun='f(){ docker run -it -e DISPLAY=$DISPLAY --detach-keys="ctrl-@" -v /tmp/.X11-unix:/tmp/.X11-unix -v ~/.ssh:/root/.ssh:ro -v ~/docker_share/:/root/docker_share/ --net=host --name $2 $1; unset -f f; }; f' +alias drun_nvidia='f(){ docker run -it --name $2 --privileged \ + --net=host \ + --env=NVIDIA_VISIBLE_DEVICES=all \ + --env=NVIDIA_DRIVER_CAPABILITIES=all \ + --env=DISPLAY \ + --env=QT_X11_NO_MITSHM=1 \ + -v /tmp/.X11-unix:/tmp/.X11-unix \ + --gpus all \ + --device /dev/snd \ + -e NVIDIA_VISIBLE_DEVICES=0 \ + --detach-keys="ctrl-@" \ + -v ~/.ssh:/root/.ssh:ro \ + -v ~/docker_share/:/root/docker_share/ \ + $1 /bin/bash; unset -f f; }; f' diff --git a/dotfiles/docker.sh b/dotfiles/docker.sh index a3746083b598d942f8392e3a026df1bdd191b5c1..4ad2802431c3d8a18e3b5f4229bb1039ccf81683 100644 --- a/dotfiles/docker.sh +++ b/dotfiles/docker.sh @@ -9,11 +9,22 @@ alias drmi="docker rmi" alias dsp="docker system prune --all" alias dimp="docker image prune" +# Determine shell extension +if [ -z $SHELL ]; then + echo "SHELL not set" + export SHELL=/usr/bin/zsh + ext=$(basename ${SHELL}); +else + ext=$(basename ${SHELL}); +fi + # Build docker image # usage: dockbuild {noetic, melodic} function dockbuild(){ if [ $# -lt 1 ]; then echo "Usage: dockbuild <ROS_DISTRO> [build_args]" + echo "ROS_DISTRO:" + echo " melodic, noetic, humble, etc." echo "build_args:" echo " EXT_SHELL - zsh (default) or bash" return 1 @@ -39,7 +50,23 @@ function dockbuild(){ # ToDo Add extra parameters by arg # To share docker --volume /var/run/docker.sock:/var/run/docker.sock:ro # To share video (usb-cam) --volume /dev/video0:/dev/video0 +# To share pcan --volume /dev/pcanusb32:/dev/pcanusb32 function dockrun() { + if [ $# -lt 1 ]; then + echo "Usage: dockrun <ROS_DISTRO> [posicional options]" + echo "ROS_DISTRO:" + echo " melodic, noetic, humble, etc." + echo "Options:" + echo " Passing 1 option --> path_to_workspace. E.g., dockrun humble mairon_ws" + echo " Passing 2 options --> path_to_workspace + extra_config. E.g., dockrun humble mairon_ws video" + echo " extra_config: pcan, video, pcan_video" + echo "Examples:" + echo "dockrun humble mairon_ws" + echo "dockrun noetic neurondones_ws pcan_video" + echo "dockrun melodic odinrobot_ws video" + return 1 + fi + # Check if the image exist if [[ "$(docker images -q devenv:$1 2> /dev/null)" == "" ]]; then # build the image @@ -48,12 +75,55 @@ function dockrun() { # Check if the container exist if [[ $(docker ps -aq -f name=$1) ]]; then - # Attach to conayiner - docker exec -it $1 bash -c "cd ~/ros/$1/$2 && $ext" + # Attach to container + if [ $# -lt 2 ]; then + docker exec -it $1 bash -c "cd ~/ros/$1 && $ext" + else + docker exec -it $1 bash -c "cd ~/ros/$1/$2 && $ext" + fi else # Launch container cd ~/ros/$1/$2; - rocker --home --ssh --git --user --privileged --nvidia --x11 --network host --name $1 devenv:$1 $3 + + if [ $# -lt 4 ]; then + rocker --home --ssh --git --user --privileged --nvidia --x11 --network host --name $1 devenv:$1 + else + if [ $3 = "pcan" ]; then + rocker --home --ssh --git --user --privileged --nvidia --x11 --volume /dev/pcanusb32:/dev/pcanusb32 --network host --name $1 devenv:$1 + else + fi + fi + fi +} + +function dockexec() { + if [ $# -lt 1 ]; then + echo "Usage: dockexec <ROS_DISTRO> [workspace] [command]" + echo "ROS_DISTRO:" + echo " melodic, noetic, humble, etc." + echo "Example:" + echo "dockexec noetic neurondones_ws roscore" + return 1 + fi + + # Check if the image exist + if [[ "$(docker images -q devenv:$1 2> /dev/null)" == "" ]]; then + # build the image + echo "Docker image for ${1} does not exist" + return 1 + fi + + # Check if the container exist + if [[ $(docker ps -aq -f name=$1) ]]; then + # Attach to container + if [ $# -lt 2 ]; then + docker exec -it $1 bash -c "cd ~/ros/$1 && $ext" + else + docker exec -it $1 bash -c "cd ~/ros/$1/$2 && $ext" + fi + else + # Launch container + echo "Container for ${1} does not exist" fi } diff --git a/dotfiles/ros.bck b/dotfiles/ros.bck new file mode 100644 index 0000000000000000000000000000000000000000..6e28ad5ae79b197e76eef5c76ecd646344987980 --- /dev/null +++ b/dotfiles/ros.bck @@ -0,0 +1,102 @@ +################################################################### +# ROS aliases and functions +################################################################### + +# Define ROS_DISTRO before source ROS on native OS +# if [ -z $ROS_DISTRO ]; then export ROS_DISTRO=noetic; fi +if [[ -z "${ROS_DISTRO}" ]]; then + ROS_DIR=/opt/ros + if [ -d "$ROS_DIR" ]; + then + export ROS_DISTRO=$(basename $(find /opt/ros/* -maxdepth 0 -type d | head -1)) + else + unset ROS_DISTRO + fi +fi + +# Determine shell extension +if [ -z $SHELL ]; then echo "SHELL not set"; else ext=$(basename ${SHELL}); fi + +# Source rosmon +function smon(){ + if [[ -f "/opt/ros/${ROS_DISTRO}/etc/catkin/profile.d/50-rosmon.${ext}" ]]; then + source /opt/ros/${ROS_DISTRO}/etc/catkin/profile.d/50-rosmon.${ext} + fi +} + +# cd to the root of the workspace +function roshome(){ + roscd && cd .. + ROS_HOME=${PWD} +} + +# Source the current workspace +function sourcews(){ + source ./devel/setup.${ext} && smon +} + +# Source the current workspace +function sourceros(){ + source /opt/ros/${ROS_DISTRO}/setup.${ext} && smon + ROS_HOME="/opt/ros/${ROS_DISTRO}/" +} + +# Source the current workspace +function sourcethis(){ + pwd_st=${PWD} + roshome && sourcews + echo "Sourcing: ${ROS_HOME}" + cd ${pwd_st} +} + +# Automatic catkin build +function cb() { + pwd_cb=${PWD} + roshome + catkin build --summarize --cmake-args -DCMAKE_BUILD_TYPE=Release -- "$@" + sourcethis + cd ${pwd_cb} +} + +# Clean workspace (delete the generated folders, then catkin build) +function cbclean(){ + roshome && rm -rf build devel install && catkin build --summarize --cmake-args -DCMAKE_BUILD_TYPE=Release +} + +# Initialize catkin workspace, configure and build it +function cib(){ + catkin init && catkin config --extend /opt/ros/${ROS_DISTRO} && catkin build --summarize --cmake-args -DCMAKE_BUILD_TYPE=Release +} + +# Run ci locally +function runci(){ + # check if exist .rosinstall file + if [ -f ./.rosinstall ]; then + echo ".rosinstall in package" + find ../ -name run_ci -exec bash {} ROS_DISTRO="$@" DOCKER_IMAGE=tecnalia-robotics-docker.artifact.tecnalia.com/flexbotics-base-devel:"$@" UPSTREAM_WORKSPACE=.rosinstall \; + else + echo "No .rosinstall in package" + find ../ -name run_ci -exec bash {} ROS_DISTRO="$@" DOCKER_IMAGE=tecnalia-robotics-docker.artifact.tecnalia.com/flexbotics-base-devel:"$@" \; + fi +} + +# if a new terminal starts in a ws, auto source it (useful for vscode) +if [ -z ${ROS_DISTRO+x} ]; then ; +else + pwd_init=${PWD} + cropped=${PWD#${HOME}/ros/${ROS_DISTRO}/} + WS_name=${cropped%%/*} + WS_path=${HOME}/ros/${ROS_DISTRO}/${WS_name} + FILE=${WS_path}/devel/setup.${ext} + # if PWD belongs to ROS ws then source it + if [[ -f $FILE ]]; then + cd ${WS_path} + source $FILE + cd ${pwd_init} + ROS_HOME=${WS_path} + else + sourceros + fi +fi + +alias sc=sourcethis \ No newline at end of file diff --git a/dotfiles/ros.sh b/dotfiles/ros.sh index 1d14d6a63878469e5edbb4d31bde757ae51a20be..b1797749f1a1a92543d565d73e0223b6e3683c44 100644 --- a/dotfiles/ros.sh +++ b/dotfiles/ros.sh @@ -88,7 +88,7 @@ function cbclean(){ then roshome && rm -rf build devel install && catkin build --summarize --cmake-args -DCMAKE_BUILD_TYPE=Release else - rm -rf build devel install && cb + rm -rf build log install && cb "$@" fi } diff --git a/dotfiles/sysem.bck b/dotfiles/sysem.bck new file mode 100644 index 0000000000000000000000000000000000000000..ec8fc9968968629a68cdb6e5ee3b409ee24a65a4 --- /dev/null +++ b/dotfiles/sysem.bck @@ -0,0 +1,38 @@ +# Determine shell extension +if [ -z $SHELL ]; then + echo "SHELL not set" + export SHELL=/usr/bin/zsh + ext=$(basename ${SHELL}); +else + ext=$(basename ${SHELL}); +fi + +if command -v lsd &> /dev/null +then + # Directories + alias ll='lsd -lh --group-dirs=first' + alias la='lsd -a --group-dirs=first' + alias l='lsd --group-dirs=first' + alias lla='lsd -lha --group-dirs=first' + alias ls='lsd --group-dirs=first' +else + alias ll='ls -lh' + alias la='ls -a' + alias l='ls' + alias lla='ls -lha' + alias ls='ls' +fi + +if command -v bat &> /dev/null +then + # Files + alias cat='bat' +fi + +# Python +if command -v ipython &> /dev/null +then + alias ipy='ipython' +fi + +alias mountT='sudo mount -t cifs //tri.lan/tri /mnt/T --verbose -o username=110343,password=Bageera\#1983,workgroup=TRI.LAN' diff --git a/dotfiles/zshrc.bck b/dotfiles/zshrc.bck new file mode 100644 index 0000000000000000000000000000000000000000..5e93a5a974cff9e19b56e252576edf6e772cfaee --- /dev/null +++ b/dotfiles/zshrc.bck @@ -0,0 +1,86 @@ +# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc. +# Initialization code that may require console input (password prompts, [y/n] +# confirmations, etc.) must go above this block; everything else may go below. +if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then + source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" +fi + +#zmodload zsh/zprof + +# If you come from bash you might have to change your $PATH. +# export PATH=$HOME/bin:/usr/local/bin:$PATH + +# Path to your oh-my-zsh installation. +export ZSH=~/.oh-my-zsh + +# Uncomment the following line to display red dots whilst waiting for completion. +COMPLETION_WAITING_DOTS="true" + +source "$HOME/.homesick/repos/homeshick/homeshick.sh" +fpath=($HOME/.homesick/repos/homeshick/completions $fpath) + +source ~/antigen.zsh +antigen use oh-my-zsh + +antigen theme romkatv/powerlevel10k + +antigen bundle docker +antigen bundle git +antigen bundle globalias +antigen bundle last-working-dir +antigen bundle sudo +antigen bundle zsh-users/zsh-history-substring-search +antigen bundle zsh-users/zsh-syntax-highlighting +antigen bundle wfxr/forgit +antigen bundle paulirish/git-open +antigen bundle popstas/zsh-command-time +antigen bundle MichaelAquilina/zsh-auto-notify +antigen bundle MichaelAquilina/zsh-you-should-use +antigen bundle zsh-users/zsh-autosuggestions + +antigen apply + +#ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=0' + +# command-line fuzzy finder +[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh + +source $HOME/.init_shell + +if [ -f ~/.bash_aliases ]; then + . ~/.bash_aliases +fi + +#zprof + +export FZF_DEFAULT_COMMAND='rg --files --hidden --follow --no-ignore-vcs' +export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND" +#export FZF_ALT_C_COMMAND="fd -t d --hidden --follow --exclude \".git\" . $HOME" +export FZF_ALT_C_COMMAND="fd -t d --hidden --follow --exclude \".git\" ." + +# Create a cache folder if it isn't exists +if [ ! -d "$HOME/.cache/zsh" ]; then + mkdir -p $HOME/.cache/zsh +fi + +# Define a custom file for compdump +export ZSH_COMPDUMP="$HOME/.cache/zsh/zcompdump-$HOST-$ZSH_VERSION" + +# User configuration + +export EDITOR="code -r" + +# Include dotfiles +source ${HOME}/srcs/development_environment/dotfiles/system.bash +source ${HOME}/srcs/development_environment/dotfiles/git.bash +source ${HOME}/srcs/development_environment/dotfiles/docker.bash +source ${HOME}/srcs/development_environment/dotfiles/ros.bash + +# To add direnv app +# eval "$(direnv hook zsh)" + +# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh. +[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh + +# Finalize Powerlevel10k instant prompt. Should stay at the bottom of ~/.zshrc. +(( ! ${+functions[p10k-instant-prompt-finalize]} )) || p10k-instant-prompt-finalize