From c67fec4f3b0b92bae75b6f34a9d59226ef02afa0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Oct 2025 10:30:14 +0100 Subject: [PATCH 1/7] Bump actions/upload-artifact from 4 to 5 (#398) --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c8fc774a..2e7068ca 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -90,7 +90,7 @@ jobs: mkdir -p ursim_logs/flightreports docker cp ursim:/ursim/flightreports/. ursim_logs/flightreports/ - name: Upload logfiles - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 if: always() && matrix.env.URSIM_VERSION != '10.7.0' with: name: ${{matrix.env.ROBOT_MODEL}}_${{matrix.env.URSIM_VERSION}}_URSim_Logs @@ -98,7 +98,7 @@ jobs: if-no-files-found: error retention-days: 10 - name: Upload test artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 if: always() && matrix.env.URSIM_VERSION != '10.7.0' with: name: ${{matrix.env.ROBOT_MODEL}}_${{matrix.env.URSIM_VERSION}}_test_artifacts From 276120d80fdb4ca1e6c0fbdd0d3a5a03bf5128a9 Mon Sep 17 00:00:00 2001 From: Felix Exner Date: Wed, 29 Oct 2025 14:44:28 +0100 Subject: [PATCH 2/7] Succeed power on command on PolyScope 5 when robot is running (#397) We check for the robot state being IDLE and retry that with a very high timeout by default. This commit also accepts the robot to be in RUNNING in order to succeed. Otherwise the robot will reply "Powering on" through the dashboard interface, but the state will stay unchanged because it is already idling. Thus, the call will fail (and block very long) while the pure dashboard call would be succeeding. --- src/ur/dashboard_client_implementation_g5.cpp | 2 +- tests/test_dashboard_client_g5.cpp | 37 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/ur/dashboard_client_implementation_g5.cpp b/src/ur/dashboard_client_implementation_g5.cpp index 61f50435..25e5a6b9 100644 --- a/src/ur/dashboard_client_implementation_g5.cpp +++ b/src/ur/dashboard_client_implementation_g5.cpp @@ -438,7 +438,7 @@ DashboardResponse DashboardClientImplG5::commandPowerOn(const std::chrono::durat DashboardResponse response; try { - response.message = retryCommandString("power on", "Powering on", "robotmode", "Robotmode: IDLE", timeout); + response.message = retryCommandString("power on", "Powering on", "robotmode", "Robotmode: (IDLE|RUNNING)", timeout); response.ok = true; } catch (const UnexpectedResponse& e) diff --git a/tests/test_dashboard_client_g5.cpp b/tests/test_dashboard_client_g5.cpp index 2b8164f2..3696ac0c 100644 --- a/tests/test_dashboard_client_g5.cpp +++ b/tests/test_dashboard_client_g5.cpp @@ -91,6 +91,43 @@ TEST_F(DashboardClientTestG5, connect) ASSERT_TRUE(response.ok); } +TEST_F(DashboardClientTestG5, power_cycle) +{ + EXPECT_TRUE(dashboard_client_->connect()); + DashboardResponse response; + + // Cycle from POWER_OFF to IDLE to RUNNING + response = dashboard_client_->commandPowerOff(); + EXPECT_TRUE(response.ok); + response = dashboard_client_->commandPowerOn(std::chrono::seconds(5)); + EXPECT_TRUE(response.ok); + response = dashboard_client_->commandBrakeRelease(); + EXPECT_TRUE(response.ok); + + // Calling power_on on a brake-released robot should succeed + response = dashboard_client_->commandPowerOn(std::chrono::seconds(5)); + EXPECT_TRUE(response.ok); + + // Power off from brake-released state (RUNNING) + response = dashboard_client_->commandPowerOff(); + EXPECT_TRUE(response.ok); + + // Power off from powered_on state (IDLE) + dashboard_client_->commandPowerOn(); + response = dashboard_client_->commandPowerOff(); + EXPECT_TRUE(response.ok); + + // Power off from powered_on state (IDLE) + dashboard_client_->commandPowerOff(); + response = dashboard_client_->commandPowerOff(); + EXPECT_TRUE(response.ok); + + // Brake release from POWER_OFF should succeed + dashboard_client_->commandPowerOff(); + response = dashboard_client_->commandBrakeRelease(); + EXPECT_TRUE(response.ok); +} + TEST_F(DashboardClientTestG5, run_program) { EXPECT_TRUE(dashboard_client_->connect()); From d4eed85b283fe82b547e60061c7a07065467fd69 Mon Sep 17 00:00:00 2001 From: Felix Exner Date: Mon, 10 Nov 2025 07:13:43 +0100 Subject: [PATCH 3/7] Save polyscope folder in local filesystem (#399) This way, for example the setting for keeping remote_control available stays persistent as requested. --- scripts/start_ursim.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/start_ursim.sh b/scripts/start_ursim.sh index 93a5fdb5..c0d38583 100755 --- a/scripts/start_ursim.sh +++ b/scripts/start_ursim.sh @@ -419,6 +419,7 @@ main() { URCAP_STORAGE="${PERSISTENT_BASE}/${ROBOT_SERIES}/urcaps" PROGRAM_STORAGE="${PERSISTENT_BASE}/${ROBOT_SERIES}/${ROBOT_MODEL}/programs" + POLYSCOPE_STORAGE="${PERSISTENT_BASE}/${ROBOT_SERIES}/${ROBOT_MODEL}/polyscope" strip_robot_model "$ROBOT_MODEL" "$ROBOT_SERIES" @@ -481,6 +482,7 @@ main() { docker_cmd="docker run --rm -d --net ursim_net --ip $IP_ADDRESS\ -v ${URCAP_STORAGE}:/urcaps \ -v ${PROGRAM_STORAGE}:/ursim/programs \ + -v ${POLYSCOPE_STORAGE}:/ursim/.polyscope \ -e ROBOT_MODEL=${ROBOT_MODEL} \ $PORT_FORWARDING \ --name $CONTAINER_NAME \ From 8459c3c1565812fd4af647819adc40daa382ba56 Mon Sep 17 00:00:00 2001 From: "Andrew C. Morrow" Date: Mon, 10 Nov 2025 01:18:59 -0500 Subject: [PATCH 4/7] Add enum value for 3PE input active to UrRtdeSafetyStatusBits (#401) --- include/ur_client_library/rtde/rtde_client.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/ur_client_library/rtde/rtde_client.h b/include/ur_client_library/rtde/rtde_client.h index 7343a4ad..af152e4c 100644 --- a/include/ur_client_library/rtde/rtde_client.h +++ b/include/ur_client_library/rtde/rtde_client.h @@ -74,7 +74,8 @@ enum class UrRtdeSafetyStatusBits IS_EMERGENCY_STOPPED = 7, IS_VIOLATION = 8, IS_FAULT = 9, - IS_STOPPED_DUE_TO_SAFETY = 10 + IS_STOPPED_DUE_TO_SAFETY = 10, + IS_3PE_INPUT_ACTIVE = 11 }; enum class ClientState From 168a7d4a26526720ab30592843d2b7ab147e0993 Mon Sep 17 00:00:00 2001 From: Felix Exner Date: Mon, 10 Nov 2025 15:05:02 +0100 Subject: [PATCH 5/7] RTDEClient sendStart handle missed confirmation (#403) In some circumstances it can happen that we read the first data package instead of the start confirmation, especially on non-RT systems. In this case, we can still assume sending start was successful. --- src/rtde/rtde_client.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/rtde/rtde_client.cpp b/src/rtde/rtde_client.cpp index b7c1bac7..6a230684 100644 --- a/src/rtde/rtde_client.cpp +++ b/src/rtde/rtde_client.cpp @@ -610,12 +610,20 @@ bool RTDEClient::sendStart() { return tmp->accepted_; } + else if (rtde_interface::DataPackage* tmp = dynamic_cast(package.get())) + { + // There is a race condition whether the last received packet was the start confirmation or + // is already a data package. In that case consider the start as successful. + double timestamp; + return tmp->getData("timestamp", timestamp); + } else { std::stringstream ss; ss << "Did not receive answer to RTDE start request. Message received instead: " << std::endl << package->toString(); URCL_LOG_WARN("%s", ss.str().c_str()); + num_retries++; } } std::stringstream ss; From 1dffa978ad34d64b27d5548ab1e5ed225a2b48cd Mon Sep 17 00:00:00 2001 From: Felix Exner Date: Mon, 10 Nov 2025 15:21:54 +0100 Subject: [PATCH 6/7] Prepare changelog for upcoming release --- CHANGELOG.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index affc9851..4cc6aa21 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -2,6 +2,15 @@ Changelog for package ur_client_library ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- +* RTDEClient sendStart handle missed confirmation (`#403 `_) +* Add enum value for 3PE input active to UrRtdeSafetyStatusBits (`#401 `_) +* Save polyscope folder in local filesystem (`#399 `_) +* Succeed power on command on PolyScope 5 when robot is running (`#397 `_) +* Bump actions/upload-artifact from 4 to 5 (`#398 `_) +* Contributors: Andrew C. Morrow, Felix Exner, dependabot[bot] + 2.5.0 (2025-10-24) ------------------ * Polyscopex dashboard client (`#392 `_) From 81cf78a66b37c85bf0423e0becdf1948f815822f Mon Sep 17 00:00:00 2001 From: Felix Exner Date: Mon, 10 Nov 2025 15:22:10 +0100 Subject: [PATCH 7/7] 2.6.0 --- CHANGELOG.rst | 4 ++-- package.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 4cc6aa21..e81dea5b 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -2,8 +2,8 @@ Changelog for package ur_client_library ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +2.6.0 (2025-11-10) +------------------ * RTDEClient sendStart handle missed confirmation (`#403 `_) * Add enum value for 3PE input active to UrRtdeSafetyStatusBits (`#401 `_) * Save polyscope folder in local filesystem (`#399 `_) diff --git a/package.xml b/package.xml index 6541c801..ee8f4317 100644 --- a/package.xml +++ b/package.xml @@ -2,7 +2,7 @@ ur_client_library - 2.5.0 + 2.6.0 Standalone C++ library for accessing Universal Robots interfaces. This has been forked off the ur_robot_driver. Thomas Timm Andersen Simon Rasmussen