diff --git a/.github/workflows/installers.yml b/.github/workflows/installers.yml
index 2d32aed..9e23b64 100644
--- a/.github/workflows/installers.yml
+++ b/.github/workflows/installers.yml
@@ -7,6 +7,7 @@ on:
- "ros2-humble-**.sh"
- "ros2-jazzy-**.sh"
- "ros2-kilted-**.sh"
+ - "ros2-lyrical-**.sh"
- ".github/workflows/installers.yml"
pull_request:
branches:
@@ -15,6 +16,7 @@ on:
- "ros2-humble-**.sh"
- "ros2-jazzy-**.sh"
- "ros2-kilted-**.sh"
+ - "ros2-lyrical-**.sh"
- ".github/workflows/installers.yml"
schedule:
- cron: "0 1 * * 1"
@@ -117,3 +119,50 @@ jobs:
run: |
sed -e 's/^\(ROS_DISTRO=.*\)/#\1\nROS_DISTRO=kilted/g' -i tutorial.sh
bash <(head -n -2 ./tutorial.sh)
+
+ lyrical-ros-base-main:
+ runs-on: ubuntu-24.04
+ container: ubuntu:26.04
+ defaults:
+ run:
+ shell: bash
+ env:
+ DEBIAN_FRONTEND: noninteractive
+ ROS_DISTRO: lyrical
+ steps:
+ - name: Install container prerequisites
+ run: |
+ apt-get update
+ apt-get install -y ca-certificates git sudo
+ - uses: actions/checkout@v6
+ - name: Run the install script
+ run: |
+ ./ros2-lyrical-ros-base-main.sh
+ - name: Run the test script
+ run: |
+ sed -e 's/^\(ROS_DISTRO=.*\)/#\1\nROS_DISTRO=lyrical/g' -i tutorial.sh
+ sed -e 's/^\(source \/opt.*bash\)$/\1\nrosdep install -r -y -i --from-paths ./g' -i tutorial.sh
+ bash <(head -n -2 ./tutorial.sh)
+
+ lyrical-desktop-main:
+ runs-on: ubuntu-24.04
+ container: ubuntu:26.04
+ defaults:
+ run:
+ shell: bash
+ env:
+ DEBIAN_FRONTEND: noninteractive
+ ROS_DISTRO: lyrical
+ steps:
+ - name: Install container prerequisites
+ run: |
+ apt-get update
+ apt-get install -y ca-certificates git sudo
+ - uses: actions/checkout@v6
+ - name: Run the install script
+ run: |
+ ./ros2-lyrical-desktop-main.sh
+ - name: Run the test script
+ run: |
+ sed -e 's/^\(ROS_DISTRO=.*\)/#\1\nROS_DISTRO=lyrical/g' -i tutorial.sh
+ bash <(head -n -2 ./tutorial.sh)
diff --git a/.test/test-os-check-noble.bats b/.test/test-os-check-noble.bats
index cb33630..62160ec 100644
--- a/.test/test-os-check-noble.bats
+++ b/.test/test-os-check-noble.bats
@@ -17,3 +17,9 @@ setup() {
[ "$status" -eq 1 ]
assert_output --partial "ERROR: This OS (version: noble) is not supported"
}
+
+@test "Lyrical fail on Ubuntu 24.04" {
+ run ./ros2-lyrical-desktop-main.sh
+ [ "$status" -eq 1 ]
+ assert_output --partial "ERROR: This OS (version: noble) is not supported"
+}
diff --git a/README.md b/README.md
index 37bef9a..263b1a3 100644
--- a/README.md
+++ b/README.md
@@ -38,6 +38,11 @@ ROS 2 Kilted
* To install `ros-kilted-ros-base`, use [`ros2-kilted-ros-base-main.sh`](./ros2-kilted-ros-base-main.sh) instead of `run.sh`.
* To install `ros-kilted-desktop`, use [`ros2-kilted-desktop-main.sh`](./ros2-kilted-desktop-main.sh) instead of `run.sh`.
+ROS 2 Lyrical (LTS)
+
+* To install `ros-lyrical-ros-base`, use [`ros2-lyrical-ros-base-main.sh`](./ros2-lyrical-ros-base-main.sh) instead of `run.sh`.
+* To install `ros-lyrical-desktop`, use [`ros2-lyrical-desktop-main.sh`](./ros2-lyrical-desktop-main.sh) instead of `run.sh`.
+
#### Old versions
ROS 2 Dashing (EOL)
@@ -75,6 +80,7 @@ Reference: [REP-0003](https://ros.org/reps/rep-0003.html), [REP-2000](https://ro
| Ubuntu 20.04
EOL: April 2025[^3] | Noetic
EOL: May 2025 | Foxy
EOL: May 2023 |
| Ubuntu 22.04
EOL: April 2027[^4] | - | Humble
EOL: May 2027 |
| Ubuntu 24.04
EOL: June 2029[^5] | - | Jazzy
EOL: May 2029 |
+| Ubuntu 26.04
EOL: May 2031[^6] | - | Lyrical
EOL: May 2031 |
* Note: Here, EOL for Ubuntu refers to the end of normal support, which is not Ubuntu Pro.
@@ -82,6 +88,7 @@ Reference: [REP-0003](https://ros.org/reps/rep-0003.html), [REP-2000](https://ro
[^3]: https://wiki.ubuntu.com/FocalFossa/ReleaseNotes
[^4]: https://discourse.ubuntu.com/t/jammy-jellyfish-release-notes/24668
[^5]: https://discourse.ubuntu.com/t/noble-numbat-release-notes/39890
+[^6]: https://documentation.ubuntu.com/project/release-team/list-of-releases/
## LICENSE
diff --git a/ros2-lyrical-desktop-main.sh b/ros2-lyrical-desktop-main.sh
new file mode 100755
index 0000000..efc9ee4
--- /dev/null
+++ b/ros2-lyrical-desktop-main.sh
@@ -0,0 +1,69 @@
+#!/usr/bin/env bash
+set -eu
+
+# Copyright 2019-2026 Tiryoh
+# https://github.com/Tiryoh/ros2_setup_scripts_ubuntu
+# Licensed under the Apache License, Version 2.0
+#
+# REF: https://docs.ros.org/en/lyrical/Installation/Ubuntu-Install-Debs.html
+# by Open Robotics, licensed under CC-BY-4.0
+# source: https://github.com/ros2/ros2_documentation
+
+CHOOSE_ROS_DISTRO=lyrical
+INSTALL_PACKAGE=desktop
+TARGET_OS=resolute
+
+# Check OS version
+if ! which lsb_release > /dev/null ; then
+ sudo apt-get update
+ sudo apt-get install -y curl lsb-release
+fi
+
+if [[ "$(lsb_release -sc)" == "$TARGET_OS" ]]; then
+ echo "OS Check Passed"
+else
+ printf '\033[33m%s\033[m\n' "=================================================="
+ printf '\033[33m%s\033[m\n' "ERROR: This OS (version: $(lsb_release -sc)) is not supported"
+ printf '\033[33m%s\033[m\n' "=================================================="
+ exit 1
+fi
+
+ARCH=$(dpkg --print-architecture)
+if [[ "$ARCH" != "amd64" && "$ARCH" != "arm64" ]]; then
+ printf '\033[33m%s\033[m\n' "=================================================="
+ printf '\033[33m%s\033[m\n' "ERROR: This architecture ($ARCH) is not supported"
+ printf '\033[33m%s\033[m\n' "See https://www.ros.org/reps/rep-2000.html"
+ printf '\033[33m%s\033[m\n' "=================================================="
+ exit 1
+fi
+
+# Install
+sudo apt-get update
+sudo apt-get install -y software-properties-common
+sudo add-apt-repository -y universe
+sudo apt-get install -y curl lsb-release build-essential
+
+ROS_APT_SOURCE_VERSION=$(curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F "tag_name" | awk -F'"' '{print $4}')
+curl -L -o /tmp/ros2-apt-source.deb "https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo ${UBUNTU_CODENAME:-${VERSION_CODENAME}})_all.deb"
+sudo dpkg -i /tmp/ros2-apt-source.deb
+sudo apt-get update
+sudo apt-get install -y ros-$CHOOSE_ROS_DISTRO-$INSTALL_PACKAGE
+sudo apt-get install -y python3-argcomplete python3-colcon-clean
+sudo apt-get install -y python3-colcon-common-extensions
+sudo apt-get install -y python3-rosdep python3-vcstool
+[ -e /etc/ros/rosdep/sources.list.d/20-default.list ] ||
+sudo rosdep init
+rosdep update
+grep -F "source /opt/ros/$CHOOSE_ROS_DISTRO/setup.bash" ~/.bashrc ||
+echo "source /opt/ros/$CHOOSE_ROS_DISTRO/setup.bash" >> ~/.bashrc
+# From ROS 2 Iron, it uses ROS_AUTOMATIC_DISCOVERY_RANGE instead of ROS_LOCALHOST_ONLY
+# https://docs.ros.org/en/iron/Releases/Release-Iron-Irwini.html#improved-discovery-options
+grep -F "export ROS_AUTOMATIC_DISCOVERY_RANGE=" ~/.bashrc ||
+echo "# export ROS_AUTOMATIC_DISCOVERY_RANGE=LOCALHOST" >> ~/.bashrc
+
+set +u
+
+source /opt/ros/$CHOOSE_ROS_DISTRO/setup.bash
+
+echo "success installing ROS2 $CHOOSE_ROS_DISTRO"
+echo "Run 'source /opt/ros/$CHOOSE_ROS_DISTRO/setup.bash'"
diff --git a/ros2-lyrical-ros-base-main.sh b/ros2-lyrical-ros-base-main.sh
new file mode 100755
index 0000000..cca47c8
--- /dev/null
+++ b/ros2-lyrical-ros-base-main.sh
@@ -0,0 +1,69 @@
+#!/usr/bin/env bash
+set -eu
+
+# Copyright 2019-2026 Tiryoh
+# https://github.com/Tiryoh/ros2_setup_scripts_ubuntu
+# Licensed under the Apache License, Version 2.0
+#
+# REF: https://docs.ros.org/en/lyrical/Installation/Ubuntu-Install-Debs.html
+# by Open Robotics, licensed under CC-BY-4.0
+# source: https://github.com/ros2/ros2_documentation
+
+CHOOSE_ROS_DISTRO=lyrical
+INSTALL_PACKAGE=ros-base
+TARGET_OS=resolute
+
+# Check OS version
+if ! which lsb_release > /dev/null ; then
+ sudo apt-get update
+ sudo apt-get install -y curl lsb-release
+fi
+
+if [[ "$(lsb_release -sc)" == "$TARGET_OS" ]]; then
+ echo "OS Check Passed"
+else
+ printf '\033[33m%s\033[m\n' "=================================================="
+ printf '\033[33m%s\033[m\n' "ERROR: This OS (version: $(lsb_release -sc)) is not supported"
+ printf '\033[33m%s\033[m\n' "=================================================="
+ exit 1
+fi
+
+ARCH=$(dpkg --print-architecture)
+if [[ "$ARCH" != "amd64" && "$ARCH" != "arm64" ]]; then
+ printf '\033[33m%s\033[m\n' "=================================================="
+ printf '\033[33m%s\033[m\n' "ERROR: This architecture ($ARCH) is not supported"
+ printf '\033[33m%s\033[m\n' "See https://www.ros.org/reps/rep-2000.html"
+ printf '\033[33m%s\033[m\n' "=================================================="
+ exit 1
+fi
+
+# Install
+sudo apt-get update
+sudo apt-get install -y software-properties-common
+sudo add-apt-repository -y universe
+sudo apt-get install -y curl lsb-release build-essential
+
+ROS_APT_SOURCE_VERSION=$(curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F "tag_name" | awk -F'"' '{print $4}')
+curl -L -o /tmp/ros2-apt-source.deb "https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo ${UBUNTU_CODENAME:-${VERSION_CODENAME}})_all.deb"
+sudo dpkg -i /tmp/ros2-apt-source.deb
+sudo apt-get update
+sudo apt-get install -y ros-$CHOOSE_ROS_DISTRO-$INSTALL_PACKAGE
+sudo apt-get install -y python3-argcomplete python3-colcon-clean
+sudo apt-get install -y python3-colcon-common-extensions
+sudo apt-get install -y python3-rosdep python3-vcstool
+[ -e /etc/ros/rosdep/sources.list.d/20-default.list ] ||
+sudo rosdep init
+rosdep update
+grep -F "source /opt/ros/$CHOOSE_ROS_DISTRO/setup.bash" ~/.bashrc ||
+echo "source /opt/ros/$CHOOSE_ROS_DISTRO/setup.bash" >> ~/.bashrc
+# From ROS 2 Iron, it uses ROS_AUTOMATIC_DISCOVERY_RANGE instead of ROS_LOCALHOST_ONLY
+# https://docs.ros.org/en/iron/Releases/Release-Iron-Irwini.html#improved-discovery-options
+grep -F "export ROS_AUTOMATIC_DISCOVERY_RANGE=" ~/.bashrc ||
+echo "# export ROS_AUTOMATIC_DISCOVERY_RANGE=LOCALHOST" >> ~/.bashrc
+
+set +u
+
+source /opt/ros/$CHOOSE_ROS_DISTRO/setup.bash
+
+echo "success installing ROS2 $CHOOSE_ROS_DISTRO"
+echo "Run 'source /opt/ros/$CHOOSE_ROS_DISTRO/setup.bash'"