From 472cbc6b08cc299571e621bf74b1a08cb32af499 Mon Sep 17 00:00:00 2001 From: Alexander Schaefer Date: Mon, 12 May 2025 20:20:00 +0200 Subject: [PATCH] AS --- .DS_Store | Bin 8196 -> 8196 bytes test/.DS_Store | Bin 8196 -> 8196 bytes test/joint_states_recording.py | 2 +- test/joint_trajectory_recording.py | 2 +- test/osc_command_recording.py | 35 + test/rampfunction.py | 31 + test/ros2_ws/install/local_setup.sh | 2 +- test/ros2_ws/install/setup.bash | 8 + test/ros2_ws/install/setup.ps1 | 4 + test/ros2_ws/install/setup.sh | 12 +- test/ros2_ws/install/setup.zsh | 8 + .../log/build_2025-05-08_20-38-18/events.log | 7 + .../build_2025-05-08_20-38-18/logger_all.log | 160 ++++ test/ros2_ws/log/latest_build | 2 +- workspace/build/joint_control/colcon_build.rc | 2 +- .../colcon_command_prefix_setup_py.sh.env | 6 +- workspace/build/joint_control/joint_control | 2 +- .../joint_control.egg-info/SOURCES.txt | 12 +- workspace/build/joint_control/package.xml | 2 +- .../__pycache__/sitecustomize.cpython-310.pyc | Bin 293 -> 293 bytes .../joint_control/resource/joint_control | 2 +- workspace/build/joint_control/setup.cfg | 2 +- workspace/build/joint_control/setup.py | 1 + .../osc_ros2/osc_ros2.egg-info/SOURCES.txt | 2 +- .../osc_ros2.egg-info/entry_points.txt | 2 +- .../__pycache__/sitecustomize.cpython-310.pyc | Bin 283 -> 283 bytes .../joint_control/lib/joint_control/sandbox | 33 + .../site-packages/joint-control.egg-link | 2 + .../log/build_2025-05-08_15-47-35/events.log | 38 + .../build_2025-05-08_15-47-35/logger_all.log | 174 ++++ .../osc_ros2/command.log | 2 + .../osc_ros2/stderr.log | 0 .../osc_ros2/stdout.log | 16 + .../osc_ros2/stdout_stderr.log | 16 + .../osc_ros2/streams.log | 18 + .../log/build_2025-05-08_20-39-10/events.log | 52 ++ .../joint_control/command.log | 2 + .../joint_control/stderr.log | 0 .../joint_control/stdout.log | 30 + .../joint_control/stdout_stderr.log | 30 + .../joint_control/streams.log | 32 + .../build_2025-05-08_20-39-10/logger_all.log | 174 ++++ workspace/log/latest_build | 2 +- workspace/src/joint_angles.py | 12 +- .../__pycache__/__init__.cpython-310.pyc | Bin 142 -> 152 bytes .../trajectory_server_new.cpython-310.pyc | Bin 7047 -> 7051 bytes .../joint_control/trajectory_server_new.py | 2 +- .../__pycache__/osc_ros2.cpython-310.pyc | Bin 24934 -> 25324 bytes workspace/src/osc_ros2/osc_ros2/osc_ros2.py | 144 +++- .../src/osc_ros2/osc_ros2/osc_ros2_latency.py | 770 +++++++++++++++++ .../osc_ros2/osc_ros2/osc_ros2_osc_record.py | 811 ++++++++++++++++++ ...sc_ros2_unit_quater.py => osc_ros2_rpy.py} | 78 +- workspace/src/osc_ros2/setup.py | 2 +- 53 files changed, 2629 insertions(+), 117 deletions(-) create mode 100644 test/osc_command_recording.py create mode 100644 test/ros2_ws/log/build_2025-05-08_20-38-18/events.log create mode 100644 test/ros2_ws/log/build_2025-05-08_20-38-18/logger_all.log create mode 120000 workspace/build/joint_control/setup.py create mode 100755 workspace/install/joint_control/lib/joint_control/sandbox create mode 100644 workspace/install/joint_control/lib/python3.10/site-packages/joint-control.egg-link create mode 100644 workspace/log/build_2025-05-08_15-47-35/events.log create mode 100644 workspace/log/build_2025-05-08_15-47-35/logger_all.log create mode 100644 workspace/log/build_2025-05-08_15-47-35/osc_ros2/command.log create mode 100644 workspace/log/build_2025-05-08_15-47-35/osc_ros2/stderr.log create mode 100644 workspace/log/build_2025-05-08_15-47-35/osc_ros2/stdout.log create mode 100644 workspace/log/build_2025-05-08_15-47-35/osc_ros2/stdout_stderr.log create mode 100644 workspace/log/build_2025-05-08_15-47-35/osc_ros2/streams.log create mode 100644 workspace/log/build_2025-05-08_20-39-10/events.log create mode 100644 workspace/log/build_2025-05-08_20-39-10/joint_control/command.log create mode 100644 workspace/log/build_2025-05-08_20-39-10/joint_control/stderr.log create mode 100644 workspace/log/build_2025-05-08_20-39-10/joint_control/stdout.log create mode 100644 workspace/log/build_2025-05-08_20-39-10/joint_control/stdout_stderr.log create mode 100644 workspace/log/build_2025-05-08_20-39-10/joint_control/streams.log create mode 100644 workspace/log/build_2025-05-08_20-39-10/logger_all.log create mode 100644 workspace/src/osc_ros2/osc_ros2/osc_ros2_latency.py create mode 100644 workspace/src/osc_ros2/osc_ros2/osc_ros2_osc_record.py rename workspace/src/osc_ros2/osc_ros2/{osc_ros2_unit_quater.py => osc_ros2_rpy.py} (94%) diff --git a/.DS_Store b/.DS_Store index 41ef4ff7a316454d9c7b2dd28d3ddf9070f35534..38f320ae5dc310937393887ac4523dadcfa54fba 100644 GIT binary patch delta 132 zcmZp1XmOa}&nUbxU^hRb@Ma!?Cyb5~4EYSj49N`f3`Gp7KspmhmH}}*Lmp5jo*{{$ zlpzfWQ-Sh&32Hwr=94s8dAQhqv$qe}n zxj+b3H91Z|d$PHJ052y)IzuW$2~bZaL&4;Y!lI1bn=J%P8O0@l%8P-T;?XoF2x!zZ z{sfw+_a6*^ECvQ{xZ)fjE1f|PsHvEt%rhrHIVmSU38(_-Jcji^hiW0|VuR}{XDCKh z%P5OS?dD2BLq-ua4L~O`YAv21#Hh^9Py{wO9%4M2x^9rV$)|)2Ij#hdA delta 104 zcmZp1XmOa}FUrHfz`)4BAi%(o$xsZ$`3!jsdK(L;u}^H^-OSFx!XXY)!NZUYl*s`? wxT?t}0;-$41=JWPn+x%7E)X(coP19B+2lte(>JU0JYe3;F7cgZV list: + """ + Generate symmetric timestamps with increasing → decreasing → flat → increasing spacing pattern. + + Args: + total_duration (float): The total duration (last timestamp). + num_points (int): Total number of timestamps (must be >= 3). + flat_ratio (float): Fraction of timestamps in the constant-spacing center (0.0–0.9). + + Returns: + List[float]: List of timestamps from 0 to total_duration. + """ + n = int(num_points*(1-flat_ratio)/2) + start = np.cos(np.linspace(0, np.pi, n))+2 + end = np.cos(np.linspace(-np.pi, 0, n))+2 + flat = np.ones(num_points-2*n) + + timestamps = np.concatenate((start, flat, end)) + timestamps *= total_duration / timestamps.sum() + timestamps = np.cumsum(timestamps) + + return timestamps.tolist() + + + +a = symmetric_timestamps(7.5, 30, 0.7) + +for i in range(len(a)-1): + print(f"{a[i]:.2f} - {a[i+1]:.2f} = {a[i+1]-a[i]}") \ No newline at end of file diff --git a/test/ros2_ws/install/local_setup.sh b/test/ros2_ws/install/local_setup.sh index 07a0147..6c1e3f4 100644 --- a/test/ros2_ws/install/local_setup.sh +++ b/test/ros2_ws/install/local_setup.sh @@ -6,7 +6,7 @@ # since a plain shell script can't determine its own path when being sourced # either use the provided COLCON_CURRENT_PREFIX # or fall back to the build time prefix (if it exists) -_colcon_prefix_sh_COLCON_CURRENT_PREFIX="/BA/ros2_ws/install" +_colcon_prefix_sh_COLCON_CURRENT_PREFIX="/BA/test/ros2_ws/install" if [ -z "$COLCON_CURRENT_PREFIX" ]; then if [ ! -d "$_colcon_prefix_sh_COLCON_CURRENT_PREFIX" ]; then echo "The build time path \"$_colcon_prefix_sh_COLCON_CURRENT_PREFIX\" doesn't exist. Either source a script for a different shell or set the environment variable \"COLCON_CURRENT_PREFIX\" explicitly." 1>&2 diff --git a/test/ros2_ws/install/setup.bash b/test/ros2_ws/install/setup.bash index 4e927c6..5b5cc3b 100644 --- a/test/ros2_ws/install/setup.bash +++ b/test/ros2_ws/install/setup.bash @@ -17,6 +17,14 @@ _colcon_prefix_chain_bash_source_script() { fi } +# source chained prefixes +# setting COLCON_CURRENT_PREFIX avoids determining the prefix in the sourced script +COLCON_CURRENT_PREFIX="/opt/ros/humble" +_colcon_prefix_chain_bash_source_script "$COLCON_CURRENT_PREFIX/local_setup.bash" +# setting COLCON_CURRENT_PREFIX avoids determining the prefix in the sourced script +COLCON_CURRENT_PREFIX="/BA/workspace/install" +_colcon_prefix_chain_bash_source_script "$COLCON_CURRENT_PREFIX/local_setup.bash" + # source this prefix # setting COLCON_CURRENT_PREFIX avoids determining the prefix in the sourced script COLCON_CURRENT_PREFIX="$(builtin cd "`dirname "${BASH_SOURCE[0]}"`" > /dev/null && pwd)" diff --git a/test/ros2_ws/install/setup.ps1 b/test/ros2_ws/install/setup.ps1 index fe4e838..ee44c60 100644 --- a/test/ros2_ws/install/setup.ps1 +++ b/test/ros2_ws/install/setup.ps1 @@ -21,6 +21,10 @@ function _colcon_prefix_chain_powershell_source_script { } } +# source chained prefixes +_colcon_prefix_chain_powershell_source_script "/opt/ros/humble\local_setup.ps1" +_colcon_prefix_chain_powershell_source_script "/BA/workspace/install\local_setup.ps1" + # source this prefix $env:COLCON_CURRENT_PREFIX=(Split-Path $PSCommandPath -Parent) _colcon_prefix_chain_powershell_source_script "$env:COLCON_CURRENT_PREFIX\local_setup.ps1" diff --git a/test/ros2_ws/install/setup.sh b/test/ros2_ws/install/setup.sh index b77c122..c2e50c2 100644 --- a/test/ros2_ws/install/setup.sh +++ b/test/ros2_ws/install/setup.sh @@ -7,7 +7,7 @@ # since a plain shell script can't determine its own path when being sourced # either use the provided COLCON_CURRENT_PREFIX # or fall back to the build time prefix (if it exists) -_colcon_prefix_chain_sh_COLCON_CURRENT_PREFIX=/BA/ros2_ws/install +_colcon_prefix_chain_sh_COLCON_CURRENT_PREFIX=/BA/test/ros2_ws/install if [ ! -z "$COLCON_CURRENT_PREFIX" ]; then _colcon_prefix_chain_sh_COLCON_CURRENT_PREFIX="$COLCON_CURRENT_PREFIX" elif [ ! -d "$_colcon_prefix_chain_sh_COLCON_CURRENT_PREFIX" ]; then @@ -29,6 +29,16 @@ _colcon_prefix_chain_sh_source_script() { fi } +# source chained prefixes +# setting COLCON_CURRENT_PREFIX avoids relying on the build time prefix of the sourced script +COLCON_CURRENT_PREFIX="/opt/ros/humble" +_colcon_prefix_chain_sh_source_script "$COLCON_CURRENT_PREFIX/local_setup.sh" + +# setting COLCON_CURRENT_PREFIX avoids relying on the build time prefix of the sourced script +COLCON_CURRENT_PREFIX="/BA/workspace/install" +_colcon_prefix_chain_sh_source_script "$COLCON_CURRENT_PREFIX/local_setup.sh" + + # source this prefix # setting COLCON_CURRENT_PREFIX avoids relying on the build time prefix of the sourced script COLCON_CURRENT_PREFIX="$_colcon_prefix_chain_sh_COLCON_CURRENT_PREFIX" diff --git a/test/ros2_ws/install/setup.zsh b/test/ros2_ws/install/setup.zsh index 2901efe..c5d6c8b 100644 --- a/test/ros2_ws/install/setup.zsh +++ b/test/ros2_ws/install/setup.zsh @@ -17,6 +17,14 @@ _colcon_prefix_chain_zsh_source_script() { fi } +# source chained prefixes +# setting COLCON_CURRENT_PREFIX avoids determining the prefix in the sourced script +COLCON_CURRENT_PREFIX="/opt/ros/humble" +_colcon_prefix_chain_zsh_source_script "$COLCON_CURRENT_PREFIX/local_setup.zsh" +# setting COLCON_CURRENT_PREFIX avoids determining the prefix in the sourced script +COLCON_CURRENT_PREFIX="/BA/workspace/install" +_colcon_prefix_chain_zsh_source_script "$COLCON_CURRENT_PREFIX/local_setup.zsh" + # source this prefix # setting COLCON_CURRENT_PREFIX avoids determining the prefix in the sourced script COLCON_CURRENT_PREFIX="$(builtin cd -q "`dirname "${(%):-%N}"`" > /dev/null && pwd)" diff --git a/test/ros2_ws/log/build_2025-05-08_20-38-18/events.log b/test/ros2_ws/log/build_2025-05-08_20-38-18/events.log new file mode 100644 index 0000000..1a0aecd --- /dev/null +++ b/test/ros2_ws/log/build_2025-05-08_20-38-18/events.log @@ -0,0 +1,7 @@ +[0.000000] (-) TimerEvent: {} +[0.000622] (-) JobUnselected: {'identifier': 'more_interfaces'} +[0.000830] (-) JobUnselected: {'identifier': 'py_pubsub'} +[0.000965] (-) JobUnselected: {'identifier': 'py_srvcli'} +[0.001070] (-) JobUnselected: {'identifier': 'python_parameters'} +[0.001108] (-) JobUnselected: {'identifier': 'tutorial_interfaces'} +[0.001146] (-) EventReactorShutdown: {} diff --git a/test/ros2_ws/log/build_2025-05-08_20-38-18/logger_all.log b/test/ros2_ws/log/build_2025-05-08_20-38-18/logger_all.log new file mode 100644 index 0000000..de56582 --- /dev/null +++ b/test/ros2_ws/log/build_2025-05-08_20-38-18/logger_all.log @@ -0,0 +1,160 @@ +[0.113s] DEBUG:colcon:Command line arguments: ['/usr/bin/colcon', 'build', '--packages-select', 'joint_control', '--symlink-install'] +[0.114s] DEBUG:colcon:Parsed command line arguments: Namespace(log_base=None, log_level=None, verb_name='build', build_base='build', install_base='install', merge_install=False, symlink_install=True, test_result_base=None, continue_on_error=False, executor='parallel', parallel_workers=8, event_handlers=None, ignore_user_meta=False, metas=['./colcon.meta'], base_paths=['.'], packages_ignore=None, packages_ignore_regex=None, paths=None, packages_up_to=None, packages_up_to_regex=None, packages_above=None, packages_above_and_dependencies=None, packages_above_depth=None, packages_select_by_dep=None, packages_skip_by_dep=None, packages_skip_up_to=None, packages_select_build_failed=False, packages_skip_build_finished=False, packages_select_test_failures=False, packages_skip_test_passed=False, packages_select=['joint_control'], packages_skip=None, packages_select_regex=None, packages_skip_regex=None, packages_start=None, packages_end=None, cmake_args=None, cmake_target=None, cmake_target_skip_unavailable=False, cmake_clean_cache=False, cmake_clean_first=False, cmake_force_configure=False, ament_cmake_args=None, catkin_cmake_args=None, catkin_skip_building_tests=False, mixin_files=None, mixin=None, verb_parser=, verb_extension=, main=>, mixin_verb=('build',)) +[0.255s] Level 1:colcon.colcon_core.package_discovery:discover_packages(colcon_meta) check parameters +[0.256s] INFO:colcon.colcon_metadata.package_discovery.colcon_meta:Using configuration from '/root/.colcon/metadata/default/Gazebo.meta' +[0.256s] INFO:colcon.colcon_metadata.package_discovery.colcon_meta:Using configuration from '/root/.colcon/metadata/default/fastrtps.meta' +[0.256s] Level 1:colcon.colcon_core.package_discovery:discover_packages(recursive) check parameters +[0.256s] Level 1:colcon.colcon_core.package_discovery:discover_packages(ignore) check parameters +[0.256s] Level 1:colcon.colcon_core.package_discovery:discover_packages(path) check parameters +[0.256s] Level 1:colcon.colcon_core.package_discovery:discover_packages(colcon_meta) discover +[0.256s] Level 1:colcon.colcon_core.package_discovery:discover_packages(recursive) discover +[0.257s] INFO:colcon.colcon_core.package_discovery:Crawling recursively for packages in '/BA/test/ros2_ws' +[0.257s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['ignore', 'ignore_ament_install'] +[0.257s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'ignore' +[0.257s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'ignore_ament_install' +[0.257s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['colcon_pkg'] +[0.257s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'colcon_pkg' +[0.258s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['colcon_meta'] +[0.258s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'colcon_meta' +[0.258s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['ros'] +[0.258s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'ros' +[0.267s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['cmake', 'python'] +[0.267s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'cmake' +[0.267s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'python' +[0.267s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['python_setup_py'] +[0.267s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'python_setup_py' +[0.267s] Level 1:colcon.colcon_core.package_identification:_identify(build) by extensions ['ignore', 'ignore_ament_install'] +[0.268s] Level 1:colcon.colcon_core.package_identification:_identify(build) by extension 'ignore' +[0.268s] Level 1:colcon.colcon_core.package_identification:_identify(build) ignored +[0.270s] Level 1:colcon.colcon_core.package_identification:_identify(install) by extensions ['ignore', 'ignore_ament_install'] +[0.270s] Level 1:colcon.colcon_core.package_identification:_identify(install) by extension 'ignore' +[0.270s] Level 1:colcon.colcon_core.package_identification:_identify(install) ignored +[0.271s] Level 1:colcon.colcon_core.package_identification:_identify(log) by extensions ['ignore', 'ignore_ament_install'] +[0.271s] Level 1:colcon.colcon_core.package_identification:_identify(log) by extension 'ignore' +[0.271s] Level 1:colcon.colcon_core.package_identification:_identify(log) ignored +[0.271s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['ignore', 'ignore_ament_install'] +[0.271s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'ignore' +[0.271s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'ignore_ament_install' +[0.272s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['colcon_pkg'] +[0.272s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'colcon_pkg' +[0.272s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['colcon_meta'] +[0.272s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'colcon_meta' +[0.272s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['ros'] +[0.272s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'ros' +[0.272s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['cmake', 'python'] +[0.272s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'cmake' +[0.272s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'python' +[0.272s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['python_setup_py'] +[0.272s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'python_setup_py' +[0.274s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control) by extensions ['ignore', 'ignore_ament_install'] +[0.274s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control) by extension 'ignore' +[0.274s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control) by extension 'ignore_ament_install' +[0.274s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control) by extensions ['colcon_pkg'] +[0.274s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control) by extension 'colcon_pkg' +[0.275s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control) by extensions ['colcon_meta'] +[0.275s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control) by extension 'colcon_meta' +[0.275s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control) by extensions ['ros'] +[0.275s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control) by extension 'ros' +[0.275s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control) by extensions ['cmake', 'python'] +[0.275s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control) by extension 'cmake' +[0.275s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control) by extension 'python' +[0.275s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control) by extensions ['python_setup_py'] +[0.275s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control) by extension 'python_setup_py' +[0.276s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control/__pycache__) by extensions ['ignore', 'ignore_ament_install'] +[0.276s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control/__pycache__) by extension 'ignore' +[0.276s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control/__pycache__) by extension 'ignore_ament_install' +[0.276s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control/__pycache__) by extensions ['colcon_pkg'] +[0.276s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control/__pycache__) by extension 'colcon_pkg' +[0.276s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control/__pycache__) by extensions ['colcon_meta'] +[0.276s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control/__pycache__) by extension 'colcon_meta' +[0.276s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control/__pycache__) by extensions ['ros'] +[0.276s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control/__pycache__) by extension 'ros' +[0.276s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control/__pycache__) by extensions ['cmake', 'python'] +[0.276s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control/__pycache__) by extension 'cmake' +[0.277s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control/__pycache__) by extension 'python' +[0.277s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control/__pycache__) by extensions ['python_setup_py'] +[0.277s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_states_control/__pycache__) by extension 'python_setup_py' +[0.277s] Level 1:colcon.colcon_core.package_identification:_identify(src/more_interfaces) by extensions ['ignore', 'ignore_ament_install'] +[0.277s] Level 1:colcon.colcon_core.package_identification:_identify(src/more_interfaces) by extension 'ignore' +[0.277s] Level 1:colcon.colcon_core.package_identification:_identify(src/more_interfaces) by extension 'ignore_ament_install' +[0.277s] Level 1:colcon.colcon_core.package_identification:_identify(src/more_interfaces) by extensions ['colcon_pkg'] +[0.277s] Level 1:colcon.colcon_core.package_identification:_identify(src/more_interfaces) by extension 'colcon_pkg' +[0.277s] Level 1:colcon.colcon_core.package_identification:_identify(src/more_interfaces) by extensions ['colcon_meta'] +[0.278s] Level 1:colcon.colcon_core.package_identification:_identify(src/more_interfaces) by extension 'colcon_meta' +[0.278s] Level 1:colcon.colcon_core.package_identification:_identify(src/more_interfaces) by extensions ['ros'] +[0.278s] Level 1:colcon.colcon_core.package_identification:_identify(src/more_interfaces) by extension 'ros' +[0.283s] DEBUG:colcon.colcon_core.package_identification:Package 'src/more_interfaces' with type 'ros.ament_cmake' and name 'more_interfaces' +[0.284s] Level 1:colcon.colcon_core.package_identification:_identify(src/py_pubsub) by extensions ['ignore', 'ignore_ament_install'] +[0.284s] Level 1:colcon.colcon_core.package_identification:_identify(src/py_pubsub) by extension 'ignore' +[0.284s] Level 1:colcon.colcon_core.package_identification:_identify(src/py_pubsub) by extension 'ignore_ament_install' +[0.284s] Level 1:colcon.colcon_core.package_identification:_identify(src/py_pubsub) by extensions ['colcon_pkg'] +[0.284s] Level 1:colcon.colcon_core.package_identification:_identify(src/py_pubsub) by extension 'colcon_pkg' +[0.284s] Level 1:colcon.colcon_core.package_identification:_identify(src/py_pubsub) by extensions ['colcon_meta'] +[0.284s] Level 1:colcon.colcon_core.package_identification:_identify(src/py_pubsub) by extension 'colcon_meta' +[0.284s] Level 1:colcon.colcon_core.package_identification:_identify(src/py_pubsub) by extensions ['ros'] +[0.284s] Level 1:colcon.colcon_core.package_identification:_identify(src/py_pubsub) by extension 'ros' +[0.285s] DEBUG:colcon.colcon_core.package_identification:Package 'src/py_pubsub' with type 'ros.ament_python' and name 'py_pubsub' +[0.285s] Level 1:colcon.colcon_core.package_identification:_identify(src/py_srvcli) by extensions ['ignore', 'ignore_ament_install'] +[0.286s] Level 1:colcon.colcon_core.package_identification:_identify(src/py_srvcli) by extension 'ignore' +[0.286s] Level 1:colcon.colcon_core.package_identification:_identify(src/py_srvcli) by extension 'ignore_ament_install' +[0.286s] Level 1:colcon.colcon_core.package_identification:_identify(src/py_srvcli) by extensions ['colcon_pkg'] +[0.286s] Level 1:colcon.colcon_core.package_identification:_identify(src/py_srvcli) by extension 'colcon_pkg' +[0.286s] Level 1:colcon.colcon_core.package_identification:_identify(src/py_srvcli) by extensions ['colcon_meta'] +[0.286s] Level 1:colcon.colcon_core.package_identification:_identify(src/py_srvcli) by extension 'colcon_meta' +[0.286s] Level 1:colcon.colcon_core.package_identification:_identify(src/py_srvcli) by extensions ['ros'] +[0.286s] Level 1:colcon.colcon_core.package_identification:_identify(src/py_srvcli) by extension 'ros' +[0.287s] DEBUG:colcon.colcon_core.package_identification:Package 'src/py_srvcli' with type 'ros.ament_python' and name 'py_srvcli' +[0.288s] Level 1:colcon.colcon_core.package_identification:_identify(src/python_parameters) by extensions ['ignore', 'ignore_ament_install'] +[0.288s] Level 1:colcon.colcon_core.package_identification:_identify(src/python_parameters) by extension 'ignore' +[0.288s] Level 1:colcon.colcon_core.package_identification:_identify(src/python_parameters) by extension 'ignore_ament_install' +[0.288s] Level 1:colcon.colcon_core.package_identification:_identify(src/python_parameters) by extensions ['colcon_pkg'] +[0.288s] Level 1:colcon.colcon_core.package_identification:_identify(src/python_parameters) by extension 'colcon_pkg' +[0.288s] Level 1:colcon.colcon_core.package_identification:_identify(src/python_parameters) by extensions ['colcon_meta'] +[0.288s] Level 1:colcon.colcon_core.package_identification:_identify(src/python_parameters) by extension 'colcon_meta' +[0.288s] Level 1:colcon.colcon_core.package_identification:_identify(src/python_parameters) by extensions ['ros'] +[0.289s] Level 1:colcon.colcon_core.package_identification:_identify(src/python_parameters) by extension 'ros' +[0.289s] DEBUG:colcon.colcon_core.package_identification:Package 'src/python_parameters' with type 'ros.ament_python' and name 'python_parameters' +[0.290s] Level 1:colcon.colcon_core.package_identification:_identify(src/tutorial_interfaces) by extensions ['ignore', 'ignore_ament_install'] +[0.290s] Level 1:colcon.colcon_core.package_identification:_identify(src/tutorial_interfaces) by extension 'ignore' +[0.290s] Level 1:colcon.colcon_core.package_identification:_identify(src/tutorial_interfaces) by extension 'ignore_ament_install' +[0.290s] Level 1:colcon.colcon_core.package_identification:_identify(src/tutorial_interfaces) by extensions ['colcon_pkg'] +[0.290s] Level 1:colcon.colcon_core.package_identification:_identify(src/tutorial_interfaces) by extension 'colcon_pkg' +[0.290s] Level 1:colcon.colcon_core.package_identification:_identify(src/tutorial_interfaces) by extensions ['colcon_meta'] +[0.290s] Level 1:colcon.colcon_core.package_identification:_identify(src/tutorial_interfaces) by extension 'colcon_meta' +[0.290s] Level 1:colcon.colcon_core.package_identification:_identify(src/tutorial_interfaces) by extensions ['ros'] +[0.290s] Level 1:colcon.colcon_core.package_identification:_identify(src/tutorial_interfaces) by extension 'ros' +[0.291s] DEBUG:colcon.colcon_core.package_identification:Package 'src/tutorial_interfaces' with type 'ros.ament_cmake' and name 'tutorial_interfaces' +[0.291s] Level 1:colcon.colcon_core.package_discovery:discover_packages(recursive) using defaults +[0.291s] Level 1:colcon.colcon_core.package_discovery:discover_packages(ignore) discover +[0.291s] Level 1:colcon.colcon_core.package_discovery:discover_packages(ignore) using defaults +[0.291s] Level 1:colcon.colcon_core.package_discovery:discover_packages(path) discover +[0.291s] Level 1:colcon.colcon_core.package_discovery:discover_packages(path) using defaults +[0.292s] WARNING:colcon.colcon_core.package_selection:ignoring unknown package 'joint_control' in --packages-select +[0.311s] INFO:colcon.colcon_core.package_selection:Skipping not selected package 'more_interfaces' in 'src/more_interfaces' +[0.311s] INFO:colcon.colcon_core.package_selection:Skipping not selected package 'python_parameters' in 'src/python_parameters' +[0.311s] INFO:colcon.colcon_core.package_selection:Skipping not selected package 'tutorial_interfaces' in 'src/tutorial_interfaces' +[0.311s] INFO:colcon.colcon_core.package_selection:Skipping not selected package 'py_pubsub' in 'src/py_pubsub' +[0.311s] INFO:colcon.colcon_core.package_selection:Skipping not selected package 'py_srvcli' in 'src/py_srvcli' +[0.311s] INFO:colcon.colcon_core.executor:Executing jobs using 'parallel' executor +[0.314s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:run_until_complete +[0.315s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:closing loop +[0.315s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:loop closed +[0.315s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:run_until_complete finished with '0' +[0.316s] DEBUG:colcon.colcon_core.event_reactor:joining thread +[0.323s] INFO:colcon.colcon_core.plugin_system:Skipping extension 'colcon_notification.desktop_notification.notify_send': Could not find 'notify-send' +[0.323s] INFO:colcon.colcon_core.plugin_system:Skipping extension 'colcon_notification.desktop_notification.terminal_notifier': Not used on non-Darwin systems +[0.323s] INFO:colcon.colcon_core.plugin_system:Skipping extension 'colcon_notification.desktop_notification.win32': Not used on non-Windows systems +[0.323s] INFO:colcon.colcon_notification.desktop_notification:Sending desktop notification using 'notify2' +[0.325s] DEBUG:colcon.colcon_notification.desktop_notification.notify2:Failed to initialize notify2: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11 +[0.325s] DEBUG:colcon.colcon_core.event_reactor:joined thread +[0.327s] INFO:colcon.colcon_core.plugin_system:Skipping extension 'colcon_core.shell.bat': Not used on non-Windows systems +[0.327s] INFO:colcon.colcon_core.shell:Creating prefix script '/BA/test/ros2_ws/install/local_setup.ps1' +[0.329s] INFO:colcon.colcon_core.shell:Creating prefix util module '/BA/test/ros2_ws/install/_local_setup_util_ps1.py' +[0.331s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/BA/test/ros2_ws/install/setup.ps1' +[0.340s] INFO:colcon.colcon_core.shell:Creating prefix script '/BA/test/ros2_ws/install/local_setup.sh' +[0.341s] INFO:colcon.colcon_core.shell:Creating prefix util module '/BA/test/ros2_ws/install/_local_setup_util_sh.py' +[0.342s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/BA/test/ros2_ws/install/setup.sh' +[0.344s] INFO:colcon.colcon_core.shell:Creating prefix script '/BA/test/ros2_ws/install/local_setup.bash' +[0.345s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/BA/test/ros2_ws/install/setup.bash' +[0.347s] INFO:colcon.colcon_core.shell:Creating prefix script '/BA/test/ros2_ws/install/local_setup.zsh' +[0.347s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/BA/test/ros2_ws/install/setup.zsh' diff --git a/test/ros2_ws/log/latest_build b/test/ros2_ws/log/latest_build index 6d48b87..1a822b5 120000 --- a/test/ros2_ws/log/latest_build +++ b/test/ros2_ws/log/latest_build @@ -1 +1 @@ -build_2025-03-27_14-22-13 \ No newline at end of file +build_2025-05-08_20-38-18 \ No newline at end of file diff --git a/workspace/build/joint_control/colcon_build.rc b/workspace/build/joint_control/colcon_build.rc index d00491f..573541a 100644 --- a/workspace/build/joint_control/colcon_build.rc +++ b/workspace/build/joint_control/colcon_build.rc @@ -1 +1 @@ -1 +0 diff --git a/workspace/build/joint_control/colcon_command_prefix_setup_py.sh.env b/workspace/build/joint_control/colcon_command_prefix_setup_py.sh.env index 7d3e525..214cdff 100644 --- a/workspace/build/joint_control/colcon_command_prefix_setup_py.sh.env +++ b/workspace/build/joint_control/colcon_command_prefix_setup_py.sh.env @@ -1,4 +1,4 @@ -AMENT_PREFIX_PATH=/BA/workspace/install/painting_robot_control:/BA/workspace/install/mock_robot:/BA/workspace/install/joint_info:/BA/workspace/install/joint_control:/opt/ros/humble +AMENT_PREFIX_PATH=/BA/workspace/install/painting_robot_control:/BA/workspace/install/osc_ros2:/BA/workspace/install/mock_robot:/BA/workspace/install/joint_info:/BA/workspace/install/joint_control:/opt/ros/humble COLCON=1 COLCON_PREFIX_PATH=/BA/workspace/install HOME=/root @@ -7,10 +7,10 @@ LANG=C.UTF-8 LC_ALL=C.UTF-8 LD_LIBRARY_PATH=/opt/ros/humble/opt/rviz_ogre_vendor/lib:/opt/ros/humble/lib/x86_64-linux-gnu:/opt/ros/humble/lib LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36: -OLDPWD=/BA +OLDPWD=/BA/workspace/src PATH=/opt/ros/humble/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PWD=/BA/workspace/build/joint_control -PYTHONPATH=/BA/workspace/build/painting_robot_control:/BA/workspace/install/painting_robot_control/lib/python3.10/site-packages:/BA/workspace/build/mock_robot:/BA/workspace/install/mock_robot/lib/python3.10/site-packages:/BA/workspace/build/joint_info:/BA/workspace/install/joint_info/lib/python3.10/site-packages:/BA/workspace/build/joint_control:/BA/workspace/install/joint_control/lib/python3.10/site-packages:/opt/ros/humble/lib/python3.10/site-packages:/opt/ros/humble/local/lib/python3.10/dist-packages +PYTHONPATH=/BA/workspace/build/painting_robot_control:/BA/workspace/install/painting_robot_control/lib/python3.10/site-packages:/BA/workspace/build/osc_ros2:/BA/workspace/install/osc_ros2/lib/python3.10/site-packages:/BA/workspace/build/mock_robot:/BA/workspace/install/mock_robot/lib/python3.10/site-packages:/BA/workspace/build/joint_info:/BA/workspace/install/joint_info/lib/python3.10/site-packages:/BA/workspace/build/joint_control:/BA/workspace/install/joint_control/lib/python3.10/site-packages:/opt/ros/humble/lib/python3.10/site-packages:/opt/ros/humble/local/lib/python3.10/dist-packages ROS_DISTRO=humble ROS_LOCALHOST_ONLY=0 ROS_PYTHON_VERSION=3 diff --git a/workspace/build/joint_control/joint_control b/workspace/build/joint_control/joint_control index 5748b82..b240854 120000 --- a/workspace/build/joint_control/joint_control +++ b/workspace/build/joint_control/joint_control @@ -1 +1 @@ -/ws/src/ba-alexanderschaefer/workspace/src/joint_control/joint_control \ No newline at end of file +/BA/workspace/src/joint_control/joint_control \ No newline at end of file diff --git a/workspace/build/joint_control/joint_control.egg-info/SOURCES.txt b/workspace/build/joint_control/joint_control.egg-info/SOURCES.txt index 6ae0de3..bc49534 100644 --- a/workspace/build/joint_control/joint_control.egg-info/SOURCES.txt +++ b/workspace/build/joint_control/joint_control.egg-info/SOURCES.txt @@ -25,7 +25,11 @@ joint_control/trajectory_server_cart_fast_smooth.py joint_control/trajectory_server_new.py joint_control/trajectory_server_new_cart.py joint_control/trajectory_server_trapezoidal.py -resource/joint_control -test/test_copyright.py -test/test_flake8.py -test/test_pep257.py \ No newline at end of file +joint_control.egg-info/PKG-INFO +joint_control.egg-info/SOURCES.txt +joint_control.egg-info/dependency_links.txt +joint_control.egg-info/entry_points.txt +joint_control.egg-info/requires.txt +joint_control.egg-info/top_level.txt +joint_control.egg-info/zip-safe +resource/joint_control \ No newline at end of file diff --git a/workspace/build/joint_control/package.xml b/workspace/build/joint_control/package.xml index cb45fa7..d969f86 120000 --- a/workspace/build/joint_control/package.xml +++ b/workspace/build/joint_control/package.xml @@ -1 +1 @@ -/ws/src/ba-alexanderschaefer/workspace/src/joint_control/package.xml \ No newline at end of file +/BA/workspace/src/joint_control/package.xml \ No newline at end of file diff --git a/workspace/build/joint_control/prefix_override/__pycache__/sitecustomize.cpython-310.pyc b/workspace/build/joint_control/prefix_override/__pycache__/sitecustomize.cpython-310.pyc index 381608acb2a881c954c2fba2bdc9cfffd2c72cf3..113faf9cab7ffae6618d38ac97e4ece7ef827cbe 100644 GIT binary patch delta 20 acmZ3=w3LZEpO=@50SNNNWH)k4F#-T78Utnk delta 20 acmZ3=w3LZEpO=@50SMAHg*I|aF#-T79Rp?n diff --git a/workspace/build/joint_control/resource/joint_control b/workspace/build/joint_control/resource/joint_control index 266b549..6d69895 120000 --- a/workspace/build/joint_control/resource/joint_control +++ b/workspace/build/joint_control/resource/joint_control @@ -1 +1 @@ -/ws/src/ba-alexanderschaefer/workspace/src/joint_control/resource/joint_control \ No newline at end of file +/BA/workspace/src/joint_control/resource/joint_control \ No newline at end of file diff --git a/workspace/build/joint_control/setup.cfg b/workspace/build/joint_control/setup.cfg index 21539b8..02d5e38 120000 --- a/workspace/build/joint_control/setup.cfg +++ b/workspace/build/joint_control/setup.cfg @@ -1 +1 @@ -/ws/src/ba-alexanderschaefer/workspace/src/joint_control/setup.cfg \ No newline at end of file +/BA/workspace/src/joint_control/setup.cfg \ No newline at end of file diff --git a/workspace/build/joint_control/setup.py b/workspace/build/joint_control/setup.py new file mode 120000 index 0000000..a85566e --- /dev/null +++ b/workspace/build/joint_control/setup.py @@ -0,0 +1 @@ +/BA/workspace/src/joint_control/setup.py \ No newline at end of file diff --git a/workspace/build/osc_ros2/osc_ros2.egg-info/SOURCES.txt b/workspace/build/osc_ros2/osc_ros2.egg-info/SOURCES.txt index d1bd27f..aad1a98 100644 --- a/workspace/build/osc_ros2/osc_ros2.egg-info/SOURCES.txt +++ b/workspace/build/osc_ros2/osc_ros2.egg-info/SOURCES.txt @@ -3,7 +3,7 @@ setup.cfg setup.py osc_ros2/__init__.py osc_ros2/osc_ros2.py -osc_ros2/osc_ros2_unit_quater.py +osc_ros2/osc_ros2_rpy.py osc_ros2.egg-info/PKG-INFO osc_ros2.egg-info/SOURCES.txt osc_ros2.egg-info/dependency_links.txt diff --git a/workspace/build/osc_ros2/osc_ros2.egg-info/entry_points.txt b/workspace/build/osc_ros2/osc_ros2.egg-info/entry_points.txt index e07b640..5571dad 100644 --- a/workspace/build/osc_ros2/osc_ros2.egg-info/entry_points.txt +++ b/workspace/build/osc_ros2/osc_ros2.egg-info/entry_points.txt @@ -1,4 +1,4 @@ [console_scripts] interface = osc_ros2.osc_ros2:main -interface1 = osc_ros2.osc_ros2_unit_quater:main +interface1 = osc_ros2.osc_ros2_rpy:main diff --git a/workspace/build/osc_ros2/prefix_override/__pycache__/sitecustomize.cpython-310.pyc b/workspace/build/osc_ros2/prefix_override/__pycache__/sitecustomize.cpython-310.pyc index 09a7b7f206b548d123328e720b29c257b01432f1..cf6fdef1a14d2a84c2f5cae1943128bd1e294160 100644 GIT binary patch delta 19 ZcmbQuG@FSlpO=@50SLq|ZR8SU1OO%{1C9Uy delta 19 ZcmbQuG@FSlpO=@50SG2e+{h)!2mmL(1IGXW diff --git a/workspace/install/joint_control/lib/joint_control/sandbox b/workspace/install/joint_control/lib/joint_control/sandbox new file mode 100755 index 0000000..5e51b33 --- /dev/null +++ b/workspace/install/joint_control/lib/joint_control/sandbox @@ -0,0 +1,33 @@ +#!/usr/bin/python3 +# EASY-INSTALL-ENTRY-SCRIPT: 'joint-control','console_scripts','sandbox' +import re +import sys + +# for compatibility with easy_install; see #2198 +__requires__ = 'joint-control' + +try: + from importlib.metadata import distribution +except ImportError: + try: + from importlib_metadata import distribution + except ImportError: + from pkg_resources import load_entry_point + + +def importlib_load_entry_point(spec, group, name): + dist_name, _, _ = spec.partition('==') + matches = ( + entry_point + for entry_point in distribution(dist_name).entry_points + if entry_point.group == group and entry_point.name == name + ) + return next(matches).load() + + +globals().setdefault('load_entry_point', importlib_load_entry_point) + + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(load_entry_point('joint-control', 'console_scripts', 'sandbox')()) diff --git a/workspace/install/joint_control/lib/python3.10/site-packages/joint-control.egg-link b/workspace/install/joint_control/lib/python3.10/site-packages/joint-control.egg-link new file mode 100644 index 0000000..a7aebe1 --- /dev/null +++ b/workspace/install/joint_control/lib/python3.10/site-packages/joint-control.egg-link @@ -0,0 +1,2 @@ +/BA/workspace/build/joint_control +. \ No newline at end of file diff --git a/workspace/log/build_2025-05-08_15-47-35/events.log b/workspace/log/build_2025-05-08_15-47-35/events.log new file mode 100644 index 0000000..5fec7b0 --- /dev/null +++ b/workspace/log/build_2025-05-08_15-47-35/events.log @@ -0,0 +1,38 @@ +[0.000000] (-) TimerEvent: {} +[0.002486] (-) JobUnselected: {'identifier': 'joint_control'} +[0.002732] (-) JobUnselected: {'identifier': 'joint_info'} +[0.003448] (-) JobUnselected: {'identifier': 'mock_robot'} +[0.003512] (-) JobUnselected: {'identifier': 'painting_robot_control'} +[0.003556] (osc_ros2) JobQueued: {'identifier': 'osc_ros2', 'dependencies': OrderedDict()} +[0.003627] (osc_ros2) JobStarted: {'identifier': 'osc_ros2'} +[0.098230] (-) TimerEvent: {} +[0.200156] (-) TimerEvent: {} +[0.301233] (-) TimerEvent: {} +[0.403399] (-) TimerEvent: {} +[0.505383] (-) TimerEvent: {} +[0.610326] (-) TimerEvent: {} +[0.700841] (osc_ros2) Command: {'cmd': ['/usr/bin/python3', '-W', 'ignore:setup.py install is deprecated', '-W', 'ignore:easy_install command is deprecated', 'setup.py', 'develop', '--editable', '--build-directory', '/BA/workspace/build/osc_ros2/build', '--no-deps', 'symlink_data'], 'cwd': '/BA/workspace/build/osc_ros2', 'env': {'HOSTNAME': '0e38e264ac6b', 'SHLVL': '1', 'LD_LIBRARY_PATH': '/opt/ros/humble/opt/rviz_ogre_vendor/lib:/opt/ros/humble/lib/x86_64-linux-gnu:/opt/ros/humble/lib', 'HOME': '/root', 'OLDPWD': '/BA', 'ROS_PYTHON_VERSION': '3', 'COLCON_PREFIX_PATH': '/BA/workspace/install', 'ROS_DISTRO': 'humble', '_': '/usr/bin/colcon', 'ROS_VERSION': '2', 'TERM': 'xterm', 'ROS_LOCALHOST_ONLY': '0', 'PATH': '/opt/ros/humble/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin', 'LANG': 'C.UTF-8', 'LS_COLORS': 'rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:', 'AMENT_PREFIX_PATH': '/BA/workspace/install/painting_robot_control:/BA/workspace/install/osc_ros2:/BA/workspace/install/mock_robot:/BA/workspace/install/joint_info:/BA/workspace/install/joint_control:/opt/ros/humble', 'PWD': '/BA/workspace/build/osc_ros2', 'LC_ALL': 'C.UTF-8', 'PYTHONPATH': '/BA/workspace/build/osc_ros2/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/BA/workspace/install/osc_ros2/lib/python3.10/site-packages:/BA/workspace/build/painting_robot_control:/BA/workspace/install/painting_robot_control/lib/python3.10/site-packages:/BA/workspace/build/osc_ros2:/BA/workspace/install/osc_ros2/lib/python3.10/site-packages:/BA/workspace/build/mock_robot:/BA/workspace/install/mock_robot/lib/python3.10/site-packages:/BA/workspace/build/joint_info:/BA/workspace/install/joint_info/lib/python3.10/site-packages:/BA/workspace/build/joint_control:/BA/workspace/install/joint_control/lib/python3.10/site-packages:/opt/ros/humble/lib/python3.10/site-packages:/opt/ros/humble/local/lib/python3.10/dist-packages', 'COLCON': '1'}, 'shell': False} +[0.712129] (-) TimerEvent: {} +[0.813149] (-) TimerEvent: {} +[0.918149] (-) TimerEvent: {} +[0.974475] (osc_ros2) StdoutLine: {'line': b'running develop\n'} +[1.018345] (-) TimerEvent: {} +[1.070145] (osc_ros2) StdoutLine: {'line': b'running egg_info\n'} +[1.071046] (osc_ros2) StdoutLine: {'line': b'writing osc_ros2.egg-info/PKG-INFO\n'} +[1.071438] (osc_ros2) StdoutLine: {'line': b'writing dependency_links to osc_ros2.egg-info/dependency_links.txt\n'} +[1.072067] (osc_ros2) StdoutLine: {'line': b'writing entry points to osc_ros2.egg-info/entry_points.txt\n'} +[1.072579] (osc_ros2) StdoutLine: {'line': b'writing requirements to osc_ros2.egg-info/requires.txt\n'} +[1.072982] (osc_ros2) StdoutLine: {'line': b'writing top-level names to osc_ros2.egg-info/top_level.txt\n'} +[1.075522] (osc_ros2) StdoutLine: {'line': b"reading manifest file 'osc_ros2.egg-info/SOURCES.txt'\n"} +[1.076853] (osc_ros2) StdoutLine: {'line': b"writing manifest file 'osc_ros2.egg-info/SOURCES.txt'\n"} +[1.078227] (osc_ros2) StdoutLine: {'line': b'running build_ext\n'} +[1.078700] (osc_ros2) StdoutLine: {'line': b'Creating /BA/workspace/install/osc_ros2/lib/python3.10/site-packages/osc-ros2.egg-link (link to .)\n'} +[1.079630] (osc_ros2) StdoutLine: {'line': b'Installing interface script to /BA/workspace/install/osc_ros2/lib/osc_ros2\n'} +[1.080643] (osc_ros2) StdoutLine: {'line': b'Installing interface1 script to /BA/workspace/install/osc_ros2/lib/osc_ros2\n'} +[1.081929] (osc_ros2) StdoutLine: {'line': b'\n'} +[1.082296] (osc_ros2) StdoutLine: {'line': b'Installed /BA/workspace/build/osc_ros2\n'} +[1.082546] (osc_ros2) StdoutLine: {'line': b'running symlink_data\n'} +[1.101143] (osc_ros2) CommandEnded: {'returncode': 0} +[1.119108] (-) TimerEvent: {} +[1.125807] (osc_ros2) JobEnded: {'identifier': 'osc_ros2', 'rc': 0} +[1.127119] (-) EventReactorShutdown: {} diff --git a/workspace/log/build_2025-05-08_15-47-35/logger_all.log b/workspace/log/build_2025-05-08_15-47-35/logger_all.log new file mode 100644 index 0000000..ebb69f2 --- /dev/null +++ b/workspace/log/build_2025-05-08_15-47-35/logger_all.log @@ -0,0 +1,174 @@ +[0.111s] DEBUG:colcon:Command line arguments: ['/usr/bin/colcon', 'build', '--packages-select', 'osc_ros2', '--symlink-install'] +[0.112s] DEBUG:colcon:Parsed command line arguments: Namespace(log_base=None, log_level=None, verb_name='build', build_base='build', install_base='install', merge_install=False, symlink_install=True, test_result_base=None, continue_on_error=False, executor='parallel', parallel_workers=8, event_handlers=None, ignore_user_meta=False, metas=['./colcon.meta'], base_paths=['.'], packages_ignore=None, packages_ignore_regex=None, paths=None, packages_up_to=None, packages_up_to_regex=None, packages_above=None, packages_above_and_dependencies=None, packages_above_depth=None, packages_select_by_dep=None, packages_skip_by_dep=None, packages_skip_up_to=None, packages_select_build_failed=False, packages_skip_build_finished=False, packages_select_test_failures=False, packages_skip_test_passed=False, packages_select=['osc_ros2'], packages_skip=None, packages_select_regex=None, packages_skip_regex=None, packages_start=None, packages_end=None, cmake_args=None, cmake_target=None, cmake_target_skip_unavailable=False, cmake_clean_cache=False, cmake_clean_first=False, cmake_force_configure=False, ament_cmake_args=None, catkin_cmake_args=None, catkin_skip_building_tests=False, mixin_files=None, mixin=None, verb_parser=, verb_extension=, main=>, mixin_verb=('build',)) +[0.233s] Level 1:colcon.colcon_core.package_discovery:discover_packages(colcon_meta) check parameters +[0.234s] INFO:colcon.colcon_metadata.package_discovery.colcon_meta:Using configuration from '/root/.colcon/metadata/default/Gazebo.meta' +[0.234s] INFO:colcon.colcon_metadata.package_discovery.colcon_meta:Using configuration from '/root/.colcon/metadata/default/fastrtps.meta' +[0.235s] Level 1:colcon.colcon_core.package_discovery:discover_packages(recursive) check parameters +[0.235s] Level 1:colcon.colcon_core.package_discovery:discover_packages(ignore) check parameters +[0.235s] Level 1:colcon.colcon_core.package_discovery:discover_packages(path) check parameters +[0.235s] Level 1:colcon.colcon_core.package_discovery:discover_packages(colcon_meta) discover +[0.235s] Level 1:colcon.colcon_core.package_discovery:discover_packages(recursive) discover +[0.235s] INFO:colcon.colcon_core.package_discovery:Crawling recursively for packages in '/BA/workspace' +[0.236s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['ignore', 'ignore_ament_install'] +[0.236s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'ignore' +[0.236s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'ignore_ament_install' +[0.236s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['colcon_pkg'] +[0.236s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'colcon_pkg' +[0.236s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['colcon_meta'] +[0.236s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'colcon_meta' +[0.236s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['ros'] +[0.236s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'ros' +[0.244s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['cmake', 'python'] +[0.244s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'cmake' +[0.244s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'python' +[0.244s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['python_setup_py'] +[0.244s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'python_setup_py' +[0.245s] Level 1:colcon.colcon_core.package_identification:_identify(build) by extensions ['ignore', 'ignore_ament_install'] +[0.245s] Level 1:colcon.colcon_core.package_identification:_identify(build) by extension 'ignore' +[0.245s] Level 1:colcon.colcon_core.package_identification:_identify(build) ignored +[0.245s] Level 1:colcon.colcon_core.package_identification:_identify(install) by extensions ['ignore', 'ignore_ament_install'] +[0.245s] Level 1:colcon.colcon_core.package_identification:_identify(install) by extension 'ignore' +[0.245s] Level 1:colcon.colcon_core.package_identification:_identify(install) ignored +[0.246s] Level 1:colcon.colcon_core.package_identification:_identify(log) by extensions ['ignore', 'ignore_ament_install'] +[0.246s] Level 1:colcon.colcon_core.package_identification:_identify(log) by extension 'ignore' +[0.246s] Level 1:colcon.colcon_core.package_identification:_identify(log) ignored +[0.247s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['ignore', 'ignore_ament_install'] +[0.247s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'ignore' +[0.247s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'ignore_ament_install' +[0.247s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['colcon_pkg'] +[0.247s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'colcon_pkg' +[0.247s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['colcon_meta'] +[0.247s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'colcon_meta' +[0.247s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['ros'] +[0.247s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'ros' +[0.248s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['cmake', 'python'] +[0.248s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'cmake' +[0.248s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'python' +[0.248s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['python_setup_py'] +[0.248s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'python_setup_py' +[0.249s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_control) by extensions ['ignore', 'ignore_ament_install'] +[0.249s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_control) by extension 'ignore' +[0.249s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_control) by extension 'ignore_ament_install' +[0.249s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_control) by extensions ['colcon_pkg'] +[0.249s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_control) by extension 'colcon_pkg' +[0.249s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_control) by extensions ['colcon_meta'] +[0.249s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_control) by extension 'colcon_meta' +[0.250s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_control) by extensions ['ros'] +[0.250s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_control) by extension 'ros' +[0.255s] DEBUG:colcon.colcon_core.package_identification:Package 'src/joint_control' with type 'ros.ament_python' and name 'joint_control' +[0.256s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_info) by extensions ['ignore', 'ignore_ament_install'] +[0.256s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_info) by extension 'ignore' +[0.256s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_info) by extension 'ignore_ament_install' +[0.256s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_info) by extensions ['colcon_pkg'] +[0.256s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_info) by extension 'colcon_pkg' +[0.256s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_info) by extensions ['colcon_meta'] +[0.256s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_info) by extension 'colcon_meta' +[0.256s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_info) by extensions ['ros'] +[0.256s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_info) by extension 'ros' +[0.257s] DEBUG:colcon.colcon_core.package_identification:Package 'src/joint_info' with type 'ros.ament_python' and name 'joint_info' +[0.258s] Level 1:colcon.colcon_core.package_identification:_identify(src/mock_robot) by extensions ['ignore', 'ignore_ament_install'] +[0.258s] Level 1:colcon.colcon_core.package_identification:_identify(src/mock_robot) by extension 'ignore' +[0.259s] Level 1:colcon.colcon_core.package_identification:_identify(src/mock_robot) by extension 'ignore_ament_install' +[0.259s] Level 1:colcon.colcon_core.package_identification:_identify(src/mock_robot) by extensions ['colcon_pkg'] +[0.259s] Level 1:colcon.colcon_core.package_identification:_identify(src/mock_robot) by extension 'colcon_pkg' +[0.259s] Level 1:colcon.colcon_core.package_identification:_identify(src/mock_robot) by extensions ['colcon_meta'] +[0.259s] Level 1:colcon.colcon_core.package_identification:_identify(src/mock_robot) by extension 'colcon_meta' +[0.259s] Level 1:colcon.colcon_core.package_identification:_identify(src/mock_robot) by extensions ['ros'] +[0.259s] Level 1:colcon.colcon_core.package_identification:_identify(src/mock_robot) by extension 'ros' +[0.260s] DEBUG:colcon.colcon_core.package_identification:Package 'src/mock_robot' with type 'ros.ament_python' and name 'mock_robot' +[0.260s] Level 1:colcon.colcon_core.package_identification:_identify(src/osc_ros2) by extensions ['ignore', 'ignore_ament_install'] +[0.260s] Level 1:colcon.colcon_core.package_identification:_identify(src/osc_ros2) by extension 'ignore' +[0.260s] Level 1:colcon.colcon_core.package_identification:_identify(src/osc_ros2) by extension 'ignore_ament_install' +[0.261s] Level 1:colcon.colcon_core.package_identification:_identify(src/osc_ros2) by extensions ['colcon_pkg'] +[0.261s] Level 1:colcon.colcon_core.package_identification:_identify(src/osc_ros2) by extension 'colcon_pkg' +[0.261s] Level 1:colcon.colcon_core.package_identification:_identify(src/osc_ros2) by extensions ['colcon_meta'] +[0.261s] Level 1:colcon.colcon_core.package_identification:_identify(src/osc_ros2) by extension 'colcon_meta' +[0.261s] Level 1:colcon.colcon_core.package_identification:_identify(src/osc_ros2) by extensions ['ros'] +[0.261s] Level 1:colcon.colcon_core.package_identification:_identify(src/osc_ros2) by extension 'ros' +[0.261s] DEBUG:colcon.colcon_core.package_identification:Package 'src/osc_ros2' with type 'ros.ament_python' and name 'osc_ros2' +[0.262s] Level 1:colcon.colcon_core.package_identification:_identify(src/painting_robot_control) by extensions ['ignore', 'ignore_ament_install'] +[0.262s] Level 1:colcon.colcon_core.package_identification:_identify(src/painting_robot_control) by extension 'ignore' +[0.262s] Level 1:colcon.colcon_core.package_identification:_identify(src/painting_robot_control) by extension 'ignore_ament_install' +[0.262s] Level 1:colcon.colcon_core.package_identification:_identify(src/painting_robot_control) by extensions ['colcon_pkg'] +[0.262s] Level 1:colcon.colcon_core.package_identification:_identify(src/painting_robot_control) by extension 'colcon_pkg' +[0.262s] Level 1:colcon.colcon_core.package_identification:_identify(src/painting_robot_control) by extensions ['colcon_meta'] +[0.262s] Level 1:colcon.colcon_core.package_identification:_identify(src/painting_robot_control) by extension 'colcon_meta' +[0.263s] Level 1:colcon.colcon_core.package_identification:_identify(src/painting_robot_control) by extensions ['ros'] +[0.263s] Level 1:colcon.colcon_core.package_identification:_identify(src/painting_robot_control) by extension 'ros' +[0.263s] DEBUG:colcon.colcon_core.package_identification:Package 'src/painting_robot_control' with type 'ros.ament_python' and name 'painting_robot_control' +[0.263s] Level 1:colcon.colcon_core.package_discovery:discover_packages(recursive) using defaults +[0.263s] Level 1:colcon.colcon_core.package_discovery:discover_packages(ignore) discover +[0.263s] Level 1:colcon.colcon_core.package_discovery:discover_packages(ignore) using defaults +[0.263s] Level 1:colcon.colcon_core.package_discovery:discover_packages(path) discover +[0.264s] Level 1:colcon.colcon_core.package_discovery:discover_packages(path) using defaults +[0.280s] INFO:colcon.colcon_core.package_selection:Skipping not selected package 'joint_control' in 'src/joint_control' +[0.280s] INFO:colcon.colcon_core.package_selection:Skipping not selected package 'joint_info' in 'src/joint_info' +[0.280s] INFO:colcon.colcon_core.package_selection:Skipping not selected package 'mock_robot' in 'src/mock_robot' +[0.280s] INFO:colcon.colcon_core.package_selection:Skipping not selected package 'painting_robot_control' in 'src/painting_robot_control' +[0.281s] Level 5:colcon.colcon_core.verb:set package 'osc_ros2' build argument 'cmake_args' from command line to 'None' +[0.281s] Level 5:colcon.colcon_core.verb:set package 'osc_ros2' build argument 'cmake_target' from command line to 'None' +[0.281s] Level 5:colcon.colcon_core.verb:set package 'osc_ros2' build argument 'cmake_target_skip_unavailable' from command line to 'False' +[0.281s] Level 5:colcon.colcon_core.verb:set package 'osc_ros2' build argument 'cmake_clean_cache' from command line to 'False' +[0.281s] Level 5:colcon.colcon_core.verb:set package 'osc_ros2' build argument 'cmake_clean_first' from command line to 'False' +[0.281s] Level 5:colcon.colcon_core.verb:set package 'osc_ros2' build argument 'cmake_force_configure' from command line to 'False' +[0.281s] Level 5:colcon.colcon_core.verb:set package 'osc_ros2' build argument 'ament_cmake_args' from command line to 'None' +[0.281s] Level 5:colcon.colcon_core.verb:set package 'osc_ros2' build argument 'catkin_cmake_args' from command line to 'None' +[0.281s] Level 5:colcon.colcon_core.verb:set package 'osc_ros2' build argument 'catkin_skip_building_tests' from command line to 'False' +[0.281s] DEBUG:colcon.colcon_core.verb:Building package 'osc_ros2' with the following arguments: {'ament_cmake_args': None, 'build_base': '/BA/workspace/build/osc_ros2', 'catkin_cmake_args': None, 'catkin_skip_building_tests': False, 'cmake_args': None, 'cmake_clean_cache': False, 'cmake_clean_first': False, 'cmake_force_configure': False, 'cmake_target': None, 'cmake_target_skip_unavailable': False, 'install_base': '/BA/workspace/install/osc_ros2', 'merge_install': False, 'path': '/BA/workspace/src/osc_ros2', 'symlink_install': True, 'test_result_base': None} +[0.281s] INFO:colcon.colcon_core.executor:Executing jobs using 'parallel' executor +[0.284s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:run_until_complete +[0.285s] INFO:colcon.colcon_ros.task.ament_python.build:Building ROS package in '/BA/workspace/src/osc_ros2' with build type 'ament_python' +[0.285s] Level 1:colcon.colcon_core.shell:create_environment_hook('osc_ros2', 'ament_prefix_path') +[0.287s] INFO:colcon.colcon_core.plugin_system:Skipping extension 'colcon_core.shell.bat': Not used on non-Windows systems +[0.288s] INFO:colcon.colcon_core.shell:Creating environment hook '/BA/workspace/install/osc_ros2/share/osc_ros2/hook/ament_prefix_path.ps1' +[0.289s] INFO:colcon.colcon_core.shell:Creating environment descriptor '/BA/workspace/install/osc_ros2/share/osc_ros2/hook/ament_prefix_path.dsv' +[0.290s] INFO:colcon.colcon_core.shell:Creating environment hook '/BA/workspace/install/osc_ros2/share/osc_ros2/hook/ament_prefix_path.sh' +[0.291s] INFO:colcon.colcon_core.shell:Skip shell extension 'powershell' for command environment: Not usable outside of PowerShell +[0.291s] DEBUG:colcon.colcon_core.shell:Skip shell extension 'dsv' for command environment +[0.591s] INFO:colcon.colcon_core.task.python.build:Building Python package in '/BA/workspace/src/osc_ros2' +[0.592s] INFO:colcon.colcon_core.shell:Skip shell extension 'powershell' for command environment: Not usable outside of PowerShell +[0.592s] DEBUG:colcon.colcon_core.shell:Skip shell extension 'dsv' for command environment +[0.996s] DEBUG:colcon.colcon_core.event_handler.log_command:Invoking command in '/BA/workspace/build/osc_ros2': PYTHONPATH=/BA/workspace/build/osc_ros2/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/BA/workspace/install/osc_ros2/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /BA/workspace/build/osc_ros2/build --no-deps symlink_data +[1.386s] Level 1:colcon.colcon_core.shell:create_environment_hook('osc_ros2', 'pythonpath_develop') +[1.387s] INFO:colcon.colcon_core.shell:Creating environment hook '/BA/workspace/build/osc_ros2/share/osc_ros2/hook/pythonpath_develop.ps1' +[1.387s] DEBUG:colcon.colcon_core.event_handler.log_command:Invoked command in '/BA/workspace/build/osc_ros2' returned '0': PYTHONPATH=/BA/workspace/build/osc_ros2/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/BA/workspace/install/osc_ros2/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /BA/workspace/build/osc_ros2/build --no-deps symlink_data +[1.388s] INFO:colcon.colcon_core.shell:Creating environment descriptor '/BA/workspace/build/osc_ros2/share/osc_ros2/hook/pythonpath_develop.dsv' +[1.389s] INFO:colcon.colcon_core.shell:Creating environment hook '/BA/workspace/build/osc_ros2/share/osc_ros2/hook/pythonpath_develop.sh' +[1.399s] Level 1:colcon.colcon_core.environment:checking '/BA/workspace/install/osc_ros2' for CMake module files +[1.401s] Level 1:colcon.colcon_core.environment:checking '/BA/workspace/install/osc_ros2' for CMake config files +[1.403s] Level 1:colcon.colcon_core.environment:checking '/BA/workspace/install/osc_ros2/lib' +[1.403s] Level 1:colcon.colcon_core.environment:checking '/BA/workspace/install/osc_ros2/bin' +[1.403s] Level 1:colcon.colcon_core.environment:checking '/BA/workspace/install/osc_ros2/lib/pkgconfig/osc_ros2.pc' +[1.404s] Level 1:colcon.colcon_core.environment:checking '/BA/workspace/install/osc_ros2/lib/python3.10/site-packages' +[1.404s] Level 1:colcon.colcon_core.shell:create_environment_hook('osc_ros2', 'pythonpath') +[1.404s] INFO:colcon.colcon_core.shell:Creating environment hook '/BA/workspace/install/osc_ros2/share/osc_ros2/hook/pythonpath.ps1' +[1.405s] INFO:colcon.colcon_core.shell:Creating environment descriptor '/BA/workspace/install/osc_ros2/share/osc_ros2/hook/pythonpath.dsv' +[1.405s] INFO:colcon.colcon_core.shell:Creating environment hook '/BA/workspace/install/osc_ros2/share/osc_ros2/hook/pythonpath.sh' +[1.406s] Level 1:colcon.colcon_core.environment:checking '/BA/workspace/install/osc_ros2/bin' +[1.406s] Level 1:colcon.colcon_core.environment:create_environment_scripts_only(osc_ros2) +[1.406s] INFO:colcon.colcon_core.shell:Creating package script '/BA/workspace/install/osc_ros2/share/osc_ros2/package.ps1' +[1.407s] INFO:colcon.colcon_core.shell:Creating package descriptor '/BA/workspace/install/osc_ros2/share/osc_ros2/package.dsv' +[1.408s] INFO:colcon.colcon_core.shell:Creating package script '/BA/workspace/install/osc_ros2/share/osc_ros2/package.sh' +[1.409s] INFO:colcon.colcon_core.shell:Creating package script '/BA/workspace/install/osc_ros2/share/osc_ros2/package.bash' +[1.410s] INFO:colcon.colcon_core.shell:Creating package script '/BA/workspace/install/osc_ros2/share/osc_ros2/package.zsh' +[1.410s] Level 1:colcon.colcon_core.environment:create_file_with_runtime_dependencies(/BA/workspace/install/osc_ros2/share/colcon-core/packages/osc_ros2) +[1.411s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:closing loop +[1.411s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:loop closed +[1.411s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:run_until_complete finished with '0' +[1.411s] DEBUG:colcon.colcon_core.event_reactor:joining thread +[1.419s] INFO:colcon.colcon_core.plugin_system:Skipping extension 'colcon_notification.desktop_notification.notify_send': Could not find 'notify-send' +[1.419s] INFO:colcon.colcon_core.plugin_system:Skipping extension 'colcon_notification.desktop_notification.terminal_notifier': Not used on non-Darwin systems +[1.419s] INFO:colcon.colcon_core.plugin_system:Skipping extension 'colcon_notification.desktop_notification.win32': Not used on non-Windows systems +[1.419s] INFO:colcon.colcon_notification.desktop_notification:Sending desktop notification using 'notify2' +[1.421s] DEBUG:colcon.colcon_notification.desktop_notification.notify2:Failed to initialize notify2: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11 +[1.421s] DEBUG:colcon.colcon_core.event_reactor:joined thread +[1.421s] INFO:colcon.colcon_core.shell:Creating prefix script '/BA/workspace/install/local_setup.ps1' +[1.422s] INFO:colcon.colcon_core.shell:Creating prefix util module '/BA/workspace/install/_local_setup_util_ps1.py' +[1.424s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/BA/workspace/install/setup.ps1' +[1.426s] INFO:colcon.colcon_core.shell:Creating prefix script '/BA/workspace/install/local_setup.sh' +[1.427s] INFO:colcon.colcon_core.shell:Creating prefix util module '/BA/workspace/install/_local_setup_util_sh.py' +[1.428s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/BA/workspace/install/setup.sh' +[1.430s] INFO:colcon.colcon_core.shell:Creating prefix script '/BA/workspace/install/local_setup.bash' +[1.430s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/BA/workspace/install/setup.bash' +[1.433s] INFO:colcon.colcon_core.shell:Creating prefix script '/BA/workspace/install/local_setup.zsh' +[1.434s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/BA/workspace/install/setup.zsh' diff --git a/workspace/log/build_2025-05-08_15-47-35/osc_ros2/command.log b/workspace/log/build_2025-05-08_15-47-35/osc_ros2/command.log new file mode 100644 index 0000000..a3b47cf --- /dev/null +++ b/workspace/log/build_2025-05-08_15-47-35/osc_ros2/command.log @@ -0,0 +1,2 @@ +Invoking command in '/BA/workspace/build/osc_ros2': PYTHONPATH=/BA/workspace/build/osc_ros2/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/BA/workspace/install/osc_ros2/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /BA/workspace/build/osc_ros2/build --no-deps symlink_data +Invoked command in '/BA/workspace/build/osc_ros2' returned '0': PYTHONPATH=/BA/workspace/build/osc_ros2/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/BA/workspace/install/osc_ros2/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /BA/workspace/build/osc_ros2/build --no-deps symlink_data diff --git a/workspace/log/build_2025-05-08_15-47-35/osc_ros2/stderr.log b/workspace/log/build_2025-05-08_15-47-35/osc_ros2/stderr.log new file mode 100644 index 0000000..e69de29 diff --git a/workspace/log/build_2025-05-08_15-47-35/osc_ros2/stdout.log b/workspace/log/build_2025-05-08_15-47-35/osc_ros2/stdout.log new file mode 100644 index 0000000..f0eac70 --- /dev/null +++ b/workspace/log/build_2025-05-08_15-47-35/osc_ros2/stdout.log @@ -0,0 +1,16 @@ +running develop +running egg_info +writing osc_ros2.egg-info/PKG-INFO +writing dependency_links to osc_ros2.egg-info/dependency_links.txt +writing entry points to osc_ros2.egg-info/entry_points.txt +writing requirements to osc_ros2.egg-info/requires.txt +writing top-level names to osc_ros2.egg-info/top_level.txt +reading manifest file 'osc_ros2.egg-info/SOURCES.txt' +writing manifest file 'osc_ros2.egg-info/SOURCES.txt' +running build_ext +Creating /BA/workspace/install/osc_ros2/lib/python3.10/site-packages/osc-ros2.egg-link (link to .) +Installing interface script to /BA/workspace/install/osc_ros2/lib/osc_ros2 +Installing interface1 script to /BA/workspace/install/osc_ros2/lib/osc_ros2 + +Installed /BA/workspace/build/osc_ros2 +running symlink_data diff --git a/workspace/log/build_2025-05-08_15-47-35/osc_ros2/stdout_stderr.log b/workspace/log/build_2025-05-08_15-47-35/osc_ros2/stdout_stderr.log new file mode 100644 index 0000000..f0eac70 --- /dev/null +++ b/workspace/log/build_2025-05-08_15-47-35/osc_ros2/stdout_stderr.log @@ -0,0 +1,16 @@ +running develop +running egg_info +writing osc_ros2.egg-info/PKG-INFO +writing dependency_links to osc_ros2.egg-info/dependency_links.txt +writing entry points to osc_ros2.egg-info/entry_points.txt +writing requirements to osc_ros2.egg-info/requires.txt +writing top-level names to osc_ros2.egg-info/top_level.txt +reading manifest file 'osc_ros2.egg-info/SOURCES.txt' +writing manifest file 'osc_ros2.egg-info/SOURCES.txt' +running build_ext +Creating /BA/workspace/install/osc_ros2/lib/python3.10/site-packages/osc-ros2.egg-link (link to .) +Installing interface script to /BA/workspace/install/osc_ros2/lib/osc_ros2 +Installing interface1 script to /BA/workspace/install/osc_ros2/lib/osc_ros2 + +Installed /BA/workspace/build/osc_ros2 +running symlink_data diff --git a/workspace/log/build_2025-05-08_15-47-35/osc_ros2/streams.log b/workspace/log/build_2025-05-08_15-47-35/osc_ros2/streams.log new file mode 100644 index 0000000..b26c232 --- /dev/null +++ b/workspace/log/build_2025-05-08_15-47-35/osc_ros2/streams.log @@ -0,0 +1,18 @@ +[0.707s] Invoking command in '/BA/workspace/build/osc_ros2': PYTHONPATH=/BA/workspace/build/osc_ros2/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/BA/workspace/install/osc_ros2/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /BA/workspace/build/osc_ros2/build --no-deps symlink_data +[0.973s] running develop +[1.067s] running egg_info +[1.067s] writing osc_ros2.egg-info/PKG-INFO +[1.068s] writing dependency_links to osc_ros2.egg-info/dependency_links.txt +[1.069s] writing entry points to osc_ros2.egg-info/entry_points.txt +[1.069s] writing requirements to osc_ros2.egg-info/requires.txt +[1.069s] writing top-level names to osc_ros2.egg-info/top_level.txt +[1.072s] reading manifest file 'osc_ros2.egg-info/SOURCES.txt' +[1.074s] writing manifest file 'osc_ros2.egg-info/SOURCES.txt' +[1.075s] running build_ext +[1.075s] Creating /BA/workspace/install/osc_ros2/lib/python3.10/site-packages/osc-ros2.egg-link (link to .) +[1.076s] Installing interface script to /BA/workspace/install/osc_ros2/lib/osc_ros2 +[1.077s] Installing interface1 script to /BA/workspace/install/osc_ros2/lib/osc_ros2 +[1.078s] +[1.079s] Installed /BA/workspace/build/osc_ros2 +[1.079s] running symlink_data +[1.098s] Invoked command in '/BA/workspace/build/osc_ros2' returned '0': PYTHONPATH=/BA/workspace/build/osc_ros2/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/BA/workspace/install/osc_ros2/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /BA/workspace/build/osc_ros2/build --no-deps symlink_data diff --git a/workspace/log/build_2025-05-08_20-39-10/events.log b/workspace/log/build_2025-05-08_20-39-10/events.log new file mode 100644 index 0000000..48c636b --- /dev/null +++ b/workspace/log/build_2025-05-08_20-39-10/events.log @@ -0,0 +1,52 @@ +[0.000000] (-) TimerEvent: {} +[0.001849] (-) JobUnselected: {'identifier': 'joint_info'} +[0.002118] (-) JobUnselected: {'identifier': 'mock_robot'} +[0.002365] (-) JobUnselected: {'identifier': 'osc_ros2'} +[0.003113] (-) JobUnselected: {'identifier': 'painting_robot_control'} +[0.003260] (joint_control) JobQueued: {'identifier': 'joint_control', 'dependencies': OrderedDict()} +[0.003349] (joint_control) JobStarted: {'identifier': 'joint_control'} +[0.098879] (-) TimerEvent: {} +[0.203989] (-) TimerEvent: {} +[0.304907] (-) TimerEvent: {} +[0.405933] (-) TimerEvent: {} +[0.508068] (-) TimerEvent: {} +[0.608947] (-) TimerEvent: {} +[0.711913] (-) TimerEvent: {} +[0.742618] (joint_control) Command: {'cmd': ['/usr/bin/python3', '-W', 'ignore:setup.py install is deprecated', '-W', 'ignore:easy_install command is deprecated', 'setup.py', 'develop', '--editable', '--build-directory', '/BA/workspace/build/joint_control/build', '--no-deps', 'symlink_data'], 'cwd': '/BA/workspace/build/joint_control', 'env': {'HOSTNAME': '0e38e264ac6b', 'SHLVL': '1', 'LD_LIBRARY_PATH': '/opt/ros/humble/opt/rviz_ogre_vendor/lib:/opt/ros/humble/lib/x86_64-linux-gnu:/opt/ros/humble/lib', 'HOME': '/root', 'OLDPWD': '/BA/workspace/src', 'ROS_PYTHON_VERSION': '3', 'COLCON_PREFIX_PATH': '/BA/workspace/install', 'ROS_DISTRO': 'humble', '_': '/usr/bin/colcon', 'ROS_VERSION': '2', 'TERM': 'xterm', 'ROS_LOCALHOST_ONLY': '0', 'PATH': '/opt/ros/humble/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin', 'LANG': 'C.UTF-8', 'LS_COLORS': 'rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:', 'AMENT_PREFIX_PATH': '/BA/workspace/install/painting_robot_control:/BA/workspace/install/osc_ros2:/BA/workspace/install/mock_robot:/BA/workspace/install/joint_info:/BA/workspace/install/joint_control:/opt/ros/humble', 'PWD': '/BA/workspace/build/joint_control', 'LC_ALL': 'C.UTF-8', 'PYTHONPATH': '/BA/workspace/build/joint_control/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/BA/workspace/install/joint_control/lib/python3.10/site-packages:/BA/workspace/build/painting_robot_control:/BA/workspace/install/painting_robot_control/lib/python3.10/site-packages:/BA/workspace/build/osc_ros2:/BA/workspace/install/osc_ros2/lib/python3.10/site-packages:/BA/workspace/build/mock_robot:/BA/workspace/install/mock_robot/lib/python3.10/site-packages:/BA/workspace/build/joint_info:/BA/workspace/install/joint_info/lib/python3.10/site-packages:/BA/workspace/build/joint_control:/BA/workspace/install/joint_control/lib/python3.10/site-packages:/opt/ros/humble/lib/python3.10/site-packages:/opt/ros/humble/local/lib/python3.10/dist-packages', 'COLCON': '1'}, 'shell': False} +[0.812809] (-) TimerEvent: {} +[0.915822] (-) TimerEvent: {} +[1.019811] (-) TimerEvent: {} +[1.032272] (joint_control) StdoutLine: {'line': b'running develop\n'} +[1.120804] (-) TimerEvent: {} +[1.124824] (joint_control) StdoutLine: {'line': b'running egg_info\n'} +[1.126047] (joint_control) StdoutLine: {'line': b'writing joint_control.egg-info/PKG-INFO\n'} +[1.126518] (joint_control) StdoutLine: {'line': b'writing dependency_links to joint_control.egg-info/dependency_links.txt\n'} +[1.127460] (joint_control) StdoutLine: {'line': b'writing entry points to joint_control.egg-info/entry_points.txt\n'} +[1.128217] (joint_control) StdoutLine: {'line': b'writing requirements to joint_control.egg-info/requires.txt\n'} +[1.128815] (joint_control) StdoutLine: {'line': b'writing top-level names to joint_control.egg-info/top_level.txt\n'} +[1.134816] (joint_control) StdoutLine: {'line': b"reading manifest file 'joint_control.egg-info/SOURCES.txt'\n"} +[1.137334] (joint_control) StdoutLine: {'line': b"writing manifest file 'joint_control.egg-info/SOURCES.txt'\n"} +[1.138935] (joint_control) StdoutLine: {'line': b'running build_ext\n'} +[1.139472] (joint_control) StdoutLine: {'line': b'Creating /BA/workspace/install/joint_control/lib/python3.10/site-packages/joint-control.egg-link (link to .)\n'} +[1.140854] (joint_control) StdoutLine: {'line': b'Installing cart_coords script to /BA/workspace/install/joint_control/lib/joint_control\n'} +[1.141974] (joint_control) StdoutLine: {'line': b'Installing joint_control script to /BA/workspace/install/joint_control/lib/joint_control\n'} +[1.142528] (joint_control) StdoutLine: {'line': b'Installing plugdata script to /BA/workspace/install/joint_control/lib/joint_control\n'} +[1.143457] (joint_control) StdoutLine: {'line': b'Installing plugdata_cart script to /BA/workspace/install/joint_control/lib/joint_control\n'} +[1.144480] (joint_control) StdoutLine: {'line': b'Installing plugdata_cart_fix script to /BA/workspace/install/joint_control/lib/joint_control\n'} +[1.145277] (joint_control) StdoutLine: {'line': b'Installing plugdata_cart_smooth script to /BA/workspace/install/joint_control/lib/joint_control\n'} +[1.145925] (joint_control) StdoutLine: {'line': b'Installing sandbox script to /BA/workspace/install/joint_control/lib/joint_control\n'} +[1.146641] (joint_control) StdoutLine: {'line': b'Installing test script to /BA/workspace/install/joint_control/lib/joint_control\n'} +[1.147533] (joint_control) StdoutLine: {'line': b'Installing trajectory_server script to /BA/workspace/install/joint_control/lib/joint_control\n'} +[1.148350] (joint_control) StdoutLine: {'line': b'Installing trajectory_server_cart script to /BA/workspace/install/joint_control/lib/joint_control\n'} +[1.149175] (joint_control) StdoutLine: {'line': b'Installing trajectory_server_cart_fast script to /BA/workspace/install/joint_control/lib/joint_control\n'} +[1.149737] (joint_control) StdoutLine: {'line': b'Installing trajectory_server_cart_fast_max_acc script to /BA/workspace/install/joint_control/lib/joint_control\n'} +[1.150493] (joint_control) StdoutLine: {'line': b'Installing trajectory_server_cart_fast_smooth script to /BA/workspace/install/joint_control/lib/joint_control\n'} +[1.151177] (joint_control) StdoutLine: {'line': b'Installing trajectory_server_new script to /BA/workspace/install/joint_control/lib/joint_control\n'} +[1.152702] (joint_control) StdoutLine: {'line': b'Installing trajectory_server_new_cart script to /BA/workspace/install/joint_control/lib/joint_control\n'} +[1.153815] (joint_control) StdoutLine: {'line': b'Installing trajectory_server_trapezoidal script to /BA/workspace/install/joint_control/lib/joint_control\n'} +[1.154683] (joint_control) StdoutLine: {'line': b'\n'} +[1.155151] (joint_control) StdoutLine: {'line': b'Installed /BA/workspace/build/joint_control\n'} +[1.155455] (joint_control) StdoutLine: {'line': b'running symlink_data\n'} +[1.175447] (joint_control) CommandEnded: {'returncode': 0} +[1.205699] (joint_control) JobEnded: {'identifier': 'joint_control', 'rc': 0} +[1.207432] (-) EventReactorShutdown: {} diff --git a/workspace/log/build_2025-05-08_20-39-10/joint_control/command.log b/workspace/log/build_2025-05-08_20-39-10/joint_control/command.log new file mode 100644 index 0000000..ebfe81b --- /dev/null +++ b/workspace/log/build_2025-05-08_20-39-10/joint_control/command.log @@ -0,0 +1,2 @@ +Invoking command in '/BA/workspace/build/joint_control': PYTHONPATH=/BA/workspace/build/joint_control/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/BA/workspace/install/joint_control/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /BA/workspace/build/joint_control/build --no-deps symlink_data +Invoked command in '/BA/workspace/build/joint_control' returned '0': PYTHONPATH=/BA/workspace/build/joint_control/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/BA/workspace/install/joint_control/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /BA/workspace/build/joint_control/build --no-deps symlink_data diff --git a/workspace/log/build_2025-05-08_20-39-10/joint_control/stderr.log b/workspace/log/build_2025-05-08_20-39-10/joint_control/stderr.log new file mode 100644 index 0000000..e69de29 diff --git a/workspace/log/build_2025-05-08_20-39-10/joint_control/stdout.log b/workspace/log/build_2025-05-08_20-39-10/joint_control/stdout.log new file mode 100644 index 0000000..4ef43b2 --- /dev/null +++ b/workspace/log/build_2025-05-08_20-39-10/joint_control/stdout.log @@ -0,0 +1,30 @@ +running develop +running egg_info +writing joint_control.egg-info/PKG-INFO +writing dependency_links to joint_control.egg-info/dependency_links.txt +writing entry points to joint_control.egg-info/entry_points.txt +writing requirements to joint_control.egg-info/requires.txt +writing top-level names to joint_control.egg-info/top_level.txt +reading manifest file 'joint_control.egg-info/SOURCES.txt' +writing manifest file 'joint_control.egg-info/SOURCES.txt' +running build_ext +Creating /BA/workspace/install/joint_control/lib/python3.10/site-packages/joint-control.egg-link (link to .) +Installing cart_coords script to /BA/workspace/install/joint_control/lib/joint_control +Installing joint_control script to /BA/workspace/install/joint_control/lib/joint_control +Installing plugdata script to /BA/workspace/install/joint_control/lib/joint_control +Installing plugdata_cart script to /BA/workspace/install/joint_control/lib/joint_control +Installing plugdata_cart_fix script to /BA/workspace/install/joint_control/lib/joint_control +Installing plugdata_cart_smooth script to /BA/workspace/install/joint_control/lib/joint_control +Installing sandbox script to /BA/workspace/install/joint_control/lib/joint_control +Installing test script to /BA/workspace/install/joint_control/lib/joint_control +Installing trajectory_server script to /BA/workspace/install/joint_control/lib/joint_control +Installing trajectory_server_cart script to /BA/workspace/install/joint_control/lib/joint_control +Installing trajectory_server_cart_fast script to /BA/workspace/install/joint_control/lib/joint_control +Installing trajectory_server_cart_fast_max_acc script to /BA/workspace/install/joint_control/lib/joint_control +Installing trajectory_server_cart_fast_smooth script to /BA/workspace/install/joint_control/lib/joint_control +Installing trajectory_server_new script to /BA/workspace/install/joint_control/lib/joint_control +Installing trajectory_server_new_cart script to /BA/workspace/install/joint_control/lib/joint_control +Installing trajectory_server_trapezoidal script to /BA/workspace/install/joint_control/lib/joint_control + +Installed /BA/workspace/build/joint_control +running symlink_data diff --git a/workspace/log/build_2025-05-08_20-39-10/joint_control/stdout_stderr.log b/workspace/log/build_2025-05-08_20-39-10/joint_control/stdout_stderr.log new file mode 100644 index 0000000..4ef43b2 --- /dev/null +++ b/workspace/log/build_2025-05-08_20-39-10/joint_control/stdout_stderr.log @@ -0,0 +1,30 @@ +running develop +running egg_info +writing joint_control.egg-info/PKG-INFO +writing dependency_links to joint_control.egg-info/dependency_links.txt +writing entry points to joint_control.egg-info/entry_points.txt +writing requirements to joint_control.egg-info/requires.txt +writing top-level names to joint_control.egg-info/top_level.txt +reading manifest file 'joint_control.egg-info/SOURCES.txt' +writing manifest file 'joint_control.egg-info/SOURCES.txt' +running build_ext +Creating /BA/workspace/install/joint_control/lib/python3.10/site-packages/joint-control.egg-link (link to .) +Installing cart_coords script to /BA/workspace/install/joint_control/lib/joint_control +Installing joint_control script to /BA/workspace/install/joint_control/lib/joint_control +Installing plugdata script to /BA/workspace/install/joint_control/lib/joint_control +Installing plugdata_cart script to /BA/workspace/install/joint_control/lib/joint_control +Installing plugdata_cart_fix script to /BA/workspace/install/joint_control/lib/joint_control +Installing plugdata_cart_smooth script to /BA/workspace/install/joint_control/lib/joint_control +Installing sandbox script to /BA/workspace/install/joint_control/lib/joint_control +Installing test script to /BA/workspace/install/joint_control/lib/joint_control +Installing trajectory_server script to /BA/workspace/install/joint_control/lib/joint_control +Installing trajectory_server_cart script to /BA/workspace/install/joint_control/lib/joint_control +Installing trajectory_server_cart_fast script to /BA/workspace/install/joint_control/lib/joint_control +Installing trajectory_server_cart_fast_max_acc script to /BA/workspace/install/joint_control/lib/joint_control +Installing trajectory_server_cart_fast_smooth script to /BA/workspace/install/joint_control/lib/joint_control +Installing trajectory_server_new script to /BA/workspace/install/joint_control/lib/joint_control +Installing trajectory_server_new_cart script to /BA/workspace/install/joint_control/lib/joint_control +Installing trajectory_server_trapezoidal script to /BA/workspace/install/joint_control/lib/joint_control + +Installed /BA/workspace/build/joint_control +running symlink_data diff --git a/workspace/log/build_2025-05-08_20-39-10/joint_control/streams.log b/workspace/log/build_2025-05-08_20-39-10/joint_control/streams.log new file mode 100644 index 0000000..89c6e95 --- /dev/null +++ b/workspace/log/build_2025-05-08_20-39-10/joint_control/streams.log @@ -0,0 +1,32 @@ +[0.752s] Invoking command in '/BA/workspace/build/joint_control': PYTHONPATH=/BA/workspace/build/joint_control/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/BA/workspace/install/joint_control/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /BA/workspace/build/joint_control/build --no-deps symlink_data +[1.029s] running develop +[1.122s] running egg_info +[1.123s] writing joint_control.egg-info/PKG-INFO +[1.124s] writing dependency_links to joint_control.egg-info/dependency_links.txt +[1.125s] writing entry points to joint_control.egg-info/entry_points.txt +[1.125s] writing requirements to joint_control.egg-info/requires.txt +[1.126s] writing top-level names to joint_control.egg-info/top_level.txt +[1.132s] reading manifest file 'joint_control.egg-info/SOURCES.txt' +[1.134s] writing manifest file 'joint_control.egg-info/SOURCES.txt' +[1.136s] running build_ext +[1.136s] Creating /BA/workspace/install/joint_control/lib/python3.10/site-packages/joint-control.egg-link (link to .) +[1.138s] Installing cart_coords script to /BA/workspace/install/joint_control/lib/joint_control +[1.139s] Installing joint_control script to /BA/workspace/install/joint_control/lib/joint_control +[1.139s] Installing plugdata script to /BA/workspace/install/joint_control/lib/joint_control +[1.141s] Installing plugdata_cart script to /BA/workspace/install/joint_control/lib/joint_control +[1.142s] Installing plugdata_cart_fix script to /BA/workspace/install/joint_control/lib/joint_control +[1.142s] Installing plugdata_cart_smooth script to /BA/workspace/install/joint_control/lib/joint_control +[1.143s] Installing sandbox script to /BA/workspace/install/joint_control/lib/joint_control +[1.144s] Installing test script to /BA/workspace/install/joint_control/lib/joint_control +[1.144s] Installing trajectory_server script to /BA/workspace/install/joint_control/lib/joint_control +[1.145s] Installing trajectory_server_cart script to /BA/workspace/install/joint_control/lib/joint_control +[1.146s] Installing trajectory_server_cart_fast script to /BA/workspace/install/joint_control/lib/joint_control +[1.147s] Installing trajectory_server_cart_fast_max_acc script to /BA/workspace/install/joint_control/lib/joint_control +[1.147s] Installing trajectory_server_cart_fast_smooth script to /BA/workspace/install/joint_control/lib/joint_control +[1.148s] Installing trajectory_server_new script to /BA/workspace/install/joint_control/lib/joint_control +[1.150s] Installing trajectory_server_new_cart script to /BA/workspace/install/joint_control/lib/joint_control +[1.151s] Installing trajectory_server_trapezoidal script to /BA/workspace/install/joint_control/lib/joint_control +[1.152s] +[1.152s] Installed /BA/workspace/build/joint_control +[1.152s] running symlink_data +[1.173s] Invoked command in '/BA/workspace/build/joint_control' returned '0': PYTHONPATH=/BA/workspace/build/joint_control/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/BA/workspace/install/joint_control/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /BA/workspace/build/joint_control/build --no-deps symlink_data diff --git a/workspace/log/build_2025-05-08_20-39-10/logger_all.log b/workspace/log/build_2025-05-08_20-39-10/logger_all.log new file mode 100644 index 0000000..78a8e20 --- /dev/null +++ b/workspace/log/build_2025-05-08_20-39-10/logger_all.log @@ -0,0 +1,174 @@ +[0.101s] DEBUG:colcon:Command line arguments: ['/usr/bin/colcon', 'build', '--packages-select', 'joint_control', '--symlink-install'] +[0.102s] DEBUG:colcon:Parsed command line arguments: Namespace(log_base=None, log_level=None, verb_name='build', build_base='build', install_base='install', merge_install=False, symlink_install=True, test_result_base=None, continue_on_error=False, executor='parallel', parallel_workers=8, event_handlers=None, ignore_user_meta=False, metas=['./colcon.meta'], base_paths=['.'], packages_ignore=None, packages_ignore_regex=None, paths=None, packages_up_to=None, packages_up_to_regex=None, packages_above=None, packages_above_and_dependencies=None, packages_above_depth=None, packages_select_by_dep=None, packages_skip_by_dep=None, packages_skip_up_to=None, packages_select_build_failed=False, packages_skip_build_finished=False, packages_select_test_failures=False, packages_skip_test_passed=False, packages_select=['joint_control'], packages_skip=None, packages_select_regex=None, packages_skip_regex=None, packages_start=None, packages_end=None, cmake_args=None, cmake_target=None, cmake_target_skip_unavailable=False, cmake_clean_cache=False, cmake_clean_first=False, cmake_force_configure=False, ament_cmake_args=None, catkin_cmake_args=None, catkin_skip_building_tests=False, mixin_files=None, mixin=None, verb_parser=, verb_extension=, main=>, mixin_verb=('build',)) +[0.209s] Level 1:colcon.colcon_core.package_discovery:discover_packages(colcon_meta) check parameters +[0.210s] INFO:colcon.colcon_metadata.package_discovery.colcon_meta:Using configuration from '/root/.colcon/metadata/default/Gazebo.meta' +[0.210s] INFO:colcon.colcon_metadata.package_discovery.colcon_meta:Using configuration from '/root/.colcon/metadata/default/fastrtps.meta' +[0.210s] Level 1:colcon.colcon_core.package_discovery:discover_packages(recursive) check parameters +[0.210s] Level 1:colcon.colcon_core.package_discovery:discover_packages(ignore) check parameters +[0.210s] Level 1:colcon.colcon_core.package_discovery:discover_packages(path) check parameters +[0.210s] Level 1:colcon.colcon_core.package_discovery:discover_packages(colcon_meta) discover +[0.211s] Level 1:colcon.colcon_core.package_discovery:discover_packages(recursive) discover +[0.211s] INFO:colcon.colcon_core.package_discovery:Crawling recursively for packages in '/BA/workspace' +[0.211s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['ignore', 'ignore_ament_install'] +[0.211s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'ignore' +[0.211s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'ignore_ament_install' +[0.211s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['colcon_pkg'] +[0.212s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'colcon_pkg' +[0.212s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['colcon_meta'] +[0.212s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'colcon_meta' +[0.212s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['ros'] +[0.212s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'ros' +[0.220s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['cmake', 'python'] +[0.220s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'cmake' +[0.220s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'python' +[0.220s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extensions ['python_setup_py'] +[0.220s] Level 1:colcon.colcon_core.package_identification:_identify(.) by extension 'python_setup_py' +[0.220s] Level 1:colcon.colcon_core.package_identification:_identify(build) by extensions ['ignore', 'ignore_ament_install'] +[0.221s] Level 1:colcon.colcon_core.package_identification:_identify(build) by extension 'ignore' +[0.221s] Level 1:colcon.colcon_core.package_identification:_identify(build) ignored +[0.221s] Level 1:colcon.colcon_core.package_identification:_identify(install) by extensions ['ignore', 'ignore_ament_install'] +[0.221s] Level 1:colcon.colcon_core.package_identification:_identify(install) by extension 'ignore' +[0.221s] Level 1:colcon.colcon_core.package_identification:_identify(install) ignored +[0.222s] Level 1:colcon.colcon_core.package_identification:_identify(log) by extensions ['ignore', 'ignore_ament_install'] +[0.222s] Level 1:colcon.colcon_core.package_identification:_identify(log) by extension 'ignore' +[0.222s] Level 1:colcon.colcon_core.package_identification:_identify(log) ignored +[0.223s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['ignore', 'ignore_ament_install'] +[0.223s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'ignore' +[0.223s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'ignore_ament_install' +[0.223s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['colcon_pkg'] +[0.223s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'colcon_pkg' +[0.223s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['colcon_meta'] +[0.223s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'colcon_meta' +[0.223s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['ros'] +[0.223s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'ros' +[0.224s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['cmake', 'python'] +[0.224s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'cmake' +[0.224s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'python' +[0.224s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extensions ['python_setup_py'] +[0.224s] Level 1:colcon.colcon_core.package_identification:_identify(src) by extension 'python_setup_py' +[0.225s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_control) by extensions ['ignore', 'ignore_ament_install'] +[0.225s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_control) by extension 'ignore' +[0.225s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_control) by extension 'ignore_ament_install' +[0.225s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_control) by extensions ['colcon_pkg'] +[0.225s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_control) by extension 'colcon_pkg' +[0.225s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_control) by extensions ['colcon_meta'] +[0.225s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_control) by extension 'colcon_meta' +[0.225s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_control) by extensions ['ros'] +[0.225s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_control) by extension 'ros' +[0.230s] DEBUG:colcon.colcon_core.package_identification:Package 'src/joint_control' with type 'ros.ament_python' and name 'joint_control' +[0.231s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_info) by extensions ['ignore', 'ignore_ament_install'] +[0.231s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_info) by extension 'ignore' +[0.231s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_info) by extension 'ignore_ament_install' +[0.231s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_info) by extensions ['colcon_pkg'] +[0.232s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_info) by extension 'colcon_pkg' +[0.232s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_info) by extensions ['colcon_meta'] +[0.232s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_info) by extension 'colcon_meta' +[0.232s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_info) by extensions ['ros'] +[0.232s] Level 1:colcon.colcon_core.package_identification:_identify(src/joint_info) by extension 'ros' +[0.233s] DEBUG:colcon.colcon_core.package_identification:Package 'src/joint_info' with type 'ros.ament_python' and name 'joint_info' +[0.233s] Level 1:colcon.colcon_core.package_identification:_identify(src/mock_robot) by extensions ['ignore', 'ignore_ament_install'] +[0.233s] Level 1:colcon.colcon_core.package_identification:_identify(src/mock_robot) by extension 'ignore' +[0.234s] Level 1:colcon.colcon_core.package_identification:_identify(src/mock_robot) by extension 'ignore_ament_install' +[0.234s] Level 1:colcon.colcon_core.package_identification:_identify(src/mock_robot) by extensions ['colcon_pkg'] +[0.234s] Level 1:colcon.colcon_core.package_identification:_identify(src/mock_robot) by extension 'colcon_pkg' +[0.234s] Level 1:colcon.colcon_core.package_identification:_identify(src/mock_robot) by extensions ['colcon_meta'] +[0.234s] Level 1:colcon.colcon_core.package_identification:_identify(src/mock_robot) by extension 'colcon_meta' +[0.234s] Level 1:colcon.colcon_core.package_identification:_identify(src/mock_robot) by extensions ['ros'] +[0.234s] Level 1:colcon.colcon_core.package_identification:_identify(src/mock_robot) by extension 'ros' +[0.235s] DEBUG:colcon.colcon_core.package_identification:Package 'src/mock_robot' with type 'ros.ament_python' and name 'mock_robot' +[0.235s] Level 1:colcon.colcon_core.package_identification:_identify(src/osc_ros2) by extensions ['ignore', 'ignore_ament_install'] +[0.236s] Level 1:colcon.colcon_core.package_identification:_identify(src/osc_ros2) by extension 'ignore' +[0.236s] Level 1:colcon.colcon_core.package_identification:_identify(src/osc_ros2) by extension 'ignore_ament_install' +[0.236s] Level 1:colcon.colcon_core.package_identification:_identify(src/osc_ros2) by extensions ['colcon_pkg'] +[0.236s] Level 1:colcon.colcon_core.package_identification:_identify(src/osc_ros2) by extension 'colcon_pkg' +[0.236s] Level 1:colcon.colcon_core.package_identification:_identify(src/osc_ros2) by extensions ['colcon_meta'] +[0.236s] Level 1:colcon.colcon_core.package_identification:_identify(src/osc_ros2) by extension 'colcon_meta' +[0.236s] Level 1:colcon.colcon_core.package_identification:_identify(src/osc_ros2) by extensions ['ros'] +[0.236s] Level 1:colcon.colcon_core.package_identification:_identify(src/osc_ros2) by extension 'ros' +[0.237s] DEBUG:colcon.colcon_core.package_identification:Package 'src/osc_ros2' with type 'ros.ament_python' and name 'osc_ros2' +[0.237s] Level 1:colcon.colcon_core.package_identification:_identify(src/painting_robot_control) by extensions ['ignore', 'ignore_ament_install'] +[0.237s] Level 1:colcon.colcon_core.package_identification:_identify(src/painting_robot_control) by extension 'ignore' +[0.237s] Level 1:colcon.colcon_core.package_identification:_identify(src/painting_robot_control) by extension 'ignore_ament_install' +[0.238s] Level 1:colcon.colcon_core.package_identification:_identify(src/painting_robot_control) by extensions ['colcon_pkg'] +[0.238s] Level 1:colcon.colcon_core.package_identification:_identify(src/painting_robot_control) by extension 'colcon_pkg' +[0.238s] Level 1:colcon.colcon_core.package_identification:_identify(src/painting_robot_control) by extensions ['colcon_meta'] +[0.238s] Level 1:colcon.colcon_core.package_identification:_identify(src/painting_robot_control) by extension 'colcon_meta' +[0.238s] Level 1:colcon.colcon_core.package_identification:_identify(src/painting_robot_control) by extensions ['ros'] +[0.238s] Level 1:colcon.colcon_core.package_identification:_identify(src/painting_robot_control) by extension 'ros' +[0.239s] DEBUG:colcon.colcon_core.package_identification:Package 'src/painting_robot_control' with type 'ros.ament_python' and name 'painting_robot_control' +[0.239s] Level 1:colcon.colcon_core.package_discovery:discover_packages(recursive) using defaults +[0.239s] Level 1:colcon.colcon_core.package_discovery:discover_packages(ignore) discover +[0.239s] Level 1:colcon.colcon_core.package_discovery:discover_packages(ignore) using defaults +[0.239s] Level 1:colcon.colcon_core.package_discovery:discover_packages(path) discover +[0.239s] Level 1:colcon.colcon_core.package_discovery:discover_packages(path) using defaults +[0.256s] INFO:colcon.colcon_core.package_selection:Skipping not selected package 'joint_info' in 'src/joint_info' +[0.256s] INFO:colcon.colcon_core.package_selection:Skipping not selected package 'mock_robot' in 'src/mock_robot' +[0.256s] INFO:colcon.colcon_core.package_selection:Skipping not selected package 'osc_ros2' in 'src/osc_ros2' +[0.256s] INFO:colcon.colcon_core.package_selection:Skipping not selected package 'painting_robot_control' in 'src/painting_robot_control' +[0.257s] Level 5:colcon.colcon_core.verb:set package 'joint_control' build argument 'cmake_args' from command line to 'None' +[0.257s] Level 5:colcon.colcon_core.verb:set package 'joint_control' build argument 'cmake_target' from command line to 'None' +[0.257s] Level 5:colcon.colcon_core.verb:set package 'joint_control' build argument 'cmake_target_skip_unavailable' from command line to 'False' +[0.257s] Level 5:colcon.colcon_core.verb:set package 'joint_control' build argument 'cmake_clean_cache' from command line to 'False' +[0.257s] Level 5:colcon.colcon_core.verb:set package 'joint_control' build argument 'cmake_clean_first' from command line to 'False' +[0.257s] Level 5:colcon.colcon_core.verb:set package 'joint_control' build argument 'cmake_force_configure' from command line to 'False' +[0.257s] Level 5:colcon.colcon_core.verb:set package 'joint_control' build argument 'ament_cmake_args' from command line to 'None' +[0.257s] Level 5:colcon.colcon_core.verb:set package 'joint_control' build argument 'catkin_cmake_args' from command line to 'None' +[0.257s] Level 5:colcon.colcon_core.verb:set package 'joint_control' build argument 'catkin_skip_building_tests' from command line to 'False' +[0.257s] DEBUG:colcon.colcon_core.verb:Building package 'joint_control' with the following arguments: {'ament_cmake_args': None, 'build_base': '/BA/workspace/build/joint_control', 'catkin_cmake_args': None, 'catkin_skip_building_tests': False, 'cmake_args': None, 'cmake_clean_cache': False, 'cmake_clean_first': False, 'cmake_force_configure': False, 'cmake_target': None, 'cmake_target_skip_unavailable': False, 'install_base': '/BA/workspace/install/joint_control', 'merge_install': False, 'path': '/BA/workspace/src/joint_control', 'symlink_install': True, 'test_result_base': None} +[0.257s] INFO:colcon.colcon_core.executor:Executing jobs using 'parallel' executor +[0.260s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:run_until_complete +[0.261s] INFO:colcon.colcon_ros.task.ament_python.build:Building ROS package in '/BA/workspace/src/joint_control' with build type 'ament_python' +[0.261s] Level 1:colcon.colcon_core.shell:create_environment_hook('joint_control', 'ament_prefix_path') +[0.263s] INFO:colcon.colcon_core.plugin_system:Skipping extension 'colcon_core.shell.bat': Not used on non-Windows systems +[0.263s] INFO:colcon.colcon_core.shell:Creating environment hook '/BA/workspace/install/joint_control/share/joint_control/hook/ament_prefix_path.ps1' +[0.266s] INFO:colcon.colcon_core.shell:Creating environment descriptor '/BA/workspace/install/joint_control/share/joint_control/hook/ament_prefix_path.dsv' +[0.268s] INFO:colcon.colcon_core.shell:Creating environment hook '/BA/workspace/install/joint_control/share/joint_control/hook/ament_prefix_path.sh' +[0.269s] INFO:colcon.colcon_core.shell:Skip shell extension 'powershell' for command environment: Not usable outside of PowerShell +[0.269s] DEBUG:colcon.colcon_core.shell:Skip shell extension 'dsv' for command environment +[0.582s] INFO:colcon.colcon_core.task.python.build:Building Python package in '/BA/workspace/src/joint_control' +[0.583s] INFO:colcon.colcon_core.shell:Skip shell extension 'powershell' for command environment: Not usable outside of PowerShell +[0.583s] DEBUG:colcon.colcon_core.shell:Skip shell extension 'dsv' for command environment +[1.017s] DEBUG:colcon.colcon_core.event_handler.log_command:Invoking command in '/BA/workspace/build/joint_control': PYTHONPATH=/BA/workspace/build/joint_control/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/BA/workspace/install/joint_control/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /BA/workspace/build/joint_control/build --no-deps symlink_data +[1.437s] Level 1:colcon.colcon_core.shell:create_environment_hook('joint_control', 'pythonpath_develop') +[1.437s] INFO:colcon.colcon_core.shell:Creating environment hook '/BA/workspace/build/joint_control/share/joint_control/hook/pythonpath_develop.ps1' +[1.438s] DEBUG:colcon.colcon_core.event_handler.log_command:Invoked command in '/BA/workspace/build/joint_control' returned '0': PYTHONPATH=/BA/workspace/build/joint_control/prefix_override:/usr/lib/python3/dist-packages/colcon_core/task/python/colcon_distutils_commands:/BA/workspace/install/joint_control/lib/python3.10/site-packages:${PYTHONPATH} /usr/bin/python3 -W ignore:setup.py install is deprecated -W ignore:easy_install command is deprecated setup.py develop --editable --build-directory /BA/workspace/build/joint_control/build --no-deps symlink_data +[1.440s] INFO:colcon.colcon_core.shell:Creating environment descriptor '/BA/workspace/build/joint_control/share/joint_control/hook/pythonpath_develop.dsv' +[1.440s] INFO:colcon.colcon_core.shell:Creating environment hook '/BA/workspace/build/joint_control/share/joint_control/hook/pythonpath_develop.sh' +[1.451s] Level 1:colcon.colcon_core.environment:checking '/BA/workspace/install/joint_control' for CMake module files +[1.455s] Level 1:colcon.colcon_core.environment:checking '/BA/workspace/install/joint_control' for CMake config files +[1.459s] Level 1:colcon.colcon_core.environment:checking '/BA/workspace/install/joint_control/lib' +[1.459s] Level 1:colcon.colcon_core.environment:checking '/BA/workspace/install/joint_control/bin' +[1.459s] Level 1:colcon.colcon_core.environment:checking '/BA/workspace/install/joint_control/lib/pkgconfig/joint_control.pc' +[1.460s] Level 1:colcon.colcon_core.environment:checking '/BA/workspace/install/joint_control/lib/python3.10/site-packages' +[1.460s] Level 1:colcon.colcon_core.shell:create_environment_hook('joint_control', 'pythonpath') +[1.460s] INFO:colcon.colcon_core.shell:Creating environment hook '/BA/workspace/install/joint_control/share/joint_control/hook/pythonpath.ps1' +[1.461s] INFO:colcon.colcon_core.shell:Creating environment descriptor '/BA/workspace/install/joint_control/share/joint_control/hook/pythonpath.dsv' +[1.461s] INFO:colcon.colcon_core.shell:Creating environment hook '/BA/workspace/install/joint_control/share/joint_control/hook/pythonpath.sh' +[1.462s] Level 1:colcon.colcon_core.environment:checking '/BA/workspace/install/joint_control/bin' +[1.462s] Level 1:colcon.colcon_core.environment:create_environment_scripts_only(joint_control) +[1.462s] INFO:colcon.colcon_core.shell:Creating package script '/BA/workspace/install/joint_control/share/joint_control/package.ps1' +[1.463s] INFO:colcon.colcon_core.shell:Creating package descriptor '/BA/workspace/install/joint_control/share/joint_control/package.dsv' +[1.464s] INFO:colcon.colcon_core.shell:Creating package script '/BA/workspace/install/joint_control/share/joint_control/package.sh' +[1.465s] INFO:colcon.colcon_core.shell:Creating package script '/BA/workspace/install/joint_control/share/joint_control/package.bash' +[1.466s] INFO:colcon.colcon_core.shell:Creating package script '/BA/workspace/install/joint_control/share/joint_control/package.zsh' +[1.467s] Level 1:colcon.colcon_core.environment:create_file_with_runtime_dependencies(/BA/workspace/install/joint_control/share/colcon-core/packages/joint_control) +[1.467s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:closing loop +[1.467s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:loop closed +[1.468s] DEBUG:colcon.colcon_parallel_executor.executor.parallel:run_until_complete finished with '0' +[1.468s] DEBUG:colcon.colcon_core.event_reactor:joining thread +[1.473s] INFO:colcon.colcon_core.plugin_system:Skipping extension 'colcon_notification.desktop_notification.notify_send': Could not find 'notify-send' +[1.473s] INFO:colcon.colcon_core.plugin_system:Skipping extension 'colcon_notification.desktop_notification.terminal_notifier': Not used on non-Darwin systems +[1.473s] INFO:colcon.colcon_core.plugin_system:Skipping extension 'colcon_notification.desktop_notification.win32': Not used on non-Windows systems +[1.473s] INFO:colcon.colcon_notification.desktop_notification:Sending desktop notification using 'notify2' +[1.475s] DEBUG:colcon.colcon_notification.desktop_notification.notify2:Failed to initialize notify2: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11 +[1.475s] DEBUG:colcon.colcon_core.event_reactor:joined thread +[1.475s] INFO:colcon.colcon_core.shell:Creating prefix script '/BA/workspace/install/local_setup.ps1' +[1.476s] INFO:colcon.colcon_core.shell:Creating prefix util module '/BA/workspace/install/_local_setup_util_ps1.py' +[1.478s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/BA/workspace/install/setup.ps1' +[1.480s] INFO:colcon.colcon_core.shell:Creating prefix script '/BA/workspace/install/local_setup.sh' +[1.481s] INFO:colcon.colcon_core.shell:Creating prefix util module '/BA/workspace/install/_local_setup_util_sh.py' +[1.482s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/BA/workspace/install/setup.sh' +[1.484s] INFO:colcon.colcon_core.shell:Creating prefix script '/BA/workspace/install/local_setup.bash' +[1.484s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/BA/workspace/install/setup.bash' +[1.486s] INFO:colcon.colcon_core.shell:Creating prefix script '/BA/workspace/install/local_setup.zsh' +[1.487s] INFO:colcon.colcon_core.shell:Creating prefix chain script '/BA/workspace/install/setup.zsh' diff --git a/workspace/log/latest_build b/workspace/log/latest_build index 7e144df..745f2f9 120000 --- a/workspace/log/latest_build +++ b/workspace/log/latest_build @@ -1 +1 @@ -build_2025-05-08_11-12-16 \ No newline at end of file +build_2025-05-08_20-39-10 \ No newline at end of file diff --git a/workspace/src/joint_angles.py b/workspace/src/joint_angles.py index bfed20b..e67192b 100644 --- a/workspace/src/joint_angles.py +++ b/workspace/src/joint_angles.py @@ -12,15 +12,17 @@ def main(): #osc_udp_client("192.168.1.24", 8000, "osc_client") osc_udp_client("127.0.0.1", 8000, "osc_client") # Example joint positions to send - joint_positions1 = [0.4,0.3, 0.5, 0.0, 0.0, 0.0]#, 6.0] - joint_positions2 = [0.4,-0.4, 0.6, 0.0,0.0, 0.0] - joint_positions3 = [-0.4,-0.4, 0.6, 0.0, 0.0, 0.0]#, 6.0] - joint_positions4 = [-0.4,0.4, 0.6, 0.0, 0.0, 0.0]#, 6.0] - joint_positions5 = [0.4,0.4, 0.6, 0.0, 0.0, 0.0]#, 6.0] + joint_positions1 = [0.4,0.4, 1.0, 0.0, 0.0, 0.0, 3] + joint_positions2 = [0.4,-0.4, 0.2, 0.0,0.0, 0.0] + joint_positions3 = [0.4,-0.4, 0.6, 0.0, 0.0, 0.0]#, 6.0] + joint_positions4 = [0.4,0.4, 0.6, 0.0, 0.0, 0.0]#, 6.0] + joint_positions5 = [0.4,0.4, 0.2, 0.0, 0.0, 0.0]#, 6.0] msg = oscbuildparse.OSCMessage("/tcp_coordinates", None, joint_positions1) osc_send(msg, "osc_client") osc_process() + print(time.time()) + print(joint_positions1) print("Sending joint positions") ''' time.sleep(2) diff --git a/workspace/src/joint_control/joint_control/__pycache__/__init__.cpython-310.pyc b/workspace/src/joint_control/joint_control/__pycache__/__init__.cpython-310.pyc index df464e88294843cb7044286ef4d89a681de14cc6..b4e5f979bf941cf0b1dfe2e6c3832d14da2b1630 100644 GIT binary patch delta 38 scmeBUoWaPG&&$ij00dKS-Ax10K*jvX#fBK delta 28 icmbQi*vH6|&&$ij00hOC1T!Y`ShE=FmlsbAbp`-ecm~w~ diff --git a/workspace/src/joint_control/joint_control/__pycache__/trajectory_server_new.cpython-310.pyc b/workspace/src/joint_control/joint_control/__pycache__/trajectory_server_new.cpython-310.pyc index b598f5bcaf06bf45bfbbb9ef70072c357355d326..fc40316c5cf4870dfa700581b0d3f9d4ae94eeec 100644 GIT binary patch delta 37 ocmZoS?>6Vn=jG*M00KdA*^JbUyz=~<>9b~nz)AbfhWueX0I3)Xg8%>k delta 44 ucmeA+Z#U=7=jG*M00Idn&Wz-Zyz=}!MPfj15jTi%o_tnRd~-0r1rGqXYY3(Q diff --git a/workspace/src/joint_control/joint_control/trajectory_server_new.py b/workspace/src/joint_control/joint_control/trajectory_server_new.py index bcdeb07..200dedd 100644 --- a/workspace/src/joint_control/joint_control/trajectory_server_new.py +++ b/workspace/src/joint_control/joint_control/trajectory_server_new.py @@ -81,7 +81,7 @@ class ScaledJointTrajectoryPublisher(Node): dt = 0.01 tacc = 0.5 print(f'length viapoints: {len(viapoints)}') - traj = rtb.mstraj(np.array(viapoints), q0 = self.current_joint_positions ,dt=dt, tacc=tacc, qdmax=[1 * i for i in self.joint_velocity_limits]) + traj = rtb.mstraj(np.array(viapoints), q0 = self.current_joint_positions ,dt=dt, tacc=tacc, qdmax=[0.2 * i for i in self.joint_velocity_limits]) print(len(traj.q)) print(len(traj.t)) print(traj.t) diff --git a/workspace/src/osc_ros2/osc_ros2/__pycache__/osc_ros2.cpython-310.pyc b/workspace/src/osc_ros2/osc_ros2/__pycache__/osc_ros2.cpython-310.pyc index a3475762f38e335a630aafd4fdb201ef4db02603..84b75c0f7a5b1c3a788a49d67bea6025708fcc76 100644 GIT binary patch delta 8035 zcmbtZd2pOXcK`bO=J@8&eOs2S%Q}2WmW{D3+iPqv24ndWw(&WP)nhR_X5^mF7E-=p zOk}cF?Xn1(%`Ol-BQ|@OEL4a%mMpkjsY6Auu}>H)m%8y&Rxf{H zJj}}EsADC2MqYCCw(t^g`*>-{e@f?Ny!^c5NCB_lmB1GAR$k3(&NEr$Y+lmDn}I6_ zX9YN0_)>6Iepz#9N2>a?jy8F_Gt8cvoprid>wso!fm)9?vD9+$ib=*aYq6#C%1JiK z;x6089kA>hGUcjGe1|WJyCV*(&US<5KBPqo9GX=>{sX4bALMIE{;+oXfidlK8W$^# zrfn*XKju|&6B5;GM4i_`qsR6rT8h`lJ!%{eVYB0uk6-)TKrhJ)?z+ThydmyY0$vDs zAy7z$O|$WmoJ3>Bv|o;CwlQr8+oNHcO_MBX%xK9aGg{nd`*`z^KCO#IF#c`jHsWao zPs5CMi#EyNsz%-hcM`rmi%%#*6Yt0nmSqVF-)yzm+8~DK%ZH3<77MCA2A4{6^|R1&jTwQbZwInu`W~ zyfPOJ>xlEP7GY!L8_?BCXIo7yM} zB5EzQT4ay6)@V(($-BIbWv%2|yQoHcLgSk-^NPV%`Bm>7TfS?TV&Lyu?RLo|11z0n za4cb5d@C7>NYGFB+9kk!V3*j%Sv^C*i+5$EuQ@>hTxOSL0{D%zt}N#!Em90xdV+64 z>vqzbHx>Q#a}o15Wnh&d*4m|6Ej1d(GsH?Y>09km%wh*<2oJkR{=io>&jv#*PR}IE zk!OP;T4BR&pR?hU1#BoLKLv>YcC<<}-rJb=Ue*t3e>#*yclsNh_0z_9SdRLuI(EZx zJ0pH93QgV+XXZ`%#>hA+oi<`0%Rlq4sf80WiIv zS3uuuHcNKc6*F+>v~l`Hd9Yv!xgn$FeKp#hG*M8$he;gBwC_g}K!Qb-Ewh$SQu173 zn@E2LCk@qh*=~MFwO8`HY%f2o+MWCe?Cr8v4R-UR4-#i5KL*U|e9TFH9H=!w-9YFn zEysES__g`0JOIp%^DuVp(!5LioKoxH!I z%-e&er0zy}sp9k(^E{g6SvGsB@)^_pz5ztX*4fG>ZOmi#M@L425gwD98ji9XjF^3=jFi%-c?(!XEf=mC^nk=qCrC+QlSI0+}unT5h7rj*}iQ|>TyH$ zGN-`l-UjlJHYJCmJH&nN?7%CR9|l3CzPz}+fK+jA?wS@ zKBZ(;KSPC&NOs7Gy_~S&LSm(k?L^y4ZSk|*%zd_jS^I4VV1exfEKG|ltddm}C5cwi z#RBpVFSZTncG}3ml#vJEn}DB}02ZWuhsv^WdKVk_GL(!=n*d2UyNH+CzHI(GgyI5g z=ey5GIV;^7L$Q%FuS^X_`K)}mys~P^g0ZfW)qN_~rMLU!f;?(J+@ISImt}Wjm3+Qi zRy=}e6u@hufWRhziT#Rdtxok6r=$NUk?tX&wu#y`xxFHSAf$|u;JpChh&V}n{j^^i z)qe4-{gN_8D9EiaHr3aO;RXWT^6528(rKhr05JwbV#m-h4V_ia{%Xy;2HPgDuBw** zv2Gb#FBh+0rY3t?O+@Zpe{}WtNsrq63Or5SXL7h2YEdfqQzb#YTjkH!SFug<{+;11eBd>zG|v_ zfqPPZw&}qJ$~<%${F>5^2eFks57O!PVVnom^2N;+MSlmAe(eC0&b(}*O`h9XEkE2` zl=!zb>ht=Rej;W+9yHwes)Obd8g@ECnOwK^0liPN2xHhrwN{SnZ7ot&++iWP;cIZf zL5J;_L5|@_a&c#tLU^AB9XVPe?gG(C>TO54R*j4pcLU?XrgPh_Q&17dEz#C(GwGhu zYPAg-Zi*}kT$+;f%+S7Z>{c;77vddWaU6E1^vGz+=#R!y=5RO?8^y_&(nrH7M>GRBWaJ zoG~jXtdtRo@RWmy^1iKW>iz-lj+KLM>Lx2^i`ZgT%8K=3IN#LePquD1TjAenV*}2(3kXE-ekcA*9G%}e*mt}A9~P5i(~8M zSnDar1qXKzX<~@G<@4K?Buwr(Z(4;H9FvTWt+?T#W6$Ky8anzuK%y(UKoe6K?w!G* zW)*WE<>SnCFe5w7jyEFpJGmbYd5*>(EI|&29<=F5D5Yl-Ui6?dQZPqNfb7aA#@#5H z4IF8Px*dLxSd(SI`D-Y`Fz3N?Mb~jmylb0-F8D`(K<9W%Q9~)}kR!ry1Q0LeuttXX zbV1$($V0e4^5Sh|XGK;u=3bsBU}TgldRlpgKcgP}sQh!r%<<3HUzw->7R8^j-kljh zG2{(UnYAAS9LpPEjz4dJI6@&=WqW4mg&~Tit48rq!%O7MEfonY3$O`mQQDVSYS-yY zR_!ECw>g~c3oOQYjprBJH&_>_r*^tut?^O{AcbFIv%!XBqwP~w&^(Q~QOnYcKS;NO za@$ByB+w>6x8fqU30(>XQ69mFCQ^q&DsAFF1*$GC)aCji)h(yIm${7?QI4(j&euqFU@i@anfnB}gPHKBj4TU42KyY|i zRneK+nQn(-5;aJETO(=!Q*cpXT&cXNf@w5RopSgYmN_AGLJ zS+UD!_T1t66haes%j`8>iyG`yN&Aaz zKI$uEyQt#c-BBp00vFE{xQk?sfsmDQ4u{T$hSPCK8U=2hn!wASCLGFM!gWz=5w%{F zI}fa2SLE1%Rj!`^fo=Enf%;waI3&&zun3$caE1WAX9&8V2`2%%WTZWk4r z=#r%emmh3GGqwW2)EvyOYY8o3R-^7MG!6WjW_{subD7s+76ad6I`FrovRsfqgH9CvQ%Xf7okTY;_H^&RDMm*lO@Fu?WLF1v#@gl1!*=!e~qARwG zlPv=pZ+%i7;EJy;!&ftp&p)^nsosp^!l7bZB6X$yXZh)orA-@vo-jMRy3{MI zy161;!y{p9xA+Szs<>(P=A*T&^f78vrs`nnIG($Fe@OY_arxk}9qf(6S?)g` zIP@iwXaSfg?CioO4+Vy!1D*Y`vne*#!BXx>Xbjmn)ZtEfa#=p}>_C!qLWmCtTqB^) z4i@ZamoFc$W&!!e@dG_HC0yOY5uSekq-&k{DFII41Oa+%O?hIY;Ya{C#!&jqctP?L z>lz)=(NF|;OjzU^6Jb0hrp)wjbW9wDoP7MmB0S(ee`2+d+$0_%g+20DC)(DhOo#;Bq|stPD0+n{-Joq7;(;GdoNU^RNF8TEM*U delta 7988 zcmbt3X>eP|d2io)03Hs4_W@F*9!XIoB$DEx`?3_vqIEGkEsHupkPA`(Nq|~BN+SJW zB&IwS+sLN7vXjP=0@{{aP24ytBiqR|lW99ul4;|acE(NzR$R~2BiF5+WRm{K;adH^ z#X(S_T&IQRecb)7-Tn6azWsLf(chEXe@onvygY{lzsH_kbh7KxGwwy?{b!b6>*$iG zojT4*)De&;m7Z$oJE;r$F43={dDMMQ>RBAnY5tJRMgxmy-Q@R#6my624yoq1m1js1 zKdZKom-)-;o+Sb2fJ_T%(K)rpMT=<($mY={w2YRYBRy_fK|SXrUT&!`F9?(XXC18v z&eA`URH>)zfaGo9M=U`yJ^ObS8`163M1x_arIUn6MwKDcvPm*YVph{iRhY{~{!43B z{6$(BvxQY-k!b^(?XVQiQzfH%{05QmAIMjs{1NHY6KAA*G%gYvHB%EBe?-e;8c0-# z5oKBp8ttZC(0)p5Vsk6O=n2t>>CEfHL{fbg0IM|PWDiTz z8DCGaT4z8{Afx6aKNdMm`PT4@_7(4Uts%jteQ4wuvKzyUISD#u)=3l!b~qj!Q0 zGaHj<=826V?4xiov{%9=5%wDxXBFzD{B?U#`MV%0GZpr}D7*jicrky^UVfxDTm^fJ zVlr!{V9G&R>|~}@o5j_It)O-_ss-a03m;jVGZnY#7E@8!u(8Cb=X)JhN<(5P4?Aj$ z8_;rQzDIgqq8njhrJ)A?f@9YMFPTL!?n_3aSvW}m7EKbc8)B?4?B95^v%V1hv)C+7`{zF!jl9?C*?J2!JcJr@W-Xt(9@bK0Wi)M+U=iq3vjJIOdmU-Rg|{ChLi;|Yss-m zudDW<>S<+sARC)IahxMkn4CdN?1HZ=>;g;Ujwy`ITU}>(97mZ}qQBxdU7b~6ne>ia z4j(d0Fp|@9AMujBHMQ8^C-mG5JIqqh_ohh_O=jr~?y+*}JA62AaePk8Z86$GoDop3 z!m19X+mA!wLQ(|J@fyn}G2tyYHAq>HOe&&nHEr~;XgAYGO$R+9+AXvP=G$tl2({6p z7m%}s9s^8!F6J0L4ycY?6g>f$&UqLgU{=n<^a5s84knXN8zF-Hm~UaStNE}yXj_w5 zYphAE0m{KBz>o+ynC~De)qRyiPOsk;Sawr?A9mZc>g-K-7 zj0}+|!MSpBmgRqgxIXy$pW*Mv4{V>Hytc5H|FTk@{c_=`k~a-UDNgG-`Z5cU#WeHZ?B7!_55btKHCxyjDAXZO?@v<)GwWVx&C1S=kPC< ztN`}fhUK$=)9@H6?ML-%5F9};j$nfCYpnOguzA-?48X1B7aBvWu90p*ye6|!WJKfK z&CLL}ourMXl8NQQXx*EwysN3XMOZ|vP7J~qP%sL(9iV_+oJ}-oq+ZPKDP&xTI|_u| zv;W||D%X7GRy@j|Y7TWgn;q{nnR{^f=YV(O0I#hr=UZE%&I>3CcxgfxxVKxLhzmOw zBViGO>`asPKzM8{_TTB?=L#T~;to4~y7?saP||HG9;sW%{N(DaYW*1F9ocIj})P%k;BU zdsg*VbM>MrH~^ld{GFCzNvz+3IjQ^vM&l*(N9ysYA8FT zL~od2FXR+$71~a0v$sqso?f}jlws9*rUKAyssQs-;sPs#1x1KLtKf1T+J_dJGALI~ ziwSAk)COVoJ|`^#=t|iR3dTGr7$HH&97LKZOxxN`i$$K?C=%siIHh3k9FIFN)umcz z;MB@)OogI|Z)tp%noCa%tt~4V1IlK-nz9{FC;bpI7v;tmrlV*PR~zV2jSL zcbqEC#u>|l$*@fTCiV-Cy`BH!%V$-H6+tDUZ+_shUZ5tG5&u~L!7%e9b030*g3mb@ zd~6jmb@1m_E?%0Aubl8g>tOUpk3mC|H6qWxv+}m0J_ubfSSe4gT}IY%%erOxnD}4J zE^cEw{gv{8b*(%99M#OF*T2B-wJc5qGKyc#h%*e}30w1k_=)tBHVc1u-MgN(Sy7=g zD}RH(wSGg(U(ToAkNGtm>|1=(hK|oG@p?+)(uU5@EAd83;*$+$$Wd-=^pdahD;tkj zpM)7Et$~4o2s7B%aJqXCh&=il)xuAjmk7}Z?0Dw>>kR3HDoARK1 z0B&NYTp~e+kSQ_M5~)IpSq$JZl@iFA;`*roe}h2`IiXPCHpz@KNk9@bnN}eI$uI=8 zI7BxjQEIuM!p#y;(1&<0m!K?5VeM%w;$+~p3SI}ORCn@^u0U9vKe`bd2}BM5$Y@jtGwXicVE)lSd?FI0{$c%eU^vnrG{*H&78wW*2U;Cj z4SW5}KN5fwEV@36L*-#Onc#ei>P-N>>-B>X0~En|*B4-VWB~Pt0{upWfl|TPI#1j{ zc3+&1!RZL6o8B}q9Py)`Z5a&eI2q6f#)gOWk%(YA8V&SE!Zdn(zAk@%e_+@*!2JF5 zRc+5;(yGLm!V-FPG!Qm)e;g&zK*8{!?hjL)2Idg+2gz9U?!Vgt1OBmLLk~vvw$=`? zMr)w8S?_3T(8aWx_0`bqXJf%=AcYn~cvA+BqqhA4V~mCGGVgFOYM>c~S-`sUw=dxD zKbbPCzJN_cwj2c46+e+KwtGoZ3xuiIii2JY!vw|_H33Y@;nAcv91KTC{r!QY6D-^h z6-yXCuS=xHq!#A-mWu7}`G!u)h9AEEq%G_d6yWovR+_XK8I+NO5=-YjTRIzl3{D!Y zgwZv(Ml{7mT#81Dh>H}-Wu%N0Kx&=vik$g_Ep73)At0xfiCu;?DaGJ^5F#e=K`@E> z0D=rK>I?~4jww@?Dch72`dMtkIwJvIo|2}p^0!f$Do@HD>6mrOI;Bmyrj#i%UkBOeIQX$mH%+-;<$xc&uK>9c{Noz zLGgh@**tI~XE))bb)UzILSSZ~y2x-&ljC~KVp^yM8RG&D7s`kHVi9i~C{cjVZ`66g z63&}PwdT@dwm9SqSQD0UFyNPvHBksS%>z@8VbxS5=q@Nseqd@L3s}MRq)fE|kjhYp z)G&c61$jY^BJW!Z@&a`TF1|GH3n*I*n&T<z9cho z;9r!(ucq}2dOT-QoazfKv7tjYNIbsH=Uo zP&K;X7?Kiou*!P)mdwDR6l(A-1x1bUz(DThrdrGePfBUm28Z33aagd$`yhud8~;D} zY>vw+4E_1OE(3ERYPvOxq z{u2=fcSV8efB{;oMevxeHR5l~^@qj=sQ*cJdH0Ek_}w9aLi1umVXL!B{@*bH_pTN2 z7#MbU<*JDU->iT0cu3EmTa%dhU}vV3?4eq7nvO1fv; zcQ%r?cBTN4iH8YsQ+ge{`w_f>;JXOKg-8?wZ}JPfJXVUxTm1U2s>)t$`VrvODXI9w zyK}Che~;^XYMMXB(%=OURb?yDhzjLE1*s%$vWv75ms&*JkWa}X zetOS$?_c!ybeB8(;MF5l^f!s3|6+IT{RQ6ZuCfM%04HDEWql7O0hiAGU%XNSnG>pO z*mvuA1a=)#uefd7ActyH61!ytdG_3EeCY+D)%2~Cr`}s18(Bp2AthqH?zZE_HF*^!BVgA z2h_me2$a}wvGqFy;tJM)IIP{+U-6F*Hk0Rg<)Jn!UZlL`eD9%}E_^9u_yEZ85s%^9 zoOqZLj|9tR;&1aG z9c>^h_|K14S#Kb6>umn9Dzf5PY~z-DNvdF9n?c-_0e*;1`y4-Vyo)@~XO5d>Gp{+} zTk-(1FG2bGq=oelkB%qRU^r;79Z1-T-~|8p#G&;#&7?XI4Aazm@Ma*P!;GW?{5W#r ze-9_^(a~Vo2RDR3Dz9AUrf*H97Ckv;(8!r^GA|PC_rYZmUS071;O4*ZbvRd`!+ZsG zwDIQNMn2kGYQ2K4`vU)y-g7H=s|vUw)c*1v`HrS)#6jdw@NvaKv`^u7Kv*|UPxJXk z{4luBTg%${kpDah^Z)X%IKBpn7Pxqhj 0.9995: + # Linear interpolation + normalization + q_interp_array = (1 - alpha) * q0_array + alpha * q1_array + q_interp_array = q_interp_array / np.linalg.norm(q_interp_array) + q_interp = sm.UnitQuaternion(q_interp_array) + else: + q_interp = q0.interp(q1, alpha) + + # Interpolate translation + pos_interp = [ + x + (x1 - x) * alpha, + y + (y1 - y) * alpha, + z + (z1 - z) * alpha + ] + + # Compose SE3 transform + cart_traj.append(sm.SE3(pos_interp) * q_interp.SE3())''' + + if self.desired[-1]: - timestamps = self.trapezoidal_timestamps(steps, self.desired[-1]) + timestamps = self.trapezoidal_timestamps(steps, self.desired[-1], 0.8) + print(f'timestamps: {timestamps}') for j in range(steps): sol = self.robot.ik_LM(cart_traj[j], q0=self.current_joint_positions, mask = self.cost_mask, joint_limits = True, method = 'chan') if j == 0 else self.robot.ik_LM(cart_traj[j], q0=prev_sol, mask = self.cost_mask, joint_limits = True, method = 'chan') if sol[1] == 1: @@ -553,12 +586,12 @@ class OSC_ROS2_interface(Node): else: prev_duration = 0 ''' - if self.prev_pose == None: + if self.previous_desired == None: [x,y,z] = self.robot.fkine(self.current_joint_positions).t [roll, pitch, yaw] = self.robot.fkine(self.current_joint_positions).rpy() else: - [x,y,z] = self.prev_pose[:3] - [roll, pitch, yaw] = self.prev_pose[3:] + [x,y,z] = self.previous_desired[:3] + [roll, pitch, yaw] = self.previous_desired[3:] ''' for j in range(steps): sol = self.robot.ik_LM(cart_traj[j], q0=self.current_joint_positions, mask = self.cost_mask, joint_limits = True, method = 'chan') if j == 0 else self.robot.ik_LM(cart_traj[j], q0=prev_sol, mask = self.cost_mask, joint_limits = True, method = 'chan') @@ -609,32 +642,41 @@ class OSC_ROS2_interface(Node): def send_joint_trajectory(self): pass + self.previous_desired = None def send_cartesian_trajectory(self): pass + self.previous_desired = None def update_position(self): """Calls the appropriate function to update the robot's position.""" try: if self.desired is None or not(self.new): return - + start_time = time.time() + if self.desired[0] == "joint_positions": self.new = False self.send_joint_positions() - return + #return elif self.desired[0] == "tcp_coordinates": self.new = False self.send_tcp_coordinates() - return + #return elif self.desired[0] == "joint_trajectory": self.new = False self.send_joint_trajectory() - return + #return elif self.desired[0] == "cartesian_trajectory": self.new = False self.send_cartesian_trajectory() + #return + else: + self.get_logger().warn(f"update_position: Unknown desired type '{self.desired[0]}'.") return + self.latency.append(time.time()-start_time) + + except Exception as e: self.get_logger().fatal(f'update_position: {e}') @@ -746,6 +788,7 @@ def main(): break print("Invalid input. Please enter 'y' or 'n'.") + node = OSC_ROS2_interface(joint_names, joint_velocity_limits, robot, cost_mask) # Run ROS 2 spin, and osc_process will be handled by the timer @@ -754,6 +797,17 @@ def main(): except KeyboardInterrupt: print("") finally: + file_path = "./latency_log.csv" + + # If file doesn't exist, create with header + if not os.path.exists(file_path): + with open(file_path, mode='w', newline='') as f: + writer = csv.writer(f) + writer.writerow('latency') + with open(file_path, mode='a', newline='') as f: + writer = csv.writer(f) + for i in node.latency: + writer.writerow([i]) node.destroy_node() rclpy.shutdown() osc_terminate() diff --git a/workspace/src/osc_ros2/osc_ros2/osc_ros2_latency.py b/workspace/src/osc_ros2/osc_ros2/osc_ros2_latency.py new file mode 100644 index 0000000..135e32c --- /dev/null +++ b/workspace/src/osc_ros2/osc_ros2/osc_ros2_latency.py @@ -0,0 +1,770 @@ +import rclpy +from rclpy.node import Node +from trajectory_msgs.msg import JointTrajectory, JointTrajectoryPoint +from sensor_msgs.msg import JointState +from rcl_interfaces.msg import Log +from osc4py3.as_allthreads import * +from osc4py3 import oscmethod as osm +import xml.etree.ElementTree as ET +import numpy as np +import spatialmath as sm +import roboticstoolbox as rtb +from osc4py3 import oscbuildparse +import time +import os +import re +import socket +import csv + +class JointNameListener(Node): + def __init__(self): + super().__init__('joint_name_listener') + self.subscription = self.create_subscription( + JointState, + '/joint_states', + self.joint_state_callback, + 1 + ) + self.joint_names = None + + def joint_state_callback(self, msg: JointState): + print("Joint names received from JointState message:") + self.joint_names = list(msg.name) + +class OSC_ROS2_interface(Node): + """Node to publish joint trajectories based on OSC messages.""" + + def __init__(self, joint_names, joint_velocity_limits, robot, cost_mask): + super().__init__('scaled_joint_trajectory_publisher') + + while True: + try: + self.trajectory_topic_name = input("Enter the topic name to which the joint trajectory should be sent (press Enter for default: '/scaled_joint_trajectory_controller/joint_trajectory'): ").strip() + if self.trajectory_topic_name == "": + self.trajectory_topic_name = '/scaled_joint_trajectory_controller/joint_trajectory' + break + elif self.trajectory_topic_name.startswith("/"): + break + else: + print("Invalid topic name. A valid topic name should start with '/'.") + except Exception as e: + print(f"An error occurred: {e}") + + + + # ROS2 Publisher + self.publisher = self.create_publisher( + JointTrajectory, + self.trajectory_topic_name, + 1 + ) + + self.subscription = self.create_subscription( + JointState, + '/joint_states', + self.joint_states_callback, + 1 + ) + + self.subscription = self.create_subscription( + Log, + '/rosout', + self.log_callback, + 100 + ) + + # Store received joint positions + self.current_joint_positions = None + self.joint_names = joint_names + self.joint_velocity_limits = joint_velocity_limits + self.cost_mask = cost_mask + self.robot = robot + self.desired = None + self.previous_desired = None + self.log_dict = { + 10: "DEBUG", + 20: "INFO", + 30: "WARN", + 40: "ERROR", + 50: "FATAL", + } + self.speed_scaling = 0.2 + self.new = False + + + self.latency = [] + self.time1 = None + + while True: + try: + print('+-' * 50) + log_ip = str(input("Enter the target IP on which you want to recieve the log as OSC Messages (or press Enter for default: '127.0.0.1'): ")) + if log_ip == "": + log_ip = "127.0.0.1" + print('--' * 50) + log_port = input("Enter the target port for the log messages (or press Enter for default: 5005): ") + if log_port == "": + log_port = 5005 + else: + log_port = int(log_port) + break + except ValueError: + print("Invalid input. Please enter a valid IP address.") + continue + while True: + try: + print('+-' * 50) + state_ip = str(input("Enter the target IP on which you want to recieve the joint states as OSC Messages (or press Enter for default: '127.0.0.1'): ")) + if state_ip == "": + state_ip = "127.0.0.1" + print('--' * 50) + state_port = input("Enter the target port for the log messages (or press Enter for default: 7000): ") + if state_port == "": + state_port = 7000 + else: + state_port = int(state_port) + break + except ValueError: + print("Invalid input. Please enter a valid IP address.") + continue + while True: + try: + print('+-' * 50) + commands_port = input("Enter the port you want to send your commands to (or press Enter for default: 8000): ") + if commands_port == "": + commands_port = 8000 + else: + commands_port = int(commands_port) + break + except ValueError: + print("Invalid input. Please enter a valid port.") + continue + if robot: + while True: + set_limits = input("Do you want to set limit for x, y and z? (y/n): ").strip().lower() + if set_limits == 'y': + while True: + try: + self.x_limits = [float(i) if i != 'x' else None for i in input("Enter the lower and upper limits for x (space-separated, enter 'x' for no limit): ").split()] + self.y_limits = [float(i) if i != 'x' else None for i in input("Enter the lower and upper limits for y (space-separated, enter 'x' for no limit): ").split()] + self.z_limits = [float(i) if i != 'x' else None for i in input("Enter the lower and upper limits for z (space-separated, enter 'x' for no limit): ").split()] + + if len(self.x_limits) != 2 or len(self.y_limits) != 2 or len(self.z_limits) != 2: + print("Invalid input. Please enter exactly two values (or leave blank) for each limit.") + continue + + if (self.x_limits[0] is not None and self.x_limits[1] is not None and self.x_limits[0] >= self.x_limits[1]) or \ + (self.y_limits[0] is not None and self.y_limits[1] is not None and self.y_limits[0] >= self.y_limits[1]) or \ + (self.z_limits[0] is not None and self.z_limits[1] is not None and self.z_limits[0] >= self.z_limits[1]): + print("Invalid input. Lower limit must be less than upper limit for each axis.") + continue + + print(f"Current limits:") + print(f"x: {self.x_limits}") + print(f"y: {self.y_limits}") + print(f"z: {self.z_limits}") + con = True + while con: + confirm = input("Do you want your robot to move in this range? (y/n): ").strip().lower() + if confirm == 'y': + break + elif confirm == 'n': + print("Please re-enter the limits.") + con = False + else: + print("Invalid input. Please enter 'y' or 'n'.") + if con: break + except ValueError: + print("Invalid input. Please enter numeric values only.") + break + elif set_limits == 'n': + self.x_limits = [None, None] + self.y_limits = [None, None] + self.z_limits = [None, None] + break + print("Invalid input. Please enter 'y' or 'n'.") + # Ask the user if they want to set new joint limits + while True: + update_limits = input("Do you want to set new joint limits? (y/n): ").strip().lower() + if update_limits == 'y': + for i in range(len(self.joint_names)): + while True: + try: + lim = self.robot.qlim.copy() + # Find the link corresponding to the joint name + print("-" * 50) + print(f"Current position limits for joint '{self.joint_names[i]}': [{self.robot.qlim[0][i]} {self.robot.qlim[1][i]}] rad") + lower_limit = input(f"Enter the new lower limit for joint '{self.joint_names[i]}' (or press Enter to keep current): ").strip() + upper_limit = input(f"Enter the new upper limit for joint '{self.joint_names[i]}' (or press Enter to keep current): ").strip() + + if lower_limit and upper_limit and float(lower_limit) >= float(upper_limit): + print("Invalid input. Lower limit must be less than upper limit.") + continue + + if lower_limit: + if lower_limit self.robot.qlim[1][i]: + desired_joint_positions[i] = self.robot.qlim[1][i] + self.get_logger().warn( + f"joint_positions_handler:Joint '{self.joint_names[i]}' position {position} is out of bounds. Using {self.robot.qlim[1][i]}." + ) + + self.desired = ["joint_positions"] + desired_joint_positions + self.new = True + except Exception as e: + self.get_logger().fatal(f"joint_positions_handler: {e}") + return + + def tcp_coordinates_handler(self, *args): + # Ensure the desired joint positions are within the specified limits + """Handles incoming OSC messages for TCP coordinates.""" + print(args) + recv_time = args[-1] + if self.robot: + try: + if len(args) == 6: + x, y, z, r, p, yaw = [float(i) for i in list(args)] + duration = None + elif len(args) >= 7: + x, y, z, r, p, yaw, duration, *_ = [float(i) for i in list(args)] + else: + self.get_logger().warn(f"tcp_coordinates_handler: Invalid number of arguments for TCP coordinates. Expected 6 ([x, y, z, roll, pitch, yaw]) or 7 ([x, y, z, roll, pitch, yaw, duration]), but got {len(args)}.") + return + + if self.x_limits[0] is not None: + x = max(self.x_limits[0], x) + if self.x_limits[1] is not None: + x = min(self.x_limits[1], x) + if self.y_limits[0] is not None: + y = max(self.y_limits[0], y) + if self.y_limits[1] is not None: + y = min(self.y_limits[1], y) + if self.z_limits[0] is not None: + z = max(self.z_limits[0], z) + if self.z_limits[1] is not None: + z = min(self.z_limits[1], z) + + if x != args[0] or y != args[1] or z != args[2]: + self.get_logger().warn( + f"tcp_coordinates_handler: Desired joint positions adjusted to fit within limits: " + f"x={x}, y={y}, z={z} (original: x={args[0]}, y={args[1]}, z={args[2]})" + ) + + self.desired = ["tcp_coordinates", x, y, z, r, p, yaw, duration, recv_time] + self.new = True + except Exception as e: + self.get_logger().fatal(f"tcp_coordinates_handler: {e}") + else: + self.get_logger().warn("tcp_coordinates_handler: No robot model provided. Cannot handle TCP coordinates.") + return + + + def joint_states_callback(self, msg: JointState): + """Callback function to handle incoming joint states.""" + try: + msg_time = oscbuildparse.OSCMessage(f"/time", ',s', [str(time.time())]) + osc_send(msg_time, "osc_client") + if not(self.joint_names): self.joint_names = msg.name + joint_position_dict = dict(zip(msg.name, msg.position)) + self.current_joint_positions = [joint_position_dict[name] for name in self.joint_names] + joint_position_dict = dict(zip(msg.name, msg.velocity)) + self.current_joint_velocities = [joint_position_dict[name] for name in self.joint_names] + + if self.robot: + tcp_position = self.robot.fkine(self.current_joint_positions).t + tcp_orientation = self.robot.fkine(self.current_joint_positions).rpy() + + msg_tcp = oscbuildparse.OSCMessage(f"/tcp_coordinates", ',ffffff', [tcp_position[0], tcp_position[1], tcp_position[2], tcp_orientation[0], tcp_orientation[1], tcp_orientation[2]]) + msg_x = oscbuildparse.OSCMessage(f"/tcp_coordinates/x", ',f', [tcp_position[0]]) + msg_y = oscbuildparse.OSCMessage(f"/tcp_coordinates/y", ',f', [tcp_position[1]]) + msg_z = oscbuildparse.OSCMessage(f"/tcp_coordinates/z", ',f', [tcp_position[2]]) + msg_roll = oscbuildparse.OSCMessage(f"/tcp_coordinates/roll", ',f', [tcp_orientation[0]]) + msg_pitch = oscbuildparse.OSCMessage(f"/tcp_coordinates/pitch", ',f', [tcp_orientation[1]]) + msg_yaw = oscbuildparse.OSCMessage(f"/tcp_coordinates/yaw", ',f', [tcp_orientation[2]]) + bun = oscbuildparse.OSCBundle(oscbuildparse.OSC_IMMEDIATELY, [msg_tcp, msg_x, msg_y, msg_z, msg_roll, msg_pitch, msg_yaw]) + osc_send(bun, "osc_client") + + msg_position = oscbuildparse.OSCMessage(f"/joint_state/position", f',{"f"*self.n_joints}', [i for i in msg.position]) + msg_velocity = oscbuildparse.OSCMessage(f"/joint_state/velocity", f',{"f"*self.n_joints}', [i for i in msg.velocity]) + msg_effort = oscbuildparse.OSCMessage(f"/joint_state/effort", f',{"f"*self.n_joints}', [i for i in msg.effort]) + msg_name = oscbuildparse.OSCMessage(f"/joint_state/name", f',{"s"*self.n_joints}', [i for i in msg.name]) + bun = oscbuildparse.OSCBundle(oscbuildparse.OSC_IMMEDIATELY, [msg_name, msg_position, msg_velocity, msg_effort]) + osc_send(bun, "osc_client") + + for i, name in enumerate(msg.name): + msg_position = oscbuildparse.OSCMessage(f"/joint_state/position/{name}", ',f', [msg.position[i]]) + msg_velocity = oscbuildparse.OSCMessage(f"/joint_state/velocity/{name}", ',f', [msg.velocity[i]]) + msg_effort = oscbuildparse.OSCMessage(f"/joint_state/effort/{name}", ',f', [msg.effort[i]]) + bun = oscbuildparse.OSCBundle(oscbuildparse.OSC_IMMEDIATELY, [msg_position, msg_velocity, msg_effort]) + osc_send(bun, "osc_client") + + except Exception as e: + self.get_logger().fatal(f"joint_states_callback: {e}") + + def send_joint_positions(self): + pass + self.previous_desired = None + + def trapezoidal_timestamps(self, num_points,total_duration, flat_ratio = 0.3): + + if num_points == 2: + return [0, total_duration] + n = int(num_points*(1-flat_ratio)/2) + start = np.cos(np.linspace(0, np.pi, n))+2 + end = np.cos(np.linspace(-np.pi, 0, n))+2 + flat = np.ones(num_points-2*n) + + timestamps = np.concatenate((start, flat, end)) + timestamps *= total_duration / timestamps.sum() + timestamps = np.cumsum(timestamps) + + return timestamps.tolist() + + + def send_tcp_coordinates(self): + """Send the desired TCP coordinates to the robot.""" + try: + msg = JointTrajectory() + msg.joint_names = self.joint_names + steps_per_m = 100 + if self.previous_desired == None: + [x,y,z] = self.robot.fkine(self.current_joint_positions).t + [roll, pitch, yaw] = self.robot.fkine(self.current_joint_positions).rpy() + else: + [x,y,z] = self.previous_desired[1:4] + [roll, pitch, yaw] = self.previous_desired[4:7] + x1, y1, z1, roll1, pitch1, yaw1 = self.desired[1:7] + self.previous_desired = self.desired + steps = int(np.linalg.norm(np.array([x1, y1, z1])- self.robot.fkine(self.current_joint_positions).t) * steps_per_m) + if steps < 2: steps = 2 + cart_traj = [sm.SE3([x+(x1-x)/(steps-1)*i, y+(y1-y)/(steps-1)*i, z+(z1-z)/(steps-1)*i]) * sm.SE3.RPY([roll+(roll1-roll)/(steps-1)*i, pitch+(pitch1-pitch)/(steps-1)*i, yaw+(yaw1-yaw)/(steps-1)*i]) for i in range(steps)] + + + if False:#self.desired[-2]: + print(f"self.desired: {self.desired}") + timestamps = self.trapezoidal_timestamps(steps, self.desired[-2], 0.8) + for j in range(steps): + sol = self.robot.ik_LM(cart_traj[j], q0=self.current_joint_positions, mask = self.cost_mask, joint_limits = True, method = 'chan') if j == 0 else self.robot.ik_LM(cart_traj[j], q0=prev_sol, mask = self.cost_mask, joint_limits = True, method = 'chan') + if sol[1] == 1: + fowards = self.robot.fkine_all(sol[0]) + out_of_bounds = (fowards.t[1:,0] > self.x_limits[1] if self.x_limits[1] != None else False) | (fowards.t[1:,0] < self.x_limits[0] if self.x_limits[0] != None else False) | (fowards.t[1:,1] > self.y_limits[1] if self.y_limits[1] != None else False) | (fowards.t[1:,1] < self.y_limits[0] if self.y_limits[0] != None else False) | (fowards.t[1:,2] > self.z_limits[1] if self.z_limits[1] != None else False) | (fowards.t[1:,2] < self.z_limits[0] if self.z_limits[0] != None else False) + if np.any(out_of_bounds): + #print(fowards.t) + #indices = np.where(out_of_bounds)[0] + #print(f"indices: {indices}") + self.get_logger().warn("send_tcp_coordinates: One or more links moved out of bounds!") + ''' + for i in indices: + try: + print(f"Joint {self.robot.links[i].name} is out of bounds: (x,y,z) = {fowards.t[i]}") + except IndexError: + print(f"index {i} is out of bounds, but no corresponding joint found.") + self.previous_desired_tcp_position = self.desired_tcp_position + ''' + break + duration = timestamps[j] + if duration == 0: + prev_sol = list(sol[0]) + continue + point = JointTrajectoryPoint() + point.positions = list(sol[0]) + point.time_from_start.sec = int(duration) + point.time_from_start.nanosec = int((duration - int(duration)) * 1e9) + msg.points.append(point) + prev_sol = list(sol[0]) + else: + self.get_logger().warn(f"send_tcp_coordinates: IK could not find a solution for (x,y,z) = {cart_traj[j].t} and (r,p,y) = {cart_traj[j].rpy()}!") + prev_sol = self.current_joint_positions + if len(msg.points) == 0: + self.get_logger().warn("send_tcp_coordinates: The resulting trajectory is empty. Either the IK failed or the trajectory is too short.") + self.previous_desired = self.desired + return + msg.header.stamp = self.get_clock().now().to_msg() + self.publisher.publish(msg) + self.previous_desired = self.desired + + + + else: + prev_duration = 0 + ''' + if self.previous_desired == None: + [x,y,z] = self.robot.fkine(self.current_joint_positions).t + [roll, pitch, yaw] = self.robot.fkine(self.current_joint_positions).rpy() + else: + [x,y,z] = self.previous_desired[:3] + [roll, pitch, yaw] = self.previous_desired[3:] + ''' + for j in range(steps): + sol = self.robot.ik_LM(cart_traj[j], q0=self.current_joint_positions, mask = self.cost_mask, joint_limits = True, method = 'chan') if j == 0 else self.robot.ik_LM(cart_traj[j], q0=prev_sol, mask = self.cost_mask, joint_limits = True, method = 'chan') + if sol[1] == 1: + fowards = self.robot.fkine_all(sol[0]) + out_of_bounds = (fowards.t[1:,0] > self.x_limits[1] if self.x_limits[1] != None else False) | (fowards.t[1:,0] < self.x_limits[0] if self.x_limits[0] != None else False) | (fowards.t[1:,1] > self.y_limits[1] if self.y_limits[1] != None else False) | (fowards.t[1:,1] < self.y_limits[0] if self.y_limits[0] != None else False) | (fowards.t[1:,2] > self.z_limits[1] if self.z_limits[1] != None else False) | (fowards.t[1:,2] < self.z_limits[0] if self.z_limits[0] != None else False) + if np.any(out_of_bounds): + #print(fowards.t) + #indices = np.where(out_of_bounds)[0] + #print(f"indices: {indices}") + self.get_logger().warn("send_tcp_coordinates: One or more links moved out of bounds!") + ''' + for i in indices: + try: + print(f"Joint {self.robot.links[i].name} is out of bounds: (x,y,z) = {fowards.t[i]}") + except IndexError: + print(f"index {i} is out of bounds, but no corresponding joint found.") + self.previous_desired_tcp_position = self.desired_tcp_position + ''' + break + duration = 0 + prev = self.current_joint_positions if j == 0 else prev_sol + for p1, p2, max_vel in zip(sol[0], prev, self.joint_velocity_limits.values()): + duration = max(duration, abs(p1 - p2) / max_vel)#, 1/self.hz) # as minimun + prev_sol = list(sol[0]) + if duration == 0: + continue + point = JointTrajectoryPoint() + point.positions = list(sol[0]) + duration /= self.speed_scaling + duration += prev_duration + prev_duration = duration + point.time_from_start.sec = int(duration) + point.time_from_start.nanosec = int((duration - int(duration)) * 1e9) + msg.points.append(point) + else: + self.get_logger().warn(f"send_tcp_coordinates: IK could not find a solution for (x,y,z) = {cart_traj[j].t} and (r,p,y) = {cart_traj[j].rpy()}!") + prev_sol = self.current_joint_positions + if len(msg.points) == 0: + self.get_logger().warn("send_tcp_coordinates: The resulting trajectory is empty. Either the IK failed or the trajectory is too short.") + self.previous_desired = self.desired + return + msg.header.stamp = self.get_clock().now().to_msg() + self.publisher.publish(msg) + self.previous_desired = self.desired + except Exception as e: + self.get_logger().fatal(f"send_tcp_coordinates: {e}") + + def send_joint_trajectory(self): + pass + self.previous_desired = None + + def send_cartesian_trajectory(self): + pass + self.previous_desired = None + + def update_position(self): + """Calls the appropriate function to update the robot's position.""" + try: + if self.desired is None or not(self.new): + return + if self.desired[0] == "joint_positions": + self.new = False + self.send_joint_positions() + #return + elif self.desired[0] == "tcp_coordinates": + self.new = False + self.send_tcp_coordinates() + self.latency.append(time.time()-self.desired[-1]) + #return + elif self.desired[0] == "joint_trajectory": + self.new = False + self.send_joint_trajectory() + #return + elif self.desired[0] == "cartesian_trajectory": + self.new = False + self.send_cartesian_trajectory() + #return + else: + self.get_logger().warn(f"update_position: Unknown desired type '{self.desired[0]}'.") + return + + + except Exception as e: + self.get_logger().fatal(f'update_position: {e}') + + + def clean_log_string(self, s): + + s = str(s) + + # Remove ANSI escape sequences (e.g., \x1b[31m) + ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])') + s = ansi_escape.sub('', s) + + # Replace tabs/newlines with spaces + s = s.replace('\n', ' ').replace('\r', ' ').replace('\t', ' ').replace("'", ' '). replace('"', ' ').replace('`', ' ').replace('´', ' ').replace('`', ' ').replace('“', ' ').replace('”', ' ').replace('‘', ' ').replace('’', ' ').replace('´', ' ').replace('`', ' ').replace('“', ' ').replace('”', ' ').replace('‘', ' ').replace('’', ' ') + + # Strip leading/trailing whitespace + s = s.strip() + + # Optionally enforce ASCII only (replace non-ASCII chars with '?') + s = s.encode('ascii', 'replace').decode('ascii') + + return s + + + def log_callback(self, msg: Log): + """Callback function to handle incoming log messages.""" + + # Send the log message as an OSC message + msg_log = oscbuildparse.OSCMessage(f"/log/{self.log_dict.get(msg.level, 'UNKNOWN')}", ',isss', [int(msg.level), str(msg.stamp.sec+msg.stamp.nanosec*1e-9) , str(msg.name), self.clean_log_string(msg.msg)]) + osc_send(msg_log, "osc_log_client") + + +def main(): + """Main function to get joint names and start the ROS 2 & OSC system.""" + rclpy.init() + while True: + use_urdf = input("Do you have a URDF file you want to use? (y/n): ").strip().lower() + if use_urdf == 'y': + while True: + robot_urdf = input("Enter the path to the URDF file: ") + if os.path.isfile(robot_urdf): + if not robot_urdf.endswith('.urdf'): + print("The file is not a URDF file. Please enter a valid URDF file.") + continue + break + else: + print("Invalid path. Please enter a valid path to the URDF file.") + tree = ET.parse(robot_urdf) + root = tree.getroot() + robot = rtb.ERobot.URDF(robot_urdf) + joint_names = [joint.get('name') for joint in root.findall('joint') if joint.get('type') == 'revolute' or joint.get('type') == 'continuous' or joint.get('type') == 'prismatic'] + print(robot) + joint_velocity_limits = {} + + # Iterate over all joints in the URDF + for joint in root.findall('.//joint'): + joint_name = joint.get('name') # Get the name of the joint + + # Look for the tag under each joint + limit = joint.find('limit') + + if limit is not None: + # Extract the velocity limit (if it exists) + velocity_limit = limit.get('velocity') + + if velocity_limit is not None: + joint_velocity_limits[joint_name] = float(velocity_limit) + + while True: + try: + print('-+'*50) + print("The cost mask determines which coordinates are used for the IK. Each element of the cost mask corresponds to a catesian coordinate [x, y, z, Rx, Ry, Rz].") + print("The cost mask [1, 1, 1, 0, 0, 0] means that the IK will only consider translation and no rotaion.") + cost_mask = [int(i) for i in input(f"Enter the cost mask (6 integers (1 or 0), of which <= {robot.n} are 1): ")] + if sum(cost_mask) <= robot.n and len(cost_mask) == 6: + break + else: + print(f"Invalid input. Expected 6 integers of which {robot.n if robot.n < 6 else 6} or less are 1.") + except ValueError: + print("Invalid input. Please enter integers only.") + print(f"Cost mask: {cost_mask}") + break + elif use_urdf == 'n': + node = JointNameListener() + print("Wainting 10 sec for JointState messages to extract joint names...") + rclpy.spin_once(node) + counter = 0 + while not(node.joint_names): + if counter > 100: + joint_names = None + break + counter+=1 + time.sleep(0.1) + rclpy.spin_once(node) + joint_names = node.joint_names + node.destroy_node() + ''' + if joint_names: + while True: + try: + joint_velocity_limits = {name: float(input(f"Enter the velocity limit for joint '{name}' (or press Enter to skip): ").strip())} for name in joint_names} + break + except ValueError: + print("Invalid input. Please enter numeric values or leave blank to skip.") + ''' + joint_velocity_limits = None + robot = None + cost_mask = None + break + print("Invalid input. Please enter 'y' or 'n'.") + + + node = OSC_ROS2_interface(joint_names, joint_velocity_limits, robot, cost_mask) + + # Run ROS 2 spin, and osc_process will be handled by the timer + try: + rclpy.spin(node) + except KeyboardInterrupt: + print("") + finally: + file_path = "./latency_log.csv" + with open(file_path, mode='a', newline='') as f: + writer = csv.writer(f) + writer.writerow('latency') + for i in node.latency: + writer.writerow([i]) + node.destroy_node() + rclpy.shutdown() + osc_terminate() + +if __name__ == '__main__': + main() diff --git a/workspace/src/osc_ros2/osc_ros2/osc_ros2_osc_record.py b/workspace/src/osc_ros2/osc_ros2/osc_ros2_osc_record.py new file mode 100644 index 0000000..31a4d7a --- /dev/null +++ b/workspace/src/osc_ros2/osc_ros2/osc_ros2_osc_record.py @@ -0,0 +1,811 @@ +import rclpy +from rclpy.node import Node +from trajectory_msgs.msg import JointTrajectory, JointTrajectoryPoint +from sensor_msgs.msg import JointState +from rcl_interfaces.msg import Log +from osc4py3.as_allthreads import * +from osc4py3 import oscmethod as osm +import xml.etree.ElementTree as ET +import numpy as np +import spatialmath as sm +import roboticstoolbox as rtb +from osc4py3 import oscbuildparse +import time +import os +import re +import socket +import csv + +class JointNameListener(Node): + def __init__(self): + super().__init__('joint_name_listener') + self.subscription = self.create_subscription( + JointState, + '/joint_states', + self.joint_state_callback, + 1 + ) + self.joint_names = None + + def joint_state_callback(self, msg: JointState): + print("Joint names received from JointState message:") + self.joint_names = list(msg.name) + +class OSC_ROS2_interface(Node): + """Node to publish joint trajectories based on OSC messages.""" + + def __init__(self, joint_names, joint_velocity_limits, robot, cost_mask): + super().__init__('scaled_joint_trajectory_publisher') + + while True: + try: + self.trajectory_topic_name = input("Enter the topic name to which the joint trajectory should be sent (press Enter for default: '/scaled_joint_trajectory_controller/joint_trajectory'): ").strip() + if self.trajectory_topic_name == "": + self.trajectory_topic_name = '/scaled_joint_trajectory_controller/joint_trajectory' + break + elif self.trajectory_topic_name.startswith("/"): + break + else: + print("Invalid topic name. A valid topic name should start with '/'.") + except Exception as e: + print(f"An error occurred: {e}") + + + + # ROS2 Publisher + self.publisher = self.create_publisher( + JointTrajectory, + self.trajectory_topic_name, + 1 + ) + + self.subscription = self.create_subscription( + JointState, + '/joint_states', + self.joint_states_callback, + 1 + ) + + self.subscription = self.create_subscription( + Log, + '/rosout', + self.log_callback, + 100 + ) + + # Store received joint positions + self.current_joint_positions = None + self.joint_names = joint_names + self.joint_velocity_limits = joint_velocity_limits + self.cost_mask = cost_mask + self.robot = robot + self.desired = None + self.previous_desired = None + self.log_dict = { + 10: "DEBUG", + 20: "INFO", + 30: "WARN", + 40: "ERROR", + 50: "FATAL", + } + self.speed_scaling = 0.2 + self.new = False + + self.commands =[] + + while True: + try: + print('+-' * 50) + log_ip = str(input("Enter the target IP on which you want to recieve the log as OSC Messages (or press Enter for default: '127.0.0.1'): ")) + if log_ip == "": + log_ip = "127.0.0.1" + print('--' * 50) + log_port = input("Enter the target port for the log messages (or press Enter for default: 5005): ") + if log_port == "": + log_port = 5005 + else: + log_port = int(log_port) + break + except ValueError: + print("Invalid input. Please enter a valid IP address.") + continue + while True: + try: + print('+-' * 50) + state_ip = str(input("Enter the target IP on which you want to recieve the joint states as OSC Messages (or press Enter for default: '127.0.0.1'): ")) + if state_ip == "": + state_ip = "127.0.0.1" + print('--' * 50) + state_port = input("Enter the target port for the log messages (or press Enter for default: 7000): ") + if state_port == "": + state_port = 7000 + else: + state_port = int(state_port) + break + except ValueError: + print("Invalid input. Please enter a valid IP address.") + continue + while True: + try: + print('+-' * 50) + commands_port = input("Enter the port you want to send your commands to (or press Enter for default: 8000): ") + if commands_port == "": + commands_port = 8000 + else: + commands_port = int(commands_port) + break + except ValueError: + print("Invalid input. Please enter a valid port.") + continue + if robot: + while True: + set_limits = input("Do you want to set limit for x, y and z? (y/n): ").strip().lower() + if set_limits == 'y': + while True: + try: + self.x_limits = [float(i) if i != 'x' else None for i in input("Enter the lower and upper limits for x (space-separated, enter 'x' for no limit): ").split()] + self.y_limits = [float(i) if i != 'x' else None for i in input("Enter the lower and upper limits for y (space-separated, enter 'x' for no limit): ").split()] + self.z_limits = [float(i) if i != 'x' else None for i in input("Enter the lower and upper limits for z (space-separated, enter 'x' for no limit): ").split()] + + if len(self.x_limits) != 2 or len(self.y_limits) != 2 or len(self.z_limits) != 2: + print("Invalid input. Please enter exactly two values (or leave blank) for each limit.") + continue + + if (self.x_limits[0] is not None and self.x_limits[1] is not None and self.x_limits[0] >= self.x_limits[1]) or \ + (self.y_limits[0] is not None and self.y_limits[1] is not None and self.y_limits[0] >= self.y_limits[1]) or \ + (self.z_limits[0] is not None and self.z_limits[1] is not None and self.z_limits[0] >= self.z_limits[1]): + print("Invalid input. Lower limit must be less than upper limit for each axis.") + continue + + print(f"Current limits:") + print(f"x: {self.x_limits}") + print(f"y: {self.y_limits}") + print(f"z: {self.z_limits}") + con = True + while con: + confirm = input("Do you want your robot to move in this range? (y/n): ").strip().lower() + if confirm == 'y': + break + elif confirm == 'n': + print("Please re-enter the limits.") + con = False + else: + print("Invalid input. Please enter 'y' or 'n'.") + if con: break + except ValueError: + print("Invalid input. Please enter numeric values only.") + break + elif set_limits == 'n': + self.x_limits = [None, None] + self.y_limits = [None, None] + self.z_limits = [None, None] + break + print("Invalid input. Please enter 'y' or 'n'.") + # Ask the user if they want to set new joint limits + while True: + update_limits = input("Do you want to set new joint limits? (y/n): ").strip().lower() + if update_limits == 'y': + for i in range(len(self.joint_names)): + while True: + try: + lim = self.robot.qlim.copy() + # Find the link corresponding to the joint name + print("-" * 50) + print(f"Current position limits for joint '{self.joint_names[i]}': [{self.robot.qlim[0][i]} {self.robot.qlim[1][i]}] rad") + lower_limit = input(f"Enter the new lower limit for joint '{self.joint_names[i]}' (or press Enter to keep current): ").strip() + upper_limit = input(f"Enter the new upper limit for joint '{self.joint_names[i]}' (or press Enter to keep current): ").strip() + + if lower_limit and upper_limit and float(lower_limit) >= float(upper_limit): + print("Invalid input. Lower limit must be less than upper limit.") + continue + + if lower_limit: + if lower_limit self.robot.qlim[1][i]: + desired_joint_positions[i] = self.robot.qlim[1][i] + self.get_logger().warn( + f"joint_positions_handler:Joint '{self.joint_names[i]}' position {position} is out of bounds. Using {self.robot.qlim[1][i]}." + ) + + self.desired = ["joint_positions"] + desired_joint_positions + self.new = True + except Exception as e: + self.get_logger().fatal(f"joint_positions_handler: {e}") + return + + def tcp_coordinates_handler(self, readtime, *args): + # Ensure the desired joint positions are within the specified limits + + if self.robot: + try: + self.commands.append([readtime] + list(args)) + if len(args) == 6: + x, y, z, r, p, yaw = [float(i) for i in list(args)] + duration = None + elif len(args) >= 7: + x, y, z, r, p, yaw, duration, *_ = [float(i) for i in list(args)] + else: + self.get_logger().warn(f"tcp_coordinates_handler: Invalid number of arguments for TCP coordinates. Expected 6 ([x, y, z, roll, pitch, yaw]) or 7 ([x, y, z, roll, pitch, yaw, duration]), but got {len(args)}.") + return + + if self.x_limits[0] is not None: + x = max(self.x_limits[0], x) + if self.x_limits[1] is not None: + x = min(self.x_limits[1], x) + if self.y_limits[0] is not None: + y = max(self.y_limits[0], y) + if self.y_limits[1] is not None: + y = min(self.y_limits[1], y) + if self.z_limits[0] is not None: + z = max(self.z_limits[0], z) + if self.z_limits[1] is not None: + z = min(self.z_limits[1], z) + + if x != args[0] or y != args[1] or z != args[2]: + self.get_logger().warn( + f"tcp_coordinates_handler: Desired joint positions adjusted to fit within limits: " + f"x={x}, y={y}, z={z} (original: x={args[0]}, y={args[1]}, z={args[2]})" + ) + + self.desired = ["tcp_coordinates", x, y, z, r, p, yaw, duration] + self.new = True + except Exception as e: + self.get_logger().fatal(f"tcp_coordinates_handler: {e}") + else: + self.get_logger().warn("tcp_coordinates_handler: No robot model provided. Cannot handle TCP coordinates.") + return + + + def joint_states_callback(self, msg: JointState): + """Callback function to handle incoming joint states.""" + try: + msg_time = oscbuildparse.OSCMessage(f"/time", ',s', [str(time.time())]) + osc_send(msg_time, "osc_client") + if not(self.joint_names): self.joint_names = msg.name + joint_position_dict = dict(zip(msg.name, msg.position)) + self.current_joint_positions = [joint_position_dict[name] for name in self.joint_names] + joint_position_dict = dict(zip(msg.name, msg.velocity)) + self.current_joint_velocities = [joint_position_dict[name] for name in self.joint_names] + + if self.robot: + tcp_position = self.robot.fkine(self.current_joint_positions).t + tcp_orientation = self.robot.fkine(self.current_joint_positions).rpy() + + msg_tcp = oscbuildparse.OSCMessage(f"/tcp_coordinates", ',ffffff', [tcp_position[0], tcp_position[1], tcp_position[2], tcp_orientation[0], tcp_orientation[1], tcp_orientation[2]]) + msg_x = oscbuildparse.OSCMessage(f"/tcp_coordinates/x", ',f', [tcp_position[0]]) + msg_y = oscbuildparse.OSCMessage(f"/tcp_coordinates/y", ',f', [tcp_position[1]]) + msg_z = oscbuildparse.OSCMessage(f"/tcp_coordinates/z", ',f', [tcp_position[2]]) + msg_roll = oscbuildparse.OSCMessage(f"/tcp_coordinates/roll", ',f', [tcp_orientation[0]]) + msg_pitch = oscbuildparse.OSCMessage(f"/tcp_coordinates/pitch", ',f', [tcp_orientation[1]]) + msg_yaw = oscbuildparse.OSCMessage(f"/tcp_coordinates/yaw", ',f', [tcp_orientation[2]]) + bun = oscbuildparse.OSCBundle(oscbuildparse.OSC_IMMEDIATELY, [msg_tcp, msg_x, msg_y, msg_z, msg_roll, msg_pitch, msg_yaw]) + osc_send(bun, "osc_client") + + msg_position = oscbuildparse.OSCMessage(f"/joint_state/position", f',{"f"*self.n_joints}', [i for i in msg.position]) + msg_velocity = oscbuildparse.OSCMessage(f"/joint_state/velocity", f',{"f"*self.n_joints}', [i for i in msg.velocity]) + msg_effort = oscbuildparse.OSCMessage(f"/joint_state/effort", f',{"f"*self.n_joints}', [i for i in msg.effort]) + msg_name = oscbuildparse.OSCMessage(f"/joint_state/name", f',{"s"*self.n_joints}', [i for i in msg.name]) + bun = oscbuildparse.OSCBundle(oscbuildparse.OSC_IMMEDIATELY, [msg_name, msg_position, msg_velocity, msg_effort]) + osc_send(bun, "osc_client") + + for i, name in enumerate(msg.name): + msg_position = oscbuildparse.OSCMessage(f"/joint_state/position/{name}", ',f', [msg.position[i]]) + msg_velocity = oscbuildparse.OSCMessage(f"/joint_state/velocity/{name}", ',f', [msg.velocity[i]]) + msg_effort = oscbuildparse.OSCMessage(f"/joint_state/effort/{name}", ',f', [msg.effort[i]]) + bun = oscbuildparse.OSCBundle(oscbuildparse.OSC_IMMEDIATELY, [msg_position, msg_velocity, msg_effort]) + osc_send(bun, "osc_client") + + except Exception as e: + self.get_logger().fatal(f"joint_states_callback: {e}") + + def send_joint_positions(self): + pass + self.previous_desired = None + + def trapezoidal_timestamps(self, num_points,total_duration, flat_ratio = 0.3): + + if num_points == 2: + return [0, total_duration] + n = int(num_points*(1-flat_ratio)/2) + start = np.cos(np.linspace(0, np.pi, n))+2 + end = np.cos(np.linspace(-np.pi, 0, n))+2 + flat = np.ones(num_points-2*n) + + timestamps = np.concatenate((start, flat, end)) + timestamps *= total_duration / timestamps.sum() + timestamps = np.cumsum(timestamps) + + return timestamps.tolist() + + + def send_tcp_coordinates(self): + """Send the desired TCP coordinates to the robot.""" + try: + msg = JointTrajectory() + msg.joint_names = self.joint_names + steps_per_m = 100 + if self.previous_desired == None: + [x,y,z] = self.robot.fkine(self.current_joint_positions).t + [roll, pitch, yaw] = self.robot.fkine(self.current_joint_positions).rpy() + else: + [x,y,z] = self.previous_desired[1:4] + [roll, pitch, yaw] = self.previous_desired[4:-1] + x1, y1, z1, roll1, pitch1, yaw1 = self.desired[1:7] + self.previous_desired = self.desired + steps = int(np.linalg.norm(np.array([x1, y1, z1])- self.robot.fkine(self.current_joint_positions).t) * steps_per_m) + if steps < 2: steps = 2 + cart_traj = [sm.SE3([x+(x1-x)/(steps-1)*i, y+(y1-y)/(steps-1)*i, z+(z1-z)/(steps-1)*i]) * sm.SE3.RPY([roll+(roll1-roll)/(steps-1)*i, pitch+(pitch1-pitch)/(steps-1)*i, yaw+(yaw1-yaw)/(steps-1)*i]) for i in range(steps)] + '''if self.previous_desired: + [x,y,z] = self.previous_desired[1:4] + q0 = sm.UnitQuaternion.RPY(self.previous_desired[3], self.previous_desired[4], self.previous_desired[5]) + else: + [x, y, z] = self.robot.fkine(self.current_joint_positions).t + q0 = sm.UnitQuaternion(self.robot.fkine(self.current_joint_positions).R) + + x1, y1, z1, roll1, pitch1, yaw1 = self.desired[1:7] + q1 = sm.UnitQuaternion.RPY(roll1, pitch1, yaw1) + + steps = int(np.linalg.norm(np.array([x1, y1, z1]) - self.robot.fkine(self.current_joint_positions).t) * steps_per_m) + if steps < 2: + steps = 2 + + cart_traj = [] + for i in range(steps): + alpha = i / (steps - 1) + + # Convert to arrays for robust interpolation if needed + q0_array = q0.vec + q1_array = q1.vec + dot = np.dot(q0_array, q1_array) + dot = np.clip(dot, -1.0, 1.0) + + if abs(dot) > 0.9995: + # Linear interpolation + normalization + q_interp_array = (1 - alpha) * q0_array + alpha * q1_array + q_interp_array = q_interp_array / np.linalg.norm(q_interp_array) + q_interp = sm.UnitQuaternion(q_interp_array) + else: + q_interp = q0.interp(q1, alpha) + + # Interpolate translation + pos_interp = [ + x + (x1 - x) * alpha, + y + (y1 - y) * alpha, + z + (z1 - z) * alpha + ] + + # Compose SE3 transform + cart_traj.append(sm.SE3(pos_interp) * q_interp.SE3())''' + + + + if self.desired[-1]: + timestamps = self.trapezoidal_timestamps(steps, self.desired[-1], 0.8) + print(f'timestamps: {timestamps}') + for j in range(steps): + sol = self.robot.ik_LM(cart_traj[j], q0=self.current_joint_positions, mask = self.cost_mask, joint_limits = True, method = 'chan') if j == 0 else self.robot.ik_LM(cart_traj[j], q0=prev_sol, mask = self.cost_mask, joint_limits = True, method = 'chan') + if sol[1] == 1: + fowards = self.robot.fkine_all(sol[0]) + out_of_bounds = (fowards.t[1:,0] > self.x_limits[1] if self.x_limits[1] != None else False) | (fowards.t[1:,0] < self.x_limits[0] if self.x_limits[0] != None else False) | (fowards.t[1:,1] > self.y_limits[1] if self.y_limits[1] != None else False) | (fowards.t[1:,1] < self.y_limits[0] if self.y_limits[0] != None else False) | (fowards.t[1:,2] > self.z_limits[1] if self.z_limits[1] != None else False) | (fowards.t[1:,2] < self.z_limits[0] if self.z_limits[0] != None else False) + if np.any(out_of_bounds): + #print(fowards.t) + #indices = np.where(out_of_bounds)[0] + #print(f"indices: {indices}") + self.get_logger().warn("send_tcp_coordinates: One or more links moved out of bounds!") + ''' + for i in indices: + try: + print(f"Joint {self.robot.links[i].name} is out of bounds: (x,y,z) = {fowards.t[i]}") + except IndexError: + print(f"index {i} is out of bounds, but no corresponding joint found.") + self.previous_desired_tcp_position = self.desired_tcp_position + ''' + break + duration = timestamps[j] + if duration == 0: + prev_sol = list(sol[0]) + continue + point = JointTrajectoryPoint() + point.positions = list(sol[0]) + point.time_from_start.sec = int(duration) + point.time_from_start.nanosec = int((duration - int(duration)) * 1e9) + msg.points.append(point) + prev_sol = list(sol[0]) + else: + self.get_logger().warn(f"send_tcp_coordinates: IK could not find a solution for (x,y,z) = {cart_traj[j].t} and (r,p,y) = {cart_traj[j].rpy()}!") + prev_sol = self.current_joint_positions + if len(msg.points) == 0: + self.get_logger().warn("send_tcp_coordinates: The resulting trajectory is empty. Either the IK failed or the trajectory is too short.") + self.previous_desired = self.desired + return + msg.header.stamp = self.get_clock().now().to_msg() + self.publisher.publish(msg) + self.previous_desired = self.desired + + + + else: + prev_duration = 0 + ''' + if self.previous_desired == None: + [x,y,z] = self.robot.fkine(self.current_joint_positions).t + [roll, pitch, yaw] = self.robot.fkine(self.current_joint_positions).rpy() + else: + [x,y,z] = self.previous_desired[:3] + [roll, pitch, yaw] = self.previous_desired[3:] + ''' + for j in range(steps): + sol = self.robot.ik_LM(cart_traj[j], q0=self.current_joint_positions, mask = self.cost_mask, joint_limits = True, method = 'chan') if j == 0 else self.robot.ik_LM(cart_traj[j], q0=prev_sol, mask = self.cost_mask, joint_limits = True, method = 'chan') + if sol[1] == 1: + fowards = self.robot.fkine_all(sol[0]) + out_of_bounds = (fowards.t[1:,0] > self.x_limits[1] if self.x_limits[1] != None else False) | (fowards.t[1:,0] < self.x_limits[0] if self.x_limits[0] != None else False) | (fowards.t[1:,1] > self.y_limits[1] if self.y_limits[1] != None else False) | (fowards.t[1:,1] < self.y_limits[0] if self.y_limits[0] != None else False) | (fowards.t[1:,2] > self.z_limits[1] if self.z_limits[1] != None else False) | (fowards.t[1:,2] < self.z_limits[0] if self.z_limits[0] != None else False) + if np.any(out_of_bounds): + #print(fowards.t) + #indices = np.where(out_of_bounds)[0] + #print(f"indices: {indices}") + self.get_logger().warn("send_tcp_coordinates: One or more links moved out of bounds!") + ''' + for i in indices: + try: + print(f"Joint {self.robot.links[i].name} is out of bounds: (x,y,z) = {fowards.t[i]}") + except IndexError: + print(f"index {i} is out of bounds, but no corresponding joint found.") + self.previous_desired_tcp_position = self.desired_tcp_position + ''' + break + duration = 0 + prev = self.current_joint_positions if j == 0 else prev_sol + for p1, p2, max_vel in zip(sol[0], prev, self.joint_velocity_limits.values()): + duration = max(duration, abs(p1 - p2) / max_vel)#, 1/self.hz) # as minimun + prev_sol = list(sol[0]) + if duration == 0: + continue + point = JointTrajectoryPoint() + point.positions = list(sol[0]) + duration /= self.speed_scaling + duration += prev_duration + prev_duration = duration + point.time_from_start.sec = int(duration) + point.time_from_start.nanosec = int((duration - int(duration)) * 1e9) + msg.points.append(point) + else: + self.get_logger().warn(f"send_tcp_coordinates: IK could not find a solution for (x,y,z) = {cart_traj[j].t} and (r,p,y) = {cart_traj[j].rpy()}!") + prev_sol = self.current_joint_positions + if len(msg.points) == 0: + self.get_logger().warn("send_tcp_coordinates: The resulting trajectory is empty. Either the IK failed or the trajectory is too short.") + self.previous_desired = self.desired + return + msg.header.stamp = self.get_clock().now().to_msg() + self.publisher.publish(msg) + self.previous_desired = self.desired + except Exception as e: + self.get_logger().fatal(f"send_tcp_coordinates: {e}") + + def send_joint_trajectory(self): + pass + self.previous_desired = None + + def send_cartesian_trajectory(self): + pass + self.previous_desired = None + + def update_position(self): + """Calls the appropriate function to update the robot's position.""" + try: + if self.desired is None or not(self.new): + return + + if self.desired[0] == "joint_positions": + self.new = False + self.send_joint_positions() + return + elif self.desired[0] == "tcp_coordinates": + self.new = False + self.send_tcp_coordinates() + return + elif self.desired[0] == "joint_trajectory": + self.new = False + self.send_joint_trajectory() + return + elif self.desired[0] == "cartesian_trajectory": + self.new = False + self.send_cartesian_trajectory() + return + else: + self.get_logger().warn(f"update_position: Unknown desired type '{self.desired[0]}'.") + return + + + except Exception as e: + self.get_logger().fatal(f'update_position: {e}') + + + def clean_log_string(self, s): + + s = str(s) + + # Remove ANSI escape sequences (e.g., \x1b[31m) + ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])') + s = ansi_escape.sub('', s) + + # Replace tabs/newlines with spaces + s = s.replace('\n', ' ').replace('\r', ' ').replace('\t', ' ').replace("'", ' '). replace('"', ' ').replace('`', ' ').replace('´', ' ').replace('`', ' ').replace('“', ' ').replace('”', ' ').replace('‘', ' ').replace('’', ' ').replace('´', ' ').replace('`', ' ').replace('“', ' ').replace('”', ' ').replace('‘', ' ').replace('’', ' ') + + # Strip leading/trailing whitespace + s = s.strip() + + # Optionally enforce ASCII only (replace non-ASCII chars with '?') + s = s.encode('ascii', 'replace').decode('ascii') + + return s + + + def log_callback(self, msg: Log): + """Callback function to handle incoming log messages.""" + + # Send the log message as an OSC message + msg_log = oscbuildparse.OSCMessage(f"/log/{self.log_dict.get(msg.level, 'UNKNOWN')}", ',isss', [int(msg.level), str(msg.stamp.sec+msg.stamp.nanosec*1e-9) , str(msg.name), self.clean_log_string(msg.msg)]) + osc_send(msg_log, "osc_log_client") + + +def main(): + """Main function to get joint names and start the ROS 2 & OSC system.""" + rclpy.init() + while True: + use_urdf = input("Do you have a URDF file you want to use? (y/n): ").strip().lower() + if use_urdf == 'y': + while True: + robot_urdf = input("Enter the path to the URDF file: ") + if os.path.isfile(robot_urdf): + if not robot_urdf.endswith('.urdf'): + print("The file is not a URDF file. Please enter a valid URDF file.") + continue + break + else: + print("Invalid path. Please enter a valid path to the URDF file.") + tree = ET.parse(robot_urdf) + root = tree.getroot() + robot = rtb.ERobot.URDF(robot_urdf) + joint_names = [joint.get('name') for joint in root.findall('joint') if joint.get('type') == 'revolute' or joint.get('type') == 'continuous' or joint.get('type') == 'prismatic'] + print(robot) + joint_velocity_limits = {} + + # Iterate over all joints in the URDF + for joint in root.findall('.//joint'): + joint_name = joint.get('name') # Get the name of the joint + + # Look for the tag under each joint + limit = joint.find('limit') + + if limit is not None: + # Extract the velocity limit (if it exists) + velocity_limit = limit.get('velocity') + + if velocity_limit is not None: + joint_velocity_limits[joint_name] = float(velocity_limit) + + while True: + try: + print('-+'*50) + print("The cost mask determines which coordinates are used for the IK. Each element of the cost mask corresponds to a catesian coordinate [x, y, z, Rx, Ry, Rz].") + print("The cost mask [1, 1, 1, 0, 0, 0] means that the IK will only consider translation and no rotaion.") + cost_mask = [int(i) for i in input(f"Enter the cost mask (6 integers (1 or 0), of which <= {robot.n} are 1): ")] + if sum(cost_mask) <= robot.n and len(cost_mask) == 6: + break + else: + print(f"Invalid input. Expected 6 integers of which {robot.n if robot.n < 6 else 6} or less are 1.") + except ValueError: + print("Invalid input. Please enter integers only.") + print(f"Cost mask: {cost_mask}") + break + elif use_urdf == 'n': + node = JointNameListener() + print("Wainting 10 sec for JointState messages to extract joint names...") + rclpy.spin_once(node) + counter = 0 + while not(node.joint_names): + if counter > 100: + joint_names = None + break + counter+=1 + time.sleep(0.1) + rclpy.spin_once(node) + joint_names = node.joint_names + node.destroy_node() + ''' + if joint_names: + while True: + try: + joint_velocity_limits = {name: float(input(f"Enter the velocity limit for joint '{name}' (or press Enter to skip): ").strip())} for name in joint_names} + break + except ValueError: + print("Invalid input. Please enter numeric values or leave blank to skip.") + ''' + joint_velocity_limits = None + robot = None + cost_mask = None + break + print("Invalid input. Please enter 'y' or 'n'.") + + + node = OSC_ROS2_interface(joint_names, joint_velocity_limits, robot, cost_mask) + + # Run ROS 2 spin, and osc_process will be handled by the timer + try: + rclpy.spin(node) + except KeyboardInterrupt: + print("") + finally: + csv_file = './pose_log.csv' + with open(csv_file, 'w', newline='') as f: + writer = csv.writer(f) + writer.writerow(["timestamp", "x", "y", "z", "roll", "pitch", "yaw"]) + with open(csv_file, 'a', newline='') as f: + writer = csv.writer(f) + for command in node.commands: + writer.writerow(command) + node.destroy_node() + rclpy.shutdown() + osc_terminate() + +if __name__ == '__main__': + main() diff --git a/workspace/src/osc_ros2/osc_ros2/osc_ros2_unit_quater.py b/workspace/src/osc_ros2/osc_ros2/osc_ros2_rpy.py similarity index 94% rename from workspace/src/osc_ros2/osc_ros2/osc_ros2_unit_quater.py rename to workspace/src/osc_ros2/osc_ros2/osc_ros2_rpy.py index ef61cf7..d905751 100644 --- a/workspace/src/osc_ros2/osc_ros2/osc_ros2_unit_quater.py +++ b/workspace/src/osc_ros2/osc_ros2/osc_ros2_rpy.py @@ -369,6 +369,7 @@ class OSC_ROS2_interface(Node): def tcp_coordinates_handler(self, *args): # Ensure the desired joint positions are within the specified limits + print("tcp_coordinates_handler") if self.robot: try: if len(args) == 6: @@ -453,39 +454,38 @@ class OSC_ROS2_interface(Node): def send_joint_positions(self): pass - def trapezoidal_timestamps(self, n_points, total_duration, accel_fraction=0.2): + def trapezoidal_timestamps(self, num_points, total_duration, flat_ratio): """ - Generate timestamps for a trapezoidal velocity profile. + Generate symmetric timestamps with increasing → decreasing → flat → increasing spacing pattern. - Parameters: - n_points (int): Total number of trajectory points. - total_duration (float): Duration of the full motion [seconds]. - accel_fraction (float): Fraction of the total time spent accelerating and decelerating. - Default is 0.2 (i.e., 20% accel, 60% cruise, 20% decel) + Args: + total_duration (float): The total duration (last timestamp). + num_points (int): Total number of timestamps (must be >= 3). + flat_ratio (float): Fraction of timestamps in the constant-spacing center (0.0–0.9). Returns: - list of float: Timestamps for each point [seconds]. + List[float]: List of timestamps from 0 to total_duration. """ + if num_points < 3: + raise ValueError("Need at least 3 points for symmetry.") - if n_points == 2: - return [0.0, total_duration] + # Calculate how many are in the flat middle section + flat_count = int(num_points * flat_ratio) + if flat_count % 2 == 0: + flat_count += 1 # ensure symmetry + edge_count = (num_points - flat_count) // 2 - # Time fractions - ta = accel_fraction * total_duration # acceleration time - tc = total_duration - 2 * ta # constant velocity time + # Create increasing durations on the sides + edge = np.linspace(1.5, 0.5, edge_count) + durations = np.concatenate([edge, np.full(flat_count, 0.5), edge[::-1]]) - # Number of points per segment - n_accel = int(n_points * accel_fraction) - if n_accel == 0: - return list(np.linspace(0, total_duration, n_points)) - n_cruise = n_points - 2*n_accel - # Time vectors for each segment - t_accel = np.linspace(0, ta, n_accel, endpoint=False) - t_cruise = np.linspace(ta, ta + tc, n_cruise, endpoint=False) - t_decel = np.linspace(ta + tc, total_duration, n_accel, endpoint=True) + # Normalize durations so they sum to total_duration + durations *= total_duration / durations.sum() - timestamps = np.concatenate([t_accel, t_cruise, t_decel]) - return list(timestamps) + # Convert to timestamps + timestamps = np.cumsum(np.insert(durations, 0, 0.0)) + + return timestamps.tolist() @@ -495,29 +495,18 @@ class OSC_ROS2_interface(Node): msg = JointTrajectory() msg.joint_names = self.joint_names steps_per_m = 100 - [x, y, z] = self.robot.fkine(self.current_joint_positions).t - q0 = sm.UnitQuaternion(self.robot.fkine(self.current_joint_positions).R) - + [x,y,z] = self.robot.fkine(self.current_joint_positions).t + [roll, pitch, yaw] = self.robot.fkine(self.current_joint_positions).rpy() x1, y1, z1, roll1, pitch1, yaw1 = self.desired[1:7] - q1 = sm.UnitQuaternion.RPY(roll1, pitch1, yaw1) - - steps = int(np.linalg.norm(np.array([x1, y1, z1]) - self.robot.fkine(self.current_joint_positions).t) * steps_per_m) - if steps < 2: - steps = 2 - - cart_traj = [ - sm.SE3([ - x + (x1 - x) / (steps - 1) * i, - y + (y1 - y) / (steps - 1) * i, - z + (z1 - z) / (steps - 1) * i - ]) * q0.interp(q1, i / (steps - 1)).SE3() - for i in range(steps) - ] - - print(cart_traj) + #self.prev_pose = self.desired[1:] + steps = int(np.linalg.norm(np.array([x1, y1, z1])- self.robot.fkine(self.current_joint_positions).t) * steps_per_m) + if steps < 2: steps = 2 + cart_traj = [sm.SE3([x+(x1-x)/(steps-1)*i, y+(y1-y)/(steps-1)*i, z+(z1-z)/(steps-1)*i]) * sm.SE3.RPY([roll+(roll1-roll)/(steps-1)*i, pitch+(pitch1-pitch)/(steps-1)*i, yaw+(yaw1-yaw)/(steps-1)*i]) for i in range(steps)] + + if self.desired[-1]: - timestamps = self.trapezoidal_timestamps(steps, self.desired[-1]) + timestamps = self.trapezoidal_timestamps(steps, self.desired[-1], 0.3) for j in range(steps): sol = self.robot.ik_LM(cart_traj[j], q0=self.current_joint_positions, mask = self.cost_mask, joint_limits = True, method = 'chan') if j == 0 else self.robot.ik_LM(cart_traj[j], q0=prev_sol, mask = self.cost_mask, joint_limits = True, method = 'chan') if sol[1] == 1: @@ -756,7 +745,6 @@ def main(): break print("Invalid input. Please enter 'y' or 'n'.") - node = OSC_ROS2_interface(joint_names, joint_velocity_limits, robot, cost_mask) # Run ROS 2 spin, and osc_process will be handled by the timer diff --git a/workspace/src/osc_ros2/setup.py b/workspace/src/osc_ros2/setup.py index 023d058..5b7fc71 100644 --- a/workspace/src/osc_ros2/setup.py +++ b/workspace/src/osc_ros2/setup.py @@ -28,7 +28,7 @@ setup( entry_points={ 'console_scripts': [ 'interface = osc_ros2.osc_ros2:main', - 'interface1 = osc_ros2.osc_ros2_unit_quater:main', + 'interface1 = osc_ros2.osc_ros2_rpy:main', ], }, )