From 3d4c4cbb0918928ae54b49e2b5e033cd212bad6f Mon Sep 17 00:00:00 2001
From: Abed Al Rahman Al Mrad
Date: Mon, 8 Dec 2025 12:57:15 -0500
Subject: [PATCH 01/28] Added ros2 jazzy CI workflow
---
.github/workflows/README.md | 8 +--
...inary-build.yml => jazzy-binary-build.yml} | 16 ++---
.github/workflows/jazzy-semi-binary-build.yml | 59 +++++++++++++++++++
...ource-build.yml => jazzy-source-build.yml} | 14 ++---
4 files changed, 78 insertions(+), 19 deletions(-)
rename .github/workflows/{humble-binary-build.yml => jazzy-binary-build.yml} (88%)
create mode 100644 .github/workflows/jazzy-semi-binary-build.yml
rename .github/workflows/{humble-source-build.yml => jazzy-source-build.yml} (83%)
diff --git a/.github/workflows/README.md b/.github/workflows/README.md
index cff94d7a..9e13d7ad 100644
--- a/.github/workflows/README.md
+++ b/.github/workflows/README.md
@@ -6,10 +6,10 @@ A RED job might not mean that this package is currently broken but that an depen
To avoid overloading users viewing the main README page a full list of build statues can be kept here for package maintainers
-ROS2 Distro | Humble | Iron | Rolling
-:---------: | :----: | :--: | :-----:
-| **Branch** | [`main`](https://github.com/PickNikRobotics/ros2_kortex/tree/main) | [`main`](https://github.com/PickNikRobotics/ros2_kortex/tree/main) | [`main`](https://github.com/PickNikRobotics/ros2_kortex/tree/main)
-| **Build Status** | [](https://github.com/PickNikRobotics/ros2_kortex/actions/workflows/humble-binary-build.yml?branch=main)
[](https://github.com/PickNikRobotics/ros2_kortex/actions/workflows/humble-source-build.yml?branch=main) | :construction: | [](https://github.com/PickNikRobotics/ros2_kortex/actions/workflows/rolling-binary-build.yml?branch=main)
[](https://github.com/PickNikRobotics/ros2_kortex/actions/workflows/rolling-semi-binary-build.yml?branch=main)
[](https://github.com/PickNikRobotics/ros2_kortex/actions/workflows/rolling-source-build.yml?branch=main)
+ROS2 Distro | Jazzy | Rolling
+:---------: | :---: | :-----:
+| **Branch** | [`jazzy`](https://github.com/Kinovarobotics/ros2_kortex/tree/jazzy) | [`main`](https://github.com/Kinovarobotics/ros2_kortex/tree/main)
+| **Build Status** | [](https://github.com/Kinovarobotics/ros2_kortex/actions/workflows/jazzy-binary-build.yml?branch=jazzy)
[](https://github.com/Kinovarobotics/ros2_kortex/actions/workflows/jazzy-semi-binary-build.yml?branch=jazzy)
[](https://github.com/Kinovarobotics/ros2_kortex/actions/workflows/jazzy-source-build.yml?branch=jazzy) | [](https://github.com/Kinovarobotics/ros2_kortex/actions/workflows/rolling-binary-build.yml?branch=main)
[](https://github.com/Kinovarobotics/ros2_kortex/actions/workflows/rolling-semi-binary-build.yml?branch=main)
[](https://github.com/Kinovarobotics/ros2_kortex/actions/workflows/rolling-source-build.yml?branch=main)
### Explanation of different build types
diff --git a/.github/workflows/humble-binary-build.yml b/.github/workflows/jazzy-binary-build.yml
similarity index 88%
rename from .github/workflows/humble-binary-build.yml
rename to .github/workflows/jazzy-binary-build.yml
index a7984242..a78cdf3d 100644
--- a/.github/workflows/humble-binary-build.yml
+++ b/.github/workflows/jazzy-binary-build.yml
@@ -1,27 +1,27 @@
-name: Humble Binary Build
+name: Jazzy Binary Build
on:
pull_request:
branches:
- # try to keep humble and rolling(main) in sync
- - humble
+ # try to keep jazzy and rolling(main) in sync
+ - jazzy
- main
push:
branches:
- - humble
+ - jazzy
- main
schedule:
# Run every morning to detect flakiness and broken dependencies
- cron: '13 4 * * *'
jobs:
- humble_binary:
- name: humble binary build
+ jazzy_binary:
+ name: jazzy binary build
runs-on: ubuntu-latest
strategy:
matrix:
env:
- - {ROS_DISTRO: humble, ROS_REPO: main}
- - {ROS_DISTRO: humble, ROS_REPO: testing}
+ - {ROS_DISTRO: jazzy, ROS_REPO: main}
+ - {ROS_DISTRO: jazzy, ROS_REPO: testing}
env:
UPSTREAM_WORKSPACE: ros2_kortex-not-released.${{ matrix.env.ROS_DISTRO }}.repos
ROSDEP_SKIP_KEYS: gz_ros2_control
diff --git a/.github/workflows/jazzy-semi-binary-build.yml b/.github/workflows/jazzy-semi-binary-build.yml
new file mode 100644
index 00000000..8ca92b00
--- /dev/null
+++ b/.github/workflows/jazzy-semi-binary-build.yml
@@ -0,0 +1,59 @@
+name: Jazzy Semi Binary Build
+on:
+ pull_request:
+ branches:
+ - jazzy
+ - main
+ push:
+ branches:
+ - jazzy
+ - main
+ schedule:
+ # Run every morning to detect flakiness and broken dependencies
+ - cron: '13 4 * * *'
+
+jobs:
+ jazzy_semi_binary:
+ name: jazzy semi-binary build
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ env:
+ - {ROS_DISTRO: jazzy, ROS_REPO: main}
+ - {ROS_DISTRO: jazzy, ROS_REPO: testing}
+ env:
+ UPSTREAM_WORKSPACE: ros2_kortex.${{ matrix.env.ROS_DISTRO }}.repos
+ ROSDEP_SKIP_KEYS: robotiq_description
+ CCACHE_DIR: ${{ github.workspace }}/.ccache
+ BASEDIR: ${{ github.workspace }}/.work
+ CACHE_PREFIX: ${{ matrix.env.ROS_DISTRO }}-${{ matrix.env.ROS_REPO }}
+ steps:
+ - uses: actions/checkout@v3
+ # The target directory cache doesn't include the source directory because
+ # that comes from the checkout. See "prepare target_ws for cache" task below
+ - name: cache target_ws
+ if: ${{ ! matrix.env.CCOV }}
+ uses: pat-s/always-upload-cache@v2.1.5
+ with:
+ path: ${{ env.BASEDIR }}/target_ws
+ key: target_ws-${{ env.CACHE_PREFIX }}-${{ hashFiles('**/CMakeLists.txt', '**/package.xml') }}-${{ github.run_id }}
+ restore-keys: |
+ target_ws-${{ env.CACHE_PREFIX }}-${{ hashFiles('**/CMakeLists.txt', '**/package.xml') }}
+ - name: cache ccache
+ uses: pat-s/always-upload-cache@v2.1.5
+ with:
+ path: ${{ env.CCACHE_DIR }}
+ key: ccache-${{ env.CACHE_PREFIX }}-${{ github.sha }}-${{ github.run_id }}
+ restore-keys: |
+ ccache-${{ env.CACHE_PREFIX }}-${{ github.sha }}
+ ccache-${{ env.CACHE_PREFIX }}
+ - uses: 'ros-industrial/industrial_ci@master'
+ with:
+ config: ${{toJSON(matrix.env)}}
+ - name: prepare target_ws for cache
+ if: ${{ always() && ! matrix.env.CCOV }}
+ run: |
+ du -sh ${{ env.BASEDIR }}/target_ws
+ sudo find ${{ env.BASEDIR }}/target_ws -wholename '*/test_results/*' -delete
+ sudo rm -rf ${{ env.BASEDIR }}/target_ws/src
+ du -sh ${{ env.BASEDIR }}/target_ws
diff --git a/.github/workflows/humble-source-build.yml b/.github/workflows/jazzy-source-build.yml
similarity index 83%
rename from .github/workflows/humble-source-build.yml
rename to .github/workflows/jazzy-source-build.yml
index 40839999..d91cf092 100644
--- a/.github/workflows/humble-source-build.yml
+++ b/.github/workflows/jazzy-source-build.yml
@@ -1,21 +1,21 @@
-name: Humble Source Build
+name: Jazzy Source Build
on:
push:
branches:
- # try to keep humble and rolling(main) in sync
- - humble
+ # try to keep jazzy and rolling(main) in sync
+ - jazzy
- main
schedule:
# Run every morning to detect flakiness and broken dependencies
- cron: '43 1 * * *'
jobs:
- humble_source:
- runs-on: ubuntu-22.04
+ jazzy_source:
+ runs-on: ubuntu-24.04
strategy:
fail-fast: false
env:
- ROS_DISTRO: humble
+ ROS_DISTRO: jazzy
steps:
- uses: ros-tooling/setup-ros@v0.6
with:
@@ -24,7 +24,7 @@ jobs:
- uses: ros-tooling/action-ros-ci@0.3.2
with:
target-ros2-distro: ${{ env.ROS_DISTRO }}
- # Currently main is compatible with Humble
+ # Currently main is compatible with Jazzy
ref: main
import-token: ${{ secrets.GITHUB_TOKEN }}
# build all packages listed in the meta package
From fbd7d39500b507605a573982135ac62b3e0048f3 Mon Sep 17 00:00:00 2001
From: Abed Al Rahman Al Mrad
Date: Mon, 8 Dec 2025 13:00:37 -0500
Subject: [PATCH 02/28] CI workflow rectifications
---
.github/workflows/jazzy-source-build.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/jazzy-source-build.yml b/.github/workflows/jazzy-source-build.yml
index d91cf092..041223e5 100644
--- a/.github/workflows/jazzy-source-build.yml
+++ b/.github/workflows/jazzy-source-build.yml
@@ -35,7 +35,7 @@ jobs:
https://raw.githubusercontent.com/ros2/ros2/${{ env.ROS_DISTRO }}/ros2.repos
file://${{ github.workspace }}/ros2_kortex.${{ env.ROS_DISTRO }}.repos
colcon-mixin-repository: https://raw.githubusercontent.com/colcon/colcon-mixin-repository/master/index.yaml
- - uses: actions/upload-artifact@v1
+ - uses: actions/upload-artifact@v3
with:
- name: colcon-logs-${{ matrix.os }}
+ name: colcon-logs
path: ros_ws/log
From ce361a725741fe17c9c01d32f44953ac5c86a122 Mon Sep 17 00:00:00 2001
From: Abed Al Rahman Al Mrad
Date: Mon, 8 Dec 2025 13:03:53 -0500
Subject: [PATCH 03/28] CI workflow rectifications
---
.github/workflows/jazzy-source-build.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/jazzy-source-build.yml b/.github/workflows/jazzy-source-build.yml
index 041223e5..f1e8c051 100644
--- a/.github/workflows/jazzy-source-build.yml
+++ b/.github/workflows/jazzy-source-build.yml
@@ -35,7 +35,7 @@ jobs:
https://raw.githubusercontent.com/ros2/ros2/${{ env.ROS_DISTRO }}/ros2.repos
file://${{ github.workspace }}/ros2_kortex.${{ env.ROS_DISTRO }}.repos
colcon-mixin-repository: https://raw.githubusercontent.com/colcon/colcon-mixin-repository/master/index.yaml
- - uses: actions/upload-artifact@v3
+ - uses: actions/upload-artifact@v4
with:
name: colcon-logs
path: ros_ws/log
From 52e8561cb3df41f48725c1582959f69454f1911f Mon Sep 17 00:00:00 2001
From: Abed Al Rahman Al Mrad
Date: Mon, 8 Dec 2025 13:06:57 -0500
Subject: [PATCH 04/28] CI workflow rectifications
---
.github/workflows/jazzy-source-build.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/jazzy-source-build.yml b/.github/workflows/jazzy-source-build.yml
index f1e8c051..dfb3c4d9 100644
--- a/.github/workflows/jazzy-source-build.yml
+++ b/.github/workflows/jazzy-source-build.yml
@@ -17,7 +17,7 @@ jobs:
env:
ROS_DISTRO: jazzy
steps:
- - uses: ros-tooling/setup-ros@v0.6
+ - uses: ros-tooling/setup-ros@v0.7
with:
required-ros-distributions: ${{ env.ROS_DISTRO }}
- uses: actions/checkout@v3
From a8284249758d53f62ae87d3058b383fcdba0c91b Mon Sep 17 00:00:00 2001
From: Abed Al Rahman Al Mrad
Date: Mon, 8 Dec 2025 13:12:58 -0500
Subject: [PATCH 05/28] CI workflow rectifications
---
.github/workflows/jazzy-source-build.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/jazzy-source-build.yml b/.github/workflows/jazzy-source-build.yml
index dfb3c4d9..2d154005 100644
--- a/.github/workflows/jazzy-source-build.yml
+++ b/.github/workflows/jazzy-source-build.yml
@@ -21,7 +21,7 @@ jobs:
with:
required-ros-distributions: ${{ env.ROS_DISTRO }}
- uses: actions/checkout@v3
- - uses: ros-tooling/action-ros-ci@0.3.2
+ - uses: ros-tooling/action-ros-ci@v0.4
with:
target-ros2-distro: ${{ env.ROS_DISTRO }}
# Currently main is compatible with Jazzy
From 0c3c9e370789cf40a69b06fb311faa34f2fc1fe8 Mon Sep 17 00:00:00 2001
From: Abed Al Rahman Al Mrad
Date: Mon, 8 Dec 2025 16:03:15 -0500
Subject: [PATCH 06/28] removed semi-binary build
---
.github/workflows/jazzy-semi-binary-build.yml | 59 -------------------
1 file changed, 59 deletions(-)
delete mode 100644 .github/workflows/jazzy-semi-binary-build.yml
diff --git a/.github/workflows/jazzy-semi-binary-build.yml b/.github/workflows/jazzy-semi-binary-build.yml
deleted file mode 100644
index 8ca92b00..00000000
--- a/.github/workflows/jazzy-semi-binary-build.yml
+++ /dev/null
@@ -1,59 +0,0 @@
-name: Jazzy Semi Binary Build
-on:
- pull_request:
- branches:
- - jazzy
- - main
- push:
- branches:
- - jazzy
- - main
- schedule:
- # Run every morning to detect flakiness and broken dependencies
- - cron: '13 4 * * *'
-
-jobs:
- jazzy_semi_binary:
- name: jazzy semi-binary build
- runs-on: ubuntu-latest
- strategy:
- matrix:
- env:
- - {ROS_DISTRO: jazzy, ROS_REPO: main}
- - {ROS_DISTRO: jazzy, ROS_REPO: testing}
- env:
- UPSTREAM_WORKSPACE: ros2_kortex.${{ matrix.env.ROS_DISTRO }}.repos
- ROSDEP_SKIP_KEYS: robotiq_description
- CCACHE_DIR: ${{ github.workspace }}/.ccache
- BASEDIR: ${{ github.workspace }}/.work
- CACHE_PREFIX: ${{ matrix.env.ROS_DISTRO }}-${{ matrix.env.ROS_REPO }}
- steps:
- - uses: actions/checkout@v3
- # The target directory cache doesn't include the source directory because
- # that comes from the checkout. See "prepare target_ws for cache" task below
- - name: cache target_ws
- if: ${{ ! matrix.env.CCOV }}
- uses: pat-s/always-upload-cache@v2.1.5
- with:
- path: ${{ env.BASEDIR }}/target_ws
- key: target_ws-${{ env.CACHE_PREFIX }}-${{ hashFiles('**/CMakeLists.txt', '**/package.xml') }}-${{ github.run_id }}
- restore-keys: |
- target_ws-${{ env.CACHE_PREFIX }}-${{ hashFiles('**/CMakeLists.txt', '**/package.xml') }}
- - name: cache ccache
- uses: pat-s/always-upload-cache@v2.1.5
- with:
- path: ${{ env.CCACHE_DIR }}
- key: ccache-${{ env.CACHE_PREFIX }}-${{ github.sha }}-${{ github.run_id }}
- restore-keys: |
- ccache-${{ env.CACHE_PREFIX }}-${{ github.sha }}
- ccache-${{ env.CACHE_PREFIX }}
- - uses: 'ros-industrial/industrial_ci@master'
- with:
- config: ${{toJSON(matrix.env)}}
- - name: prepare target_ws for cache
- if: ${{ always() && ! matrix.env.CCOV }}
- run: |
- du -sh ${{ env.BASEDIR }}/target_ws
- sudo find ${{ env.BASEDIR }}/target_ws -wholename '*/test_results/*' -delete
- sudo rm -rf ${{ env.BASEDIR }}/target_ws/src
- du -sh ${{ env.BASEDIR }}/target_ws
From 5c86362c80eb9fe9605a1e3714aaeeafaf0a9964 Mon Sep 17 00:00:00 2001
From: Abed Al Rahman Al Mrad
Date: Tue, 9 Dec 2025 09:25:33 -0500
Subject: [PATCH 07/28] ci-ros-lint update
---
.github/workflows/ci-ros-lint.yml | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/.github/workflows/ci-ros-lint.yml b/.github/workflows/ci-ros-lint.yml
index ea071bb7..288499e2 100644
--- a/.github/workflows/ci-ros-lint.yml
+++ b/.github/workflows/ci-ros-lint.yml
@@ -11,8 +11,8 @@ jobs:
matrix:
linter: [cppcheck, copyright]
steps:
- - uses: actions/checkout@v3
- - uses: ros-tooling/setup-ros@v0.6
+ - uses: actions/checkout@v4
+ - uses: ros-tooling/setup-ros@v0.7
- name: Set environment variable for cppcheck 2.7
run: echo "AMENT_CPPCHECK_ALLOW_SLOW_VERSIONS=1" >> $GITHUB_ENV
- uses: ros-tooling/action-ros-lint@v0.1
@@ -32,8 +32,8 @@ jobs:
strategy:
fail-fast: false
steps:
- - uses: actions/checkout@v3
- - uses: ros-tooling/setup-ros@v0.6
+ - uses: actions/checkout@v4
+ - uses: ros-tooling/setup-ros@v0.7
- uses: ros-tooling/action-ros-lint@v0.1
with:
distribution: rolling
@@ -49,8 +49,8 @@ jobs:
matrix:
linter: [cpplint]
steps:
- - uses: actions/checkout@v3
- - uses: ros-tooling/setup-ros@v0.6
+ - uses: actions/checkout@v4
+ - uses: ros-tooling/setup-ros@v0.7
- uses: ros-tooling/action-ros-lint@v0.1
with:
distribution: rolling
@@ -58,4 +58,4 @@ jobs:
arguments: "--linelength=100 --filter=-whitespace/newline --exclude=kortex_driver/src/kortex_math_util.cpp"
package-name:
kortex_bringup
- kortex_driver
+ kortex_driver
\ No newline at end of file
From 8922a1ba34174991c870ecc144f9c32cc4d42129 Mon Sep 17 00:00:00 2001
From: Abed Al Rahman Al Mrad
Date: Tue, 9 Dec 2025 09:41:46 -0500
Subject: [PATCH 08/28] modified source build .yml
---
.github/workflows/jazzy-source-build.yml | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/.github/workflows/jazzy-source-build.yml b/.github/workflows/jazzy-source-build.yml
index 2d154005..0c6fdd52 100644
--- a/.github/workflows/jazzy-source-build.yml
+++ b/.github/workflows/jazzy-source-build.yml
@@ -1,5 +1,10 @@
name: Jazzy Source Build
on:
+ pull_request:
+ branches:
+ # try to keep jazzy and rolling(main) in sync
+ - jazzy
+ - main
push:
branches:
# try to keep jazzy and rolling(main) in sync
From 3bff68ebc43efaa55ed5dec5821b9693330b20e2 Mon Sep 17 00:00:00 2001
From: Abed Al Rahman Al Mrad
Date: Tue, 9 Dec 2025 10:47:00 -0500
Subject: [PATCH 09/28] kept source build check on push only
---
.github/workflows/jazzy-source-build.yml | 5 -----
1 file changed, 5 deletions(-)
diff --git a/.github/workflows/jazzy-source-build.yml b/.github/workflows/jazzy-source-build.yml
index 0c6fdd52..2d154005 100644
--- a/.github/workflows/jazzy-source-build.yml
+++ b/.github/workflows/jazzy-source-build.yml
@@ -1,10 +1,5 @@
name: Jazzy Source Build
on:
- pull_request:
- branches:
- # try to keep jazzy and rolling(main) in sync
- - jazzy
- - main
push:
branches:
# try to keep jazzy and rolling(main) in sync
From 955e217e45038d54f08ac361f0df38f944ec1bd7 Mon Sep 17 00:00:00 2001
From: Abed Al Rahman Al Mrad
Date: Tue, 9 Dec 2025 10:48:10 -0500
Subject: [PATCH 10/28] format rectification
---
.github/workflows/ci-ros-lint.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/ci-ros-lint.yml b/.github/workflows/ci-ros-lint.yml
index 288499e2..dcae879c 100644
--- a/.github/workflows/ci-ros-lint.yml
+++ b/.github/workflows/ci-ros-lint.yml
@@ -58,4 +58,4 @@ jobs:
arguments: "--linelength=100 --filter=-whitespace/newline --exclude=kortex_driver/src/kortex_math_util.cpp"
package-name:
kortex_bringup
- kortex_driver
\ No newline at end of file
+ kortex_driver
From 7beb7d3336a855d0658cc39e1a751dd74342e060 Mon Sep 17 00:00:00 2001
From: aalmrad
Date: Tue, 9 Dec 2025 14:00:20 -0500
Subject: [PATCH 11/28] fix deprecated hardware_interface API (#327)
---
kortex_driver/include/kortex_driver/hardware_interface.hpp | 2 +-
kortex_driver/src/hardware_interface.cpp | 7 ++++---
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/kortex_driver/include/kortex_driver/hardware_interface.hpp b/kortex_driver/include/kortex_driver/hardware_interface.hpp
index 6bc45a69..33f37fda 100644
--- a/kortex_driver/include/kortex_driver/hardware_interface.hpp
+++ b/kortex_driver/include/kortex_driver/hardware_interface.hpp
@@ -84,7 +84,7 @@ class KortexMultiInterfaceHardware : public hardware_interface::SystemInterface
RCLCPP_SHARED_PTR_DEFINITIONS(KortexMultiInterfaceHardware);
KORTEX_DRIVER_PUBLIC
- CallbackReturn on_init(const hardware_interface::HardwareInfo & info) final;
+ CallbackReturn on_init(const hardware_interface::HardwareComponentInterfaceParams & params) final;
KORTEX_DRIVER_PUBLIC
std::vector export_state_interfaces() final;
diff --git a/kortex_driver/src/hardware_interface.cpp b/kortex_driver/src/hardware_interface.cpp
index f0e856b1..4bbff4e5 100644
--- a/kortex_driver/src/hardware_interface.cpp
+++ b/kortex_driver/src/hardware_interface.cpp
@@ -84,15 +84,16 @@ KortexMultiInterfaceHardware::KortexMultiInterfaceHardware()
}
}
-CallbackReturn KortexMultiInterfaceHardware::on_init(const hardware_interface::HardwareInfo & info)
+CallbackReturn KortexMultiInterfaceHardware::on_init(
+ const hardware_interface::HardwareComponentInterfaceParams & params)
{
RCLCPP_INFO(LOGGER, "Configuring Hardware Interface");
- if (hardware_interface::SystemInterface::on_init(info) != CallbackReturn::SUCCESS)
+ if (hardware_interface::SystemInterface::on_init(params) != CallbackReturn::SUCCESS)
{
return CallbackReturn::ERROR;
}
- info_ = info;
+ info_ = params.hardware_info;
// The robot's IP address.
std::string robot_ip = info_.hardware_parameters["robot_ip"];
if (robot_ip.empty())
From 414c0bdda0fd3befbdf708690f92a7615bfc14cd Mon Sep 17 00:00:00 2001
From: Sebastian Castro <4603398+sea-bass@users.noreply.github.com>
Date: Tue, 9 Dec 2025 14:58:55 -0500
Subject: [PATCH 12/28] Update to parallel_gripper_controller (#324)
---
kortex_description/arms/gen3/6dof/config/ros2_controllers.yaml | 3 +--
kortex_description/arms/gen3/7dof/config/ros2_controllers.yaml | 3 +--
kortex_description/package.xml | 1 +
3 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/kortex_description/arms/gen3/6dof/config/ros2_controllers.yaml b/kortex_description/arms/gen3/6dof/config/ros2_controllers.yaml
index b6396f2f..d1b41ad9 100644
--- a/kortex_description/arms/gen3/6dof/config/ros2_controllers.yaml
+++ b/kortex_description/arms/gen3/6dof/config/ros2_controllers.yaml
@@ -12,7 +12,7 @@ controller_manager:
type: picknik_twist_controller/PicknikTwistController
robotiq_gripper_controller:
- type: position_controllers/GripperActionController
+ type: parallel_gripper_action_controller/GripperActionController
fault_controller:
type: picknik_reset_fault_controller/PicknikResetFaultController
@@ -51,6 +51,5 @@ twist_controller:
robotiq_gripper_controller:
ros__parameters:
- default: true
joint: robotiq_85_left_knuckle_joint
allow_stalling: true
diff --git a/kortex_description/arms/gen3/7dof/config/ros2_controllers.yaml b/kortex_description/arms/gen3/7dof/config/ros2_controllers.yaml
index bd98a73d..7c083326 100644
--- a/kortex_description/arms/gen3/7dof/config/ros2_controllers.yaml
+++ b/kortex_description/arms/gen3/7dof/config/ros2_controllers.yaml
@@ -12,7 +12,7 @@ controller_manager:
type: picknik_twist_controller/PicknikTwistController
robotiq_gripper_controller:
- type: position_controllers/GripperActionController
+ type: parallel_gripper_action_controller/GripperActionController
fault_controller:
type: picknik_reset_fault_controller/PicknikResetFaultController
@@ -52,6 +52,5 @@ twist_controller:
robotiq_gripper_controller:
ros__parameters:
- default: true
joint: robotiq_85_left_knuckle_joint
allow_stalling: true
diff --git a/kortex_description/package.xml b/kortex_description/package.xml
index 932879b1..6a6a20b3 100644
--- a/kortex_description/package.xml
+++ b/kortex_description/package.xml
@@ -21,6 +21,7 @@ for KINOVA KORTEX™ arms and supported grippers
joint_trajectory_controller
robot_state_publisher
robotiq_description
+ parallel_gripper_controller
picknik_reset_fault_controller
picknik_twist_controller
rviz2
From 8e40a6ce41272556a35627481b4438a786b8ee06 Mon Sep 17 00:00:00 2001
From: Abed Al Rahman Al Mrad
Date: Wed, 10 Dec 2025 13:17:24 -0500
Subject: [PATCH 13/28] Modified CI workflow checks
---
.github/workflows/README.md | 8 +--
.github/workflows/rolling-binary-build.yml | 56 ------------------
.../workflows/rolling-semi-binary-build.yml | 58 -------------------
.github/workflows/rolling-source-build.yml | 37 ------------
4 files changed, 4 insertions(+), 155 deletions(-)
delete mode 100644 .github/workflows/rolling-binary-build.yml
delete mode 100644 .github/workflows/rolling-semi-binary-build.yml
delete mode 100644 .github/workflows/rolling-source-build.yml
diff --git a/.github/workflows/README.md b/.github/workflows/README.md
index 9e13d7ad..3c88ebb7 100644
--- a/.github/workflows/README.md
+++ b/.github/workflows/README.md
@@ -6,10 +6,10 @@ A RED job might not mean that this package is currently broken but that an depen
To avoid overloading users viewing the main README page a full list of build statues can be kept here for package maintainers
-ROS2 Distro | Jazzy | Rolling
-:---------: | :---: | :-----:
-| **Branch** | [`jazzy`](https://github.com/Kinovarobotics/ros2_kortex/tree/jazzy) | [`main`](https://github.com/Kinovarobotics/ros2_kortex/tree/main)
-| **Build Status** | [](https://github.com/Kinovarobotics/ros2_kortex/actions/workflows/jazzy-binary-build.yml?branch=jazzy)
[](https://github.com/Kinovarobotics/ros2_kortex/actions/workflows/jazzy-semi-binary-build.yml?branch=jazzy)
[](https://github.com/Kinovarobotics/ros2_kortex/actions/workflows/jazzy-source-build.yml?branch=jazzy) | [](https://github.com/Kinovarobotics/ros2_kortex/actions/workflows/rolling-binary-build.yml?branch=main)
[](https://github.com/Kinovarobotics/ros2_kortex/actions/workflows/rolling-semi-binary-build.yml?branch=main)
[](https://github.com/Kinovarobotics/ros2_kortex/actions/workflows/rolling-source-build.yml?branch=main)
+ROS2 Distro | Jazzy
+:---------: | :---:
+| **Branch** | [`jazzy`](https://github.com/Kinovarobotics/ros2_kortex/tree/jazzy)
+| **Build Status** | [](https://github.com/Kinovarobotics/ros2_kortex/actions/workflows/jazzy-binary-build.yml?branch=jazzy)
[](https://github.com/Kinovarobotics/ros2_kortex/actions/workflows/jazzy-source-build.yml?branch=jazzy)
### Explanation of different build types
diff --git a/.github/workflows/rolling-binary-build.yml b/.github/workflows/rolling-binary-build.yml
deleted file mode 100644
index 3fda1219..00000000
--- a/.github/workflows/rolling-binary-build.yml
+++ /dev/null
@@ -1,56 +0,0 @@
-name: Rolling Binary Build
-on:
- pull_request:
- branches:
- - main
- push:
- branches:
- - main
- schedule:
- # Run every morning to detect flakiness and broken dependencies
- - cron: '13 4 * * *'
-
-jobs:
- rolling_binary:
- name: rolling binary build
- runs-on: ubuntu-latest
- strategy:
- matrix:
- env:
- - {ROS_DISTRO: rolling, ROS_REPO: main}
- - {ROS_DISTRO: rolling, ROS_REPO: testing}
- env:
- UPSTREAM_WORKSPACE: ros2_kortex-not-released.${{ matrix.env.ROS_DISTRO }}.repos
- CCACHE_DIR: ${{ github.workspace }}/.ccache
- BASEDIR: ${{ github.workspace }}/.work
- CACHE_PREFIX: ${{ matrix.env.ROS_DISTRO }}-${{ matrix.env.ROS_REPO }}
- steps:
- - uses: actions/checkout@v3
- # The target directory cache doesn't include the source directory because
- # that comes from the checkout. See "prepare target_ws for cache" task below
- - name: cache target_ws
- if: ${{ ! matrix.env.CCOV }}
- uses: pat-s/always-upload-cache@v2.1.5
- with:
- path: ${{ env.BASEDIR }}/target_ws
- key: target_ws-${{ env.CACHE_PREFIX }}-${{ hashFiles('**/CMakeLists.txt', '**/package.xml') }}-${{ github.run_id }}
- restore-keys: |
- target_ws-${{ env.CACHE_PREFIX }}-${{ hashFiles('**/CMakeLists.txt', '**/package.xml') }}
- - name: cache ccache
- uses: pat-s/always-upload-cache@v2.1.5
- with:
- path: ${{ env.CCACHE_DIR }}
- key: ccache-${{ env.CACHE_PREFIX }}-${{ github.sha }}-${{ github.run_id }}
- restore-keys: |
- ccache-${{ env.CACHE_PREFIX }}-${{ github.sha }}
- ccache-${{ env.CACHE_PREFIX }}
- - uses: 'ros-industrial/industrial_ci@master'
- with:
- config: ${{toJSON(matrix.env)}}
- - name: prepare target_ws for cache
- if: ${{ always() && ! matrix.env.CCOV }}
- run: |
- du -sh ${{ env.BASEDIR }}/target_ws
- sudo find ${{ env.BASEDIR }}/target_ws -wholename '*/test_results/*' -delete
- sudo rm -rf ${{ env.BASEDIR }}/target_ws/src
- du -sh ${{ env.BASEDIR }}/target_ws
diff --git a/.github/workflows/rolling-semi-binary-build.yml b/.github/workflows/rolling-semi-binary-build.yml
deleted file mode 100644
index c88c9cf6..00000000
--- a/.github/workflows/rolling-semi-binary-build.yml
+++ /dev/null
@@ -1,58 +0,0 @@
-name: Rolling Semi Binary Build
-on:
- pull_request:
- branches:
- - main
- push:
- branches:
- - main
- schedule:
- # Run every morning to detect flakiness and broken dependencies
- - cron: '13 4 * * *'
-
-jobs:
- rolling_semi_binary:
- name: rolling semi-binary build
- runs-on: ubuntu-latest
- strategy:
- matrix:
- env:
- - {ROS_DISTRO: rolling, ROS_REPO: main}
- #TODO(moriarty): re-enable rolling testing after rolling feature freeze, known failure upstream
- #- {ROS_DISTRO: rolling, ROS_REPO: testing}
- env:
- UPSTREAM_WORKSPACE: ros2_kortex.${{ matrix.env.ROS_DISTRO }}.repos
- ROSDEP_SKIP_KEYS: robotiq_description
- CCACHE_DIR: ${{ github.workspace }}/.ccache
- BASEDIR: ${{ github.workspace }}/.work
- CACHE_PREFIX: ${{ matrix.env.ROS_DISTRO }}-${{ matrix.env.ROS_REPO }}
- steps:
- - uses: actions/checkout@v3
- # The target directory cache doesn't include the source directory because
- # that comes from the checkout. See "prepare target_ws for cache" task below
- - name: cache target_ws
- if: ${{ ! matrix.env.CCOV }}
- uses: pat-s/always-upload-cache@v2.1.5
- with:
- path: ${{ env.BASEDIR }}/target_ws
- key: target_ws-${{ env.CACHE_PREFIX }}-${{ hashFiles('**/CMakeLists.txt', '**/package.xml') }}-${{ github.run_id }}
- restore-keys: |
- target_ws-${{ env.CACHE_PREFIX }}-${{ hashFiles('**/CMakeLists.txt', '**/package.xml') }}
- - name: cache ccache
- uses: pat-s/always-upload-cache@v2.1.5
- with:
- path: ${{ env.CCACHE_DIR }}
- key: ccache-${{ env.CACHE_PREFIX }}-${{ github.sha }}-${{ github.run_id }}
- restore-keys: |
- ccache-${{ env.CACHE_PREFIX }}-${{ github.sha }}
- ccache-${{ env.CACHE_PREFIX }}
- - uses: 'ros-industrial/industrial_ci@master'
- with:
- config: ${{toJSON(matrix.env)}}
- - name: prepare target_ws for cache
- if: ${{ always() && ! matrix.env.CCOV }}
- run: |
- du -sh ${{ env.BASEDIR }}/target_ws
- sudo find ${{ env.BASEDIR }}/target_ws -wholename '*/test_results/*' -delete
- sudo rm -rf ${{ env.BASEDIR }}/target_ws/src
- du -sh ${{ env.BASEDIR }}/target_ws
diff --git a/.github/workflows/rolling-source-build.yml b/.github/workflows/rolling-source-build.yml
deleted file mode 100644
index d55a3a3a..00000000
--- a/.github/workflows/rolling-source-build.yml
+++ /dev/null
@@ -1,37 +0,0 @@
-name: Rolling Source Build
-on:
- push:
- branches:
- - main
- schedule:
- # Run every morning to detect flakiness and broken dependencies
- - cron: '43 1 * * *'
-
-jobs:
- rolling_source:
- runs-on: ubuntu-22.04
- strategy:
- fail-fast: false
- env:
- ROS_DISTRO: rolling
- steps:
- - uses: ros-tooling/setup-ros@v0.6
- with:
- required-ros-distributions: ${{ env.ROS_DISTRO }}
- - uses: actions/checkout@v3
- - uses: ros-tooling/action-ros-ci@0.3.2
- with:
- target-ros2-distro: ${{ env.ROS_DISTRO }}
- import-token: ${{ secrets.GITHUB_TOKEN }}
- # build all packages listed in the meta package
- package-name:
- kortex_bringup
- kortex_driver
- vcs-repo-file-url: |
- https://raw.githubusercontent.com/ros2/ros2/master/ros2.repos
- file://${{ github.workspace }}/ros2_kortex.repos
- colcon-mixin-repository: https://raw.githubusercontent.com/colcon/colcon-mixin-repository/master/index.yaml
- - uses: actions/upload-artifact@v1
- with:
- name: colcon-logs-${{ matrix.os }}
- path: ros_ws/log
From 2a381a169bd3b75eb92ddc679edd398cc6edf94f Mon Sep 17 00:00:00 2001
From: Abed Al Rahman Al Mrad
Date: Wed, 10 Dec 2025 13:27:02 -0500
Subject: [PATCH 14/28] modified README of the build checks
---
.github/workflows/README.md | 9 ++-------
1 file changed, 2 insertions(+), 7 deletions(-)
diff --git a/.github/workflows/README.md b/.github/workflows/README.md
index 3c88ebb7..ef4def62 100644
--- a/.github/workflows/README.md
+++ b/.github/workflows/README.md
@@ -13,15 +13,10 @@ ROS2 Distro | Jazzy
### Explanation of different build types
-**NOTE**: There are three build stages checking current and future compatibility of the package.
+**NOTE**: For the jazzy branch, there are two build stages checking current and future compatibility of the package.
1. Binary builds - against released packages (main and testing) in ROS distributions. Shows that direct local build is possible.
Uses repos file: `src/$NAME$/$NAME$-not-released..repos`
-1. Semi-binary builds - against released core ROS packages (main and testing), but the immediate dependencies are pulled from source.
- Shows that local build with dependencies is possible and if fails there we can expect that after the next package sync we will not be able to build.
-
- Uses repos file: `src/$NAME$/$NAME$.repos`
-
-1. Source build - also core ROS packages are build from source. It shows potential issues in the mid future.
+2. Source build - also core ROS packages are build from source. It shows potential issues in the mid future.
From 9067c264e3a3e3bfb390fa10a3ad2be3f42b8ab5 Mon Sep 17 00:00:00 2001
From: Abed Al Rahman Al Mrad
Date: Mon, 15 Dec 2025 18:34:28 -0500
Subject: [PATCH 15/28] updated the CHANGELOG.rst files
---
kortex_api/CHANGELOG.rst | 10 ++++++++
kortex_bringup/CHANGELOG.rst | 12 +++++++++
kortex_description/CHANGELOG.rst | 25 +++++++++++++++++++
kortex_driver/CHANGELOG.rst | 13 ++++++++++
.../CHANGELOG.rst | 15 +++++++++++
.../CHANGELOG.rst | 15 +++++++++++
.../CHANGELOG.rst | 16 ++++++++++++
7 files changed, 106 insertions(+)
create mode 100644 kortex_moveit_config/kinova_gen3_lite_moveit_config/CHANGELOG.rst
diff --git a/kortex_api/CHANGELOG.rst b/kortex_api/CHANGELOG.rst
index d57ea4b1..8ff5385d 100644
--- a/kortex_api/CHANGELOG.rst
+++ b/kortex_api/CHANGELOG.rst
@@ -2,6 +2,16 @@
Changelog for package kortex_api
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+0.2.4 (2025-12-15)
+------------------
+* modified the kortex trademark name (`#305 `_)
+* Contributors: Abed Al Rahman Al Mrad
+
+0.2.3 (2025-02-27)
+------------------
+* Package version updates
+* Contributors: Abed Al Rahman Al Mrad
+
0.2.2 (2023-08-09)
------------------
diff --git a/kortex_bringup/CHANGELOG.rst b/kortex_bringup/CHANGELOG.rst
index 8ed636bb..57ebdf38 100644
--- a/kortex_bringup/CHANGELOG.rst
+++ b/kortex_bringup/CHANGELOG.rst
@@ -2,6 +2,18 @@
Changelog for package kortex_bringup
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+0.2.4 (2025-12-15)
+------------------
+* Remove Gazebo Classic support and Update for MoveIt Jazzy/Rolling (`#228 `_)
+* Contributors: Abed Al Rahman Al Mrad
+
+0.2.3 (2025-02-27)
+------------------
+* Fixed the Gazebo Fortress Simulation + Separated the arm and gripper control for Gen3_Lite + Fixed bugs (`#252 `_)
+* Added the empty gripper option for gen3.launch.py (`#242 `_)
+* Fix mock_hardware and enable simulating gen3_lite (`#196 `_)
+* Contributors: Abed Al Rahman Al Mrad
+
0.2.2 (2023-08-09)
------------------
diff --git a/kortex_description/CHANGELOG.rst b/kortex_description/CHANGELOG.rst
index d0c01e78..f28a2511 100644
--- a/kortex_description/CHANGELOG.rst
+++ b/kortex_description/CHANGELOG.rst
@@ -2,6 +2,31 @@
Changelog for package kortex_description
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+0.2.4 (2025-12-15)
+------------------
+* Update to parallel_gripper_controller (`#324 `_)
+* fixed bringing up the Gen3 wo gripper issue (`#321 `_)
+* fixed the gen3_lite fake_hardware issue (`#319 `_)
+* fixed gen3_lite moveit issues (`#318 `_)
+* Modifications to fix moveit issues while controlling Gen3_lite (`#316 `_)
+* modified the kortex trademark name (`#305 `_)
+* Fixed pi issue #295 (`#296 `_)
+* Replaced file:// with package:// + Added temporary repositories as dependencies (`#275 `_)
+* Remove Gazebo Classic support and Update for MoveIt Jazzy/Rolling (`#228 `_)
+* Contributors: Abed Al Rahman Al Mrad
+
+0.2.3 (2025-02-27)
+------------------
+* Fixed the Gazebo Fortress Simulation + Separated the arm and gripper control for Gen3_Lite + Fixed bugs (`#252 `_)
+* Added the empty gripper option for gen3.launch.py (`#242 `_)
+* Modified the joint limits of Gen3 and Gen3 Lite robots as per the values in the User Guides (`#241 `_)
+* Added .STL files for the Gen3 7dof meshes (`#235 `_)
+* Added a Moveit2 package for Gen3-Lite (`#231 `_)
+* Update gripper descriptions for use on HW (`#206 `_)
+* Update gen3 lite and gripper macros (`#191 `_)
+* Cleanup robots for visualization & sim (`#180 `_)
+* Contributors: Abed Al Rahman Al Mrad
+
0.2.2 (2023-08-09)
------------------
* Refactor MoveIt Launch files (`#162 `_)
diff --git a/kortex_driver/CHANGELOG.rst b/kortex_driver/CHANGELOG.rst
index d45751da..855bdeab 100644
--- a/kortex_driver/CHANGELOG.rst
+++ b/kortex_driver/CHANGELOG.rst
@@ -2,6 +2,19 @@
Changelog for package kortex_driver
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+0.2.4 (2025-12-15)
+------------------
+* fix deprecated hardware_interface API (`#327 `_)
+* Fixed pi issue #295 (`#296 `_)
+* modified the kortex trademark name (`#305 `_)
+* Contributors: Abed Al Rahman Al Mrad
+
+0.2.3 (2025-02-27)
+------------------
+* Add force and velocity hardware interfaces (`#204 `_)
+* Changing the list of packages maintainers
+* Contributors: Abed Al Rahman Al Mrad
+
0.2.2 (2023-08-09)
------------------
* cxx: remove unused-but-set-parameter (`#164 `_)
diff --git a/kortex_moveit_config/kinova_gen3_6dof_robotiq_2f_85_moveit_config/CHANGELOG.rst b/kortex_moveit_config/kinova_gen3_6dof_robotiq_2f_85_moveit_config/CHANGELOG.rst
index 14f86d9f..35db6258 100644
--- a/kortex_moveit_config/kinova_gen3_6dof_robotiq_2f_85_moveit_config/CHANGELOG.rst
+++ b/kortex_moveit_config/kinova_gen3_6dof_robotiq_2f_85_moveit_config/CHANGELOG.rst
@@ -2,6 +2,21 @@
Changelog for package kinova_gen3_6dof_robotiq_2f_85_moveit_config
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+0.2.4 (2025-12-15)
+------------------
+* fixed gen3_lite moveit issues (`#318 `_)
+* Remove Gazebo Classic support and Update for MoveIt Jazzy/Rolling (`#228 `_)
+* Contributors: Abed Al Rahman Al Mrad
+
+0.2.3 (2025-02-27)
+------------------
+* Update planner_plugin parameters (`#199 `_)
+* Remove outdated config artifacts (`#198 `_)
+* Cleanup robots for visualization & sim (`#180 `_)
+* Update planning pipeline configurations (`#187 `_)
+* Changing the list of packages maintainers
+* Contributors: Abed Al Rahman Al Mrad
+
0.2.2 (2023-08-09)
------------------
* specify planning pipelines to use (`#157 `_)
diff --git a/kortex_moveit_config/kinova_gen3_7dof_robotiq_2f_85_moveit_config/CHANGELOG.rst b/kortex_moveit_config/kinova_gen3_7dof_robotiq_2f_85_moveit_config/CHANGELOG.rst
index 36e7f51e..327a698a 100644
--- a/kortex_moveit_config/kinova_gen3_7dof_robotiq_2f_85_moveit_config/CHANGELOG.rst
+++ b/kortex_moveit_config/kinova_gen3_7dof_robotiq_2f_85_moveit_config/CHANGELOG.rst
@@ -2,6 +2,21 @@
Changelog for package kinova_gen3_7dof_robotiq_2f_85_moveit_config
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+0.2.4 (2025-12-15)
+------------------
+* fixed gen3_lite moveit issues (`#318 `_)
+* Remove Gazebo Classic support and Update for MoveIt Jazzy/Rolling (`#228 `_)
+* Contributors: Abed Al Rahman Al Mrad
+
+0.2.3 (2025-02-27)
+------------------
+* Update planner_plugin parameters (`#199 `_)
+* Remove outdated config artifacts (`#198 `_)
+* Cleanup robots for visualization & sim (`#180 `_)
+* Update planning pipeline configurations (`#187 `_)
+* Changing the list of packages maintainers
+* Contributors: Abed Al Rahman Al Mrad
+
0.2.2 (2023-08-09)
------------------
* specify planning pipelines to use (`#157 `_)
diff --git a/kortex_moveit_config/kinova_gen3_lite_moveit_config/CHANGELOG.rst b/kortex_moveit_config/kinova_gen3_lite_moveit_config/CHANGELOG.rst
new file mode 100644
index 00000000..cc746042
--- /dev/null
+++ b/kortex_moveit_config/kinova_gen3_lite_moveit_config/CHANGELOG.rst
@@ -0,0 +1,16 @@
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Changelog for package kinova_gen3_lite_moveit_config
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+0.2.4 (2025-12-15)
+------------------
+* fixed gen3_lite moveit issues (`#318 `_)
+* Modifications to fix moveit issues while controlling Gen3_lite (`#316 `_)
+* Remove Gazebo Classic support and Update for MoveIt Jazzy/Rolling (`#228 `_)
+* Contributors: Abed Al Rahman Al Mrad
+
+0.2.3 (2025-02-27)
+------------------
+* Fixed the Gazebo Fortress Simulation + Separated the arm and gripper control for Gen3_Lite + Fixed bugs (`#252 `_)
+* Added a Moveit2 package for Gen3-Lite (`#231 `_)
+* Contributors: Abed Al Rahman Al Mrad
From 23d21663535330cb13b45a44aca85a884ca0c22c Mon Sep 17 00:00:00 2001
From: Abed Al Rahman Al Mrad
Date: Mon, 15 Dec 2025 18:34:45 -0500
Subject: [PATCH 16/28] 0.2.4
---
kortex_api/package.xml | 2 +-
kortex_bringup/package.xml | 2 +-
kortex_description/package.xml | 2 +-
kortex_driver/package.xml | 2 +-
.../kinova_gen3_6dof_robotiq_2f_85_moveit_config/package.xml | 2 +-
.../kinova_gen3_7dof_robotiq_2f_85_moveit_config/package.xml | 2 +-
kortex_moveit_config/kinova_gen3_lite_moveit_config/package.xml | 2 +-
7 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/kortex_api/package.xml b/kortex_api/package.xml
index bca4bd08..a4207df5 100644
--- a/kortex_api/package.xml
+++ b/kortex_api/package.xml
@@ -1,7 +1,7 @@
kortex_api
- 0.2.3
+ 0.2.4
KINOVA KORTEX™ API
Marq Rasmussen
diff --git a/kortex_bringup/package.xml b/kortex_bringup/package.xml
index c1460ba7..0ee35602 100644
--- a/kortex_bringup/package.xml
+++ b/kortex_bringup/package.xml
@@ -2,7 +2,7 @@
kortex_bringup
- 0.2.3
+ 0.2.4
Launch file and run-time configurations, e.g. controllers.
Marq Rasmussen
diff --git a/kortex_description/package.xml b/kortex_description/package.xml
index 6a6a20b3..8bcfcb87 100644
--- a/kortex_description/package.xml
+++ b/kortex_description/package.xml
@@ -2,7 +2,7 @@
kortex_description
- 0.2.3
+ 0.2.4
URDF and xacro description package for KINOVA KORTEX™ robots
This package contains configuration data, 3D models and launch files
diff --git a/kortex_driver/package.xml b/kortex_driver/package.xml
index c77fb935..e3dfbb0b 100644
--- a/kortex_driver/package.xml
+++ b/kortex_driver/package.xml
@@ -2,7 +2,7 @@
kortex_driver
- 0.2.3
+ 0.2.4
ROS2 driver package for the Kinova Robot Hardware.
Alex Moriarty
Martin Leroux
diff --git a/kortex_moveit_config/kinova_gen3_6dof_robotiq_2f_85_moveit_config/package.xml b/kortex_moveit_config/kinova_gen3_6dof_robotiq_2f_85_moveit_config/package.xml
index 89978b4f..04784a76 100644
--- a/kortex_moveit_config/kinova_gen3_6dof_robotiq_2f_85_moveit_config/package.xml
+++ b/kortex_moveit_config/kinova_gen3_6dof_robotiq_2f_85_moveit_config/package.xml
@@ -2,7 +2,7 @@
kinova_gen3_6dof_robotiq_2f_85_moveit_config
- 0.2.3
+ 0.2.4
An automatically generated package with all the configuration and launch files for using the gen3 with the MoveIt Motion Planning Framework
diff --git a/kortex_moveit_config/kinova_gen3_7dof_robotiq_2f_85_moveit_config/package.xml b/kortex_moveit_config/kinova_gen3_7dof_robotiq_2f_85_moveit_config/package.xml
index 630457b1..ced1e26a 100644
--- a/kortex_moveit_config/kinova_gen3_7dof_robotiq_2f_85_moveit_config/package.xml
+++ b/kortex_moveit_config/kinova_gen3_7dof_robotiq_2f_85_moveit_config/package.xml
@@ -2,7 +2,7 @@
kinova_gen3_7dof_robotiq_2f_85_moveit_config
- 0.2.3
+ 0.2.4
An automatically generated package with all the configuration and launch files for using the gen3 with the MoveIt Motion Planning Framework
diff --git a/kortex_moveit_config/kinova_gen3_lite_moveit_config/package.xml b/kortex_moveit_config/kinova_gen3_lite_moveit_config/package.xml
index 4a806840..8a0f61b8 100644
--- a/kortex_moveit_config/kinova_gen3_lite_moveit_config/package.xml
+++ b/kortex_moveit_config/kinova_gen3_lite_moveit_config/package.xml
@@ -2,7 +2,7 @@
kinova_gen3_lite_moveit_config
- 0.2.3
+ 0.2.4
An automatically generated package with all the configuration and launch files for using the gen3_lite with the MoveIt Motion Planning Framework
From 50681544cf74750b601b55e7e62271db3716aba3 Mon Sep 17 00:00:00 2001
From: aalmrad
Date: Mon, 5 Jan 2026 20:22:12 -0500
Subject: [PATCH 17/28] updated the kortex api fetching technique (#332)
---
kortex_api/CMakeLists.txt | 2 +-
kortex_api/linux_x86-64_x86_gcc.zip | Bin 0 -> 6898420 bytes
2 files changed, 1 insertion(+), 1 deletion(-)
create mode 100644 kortex_api/linux_x86-64_x86_gcc.zip
diff --git a/kortex_api/CMakeLists.txt b/kortex_api/CMakeLists.txt
index ddf42b71..4e0ebeb2 100644
--- a/kortex_api/CMakeLists.txt
+++ b/kortex_api/CMakeLists.txt
@@ -3,7 +3,7 @@ include(FetchContent)
#include(ExternalProject)
FetchContent_Declare(
kinova_binary_api
- URL https://artifactory.kinovaapps.com:443/artifactory/generic-public/kortex/API/2.5.0/linux_x86-64_x86_gcc.zip
+ URL ${CMAKE_CURRENT_SOURCE_DIR}/linux_x86-64_x86_gcc.zip
URL_HASH MD5=64bd86e7ab8bda90ef1fc7d6a356e080
)
diff --git a/kortex_api/linux_x86-64_x86_gcc.zip b/kortex_api/linux_x86-64_x86_gcc.zip
new file mode 100644
index 0000000000000000000000000000000000000000..6a9285a15b09105e93ac6cac23710da09a80ebce
GIT binary patch
literal 6898420
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%0Avg|L2O8bGOd!r};&~8(&?Y_L1p^
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 =tqXvAVmqa@pp2z^Yx1goJ9B+Hihg=eWH
zL!-I^wK8xvn)|j)&eAbJzd9076#K>P7wg9}uYQFC!_raW)M}bXt;r5QZHaSPw*ffr
zs&uvFg(8_crlTbQB-$EIvmN3PUy9vj-MBwepwp(t^bkuofCh#!a4-{{fKi8zta~Rt
zzWFBrp$jGwAPX~RT@A}PhzY~ztKEf`Uo
zJai3Ke!E6$ITrGnE`D0VVFG?@01w^Y1hw=fzD;76REe-c1FRs%!O|1BG%jrn&+>`6
z7$QZ$6}gl9S!w$Swk?q~;6_;19#1SIgN`qon+6H#hhVUa(QBF+k60`hlZJb2%r3R5
z-{!c}-~~{#N;dPOf=W6Ww_^P@*Jw+>{qnC`;|R1fOt(2GbJFxWMF?t&3E!`L9%{WK
zJxAK&dZjA0$i_h(qeTCB#&*>H-pRWspr@2A39R7y<0y)Y6C!4D{GmCSv>$vxTbF@8Z-F}$%JA&EzvamwkUP{tgDMU^PgSVV=I1kN7Xmw*d&t-x#jI<<
zJE+oGr1xOyQ?b?z!hzWTQr@{;at-RwIAn7)=rM{Q_abZ*vmQ@b1v;EG#WmrSwK6qk
z<2ZAo&+0Iv_wAan1ZpSj2n$Uo1_>(&(f#>Y=;km`bvQcytP7r7{5|jzJtg4fYyO}h
z&>i)lC_drD9!GqRKdT)qncH}c*F!&dp4@P7*x3+|E#!b-aaGdJ{KAmhDs6KBji<^g
znc+f{GS7_>MP_Qp*(j6^>s^0<@R-=_lqLAgE#3C
zCSblk%?3qNdfcwO|2s7cweBDLif+ZBHK967N1$tS@SUvATRTuo8o#B4g{{l0>8Xt0
zA?mo8X4|9xn5YNcH_yPPn5B4a``?esbnKu-x{l3g^;~aAZ?pHBWH`>x>Aj_uur=AX
z4-eHl(siYk!T>2Oof8!Jo&GIu=WYHzzvTP2#hv2=tb8T2m?<}+Jgs-ty!Nek^*uPV
zKt{YZS*egu`ElzkMUrh+11{N}NF!IXYM{1nS*%J4;NXBEGLxumWgf3cttFXh#d1w>
zs{%KKKE0MOQ^W8xz|na`|(6oa&p5-$Ap2JHEC8L3l?0guE>PJ29MTmIT$A8Ouj
zHNvOl2pLusM{T#pFwjR0!x^CbpnTM9k>`RA`Q=~AZcuh>1w+3Z}
zj`w7#ZlT|*H?5DEFmHAu=d8IVAFM=z=VGlEJ$vDTw
zhW3CUKw%S)*i0dH+&leIsdf-uka7xt8QL6k@aK5b{u9|nC|~d~!`dvaisg~|n(zi*
z2{RjA-|4)ges{2c;0LE)U%z1QafoF*B6j!GKfE4%5_989^1@b25tYUvHZ%@#wm36y
zJyTiGnd>d6!tU`pgC$}jD=1dp%)ajuHR(*;Bice1g0U00FXpVnGgwcm#q2A
z!Kd6fbM6Ux*-%6%%xfxX%U0PLEtit;$SxHkYVrl%G#DTvbVPbmp9uxGjK1ZBT#BR<
z#Z{w{J+&vccVL;RX|)n`TG}3EEkQrKc#+OY4voNXQg-JbK0i&57B^}{Pclf<^c|zw
zNV;6IIKC+(63gW(s&mPfM1{sdznrI#K14jM&L*upvu|MB%6zj>D~Y7lX)`Z^8d<7Om*f+93~AqEiQAzLb7u_I!jObxZla5
zimq2^s7wRFOXMk=MCdSrwlnj)@p3{F0cy3yZ3kt>31i7&D8aO?0lE{4irWL
z$S=q!DL+v4TQ=Mth}yAVEtG!Xu&)kj?Qi?SpPatr#4y7A-w;pTEATZXwr4Sv>S3zz
zs-{(npmEAZ%D2bEfBQP_IRdej&cm^i#4TFjPS`P4knk+AMkVHKGin76&F`%+@G~SE
zK;YC+*9~5qhE5(3j~^`3xrM4Aeo)L(rdCOlaPL+PjBK&f0%_Yw#P|5&zgUzv8M~N`
zjlo&`wtDK`1vnAz0QrU&bga**^)c;UUgj3VJt=Gz2vE2@_!(F!TlZHJ!2|;9d=Jg2
z4mwV&yqoRoZ3J1%y&oH6|
zId*b%^1}(GM9b4Js{)_*J3lH0*`{A`2qNyeyJOY^SZrd=Bz24yNn
zmq#pmi>+N8$GT`%o(}p|+?AG|tty|Nu)uw p7RBXB
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 |