From f3cd1e49bc4fdc6588f3ff36d5fd110e9c5f45b2 Mon Sep 17 00:00:00 2001 From: Vihaan Shah Date: Mon, 24 Jun 2024 12:49:39 -0400 Subject: [PATCH 01/14] Extend single arm description to dual arm --- .../CMakeLists.txt | 11 + .../my_dual_robot_cell_description/LICENSE | 29 ++ .../UR_LICENSE.txt | 84 ++++ .../launch/view_robot.launch.py | 52 +++ .../meshes/171005_Motek_Monitor_L.dae | 137 +++++++ .../meshes/fzi_skyline_v1.png | Bin 0 -> 72632 bytes .../meshes/fzi_table.dae | 372 ++++++++++++++++++ .../meshes/notexture.png | Bin 0 -> 21283 bytes .../meshes/ur_background.jpg | Bin 0 -> 206584 bytes .../meshes/wall.dae | 115 ++++++ .../package.xml | 29 ++ .../rviz/urdf.rviz | 257 ++++++++++++ .../urdf/my_dual_robot_cell.urdf.xacro | 38 ++ .../urdf/my_dual_robot_cell_macro.xacro | 127 ++++++ 14 files changed, 1251 insertions(+) create mode 100644 my_dual_robot_cell/my_dual_robot_cell_description/CMakeLists.txt create mode 100644 my_dual_robot_cell/my_dual_robot_cell_description/LICENSE create mode 100644 my_dual_robot_cell/my_dual_robot_cell_description/UR_LICENSE.txt create mode 100644 my_dual_robot_cell/my_dual_robot_cell_description/launch/view_robot.launch.py create mode 100644 my_dual_robot_cell/my_dual_robot_cell_description/meshes/171005_Motek_Monitor_L.dae create mode 100644 my_dual_robot_cell/my_dual_robot_cell_description/meshes/fzi_skyline_v1.png create mode 100644 my_dual_robot_cell/my_dual_robot_cell_description/meshes/fzi_table.dae create mode 100644 my_dual_robot_cell/my_dual_robot_cell_description/meshes/notexture.png create mode 100644 my_dual_robot_cell/my_dual_robot_cell_description/meshes/ur_background.jpg create mode 100644 my_dual_robot_cell/my_dual_robot_cell_description/meshes/wall.dae create mode 100644 my_dual_robot_cell/my_dual_robot_cell_description/package.xml create mode 100644 my_dual_robot_cell/my_dual_robot_cell_description/rviz/urdf.rviz create mode 100644 my_dual_robot_cell/my_dual_robot_cell_description/urdf/my_dual_robot_cell.urdf.xacro create mode 100644 my_dual_robot_cell/my_dual_robot_cell_description/urdf/my_dual_robot_cell_macro.xacro diff --git a/my_dual_robot_cell/my_dual_robot_cell_description/CMakeLists.txt b/my_dual_robot_cell/my_dual_robot_cell_description/CMakeLists.txt new file mode 100644 index 0000000..9062bb4 --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_description/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.5) +project(my_dual_robot_cell_description) + +find_package(ament_cmake REQUIRED) + +install( + DIRECTORY launch meshes rviz urdf + DESTINATION share/${PROJECT_NAME} +) + +ament_package() diff --git a/my_dual_robot_cell/my_dual_robot_cell_description/LICENSE b/my_dual_robot_cell/my_dual_robot_cell_description/LICENSE new file mode 100644 index 0000000..48fb689 --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_description/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2022, Universal Robots A/S +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/my_dual_robot_cell/my_dual_robot_cell_description/UR_LICENSE.txt b/my_dual_robot_cell/my_dual_robot_cell_description/UR_LICENSE.txt new file mode 100644 index 0000000..cba4e38 --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_description/UR_LICENSE.txt @@ -0,0 +1,84 @@ +TERMS AND CONDITIONS FOR USE OF GRAPHICAL DOCUMENTATION + +Version: 1.01 / release date: 2023-09-12 + +These Terms and Conditions for Use of Graphical Documentation (the “T&Cs”) govern your use of graphical files and documents*, including the contents hereof, (the “Graphical Documentation”) provided or made available to you by Universal Robots A/S (“Universal Robots”) for the purposes of creating simulations, visualizations, digital representations, path planning, collision avoidance and algorithms of or for Universal Robots’ products. The T&Cs constitute a binding agreement between you and Universal Robots. By accessing, storing, copying, sharing, opening, or otherwise using or disposing of the Graphical Documentation, you acknowledge that you are bound by the T&Cs. + +1. PERMITTED USE OF THE GRAPHICAL DOCUMENTATION + +1.1. You may use the Graphical Documentation for the purposes of creating simulations, visualizations, digital representations, path planning, collision avoidance and algorithms of or for Universal Robots’ products, provided that your use does not constitute comparative advertising and is not otherwise unfair, disloyal, or disparaging to Universal Robots. + +1.2. Hobbyists, students and/or researchers are allowed to use the Graphical Documentation to create models or similar solely for non-commercial purposes as part of their hobby, academic studies, or research. However, no one is allowed to use the Graphical Documentation to create a physical model or similar for commercial purposes, nor to create or improve a product that is capable of competing, either directly or indirectly, with any of Universal Robots’ or its affiliates’ current or future robots. + +1.3. You are permitted to create a product or solution that simulates, visualizes, or digitally represents a Universal Robots product, regardless of the origin of the underlying software, and regardless of whether Universal Robots or its affiliates have released a product that competes with the underlying software. However, you may not in any way use the Graphical Documentation to create a product or solution that simulates, visualizes or represents a product that is capable of competing, either directly or indirectly, with any of Universal Robots’ or its affiliates’ current or future products without Universal Robots’ prior written permission. + +1.4. You may share the Graphical Documentation or any whole or partial copies thereof with a third party (i) if and to the extent it is necessary for you to do so in order for you to engage in use permitted pursuant to this Section 1, and (ii) you provide the recipient with a copy of the T&Cs. However, you may only make the Graphical Documentation or any whole or partial copies thereof available to the public via download if it is part of a downloadable software package that includes a copy of the T&Cs. If you download a software package that includes the Graphical Documentation, your use of the Graphical Documentation will be subject to and governed by the latest version of the T&Cs, which can be found here: https://www.universal-robots.com/legal/terms-and-conditions/terms_and_conditions_for_use_of_graphical_documentation.txt , regardless of whether they are included in the software package or not. + +1.4.1. You are not allowed to alter, obscure, remove or replace any copyright or other legal notices, trademarks, business names and/or logos embedded in, superimposed on, affixed to, or otherwise included in, the Graphical Documentation without Universal Robots’ prior written permission. + +1.4.2. You may show the Graphical Documentation in whole or in part to a third party or the public in the course of you engaging in the use permitted pursuant to this Section 1, provided that you display any copyright notice already contained in the Graphical Documentation, cf. also Section 1.4.1. + +1.4.3. You may show graphical representations of Universal Robots’ products based on the Graphical Documentation to a third party or the public in the course of you engaging in the use permitted pursuant to this Section 1, if you, to the extent possible, display the following copyright notice in connection with such use: “© 2023 Universal Robots A/S. Use hereof is subject to Universal Robots A/S’ Terms and Conditions for Use of Graphical Documentation.” If the medium that you use limits or does not support the possibility of displaying the copyright notice, you may in good faith disregard this requirement. + +1.5. You may under no circumstances use the Graphical Documentation for planning, construction, maintenance, operation, or use, directly or indirectly, in nuclear power plants, missile technology, chemical or biological weapons applications or flight, navigation, or communication of aircraft or ground support equipment. + +1.6. Any use of the Graphical Documentation that is not expressly permitted pursuant to this Section 1 constitutes a material breach of the T&Cs. + +1.7. If your intended use of the Graphical Documentation is not permitted pursuant to the T&Cs, you may contact Universal Robots via email at legal@universal-robots.com and request a special permission to engage in your particular intended use. + + +2. INTELLECTUAL PROPERTY RIGHTS + +2.1. You acknowledge and agree that the Graphical Documentation and all intellectual property rights contained and/or embodied therein, including, but not limited to, rights under the Danish Marketing Practices Act or under similar rules of law, patents, utility models, copyrights and related rights, software, trademarks, semiconductors, designs, know-how, rights in databases, trade secrets, and all applications or pending applications for such in all cases, whether or not registrable in any country, and all rights and forms of protection of a similar nature or having equivalent or similar effect anywhere in the world, shall be and remain the sole property of Universal Robots. Nothing in the T&Cs shall be construed as granting you any license to such rights, including, without limitation, any licenses to use Universal Robots’ trademarks, patents, or designs, except as strictly necessary in order for you to engage in the use permitted pursuant to Section 1. + +2.2. If you create any derivative works based on the Graphical Documentation, Universal Robots shall own the intellectual property rights in and to such derivative works. The foregoing notwithstanding, you may use such derivative works in connection with your use of the Graphical Documentation in accordance with Section 1. + + +3. NO WARRANTIES, LIMITATIONS OF LIABILITY + +3.1. THE GRAPHICAL DOCUMENTATION IS PROVIDED ON AN “AS IS” BASIS AND UNIVERSAL ROBOTS MAKES NO WARRANTY OF ANY KIND WITH RESPECT TO THE GRAPHICAL DOCUMENTATION AND WE HEREBY EXPRESSLY EXCLUDE ANY WARRANTIES WITH RESPECT THERETO, WHETHER EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING BUT NOT LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, NONINFRINGEMENT, ACCURACY OR ANY OTHER WARRANTIES OR GUARANTEES THAT MAY ARISE FROM COURSE OF DEALING, USAGE, OR TRADE PRACTICE. NEITHER UNIVERSAL ROBOTS NOR ITS SUPPLIERS, INCLUDING – WITHOUT LIMITATION – ITS LICENSORS, MAKE ANY REPRESENTATION, WARRANTY, OR OTHER COMMITMENT REGARDING (1) THE USE OR INABILITY TO USE THE GRAPHICAL DOCUMENTATION; OR (2) ANY RESULTS OF SUCH USE IN TERMS OF CORRECTNESS, ACCURACY, OR RELIABILITY. YOU UNDERSTAND AND AGREE THAT YOU ASSUME THE ENTIRE RISK AS TO YOUR USE OF THE GRAPHICAL DOCUMENTATION. + +3.2. TO THE EXTENT PERMITTED BY LAW, IN NO EVENT WILL UNIVERSAL ROBOTS BE LIABLE FOR ANY LOSSES OR DAMAGES INCURRED BY YOU, WHETHER DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL, INCLUDING LOST OR ANTICIPATED PROFITS, SAVINGS, INTERRUPTION TO BUSINESS, LOSS OF BUSINESS OPPORTUNITIES, LOSS OF BUSINESS INFORMATION OR OTHER DATA, THE COST OF RECOVERING SUCH LOST INFORMATION OR DATA, THE COST OF SUBSTITUTE INTELLECTUAL PROPERTY OR ANY OTHER PECUNIARY LOSS ARISING FROM THE USE OF, OR THE INABILITY TO USE, THE GRAPHICAL DOCUMENTATION REGARDLESS OF WHETHER UNIVERSAL ROBOTS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. THE FOREGOING LIMITATIONS APPLY REGARDLESS OF THE CAUSE OR CIRCUMSTANCES GIVING RISE TO SUCH LOSS, DAMAGE OR LIABILITY, EVEN IF SUCH LOSS, DAMAGE OR LIABILITY IS BASED ON NEGLIGENCE OR OTHER TORTS OR BREACH OF CONTRACT. + + +4. INDEMNIFICATION + +4.1. You shall defend, indemnify, and hold Universal Robots and its affiliates, employees, and agents harmless, from and against all sums, claims, costs, duties, liabilities, losses, obligations, suits, actions, damages, penalties, awards, fines, interest, and other expenses (including investigation expenses and attorneys’ fees) that Universal Robots may incur or be obligated to pay as a result of your unauthorized use, modification, resale, transfer, shipment, or export of the Graphical Documentation. + + +5. MISCELLANEOUS + +5.1. Entire Agreement. Except as otherwise explicitly provided for herein, the T&Cs constitute the entire agreement and supersedes all prior negotiations, promises, understandings, and agreements between the parties with respect to the subject matter hereof. + +5.2. Changes to the T&Cs. Universal Robots reserves the right, in its sole and absolute discretion, to change the terms of the T&Cs by providing you with ninety (90) days’ notice. + +5.3. Obligations on Legal Successors. The parties undertake to impose the obligations under the T&Cs on their statutory or contractual legal successors, if any. + +5.4. Export Laws. You agree to comply with all applicable laws and regulations, including export laws of the United States and any other applicable country or jurisdiction. You agree that the Graphical Documentation will not be shipped, transferred, or exported into any country or used in any manner prohibited by the United States Export Administration Act or any other country’s export laws, restrictions, or regulations (collectively the “Export Laws”). In addition, if the Graphical Documentation are identified as export controlled items under the Export Laws, you represent and warrant that you are not a citizen, or otherwise located within, an embargoed nation and that you are not otherwise prohibited under the Export Laws from receiving the Graphical Documentation. + +5.5. No Agency. The parties are independent contractors and nothing in the T&Cs shall be construed as to create an agency, joint venture, partnership, or other form of business association between the parties. + +5.6. Survival. If the contents of individual provisions of the T&Cs are intended to survive the termination or expiration of the T&Cs, such provisions, including but not limited to provisions governing warranties and representations and the transfer of rights, title and interest to Universal Robots, shall to this extent remain in effect and be fully enforceable also after the termination or expiration of the T&Cs for whatever reason. + + +6. TERM AND TERMINATION + +6.1. The T&Cs shall enter into force upon your receipt of, or you accessing, the Graphical Documentation and continue to be in force until terminated in accordance with this Section 6. The T&Cs shall automatically expire at such time as you are no longer permitted to use the Graphical Documentation in accordance with Section 1. + +6.2. You may terminate the T&Cs for convenience at any time by deleting all copies of the Graphical Documentation in your possession. Universal Robots may terminate the T&Cs for convenience by providing you with ninety (90) days’ notice. + +6.3. Universal Robots may terminate the T&Cs for cause with immediate effect in case of your material breach of the T&Cs. + + +7. EFFECTS OF TERMINATION + +7.1. Upon expiration or termination of the T&Cs, for whatever reason, you must immediately cease use of the Graphical Documentation and delete all copies of the Graphical Documentation in your possession. + +8. GOVERNING LAW AND VENUE + +8.1. The T&Cs shall be governed by and construed in accordance with the laws of Denmark, without giving effect to conflict of law provisions thereof. The parties expressly disclaim the applicability of the United Nations Convention on Contracts for the International Sale of Goods. + +8.2. Any and all disputes arising out of or in connection with the T&Cs shall be submitted to the International Chamber of Commerce and shall be settled under the Rules of Arbitration of the International Chamber of Commerce by one (1) arbitrator appointed in accordance with said Rules. The place of arbitration shall be Copenhagen, Denmark. The arbitration shall be conducted in the English language. The foregoing notwithstanding, Universal Robots may seek preliminary, temporary, or permanent injunctive relief and other equitable remedies in any court of competent jurisdiction prior to or during arbitration and may enforce the award of the arbitrator in any court of competent jurisdiction. + + +* E.g., STEP-Files (ISO 10303-21), Collada (.dae), STL files (.stl), GLB files (.glb), GLFT files (.glft) , Jupiter Tessellation files (.jt), E-plan files (.emp), electrical schematics, CAD files, and drawings including the contents of these technical files. “Software”, as defined in Universal Robots End User Software License Agreement, does not constitute “Technical Documentation” and your use thereof is, unless otherwise agreed with Universal Robots in writing, governed by Universal Robots’ End User Software License Agreement. diff --git a/my_dual_robot_cell/my_dual_robot_cell_description/launch/view_robot.launch.py b/my_dual_robot_cell/my_dual_robot_cell_description/launch/view_robot.launch.py new file mode 100644 index 0000000..4a8c477 --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_description/launch/view_robot.launch.py @@ -0,0 +1,52 @@ +from launch import LaunchDescription +from launch.substitutions import Command, PathJoinSubstitution +from launch_ros.actions import Node +from launch_ros.parameter_descriptions import ParameterValue +from launch_ros.substitutions import FindPackageShare + + +def generate_launch_description(): + description_package = FindPackageShare("my_dual_robot_cell_description") + description_file = PathJoinSubstitution( + [description_package, "urdf", "my_dual_robot_cell.urdf.xacro"] + ) + rvizconfig_file = PathJoinSubstitution([description_package, "rviz", "urdf.rviz"]) + + robot_description = ParameterValue( + Command( + [ + "xacro ", + description_file, + " ", + "alice_ur_type:=", + "ur3", + " ", + "bob_ur_type:=", + "ur3", + ] + ), + value_type=str, + ) + + robot_state_publisher_node = Node( + package="robot_state_publisher", + executable="robot_state_publisher", + parameters=[{"robot_description": robot_description}], + ) + + joint_state_publisher_gui_node = Node( + package="joint_state_publisher_gui", + executable="joint_state_publisher_gui", + ) + + rviz_node = Node( + package="rviz2", + executable="rviz2", + name="rviz2", + output="screen", + arguments=["-d", rvizconfig_file], + ) + + return LaunchDescription( + [joint_state_publisher_gui_node, robot_state_publisher_node, rviz_node] + ) diff --git a/my_dual_robot_cell/my_dual_robot_cell_description/meshes/171005_Motek_Monitor_L.dae b/my_dual_robot_cell/my_dual_robot_cell_description/meshes/171005_Motek_Monitor_L.dae new file mode 100644 index 0000000..97fe0cb --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_description/meshes/171005_Motek_Monitor_L.dae @@ -0,0 +1,137 @@ + + + + + VCGLab + VCGLib | MeshLab + + Y_UP + So. Okt 8 19:20:17 2017 + So. Okt 8 19:20:17 2017 + + + + notexture.png + + + + + + + + + + + + + texture0 + R8G8B8 + + + + + texture0-surface + LINEAR + LINEAR + + + + + + 0 0 0 1 + + + 0 0 0 1 + + + + + + 0 0 0 1 + + + 0.3 + + + 0 0 0 1 + + + 0.5 + + + 0 0 0 1 + + + 0 + + + 0 + + + + + + + + + + + -0.0916772 -0.0777887 0.00022198 -0.0938519 -0.0795624 0.00655396 -0.0916772 0.0777887 0.00022198 -0.0938519 0.0795624 0.0133077 0.0916772 -0.0777887 0.00022198 0.0938519 -0.0795624 0.00655396 0.0916772 0.0777887 0.00022198 0.0938519 0.0795624 0.0133077 0.0810381 0.0814928 0.00022198 -0.0810381 0.0814928 0.00022198 -0.0829604 0.083351 0.0134685 0.0829604 0.083351 0.0134685 -0.0810381 -0.0814928 0.00022198 0.0810381 -0.0814928 0.00022198 0.0829604 -0.083351 0.00639316 -0.0829604 -0.083351 0.00639316 -0.0944443 0.06763 0.00022198 -0.0944443 -0.06763 0.00022198 -0.0966847 -0.0691721 0.00699495 -0.0966847 0.0691721 0.0128667 0.0944443 -0.06763 0.00022198 0.0944443 0.06763 0.00022198 0.0966847 0.0691721 0.0128667 0.0966847 -0.0691721 0.00699495 0.0829604 0.0691721 0.0128667 0.0829604 -0.0691721 0.00699495 -0.0829604 0.0691721 0.0128667 -0.0829604 -0.0691721 0.00699495 -0.0810381 0.06763 0.00022198 -0.0810381 -0.06763 0.00022198 0.0810381 0.06763 0.00022198 0.0810381 -0.06763 0.00022198 -0.217617 -0.0948323 0.0737222 -0.213925 -0.104036 0.0746289 -0.226733 -0.0721063 0.341554 -0.223042 -0.0813098 0.342461 0.241557 0.089356 0.0737222 0.245249 0.0801525 0.0746289 0.232441 0.112082 0.341554 0.236132 0.102879 0.342461 0.0792243 0.0510807 0.346205 -0.0738337 -0.0103155 0.346205 -0.0701419 -0.019519 0.347112 0.0829161 0.0418771 0.347112 -0.0644009 -0.0338309 0.0690709 0.0886571 0.0275652 0.0690709 0.0923489 0.0183617 0.0699776 -0.0607091 -0.0430345 0.0699776 -0.223747 -0.0795501 0.253827 -0.220603 -0.0873886 0.161449 -0.216911 -0.0965921 0.162356 -0.220056 -0.0887537 0.254734 0.24135 0.0898722 0.0785366 0.235427 0.104638 0.253827 0.239118 0.0954348 0.254734 0.245041 0.0806687 0.0794433 0.218467 0.0951258 0.335695 0.227122 0.0735479 0.0813943 -0.202876 -0.0738871 0.335695 -0.19422 -0.095465 0.0813943 -0.076632 -0.00258662 0.226217 -0.0734878 -0.0104251 0.133839 0.076426 0.0588095 0.226217 0.0795702 0.050971 0.133839 0.232355 0.101821 0.347112 0.238095 0.0875095 0.0690709 0.228663 0.111025 0.346205 0.241787 0.0783059 0.0699776 0.235499 0.0939828 0.254734 0.241422 0.0792168 0.0794433 0.231666 0.103555 0.253174 0.23759 0.0887885 0.0778837 -0.222754 -0.0700519 0.346205 -0.20963 -0.102771 0.0699776 -0.219062 -0.0792554 0.347112 -0.213321 -0.0935674 0.0690709 -0.219791 -0.0774171 0.252988 -0.216646 -0.0852555 0.160609 -0.012588 0.0469129 0.00102476 -0.0176738 0.0595916 0.153964 0.000591163 0.0493907 0.00125001 -0.004623 0.0623894 0.158064 0.013705 0.0466524 0.00189147 0.00812527 0.0605624 0.16974 0.0247568 0.0391149 0.00285147 0.0186301 0.0543886 0.187215 0.0320643 0.0279257 0.00398387 0.0252923 0.0448081 0.207827 -0.031741 0.00233154 0.00398387 -0.038513 0.0192139 0.207827 -0.0341916 0.0154689 0.00285147 -0.0403183 0.0307427 0.187215 -0.0314122 0.0285546 0.00189147 -0.0369919 0.0424646 0.16974 -0.0238261 0.0395962 0.00125001 -0.0290402 0.0525949 0.158064 + + + + + + + + + + -0.94556 0.25756 -0.198945 0.323447 0.929031 -0.179678 0.894287 -0.243594 -0.375383 -0.306659 -0.880811 -0.360738 0 0 -1 8.53192e-08 -0.0424047 0.999101 0 -0.0424046 0.999101 0 -0.0424047 0.999101 0 0 -1 0 0 -1 0.306659 -0.880811 -0.360738 0 -0.957536 -0.288313 -0.323447 0.929031 -0.179678 0 0.990304 -0.138914 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 -0.0424051 0.999101 0 -0.0424048 0.999101 0 -0.042405 0.999101 0 -0.0424048 0.999101 -1.30185e-07 -0.0424051 0.999101 0 -0.0424048 0.999101 0 0 -1 0 0 -1 0.94556 0.25756 -0.198945 0.949406 0 -0.31405 -0.894287 -0.243594 -0.375383 -0.949406 0 -0.31405 -0.928115 -0.372294 3.81545e-07 0.69069 0.33993 0.638275 0.928112 0.372302 -1.44968e-05 -0.647984 -0.327663 -0.687571 -0.296204 0.942658 -0.153813 0.370746 -0.92426 0.0910514 0.378693 -0.919759 0.103124 0.370748 -0.92426 0.0910433 -0.475211 0.874545 -0.0966705 -0.347127 0.865373 -0.361431 0.0338999 -0.0845111 -0.995846 0.0338999 -0.0845111 -0.995846 -0.0338994 0.0845098 0.995846 -0.0338994 0.0845097 0.995846 -0.371425 0.925947 0.0683055 -0.370748 0.92426 -0.0910445 -0.370952 0.924767 -0.0848594 -0.474576 0.875556 -0.0904459 0.370748 -0.92426 0.0910448 0.370748 -0.92426 0.0910445 0.370751 -0.924259 0.091045 0.377655 -0.921524 0.0903881 -0.36552 0.926802 -0.0862228 -0.26141 0.961043 -0.0897891 0.928115 0.372293 -1.61742e-07 0.928115 0.372294 8.3027e-09 -0.928115 -0.372295 2.4054e-07 -0.928116 -0.372292 -1.00824e-06 -0.261289 0.961015 -0.0904375 -0.287233 0.955427 0.0682408 0.370768 -0.924316 0.0903905 0.370746 -0.924261 0.0910453 0.734155 0.231612 -0.638257 0.369835 -0.921982 0.114766 -0.336127 0.869697 -0.36145 -0.0338996 0.0845104 0.995846 -0.487345 0.868529 -0.0902846 -0.487345 0.86853 -0.0902841 -0.694789 -0.210962 0.687578 -0.487351 0.868527 -0.0902836 0.370748 -0.92426 0.0910479 0.0338999 -0.084511 -0.995846 -0.182628 0.979302 -0.0872575 0.207304 0.975476 -0.0739667 0.565686 0.823139 -0.0494104 0.837936 0.545493 -0.0173456 -0.325975 0.812642 0.483068 -0.325975 0.812642 0.483067 -0.325975 0.812641 0.483068 -0.325975 0.812642 0.483068 0.370821 -0.924441 0.0888817 -0.982624 -0.184793 -0.017345 -0.977715 0.204041 -0.0494107 -0.823956 0.561805 -0.0739665 -0.54476 0.83404 -0.0872575 0.370748 -0.92426 0.0910483 0.370748 -0.92426 0.0910432 0.370751 -0.924259 0.0910446 0.370749 -0.92426 0.0910448 -0.94454 0.265705 -0.192991 0.321009 0.930372 -0.177093 0.906475 -0.232166 -0.352708 -0.311908 -0.881664 -0.354093 0 0 -1 0 -0.0424046 0.999101 -8.53192e-08 -0.0424047 0.999101 0 -0.0424047 0.999101 0 0 -1 0 0 -1 0.311908 -0.881664 -0.354093 0 -0.957536 -0.288313 -0.321009 0.930372 -0.177093 0 0.990304 -0.138914 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 -0.0424051 0.999101 0 -0.0424048 0.999101 1.30185e-07 -0.0424051 0.999101 0 -0.0424048 0.999101 0 -0.042405 0.999101 0 -0.0424048 0.999101 0 0 -1 0 0 -1 0.94454 0.265705 -0.192991 0.98448 0.0074419 -0.175339 -0.906475 -0.232166 -0.352708 -0.98448 0.0074419 -0.175339 -0.928115 -0.372294 3.77399e-07 0.690696 0.339941 0.638262 0.928115 0.372294 5.95705e-06 -0.647983 -0.327662 -0.687572 -0.256832 0.959715 -0.113952 0.370749 -0.92426 0.091044 0.370748 -0.92426 0.0910473 -0.347127 0.865373 -0.361431 -0.347127 0.865373 -0.361431 0.0338999 -0.0845111 -0.995846 0.0338999 -0.0845111 -0.995846 -0.0338995 0.08451 0.995846 -0.0338994 0.0845098 0.995846 -0.371425 0.925947 0.0683054 -0.370748 0.92426 -0.0910444 -0.452184 0.889342 0.067831 -0.474576 0.875556 -0.0904458 0.370748 -0.92426 0.0910415 0.370748 -0.92426 0.0910445 0.370748 -0.92426 0.0910483 0.370748 -0.92426 0.0910444 -0.261293 0.961014 -0.0904369 -0.261414 0.961042 -0.0897892 0.928118 0.372286 1.3686e-06 0.928115 0.372293 2.11718e-07 -0.928116 -0.372292 -3.81546e-07 -0.928115 -0.372294 -5.15932e-07 -0.26177 0.960944 -0.089793 -0.370908 0.924658 -0.0862247 0.370771 -0.924315 0.0903906 0.370751 -0.924259 0.091045 0.734144 0.231615 -0.638268 0.356771 -0.928483 0.103118 -0.367842 0.917014 -0.154204 -0.0338994 0.0845098 0.995846 -0.487351 0.868526 -0.0902842 -0.37698 0.922326 -0.0848582 -0.694789 -0.210962 0.687578 -0.376652 0.921228 -0.0973294 0.0338999 -0.084511 -0.995846 -0.182536 0.97932 -0.0872477 0.207514 0.975434 -0.0739379 0.565847 0.82303 -0.0493804 0.837976 0.545433 -0.017334 -0.325975 0.812642 0.483067 -0.325975 0.812642 0.483068 -0.325975 0.812641 0.483068 0.370821 -0.924441 0.0888817 -0.982611 -0.184864 -0.0173334 -0.977756 0.203852 -0.0493808 -0.824079 0.561629 -0.0739375 -0.544838 0.83399 -0.0872477 0.370748 -0.92426 0.0910428 0.37075 -0.924259 0.0910445 -0.94556 0.25756 -0.198945 0.323447 0.929031 -0.179678 0.894287 -0.243594 -0.375383 -0.306659 -0.880811 -0.360738 0 0 -1 8.53192e-08 -0.0424047 0.999101 0 -0.0424046 0.999101 0 -0.0424047 0.999101 0 0 -1 0 0 -1 0.306659 -0.880811 -0.360738 0 -0.957536 -0.288313 -0.323447 0.929031 -0.179678 0 0.990304 -0.138914 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 -0.0424051 0.999101 0 -0.0424048 0.999101 0 -0.042405 0.999101 0 -0.0424048 0.999101 -1.30185e-07 -0.0424051 0.999101 0 -0.0424048 0.999101 0 0 -1 0 0 -1 0.94556 0.25756 -0.198945 0.949406 0 -0.31405 -0.894287 -0.243594 -0.375383 -0.949406 0 -0.31405 -0.928115 -0.372294 3.81545e-07 0.69069 0.33993 0.638275 0.928112 0.372302 -1.44968e-05 -0.647984 -0.327663 -0.687571 -0.296204 0.942658 -0.153813 0.370746 -0.92426 0.0910514 0.378693 -0.919759 0.103124 0.370748 -0.92426 0.0910433 -0.475211 0.874545 -0.0966705 -0.347127 0.865373 -0.361431 0.0338999 -0.0845111 -0.995846 0.0338999 -0.0845111 -0.995846 -0.0338994 0.0845098 0.995846 -0.0338994 0.0845097 0.995846 -0.371425 0.925947 0.0683055 -0.370748 0.92426 -0.0910445 -0.370952 0.924767 -0.0848594 -0.474576 0.875556 -0.0904459 0.370748 -0.92426 0.0910448 0.370748 -0.92426 0.0910445 0.370751 -0.924259 0.091045 0.377655 -0.921524 0.0903881 -0.36552 0.926802 -0.0862228 -0.26141 0.961043 -0.0897891 0.928115 0.372293 -1.61742e-07 0.928115 0.372294 8.3027e-09 -0.928115 -0.372295 2.4054e-07 -0.928116 -0.372292 -1.00824e-06 -0.261289 0.961015 -0.0904375 -0.287233 0.955427 0.0682408 0.370768 -0.924316 0.0903905 0.370746 -0.924261 0.0910453 0.734155 0.231612 -0.638257 0.369835 -0.921982 0.114766 -0.336127 0.869697 -0.36145 -0.0338996 0.0845104 0.995846 -0.487345 0.868529 -0.0902846 -0.487345 0.86853 -0.0902841 -0.694789 -0.210962 0.687578 -0.487351 0.868527 -0.0902836 0.370748 -0.92426 0.0910479 0.0338999 -0.084511 -0.995846 -0.182628 0.979302 -0.0872575 0.207304 0.975476 -0.0739667 0.565686 0.823139 -0.0494104 0.837936 0.545493 -0.0173456 -0.325975 0.812642 0.483068 -0.325975 0.812642 0.483067 -0.325975 0.812641 0.483068 -0.325975 0.812642 0.483068 0.370821 -0.924441 0.0888817 -0.982624 -0.184793 -0.017345 -0.977715 0.204041 -0.0494107 -0.823956 0.561805 -0.0739665 -0.54476 0.83404 -0.0872575 0.370748 -0.92426 0.0910483 0.370748 -0.92426 0.0910432 0.370751 -0.924259 0.0910446 0.370749 -0.92426 0.0910448 -0.94454 0.265705 -0.192991 0.321009 0.930372 -0.177093 0.906475 -0.232166 -0.352708 -0.311908 -0.881664 -0.354093 0 0 -1 0 -0.0424046 0.999101 -8.53192e-08 -0.0424047 0.999101 0 -0.0424047 0.999101 0 0 -1 0 0 -1 0.311908 -0.881664 -0.354093 0 -0.957536 -0.288313 -0.321009 0.930372 -0.177093 0 0.990304 -0.138914 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 -0.0424051 0.999101 0 -0.0424048 0.999101 1.30185e-07 -0.0424051 0.999101 0 -0.0424048 0.999101 0 -0.042405 0.999101 0 -0.0424048 0.999101 0 0 -1 0 0 -1 0.94454 0.265705 -0.192991 0.98448 0.0074419 -0.175339 -0.906475 -0.232166 -0.352708 -0.98448 0.0074419 -0.175339 -0.928115 -0.372294 3.77399e-07 0.690696 0.339941 0.638262 0.928115 0.372294 5.95705e-06 -0.647983 -0.327662 -0.687572 -0.256832 0.959715 -0.113952 0.370749 -0.92426 0.091044 0.370748 -0.92426 0.0910473 -0.347127 0.865373 -0.361431 -0.347127 0.865373 -0.361431 0.0338999 -0.0845111 -0.995846 0.0338999 -0.0845111 -0.995846 -0.0338995 0.08451 0.995846 -0.0338994 0.0845098 0.995846 -0.371425 0.925947 0.0683054 -0.370748 0.92426 -0.0910444 -0.452184 0.889342 0.067831 -0.474576 0.875556 -0.0904458 0.370748 -0.92426 0.0910415 0.370748 -0.92426 0.0910445 0.370748 -0.92426 0.0910483 0.370748 -0.92426 0.0910444 -0.261293 0.961014 -0.0904369 -0.261414 0.961042 -0.0897892 0.928118 0.372286 1.3686e-06 0.928115 0.372293 2.11718e-07 -0.928116 -0.372292 -3.81546e-07 -0.928115 -0.372294 -5.15932e-07 -0.26177 0.960944 -0.089793 -0.370908 0.924658 -0.0862247 0.370771 -0.924315 0.0903906 0.370751 -0.924259 0.091045 0.734144 0.231615 -0.638268 0.356771 -0.928483 0.103118 -0.367842 0.917014 -0.154204 -0.0338994 0.0845098 0.995846 -0.487351 0.868526 -0.0902842 -0.37698 0.922326 -0.0848582 -0.694789 -0.210962 0.687578 -0.376652 0.921228 -0.0973294 0.0338999 -0.084511 -0.995846 -0.182536 0.97932 -0.0872477 0.207514 0.975434 -0.0739379 0.565847 0.82303 -0.0493804 0.837976 0.545433 -0.017334 -0.325975 0.812642 0.483067 -0.325975 0.812642 0.483068 -0.325975 0.812641 0.483068 0.370821 -0.924441 0.0888817 -0.982611 -0.184864 -0.0173334 -0.977756 0.203852 -0.0493808 -0.824079 0.561629 -0.0739375 -0.544838 0.83399 -0.0872477 0.370748 -0.92426 0.0910428 0.37075 -0.924259 0.0910445 + + + + + + + + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.182338 0.0220053 0.180292 0.0157126 0.18035 0.0154955 0.179348 0.0159611 0.178019 0.0223002 0.179246 0.0159163 0.178953 0.013746 0.175333 0.00947583 0.178978 0.0134606 0.183098 0.00899959 0.180398 0.0127531 0.180288 0.0125815 0.238394 0.248858 0.267087 0.277552 0.238394 0.277552 0.238394 0.248858 0.267087 0.277552 0.238394 0.277552 0.267087 0.248858 0.238394 0.277552 0.238394 0.248858 0.267087 0.248858 0.238394 0.277552 0.238394 0.248858 0.267087 0.248858 0.238394 0.277552 0.238394 0.248858 0.267087 0.248858 0.238394 0.277552 0.238394 0.248858 0.178978 0.0134606 0.175675 0.00899959 0.179112 0.0133156 0.175675 0.00899959 0.180288 0.0125815 0.179112 0.0133156 0.182251 0.0224536 0.180189 0.0157629 0.180292 0.0157126 0.182129 0.0226858 0.179348 0.0159611 0.180189 0.0157629 0.267087 0.248858 0.238394 0.277552 0.238394 0.248858 0.267087 0.248858 0.238394 0.277552 0.238394 0.248858 0.238394 0.248858 0.267087 0.277552 0.238394 0.277552 0.267087 0.248858 0.238394 0.277552 0.238394 0.248858 0.267087 0.248858 0.238394 0.277552 0.238394 0.248858 0.267087 0.248858 0.238394 0.277552 0.238394 0.248858 0.238394 0.248858 0.267087 0.277552 0.238394 0.277552 0.267087 0.248858 0.238394 0.277552 0.238394 0.248858 0.267087 0.248858 0.238394 0.277552 0.238394 0.248858 0.267087 0.248858 0.238394 0.277552 0.238394 0.248858 0.267087 0.248858 0.238394 0.277552 0.238394 0.248858 0.267087 0.248858 0.238394 0.277552 0.238394 0.248858 0.179246 0.0159163 0.177911 0.0219296 0.17917 0.0157878 0.17917 0.0157878 0.174814 0.00977683 0.178953 0.013746 0.183386 0.00937593 0.180422 0.012965 0.180398 0.0127531 0.183822 0.00960553 0.18035 0.0154955 0.180422 0.012965 0.559422 0.686952 0.558848 0.705089 0.558266 0.687005 0.612804 0.706545 0.612588 0.70401 0.613552 0.705449 0.614351 0.651854 0.613069 0.651864 0.614045 0.65077 0.560373 0.650692 0.558921 0.649972 0.559741 0.648801 0.280992 0.434584 0.280782 0.434931 0.28055 0.43459 0.560043 0.667782 0.55991 0.651447 0.560373 0.650692 0.612785 0.652827 0.61122 0.653312 0.612653 0.651252 0.561959 0.652746 0.59601 0.650885 0.61122 0.653312 0.243092 0.26308 0.236121 0.265976 0.236117 0.261993 0.243092 0.26308 0.250177 0.266084 0.243056 0.26607 0.612653 0.651252 0.596025 0.648787 0.613422 0.64947 0.59601 0.650885 0.577315 0.648722 0.596025 0.648787 0.559635 0.706327 0.57691 0.704759 0.5769 0.706834 0.5769 0.706834 0.59546 0.704887 0.595464 0.706834 0.25019 0.253909 0.243093 0.259093 0.243053 0.253913 0.332766 0.446365 0.361798 0.24251 0.361798 0.446365 0.243053 0.253913 0.236129 0.257977 0.236117 0.253933 0.243093 0.259093 0.236117 0.261993 0.236129 0.257977 0.59546 0.704887 0.561907 0.702497 0.610774 0.702708 7.50045e-05 0.996271 0.999925 0.000420142 0.999731 0.996616 0.612176 0.704716 0.610774 0.702708 0.612659 0.687987 0.612659 0.687987 0.61122 0.653312 0.612785 0.652827 0.294136 0.434978 0.289733 0.43461 0.294369 0.434635 0.289733 0.43461 0.281023 0.434929 0.280992 0.434584 0.613552 0.705449 0.613114 0.688014 0.614287 0.688095 0.614287 0.688095 0.613225 0.652706 0.614351 0.651854 0.55991 0.651447 0.558311 0.667691 0.558921 0.649972 0.559513 0.667758 0.558266 0.687005 0.558311 0.667691 0.257153 0.25799 0.250174 0.263087 0.25017 0.259101 0.25019 0.253909 0.257153 0.25799 0.25017 0.259101 0.560012 0.68132 0.574027 0.608848 0.574026 0.68132 0.574025 0.717591 0.560012 0.68132 0.574026 0.68132 0.614045 0.65077 0.612653 0.651252 0.613422 0.64947 0.560015 0.608848 0.574027 0.606853 0.574027 0.608848 0.257142 0.265623 0.250177 0.266084 0.250174 0.263087 0.595464 0.706834 0.612176 0.704716 0.612804 0.706545 0.162238 0.348671 0.163973 0.313249 0.163973 0.348975 0.163973 0.382902 0.162238 0.348671 0.163973 0.348975 0.559911 0.703718 0.559635 0.706327 0.558848 0.705089 0.162238 0.312944 0.163973 0.27932 0.163973 0.313249 0.560043 0.667782 0.560373 0.650692 0.577314 0.650694 0.577314 0.650694 0.559741 0.648801 0.577315 0.648722 0.165087 0.0186697 0.130177 0.0149243 0.127809 0.0166051 0.166034 0.0148054 0.132001 0.0131707 0.130177 0.0149243 0.169421 0.0111899 0.133647 0.0113906 0.132001 0.0131707 0.174712 0.00834179 0.135247 0.00960141 0.133647 0.0113906 0.585221 0.622029 0.59493 0.628174 0.575511 0.628174 0.56728 0.645672 0.59493 0.628174 0.603161 0.645672 0.559849 0.702751 0.608661 0.67186 0.610592 0.702751 0.56178 0.67186 0.603161 0.645672 0.608661 0.67186 0.135247 0.00960141 0.184882 0.0293623 0.135348 0.0272724 0.135348 0.0272724 0.177428 0.0283761 0.133644 0.0247319 0.133644 0.0247319 0.171162 0.0259579 0.131952 0.0220857 0.131952 0.0220857 0.166868 0.0225131 0.130102 0.0193882 0.130102 0.0193882 0.165087 0.0186697 0.127809 0.0166051 0.559911 0.703718 0.57691 0.704759 0.560313 0.704528 0.612653 0.651252 0.61122 0.653312 0.59601 0.650885 0.559422 0.686952 0.559513 0.667758 0.560043 0.667782 0.565766 0.680803 0.570364 0.711743 0.565766 0.714329 0.182338 0.0220053 0.182251 0.0224536 0.180292 0.0157126 0.179348 0.0159611 0.178143 0.0224742 0.178019 0.0223002 0.178953 0.013746 0.174814 0.00977683 0.175333 0.00947583 0.183098 0.00899959 0.183386 0.00937593 0.180398 0.0127531 0.238394 0.248858 0.267087 0.248858 0.267087 0.277552 0.238394 0.248858 0.267087 0.248858 0.267087 0.277552 0.267087 0.248858 0.267087 0.277552 0.238394 0.277552 0.267087 0.248858 0.267087 0.277552 0.238394 0.277552 0.267087 0.248858 0.267087 0.277552 0.238394 0.277552 0.267087 0.248858 0.267087 0.277552 0.238394 0.277552 0.178978 0.0134606 0.175333 0.00947583 0.175675 0.00899959 0.175675 0.00899959 0.183098 0.00899959 0.180288 0.0125815 0.182251 0.0224536 0.182129 0.0226858 0.180189 0.0157629 0.182129 0.0226858 0.178143 0.0224742 0.179348 0.0159611 0.267087 0.248858 0.267087 0.277552 0.238394 0.277552 0.267087 0.248858 0.267087 0.277552 0.238394 0.277552 0.238394 0.248858 0.267087 0.248858 0.267087 0.277552 0.267087 0.248858 0.267087 0.277552 0.238394 0.277552 0.267087 0.248858 0.267087 0.277552 0.238394 0.277552 0.267087 0.248858 0.267087 0.277552 0.238394 0.277552 0.238394 0.248858 0.267087 0.248858 0.267087 0.277552 0.267087 0.248858 0.267087 0.277552 0.238394 0.277552 0.267087 0.248858 0.267087 0.277552 0.238394 0.277552 0.267087 0.248858 0.267087 0.277552 0.238394 0.277552 0.267087 0.248858 0.267087 0.277552 0.238394 0.277552 0.267087 0.248858 0.267087 0.277552 0.238394 0.277552 0.179246 0.0159163 0.178019 0.0223002 0.177911 0.0219296 0.17917 0.0157878 0.177911 0.0219296 0.174814 0.00977683 0.183386 0.00937593 0.183822 0.00960553 0.180422 0.012965 0.183822 0.00960553 0.182338 0.0220053 0.18035 0.0154955 0.559422 0.686952 0.559911 0.703718 0.558848 0.705089 0.612804 0.706545 0.612176 0.704716 0.612588 0.70401 0.614351 0.651854 0.613225 0.652706 0.613069 0.651864 0.560373 0.650692 0.55991 0.651447 0.558921 0.649972 0.280992 0.434584 0.281023 0.434929 0.280782 0.434931 0.560043 0.667782 0.559513 0.667758 0.55991 0.651447 0.561959 0.652746 0.577314 0.650694 0.59601 0.650885 0.243092 0.26308 0.243056 0.26607 0.236121 0.265976 0.243092 0.26308 0.250174 0.263087 0.250177 0.266084 0.612653 0.651252 0.59601 0.650885 0.596025 0.648787 0.59601 0.650885 0.577314 0.650694 0.577315 0.648722 0.559635 0.706327 0.560313 0.704528 0.57691 0.704759 0.5769 0.706834 0.57691 0.704759 0.59546 0.704887 0.25019 0.253909 0.25017 0.259101 0.243093 0.259093 0.332766 0.446365 0.332766 0.24251 0.361798 0.24251 0.243053 0.253913 0.243093 0.259093 0.236129 0.257977 0.243093 0.259093 0.243092 0.26308 0.236117 0.261993 0.59546 0.704887 0.57691 0.704759 0.561907 0.702497 7.50045e-05 0.996271 0.000269044 7.50045e-05 0.999925 0.000420142 0.612176 0.704716 0.59546 0.704887 0.610774 0.702708 0.612659 0.687987 0.610774 0.702708 0.61122 0.653312 0.294136 0.434978 0.289764 0.434956 0.289733 0.43461 0.289733 0.43461 0.289764 0.434956 0.281023 0.434929 0.613552 0.705449 0.612588 0.70401 0.613114 0.688014 0.614287 0.688095 0.613114 0.688014 0.613225 0.652706 0.55991 0.651447 0.559513 0.667758 0.558311 0.667691 0.559513 0.667758 0.559422 0.686952 0.558266 0.687005 0.257153 0.25799 0.257142 0.265623 0.250174 0.263087 0.25019 0.253909 0.257171 0.253941 0.257153 0.25799 0.560012 0.68132 0.560015 0.608848 0.574027 0.608848 0.574025 0.717591 0.560012 0.719514 0.560012 0.68132 0.614045 0.65077 0.613069 0.651864 0.612653 0.651252 0.560015 0.608848 0.560012 0.60493 0.574027 0.606853 0.257142 0.265623 0.257145 0.266009 0.250177 0.266084 0.595464 0.706834 0.59546 0.704887 0.612176 0.704716 0.162238 0.348671 0.162238 0.312944 0.163973 0.313249 0.163973 0.382902 0.162257 0.384702 0.162238 0.348671 0.559911 0.703718 0.560313 0.704528 0.559635 0.706327 0.162238 0.312944 0.162256 0.277521 0.163973 0.27932 0.577314 0.650694 0.560373 0.650692 0.559741 0.648801 0.165087 0.0186697 0.166034 0.0148054 0.130177 0.0149243 0.166034 0.0148054 0.169421 0.0111899 0.132001 0.0131707 0.169421 0.0111899 0.174712 0.00834179 0.133647 0.0113906 0.174712 0.00834179 0.181172 0.00662851 0.135247 0.00960141 0.56728 0.645672 0.575511 0.628174 0.59493 0.628174 0.559849 0.702751 0.56178 0.67186 0.608661 0.67186 0.56178 0.67186 0.56728 0.645672 0.603161 0.645672 0.135247 0.00960141 0.181172 0.00662851 0.184882 0.0293623 0.135348 0.0272724 0.184882 0.0293623 0.177428 0.0283761 0.133644 0.0247319 0.177428 0.0283761 0.171162 0.0259579 0.131952 0.0220857 0.171162 0.0259579 0.166868 0.0225131 0.130102 0.0193882 0.166868 0.0225131 0.165087 0.0186697 0.559911 0.703718 0.561907 0.702497 0.57691 0.704759 0.565766 0.680803 0.570364 0.61456 0.570364 0.711743 + + + + + + + + + + + + + + +

19 0 0 2 0 1 16 0 2 8 1 3 7 1 4 6 1 5 20 2 6 5 2 7 4 2 8 15 3 9 0 3 10 12 3 11 31 4 12 4 4 13 13 4 14 27 5 15 1 5 16 15 5 17 25 6 18 5 6 19 23 6 20 27 7 21 14 7 22 25 7 23 29 8 24 0 8 25 17 8 26 31 9 27 12 9 28 29 9 29 4 10 30 14 10 31 13 10 32 14 11 33 12 11 34 13 11 35 3 12 36 9 12 37 2 12 38 10 13 39 8 13 40 9 13 41 8 14 42 28 14 43 9 14 44 30 15 45 29 15 46 28 15 47 2 16 48 28 16 49 16 16 50 28 17 51 17 17 52 16 17 53 10 18 54 24 18 55 11 18 56 26 19 57 25 19 58 24 19 59 7 20 60 24 20 61 22 20 62 24 21 63 23 21 64 22 21 65 3 22 66 26 22 67 10 22 68 19 23 69 27 23 70 26 23 71 6 24 72 30 24 73 8 24 74 21 25 75 31 25 76 30 25 77 6 26 78 22 26 79 21 26 80 21 27 81 23 27 82 20 27 83 1 28 84 17 28 85 0 28 86 18 29 87 16 29 88 17 29 89 51 30 90 34 30 91 48 30 92 66 31 93 39 31 94 38 31 95 52 32 96 37 32 97 36 32 98 73 33 99 32 33 100 75 33 101 71 34 102 36 34 103 65 34 104 59 35 105 33 35 106 73 35 107 69 36 108 57 36 109 67 36 110 59 37 111 46 37 112 57 37 113 61 38 114 75 38 115 77 38 116 61 39 117 45 39 118 44 39 119 67 40 120 45 40 121 65 40 122 46 41 123 44 41 124 45 41 125 72 42 126 42 42 127 41 42 128 41 43 129 43 43 130 40 43 131 40 44 132 60 44 133 41 44 134 60 45 135 63 45 136 61 45 137 41 46 138 76 46 139 72 46 140 60 47 141 77 47 142 76 47 143 43 48 144 58 48 145 56 48 146 58 49 147 57 49 148 56 49 149 64 50 150 56 50 151 68 50 152 68 51 153 57 51 154 69 51 155 38 52 156 70 52 157 66 52 158 70 53 159 52 53 160 71 53 161 38 54 162 54 54 163 53 54 164 53 55 165 55 55 166 52 55 167 33 56 168 49 56 169 32 56 170 50 57 171 48 57 172 49 57 173 70 58 174 63 58 175 62 58 176 40 59 177 70 59 178 62 59 179 68 60 180 55 60 181 54 60 182 39 61 183 68 61 184 54 61 185 36 62 186 67 62 187 65 62 188 69 63 189 37 63 190 55 63 191 71 64 192 45 64 193 63 64 194 40 65 195 64 65 196 66 65 197 76 66 198 49 66 199 48 66 200 34 67 201 76 67 202 48 67 203 35 68 204 72 68 205 34 68 206 77 69 207 32 69 208 49 69 209 59 70 210 73 70 211 47 70 212 47 71 213 75 71 214 44 71 215 79 72 216 80 72 217 78 72 218 81 73 219 82 73 220 80 73 221 83 74 222 84 74 223 82 74 224 85 75 225 86 75 226 84 75 227 79 76 228 95 76 229 81 76 230 83 77 231 95 77 232 93 77 233 87 78 234 91 78 235 89 78 236 85 79 237 93 79 238 91 79 239 86 80 240 89 80 241 88 80 242 88 81 243 91 81 244 90 81 245 90 82 246 93 82 247 92 82 248 92 83 249 95 83 250 94 83 251 94 84 252 79 84 253 78 84 254 35 85 255 42 85 256 74 85 257 67 86 258 57 86 259 46 86 260 51 87 261 50 87 262 59 87 263 51 88 264 58 88 265 35 88 266 19 89 267 3 89 268 2 89 269 8 90 270 11 90 271 7 90 272 20 91 273 23 91 274 5 91 275 15 92 276 1 92 277 0 92 278 31 93 279 20 93 280 4 93 281 27 94 282 18 94 283 1 94 284 25 95 285 14 95 286 5 95 287 27 96 288 15 96 289 14 96 290 29 97 291 12 97 292 0 97 293 31 98 294 13 98 295 12 98 296 4 99 297 5 99 298 14 99 299 14 100 300 15 100 301 12 100 302 3 101 303 10 101 304 9 101 305 10 102 306 11 102 307 8 102 308 8 103 309 30 103 310 28 103 311 30 104 312 31 104 313 29 104 314 2 105 315 9 105 316 28 105 317 28 106 318 29 106 319 17 106 320 10 107 321 26 107 322 24 107 323 26 108 324 27 108 325 25 108 326 7 109 327 11 109 328 24 109 329 24 110 330 25 110 331 23 110 332 3 111 333 19 111 334 26 111 335 19 112 336 18 112 337 27 112 338 6 113 339 21 113 340 30 113 341 21 114 342 20 114 343 31 114 344 6 115 345 7 115 346 22 115 347 21 116 348 22 116 349 23 116 350 1 117 351 18 117 352 17 117 353 18 118 354 19 118 355 16 118 356 51 119 357 35 119 358 34 119 359 66 120 360 64 120 361 39 120 362 52 121 363 55 121 364 37 121 365 73 122 366 33 122 367 32 122 368 71 123 369 52 123 370 36 123 371 59 124 372 50 124 373 33 124 374 59 125 375 47 125 376 46 125 377 61 126 378 44 126 379 75 126 380 61 127 381 63 127 382 45 127 383 67 128 384 46 128 385 45 128 386 46 129 387 47 129 388 44 129 389 72 130 390 74 130 391 42 130 392 41 131 393 42 131 394 43 131 395 40 132 396 62 132 397 60 132 398 60 133 399 62 133 400 63 133 401 41 134 402 60 134 403 76 134 404 60 135 405 61 135 406 77 135 407 43 136 408 42 136 409 58 136 410 58 137 411 59 137 412 57 137 413 64 138 414 43 138 415 56 138 416 68 139 417 56 139 418 57 139 419 38 140 420 53 140 421 70 140 422 70 141 423 53 141 424 52 141 425 38 142 426 39 142 427 54 142 428 53 143 429 54 143 430 55 143 431 33 144 432 50 144 433 49 144 434 50 145 435 51 145 436 48 145 437 70 146 438 71 146 439 63 146 440 40 147 441 66 147 442 70 147 443 68 148 444 69 148 445 55 148 446 39 149 447 64 149 448 68 149 449 36 150 450 37 150 451 67 150 452 69 151 453 67 151 454 37 151 455 71 152 456 65 152 457 45 152 458 40 153 459 43 153 460 64 153 461 76 154 462 77 154 463 49 154 464 34 155 465 72 155 466 76 155 467 35 156 468 74 156 469 72 156 470 77 157 471 75 157 472 32 157 473 47 158 474 73 158 475 75 158 476 79 159 477 81 159 478 80 159 479 81 160 480 83 160 481 82 160 482 83 161 483 85 161 484 84 161 485 85 162 486 87 162 487 86 162 488 83 163 489 81 163 490 95 163 491 87 164 492 85 164 493 91 164 494 85 165 495 83 165 496 93 165 497 86 166 498 87 166 499 89 166 500 88 167 501 89 167 502 91 167 503 90 168 504 91 168 505 93 168 506 92 169 507 93 169 508 95 169 509 94 170 510 95 170 511 79 170 512 35 171 513 58 171 514 42 171 515 51 172 516 59 172 517 58 172 518 19 173 519 2 173 520 16 173 521 8 174 522 7 174 523 6 174 524 20 175 525 5 175 526 4 175 527 15 176 528 0 176 529 12 176 530 31 177 531 4 177 532 13 177 533 27 178 534 1 178 535 15 178 536 25 179 537 5 179 538 23 179 539 27 180 540 14 180 541 25 180 542 29 181 543 0 181 544 17 181 545 31 182 546 12 182 547 29 182 548 4 183 549 14 183 550 13 183 551 14 184 552 12 184 553 13 184 554 3 185 555 9 185 556 2 185 557 10 186 558 8 186 559 9 186 560 8 187 561 28 187 562 9 187 563 30 188 564 29 188 565 28 188 566 2 189 567 28 189 568 16 189 569 28 190 570 17 190 571 16 190 572 10 191 573 24 191 574 11 191 575 26 192 576 25 192 577 24 192 578 7 193 579 24 193 580 22 193 581 24 194 582 23 194 583 22 194 584 3 195 585 26 195 586 10 195 587 19 196 588 27 196 589 26 196 590 6 197 591 30 197 592 8 197 593 21 198 594 31 198 595 30 198 596 6 199 597 22 199 598 21 199 599 21 200 600 23 200 601 20 200 602 1 201 603 17 201 604 0 201 605 18 202 606 16 202 607 17 202 608 51 203 609 34 203 610 48 203 611 66 204 612 39 204 613 38 204 614 52 205 615 37 205 616 36 205 617 73 206 618 32 206 619 75 206 620 71 207 621 36 207 622 65 207 623 59 208 624 33 208 625 73 208 626 69 209 627 57 209 628 67 209 629 59 210 630 46 210 631 57 210 632 61 211 633 75 211 634 77 211 635 61 212 636 45 212 637 44 212 638 67 213 639 45 213 640 65 213 641 46 214 642 44 214 643 45 214 644 72 215 645 42 215 646 41 215 647 41 216 648 43 216 649 40 216 650 40 217 651 60 217 652 41 217 653 60 218 654 63 218 655 61 218 656 41 219 657 76 219 658 72 219 659 60 220 660 77 220 661 76 220 662 43 221 663 58 221 664 56 221 665 58 222 666 57 222 667 56 222 668 64 223 669 56 223 670 68 223 671 68 224 672 57 224 673 69 224 674 38 225 675 70 225 676 66 225 677 70 226 678 52 226 679 71 226 680 38 227 681 54 227 682 53 227 683 53 228 684 55 228 685 52 228 686 33 229 687 49 229 688 32 229 689 50 230 690 48 230 691 49 230 692 70 231 693 63 231 694 62 231 695 40 232 696 70 232 697 62 232 698 68 233 699 55 233 700 54 233 701 39 234 702 68 234 703 54 234 704 36 235 705 67 235 706 65 235 707 69 236 708 37 236 709 55 236 710 71 237 711 45 237 712 63 237 713 40 238 714 64 238 715 66 238 716 76 239 717 49 239 718 48 239 719 34 240 720 76 240 721 48 240 722 35 241 723 72 241 724 34 241 725 77 242 726 32 242 727 49 242 728 59 243 729 73 243 730 47 243 731 47 244 732 75 244 733 44 244 734 79 245 735 80 245 736 78 245 737 81 246 738 82 246 739 80 246 740 83 247 741 84 247 742 82 247 743 85 248 744 86 248 745 84 248 746 79 249 747 95 249 748 81 249 749 83 250 750 95 250 751 93 250 752 87 251 753 91 251 754 89 251 755 85 252 756 93 252 757 91 252 758 86 253 759 89 253 760 88 253 761 88 254 762 91 254 763 90 254 764 90 255 765 93 255 766 92 255 767 92 256 768 95 256 769 94 256 770 94 257 771 79 257 772 78 257 773 35 258 774 42 258 775 74 258 776 67 259 777 57 259 778 46 259 779 51 260 780 50 260 781 59 260 782 51 261 783 58 261 784 35 261 785 19 262 786 3 262 787 2 262 788 8 263 789 11 263 790 7 263 791 20 264 792 23 264 793 5 264 794 15 265 795 1 265 796 0 265 797 31 266 798 20 266 799 4 266 800 27 267 801 18 267 802 1 267 803 25 268 804 14 268 805 5 268 806 27 269 807 15 269 808 14 269 809 29 270 810 12 270 811 0 270 812 31 271 813 13 271 814 12 271 815 4 272 816 5 272 817 14 272 818 14 273 819 15 273 820 12 273 821 3 274 822 10 274 823 9 274 824 10 275 825 11 275 826 8 275 827 8 276 828 30 276 829 28 276 830 30 277 831 31 277 832 29 277 833 2 278 834 9 278 835 28 278 836 28 279 837 29 279 838 17 279 839 10 280 840 26 280 841 24 280 842 26 281 843 27 281 844 25 281 845 7 282 846 11 282 847 24 282 848 24 283 849 25 283 850 23 283 851 3 284 852 19 284 853 26 284 854 19 285 855 18 285 856 27 285 857 6 286 858 21 286 859 30 286 860 21 287 861 20 287 862 31 287 863 6 288 864 7 288 865 22 288 866 21 289 867 22 289 868 23 289 869 1 290 870 18 290 871 17 290 872 18 291 873 19 291 874 16 291 875 51 292 876 35 292 877 34 292 878 66 293 879 64 293 880 39 293 881 52 294 882 55 294 883 37 294 884 73 295 885 33 295 886 32 295 887 71 296 888 52 296 889 36 296 890 59 297 891 50 297 892 33 297 893 59 298 894 47 298 895 46 298 896 61 299 897 44 299 898 75 299 899 61 300 900 63 300 901 45 300 902 67 301 903 46 301 904 45 301 905 46 302 906 47 302 907 44 302 908 72 303 909 74 303 910 42 303 911 41 304 912 42 304 913 43 304 914 40 305 915 62 305 916 60 305 917 60 306 918 62 306 919 63 306 920 41 307 921 60 307 922 76 307 923 60 308 924 61 308 925 77 308 926 43 309 927 42 309 928 58 309 929 58 310 930 59 310 931 57 310 932 64 311 933 43 311 934 56 311 935 68 312 936 56 312 937 57 312 938 38 313 939 53 313 940 70 313 941 70 314 942 53 314 943 52 314 944 38 315 945 39 315 946 54 315 947 53 316 948 54 316 949 55 316 950 33 317 951 50 317 952 49 317 953 50 318 954 51 318 955 48 318 956 70 319 957 71 319 958 63 319 959 40 320 960 66 320 961 70 320 962 68 321 963 69 321 964 55 321 965 39 322 966 64 322 967 68 322 968 36 323 969 37 323 970 67 323 971 69 324 972 67 324 973 37 324 974 71 325 975 65 325 976 45 325 977 40 326 978 43 326 979 64 326 980 76 327 981 77 327 982 49 327 983 34 328 984 72 328 985 76 328 986 35 329 987 74 329 988 72 329 989 77 330 990 75 330 991 32 330 992 47 331 993 73 331 994 75 331 995 79 332 996 81 332 997 80 332 998 81 333 999 83 333 1000 82 333 1001 83 334 1002 85 334 1003 84 334 1004 85 335 1005 87 335 1006 86 335 1007 83 336 1008 81 336 1009 95 336 1010 87 337 1011 85 337 1012 91 337 1013 85 338 1014 83 338 1015 93 338 1016 86 339 1017 87 339 1018 89 339 1019 88 340 1020 89 340 1021 91 340 1022 90 341 1023 91 341 1024 93 341 1025 92 342 1026 93 342 1027 95 342 1028 94 343 1029 95 343 1030 79 343 1031 35 344 1032 58 344 1033 42 344 1034 51 345 1035 59 345 1036 58 345 1037

+
+
+
+
+ + + + + + + + + + + + + + + + + + +
diff --git a/my_dual_robot_cell/my_dual_robot_cell_description/meshes/fzi_skyline_v1.png b/my_dual_robot_cell/my_dual_robot_cell_description/meshes/fzi_skyline_v1.png new file mode 100644 index 0000000000000000000000000000000000000000..67bab4b4a6827e003495faff9dd9ef041d6384ab GIT binary patch literal 72632 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

r-_Vbm@-*iR|jOKjwM}T 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

{acYB7O*c62$Gqag*;5oJtDcjPgx-%! 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 literal 0 HcmV?d00001 diff --git a/my_dual_robot_cell/my_dual_robot_cell_description/meshes/fzi_table.dae b/my_dual_robot_cell/my_dual_robot_cell_description/meshes/fzi_table.dae new file mode 100644 index 0000000..d12996b --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_description/meshes/fzi_table.dae @@ -0,0 +1,372 @@ + + + + + Blender User + Blender 3.6.4 commit date:2023-09-25, commit time:13:24, hash:21bfc5e7fe3f + + 2023-10-05T17:11:52 + 2023-10-05T17:11:52 + + Z_UP + + + + + + + 39.59775 + 1.777778 + 0.1 + 100 + + + + + + 0 + 0 + 10 + + + + + + + + + 1000 1000 1000 + 1 + 0 + 0.00111109 + + + + + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 1000 + 29.99998 + 75 + 0.15 + 0 + 1 + 2 + 0.04999995 + 30.002 + 1 + 2880 + 3 + 1 + 0.1 + 1 + 0.1 + 0.1 + 1 + + + + + + + + + + fzi_skyline_v1_png + + + + + fzi_skyline_v1_png-surface + + + + + + 0 0 0 1 + + + + + + 1.45 + + + + + + + + + + + 0 0 0 1 + + + 0.2882971 0.2882971 0.2882971 1 + + + 1.45 + + + + + + + + + + + 0 0 0 1 + + + 1 1 1 1 + + + 1.45 + + + + + + + + + fzi_skyline_v1.png + + + + + + + + + + + + + + + + + + -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1 + + + + + + + + + + -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 + + + + + + + + + + 2 0.9015979 1.65 0.08888447 2 0.08888411 1.65 0.9015982 1 0.08888405 1.65 0.08888447 1 0.9015977 0.65 0.08888411 1 0.08888405 0.65 0.9015977 0 0.08888417 0.65 0.08888411 1 0.08888405 0.65 0.07669693 1 0.07669693 1 0.9074417 0.65 0.9015977 1 0.9015977 2 0.9015979 1.65 0.9015982 1.65 0.08888447 1.65 0.9015982 1 0.9015977 1 0.08888405 1 0.9015977 0.65 0.9015977 0.65 0.08888411 0.65 0.9015977 0 0.9015979 0 0.08888417 1 0.08888405 0.65 0.08888411 0.65 0.07669693 1 0.9074417 0.65 0.9074417 0.65 0.9015977 + + + + + + + + + + + + + + +

1 0 0 2 0 1 0 0 2 3 1 3 6 1 4 2 1 5 7 2 6 4 2 7 6 2 8 5 3 9 0 3 10 4 3 11 6 4 12 0 4 13 2 4 14 3 5 15 5 5 16 7 5 17 1 0 18 3 0 19 2 0 20 3 1 21 7 1 22 6 1 23 7 2 24 5 2 25 4 2 26 5 3 27 1 3 28 0 3 29 6 4 30 4 4 31 0 4 32 3 5 33 1 5 34 5 5 35

+ + + + + + + -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1 + + + + + + + + + + -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 + + + + + + + + + + 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75 + + + + + + + + + + + + + + +

1 0 0 2 0 1 0 0 2 3 1 3 6 1 4 2 1 5 7 2 6 4 2 7 6 2 8 5 3 9 0 3 10 4 3 11 6 4 12 0 4 13 2 4 14 3 5 15 5 5 16 7 5 17 1 0 18 3 0 19 2 0 20 3 1 21 7 1 22 6 1 23 7 2 24 5 2 25 4 2 26 5 3 27 1 3 28 0 3 29 6 4 30 4 4 31 0 4 32 3 5 33 1 5 34 5 5 35

+
+
+
+ + + + -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1 + + + + + + + + + + -1 0 0 0 1 0 1 0 0 0 -1 0 0 0 -1 0 0 1 + + + + + + + + + + 0.625 0 0.375 0.25 0.375 0 0.625 0.25 0.375 0.5 0.375 0.25 0.625 0.5 0.375 0.75 0.375 0.5 0.625 0.75 0.375 1 0.375 0.75 0.375 0.5 0.125 0.75 0.125 0.5 0.875 0.5 0.625 0.75 0.625 0.5 0.625 0 0.625 0.25 0.375 0.25 0.625 0.25 0.625 0.5 0.375 0.5 0.625 0.5 0.625 0.75 0.375 0.75 0.625 0.75 0.625 1 0.375 1 0.375 0.5 0.375 0.75 0.125 0.75 0.875 0.5 0.875 0.75 0.625 0.75 + + + + + + + + + + + + + + +

1 0 0 2 0 1 0 0 2 3 1 3 6 1 4 2 1 5 7 2 6 4 2 7 6 2 8 5 3 9 0 3 10 4 3 11 6 4 12 0 4 13 2 4 14 3 5 15 5 5 16 7 5 17 1 0 18 3 0 19 2 0 20 3 1 21 7 1 22 6 1 23 7 2 24 5 2 25 4 2 26 5 3 27 1 3 28 0 3 29 6 4 30 4 4 31 0 4 32 3 5 33 1 5 34 5 5 35

+
+
+
+ + + + + 0.65 0 0 0 0 0.44 0 0 0 0 0.45 0.51 0 0 0 1 + + + + + + + + + + + + 0.0225 0 0 0.625 0 0.0225 0 -0.415 0 0 0.48 0.48 0 0 0 1 + + + + + + + + + + + + 0.0225 0 0 0.625 0 0.0225 0 0.415 0 0 0.48 0.48 0 0 0 1 + + + + + + + + + + + + 0.0225 0 0 -0.625 0 0.0225 0 0.415 0 0 0.48 0.48 0 0 0 1 + + + + + + + + + + + + 0.0225 0 0 -0.625 0 0.0225 0 -0.415 0 0 0.48 0.48 0 0 0 1 + + + + + + + + + + + + 0.75 0 0 0 0 0.5 0 0 0 0 0.02 0.98 0 0 0 1 + + + + + + + + + + + + 0.6859207 -0.3240135 0.6515582 7.358891 0.7276763 0.3054208 -0.6141704 -6.925791 0 0.8953956 0.4452714 4.958309 0 0 0 1 + + + + -0.2908646 -0.7711008 0.5663932 4.076245 0.9551712 -0.1998834 0.2183912 1.005454 -0.05518906 0.6045247 0.7946723 5.903862 0 0 0 1 + + + + + + + + diff --git a/my_dual_robot_cell/my_dual_robot_cell_description/meshes/notexture.png b/my_dual_robot_cell/my_dual_robot_cell_description/meshes/notexture.png new file mode 100644 index 0000000000000000000000000000000000000000..8e3a13f2442f90d0bbd3d1eecae0063d4cc170c7 GIT binary patch literal 21283 zcmeI4&r1|x7{{O0#htblHpP@mor4~_?SJ4VBkLkch7g^SpnH~xP|)Zt>JouPbm(Su zknjf{#F~SW7f&6EC5WP%n${)gP`>Z*==ddtDzzLa9a<#-?k#wb3>yN>Yy6%hzvySiApfe|za?r+bed$@{tN z-%1Yp8nu$FKV>??L<^CO|5WJ+{0B=%InG$wP_U{vZdELt5-bH0p&n-m*oNSjA_Rqy zkV0!9v{|l8O{`a>za$|Y7f47F($Ro~Bq1FQm^_n^js`3}F?s%{HJIM5&G^;EB)q$G z`_ASmDTVG;I+9omk;Voq3w~KO9UN##01u>4E}$8lLaBg1;*W{|p=ngWAMwZk)gK>! zIlF210vMlZj139m&X8a_z;r;lK->{`N(KB8e^dmR4j2`V^vB}bROs({ENy-I)pd0u z%hF_QxY1(JVkj4ml#mloXq@3ddJ*LUq%cunq!_7k0e{3F@y8Saq<|EV0#fh@aD_va zz*H(WBp?M{vvQ$+T7`{;&Mp6?3qMw0zrB1egCE4ofjSI{otIyiMOvQt{{=`E8i;*a=aiU3kT3P=Gdcm$5Ig0zy$ j_4rfF{(keV^1{u)ioNGs9tL|4y8Yhjz(};vKR$a1HQk2t literal 0 HcmV?d00001 diff --git a/my_dual_robot_cell/my_dual_robot_cell_description/meshes/ur_background.jpg b/my_dual_robot_cell/my_dual_robot_cell_description/meshes/ur_background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..520cc13734c49714f796380707516c7243728967 GIT binary patch literal 206584 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%0Ai>A07v(|;6~1*X-}ht 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

1ntyP(kVHk-7cZUfyEZ2b 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

@$Q?36!%>B?HEf8_FM&Ag96_ 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 literal 0 HcmV?d00001 diff --git a/my_dual_robot_cell/my_dual_robot_cell_description/meshes/wall.dae b/my_dual_robot_cell/my_dual_robot_cell_description/meshes/wall.dae new file mode 100644 index 0000000..ce6b8f7 --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_description/meshes/wall.dae @@ -0,0 +1,115 @@ + + + + + Blender User + Blender 3.6.4 commit date:2023-09-25, commit time:13:24, hash:21bfc5e7fe3f + + 2023-10-18T11:31:46 + 2023-10-18T11:31:46 + + Z_UP + + + + + + + ur_background_jpg + + + + + ur_background_jpg-surface + + + + + + 0 0 0 1 + + + + + + 1.45 + + + + + + + + + ur_background.jpg + + + + + + + + + + + + 1 1 1 1 1 -1 1 -1 1 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 + + + + + + + + + + 0 0 1 0 -1 0 -1 0 0 0 0 -1 1 0 0 0 1 0 + + + + + + + + + + 1 1 0 1 1 0.999716 0.9996879 0.9997164 -4.48159e-5 -0.002131581 0.9996881 -0.002131462 2 0.999716 2 0 2 0 1 0 0 0 1 0 1 0.999716 0.999688 0 1 1 2 0.999716 1 0 2 0 1 1 0 1 0 1 0.9996879 0.9997164 -4.4883e-5 0.9997163 -4.48159e-5 -0.002131581 2 0.999716 2 1 2 0 1 0 0 0 0 0 1 0.999716 0.9996879 0.9997164 0.999688 0 2 0.999716 1 1 1 0 + + + + + + + + + + + + + + +

4 0 0 2 0 1 0 0 2 2 1 3 7 1 4 3 1 5 6 2 6 5 2 7 7 2 8 1 3 9 7 3 10 5 3 11 0 4 12 3 4 13 1 4 14 4 5 15 1 5 16 5 5 17 4 0 18 6 0 19 2 0 20 2 1 21 6 1 22 7 1 23 6 2 24 4 2 25 5 2 26 1 3 27 3 3 28 7 3 29 0 4 30 2 4 31 3 4 32 4 5 33 0 5 34 1 5 35

+ + + + + + + + 2.222213 0 0 0 0 0.05 0 0 0 0 1.25 0 0 0 0 1 + + + + + + + + + + + + + + + + diff --git a/my_dual_robot_cell/my_dual_robot_cell_description/package.xml b/my_dual_robot_cell/my_dual_robot_cell_description/package.xml new file mode 100644 index 0000000..37701bd --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_description/package.xml @@ -0,0 +1,29 @@ + + + + my_dual_robot_cell_description + 1.0.0 + + This package contains an urdf of a shared workspace. + Felix Exner + + BSD-3-Clause + + Universal Robots A/S’ Terms and Conditions for Use of Graphical Documentation + + Felix Durchdewald + + ament_cmake + joint_state_publisher + joint_state_publisher_gui + robot_state_publisher + rviz2 + xacro + ur_description + ur_robot_driver + + + + ament_cmake + + diff --git a/my_dual_robot_cell/my_dual_robot_cell_description/rviz/urdf.rviz b/my_dual_robot_cell/my_dual_robot_cell_description/rviz/urdf.rviz new file mode 100644 index 0000000..e6b74d0 --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_description/rviz/urdf.rviz @@ -0,0 +1,257 @@ +Panels: + - Class: rviz_common/Displays + Help Height: 87 + Name: Displays + Property Tree Widget: + Expanded: + - /RobotModel1 + - /TF1 + - /TF1/Tree1 + Splitter Ratio: 0.5 + Tree Height: 637 + - Class: rviz_common/Views + Expanded: + - /Current View1 + Name: Views + Splitter Ratio: 0.5 +Visualization Manager: + Class: "" + Displays: + - Alpha: 0.5 + Cell Size: 1 + Class: rviz_default_plugins/Grid + Color: 160; 160; 164 + Enabled: true + Line Style: + Line Width: 0.029999999329447746 + Value: Lines + Name: Grid + Normal Cell Count: 0 + Offset: + X: 0 + Y: 0 + Z: 0 + Plane: XY + Plane Cell Count: 10 + Reference Frame: + Value: true + - Alpha: 1 + Class: rviz_default_plugins/RobotModel + Collision Enabled: false + Description File: "" + Description Source: Topic + Description Topic: + Depth: 5 + Durability Policy: Volatile + History Policy: Keep Last + Reliability Policy: Reliable + Value: /robot_description + Enabled: true + Links: + All Links Enabled: true + Expand Joint Details: false + Expand Link Details: false + Expand Tree: false + Link Tree Style: Links in Alphabetic Order + monitor: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + robot_mount: + Alpha: 1 + Show Axes: false + Show Trail: false + table: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + ur20_base: + Alpha: 1 + Show Axes: false + Show Trail: false + ur20_base_link: + Alpha: 1 + Show Axes: false + Show Trail: false + ur20_base_link_inertia: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + ur20_flange: + Alpha: 1 + Show Axes: false + Show Trail: false + ur20_forearm_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + ur20_ft_frame: + Alpha: 1 + Show Axes: false + Show Trail: false + ur20_shoulder_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + ur20_tool0: + Alpha: 1 + Show Axes: false + Show Trail: false + ur20_upper_arm_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + ur20_wrist_1_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + ur20_wrist_2_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + ur20_wrist_3_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + wall: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + world: + Alpha: 1 + Show Axes: false + Show Trail: false + Mass Properties: + Inertia: false + Mass: false + Name: RobotModel + TF Prefix: "" + Update Interval: 0 + Value: true + Visual Enabled: true + - Class: rviz_default_plugins/TF + Enabled: true + Frame Timeout: 15 + Frames: + All Enabled: true + monitor: + Value: true + robot_mount: + Value: true + table: + Value: true + ur20_base: + Value: true + ur20_base_link: + Value: true + ur20_base_link_inertia: + Value: true + ur20_flange: + Value: true + ur20_forearm_link: + Value: true + ur20_ft_frame: + Value: true + ur20_shoulder_link: + Value: true + ur20_tool0: + Value: true + ur20_upper_arm_link: + Value: true + ur20_wrist_1_link: + Value: true + ur20_wrist_2_link: + Value: true + ur20_wrist_3_link: + Value: true + wall: + Value: true + world: + Value: true + Marker Scale: 1 + Name: TF + Show Arrows: true + Show Axes: true + Show Names: false + Tree: + world: + table: + monitor: + {} + robot_mount: + ur20_base_link: + ur20_base: + {} + ur20_base_link_inertia: + ur20_shoulder_link: + ur20_upper_arm_link: + ur20_forearm_link: + ur20_wrist_1_link: + ur20_wrist_2_link: + ur20_wrist_3_link: + ur20_flange: + ur20_tool0: + {} + ur20_ft_frame: + {} + wall: + {} + Update Interval: 0 + Value: true + Enabled: true + Global Options: + Background Color: 48; 48; 48 + Fixed Frame: world + Frame Rate: 30 + Name: root + Tools: + - Class: rviz_default_plugins/MoveCamera + Transformation: + Current: + Class: rviz_default_plugins/TF + Value: true + Views: + Current: + Class: rviz_default_plugins/Orbit + Distance: 4.839867115020752 + Enable Stereo Rendering: + Stereo Eye Separation: 0.05999999865889549 + Stereo Focal Distance: 1 + Swap Stereo Eyes: false + Value: false + Focal Point: + X: 0.8393054604530334 + Y: 0.6853293776512146 + Z: 1.452785611152649 + Focal Shape Fixed Size: true + Focal Shape Size: 0.05000000074505806 + Invert Z Axis: false + Name: Current View + Near Clip Distance: 0.009999999776482582 + Pitch: 0.16000038385391235 + Target Frame: + Value: Orbit (rviz) + Yaw: 4.324998378753662 + Saved: ~ +Window Geometry: + Displays: + collapsed: false + Height: 1412 + Hide Left Dock: false + Hide Right Dock: false + QMainWindow State: 000000ff00000000fd0000000100000000000001ad0000052efc0200000002fb000000100044006900730070006c006100790073010000003b0000030f000000c700fffffffb0000000a00560069006500770073010000035000000219000000a000ffffff0000084d0000052e00000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 + Views: + collapsed: false + Width: 2560 + X: 1920 + Y: 0 diff --git a/my_dual_robot_cell/my_dual_robot_cell_description/urdf/my_dual_robot_cell.urdf.xacro b/my_dual_robot_cell/my_dual_robot_cell_description/urdf/my_dual_robot_cell.urdf.xacro new file mode 100644 index 0000000..0380dc0 --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_description/urdf/my_dual_robot_cell.urdf.xacro @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/my_dual_robot_cell/my_dual_robot_cell_description/urdf/my_dual_robot_cell_macro.xacro b/my_dual_robot_cell/my_dual_robot_cell_description/urdf/my_dual_robot_cell_macro.xacro new file mode 100644 index 0000000..8649273 --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_description/urdf/my_dual_robot_cell_macro.xacro @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 78fc1d8b989fefd54ace064c35ad1ff9a2257876 Mon Sep 17 00:00:00 2001 From: Vihaan Shah Date: Mon, 24 Jun 2024 15:52:59 -0400 Subject: [PATCH 02/14] Remove ur_type from tf_prefix --- .../urdf/my_dual_robot_cell_macro.xacro | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/my_dual_robot_cell/my_dual_robot_cell_description/urdf/my_dual_robot_cell_macro.xacro b/my_dual_robot_cell/my_dual_robot_cell_description/urdf/my_dual_robot_cell_macro.xacro index 8649273..c743f95 100644 --- a/my_dual_robot_cell/my_dual_robot_cell_description/urdf/my_dual_robot_cell_macro.xacro +++ b/my_dual_robot_cell/my_dual_robot_cell_description/urdf/my_dual_robot_cell_macro.xacro @@ -98,8 +98,8 @@ Date: Mon, 24 Jun 2024 19:00:20 -0400 Subject: [PATCH 03/14] Add ros2 control parameters to dual arm urdf for dual arm driver - Add ros2 control tags/parameters for each robot arm - Some parameters are specific to each arm and some common to both - Ports and IP different for each arm - RTDE scripts, mock hardware, headless mode common to the arms --- .../my_dual_robot_cell_control/CMakeLists.txt | 11 ++ .../my_dual_robot_cell_control/LICENSE | 29 +++++ .../config/my_robot_calibration.yaml | 44 ++++++++ .../my_dual_robot_cell_control/package.xml | 28 +++++ .../my_dual_robot_cell_controlled.urdf.xacro | 100 ++++++++++++++++++ 5 files changed, 212 insertions(+) create mode 100644 my_dual_robot_cell/my_dual_robot_cell_control/CMakeLists.txt create mode 100644 my_dual_robot_cell/my_dual_robot_cell_control/LICENSE create mode 100644 my_dual_robot_cell/my_dual_robot_cell_control/config/my_robot_calibration.yaml create mode 100644 my_dual_robot_cell/my_dual_robot_cell_control/package.xml create mode 100644 my_dual_robot_cell/my_dual_robot_cell_control/urdf/my_dual_robot_cell_controlled.urdf.xacro diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/CMakeLists.txt b/my_dual_robot_cell/my_dual_robot_cell_control/CMakeLists.txt new file mode 100644 index 0000000..9641ab9 --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_control/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.8) +project(my_dual_robot_cell_control) + +find_package(ament_cmake REQUIRED) + +install( + DIRECTORY launch config urdf + DESTINATION share/${PROJECT_NAME} +) + +ament_package() diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/LICENSE b/my_dual_robot_cell/my_dual_robot_cell_control/LICENSE new file mode 100644 index 0000000..48fb689 --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_control/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2022, Universal Robots A/S +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/config/my_robot_calibration.yaml b/my_dual_robot_cell/my_dual_robot_cell_control/config/my_robot_calibration.yaml new file mode 100644 index 0000000..f7200ba --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_control/config/my_robot_calibration.yaml @@ -0,0 +1,44 @@ +kinematics: + shoulder: + x: 0 + y: 0 + z: 0.1519 + roll: 0 + pitch: 0 + yaw: 0 + upper_arm: + x: 0 + y: 0 + z: 0 + roll: 1.570796327 + pitch: 0 + yaw: 0 + forearm: + x: -0.24365 + y: 0 + z: 0 + roll: 0 + pitch: 0 + yaw: 0 + wrist_1: + x: -0.21325 + y: 0 + z: 0.11235 + roll: 0 + pitch: 0 + yaw: 0 + wrist_2: + x: 0 + y: -0.08535 + z: -1.750557762378351e-11 + roll: 1.570796327 + pitch: 0 + yaw: 0 + wrist_3: + x: 0 + y: 0.0819 + z: -1.679797079540562e-11 + roll: 1.570796326589793 + pitch: 3.141592653589793 + yaw: 3.141592653589793 + hash: calib_9122066269688285636 \ No newline at end of file diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/package.xml b/my_dual_robot_cell/my_dual_robot_cell_control/package.xml new file mode 100644 index 0000000..d8abebf --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_control/package.xml @@ -0,0 +1,28 @@ + + + + my_dual_robot_cell_control + 1.0.0 + ros2_control setup + Felix Durchdewald + BSD-3-Clause + + ament_cmake + + + joint_state_broadcaster + joint_trajectory_controller + position_controllers + robot_state_publisher + my_dual_robot_cell_description + ur_controllers + ur_robot_driver + ur_client_library + xacro + controller_manager + + + + ament_cmake + + diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/urdf/my_dual_robot_cell_controlled.urdf.xacro b/my_dual_robot_cell/my_dual_robot_cell_control/urdf/my_dual_robot_cell_controlled.urdf.xacro new file mode 100644 index 0000000..ef52a3b --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_control/urdf/my_dual_robot_cell_controlled.urdf.xacro @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From ab6232e405fad4b874336b806847f1cd340add5f Mon Sep 17 00:00:00 2001 From: Vihaan Shah Date: Mon, 24 Jun 2024 19:08:19 -0400 Subject: [PATCH 04/14] Modify ur_control.launch.py to launch controllers for both arms - Instantiates one controller manager for both arms and passes the controller configs and update rate - Receives the robot_description param from the robot_description_topic (robot_state_publisher) - Does not yet implement io_and_status_controller and forward_velocity_controller - Has functionality to spawn and stop controllers for both arms - Only works in simulation and not with real hardware - Limited number of launch parameters as of now --- .../config/ros2_controllers.yaml | 227 ++++++++ .../config/update_rate.yaml | 3 + .../launch/rsp.launch.py | 142 +++++ .../launch/ur_control.launch.py | 541 ++++++++++++++++++ 4 files changed, 913 insertions(+) create mode 100644 my_dual_robot_cell/my_dual_robot_cell_control/config/ros2_controllers.yaml create mode 100644 my_dual_robot_cell/my_dual_robot_cell_control/config/update_rate.yaml create mode 100644 my_dual_robot_cell/my_dual_robot_cell_control/launch/rsp.launch.py create mode 100644 my_dual_robot_cell/my_dual_robot_cell_control/launch/ur_control.launch.py diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/config/ros2_controllers.yaml b/my_dual_robot_cell/my_dual_robot_cell_control/config/ros2_controllers.yaml new file mode 100644 index 0000000..14ededf --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_control/config/ros2_controllers.yaml @@ -0,0 +1,227 @@ +controller_manager: + ros__parameters: + alice_joint_state_broadcaster: + type: joint_state_broadcaster/JointStateBroadcaster + + bob_joint_state_broadcaster: + type: joint_state_broadcaster/JointStateBroadcaster + + # io_and_status_controller: + # type: ur_controllers/GPIOController + + alice_speed_scaling_state_broadcaster: + type: ur_controllers/SpeedScalingStateBroadcaster + + bob_speed_scaling_state_broadcaster: + type: ur_controllers/SpeedScalingStateBroadcaster + + alice_force_torque_sensor_broadcaster: + type: force_torque_sensor_broadcaster/ForceTorqueSensorBroadcaster + + bob_force_torque_sensor_broadcaster: + type: force_torque_sensor_broadcaster/ForceTorqueSensorBroadcaster + + alice_joint_trajectory_controller: + type: joint_trajectory_controller/JointTrajectoryController + + bob_trajectory_controller: + type: joint_trajectory_controller/JointTrajectoryController + + alice_scaled_joint_trajectory_controller: + type: ur_controllers/ScaledJointTrajectoryController + + bob_scaled_joint_trajectory_controller: + type: ur_controllers/ScaledJointTrajectoryController + + # forward_velocity_controller: + # type: velocity_controllers/JointGroupVelocityController + + alice_forward_position_controller: + type: position_controllers/JointGroupPositionController + + bob_forward_position_controller: + type: position_controllers/JointGroupPositionController + + +alice_speed_scaling_state_broadcaster: + ros__parameters: + state_publish_rate: 100.0 + tf_prefix: "alice" + +bob_speed_scaling_state_broadcaster: + ros__parameters: + state_publish_rate: 100.0 + tf_prefix: "bob" + +# io_and_status_controller: +# ros__parameters: +# tf_prefix: "$(var tf_prefix)" + +alice_force_torque_sensor_broadcaster: + ros__parameters: + sensor_name: alice_tcp_fts_sensor + state_interface_names: + - force.x + - force.y + - force.z + - torque.x + - torque.y + - torque.z + frame_id: bob_tool0 + topic_name: alice_ft_data + +bob_force_torque_sensor_broadcaster: + ros__parameters: + sensor_name: bob_tcp_fts_sensor + state_interface_names: + - force.x + - force.y + - force.z + - torque.x + - torque.y + - torque.z + frame_id: bob_tool0 + topic_name: bob_ft_data + + +alice_joint_trajectory_controller: + ros__parameters: + joints: + - alice_shoulder_pan_joint + - alice_shoulder_lift_joint + - alice_elbow_joint + - alice_wrist_1_joint + - alice_wrist_2_joint + - alice_wrist_3_joint + command_interfaces: + - position + state_interfaces: + - position + - velocity + state_publish_rate: 100.0 + action_monitor_rate: 20.0 + allow_partial_joints_goal: false + constraints: + stopped_velocity_tolerance: 0.2 + goal_time: 0.0 + alice_shoulder_pan_joint: { trajectory: 0.2, goal: 0.1 } + alice_shoulder_lift_joint: { trajectory: 0.2, goal: 0.1 } + alice_elbow_joint: { trajectory: 0.2, goal: 0.1 } + alice_wrist_1_joint: { trajectory: 0.2, goal: 0.1 } + alice_wrist_2_joint: { trajectory: 0.2, goal: 0.1 } + alice_wrist_3_joint: { trajectory: 0.2, goal: 0.1 } + +bob_joint_trajectory_controller: + ros__parameters: + joints: + - bob_shoulder_pan_joint + - bob_shoulder_lift_joint + - bob_elbow_joint + - bob_wrist_1_joint + - bob_wrist_2_joint + - bob_wrist_3_joint + command_interfaces: + - position + state_interfaces: + - position + - velocity + state_publish_rate: 100.0 + action_monitor_rate: 20.0 + allow_partial_joints_goal: false + constraints: + stopped_velocity_tolerance: 0.2 + goal_time: 0.0 + bob_shoulder_pan_joint: { trajectory: 0.2, goal: 0.1 } + bob_shoulder_lift_joint: { trajectory: 0.2, goal: 0.1 } + bob_elbow_joint: { trajectory: 0.2, goal: 0.1 } + bob_wrist_1_joint: { trajectory: 0.2, goal: 0.1 } + bob_wrist_2_joint: { trajectory: 0.2, goal: 0.1 } + bob_wrist_3_joint: { trajectory: 0.2, goal: 0.1 } + +alice_scaled_joint_trajectory_controller: + ros__parameters: + joints: + - alice_shoulder_pan_joint + - alice_shoulder_lift_joint + - alice_elbow_joint + - alice_wrist_1_joint + - alice_wrist_2_joint + - alice_wrist_3_joint + command_interfaces: + - position + state_interfaces: + - position + - velocity + state_publish_rate: 100.0 + action_monitor_rate: 20.0 + allow_partial_joints_goal: false + constraints: + stopped_velocity_tolerance: 0.2 + goal_time: 0.0 + alice_shoulder_pan_joint: { trajectory: 0.2, goal: 0.1 } + alice_shoulder_lift_joint: { trajectory: 0.2, goal: 0.1 } + alice_elbow_joint: { trajectory: 0.2, goal: 0.1 } + alice_wrist_1_joint: { trajectory: 0.2, goal: 0.1 } + alice_wrist_2_joint: { trajectory: 0.2, goal: 0.1 } + alice_wrist_3_joint: { trajectory: 0.2, goal: 0.1 } + speed_scaling_interface_name: alice_speed_scaling/speed_scaling_factor + +bob_scaled_joint_trajectory_controller: + ros__parameters: + joints: + - bob_shoulder_pan_joint + - bob_shoulder_lift_joint + - bob_elbow_joint + - bob_wrist_1_joint + - bob_wrist_2_joint + - bob_wrist_3_joint + command_interfaces: + - position + state_interfaces: + - position + - velocity + state_publish_rate: 100.0 + action_monitor_rate: 20.0 + allow_partial_joints_goal: false + constraints: + stopped_velocity_tolerance: 0.2 + goal_time: 0.0 + bob_shoulder_pan_joint: { trajectory: 0.2, goal: 0.1 } + bob_shoulder_lift_joint: { trajectory: 0.2, goal: 0.1 } + bob_elbow_joint: { trajectory: 0.2, goal: 0.1 } + bob_wrist_1_joint: { trajectory: 0.2, goal: 0.1 } + bob_wrist_2_joint: { trajectory: 0.2, goal: 0.1 } + bob_wrist_3_joint: { trajectory: 0.2, goal: 0.1 } + speed_scaling_interface_name: bob_speed_scaling/speed_scaling_factor + + +# forward_velocity_controller: +# ros__parameters: +# joints: +# - $(var tf_prefix)shoulder_pan_joint +# - $(var tf_prefix)shoulder_lift_joint +# - $(var tf_prefix)elbow_joint +# - $(var tf_prefix)wrist_1_joint +# - $(var tf_prefix)wrist_2_joint +# - $(var tf_prefix)wrist_3_joint +# interface_name: velocity + +alice_forward_position_controller: + ros__parameters: + joints: + - alice_shoulder_pan_joint + - alice_shoulder_lift_joint + - alice_elbow_joint + - alice_wrist_1_joint + - alice_wrist_2_joint + - alice_wrist_3_joint + +bob_forward_position_controller: + ros__parameters: + joints: + - bob_shoulder_pan_joint + - bob_shoulder_lift_joint + - bob_elbow_joint + - bob_wrist_1_joint + - bob_wrist_2_joint + - bob_wrist_3_joint \ No newline at end of file diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/config/update_rate.yaml b/my_dual_robot_cell/my_dual_robot_cell_control/config/update_rate.yaml new file mode 100644 index 0000000..7525e1e --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_control/config/update_rate.yaml @@ -0,0 +1,3 @@ +controller_manager: + ros__parameters: + update_rate: 125 # Hz diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/launch/rsp.launch.py b/my_dual_robot_cell/my_dual_robot_cell_control/launch/rsp.launch.py new file mode 100644 index 0000000..159b448 --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_control/launch/rsp.launch.py @@ -0,0 +1,142 @@ +# Copyright (c) 2024 FZI Forschungszentrum Informatik +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# * Neither the name of the {copyright_holder} nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +# +# Author: Felix Exner + +from launch import LaunchDescription +from launch.actions import DeclareLaunchArgument +from launch.substitutions import ( + Command, + FindExecutable, + LaunchConfiguration, + PathJoinSubstitution, +) +from launch_ros.actions import Node +from launch_ros.substitutions import FindPackageShare + + +def generate_launch_description(): + ur_type = LaunchConfiguration("ur_type") + robot_ip = LaunchConfiguration("robot_ip") + + use_mock_hardware = LaunchConfiguration("use_mock_hardware") + mock_sensor_commands = LaunchConfiguration("mock_sensor_commands") + + headless_mode = LaunchConfiguration("headless_mode") + + kinematics_parameters_file = LaunchConfiguration("kinematics_parameters_file") + + # Load description with necessary parameters + robot_description_content = Command( + [ + PathJoinSubstitution([FindExecutable(name="xacro")]), + " ", + PathJoinSubstitution( + [ + FindPackageShare("my_dual_robot_cell_control"), + "urdf", + "my_dual_robot_cell_controlled.urdf.xacro", + ] + ), + ] + ) + robot_description = {"robot_description": robot_description_content} + + declared_arguments = [] + # UR specific arguments + declared_arguments.append( + DeclareLaunchArgument( + "ur_type", + description="Typo/series of used UR robot.", + choices=[ + "ur3", + "ur3e", + "ur5", + "ur5e", + "ur10", + "ur10e", + "ur16e", + "ur20", + "ur30", + ], + default_value="ur3", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "robot_ip", description="IP address by which the robot can be reached." + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "kinematics_parameters_file", + default_value=PathJoinSubstitution( + [ + FindPackageShare("my_dual_robot_cell_control"), + "config", + "my_robot_calibration.yaml", + ] + ), + description="The calibration configuration of the actual robot used.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "use_mock_hardware", + default_value="false", + description="Start robot with mock hardware mirroring command to its states.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "mock_sensor_commands", + default_value="false", + description="Enable mock command interfaces for sensors used for simple simulations. " + "Used only if 'use_mock_hardware' parameter is true.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "headless_mode", + default_value="false", + description="Enable headless mode for robot control", + ) + ) + + return LaunchDescription( + declared_arguments + + [ + Node( + package="robot_state_publisher", + executable="robot_state_publisher", + output="both", + parameters=[robot_description], + ), + ] + ) diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/launch/ur_control.launch.py b/my_dual_robot_cell/my_dual_robot_cell_control/launch/ur_control.launch.py new file mode 100644 index 0000000..66b9392 --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_control/launch/ur_control.launch.py @@ -0,0 +1,541 @@ +# Copyright (c) 2021 PickNik, Inc. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# * Neither the name of the {copyright_holder} nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +# +# Author: Denis Stogl + +from launch import LaunchDescription +from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription +from launch.conditions import IfCondition, UnlessCondition +from launch.launch_description_sources import AnyLaunchDescriptionSource +from launch.substitutions import LaunchConfiguration, PathJoinSubstitution +from launch_ros.actions import Node +from launch_ros.parameter_descriptions import ParameterFile +from launch_ros.substitutions import FindPackageShare + + +def launch_setup(): + # Initialize Arguments + ur_type = LaunchConfiguration("ur_type") + robot_ip = LaunchConfiguration("robot_ip") + # General arguments + controllers_file = LaunchConfiguration("controllers_file") + description_launchfile = LaunchConfiguration("description_launchfile") + use_mock_hardware = LaunchConfiguration("use_mock_hardware") + controller_spawner_timeout = LaunchConfiguration("controller_spawner_timeout") + alice_initial_joint_controller = LaunchConfiguration( + "alice_initial_joint_controller" + ) + bob_initial_joint_controller = LaunchConfiguration("bob_initial_joint_controller") + activate_joint_controller = LaunchConfiguration("activate_joint_controller") + launch_rviz = LaunchConfiguration("launch_rviz") + rviz_config_file = LaunchConfiguration("rviz_config_file") + headless_mode = LaunchConfiguration("headless_mode") + launch_dashboard_client = LaunchConfiguration("launch_dashboard_client") + use_tool_communication = LaunchConfiguration("use_tool_communication") + tool_device_name = LaunchConfiguration("tool_device_name") + tool_tcp_port = LaunchConfiguration("tool_tcp_port") + + control_node = Node( + package="controller_manager", + executable="ros2_control_node", + parameters=[ + LaunchConfiguration("update_rate_config_file"), + ParameterFile(controllers_file, allow_substs=True), + # We use the tf_prefix as substitution in there, so that's why we keep it as an + # argument for this launchfile + ], + output="screen", + ) + + # dashboard_client_node = Node( + # package="ur_robot_driver", + # condition=IfCondition(launch_dashboard_client) + # and UnlessCondition(use_mock_hardware), + # executable="dashboard_client", + # name="dashboard_client", + # namespace="alice", + # output="screen", + # emulate_tty=True, + # parameters=[{"robot_ip": robot_ip}], + # ) + + # dashboard_client_node = Node( + # package="ur_robot_driver", + # condition=IfCondition(launch_dashboard_client) + # and UnlessCondition(use_mock_hardware), + # executable="dashboard_client", + # name="dashboard_client", + # namespace="bob", + # output="screen", + # emulate_tty=True, + # parameters=[{"robot_ip": robot_ip}], + # ) + + # tool_communication_node = Node( + # package="ur_robot_driver", + # condition=IfCondition(use_tool_communication), + # executable="tool_communication.py", + # name="ur_tool_comm", + # output="screen", + # parameters=[ + # { + # "robot_ip": robot_ip, + # "tcp_port": tool_tcp_port, + # "device_name": tool_device_name, + # } + # ], + # ) + + # urscript_interface = Node( + # package="ur_robot_driver", + # executable="urscript_interface", + # parameters=[{"robot_ip": robot_ip}], + # output="screen", + # condition=UnlessCondition(use_mock_hardware), + # ) + + # controller_stopper_node = Node( + # package="ur_robot_driver", + # executable="controller_stopper_node", + # name="controller_stopper", + # output="screen", + # emulate_tty=True, + # condition=UnlessCondition(use_mock_hardware), + # parameters=[ + # {"headless_mode": headless_mode}, + # {"joint_controller_active": activate_joint_controller}, + # { + # "consistent_controllers": [ + # "io_and_status_controller", + # "force_torque_sensor_broadcaster", + # "joint_state_broadcaster", + # "speed_scaling_state_broadcaster", + # ] + # }, + # ], + # ) + + rviz_node = Node( + package="rviz2", + condition=IfCondition(launch_rviz), + executable="rviz2", + name="rviz2", + output="log", + arguments=["-d", rviz_config_file], + ) + + # Spawn controllers + def controller_spawner(controllers, active=True): + inactive_flags = ["--inactive"] if not active else [] + return Node( + package="controller_manager", + executable="spawner", + arguments=[ + "--controller-manager", + "/controller_manager", + "--controller-manager-timeout", + controller_spawner_timeout, + ] + + inactive_flags + + controllers, + ) + + controllers_active = [ + "alice_joint_state_broadcaster", + "bob_joint_state_broadcaster", + # "alice_io_and_status_controller", + # "bob_io_and_status_controller", + "alice_speed_scaling_state_broadcaster", + "bob_speed_scaling_state_broadcaster", + "alice_force_torque_sensor_broadcaster", + "bob_force_torque_sensor_broadcaster", + ] + controllers_inactive = [ + "alice_forward_position_controller", + "bob_forward_position_controller", + ] + + controller_spawners = [controller_spawner(controllers_active)] + [ + controller_spawner(controllers_inactive, active=False) + ] + + # There may be other controllers of the joints, but this is the initially-started one + alice_initial_joint_controller_spawner_started = Node( + package="controller_manager", + executable="spawner", + arguments=[ + alice_initial_joint_controller, + "-c", + "/controller_manager", + "--controller-manager-timeout", + controller_spawner_timeout, + ], + condition=IfCondition(activate_joint_controller), + ) + bob_initial_joint_controller_spawner_started = Node( + package="controller_manager", + executable="spawner", + arguments=[ + bob_initial_joint_controller, + "-c", + "/controller_manager", + "--controller-manager-timeout", + controller_spawner_timeout, + ], + condition=IfCondition(activate_joint_controller), + ) + alice_initial_joint_controller_spawner_stopped = Node( + package="controller_manager", + executable="spawner", + arguments=[ + alice_initial_joint_controller, + "-c", + "/controller_manager", + "--controller-manager-timeout", + controller_spawner_timeout, + "--inactive", + ], + condition=UnlessCondition(activate_joint_controller), + ) + bob_initial_joint_controller_spawner_stopped = Node( + package="controller_manager", + executable="spawner", + arguments=[ + bob_initial_joint_controller, + "-c", + "/controller_manager", + "--controller-manager-timeout", + controller_spawner_timeout, + "--inactive", + ], + condition=UnlessCondition(activate_joint_controller), + ) + + rsp = IncludeLaunchDescription( + AnyLaunchDescriptionSource(description_launchfile), + launch_arguments={ + "robot_ip": robot_ip, + "ur_type": ur_type, + }.items(), + ) + + nodes_to_start = [ + control_node, + # dashboard_client_node, + # tool_communication_node, + # controller_stopper_node, + # urscript_interface, + rsp, + rviz_node, + alice_initial_joint_controller_spawner_stopped, + bob_initial_joint_controller_spawner_stopped, + alice_initial_joint_controller_spawner_started, + bob_initial_joint_controller_spawner_started, + ] + controller_spawners + + return nodes_to_start + + +def generate_launch_description(): + declared_arguments = [] + # UR specific arguments + declared_arguments.append( + DeclareLaunchArgument( + "ur_type", + description="Type/series of used UR robot.", + choices=[ + "ur3", + "ur3e", + "ur5", + "ur5e", + "ur10", + "ur10e", + "ur16e", + "ur20", + "ur30", + ], + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "robot_ip", description="IP address by which the robot can be reached." + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "safety_limits", + default_value="true", + description="Enables the safety limits controller if true.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "safety_pos_margin", + default_value="0.15", + description="The margin to lower and upper limits in the safety controller.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "safety_k_position", + default_value="20", + description="k-position factor in the safety controller.", + ) + ) + # General arguments + declared_arguments.append( + DeclareLaunchArgument( + "controllers_file", + default_value=PathJoinSubstitution( + [ + FindPackageShare("my_dual_robot_cell_control"), + "config", + "ros2_controllers.yaml", + ] + ), + description="YAML file with the controllers configuration.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "description_launchfile", + default_value=PathJoinSubstitution( + [ + FindPackageShare("my_dual_robot_cell_control"), + "launch", + "rsp.launch.py", + ] + ), + description="Launchfile (absolute path) providing the description. " + "The launchfile has to start a robot_state_publisher node that " + "publishes the description topic.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "tf_prefix", + default_value="", + description="tf_prefix of the joint names, useful for " + "multi-robot setup. If changed, also joint names in the controllers' configuration " + "have to be updated.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "use_mock_hardware", + default_value="false", + description="Start robot with mock hardware mirroring command to its states.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "mock_sensor_commands", + default_value="false", + description="Enable mock command interfaces for sensors used for simple simulations. " + "Used only if 'use_mock_hardware' parameter is true.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "headless_mode", + default_value="false", + description="Enable headless mode for robot control", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "controller_spawner_timeout", + default_value="10", + description="Timeout used when spawning controllers.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "alice_initial_joint_controller", + default_value="alice_scaled_joint_trajectory_controller", + description="Initially loaded robot controller.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "bob_initial_joint_controller", + default_value="bob_scaled_joint_trajectory_controller", + description="Initially loaded robot controller.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "activate_joint_controller", + default_value="true", + description="Activate loaded joint controller.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "launch_rviz", default_value="true", description="Launch RViz?" + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "rviz_config_file", + default_value=PathJoinSubstitution( + [FindPackageShare("ur_description"), "rviz", "view_robot.rviz"] + ), + description="RViz config file (absolute path) to use when launching rviz.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "launch_dashboard_client", + default_value="true", + description="Launch Dashboard Client?", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "use_tool_communication", + default_value="false", + description="Only available for e series!", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "tool_parity", + default_value="0", + description="Parity configuration for serial communication. Only effective, if " + "use_tool_communication is set to True.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "tool_baud_rate", + default_value="115200", + description="Baud rate configuration for serial communication. Only effective, if " + "use_tool_communication is set to True.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "tool_stop_bits", + default_value="1", + description="Stop bits configuration for serial communication. Only effective, if " + "use_tool_communication is set to True.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "tool_rx_idle_chars", + default_value="1.5", + description="RX idle chars configuration for serial communication. Only effective, " + "if use_tool_communication is set to True.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "tool_tx_idle_chars", + default_value="3.5", + description="TX idle chars configuration for serial communication. Only effective, " + "if use_tool_communication is set to True.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "tool_device_name", + default_value="/tmp/ttyUR", + description="File descriptor that will be generated for the tool communication device. " + "The user has be be allowed to write to this location. " + "Only effective, if use_tool_communication is set to True.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "tool_tcp_port", + default_value="54321", + description="Remote port that will be used for bridging the tool's serial device. " + "Only effective, if use_tool_communication is set to True.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "tool_voltage", + default_value="0", # 0 being a conservative value that won't destroy anything + description="Tool voltage that will be setup.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "reverse_ip", + default_value="0.0.0.0", + description="IP that will be used for the robot controller to communicate back to the driver.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "script_command_port", + default_value="50004", + description="Port that will be opened to forward URScript commands to the robot.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "reverse_port", + default_value="50001", + description="Port that will be opened to send cyclic instructions from the driver to the robot controller.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "script_sender_port", + default_value="50002", + description="The driver will offer an interface to query the external_control URScript on this port.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "trajectory_port", + default_value="50003", + description="Port that will be opened for trajectory control.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + name="update_rate_config_file", + default_value=[ + PathJoinSubstitution( + [ + FindPackageShare("my_dual_robot_cell_control"), + "config", + ] + ), + "/", + "update_rate.yaml", + ], + ) + ) + return LaunchDescription(declared_arguments + launch_setup()) From 8cd6f11307601a38e69f10a209bf95952deae750 Mon Sep 17 00:00:00 2001 From: Vihaan Shah Date: Mon, 24 Jun 2024 19:57:26 -0400 Subject: [PATCH 05/14] Generate dual_robot_cell moveit config using moveit setup assistant --- .../.setup_assistant | 19 ++++ .../CMakeLists.txt | 11 +++ .../config/initial_positions.yaml | 15 +++ .../config/joint_limits.yaml | 70 ++++++++++++++ .../config/kinematics.yaml | 1 + .../config/moveit.rviz | 51 +++++++++++ .../config/moveit_controllers.yaml | 32 +++++++ .../config/my_dual_robot_cell.srdf | 91 +++++++++++++++++++ .../config/pilz_cartesian_limits.yaml | 6 ++ .../launch/demo.launch.py | 7 ++ .../launch/move_group.launch.py | 7 ++ .../launch/moveit_rviz.launch.py | 7 ++ .../package.xml | 46 ++++++++++ 13 files changed, 363 insertions(+) create mode 100644 my_dual_robot_cell/my_dual_robot_cell_moveit_config/.setup_assistant create mode 100644 my_dual_robot_cell/my_dual_robot_cell_moveit_config/CMakeLists.txt create mode 100644 my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/initial_positions.yaml create mode 100644 my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/joint_limits.yaml create mode 100644 my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/kinematics.yaml create mode 100644 my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/moveit.rviz create mode 100644 my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/moveit_controllers.yaml create mode 100644 my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/my_dual_robot_cell.srdf create mode 100644 my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/pilz_cartesian_limits.yaml create mode 100644 my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/demo.launch.py create mode 100644 my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/move_group.launch.py create mode 100644 my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/moveit_rviz.launch.py create mode 100644 my_dual_robot_cell/my_dual_robot_cell_moveit_config/package.xml diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/.setup_assistant b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/.setup_assistant new file mode 100644 index 0000000..27ba91e --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/.setup_assistant @@ -0,0 +1,19 @@ +moveit_setup_assistant_config: + urdf: + package: my_dual_robot_cell_description + relative_path: urdf/my_dual_robot_cell.urdf.xacro + srdf: + relative_path: config/my_dual_robot_cell.srdf + package_settings: + author_name: Vihaan Shah + author_email: vihaan.shah@uconn.edu + generated_timestamp: 1719272672 + control_xacro: + command: + - position + state: + - position + - velocity + modified_urdf: + xacros: + - control_xacro \ No newline at end of file diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/CMakeLists.txt b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/CMakeLists.txt new file mode 100644 index 0000000..0cb4e73 --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.22) +project(my_dual_robot_cell_moveit_config) + +find_package(ament_cmake REQUIRED) + +ament_package() + +install(DIRECTORY launch DESTINATION share/${PROJECT_NAME} + PATTERN "setup_assistant.launch" EXCLUDE) +install(DIRECTORY config DESTINATION share/${PROJECT_NAME}) +install(FILES .setup_assistant DESTINATION share/${PROJECT_NAME}) diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/initial_positions.yaml b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/initial_positions.yaml new file mode 100644 index 0000000..ecb90d7 --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/initial_positions.yaml @@ -0,0 +1,15 @@ +# Default initial positions for my_dual_robot_cell's ros2_control fake system + +initial_positions: + alice_elbow_joint: 0 + alice_shoulder_lift_joint: 0 + alice_shoulder_pan_joint: 0 + alice_wrist_1_joint: 0 + alice_wrist_2_joint: 0 + alice_wrist_3_joint: 0 + bob_elbow_joint: 0 + bob_shoulder_lift_joint: 0 + bob_shoulder_pan_joint: 0 + bob_wrist_1_joint: 0 + bob_wrist_2_joint: 0 + bob_wrist_3_joint: 0 \ No newline at end of file diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/joint_limits.yaml b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/joint_limits.yaml new file mode 100644 index 0000000..441ee87 --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/joint_limits.yaml @@ -0,0 +1,70 @@ +# joint_limits.yaml allows the dynamics properties specified in the URDF to be overwritten or augmented as needed + +# For beginners, we downscale velocity and acceleration limits. +# You can always specify higher scaling factors (<= 1.0) in your motion requests. # Increase the values below to 1.0 to always move at maximum speed. +default_velocity_scaling_factor: 0.1 +default_acceleration_scaling_factor: 0.1 + +# Specific joint properties can be changed with the keys [max_position, min_position, max_velocity, max_acceleration] +# Joint limits can be turned off with [has_velocity_limits, has_acceleration_limits] +joint_limits: + alice_elbow_joint: + has_velocity_limits: true + max_velocity: 3.1415926535897931 + has_acceleration_limits: false + max_acceleration: 0 + alice_shoulder_lift_joint: + has_velocity_limits: true + max_velocity: 3.1415926535897931 + has_acceleration_limits: false + max_acceleration: 0 + alice_shoulder_pan_joint: + has_velocity_limits: true + max_velocity: 3.1415926535897931 + has_acceleration_limits: false + max_acceleration: 0 + alice_wrist_1_joint: + has_velocity_limits: true + max_velocity: 6.2831853071795862 + has_acceleration_limits: false + max_acceleration: 0 + alice_wrist_2_joint: + has_velocity_limits: true + max_velocity: 6.2831853071795862 + has_acceleration_limits: false + max_acceleration: 0 + alice_wrist_3_joint: + has_velocity_limits: true + max_velocity: 6.2831853071795862 + has_acceleration_limits: false + max_acceleration: 0 + bob_elbow_joint: + has_velocity_limits: true + max_velocity: 3.1415926535897931 + has_acceleration_limits: false + max_acceleration: 0 + bob_shoulder_lift_joint: + has_velocity_limits: true + max_velocity: 3.1415926535897931 + has_acceleration_limits: false + max_acceleration: 0 + bob_shoulder_pan_joint: + has_velocity_limits: true + max_velocity: 3.1415926535897931 + has_acceleration_limits: false + max_acceleration: 0 + bob_wrist_1_joint: + has_velocity_limits: true + max_velocity: 6.2831853071795862 + has_acceleration_limits: false + max_acceleration: 0 + bob_wrist_2_joint: + has_velocity_limits: true + max_velocity: 6.2831853071795862 + has_acceleration_limits: false + max_acceleration: 0 + bob_wrist_3_joint: + has_velocity_limits: true + max_velocity: 6.2831853071795862 + has_acceleration_limits: false + max_acceleration: 0 \ No newline at end of file diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/kinematics.yaml b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/kinematics.yaml new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/kinematics.yaml @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/moveit.rviz b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/moveit.rviz new file mode 100644 index 0000000..179a9c8 --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/moveit.rviz @@ -0,0 +1,51 @@ +Panels: + - Class: rviz_common/Displays + Name: Displays + Property Tree Widget: + Expanded: + - /MotionPlanning1 + - Class: rviz_common/Help + Name: Help + - Class: rviz_common/Views + Name: Views +Visualization Manager: + Displays: + - Class: rviz_default_plugins/Grid + Name: Grid + Value: true + - Class: moveit_rviz_plugin/MotionPlanning + Name: MotionPlanning + Planned Path: + Loop Animation: true + State Display Time: 0.05 s + Trajectory Topic: display_planned_path + Planning Scene Topic: monitored_planning_scene + Robot Description: robot_description + Scene Geometry: + Scene Alpha: 1 + Scene Robot: + Robot Alpha: 0.5 + Value: true + Global Options: + Fixed Frame: world + Tools: + - Class: rviz_default_plugins/Interact + - Class: rviz_default_plugins/MoveCamera + - Class: rviz_default_plugins/Select + Value: true + Views: + Current: + Class: rviz_default_plugins/Orbit + Distance: 2.0 + Focal Point: + X: -0.1 + Y: 0.25 + Z: 0.30 + Name: Current View + Pitch: 0.5 + Target Frame: world + Yaw: -0.623 +Window Geometry: + Height: 975 + QMainWindow State: 000000ff00000000fd0000000100000000000002b400000375fc0200000005fb00000044004d006f00740069006f006e0050006c0061006e006e0069006e00670020002d0020005400720061006a006500630074006f0072007900200053006c00690064006500720000000000ffffffff0000004100fffffffb000000100044006900730070006c006100790073010000003d00000123000000c900fffffffb0000001c004d006f00740069006f006e0050006c0061006e006e0069006e00670100000166000001910000018800fffffffb0000000800480065006c0070000000029a0000006e0000006e00fffffffb0000000a0056006900650077007301000002fd000000b5000000a400ffffff000001f60000037500000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 + Width: 1200 \ No newline at end of file diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/moveit_controllers.yaml b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/moveit_controllers.yaml new file mode 100644 index 0000000..dace306 --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/moveit_controllers.yaml @@ -0,0 +1,32 @@ +# MoveIt uses this configuration for controller management + +moveit_controller_manager: moveit_simple_controller_manager/MoveItSimpleControllerManager + +moveit_simple_controller_manager: + controller_names: + - alice_scaled_joint_trajectory_controller + - bob_scaled_joint_trajectory_controller + + alice_scaled_joint_trajectory_controller: + type: FollowJointTrajectory + action_ns: follow_joint_trajectory + default: true + joints: + - alice_shoulder_pan_joint + - alice_shoulder_lift_joint + - alice_elbow_joint + - alice_wrist_1_joint + - alice_wrist_2_joint + - alice_wrist_3_joint + + bob_scaled_joint_trajectory_controller: + type: FollowJointTrajectory + action_ns: follow_joint_trajectory + default: true + joints: + - bob_shoulder_pan_joint + - bob_shoulder_lift_joint + - bob_elbow_joint + - bob_wrist_1_joint + - bob_wrist_2_joint + - bob_wrist_3_joint \ No newline at end of file diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/my_dual_robot_cell.srdf b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/my_dual_robot_cell.srdf new file mode 100644 index 0000000..70480a0 --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/my_dual_robot_cell.srdf @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/pilz_cartesian_limits.yaml b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/pilz_cartesian_limits.yaml new file mode 100644 index 0000000..b2997ca --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/pilz_cartesian_limits.yaml @@ -0,0 +1,6 @@ +# Limits for the Pilz planner +cartesian_limits: + max_trans_vel: 1.0 + max_trans_acc: 2.25 + max_trans_dec: -5.0 + max_rot_vel: 1.57 diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/demo.launch.py b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/demo.launch.py new file mode 100644 index 0000000..29c072b --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/demo.launch.py @@ -0,0 +1,7 @@ +from moveit_configs_utils import MoveItConfigsBuilder +from moveit_configs_utils.launches import generate_demo_launch + + +def generate_launch_description(): + moveit_config = MoveItConfigsBuilder("my_dual_robot_cell", package_name="my_dual_robot_cell_moveit_config").to_moveit_configs() + return generate_demo_launch(moveit_config) diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/move_group.launch.py b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/move_group.launch.py new file mode 100644 index 0000000..d74842a --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/move_group.launch.py @@ -0,0 +1,7 @@ +from moveit_configs_utils import MoveItConfigsBuilder +from moveit_configs_utils.launches import generate_move_group_launch + + +def generate_launch_description(): + moveit_config = MoveItConfigsBuilder("my_dual_robot_cell", package_name="my_dual_robot_cell_moveit_config").to_moveit_configs() + return generate_move_group_launch(moveit_config) diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/moveit_rviz.launch.py b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/moveit_rviz.launch.py new file mode 100644 index 0000000..f7dbfb7 --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/moveit_rviz.launch.py @@ -0,0 +1,7 @@ +from moveit_configs_utils import MoveItConfigsBuilder +from moveit_configs_utils.launches import generate_moveit_rviz_launch + + +def generate_launch_description(): + moveit_config = MoveItConfigsBuilder("my_dual_robot_cell", package_name="my_dual_robot_cell_moveit_config").to_moveit_configs() + return generate_moveit_rviz_launch(moveit_config) diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/package.xml b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/package.xml new file mode 100644 index 0000000..be1b82c --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/package.xml @@ -0,0 +1,46 @@ + + + + my_dual_robot_cell_moveit_config + 0.3.0 + + An automatically generated package with all the configuration and launch files for using the my_dual_robot_cell with the MoveIt Motion Planning Framework + + Vihaan Shah + + BSD-3-Clause + + http://moveit.ros.org/ + https://github.com/ros-planning/moveit2/issues + https://github.com/ros-planning/moveit2 + + Vihaan Shah + + ament_cmake + + moveit_ros_move_group + moveit_kinematics + moveit_planners + moveit_simple_controller_manager + joint_state_publisher + joint_state_publisher_gui + tf2_ros + xacro + + + + moveit_configs_utils + moveit_ros_move_group + moveit_ros_visualization + my_dual_robot_cell_description + rviz2 + rviz_common + rviz_default_plugins + xacro + + + + ament_cmake + + From 1976b71e9e26482c538ff266aebd7c584a7b10a8 Mon Sep 17 00:00:00 2001 From: Vihaan Shah Date: Tue, 25 Jun 2024 10:25:35 -0400 Subject: [PATCH 06/14] Add acceleration limits --- .../config/joint_limits.yaml | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/joint_limits.yaml b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/joint_limits.yaml index 441ee87..f5ee057 100644 --- a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/joint_limits.yaml +++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/joint_limits.yaml @@ -11,60 +11,60 @@ joint_limits: alice_elbow_joint: has_velocity_limits: true max_velocity: 3.1415926535897931 - has_acceleration_limits: false - max_acceleration: 0 + has_acceleration_limits: true + max_acceleration: 5.0 alice_shoulder_lift_joint: has_velocity_limits: true max_velocity: 3.1415926535897931 - has_acceleration_limits: false - max_acceleration: 0 + has_acceleration_limits: true + max_acceleration: 5.0 alice_shoulder_pan_joint: has_velocity_limits: true max_velocity: 3.1415926535897931 - has_acceleration_limits: false - max_acceleration: 0 + has_acceleration_limits: true + max_acceleration: 5.0 alice_wrist_1_joint: has_velocity_limits: true max_velocity: 6.2831853071795862 - has_acceleration_limits: false - max_acceleration: 0 + has_acceleration_limits: true + max_acceleration: 5.0 alice_wrist_2_joint: has_velocity_limits: true max_velocity: 6.2831853071795862 - has_acceleration_limits: false - max_acceleration: 0 + has_acceleration_limits: true + max_acceleration: 5.0 alice_wrist_3_joint: has_velocity_limits: true max_velocity: 6.2831853071795862 - has_acceleration_limits: false - max_acceleration: 0 + has_acceleration_limits: true + max_acceleration: 5.0 bob_elbow_joint: has_velocity_limits: true max_velocity: 3.1415926535897931 - has_acceleration_limits: false - max_acceleration: 0 + has_acceleration_limits: true + max_acceleration: 5.0 bob_shoulder_lift_joint: has_velocity_limits: true max_velocity: 3.1415926535897931 - has_acceleration_limits: false - max_acceleration: 0 + has_acceleration_limits: true + max_acceleration: 5.0 bob_shoulder_pan_joint: has_velocity_limits: true max_velocity: 3.1415926535897931 - has_acceleration_limits: false - max_acceleration: 0 + has_acceleration_limits: true + max_acceleration: 5.0 bob_wrist_1_joint: has_velocity_limits: true max_velocity: 6.2831853071795862 - has_acceleration_limits: false - max_acceleration: 0 + has_acceleration_limits: true + max_acceleration: 5.0 bob_wrist_2_joint: has_velocity_limits: true max_velocity: 6.2831853071795862 - has_acceleration_limits: false - max_acceleration: 0 + has_acceleration_limits: true + max_acceleration: 5.0 bob_wrist_3_joint: has_velocity_limits: true max_velocity: 6.2831853071795862 - has_acceleration_limits: false - max_acceleration: 0 \ No newline at end of file + has_acceleration_limits: true + max_acceleration: 5.0 \ No newline at end of file From 6de9d5dc6b924d79611eb35ccbe60a3d588a8b87 Mon Sep 17 00:00:00 2001 From: Vihaan Shah Date: Tue, 25 Jun 2024 10:27:03 -0400 Subject: [PATCH 07/14] Add IK plugins for the two manipulators --- .../config/kinematics.yaml | 9 ++++++++- .../my_dual_robot_cell_moveit_config/config/moveit.rviz | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/kinematics.yaml b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/kinematics.yaml index 9e26dfe..87cc61c 100644 --- a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/kinematics.yaml +++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/kinematics.yaml @@ -1 +1,8 @@ -{} \ No newline at end of file +alice_manipulator: + kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin + kinematics_solver_search_resolution: 0.0050000000000000001 + kinematics_solver_timeout: 0.0050000000000000001 +bob_manipulator: + kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin + kinematics_solver_search_resolution: 0.0050000000000000001 + kinematics_solver_timeout: 0.0050000000000000001 \ No newline at end of file diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/moveit.rviz b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/moveit.rviz index 179a9c8..f31651e 100644 --- a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/moveit.rviz +++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/moveit.rviz @@ -48,4 +48,4 @@ Visualization Manager: Window Geometry: Height: 975 QMainWindow State: 000000ff00000000fd0000000100000000000002b400000375fc0200000005fb00000044004d006f00740069006f006e0050006c0061006e006e0069006e00670020002d0020005400720061006a006500630074006f0072007900200053006c00690064006500720000000000ffffffff0000004100fffffffb000000100044006900730070006c006100790073010000003d00000123000000c900fffffffb0000001c004d006f00740069006f006e0050006c0061006e006e0069006e00670100000166000001910000018800fffffffb0000000800480065006c0070000000029a0000006e0000006e00fffffffb0000000a0056006900650077007301000002fd000000b5000000a400ffffff000001f60000037500000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 - Width: 1200 \ No newline at end of file + Width: 1200 From 6f86075ed3f75176a6c1b824a7f33ba0f554560e Mon Sep 17 00:00:00 2001 From: Vihaan Shah Date: Tue, 2 Jul 2024 20:27:02 -0400 Subject: [PATCH 08/14] Remove unwanted launch files + configuration files --- .../.setup_assistant | 11 +-- .../launch/demo.launch.py | 7 -- .../launch/dual_ur_moveit.launch.py | 77 +++++++++++++++++++ .../launch/move_group.launch.py | 7 -- .../launch/moveit_rviz.launch.py | 7 -- .../package.xml | 5 -- 6 files changed, 78 insertions(+), 36 deletions(-) delete mode 100644 my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/demo.launch.py create mode 100644 my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/dual_ur_moveit.launch.py delete mode 100644 my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/move_group.launch.py delete mode 100644 my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/moveit_rviz.launch.py diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/.setup_assistant b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/.setup_assistant index 27ba91e..23da84d 100644 --- a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/.setup_assistant +++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/.setup_assistant @@ -7,13 +7,4 @@ moveit_setup_assistant_config: package_settings: author_name: Vihaan Shah author_email: vihaan.shah@uconn.edu - generated_timestamp: 1719272672 - control_xacro: - command: - - position - state: - - position - - velocity - modified_urdf: - xacros: - - control_xacro \ No newline at end of file + generated_timestamp: 1719324402 \ No newline at end of file diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/demo.launch.py b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/demo.launch.py deleted file mode 100644 index 29c072b..0000000 --- a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/demo.launch.py +++ /dev/null @@ -1,7 +0,0 @@ -from moveit_configs_utils import MoveItConfigsBuilder -from moveit_configs_utils.launches import generate_demo_launch - - -def generate_launch_description(): - moveit_config = MoveItConfigsBuilder("my_dual_robot_cell", package_name="my_dual_robot_cell_moveit_config").to_moveit_configs() - return generate_demo_launch(moveit_config) diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/dual_ur_moveit.launch.py b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/dual_ur_moveit.launch.py new file mode 100644 index 0000000..644f2ab --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/dual_ur_moveit.launch.py @@ -0,0 +1,77 @@ +import os +from pathlib import Path + +import yaml +from ament_index_python.packages import get_package_share_directory +from launch import LaunchDescription +from launch.actions import DeclareLaunchArgument, ExecuteProcess, RegisterEventHandler +from launch.conditions import IfCondition +from launch.event_handlers import OnProcessExit +from launch.substitutions import LaunchConfiguration, PathJoinSubstitution +from launch_ros.actions import Node +from launch_ros.substitutions import FindPackageShare +from moveit_configs_utils import MoveItConfigsBuilder + + +def load_yaml(package_name, file_path): + package_path = get_package_share_directory(package_name) + absolute_file_path = os.path.join(package_path, file_path) + + try: + with open(absolute_file_path) as file: + return yaml.safe_load(file) + except OSError: # parent of IOError, OSError *and* WindowsError where available + return None + + +def generate_launch_description(): + moveit_config = MoveItConfigsBuilder( + "my_dual_robot_cell", package_name="my_dual_robot_cell_moveit_config" + ).to_moveit_configs() + + move_group_configuration = { + "publish_robot_description_semantic": True, + "allow_trajectory_execution": True, + "publish_planning_scene": True, + "publish_geometry_updates": True, + "publish_state_updates": True, + "publish_transforms_updates": True, + } + + move_group_params = [ + moveit_config.to_dict(), + move_group_configuration, + ] + + move_group_node = Node( + package="moveit_ros_move_group", + executable="move_group", + output="screen", + parameters=move_group_params, + additional_env={"DISPLAY": ":0"}, + ) + + # rviz_config_file = PathJoinSubstitution( + # [FindPackageShare("crm_moveit_config"), "config", "moveit.rviz"] + # ) + rviz_node = Node( + package="rviz2", + executable="rviz2", + name="rviz2_moveit", + output="log", + # arguments=["-d"], + parameters=[ + moveit_config.robot_description, + moveit_config.robot_description_semantic, + moveit_config.robot_description_kinematics, + moveit_config.planning_pipelines, + moveit_config.joint_limits, + ], + ) + + return LaunchDescription( + [ + move_group_node, + rviz_node, + ] + ) diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/move_group.launch.py b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/move_group.launch.py deleted file mode 100644 index d74842a..0000000 --- a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/move_group.launch.py +++ /dev/null @@ -1,7 +0,0 @@ -from moveit_configs_utils import MoveItConfigsBuilder -from moveit_configs_utils.launches import generate_move_group_launch - - -def generate_launch_description(): - moveit_config = MoveItConfigsBuilder("my_dual_robot_cell", package_name="my_dual_robot_cell_moveit_config").to_moveit_configs() - return generate_move_group_launch(moveit_config) diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/moveit_rviz.launch.py b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/moveit_rviz.launch.py deleted file mode 100644 index f7dbfb7..0000000 --- a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/moveit_rviz.launch.py +++ /dev/null @@ -1,7 +0,0 @@ -from moveit_configs_utils import MoveItConfigsBuilder -from moveit_configs_utils.launches import generate_moveit_rviz_launch - - -def generate_launch_description(): - moveit_config = MoveItConfigsBuilder("my_dual_robot_cell", package_name="my_dual_robot_cell_moveit_config").to_moveit_configs() - return generate_moveit_rviz_launch(moveit_config) diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/package.xml b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/package.xml index be1b82c..ae4308f 100644 --- a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/package.xml +++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/package.xml @@ -26,10 +26,6 @@ joint_state_publisher_gui tf2_ros xacro - - - moveit_configs_utils moveit_ros_move_group moveit_ros_visualization @@ -37,7 +33,6 @@ rviz2 rviz_common rviz_default_plugins - xacro From 24bf6e1203bbfdb4ad3a466f159f8ab3553ed89b Mon Sep 17 00:00:00 2001 From: Vihaan Shah Date: Tue, 2 Jul 2024 20:30:30 -0400 Subject: [PATCH 09/14] Add io/status and forward velocity controllers --- .../config/combined_controllers.yaml | 244 ++++++++++++++++++ 1 file changed, 244 insertions(+) create mode 100644 my_dual_robot_cell/my_dual_robot_cell_control/config/combined_controllers.yaml diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/config/combined_controllers.yaml b/my_dual_robot_cell/my_dual_robot_cell_control/config/combined_controllers.yaml new file mode 100644 index 0000000..143c150 --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_control/config/combined_controllers.yaml @@ -0,0 +1,244 @@ +controller_manager: + ros__parameters: + alice_joint_state_broadcaster: + type: joint_state_broadcaster/JointStateBroadcaster + + bob_joint_state_broadcaster: + type: joint_state_broadcaster/JointStateBroadcaster + + alice_io_and_status_controller: + type: ur_controllers/GPIOController + + bob_io_and_status_controller: + type: ur_controllers/GPIOController + + alice_speed_scaling_state_broadcaster: + type: ur_controllers/SpeedScalingStateBroadcaster + + bob_speed_scaling_state_broadcaster: + type: ur_controllers/SpeedScalingStateBroadcaster + + alice_force_torque_sensor_broadcaster: + type: force_torque_sensor_broadcaster/ForceTorqueSensorBroadcaster + + bob_force_torque_sensor_broadcaster: + type: force_torque_sensor_broadcaster/ForceTorqueSensorBroadcaster + + alice_joint_trajectory_controller: + type: joint_trajectory_controller/JointTrajectoryController + + bob_trajectory_controller: + type: joint_trajectory_controller/JointTrajectoryController + + alice_scaled_joint_trajectory_controller: + type: ur_controllers/ScaledJointTrajectoryController + + bob_scaled_joint_trajectory_controller: + type: ur_controllers/ScaledJointTrajectoryController + + forward_velocity_controller: + type: velocity_controllers/JointGroupVelocityController + + alice_forward_position_controller: + type: position_controllers/JointGroupPositionController + + bob_forward_position_controller: + type: position_controllers/JointGroupPositionController + + +alice_speed_scaling_state_broadcaster: + ros__parameters: + state_publish_rate: 100.0 + tf_prefix: "alice_" + +bob_speed_scaling_state_broadcaster: + ros__parameters: + state_publish_rate: 100.0 + tf_prefix: "bob_" + +alice_io_and_status_controller: + ros__parameters: + tf_prefix: "alice_" + +bob_io_and_status_controller: + ros__parameters: + tf_prefix: "bob_" + +alice_force_torque_sensor_broadcaster: + ros__parameters: + sensor_name: alice_tcp_fts_sensor + state_interface_names: + - force.x + - force.y + - force.z + - torque.x + - torque.y + - torque.z + frame_id: bob_tool0 + topic_name: alice_ft_data + +bob_force_torque_sensor_broadcaster: + ros__parameters: + sensor_name: bob_tcp_fts_sensor + state_interface_names: + - force.x + - force.y + - force.z + - torque.x + - torque.y + - torque.z + frame_id: bob_tool0 + topic_name: bob_ft_data + + +alice_joint_trajectory_controller: + ros__parameters: + joints: + - alice_shoulder_pan_joint + - alice_shoulder_lift_joint + - alice_elbow_joint + - alice_wrist_1_joint + - alice_wrist_2_joint + - alice_wrist_3_joint + command_interfaces: + - position + state_interfaces: + - position + - velocity + state_publish_rate: 100.0 + action_monitor_rate: 20.0 + allow_partial_joints_goal: false + constraints: + stopped_velocity_tolerance: 0.2 + goal_time: 0.0 + alice_shoulder_pan_joint: { trajectory: 0.2, goal: 0.1 } + alice_shoulder_lift_joint: { trajectory: 0.2, goal: 0.1 } + alice_elbow_joint: { trajectory: 0.2, goal: 0.1 } + alice_wrist_1_joint: { trajectory: 0.2, goal: 0.1 } + alice_wrist_2_joint: { trajectory: 0.2, goal: 0.1 } + alice_wrist_3_joint: { trajectory: 0.2, goal: 0.1 } + +bob_joint_trajectory_controller: + ros__parameters: + joints: + - bob_shoulder_pan_joint + - bob_shoulder_lift_joint + - bob_elbow_joint + - bob_wrist_1_joint + - bob_wrist_2_joint + - bob_wrist_3_joint + command_interfaces: + - position + state_interfaces: + - position + - velocity + state_publish_rate: 100.0 + action_monitor_rate: 20.0 + allow_partial_joints_goal: false + constraints: + stopped_velocity_tolerance: 0.2 + goal_time: 0.0 + bob_shoulder_pan_joint: { trajectory: 0.2, goal: 0.1 } + bob_shoulder_lift_joint: { trajectory: 0.2, goal: 0.1 } + bob_elbow_joint: { trajectory: 0.2, goal: 0.1 } + bob_wrist_1_joint: { trajectory: 0.2, goal: 0.1 } + bob_wrist_2_joint: { trajectory: 0.2, goal: 0.1 } + bob_wrist_3_joint: { trajectory: 0.2, goal: 0.1 } + +alice_scaled_joint_trajectory_controller: + ros__parameters: + joints: + - alice_shoulder_pan_joint + - alice_shoulder_lift_joint + - alice_elbow_joint + - alice_wrist_1_joint + - alice_wrist_2_joint + - alice_wrist_3_joint + command_interfaces: + - position + state_interfaces: + - position + - velocity + state_publish_rate: 100.0 + action_monitor_rate: 20.0 + allow_partial_joints_goal: false + constraints: + stopped_velocity_tolerance: 0.2 + goal_time: 0.0 + alice_shoulder_pan_joint: { trajectory: 0.2, goal: 0.1 } + alice_shoulder_lift_joint: { trajectory: 0.2, goal: 0.1 } + alice_elbow_joint: { trajectory: 0.2, goal: 0.1 } + alice_wrist_1_joint: { trajectory: 0.2, goal: 0.1 } + alice_wrist_2_joint: { trajectory: 0.2, goal: 0.1 } + alice_wrist_3_joint: { trajectory: 0.2, goal: 0.1 } + speed_scaling_interface_name: alice_speed_scaling/speed_scaling_factor + +bob_scaled_joint_trajectory_controller: + ros__parameters: + joints: + - bob_shoulder_pan_joint + - bob_shoulder_lift_joint + - bob_elbow_joint + - bob_wrist_1_joint + - bob_wrist_2_joint + - bob_wrist_3_joint + command_interfaces: + - position + state_interfaces: + - position + - velocity + state_publish_rate: 100.0 + action_monitor_rate: 20.0 + allow_partial_joints_goal: false + constraints: + stopped_velocity_tolerance: 0.2 + goal_time: 0.0 + bob_shoulder_pan_joint: { trajectory: 0.2, goal: 0.1 } + bob_shoulder_lift_joint: { trajectory: 0.2, goal: 0.1 } + bob_elbow_joint: { trajectory: 0.2, goal: 0.1 } + bob_wrist_1_joint: { trajectory: 0.2, goal: 0.1 } + bob_wrist_2_joint: { trajectory: 0.2, goal: 0.1 } + bob_wrist_3_joint: { trajectory: 0.2, goal: 0.1 } + speed_scaling_interface_name: bob_speed_scaling/speed_scaling_factor + +alice_forward_velocity_controller: + ros__parameters: + joints: + - alice_shoulder_pan_joint + - alice_shoulder_lift_joint + - alice_elbow_joint + - alice_wrist_1_joint + - alice_wrist_2_joint + - alice_wrist_3_joint + interface_name: velocity + +bob_forward_velocity_controller: + ros__parameters: + joints: + - bob_shoulder_pan_joint + - bob_shoulder_lift_joint + - bob_elbow_joint + - bob_wrist_1_joint + - bob_wrist_2_joint + - bob_wrist_3_joint + interface_name: velocity + +alice_forward_position_controller: + ros__parameters: + joints: + - alice_shoulder_pan_joint + - alice_shoulder_lift_joint + - alice_elbow_joint + - alice_wrist_1_joint + - alice_wrist_2_joint + - alice_wrist_3_joint + +bob_forward_position_controller: + ros__parameters: + joints: + - bob_shoulder_pan_joint + - bob_shoulder_lift_joint + - bob_elbow_joint + - bob_wrist_1_joint + - bob_wrist_2_joint + - bob_wrist_3_joint \ No newline at end of file From 458bcca768b24235997b4c238371e76ea9dc4942 Mon Sep 17 00:00:00 2001 From: Vihaan Shah Date: Tue, 2 Jul 2024 20:31:35 -0400 Subject: [PATCH 10/14] Calibrate arms --- .../config/alice_calibration.yaml | 44 +++++++++++++++++++ .../config/bob_calibration.yaml | 44 +++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 my_dual_robot_cell/my_dual_robot_cell_control/config/alice_calibration.yaml create mode 100644 my_dual_robot_cell/my_dual_robot_cell_control/config/bob_calibration.yaml diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/config/alice_calibration.yaml b/my_dual_robot_cell/my_dual_robot_cell_control/config/alice_calibration.yaml new file mode 100644 index 0000000..278abec --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_control/config/alice_calibration.yaml @@ -0,0 +1,44 @@ +kinematics: + shoulder: + x: 0 + y: 0 + z: 0.15188497379686153 + roll: -0 + pitch: 0 + yaw: 6.0977137363254793e-05 + upper_arm: + x: -5.6533207234432926e-06 + y: 0 + z: 0 + roll: 1.570844251867735 + pitch: 0 + yaw: 2.541818406001163e-05 + forearm: + x: -0.24357369892909492 + y: 0 + z: 0 + roll: 3.1408819727448281 + pitch: 3.1414601607728438 + yaw: -3.1415265155090113 + wrist_1: + x: -0.21292841478821867 + y: 0.00048506402454531479 + z: 0.11301075109662011 + roll: 3.1373004863304383 + pitch: 3.1363886827765697 + yaw: 3.1415791419793657 + wrist_2: + x: 4.074182080180165e-05 + y: -0.085310893242290478 + z: -6.4346805950626749e-05 + roll: 1.5715505891323607 + pitch: 0 + yaw: -1.1414933636491948e-05 + wrist_3: + x: -7.319426521397714e-05 + y: 0.08232894752301384 + z: -5.8521744863255091e-05 + roll: 1.5700854986261004 + pitch: 3.1415926535897931 + yaw: -3.1415870300000677 + hash: calib_3443727564195709335 \ No newline at end of file diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/config/bob_calibration.yaml b/my_dual_robot_cell/my_dual_robot_cell_control/config/bob_calibration.yaml new file mode 100644 index 0000000..07d02f8 --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_control/config/bob_calibration.yaml @@ -0,0 +1,44 @@ +kinematics: + shoulder: + x: 0 + y: 0 + z: 0.15192390485501492 + roll: -0 + pitch: 0 + yaw: 7.5207672895458863e-05 + upper_arm: + x: 1.1565754681822927e-07 + y: 0 + z: 0 + roll: 1.5701230398196422 + pitch: 0 + yaw: -3.745754755790643e-05 + forearm: + x: -0.24342623565759611 + y: 0 + z: 0 + roll: 0.0062667292139209178 + pitch: -0.0013839232587116385 + yaw: 3.5263175677186283e-05 + wrist_1: + x: -0.21319918045377464 + y: -0.00042101985050556432 + z: 0.11194857450023041 + roll: 0.0037608148871306722 + pitch: 0.00014433964301166516 + yaw: -5.7788592498697277e-05 + wrist_2: + x: 3.3301180434358473e-05 + y: -0.085304702494341758 + z: -2.7251181339165215e-05 + roll: 1.5711157837487961 + pitch: 0 + yaw: -3.3083428877200004e-05 + wrist_3: + x: -4.675513506427485e-05 + y: 0.082256832990903556 + z: -5.7204020078096673e-05 + roll: 1.5701008950748028 + pitch: 3.1415926535897931 + yaw: 3.1415605336065866 + hash: calib_10683367749926797482 \ No newline at end of file From 998c2c189aa941ca2c738b2272dcdf3115b60334 Mon Sep 17 00:00:00 2001 From: Vihaan Shah Date: Wed, 3 Jul 2024 15:02:54 -0400 Subject: [PATCH 11/14] Update arguments for alice and bob --- .../config/my_robot_calibration.yaml | 44 -- .../config/ros2_controllers.yaml | 227 -------- .../launch/rsp.launch.py | 163 ++++-- .../launch/start_robots.launch.py | 460 +++++++++++++++ .../launch/ur_control.launch.py | 541 ------------------ .../my_dual_robot_cell_controlled.urdf.xacro | 79 ++- 6 files changed, 610 insertions(+), 904 deletions(-) delete mode 100644 my_dual_robot_cell/my_dual_robot_cell_control/config/my_robot_calibration.yaml delete mode 100644 my_dual_robot_cell/my_dual_robot_cell_control/config/ros2_controllers.yaml create mode 100644 my_dual_robot_cell/my_dual_robot_cell_control/launch/start_robots.launch.py delete mode 100644 my_dual_robot_cell/my_dual_robot_cell_control/launch/ur_control.launch.py diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/config/my_robot_calibration.yaml b/my_dual_robot_cell/my_dual_robot_cell_control/config/my_robot_calibration.yaml deleted file mode 100644 index f7200ba..0000000 --- a/my_dual_robot_cell/my_dual_robot_cell_control/config/my_robot_calibration.yaml +++ /dev/null @@ -1,44 +0,0 @@ -kinematics: - shoulder: - x: 0 - y: 0 - z: 0.1519 - roll: 0 - pitch: 0 - yaw: 0 - upper_arm: - x: 0 - y: 0 - z: 0 - roll: 1.570796327 - pitch: 0 - yaw: 0 - forearm: - x: -0.24365 - y: 0 - z: 0 - roll: 0 - pitch: 0 - yaw: 0 - wrist_1: - x: -0.21325 - y: 0 - z: 0.11235 - roll: 0 - pitch: 0 - yaw: 0 - wrist_2: - x: 0 - y: -0.08535 - z: -1.750557762378351e-11 - roll: 1.570796327 - pitch: 0 - yaw: 0 - wrist_3: - x: 0 - y: 0.0819 - z: -1.679797079540562e-11 - roll: 1.570796326589793 - pitch: 3.141592653589793 - yaw: 3.141592653589793 - hash: calib_9122066269688285636 \ No newline at end of file diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/config/ros2_controllers.yaml b/my_dual_robot_cell/my_dual_robot_cell_control/config/ros2_controllers.yaml deleted file mode 100644 index 14ededf..0000000 --- a/my_dual_robot_cell/my_dual_robot_cell_control/config/ros2_controllers.yaml +++ /dev/null @@ -1,227 +0,0 @@ -controller_manager: - ros__parameters: - alice_joint_state_broadcaster: - type: joint_state_broadcaster/JointStateBroadcaster - - bob_joint_state_broadcaster: - type: joint_state_broadcaster/JointStateBroadcaster - - # io_and_status_controller: - # type: ur_controllers/GPIOController - - alice_speed_scaling_state_broadcaster: - type: ur_controllers/SpeedScalingStateBroadcaster - - bob_speed_scaling_state_broadcaster: - type: ur_controllers/SpeedScalingStateBroadcaster - - alice_force_torque_sensor_broadcaster: - type: force_torque_sensor_broadcaster/ForceTorqueSensorBroadcaster - - bob_force_torque_sensor_broadcaster: - type: force_torque_sensor_broadcaster/ForceTorqueSensorBroadcaster - - alice_joint_trajectory_controller: - type: joint_trajectory_controller/JointTrajectoryController - - bob_trajectory_controller: - type: joint_trajectory_controller/JointTrajectoryController - - alice_scaled_joint_trajectory_controller: - type: ur_controllers/ScaledJointTrajectoryController - - bob_scaled_joint_trajectory_controller: - type: ur_controllers/ScaledJointTrajectoryController - - # forward_velocity_controller: - # type: velocity_controllers/JointGroupVelocityController - - alice_forward_position_controller: - type: position_controllers/JointGroupPositionController - - bob_forward_position_controller: - type: position_controllers/JointGroupPositionController - - -alice_speed_scaling_state_broadcaster: - ros__parameters: - state_publish_rate: 100.0 - tf_prefix: "alice" - -bob_speed_scaling_state_broadcaster: - ros__parameters: - state_publish_rate: 100.0 - tf_prefix: "bob" - -# io_and_status_controller: -# ros__parameters: -# tf_prefix: "$(var tf_prefix)" - -alice_force_torque_sensor_broadcaster: - ros__parameters: - sensor_name: alice_tcp_fts_sensor - state_interface_names: - - force.x - - force.y - - force.z - - torque.x - - torque.y - - torque.z - frame_id: bob_tool0 - topic_name: alice_ft_data - -bob_force_torque_sensor_broadcaster: - ros__parameters: - sensor_name: bob_tcp_fts_sensor - state_interface_names: - - force.x - - force.y - - force.z - - torque.x - - torque.y - - torque.z - frame_id: bob_tool0 - topic_name: bob_ft_data - - -alice_joint_trajectory_controller: - ros__parameters: - joints: - - alice_shoulder_pan_joint - - alice_shoulder_lift_joint - - alice_elbow_joint - - alice_wrist_1_joint - - alice_wrist_2_joint - - alice_wrist_3_joint - command_interfaces: - - position - state_interfaces: - - position - - velocity - state_publish_rate: 100.0 - action_monitor_rate: 20.0 - allow_partial_joints_goal: false - constraints: - stopped_velocity_tolerance: 0.2 - goal_time: 0.0 - alice_shoulder_pan_joint: { trajectory: 0.2, goal: 0.1 } - alice_shoulder_lift_joint: { trajectory: 0.2, goal: 0.1 } - alice_elbow_joint: { trajectory: 0.2, goal: 0.1 } - alice_wrist_1_joint: { trajectory: 0.2, goal: 0.1 } - alice_wrist_2_joint: { trajectory: 0.2, goal: 0.1 } - alice_wrist_3_joint: { trajectory: 0.2, goal: 0.1 } - -bob_joint_trajectory_controller: - ros__parameters: - joints: - - bob_shoulder_pan_joint - - bob_shoulder_lift_joint - - bob_elbow_joint - - bob_wrist_1_joint - - bob_wrist_2_joint - - bob_wrist_3_joint - command_interfaces: - - position - state_interfaces: - - position - - velocity - state_publish_rate: 100.0 - action_monitor_rate: 20.0 - allow_partial_joints_goal: false - constraints: - stopped_velocity_tolerance: 0.2 - goal_time: 0.0 - bob_shoulder_pan_joint: { trajectory: 0.2, goal: 0.1 } - bob_shoulder_lift_joint: { trajectory: 0.2, goal: 0.1 } - bob_elbow_joint: { trajectory: 0.2, goal: 0.1 } - bob_wrist_1_joint: { trajectory: 0.2, goal: 0.1 } - bob_wrist_2_joint: { trajectory: 0.2, goal: 0.1 } - bob_wrist_3_joint: { trajectory: 0.2, goal: 0.1 } - -alice_scaled_joint_trajectory_controller: - ros__parameters: - joints: - - alice_shoulder_pan_joint - - alice_shoulder_lift_joint - - alice_elbow_joint - - alice_wrist_1_joint - - alice_wrist_2_joint - - alice_wrist_3_joint - command_interfaces: - - position - state_interfaces: - - position - - velocity - state_publish_rate: 100.0 - action_monitor_rate: 20.0 - allow_partial_joints_goal: false - constraints: - stopped_velocity_tolerance: 0.2 - goal_time: 0.0 - alice_shoulder_pan_joint: { trajectory: 0.2, goal: 0.1 } - alice_shoulder_lift_joint: { trajectory: 0.2, goal: 0.1 } - alice_elbow_joint: { trajectory: 0.2, goal: 0.1 } - alice_wrist_1_joint: { trajectory: 0.2, goal: 0.1 } - alice_wrist_2_joint: { trajectory: 0.2, goal: 0.1 } - alice_wrist_3_joint: { trajectory: 0.2, goal: 0.1 } - speed_scaling_interface_name: alice_speed_scaling/speed_scaling_factor - -bob_scaled_joint_trajectory_controller: - ros__parameters: - joints: - - bob_shoulder_pan_joint - - bob_shoulder_lift_joint - - bob_elbow_joint - - bob_wrist_1_joint - - bob_wrist_2_joint - - bob_wrist_3_joint - command_interfaces: - - position - state_interfaces: - - position - - velocity - state_publish_rate: 100.0 - action_monitor_rate: 20.0 - allow_partial_joints_goal: false - constraints: - stopped_velocity_tolerance: 0.2 - goal_time: 0.0 - bob_shoulder_pan_joint: { trajectory: 0.2, goal: 0.1 } - bob_shoulder_lift_joint: { trajectory: 0.2, goal: 0.1 } - bob_elbow_joint: { trajectory: 0.2, goal: 0.1 } - bob_wrist_1_joint: { trajectory: 0.2, goal: 0.1 } - bob_wrist_2_joint: { trajectory: 0.2, goal: 0.1 } - bob_wrist_3_joint: { trajectory: 0.2, goal: 0.1 } - speed_scaling_interface_name: bob_speed_scaling/speed_scaling_factor - - -# forward_velocity_controller: -# ros__parameters: -# joints: -# - $(var tf_prefix)shoulder_pan_joint -# - $(var tf_prefix)shoulder_lift_joint -# - $(var tf_prefix)elbow_joint -# - $(var tf_prefix)wrist_1_joint -# - $(var tf_prefix)wrist_2_joint -# - $(var tf_prefix)wrist_3_joint -# interface_name: velocity - -alice_forward_position_controller: - ros__parameters: - joints: - - alice_shoulder_pan_joint - - alice_shoulder_lift_joint - - alice_elbow_joint - - alice_wrist_1_joint - - alice_wrist_2_joint - - alice_wrist_3_joint - -bob_forward_position_controller: - ros__parameters: - joints: - - bob_shoulder_pan_joint - - bob_shoulder_lift_joint - - bob_elbow_joint - - bob_wrist_1_joint - - bob_wrist_2_joint - - bob_wrist_3_joint \ No newline at end of file diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/launch/rsp.launch.py b/my_dual_robot_cell/my_dual_robot_cell_control/launch/rsp.launch.py index 159b448..d4f5436 100644 --- a/my_dual_robot_cell/my_dual_robot_cell_control/launch/rsp.launch.py +++ b/my_dual_robot_cell/my_dual_robot_cell_control/launch/rsp.launch.py @@ -1,58 +1,32 @@ -# Copyright (c) 2024 FZI Forschungszentrum Informatik -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# * Neither the name of the {copyright_holder} nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. - -# -# Author: Felix Exner - from launch import LaunchDescription from launch.actions import DeclareLaunchArgument -from launch.substitutions import ( - Command, - FindExecutable, - LaunchConfiguration, - PathJoinSubstitution, -) +from launch.substitutions import (Command, FindExecutable, LaunchConfiguration, + PathJoinSubstitution) from launch_ros.actions import Node from launch_ros.substitutions import FindPackageShare def generate_launch_description(): - ur_type = LaunchConfiguration("ur_type") - robot_ip = LaunchConfiguration("robot_ip") + alice_ur_type = LaunchConfiguration("alice_ur_type") + alice_ur_type = LaunchConfiguration("bob_ur_type") - use_mock_hardware = LaunchConfiguration("use_mock_hardware") - mock_sensor_commands = LaunchConfiguration("mock_sensor_commands") + alice_robot_ip = LaunchConfiguration("alice_robot_ip") + bob_robot_ip = LaunchConfiguration("bob_robot_ip") + + alice_use_mock_hardware = LaunchConfiguration("alice_use_mock_hardware") + alice_mock_sensor_commands = LaunchConfiguration("alice_mock_sensor_commands") + bob_use_mock_hardware = LaunchConfiguration("bob_use_mock_hardware") + bob_mock_sensor_commands = LaunchConfiguration("bob_mock_sensor_commands") headless_mode = LaunchConfiguration("headless_mode") - kinematics_parameters_file = LaunchConfiguration("kinematics_parameters_file") + alice_kinematics_parameters_file = LaunchConfiguration( + "alice_kinematics_parameters_file" + ) + bob_kinematics_parameters_file = LaunchConfiguration( + "bob_kinematics_parameters_file" + ) - # Load description with necessary parameters robot_description_content = Command( [ PathJoinSubstitution([FindExecutable(name="xacro")]), @@ -64,16 +38,66 @@ def generate_launch_description(): "my_dual_robot_cell_controlled.urdf.xacro", ] ), + " ", + "alice_robot_ip:=", + alice_robot_ip, + " ", + "bob_robot_ip:=", + bob_robot_ip, + " ", + "alice_ur_type:=", + ur_type, + " ", + "bob_ur_type:=", + ur_type, + " ", + "alice_use_mock_hardware:=", + alice_use_mock_hardware, + " ", + "bob_use_mock_hardware:=", + bob_use_mock_hardware, + " ", + "alice_kinematics_parameters_file:=", + alice_kinematics_parameters_file, + " ", + "bob_kinematics_parameters_file:=", + bob_kinematics_parameters_file, + " ", + "alice_mock_sensor_commands:=", + alice_mock_sensor_commands, + " ", + "bob_mock_sensor_commands:=", + bob_mock_sensor_commands, + " ", + "headless_mode:=", + headless_mode, ] ) robot_description = {"robot_description": robot_description_content} declared_arguments = [] - # UR specific arguments declared_arguments.append( DeclareLaunchArgument( - "ur_type", - description="Typo/series of used UR robot.", + "alice_ur_type", + description="Type/series of used UR robot.", + choices=[ + "ur3", + "ur3e", + "ur5", + "ur5e", + "ur10", + "ur10e", + "ur16e", + "ur20", + "ur30", + ], + default_value="ur3", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "bob_ur_type", + description="Type/series of used UR robot.", choices=[ "ur3", "ur3e", @@ -90,17 +114,39 @@ def generate_launch_description(): ) declared_arguments.append( DeclareLaunchArgument( - "robot_ip", description="IP address by which the robot can be reached." + "alice_robot_ip", + default_value="192.168.0.101", + description="IP address by which the robot can be reached.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "bob_robot_ip", + default_value="192.168.0.100", + description="IP address by which the robot can be reached.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "alice_kinematics_parameters_file", + default_value=PathJoinSubstitution( + [ + FindPackageShare("my_dual_robot_cell_control"), + "config", + "alice_calibration.yaml", + ] + ), + description="The calibration configuration of the actual robot used.", ) ) declared_arguments.append( DeclareLaunchArgument( - "kinematics_parameters_file", + "bob_kinematics_parameters_file", default_value=PathJoinSubstitution( [ FindPackageShare("my_dual_robot_cell_control"), "config", - "my_robot_calibration.yaml", + "bob_calibration.yaml", ] ), description="The calibration configuration of the actual robot used.", @@ -108,14 +154,29 @@ def generate_launch_description(): ) declared_arguments.append( DeclareLaunchArgument( - "use_mock_hardware", + "alice_use_mock_hardware", + default_value="false", + description="Start robot with mock hardware mirroring command to its states.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "bob_use_mock_hardware", default_value="false", description="Start robot with mock hardware mirroring command to its states.", ) ) declared_arguments.append( DeclareLaunchArgument( - "mock_sensor_commands", + "alice_mock_sensor_commands", + default_value="false", + description="Enable mock command interfaces for sensors used for simple simulations. " + "Used only if 'use_mock_hardware' parameter is true.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "bob_mock_sensor_commands", default_value="false", description="Enable mock command interfaces for sensors used for simple simulations. " "Used only if 'use_mock_hardware' parameter is true.", diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/launch/start_robots.launch.py b/my_dual_robot_cell/my_dual_robot_cell_control/launch/start_robots.launch.py new file mode 100644 index 0000000..eaaa058 --- /dev/null +++ b/my_dual_robot_cell/my_dual_robot_cell_control/launch/start_robots.launch.py @@ -0,0 +1,460 @@ +from launch import LaunchDescription +from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription +from launch.conditions import IfCondition, UnlessCondition +from launch.launch_description_sources import AnyLaunchDescriptionSource +from launch.substitutions import LaunchConfiguration, PathJoinSubstitution +from launch_ros.actions import Node +from launch_ros.parameter_descriptions import ParameterFile +from launch_ros.substitutions import FindPackageShare + + +def launch_setup(): + # Initialize Arguments + alice_ur_type = LaunchConfiguration("alice_ur_type") + alice_ur_type = LaunchConfiguration("bob_ur_type") + + alice_robot_ip = LaunchConfiguration("alice_robot_ip") + bob_robot_ip = LaunchConfiguration("bob_robot_ip") + + # General arguments + controllers_file = LaunchConfiguration("controllers_file") + controller_spawner_timeout = LaunchConfiguration("controller_spawner_timeout") + description_launchfile = LaunchConfiguration("description_launchfile") + launch_rviz = LaunchConfiguration("launch_rviz") + rviz_config_file = LaunchConfiguration("rviz_config_file") + headless_mode = LaunchConfiguration("headless_mode") + + # Robot specific arguments + alice_use_mock_hardware = LaunchConfiguration("alice_use_mock_hardware") + alice_mock_sensor_commands = LaunchConfiguration("alice_mock_sensor_commands") + alice_initial_joint_controller = LaunchConfiguration("alice_initial_joint_controller") + alice_activate_joint_controller = LaunchConfiguration("alice_activate_joint_controller") + alice_launch_dashboard_client = LaunchConfiguration("alice_launch_dashboard_client") + + bob_use_mock_hardware = LaunchConfiguration("bob_use_mock_hardware") + bob_mock_sensor_commands = LaunchConfiguration("bob_mock_sensor_commands") + bob_initial_joint_controller = LaunchConfiguration("bob_initial_joint_controller") + bob_activate_joint_controller = LaunchConfiguration("bob_activate_joint_controller") + bob_launch_dashboard_client = LaunchConfiguration("bob_launch_dashboard_client") + + # Single controller manager comprising of controllers for both arms + control_node = Node( + package="controller_manager", + executable="ros2_control_node", + parameters=[ + LaunchConfiguration("update_rate_config_file"), + ParameterFile(controllers_file, allow_substs=True), + # We use the tf_prefix as substitution in there, so that's why we keep it as an + # argument for this launchfile + ], + output="screen", + ) + + alice_dashboard_client_node = Node( + package="ur_robot_driver", + condition=IfCondition(alice_launch_dashboard_client) and UnlessCondition(alice_use_mock_hardware), + executable="dashboard_client", + name="dashboard_client", + namespace="alice", + output="screen", + emulate_tty=True, + parameters=[{"robot_ip": alice_robot_ip}], + ) + + bob_dashboard_client_node = Node( + package="ur_robot_driver", + condition=IfCondition(bob_launch_dashboard_client) and UnlessCondition(bob_use_mock_hardware), + executable="dashboard_client", + name="dashboard_client", + namespace="bob", + output="screen", + emulate_tty=True, + parameters=[{"robot_ip": bob_robot_ip}], + ) + + alice_urscript_interface = Node( + package="ur_robot_driver", + executable="urscript_interface", + namespace="alice", + parameters=[{"robot_ip": alice_robot_ip}], + output="screen", + condition=UnlessCondition(alice_use_mock_hardware), + ) + + bob_urscript_interface = Node( + package="ur_robot_driver", + executable="urscript_interface", + namespace="bob", + parameters=[{"robot_ip": bob_robot_ip}], + output="screen", + condition=UnlessCondition(bob_use_mock_hardware), + ) + + alice_controller_stopper_node = Node( + package="ur_robot_driver", + executable="controller_stopper_node", + namespace="alice", + name="controller_stopper", + output="screen", + emulate_tty=True, + condition=UnlessCondition(alice_use_mock_hardware), + parameters=[ + {"headless_mode": headless_mode}, + {"joint_controller_active": alice_activate_joint_controller}, + { + "consistent_controllers": [ + "alice_io_and_status_controller", + "alice_force_torque_sensor_broadcaster", + "alice_joint_state_broadcaster", + "alice_speed_scaling_state_broadcaster", + ] + }, + ], + ) + + bob_controller_stopper_node = Node( + package="ur_robot_driver", + executable="controller_stopper_node", + namespace="bob", + name="controller_stopper", + output="screen", + emulate_tty=True, + condition=UnlessCondition(bob_use_mock_hardware), + parameters=[ + {"headless_mode": headless_mode}, + {"joint_controller_active": bob_activate_joint_controller}, + { + "consistent_controllers": [ + "bob_io_and_status_controller", + "bob_force_torque_sensor_broadcaster", + "bob_joint_state_broadcaster", + "bob_speed_scaling_state_broadcaster", + ] + }, + ], + ) + + rviz_node = Node( + package="rviz2", + condition=IfCondition(launch_rviz), + executable="rviz2", + name="rviz2", + output="log", + arguments=["-d", rviz_config_file], + ) + + # Spawn controllers + def controller_spawner(controllers, active=True): + inactive_flags = ["--inactive"] if not active else [] + return Node( + package="controller_manager", + executable="spawner", + arguments=[ + "--controller-manager", + "/controller_manager", + "--controller-manager-timeout", + controller_spawner_timeout, + ] + + inactive_flags + + controllers, + ) + + controllers_active = [ + "alice_joint_state_broadcaster", + "bob_joint_state_broadcaster", + "alice_io_and_status_controller", + "bob_io_and_status_controller", + "alice_speed_scaling_state_broadcaster", + "bob_speed_scaling_state_broadcaster", + "alice_force_torque_sensor_broadcaster", + "bob_force_torque_sensor_broadcaster", + ] + controllers_inactive = [ + "alice_forward_position_controller", + "bob_forward_position_controller", + ] + + controller_spawners = [controller_spawner(controllers_active)] + [ + controller_spawner(controllers_inactive, active=False) + ] + + # There may be other controllers of the joints, but this is the initially-started one + alice_initial_joint_controller_spawner_started = Node( + package="controller_manager", + executable="spawner", + arguments=[ + alice_initial_joint_controller, + "-c", + "/controller_manager", + "--controller-manager-timeout", + controller_spawner_timeout, + ], + condition=IfCondition(alice_activate_joint_controller), + ) + bob_initial_joint_controller_spawner_started = Node( + package="controller_manager", + executable="spawner", + arguments=[ + bob_initial_joint_controller, + "-c", + "/controller_manager", + "--controller-manager-timeout", + controller_spawner_timeout, + ], + condition=IfCondition(bob_activate_joint_controller), + ) + alice_initial_joint_controller_spawner_stopped = Node( + package="controller_manager", + executable="spawner", + arguments=[ + alice_initial_joint_controller, + "-c", + "/controller_manager", + "--controller-manager-timeout", + controller_spawner_timeout, + "--inactive", + ], + condition=UnlessCondition(alice_activate_joint_controller), + ) + bob_initial_joint_controller_spawner_stopped = Node( + package="controller_manager", + executable="spawner", + arguments=[ + bob_initial_joint_controller, + "-c", + "/controller_manager", + "--controller-manager-timeout", + controller_spawner_timeout, + "--inactive", + ], + condition=UnlessCondition(bob_activate_joint_controller), + ) + + rsp = IncludeLaunchDescription( + AnyLaunchDescriptionSource(description_launchfile), + launch_arguments={ + "alice_robot_ip": alice_robot_ip, + "bob_robot_ip": bob_robot_ip, + "ur_type": alice_ur_type, + }.items(), + ) + + nodes_to_start = [ + control_node, + alice_dashboard_client_node, + bob_dashboard_client_node, + alice_controller_stopper_node, + bob_controller_stopper_node, + alice_urscript_interface, + bob_urscript_interface, + rsp, + rviz_node, + alice_initial_joint_controller_spawner_stopped, + bob_initial_joint_controller_spawner_stopped, + alice_initial_joint_controller_spawner_started, + bob_initial_joint_controller_spawner_started, + ] + controller_spawners + + return nodes_to_start + + +def generate_launch_description(): + declared_arguments = [] + # UR specific arguments + declared_arguments.append( + DeclareLaunchArgument( + "alice_ur_type", + description="Type/series of used UR robot.", + choices=[ + "ur3", + "ur3e", + "ur5", + "ur5e", + "ur10", + "ur10e", + "ur16e", + "ur20", + "ur30", + ], + default_value="ur3", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "bob_ur_type", + description="Type/series of used UR robot.", + choices=[ + "ur3", + "ur3e", + "ur5", + "ur5e", + "ur10", + "ur10e", + "ur16e", + "ur20", + "ur30", + ], + default_value="ur3", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "alice_robot_ip", + default_value="192.168.0.101", + description="IP address by which the robot can be reached.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "bob_robot_ip", + default_value="192.168.0.100", + description="IP address by which the robot can be reached.", + ) + ) + + # General arguments + declared_arguments.append( + DeclareLaunchArgument( + "controllers_file", + default_value=PathJoinSubstitution( + [ + FindPackageShare("my_dual_robot_cell_control"), + "config", + "combined_controllers.yaml", + ] + ), + description="YAML file with the controllers configuration.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "description_launchfile", + default_value=PathJoinSubstitution( + [ + FindPackageShare("my_dual_robot_cell_control"), + "launch", + "rsp.launch.py", + ] + ), + description="Launchfile (absolute path) providing the description. " + "The launchfile has to start a robot_state_publisher node that " + "publishes the description topic.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "alice_use_mock_hardware", + default_value="false", + description="Start robot with mock hardware mirroring command to its states.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "bob_use_mock_hardware", + default_value="false", + description="Start robot with mock hardware mirroring command to its states.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "alice_mock_sensor_commands", + default_value="false", + description="Enable mock command interfaces for sensors used for simple simulations. " + "Used only if 'use_mock_hardware' parameter is true.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "bob_mock_sensor_commands", + default_value="false", + description="Enable mock command interfaces for sensors used for simple simulations. " + "Used only if 'use_mock_hardware' parameter is true.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "headless_mode", + default_value="false", + description="Enable headless mode for robot control for both arms.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "controller_spawner_timeout", + default_value="10", + description="Timeout used when spawning controllers.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "alice_initial_joint_controller", + default_value="alice_scaled_joint_trajectory_controller", + description="Initially loaded robot controller for the alice robot arm.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "bob_initial_joint_controller", + default_value="bob_scaled_joint_trajectory_controller", + description="Initially loaded robot controller for the bob robot arm.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "alice_activate_joint_controller", + default_value="true", + description="Activate loaded joint controller for the alice robot arm.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "bob_activate_joint_controller", + default_value="true", + description="Activate loaded joint controller for the bob robot arm.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "launch_rviz", default_value="true", description="Launch RViz?" + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "rviz_config_file", + default_value=PathJoinSubstitution( + [FindPackageShare("my_dual_robot_cell_description"), "rviz", "urdf.rviz"] + ), + description="RViz config file (absolute path) to use when launching rviz.", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "alice_launch_dashboard_client", + default_value="true", + description="Launch Dashboard Client?", + ) + ) + declared_arguments.append( + DeclareLaunchArgument( + "bob_launch_dashboard_client", + default_value="true", + description="Launch Dashboard Client?", + ) + ) + + declared_arguments.append( + DeclareLaunchArgument( + name="update_rate_config_file", + default_value=[ + PathJoinSubstitution( + [ + FindPackageShare("my_dual_robot_cell_control"), + "config", + ] + ), + "/", + "update_rate.yaml", + ], + ) + ) + return LaunchDescription(declared_arguments + launch_setup()) diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/launch/ur_control.launch.py b/my_dual_robot_cell/my_dual_robot_cell_control/launch/ur_control.launch.py deleted file mode 100644 index 66b9392..0000000 --- a/my_dual_robot_cell/my_dual_robot_cell_control/launch/ur_control.launch.py +++ /dev/null @@ -1,541 +0,0 @@ -# Copyright (c) 2021 PickNik, Inc. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# * Neither the name of the {copyright_holder} nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. - -# -# Author: Denis Stogl - -from launch import LaunchDescription -from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription -from launch.conditions import IfCondition, UnlessCondition -from launch.launch_description_sources import AnyLaunchDescriptionSource -from launch.substitutions import LaunchConfiguration, PathJoinSubstitution -from launch_ros.actions import Node -from launch_ros.parameter_descriptions import ParameterFile -from launch_ros.substitutions import FindPackageShare - - -def launch_setup(): - # Initialize Arguments - ur_type = LaunchConfiguration("ur_type") - robot_ip = LaunchConfiguration("robot_ip") - # General arguments - controllers_file = LaunchConfiguration("controllers_file") - description_launchfile = LaunchConfiguration("description_launchfile") - use_mock_hardware = LaunchConfiguration("use_mock_hardware") - controller_spawner_timeout = LaunchConfiguration("controller_spawner_timeout") - alice_initial_joint_controller = LaunchConfiguration( - "alice_initial_joint_controller" - ) - bob_initial_joint_controller = LaunchConfiguration("bob_initial_joint_controller") - activate_joint_controller = LaunchConfiguration("activate_joint_controller") - launch_rviz = LaunchConfiguration("launch_rviz") - rviz_config_file = LaunchConfiguration("rviz_config_file") - headless_mode = LaunchConfiguration("headless_mode") - launch_dashboard_client = LaunchConfiguration("launch_dashboard_client") - use_tool_communication = LaunchConfiguration("use_tool_communication") - tool_device_name = LaunchConfiguration("tool_device_name") - tool_tcp_port = LaunchConfiguration("tool_tcp_port") - - control_node = Node( - package="controller_manager", - executable="ros2_control_node", - parameters=[ - LaunchConfiguration("update_rate_config_file"), - ParameterFile(controllers_file, allow_substs=True), - # We use the tf_prefix as substitution in there, so that's why we keep it as an - # argument for this launchfile - ], - output="screen", - ) - - # dashboard_client_node = Node( - # package="ur_robot_driver", - # condition=IfCondition(launch_dashboard_client) - # and UnlessCondition(use_mock_hardware), - # executable="dashboard_client", - # name="dashboard_client", - # namespace="alice", - # output="screen", - # emulate_tty=True, - # parameters=[{"robot_ip": robot_ip}], - # ) - - # dashboard_client_node = Node( - # package="ur_robot_driver", - # condition=IfCondition(launch_dashboard_client) - # and UnlessCondition(use_mock_hardware), - # executable="dashboard_client", - # name="dashboard_client", - # namespace="bob", - # output="screen", - # emulate_tty=True, - # parameters=[{"robot_ip": robot_ip}], - # ) - - # tool_communication_node = Node( - # package="ur_robot_driver", - # condition=IfCondition(use_tool_communication), - # executable="tool_communication.py", - # name="ur_tool_comm", - # output="screen", - # parameters=[ - # { - # "robot_ip": robot_ip, - # "tcp_port": tool_tcp_port, - # "device_name": tool_device_name, - # } - # ], - # ) - - # urscript_interface = Node( - # package="ur_robot_driver", - # executable="urscript_interface", - # parameters=[{"robot_ip": robot_ip}], - # output="screen", - # condition=UnlessCondition(use_mock_hardware), - # ) - - # controller_stopper_node = Node( - # package="ur_robot_driver", - # executable="controller_stopper_node", - # name="controller_stopper", - # output="screen", - # emulate_tty=True, - # condition=UnlessCondition(use_mock_hardware), - # parameters=[ - # {"headless_mode": headless_mode}, - # {"joint_controller_active": activate_joint_controller}, - # { - # "consistent_controllers": [ - # "io_and_status_controller", - # "force_torque_sensor_broadcaster", - # "joint_state_broadcaster", - # "speed_scaling_state_broadcaster", - # ] - # }, - # ], - # ) - - rviz_node = Node( - package="rviz2", - condition=IfCondition(launch_rviz), - executable="rviz2", - name="rviz2", - output="log", - arguments=["-d", rviz_config_file], - ) - - # Spawn controllers - def controller_spawner(controllers, active=True): - inactive_flags = ["--inactive"] if not active else [] - return Node( - package="controller_manager", - executable="spawner", - arguments=[ - "--controller-manager", - "/controller_manager", - "--controller-manager-timeout", - controller_spawner_timeout, - ] - + inactive_flags - + controllers, - ) - - controllers_active = [ - "alice_joint_state_broadcaster", - "bob_joint_state_broadcaster", - # "alice_io_and_status_controller", - # "bob_io_and_status_controller", - "alice_speed_scaling_state_broadcaster", - "bob_speed_scaling_state_broadcaster", - "alice_force_torque_sensor_broadcaster", - "bob_force_torque_sensor_broadcaster", - ] - controllers_inactive = [ - "alice_forward_position_controller", - "bob_forward_position_controller", - ] - - controller_spawners = [controller_spawner(controllers_active)] + [ - controller_spawner(controllers_inactive, active=False) - ] - - # There may be other controllers of the joints, but this is the initially-started one - alice_initial_joint_controller_spawner_started = Node( - package="controller_manager", - executable="spawner", - arguments=[ - alice_initial_joint_controller, - "-c", - "/controller_manager", - "--controller-manager-timeout", - controller_spawner_timeout, - ], - condition=IfCondition(activate_joint_controller), - ) - bob_initial_joint_controller_spawner_started = Node( - package="controller_manager", - executable="spawner", - arguments=[ - bob_initial_joint_controller, - "-c", - "/controller_manager", - "--controller-manager-timeout", - controller_spawner_timeout, - ], - condition=IfCondition(activate_joint_controller), - ) - alice_initial_joint_controller_spawner_stopped = Node( - package="controller_manager", - executable="spawner", - arguments=[ - alice_initial_joint_controller, - "-c", - "/controller_manager", - "--controller-manager-timeout", - controller_spawner_timeout, - "--inactive", - ], - condition=UnlessCondition(activate_joint_controller), - ) - bob_initial_joint_controller_spawner_stopped = Node( - package="controller_manager", - executable="spawner", - arguments=[ - bob_initial_joint_controller, - "-c", - "/controller_manager", - "--controller-manager-timeout", - controller_spawner_timeout, - "--inactive", - ], - condition=UnlessCondition(activate_joint_controller), - ) - - rsp = IncludeLaunchDescription( - AnyLaunchDescriptionSource(description_launchfile), - launch_arguments={ - "robot_ip": robot_ip, - "ur_type": ur_type, - }.items(), - ) - - nodes_to_start = [ - control_node, - # dashboard_client_node, - # tool_communication_node, - # controller_stopper_node, - # urscript_interface, - rsp, - rviz_node, - alice_initial_joint_controller_spawner_stopped, - bob_initial_joint_controller_spawner_stopped, - alice_initial_joint_controller_spawner_started, - bob_initial_joint_controller_spawner_started, - ] + controller_spawners - - return nodes_to_start - - -def generate_launch_description(): - declared_arguments = [] - # UR specific arguments - declared_arguments.append( - DeclareLaunchArgument( - "ur_type", - description="Type/series of used UR robot.", - choices=[ - "ur3", - "ur3e", - "ur5", - "ur5e", - "ur10", - "ur10e", - "ur16e", - "ur20", - "ur30", - ], - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "robot_ip", description="IP address by which the robot can be reached." - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "safety_limits", - default_value="true", - description="Enables the safety limits controller if true.", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "safety_pos_margin", - default_value="0.15", - description="The margin to lower and upper limits in the safety controller.", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "safety_k_position", - default_value="20", - description="k-position factor in the safety controller.", - ) - ) - # General arguments - declared_arguments.append( - DeclareLaunchArgument( - "controllers_file", - default_value=PathJoinSubstitution( - [ - FindPackageShare("my_dual_robot_cell_control"), - "config", - "ros2_controllers.yaml", - ] - ), - description="YAML file with the controllers configuration.", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "description_launchfile", - default_value=PathJoinSubstitution( - [ - FindPackageShare("my_dual_robot_cell_control"), - "launch", - "rsp.launch.py", - ] - ), - description="Launchfile (absolute path) providing the description. " - "The launchfile has to start a robot_state_publisher node that " - "publishes the description topic.", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "tf_prefix", - default_value="", - description="tf_prefix of the joint names, useful for " - "multi-robot setup. If changed, also joint names in the controllers' configuration " - "have to be updated.", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "use_mock_hardware", - default_value="false", - description="Start robot with mock hardware mirroring command to its states.", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "mock_sensor_commands", - default_value="false", - description="Enable mock command interfaces for sensors used for simple simulations. " - "Used only if 'use_mock_hardware' parameter is true.", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "headless_mode", - default_value="false", - description="Enable headless mode for robot control", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "controller_spawner_timeout", - default_value="10", - description="Timeout used when spawning controllers.", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "alice_initial_joint_controller", - default_value="alice_scaled_joint_trajectory_controller", - description="Initially loaded robot controller.", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "bob_initial_joint_controller", - default_value="bob_scaled_joint_trajectory_controller", - description="Initially loaded robot controller.", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "activate_joint_controller", - default_value="true", - description="Activate loaded joint controller.", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "launch_rviz", default_value="true", description="Launch RViz?" - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "rviz_config_file", - default_value=PathJoinSubstitution( - [FindPackageShare("ur_description"), "rviz", "view_robot.rviz"] - ), - description="RViz config file (absolute path) to use when launching rviz.", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "launch_dashboard_client", - default_value="true", - description="Launch Dashboard Client?", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "use_tool_communication", - default_value="false", - description="Only available for e series!", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "tool_parity", - default_value="0", - description="Parity configuration for serial communication. Only effective, if " - "use_tool_communication is set to True.", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "tool_baud_rate", - default_value="115200", - description="Baud rate configuration for serial communication. Only effective, if " - "use_tool_communication is set to True.", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "tool_stop_bits", - default_value="1", - description="Stop bits configuration for serial communication. Only effective, if " - "use_tool_communication is set to True.", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "tool_rx_idle_chars", - default_value="1.5", - description="RX idle chars configuration for serial communication. Only effective, " - "if use_tool_communication is set to True.", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "tool_tx_idle_chars", - default_value="3.5", - description="TX idle chars configuration for serial communication. Only effective, " - "if use_tool_communication is set to True.", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "tool_device_name", - default_value="/tmp/ttyUR", - description="File descriptor that will be generated for the tool communication device. " - "The user has be be allowed to write to this location. " - "Only effective, if use_tool_communication is set to True.", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "tool_tcp_port", - default_value="54321", - description="Remote port that will be used for bridging the tool's serial device. " - "Only effective, if use_tool_communication is set to True.", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "tool_voltage", - default_value="0", # 0 being a conservative value that won't destroy anything - description="Tool voltage that will be setup.", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "reverse_ip", - default_value="0.0.0.0", - description="IP that will be used for the robot controller to communicate back to the driver.", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "script_command_port", - default_value="50004", - description="Port that will be opened to forward URScript commands to the robot.", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "reverse_port", - default_value="50001", - description="Port that will be opened to send cyclic instructions from the driver to the robot controller.", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "script_sender_port", - default_value="50002", - description="The driver will offer an interface to query the external_control URScript on this port.", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - "trajectory_port", - default_value="50003", - description="Port that will be opened for trajectory control.", - ) - ) - declared_arguments.append( - DeclareLaunchArgument( - name="update_rate_config_file", - default_value=[ - PathJoinSubstitution( - [ - FindPackageShare("my_dual_robot_cell_control"), - "config", - ] - ), - "/", - "update_rate.yaml", - ], - ) - ) - return LaunchDescription(declared_arguments + launch_setup()) diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/urdf/my_dual_robot_cell_controlled.urdf.xacro b/my_dual_robot_cell/my_dual_robot_cell_control/urdf/my_dual_robot_cell_controlled.urdf.xacro index ef52a3b..2e33efc 100644 --- a/my_dual_robot_cell/my_dual_robot_cell_control/urdf/my_dual_robot_cell_controlled.urdf.xacro +++ b/my_dual_robot_cell/my_dual_robot_cell_control/urdf/my_dual_robot_cell_controlled.urdf.xacro @@ -2,65 +2,64 @@ - + - + - - - - - + + + + + - - - - - + + + + + - - - - - - + + + + + + + - - - - - + + + + + + + - - - - - + + + + - - + > + - - - - + \ No newline at end of file From 1695e559f0314528739f191d9e4f34db57ac2096 Mon Sep 17 00:00:00 2001 From: Vihaan Shah Date: Wed, 3 Jul 2024 15:22:13 -0400 Subject: [PATCH 12/14] Fix ur_type and mock_sensor_commands arguments --- .../my_dual_robot_cell_control/launch/rsp.launch.py | 6 +++--- .../launch/start_robots.launch.py | 5 +++-- .../urdf/my_dual_robot_cell_controlled.urdf.xacro | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/launch/rsp.launch.py b/my_dual_robot_cell/my_dual_robot_cell_control/launch/rsp.launch.py index d4f5436..b02e58f 100644 --- a/my_dual_robot_cell/my_dual_robot_cell_control/launch/rsp.launch.py +++ b/my_dual_robot_cell/my_dual_robot_cell_control/launch/rsp.launch.py @@ -8,7 +8,7 @@ def generate_launch_description(): alice_ur_type = LaunchConfiguration("alice_ur_type") - alice_ur_type = LaunchConfiguration("bob_ur_type") + bob_ur_type = LaunchConfiguration("bob_ur_type") alice_robot_ip = LaunchConfiguration("alice_robot_ip") bob_robot_ip = LaunchConfiguration("bob_robot_ip") @@ -46,10 +46,10 @@ def generate_launch_description(): bob_robot_ip, " ", "alice_ur_type:=", - ur_type, + alice_ur_type, " ", "bob_ur_type:=", - ur_type, + bob_ur_type, " ", "alice_use_mock_hardware:=", alice_use_mock_hardware, diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/launch/start_robots.launch.py b/my_dual_robot_cell/my_dual_robot_cell_control/launch/start_robots.launch.py index eaaa058..0682a55 100644 --- a/my_dual_robot_cell/my_dual_robot_cell_control/launch/start_robots.launch.py +++ b/my_dual_robot_cell/my_dual_robot_cell_control/launch/start_robots.launch.py @@ -11,7 +11,7 @@ def launch_setup(): # Initialize Arguments alice_ur_type = LaunchConfiguration("alice_ur_type") - alice_ur_type = LaunchConfiguration("bob_ur_type") + bob_ur_type = LaunchConfiguration("bob_ur_type") alice_robot_ip = LaunchConfiguration("alice_robot_ip") bob_robot_ip = LaunchConfiguration("bob_robot_ip") @@ -235,7 +235,8 @@ def controller_spawner(controllers, active=True): launch_arguments={ "alice_robot_ip": alice_robot_ip, "bob_robot_ip": bob_robot_ip, - "ur_type": alice_ur_type, + "alice_ur_type": alice_ur_type, + "bob_ur_type": bob_ur_type, }.items(), ) diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/urdf/my_dual_robot_cell_controlled.urdf.xacro b/my_dual_robot_cell/my_dual_robot_cell_control/urdf/my_dual_robot_cell_controlled.urdf.xacro index 2e33efc..8a67c77 100644 --- a/my_dual_robot_cell/my_dual_robot_cell_control/urdf/my_dual_robot_cell_controlled.urdf.xacro +++ b/my_dual_robot_cell/my_dual_robot_cell_control/urdf/my_dual_robot_cell_controlled.urdf.xacro @@ -69,7 +69,7 @@ output_recipe_filename="$(arg ur_output_recipe_filename)" input_recipe_filename="$(arg ur_input_recipe_filename)" use_mock_hardware="$(arg alice_use_mock_hardware)" - alice_mock_sensor_commands="$(arg alice_mock_sensor_commands)" + mock_sensor_commands="$(arg alice_mock_sensor_commands)" headless_mode="$(arg headless_mode)" reverse_port="$(arg alice_reverse_port)" script_sender_port="$(arg alice_script_sender_port)" @@ -86,7 +86,7 @@ output_recipe_filename="$(arg ur_output_recipe_filename)" input_recipe_filename="$(arg ur_input_recipe_filename)" use_mock_hardware="$(arg bob_use_mock_hardware)" - bob_mock_sensor_commands="$(arg bob_mock_sensor_commands)" + mock_sensor_commands="$(arg bob_mock_sensor_commands)" headless_mode="$(arg headless_mode)" reverse_port="$(arg bob_reverse_port)" script_sender_port="$(arg bob_script_sender_port)" From 55cbee385535b5115e8548479b60f6ffd06f8407 Mon Sep 17 00:00:00 2001 From: Vihaan Shah Date: Wed, 3 Jul 2024 15:22:56 -0400 Subject: [PATCH 13/14] Update rviz config for description launch --- .../rviz/urdf.rviz | 215 +++++++++++++----- 1 file changed, 158 insertions(+), 57 deletions(-) diff --git a/my_dual_robot_cell/my_dual_robot_cell_description/rviz/urdf.rviz b/my_dual_robot_cell/my_dual_robot_cell_description/rviz/urdf.rviz index e6b74d0..360c746 100644 --- a/my_dual_robot_cell/my_dual_robot_cell_description/rviz/urdf.rviz +++ b/my_dual_robot_cell/my_dual_robot_cell_description/rviz/urdf.rviz @@ -8,7 +8,7 @@ Panels: - /TF1 - /TF1/Tree1 Splitter Ratio: 0.5 - Tree Height: 637 + Tree Height: 398 - Class: rviz_common/Views Expanded: - /Current View1 @@ -53,71 +53,130 @@ Visualization Manager: Expand Link Details: false Expand Tree: false Link Tree Style: Links in Alphabetic Order - monitor: + alice_base: + Alpha: 1 + Show Axes: false + Show Trail: false + alice_base_link: + Alpha: 1 + Show Axes: false + Show Trail: false + alice_base_link_inertia: Alpha: 1 Show Axes: false Show Trail: false Value: true - robot_mount: + alice_flange: Alpha: 1 Show Axes: false Show Trail: false - table: + alice_forearm_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + alice_ft_frame: + Alpha: 1 + Show Axes: false + Show Trail: false + alice_robot_mount: + Alpha: 1 + Show Axes: false + Show Trail: false + alice_shoulder_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + alice_tool0: + Alpha: 1 + Show Axes: false + Show Trail: false + alice_upper_arm_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + alice_wrist_1_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + alice_wrist_2_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + alice_wrist_3_link: Alpha: 1 Show Axes: false Show Trail: false Value: true - ur20_base: + bob_base: Alpha: 1 Show Axes: false Show Trail: false - ur20_base_link: + bob_base_link: Alpha: 1 Show Axes: false Show Trail: false - ur20_base_link_inertia: + bob_base_link_inertia: Alpha: 1 Show Axes: false Show Trail: false Value: true - ur20_flange: + bob_flange: Alpha: 1 Show Axes: false Show Trail: false - ur20_forearm_link: + bob_forearm_link: Alpha: 1 Show Axes: false Show Trail: false Value: true - ur20_ft_frame: + bob_ft_frame: Alpha: 1 Show Axes: false Show Trail: false - ur20_shoulder_link: + bob_robot_mount: + Alpha: 1 + Show Axes: false + Show Trail: false + bob_shoulder_link: Alpha: 1 Show Axes: false Show Trail: false Value: true - ur20_tool0: + bob_tool0: + Alpha: 1 + Show Axes: false + Show Trail: false + bob_upper_arm_link: Alpha: 1 Show Axes: false Show Trail: false - ur20_upper_arm_link: + Value: true + bob_wrist_1_link: Alpha: 1 Show Axes: false Show Trail: false Value: true - ur20_wrist_1_link: + bob_wrist_2_link: Alpha: 1 Show Axes: false Show Trail: false Value: true - ur20_wrist_2_link: + bob_wrist_3_link: Alpha: 1 Show Axes: false Show Trail: false Value: true - ur20_wrist_3_link: + monitor: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + table: Alpha: 1 Show Axes: false Show Trail: false @@ -144,35 +203,61 @@ Visualization Manager: Frame Timeout: 15 Frames: All Enabled: true - monitor: + alice_base: Value: true - robot_mount: + alice_base_link: Value: true - table: + alice_base_link_inertia: + Value: true + alice_flange: + Value: true + alice_forearm_link: + Value: true + alice_ft_frame: + Value: true + alice_robot_mount: Value: true - ur20_base: + alice_shoulder_link: Value: true - ur20_base_link: + alice_tool0: Value: true - ur20_base_link_inertia: + alice_upper_arm_link: Value: true - ur20_flange: + alice_wrist_1_link: Value: true - ur20_forearm_link: + alice_wrist_2_link: Value: true - ur20_ft_frame: + alice_wrist_3_link: Value: true - ur20_shoulder_link: + bob_base: Value: true - ur20_tool0: + bob_base_link: Value: true - ur20_upper_arm_link: + bob_base_link_inertia: Value: true - ur20_wrist_1_link: + bob_flange: Value: true - ur20_wrist_2_link: + bob_forearm_link: Value: true - ur20_wrist_3_link: + bob_ft_frame: + Value: true + bob_robot_mount: + Value: true + bob_shoulder_link: + Value: true + bob_tool0: + Value: true + bob_upper_arm_link: + Value: true + bob_wrist_1_link: + Value: true + bob_wrist_2_link: + Value: true + bob_wrist_3_link: + Value: true + monitor: + Value: true + table: Value: true wall: Value: true @@ -186,24 +271,40 @@ Visualization Manager: Tree: world: table: - monitor: - {} - robot_mount: - ur20_base_link: - ur20_base: + alice_robot_mount: + alice_base_link: + alice_base: {} - ur20_base_link_inertia: - ur20_shoulder_link: - ur20_upper_arm_link: - ur20_forearm_link: - ur20_wrist_1_link: - ur20_wrist_2_link: - ur20_wrist_3_link: - ur20_flange: - ur20_tool0: + alice_base_link_inertia: + alice_shoulder_link: + alice_upper_arm_link: + alice_forearm_link: + alice_wrist_1_link: + alice_wrist_2_link: + alice_wrist_3_link: + alice_flange: + alice_tool0: {} - ur20_ft_frame: + alice_ft_frame: {} + bob_robot_mount: + bob_base_link: + bob_base: + {} + bob_base_link_inertia: + bob_shoulder_link: + bob_upper_arm_link: + bob_forearm_link: + bob_wrist_1_link: + bob_wrist_2_link: + bob_wrist_3_link: + bob_flange: + bob_tool0: + {} + bob_ft_frame: + {} + monitor: + {} wall: {} Update Interval: 0 @@ -223,35 +324,35 @@ Visualization Manager: Views: Current: Class: rviz_default_plugins/Orbit - Distance: 4.839867115020752 + Distance: 4.675174713134766 Enable Stereo Rendering: Stereo Eye Separation: 0.05999999865889549 Stereo Focal Distance: 1 Swap Stereo Eyes: false Value: false Focal Point: - X: 0.8393054604530334 - Y: 0.6853293776512146 - Z: 1.452785611152649 + X: 0.9431386590003967 + Y: 0.6480544209480286 + Z: 1.3101682662963867 Focal Shape Fixed Size: true Focal Shape Size: 0.05000000074505806 Invert Z Axis: false Name: Current View Near Clip Distance: 0.009999999776482582 - Pitch: 0.16000038385391235 + Pitch: 0.49500054121017456 Target Frame: Value: Orbit (rviz) - Yaw: 4.324998378753662 + Yaw: 4.259994983673096 Saved: ~ Window Geometry: Displays: collapsed: false - Height: 1412 + Height: 1016 Hide Left Dock: false Hide Right Dock: false - QMainWindow State: 000000ff00000000fd0000000100000000000001ad0000052efc0200000002fb000000100044006900730070006c006100790073010000003b0000030f000000c700fffffffb0000000a00560069006500770073010000035000000219000000a000ffffff0000084d0000052e00000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 + QMainWindow State: 000000ff00000000fd0000000100000000000001ad0000039efc0200000002fb000000100044006900730070006c006100790073010000003d00000222000000c900fffffffb0000000a00560069006500770073010000026500000176000000a400ffffff000005cd0000039e00000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 Views: collapsed: false - Width: 2560 - X: 1920 - Y: 0 + Width: 1920 + X: 0 + Y: 27 From b1a637a597016ef9c2f0838d562002d75da4dcae Mon Sep 17 00:00:00 2001 From: Vihaan Shah Date: Wed, 3 Jul 2024 15:27:49 -0400 Subject: [PATCH 14/14] Use rviz config file for moveit --- .../config/moveit.rviz | 473 +++++++++++++++++- .../launch/dual_ur_moveit.launch.py | 12 +- 2 files changed, 460 insertions(+), 25 deletions(-) diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/moveit.rviz b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/moveit.rviz index f31651e..2cbcdc6 100644 --- a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/moveit.rviz +++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/moveit.rviz @@ -1,51 +1,484 @@ Panels: - Class: rviz_common/Displays + Help Height: 87 Name: Displays Property Tree Widget: - Expanded: - - /MotionPlanning1 - - Class: rviz_common/Help - Name: Help + Expanded: ~ + Splitter Ratio: 0.4957627058029175 + Tree Height: 380 + - Class: rviz_common/Selection + Name: Selection + - Class: rviz_common/Tool Properties + Expanded: + - /2D Goal Pose1 + - /Publish Point1 + Name: Tool Properties + Splitter Ratio: 0.5886790156364441 - Class: rviz_common/Views + Expanded: + - /Current View1 Name: Views + Splitter Ratio: 0.5 Visualization Manager: + Class: "" Displays: - - Class: rviz_default_plugins/Grid + - Alpha: 0.5 + Cell Size: 1 + Class: rviz_default_plugins/Grid + Color: 160; 160; 164 + Enabled: true + Line Style: + Line Width: 0.029999999329447746 + Value: Lines Name: Grid + Normal Cell Count: 0 + Offset: + X: 0 + Y: 0 + Z: 0 + Plane: XY + Plane Cell Count: 10 + Reference Frame: Value: true - - Class: moveit_rviz_plugin/MotionPlanning + - Acceleration_Scaling_Factor: 0.1 + Class: moveit_rviz_plugin/MotionPlanning + Enabled: true + Move Group Namespace: "" + MoveIt_Allow_Approximate_IK: false + MoveIt_Allow_External_Program: false + MoveIt_Allow_Replanning: false + MoveIt_Allow_Sensor_Positioning: false + MoveIt_Planning_Attempts: 10 + MoveIt_Planning_Time: 5 + MoveIt_Use_Cartesian_Path: false + MoveIt_Use_Constraint_Aware_IK: false + MoveIt_Workspace: + Center: + X: 0 + Y: 0 + Z: 0 + Size: + X: 2 + Y: 2 + Z: 2 Name: MotionPlanning Planned Path: - Loop Animation: true + Color Enabled: true + Interrupt Display: true + Links: + All Links Enabled: true + Expand Joint Details: false + Expand Link Details: false + Expand Tree: false + Link Tree Style: Links in Alphabetic Order + alice_base: + Alpha: 1 + Show Axes: false + Show Trail: false + alice_base_link: + Alpha: 1 + Show Axes: false + Show Trail: false + alice_base_link_inertia: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + alice_flange: + Alpha: 1 + Show Axes: false + Show Trail: false + alice_forearm_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + alice_ft_frame: + Alpha: 1 + Show Axes: false + Show Trail: false + alice_robot_mount: + Alpha: 1 + Show Axes: false + Show Trail: false + alice_shoulder_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + alice_tool0: + Alpha: 1 + Show Axes: false + Show Trail: false + alice_upper_arm_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + alice_wrist_1_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + alice_wrist_2_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + alice_wrist_3_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + bob_base: + Alpha: 1 + Show Axes: false + Show Trail: false + bob_base_link: + Alpha: 1 + Show Axes: false + Show Trail: false + bob_base_link_inertia: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + bob_flange: + Alpha: 1 + Show Axes: false + Show Trail: false + bob_forearm_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + bob_ft_frame: + Alpha: 1 + Show Axes: false + Show Trail: false + bob_robot_mount: + Alpha: 1 + Show Axes: false + Show Trail: false + bob_shoulder_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + bob_tool0: + Alpha: 1 + Show Axes: false + Show Trail: false + bob_upper_arm_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + bob_wrist_1_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + bob_wrist_2_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + bob_wrist_3_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + monitor: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + table: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + wall: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + world: + Alpha: 1 + Show Axes: false + Show Trail: false + Loop Animation: false + Robot Alpha: 0.5 + Robot Color: 150; 50; 150 + Show Robot Collision: false + Show Robot Visual: true + Show Trail: false State Display Time: 0.05 s - Trajectory Topic: display_planned_path + Trail Step Size: 1 + Trajectory Topic: /display_planned_path + Use Sim Time: false + Planning Metrics: + Payload: 1 + Show Joint Torques: false + Show Manipulability: false + Show Manipulability Index: false + Show Weight Limit: false + TextHeight: 0.07999999821186066 + Planning Request: + Colliding Link Color: 255; 0; 0 + Goal State Alpha: 1 + Goal State Color: 250; 128; 0 + Interactive Marker Size: 0 + Joint Violation Color: 255; 0; 255 + Planning Group: alice_manipulator + Query Goal State: true + Query Start State: false + Show Workspace: false + Start State Alpha: 1 + Start State Color: 0; 255; 0 Planning Scene Topic: monitored_planning_scene Robot Description: robot_description Scene Geometry: - Scene Alpha: 1 + Scene Alpha: 0.8999999761581421 + Scene Color: 50; 230; 50 + Scene Display Time: 0.009999999776482582 + Show Scene Geometry: true + Voxel Coloring: Z-Axis + Voxel Rendering: Occupied Voxels Scene Robot: - Robot Alpha: 0.5 + Attached Body Color: 150; 50; 150 + Links: + All Links Enabled: true + Expand Joint Details: false + Expand Link Details: false + Expand Tree: false + Link Tree Style: Links in Alphabetic Order + alice_base: + Alpha: 1 + Show Axes: false + Show Trail: false + alice_base_link: + Alpha: 1 + Show Axes: false + Show Trail: false + alice_base_link_inertia: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + alice_flange: + Alpha: 1 + Show Axes: false + Show Trail: false + alice_forearm_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + alice_ft_frame: + Alpha: 1 + Show Axes: false + Show Trail: false + alice_robot_mount: + Alpha: 1 + Show Axes: false + Show Trail: false + alice_shoulder_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + alice_tool0: + Alpha: 1 + Show Axes: false + Show Trail: false + alice_upper_arm_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + alice_wrist_1_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + alice_wrist_2_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + alice_wrist_3_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + bob_base: + Alpha: 1 + Show Axes: false + Show Trail: false + bob_base_link: + Alpha: 1 + Show Axes: false + Show Trail: false + bob_base_link_inertia: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + bob_flange: + Alpha: 1 + Show Axes: false + Show Trail: false + bob_forearm_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + bob_ft_frame: + Alpha: 1 + Show Axes: false + Show Trail: false + bob_robot_mount: + Alpha: 1 + Show Axes: false + Show Trail: false + bob_shoulder_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + bob_tool0: + Alpha: 1 + Show Axes: false + Show Trail: false + bob_upper_arm_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + bob_wrist_1_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + bob_wrist_2_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + bob_wrist_3_link: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + monitor: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + table: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + wall: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + world: + Alpha: 1 + Show Axes: false + Show Trail: false + Robot Alpha: 1 + Show Robot Collision: false + Show Robot Visual: true Value: true + Velocity_Scaling_Factor: 0.1 + Enabled: true Global Options: + Background Color: 48; 48; 48 Fixed Frame: world + Frame Rate: 30 + Name: root Tools: - Class: rviz_default_plugins/Interact + Hide Inactive Objects: true - Class: rviz_default_plugins/MoveCamera - Class: rviz_default_plugins/Select + - Class: rviz_default_plugins/FocusCamera + - Class: rviz_default_plugins/Measure + Line color: 128; 128; 0 + - Class: rviz_default_plugins/SetInitialPose + Covariance x: 0.25 + Covariance y: 0.25 + Covariance yaw: 0.06853891909122467 + Topic: + Depth: 5 + Durability Policy: Volatile + History Policy: Keep Last + Reliability Policy: Reliable + Value: /initialpose + - Class: rviz_default_plugins/SetGoal + Topic: + Depth: 5 + Durability Policy: Volatile + History Policy: Keep Last + Reliability Policy: Reliable + Value: /goal_pose + - Class: rviz_default_plugins/PublishPoint + Single click: true + Topic: + Depth: 5 + Durability Policy: Volatile + History Policy: Keep Last + Reliability Policy: Reliable + Value: /clicked_point + Transformation: + Current: + Class: rviz_default_plugins/TF Value: true Views: Current: Class: rviz_default_plugins/Orbit - Distance: 2.0 + Distance: 4.587055683135986 + Enable Stereo Rendering: + Stereo Eye Separation: 0.05999999865889549 + Stereo Focal Distance: 1 + Swap Stereo Eyes: false + Value: false Focal Point: - X: -0.1 - Y: 0.25 - Z: 0.30 + X: 0.4825928509235382 + Y: 0.6104342937469482 + Z: 1.4097795486450195 + Focal Shape Fixed Size: true + Focal Shape Size: 0.05000000074505806 + Invert Z Axis: false Name: Current View - Pitch: 0.5 - Target Frame: world - Yaw: -0.623 + Near Clip Distance: 0.009999999776482582 + Pitch: 0.41039803624153137 + Target Frame: + Value: Orbit (rviz) + Yaw: 4.133575916290283 + Saved: ~ Window Geometry: - Height: 975 - QMainWindow State: 000000ff00000000fd0000000100000000000002b400000375fc0200000005fb00000044004d006f00740069006f006e0050006c0061006e006e0069006e00670020002d0020005400720061006a006500630074006f0072007900200053006c00690064006500720000000000ffffffff0000004100fffffffb000000100044006900730070006c006100790073010000003d00000123000000c900fffffffb0000001c004d006f00740069006f006e0050006c0061006e006e0069006e00670100000166000001910000018800fffffffb0000000800480065006c0070000000029a0000006e0000006e00fffffffb0000000a0056006900650077007301000002fd000000b5000000a400ffffff000001f60000037500000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 - Width: 1200 + Displays: + collapsed: false + Height: 1016 + Hide Left Dock: false + Hide Right Dock: false + MotionPlanning: + collapsed: false + MotionPlanning - Trajectory Slider: + collapsed: false + QMainWindow State: 000000ff00000000fd0000000400000000000001f30000039efc020000000bfb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003d00000210000000c900fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261fb000000280020002d0020005400720061006a006500630074006f0072007900200053006c00690064006500720000000000ffffffff0000000000000000fb00000044004d006f00740069006f006e0050006c0061006e006e0069006e00670020002d0020005400720061006a006500630074006f0072007900200053006c00690064006500720000000000ffffffff0000004100fffffffb0000001c004d006f00740069006f006e0050006c0061006e006e0069006e00670100000253000001880000017d00ffffff00000001000001100000039efc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073010000003d0000039e000000a400fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000004420000003efc0100000002fb0000000800540069006d00650100000000000004420000000000000000fb0000000800540069006d00650100000000000004500000000000000000000004710000039e00000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 + Selection: + collapsed: false + Tool Properties: + collapsed: false + Views: + collapsed: false + Width: 1920 + X: 0 + Y: 27 diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/dual_ur_moveit.launch.py b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/dual_ur_moveit.launch.py index 644f2ab..de5a476 100644 --- a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/dual_ur_moveit.launch.py +++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/dual_ur_moveit.launch.py @@ -4,7 +4,8 @@ import yaml from ament_index_python.packages import get_package_share_directory from launch import LaunchDescription -from launch.actions import DeclareLaunchArgument, ExecuteProcess, RegisterEventHandler +from launch.actions import (DeclareLaunchArgument, ExecuteProcess, + RegisterEventHandler) from launch.conditions import IfCondition from launch.event_handlers import OnProcessExit from launch.substitutions import LaunchConfiguration, PathJoinSubstitution @@ -51,15 +52,16 @@ def generate_launch_description(): additional_env={"DISPLAY": ":0"}, ) - # rviz_config_file = PathJoinSubstitution( - # [FindPackageShare("crm_moveit_config"), "config", "moveit.rviz"] - # ) + rviz_config_file = PathJoinSubstitution( + [FindPackageShare("my_dual_robot_cell_moveit_config"), "config", "moveit.rviz"] + ) + rviz_node = Node( package="rviz2", executable="rviz2", name="rviz2_moveit", output="log", - # arguments=["-d"], + arguments=["-d", rviz_config_file], parameters=[ moveit_config.robot_description, moveit_config.robot_description_semantic,