From ccde11cd9d9a16371e2f1c1dda0af572535e04b7 Mon Sep 17 00:00:00 2001 From: wangWking <842749351@qq.com> Date: Thu, 7 Apr 2022 14:49:54 +0800 Subject: [PATCH] code integrate --- mycobot_280/{ => mycobot_280}/CMakeLists.txt | 0 mycobot_280/{ => mycobot_280}/LICENSE | 0 .../{ => mycobot_280}/config/mycobot.rviz | 0 .../config/mycobot_with_marker.rviz | 0 .../launch/detect_marker.launch | 0 .../launch/detect_marker_with_topic.launch | 0 .../launch/mycobot_follow.launch | 0 .../launch/simple_gui.launch | 0 .../launch/slider_control.launch | 0 .../launch/teleop_keyboard.launch | 0 .../{ => mycobot_280}/launch/test.launch | 0 mycobot_280/{ => mycobot_280}/package.xml | 0 .../scripts/detect_marker.py | 0 .../scripts/follow_and_pump.py | 0 .../scripts/follow_display.py | 0 .../scripts/following_marker.py | 0 .../{ => mycobot_280}/scripts/listen_real.py | 0 .../scripts/listen_real_of_topic.py | 0 .../{ => mycobot_280}/scripts/simple_gui.py | 0 .../scripts/slider_control.py | 0 .../scripts/teleop_keyboard.py | 0 .../{ => mycobot_280}/src/camera_display.cpp | 0 .../{ => mycobot_280}/src/opencv_camera.cpp | 0 .../mycobot_280_moveit/.setup_assistant | 11 + mycobot_280/mycobot_280_moveit/CMakeLists.txt | 22 + mycobot_280/mycobot_280_moveit/LICENSE | 25 + .../config/chomp_planning.yaml | 18 + .../config/fake_controllers.yaml | 9 + .../config/firefighter.srdf | 42 ++ .../config/joint_limits.yaml | 34 ++ .../mycobot_280_moveit/config/kinematics.yaml | 5 + .../config/ompl_planning.yaml | 150 ++++++ .../config/ros_controllers.yaml | 26 + .../mycobot_280_moveit/config/sensors_3d.yaml | 10 + .../launch/chomp_planning_pipeline.launch.xml | 10 + .../launch/default_warehouse_db.launch | 15 + .../mycobot_280_moveit/launch/demo.launch | 66 +++ .../launch/demo_gazebo.launch | 70 +++ .../fake_moveit_controller_manager.launch.xml | 9 + ...ghter_moveit_controller_manager.launch.xml | 10 + ...refighter_moveit_sensor_manager.launch.xml | 3 + .../mycobot_280_moveit/launch/gazebo.launch | 23 + .../launch/joystick_control.launch | 17 + .../launch/move_group.launch | 77 +++ .../mycobot_280_moveit/launch/moveit.rviz | 250 +++++++++ .../launch/moveit_rviz.launch | 16 + .../launch/mycobot_moveit.launch | 65 +++ .../launch/ompl_planning_pipeline.launch.xml | 22 + .../launch/planning_context.launch | 24 + .../launch/planning_pipeline.launch.xml | 10 + .../launch/ros_controllers.launch | 11 + .../launch/run_benchmark_ompl.launch | 22 + .../launch/sensor_manager.launch.xml | 17 + .../launch/setup_assistant.launch | 15 + .../launch/trajectory_execution.launch.xml | 20 + .../launch/warehouse.launch | 15 + .../launch/warehouse_settings.launch.xml | 16 + mycobot_280/mycobot_280_moveit/package.xml | 40 ++ ...th_planning_and_obstacle_avoidance_demo.py | 137 +++++ .../mycobot_280_moveit/scripts/sync_plan.py | 40 ++ mycobot_280/mycobot_280jn/CMakeLists.txt | 40 ++ mycobot_280/mycobot_280jn/LICENSE | 25 + mycobot_280/mycobot_280jn/config/mycobot.rviz | 203 ++++++++ .../config/mycobot_with_marker.rviz | 216 ++++++++ .../mycobot_280jn/launch/detect_marker.launch | 18 + .../launch/detect_marker_with_topic.launch | 30 ++ .../launch/mycobot_follow.launch | 13 + .../mycobot_280jn/launch/simple_gui.launch | 24 + .../launch/slider_control.launch | 24 + .../launch/teleop_keyboard.launch | 23 + mycobot_280/mycobot_280jn/launch/test.launch | 17 + mycobot_280/mycobot_280jn/package.xml | 47 ++ .../mycobot_280jn/scripts/detect_marker.py | 123 +++++ .../mycobot_280jn/scripts/follow_and_pump.py | 194 +++++++ .../mycobot_280jn/scripts/follow_display.py | 103 ++++ .../mycobot_280jn/scripts/following_marker.py | 64 +++ .../mycobot_280jn/scripts/listen_real.py | 65 +++ .../scripts/listen_real_of_topic.py | 63 +++ .../mycobot_280jn/scripts/simple_gui.py | 478 ++++++++++++++++++ .../mycobot_280jn/scripts/slider_control.py | 49 ++ .../mycobot_280jn/scripts/teleop_keyboard.py | 174 +++++++ .../mycobot_280jn/src/camera_display.cpp | 29 ++ .../mycobot_280jn/src/opencv_camera.cpp | 60 +++ .../mycobot_280jn_moveit/.setup_assistant | 11 + .../mycobot_280jn_moveit/CMakeLists.txt | 22 + mycobot_280/mycobot_280jn_moveit/LICENSE | 25 + .../config/chomp_planning.yaml | 18 + .../config/fake_controllers.yaml | 9 + .../config/firefighter.srdf | 42 ++ .../config/joint_limits.yaml | 34 ++ .../config/kinematics.yaml | 5 + .../config/ompl_planning.yaml | 150 ++++++ .../config/ros_controllers.yaml | 26 + .../config/sensors_3d.yaml | 10 + .../launch/chomp_planning_pipeline.launch.xml | 10 + .../launch/default_warehouse_db.launch | 15 + .../mycobot_280jn_moveit/launch/demo.launch | 66 +++ .../launch/demo_gazebo.launch | 70 +++ .../fake_moveit_controller_manager.launch.xml | 9 + ...ghter_moveit_controller_manager.launch.xml | 10 + ...refighter_moveit_sensor_manager.launch.xml | 3 + .../mycobot_280jn_moveit/launch/gazebo.launch | 23 + .../launch/joystick_control.launch | 17 + .../launch/move_group.launch | 77 +++ .../mycobot_280jn_moveit/launch/moveit.rviz | 250 +++++++++ .../launch/moveit_rviz.launch | 16 + .../launch/mycobot_moveit.launch | 65 +++ .../launch/ompl_planning_pipeline.launch.xml | 22 + .../launch/planning_context.launch | 24 + .../launch/planning_pipeline.launch.xml | 10 + .../launch/ros_controllers.launch | 11 + .../launch/run_benchmark_ompl.launch | 22 + .../launch/sensor_manager.launch.xml | 17 + .../launch/setup_assistant.launch | 15 + .../launch/trajectory_execution.launch.xml | 20 + .../launch/warehouse.launch | 15 + .../launch/warehouse_settings.launch.xml | 16 + mycobot_280/mycobot_280jn_moveit/package.xml | 40 ++ ...th_planning_and_obstacle_avoidance_demo.py | 137 +++++ .../mycobot_280jn_moveit/scripts/sync_plan.py | 40 ++ 120 files changed, 4826 insertions(+) rename mycobot_280/{ => mycobot_280}/CMakeLists.txt (100%) mode change 100755 => 100644 rename mycobot_280/{ => mycobot_280}/LICENSE (100%) rename mycobot_280/{ => mycobot_280}/config/mycobot.rviz (100%) rename mycobot_280/{ => mycobot_280}/config/mycobot_with_marker.rviz (100%) rename mycobot_280/{ => mycobot_280}/launch/detect_marker.launch (100%) rename mycobot_280/{ => mycobot_280}/launch/detect_marker_with_topic.launch (100%) rename mycobot_280/{ => mycobot_280}/launch/mycobot_follow.launch (100%) rename mycobot_280/{ => mycobot_280}/launch/simple_gui.launch (100%) rename mycobot_280/{ => mycobot_280}/launch/slider_control.launch (100%) rename mycobot_280/{ => mycobot_280}/launch/teleop_keyboard.launch (100%) rename mycobot_280/{ => mycobot_280}/launch/test.launch (100%) rename mycobot_280/{ => mycobot_280}/package.xml (100%) rename mycobot_280/{ => mycobot_280}/scripts/detect_marker.py (100%) mode change 100755 => 100644 rename mycobot_280/{ => mycobot_280}/scripts/follow_and_pump.py (100%) mode change 100755 => 100644 rename mycobot_280/{ => mycobot_280}/scripts/follow_display.py (100%) mode change 100755 => 100644 rename mycobot_280/{ => mycobot_280}/scripts/following_marker.py (100%) mode change 100755 => 100644 rename mycobot_280/{ => mycobot_280}/scripts/listen_real.py (100%) mode change 100755 => 100644 rename mycobot_280/{ => mycobot_280}/scripts/listen_real_of_topic.py (100%) mode change 100755 => 100644 rename mycobot_280/{ => mycobot_280}/scripts/simple_gui.py (100%) mode change 100755 => 100644 rename mycobot_280/{ => mycobot_280}/scripts/slider_control.py (100%) mode change 100755 => 100644 rename mycobot_280/{ => mycobot_280}/scripts/teleop_keyboard.py (100%) mode change 100755 => 100644 rename mycobot_280/{ => mycobot_280}/src/camera_display.cpp (100%) rename mycobot_280/{ => mycobot_280}/src/opencv_camera.cpp (100%) create mode 100644 mycobot_280/mycobot_280_moveit/.setup_assistant create mode 100644 mycobot_280/mycobot_280_moveit/CMakeLists.txt create mode 100644 mycobot_280/mycobot_280_moveit/LICENSE create mode 100644 mycobot_280/mycobot_280_moveit/config/chomp_planning.yaml create mode 100644 mycobot_280/mycobot_280_moveit/config/fake_controllers.yaml create mode 100644 mycobot_280/mycobot_280_moveit/config/firefighter.srdf create mode 100644 mycobot_280/mycobot_280_moveit/config/joint_limits.yaml create mode 100644 mycobot_280/mycobot_280_moveit/config/kinematics.yaml create mode 100644 mycobot_280/mycobot_280_moveit/config/ompl_planning.yaml create mode 100644 mycobot_280/mycobot_280_moveit/config/ros_controllers.yaml create mode 100644 mycobot_280/mycobot_280_moveit/config/sensors_3d.yaml create mode 100644 mycobot_280/mycobot_280_moveit/launch/chomp_planning_pipeline.launch.xml create mode 100644 mycobot_280/mycobot_280_moveit/launch/default_warehouse_db.launch create mode 100644 mycobot_280/mycobot_280_moveit/launch/demo.launch create mode 100644 mycobot_280/mycobot_280_moveit/launch/demo_gazebo.launch create mode 100644 mycobot_280/mycobot_280_moveit/launch/fake_moveit_controller_manager.launch.xml create mode 100644 mycobot_280/mycobot_280_moveit/launch/firefighter_moveit_controller_manager.launch.xml create mode 100644 mycobot_280/mycobot_280_moveit/launch/firefighter_moveit_sensor_manager.launch.xml create mode 100644 mycobot_280/mycobot_280_moveit/launch/gazebo.launch create mode 100644 mycobot_280/mycobot_280_moveit/launch/joystick_control.launch create mode 100644 mycobot_280/mycobot_280_moveit/launch/move_group.launch create mode 100644 mycobot_280/mycobot_280_moveit/launch/moveit.rviz create mode 100644 mycobot_280/mycobot_280_moveit/launch/moveit_rviz.launch create mode 100644 mycobot_280/mycobot_280_moveit/launch/mycobot_moveit.launch create mode 100644 mycobot_280/mycobot_280_moveit/launch/ompl_planning_pipeline.launch.xml create mode 100644 mycobot_280/mycobot_280_moveit/launch/planning_context.launch create mode 100644 mycobot_280/mycobot_280_moveit/launch/planning_pipeline.launch.xml create mode 100644 mycobot_280/mycobot_280_moveit/launch/ros_controllers.launch create mode 100644 mycobot_280/mycobot_280_moveit/launch/run_benchmark_ompl.launch create mode 100644 mycobot_280/mycobot_280_moveit/launch/sensor_manager.launch.xml create mode 100644 mycobot_280/mycobot_280_moveit/launch/setup_assistant.launch create mode 100644 mycobot_280/mycobot_280_moveit/launch/trajectory_execution.launch.xml create mode 100644 mycobot_280/mycobot_280_moveit/launch/warehouse.launch create mode 100644 mycobot_280/mycobot_280_moveit/launch/warehouse_settings.launch.xml create mode 100644 mycobot_280/mycobot_280_moveit/package.xml create mode 100644 mycobot_280/mycobot_280_moveit/scripts/path_planning_and_obstacle_avoidance_demo.py create mode 100644 mycobot_280/mycobot_280_moveit/scripts/sync_plan.py create mode 100644 mycobot_280/mycobot_280jn/CMakeLists.txt create mode 100644 mycobot_280/mycobot_280jn/LICENSE create mode 100644 mycobot_280/mycobot_280jn/config/mycobot.rviz create mode 100644 mycobot_280/mycobot_280jn/config/mycobot_with_marker.rviz create mode 100644 mycobot_280/mycobot_280jn/launch/detect_marker.launch create mode 100644 mycobot_280/mycobot_280jn/launch/detect_marker_with_topic.launch create mode 100644 mycobot_280/mycobot_280jn/launch/mycobot_follow.launch create mode 100644 mycobot_280/mycobot_280jn/launch/simple_gui.launch create mode 100644 mycobot_280/mycobot_280jn/launch/slider_control.launch create mode 100644 mycobot_280/mycobot_280jn/launch/teleop_keyboard.launch create mode 100644 mycobot_280/mycobot_280jn/launch/test.launch create mode 100644 mycobot_280/mycobot_280jn/package.xml create mode 100644 mycobot_280/mycobot_280jn/scripts/detect_marker.py create mode 100644 mycobot_280/mycobot_280jn/scripts/follow_and_pump.py create mode 100644 mycobot_280/mycobot_280jn/scripts/follow_display.py create mode 100644 mycobot_280/mycobot_280jn/scripts/following_marker.py create mode 100644 mycobot_280/mycobot_280jn/scripts/listen_real.py create mode 100644 mycobot_280/mycobot_280jn/scripts/listen_real_of_topic.py create mode 100644 mycobot_280/mycobot_280jn/scripts/simple_gui.py create mode 100644 mycobot_280/mycobot_280jn/scripts/slider_control.py create mode 100644 mycobot_280/mycobot_280jn/scripts/teleop_keyboard.py create mode 100644 mycobot_280/mycobot_280jn/src/camera_display.cpp create mode 100644 mycobot_280/mycobot_280jn/src/opencv_camera.cpp create mode 100644 mycobot_280/mycobot_280jn_moveit/.setup_assistant create mode 100644 mycobot_280/mycobot_280jn_moveit/CMakeLists.txt create mode 100644 mycobot_280/mycobot_280jn_moveit/LICENSE create mode 100644 mycobot_280/mycobot_280jn_moveit/config/chomp_planning.yaml create mode 100644 mycobot_280/mycobot_280jn_moveit/config/fake_controllers.yaml create mode 100644 mycobot_280/mycobot_280jn_moveit/config/firefighter.srdf create mode 100644 mycobot_280/mycobot_280jn_moveit/config/joint_limits.yaml create mode 100644 mycobot_280/mycobot_280jn_moveit/config/kinematics.yaml create mode 100644 mycobot_280/mycobot_280jn_moveit/config/ompl_planning.yaml create mode 100644 mycobot_280/mycobot_280jn_moveit/config/ros_controllers.yaml create mode 100644 mycobot_280/mycobot_280jn_moveit/config/sensors_3d.yaml create mode 100644 mycobot_280/mycobot_280jn_moveit/launch/chomp_planning_pipeline.launch.xml create mode 100644 mycobot_280/mycobot_280jn_moveit/launch/default_warehouse_db.launch create mode 100644 mycobot_280/mycobot_280jn_moveit/launch/demo.launch create mode 100644 mycobot_280/mycobot_280jn_moveit/launch/demo_gazebo.launch create mode 100644 mycobot_280/mycobot_280jn_moveit/launch/fake_moveit_controller_manager.launch.xml create mode 100644 mycobot_280/mycobot_280jn_moveit/launch/firefighter_moveit_controller_manager.launch.xml create mode 100644 mycobot_280/mycobot_280jn_moveit/launch/firefighter_moveit_sensor_manager.launch.xml create mode 100644 mycobot_280/mycobot_280jn_moveit/launch/gazebo.launch create mode 100644 mycobot_280/mycobot_280jn_moveit/launch/joystick_control.launch create mode 100644 mycobot_280/mycobot_280jn_moveit/launch/move_group.launch create mode 100644 mycobot_280/mycobot_280jn_moveit/launch/moveit.rviz create mode 100644 mycobot_280/mycobot_280jn_moveit/launch/moveit_rviz.launch create mode 100644 mycobot_280/mycobot_280jn_moveit/launch/mycobot_moveit.launch create mode 100644 mycobot_280/mycobot_280jn_moveit/launch/ompl_planning_pipeline.launch.xml create mode 100644 mycobot_280/mycobot_280jn_moveit/launch/planning_context.launch create mode 100644 mycobot_280/mycobot_280jn_moveit/launch/planning_pipeline.launch.xml create mode 100644 mycobot_280/mycobot_280jn_moveit/launch/ros_controllers.launch create mode 100644 mycobot_280/mycobot_280jn_moveit/launch/run_benchmark_ompl.launch create mode 100644 mycobot_280/mycobot_280jn_moveit/launch/sensor_manager.launch.xml create mode 100644 mycobot_280/mycobot_280jn_moveit/launch/setup_assistant.launch create mode 100644 mycobot_280/mycobot_280jn_moveit/launch/trajectory_execution.launch.xml create mode 100644 mycobot_280/mycobot_280jn_moveit/launch/warehouse.launch create mode 100644 mycobot_280/mycobot_280jn_moveit/launch/warehouse_settings.launch.xml create mode 100644 mycobot_280/mycobot_280jn_moveit/package.xml create mode 100644 mycobot_280/mycobot_280jn_moveit/scripts/path_planning_and_obstacle_avoidance_demo.py create mode 100644 mycobot_280/mycobot_280jn_moveit/scripts/sync_plan.py diff --git a/mycobot_280/CMakeLists.txt b/mycobot_280/mycobot_280/CMakeLists.txt old mode 100755 new mode 100644 similarity index 100% rename from mycobot_280/CMakeLists.txt rename to mycobot_280/mycobot_280/CMakeLists.txt diff --git a/mycobot_280/LICENSE b/mycobot_280/mycobot_280/LICENSE similarity index 100% rename from mycobot_280/LICENSE rename to mycobot_280/mycobot_280/LICENSE diff --git a/mycobot_280/config/mycobot.rviz b/mycobot_280/mycobot_280/config/mycobot.rviz similarity index 100% rename from mycobot_280/config/mycobot.rviz rename to mycobot_280/mycobot_280/config/mycobot.rviz diff --git a/mycobot_280/config/mycobot_with_marker.rviz b/mycobot_280/mycobot_280/config/mycobot_with_marker.rviz similarity index 100% rename from mycobot_280/config/mycobot_with_marker.rviz rename to mycobot_280/mycobot_280/config/mycobot_with_marker.rviz diff --git a/mycobot_280/launch/detect_marker.launch b/mycobot_280/mycobot_280/launch/detect_marker.launch similarity index 100% rename from mycobot_280/launch/detect_marker.launch rename to mycobot_280/mycobot_280/launch/detect_marker.launch diff --git a/mycobot_280/launch/detect_marker_with_topic.launch b/mycobot_280/mycobot_280/launch/detect_marker_with_topic.launch similarity index 100% rename from mycobot_280/launch/detect_marker_with_topic.launch rename to mycobot_280/mycobot_280/launch/detect_marker_with_topic.launch diff --git a/mycobot_280/launch/mycobot_follow.launch b/mycobot_280/mycobot_280/launch/mycobot_follow.launch similarity index 100% rename from mycobot_280/launch/mycobot_follow.launch rename to mycobot_280/mycobot_280/launch/mycobot_follow.launch diff --git a/mycobot_280/launch/simple_gui.launch b/mycobot_280/mycobot_280/launch/simple_gui.launch similarity index 100% rename from mycobot_280/launch/simple_gui.launch rename to mycobot_280/mycobot_280/launch/simple_gui.launch diff --git a/mycobot_280/launch/slider_control.launch b/mycobot_280/mycobot_280/launch/slider_control.launch similarity index 100% rename from mycobot_280/launch/slider_control.launch rename to mycobot_280/mycobot_280/launch/slider_control.launch diff --git a/mycobot_280/launch/teleop_keyboard.launch b/mycobot_280/mycobot_280/launch/teleop_keyboard.launch similarity index 100% rename from mycobot_280/launch/teleop_keyboard.launch rename to mycobot_280/mycobot_280/launch/teleop_keyboard.launch diff --git a/mycobot_280/launch/test.launch b/mycobot_280/mycobot_280/launch/test.launch similarity index 100% rename from mycobot_280/launch/test.launch rename to mycobot_280/mycobot_280/launch/test.launch diff --git a/mycobot_280/package.xml b/mycobot_280/mycobot_280/package.xml similarity index 100% rename from mycobot_280/package.xml rename to mycobot_280/mycobot_280/package.xml diff --git a/mycobot_280/scripts/detect_marker.py b/mycobot_280/mycobot_280/scripts/detect_marker.py old mode 100755 new mode 100644 similarity index 100% rename from mycobot_280/scripts/detect_marker.py rename to mycobot_280/mycobot_280/scripts/detect_marker.py diff --git a/mycobot_280/scripts/follow_and_pump.py b/mycobot_280/mycobot_280/scripts/follow_and_pump.py old mode 100755 new mode 100644 similarity index 100% rename from mycobot_280/scripts/follow_and_pump.py rename to mycobot_280/mycobot_280/scripts/follow_and_pump.py diff --git a/mycobot_280/scripts/follow_display.py b/mycobot_280/mycobot_280/scripts/follow_display.py old mode 100755 new mode 100644 similarity index 100% rename from mycobot_280/scripts/follow_display.py rename to mycobot_280/mycobot_280/scripts/follow_display.py diff --git a/mycobot_280/scripts/following_marker.py b/mycobot_280/mycobot_280/scripts/following_marker.py old mode 100755 new mode 100644 similarity index 100% rename from mycobot_280/scripts/following_marker.py rename to mycobot_280/mycobot_280/scripts/following_marker.py diff --git a/mycobot_280/scripts/listen_real.py b/mycobot_280/mycobot_280/scripts/listen_real.py old mode 100755 new mode 100644 similarity index 100% rename from mycobot_280/scripts/listen_real.py rename to mycobot_280/mycobot_280/scripts/listen_real.py diff --git a/mycobot_280/scripts/listen_real_of_topic.py b/mycobot_280/mycobot_280/scripts/listen_real_of_topic.py old mode 100755 new mode 100644 similarity index 100% rename from mycobot_280/scripts/listen_real_of_topic.py rename to mycobot_280/mycobot_280/scripts/listen_real_of_topic.py diff --git a/mycobot_280/scripts/simple_gui.py b/mycobot_280/mycobot_280/scripts/simple_gui.py old mode 100755 new mode 100644 similarity index 100% rename from mycobot_280/scripts/simple_gui.py rename to mycobot_280/mycobot_280/scripts/simple_gui.py diff --git a/mycobot_280/scripts/slider_control.py b/mycobot_280/mycobot_280/scripts/slider_control.py old mode 100755 new mode 100644 similarity index 100% rename from mycobot_280/scripts/slider_control.py rename to mycobot_280/mycobot_280/scripts/slider_control.py diff --git a/mycobot_280/scripts/teleop_keyboard.py b/mycobot_280/mycobot_280/scripts/teleop_keyboard.py old mode 100755 new mode 100644 similarity index 100% rename from mycobot_280/scripts/teleop_keyboard.py rename to mycobot_280/mycobot_280/scripts/teleop_keyboard.py diff --git a/mycobot_280/src/camera_display.cpp b/mycobot_280/mycobot_280/src/camera_display.cpp similarity index 100% rename from mycobot_280/src/camera_display.cpp rename to mycobot_280/mycobot_280/src/camera_display.cpp diff --git a/mycobot_280/src/opencv_camera.cpp b/mycobot_280/mycobot_280/src/opencv_camera.cpp similarity index 100% rename from mycobot_280/src/opencv_camera.cpp rename to mycobot_280/mycobot_280/src/opencv_camera.cpp diff --git a/mycobot_280/mycobot_280_moveit/.setup_assistant b/mycobot_280/mycobot_280_moveit/.setup_assistant new file mode 100644 index 0000000..c64dedc --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/.setup_assistant @@ -0,0 +1,11 @@ +moveit_setup_assistant_config: + URDF: + package: mycobot_description + relative_path: urdf/mycobot/mycobot_urdf.urdf + xacro_args: "--inorder " + SRDF: + relative_path: config/firefighter.srdf + CONFIG: + author_name: zachary + author_email: lijun.zhang@elephantrobotics.com + generated_timestamp: 1626074107 \ No newline at end of file diff --git a/mycobot_280/mycobot_280_moveit/CMakeLists.txt b/mycobot_280/mycobot_280_moveit/CMakeLists.txt new file mode 100644 index 0000000..e3148b0 --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/CMakeLists.txt @@ -0,0 +1,22 @@ +cmake_minimum_required(VERSION 2.8.3) +project(mycobot_280_moveit) + +find_package(catkin REQUIRED + rospy + std_msgs + moveit_msgs +) + +catkin_package() + +## Mark executable scripts (Python etc.) for installation +## in contrast to setup.py, you can choose the destination +catkin_install_python(PROGRAMS + scripts/sync_plan.py + scripts/path_planning_and_obstacle_avoidance_demo.py + DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +) + +install(DIRECTORY launch DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} + PATTERN "setup_assistant.launch" EXCLUDE) +install(DIRECTORY config DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}) diff --git a/mycobot_280/mycobot_280_moveit/LICENSE b/mycobot_280/mycobot_280_moveit/LICENSE new file mode 100644 index 0000000..b8468e6 --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/LICENSE @@ -0,0 +1,25 @@ +BSD 2-Clause License + +Copyright (c) 2020, Elephant Robotics +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. + +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/mycobot_280/mycobot_280_moveit/config/chomp_planning.yaml b/mycobot_280/mycobot_280_moveit/config/chomp_planning.yaml new file mode 100644 index 0000000..75258e5 --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/config/chomp_planning.yaml @@ -0,0 +1,18 @@ +planning_time_limit: 10.0 +max_iterations: 200 +max_iterations_after_collision_free: 5 +smoothness_cost_weight: 0.1 +obstacle_cost_weight: 1.0 +learning_rate: 0.01 +smoothness_cost_velocity: 0.0 +smoothness_cost_acceleration: 1.0 +smoothness_cost_jerk: 0.0 +ridge_factor: 0.01 +use_pseudo_inverse: false +pseudo_inverse_ridge_factor: 1e-4 +joint_update_limit: 0.1 +collision_clearence: 0.2 +collision_threshold: 0.07 +use_stochastic_descent: true +enable_failure_recovery: true +max_recovery_attempts: 5 \ No newline at end of file diff --git a/mycobot_280/mycobot_280_moveit/config/fake_controllers.yaml b/mycobot_280/mycobot_280_moveit/config/fake_controllers.yaml new file mode 100644 index 0000000..47a2eb3 --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/config/fake_controllers.yaml @@ -0,0 +1,9 @@ +controller_list: + - name: fake_arm_group_controller + joints: + - joint2_to_joint1 + - joint3_to_joint2 + - joint4_to_joint3 + - joint5_to_joint4 + - joint6_to_joint5 + - joint6output_to_joint6 \ No newline at end of file diff --git a/mycobot_280/mycobot_280_moveit/config/firefighter.srdf b/mycobot_280/mycobot_280_moveit/config/firefighter.srdf new file mode 100644 index 0000000..1c94891 --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/config/firefighter.srdf @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280_moveit/config/joint_limits.yaml b/mycobot_280/mycobot_280_moveit/config/joint_limits.yaml new file mode 100644 index 0000000..6e9612a --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/config/joint_limits.yaml @@ -0,0 +1,34 @@ +# joint_limits.yaml allows the dynamics properties specified in the URDF to be overwritten or augmented as needed +# 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: + joint2_to_joint1: + has_velocity_limits: false + max_velocity: 0 + has_acceleration_limits: false + max_acceleration: 0 + joint3_to_joint2: + has_velocity_limits: false + max_velocity: 0 + has_acceleration_limits: false + max_acceleration: 0 + joint4_to_joint3: + has_velocity_limits: false + max_velocity: 0 + has_acceleration_limits: false + max_acceleration: 0 + joint5_to_joint4: + has_velocity_limits: false + max_velocity: 0 + has_acceleration_limits: false + max_acceleration: 0 + joint6_to_joint5: + has_velocity_limits: false + max_velocity: 0 + has_acceleration_limits: false + max_acceleration: 0 + joint6output_to_joint6: + has_velocity_limits: false + max_velocity: 0 + has_acceleration_limits: false + max_acceleration: 0 \ No newline at end of file diff --git a/mycobot_280/mycobot_280_moveit/config/kinematics.yaml b/mycobot_280/mycobot_280_moveit/config/kinematics.yaml new file mode 100644 index 0000000..031b273 --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/config/kinematics.yaml @@ -0,0 +1,5 @@ +arm_group: + kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin + kinematics_solver_search_resolution: 0.005 + kinematics_solver_timeout: 0.005 + kinematics_solver_attempts: 3 \ No newline at end of file diff --git a/mycobot_280/mycobot_280_moveit/config/ompl_planning.yaml b/mycobot_280/mycobot_280_moveit/config/ompl_planning.yaml new file mode 100644 index 0000000..3f4d0c2 --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/config/ompl_planning.yaml @@ -0,0 +1,150 @@ +planner_configs: + SBL: + type: geometric::SBL + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + EST: + type: geometric::EST + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0 setup() + goal_bias: 0.05 # When close to goal select goal, with this probability. default: 0.05 + LBKPIECE: + type: geometric::LBKPIECE + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + border_fraction: 0.9 # Fraction of time focused on boarder default: 0.9 + min_valid_path_fraction: 0.5 # Accept partially valid moves above fraction. default: 0.5 + BKPIECE: + type: geometric::BKPIECE + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + border_fraction: 0.9 # Fraction of time focused on boarder default: 0.9 + failed_expansion_score_factor: 0.5 # When extending motion fails, scale score by factor. default: 0.5 + min_valid_path_fraction: 0.5 # Accept partially valid moves above fraction. default: 0.5 + KPIECE: + type: geometric::KPIECE + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + goal_bias: 0.05 # When close to goal select goal, with this probability. default: 0.05 + border_fraction: 0.9 # Fraction of time focused on boarder default: 0.9 (0.0,1.] + failed_expansion_score_factor: 0.5 # When extending motion fails, scale score by factor. default: 0.5 + min_valid_path_fraction: 0.5 # Accept partially valid moves above fraction. default: 0.5 + RRT: + type: geometric::RRT + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + goal_bias: 0.05 # When close to goal select goal, with this probability? default: 0.05 + RRTConnect: + type: geometric::RRTConnect + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + RRTstar: + type: geometric::RRTstar + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + goal_bias: 0.05 # When close to goal select goal, with this probability? default: 0.05 + delay_collision_checking: 1 # Stop collision checking as soon as C-free parent found. default 1 + TRRT: + type: geometric::TRRT + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + goal_bias: 0.05 # When close to goal select goal, with this probability? default: 0.05 + max_states_failed: 10 # when to start increasing temp. default: 10 + temp_change_factor: 2.0 # how much to increase or decrease temp. default: 2.0 + min_temperature: 10e-10 # lower limit of temp change. default: 10e-10 + init_temperature: 10e-6 # initial temperature. default: 10e-6 + frountier_threshold: 0.0 # dist new state to nearest neighbor to disqualify as frontier. default: 0.0 set in setup() + frountierNodeRatio: 0.1 # 1/10, or 1 nonfrontier for every 10 frontier. default: 0.1 + k_constant: 0.0 # value used to normalize expresssion. default: 0.0 set in setup() + PRM: + type: geometric::PRM + max_nearest_neighbors: 10 # use k nearest neighbors. default: 10 + PRMstar: + type: geometric::PRMstar + FMT: + type: geometric::FMT + num_samples: 1000 # number of states that the planner should sample. default: 1000 + radius_multiplier: 1.1 # multiplier used for the nearest neighbors search radius. default: 1.1 + nearest_k: 1 # use Knearest strategy. default: 1 + cache_cc: 1 # use collision checking cache. default: 1 + heuristics: 0 # activate cost to go heuristics. default: 0 + extended_fmt: 1 # activate the extended FMT*: adding new samples if planner does not finish successfully. default: 1 + BFMT: + type: geometric::BFMT + num_samples: 1000 # number of states that the planner should sample. default: 1000 + radius_multiplier: 1.0 # multiplier used for the nearest neighbors search radius. default: 1.0 + nearest_k: 1 # use the Knearest strategy. default: 1 + balanced: 0 # exploration strategy: balanced true expands one tree every iteration. False will select the tree with lowest maximum cost to go. default: 1 + optimality: 1 # termination strategy: optimality true finishes when the best possible path is found. Otherwise, the algorithm will finish when the first feasible path is found. default: 1 + heuristics: 1 # activates cost to go heuristics. default: 1 + cache_cc: 1 # use the collision checking cache. default: 1 + extended_fmt: 1 # Activates the extended FMT*: adding new samples if planner does not finish successfully. default: 1 + PDST: + type: geometric::PDST + STRIDE: + type: geometric::STRIDE + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + goal_bias: 0.05 # When close to goal select goal, with this probability. default: 0.05 + use_projected_distance: 0 # whether nearest neighbors are computed based on distances in a projection of the state rather distances in the state space itself. default: 0 + degree: 16 # desired degree of a node in the Geometric Near-neightbor Access Tree (GNAT). default: 16 + max_degree: 18 # max degree of a node in the GNAT. default: 12 + min_degree: 12 # min degree of a node in the GNAT. default: 12 + max_pts_per_leaf: 6 # max points per leaf in the GNAT. default: 6 + estimated_dimension: 0.0 # estimated dimension of the free space. default: 0.0 + min_valid_path_fraction: 0.2 # Accept partially valid moves above fraction. default: 0.2 + BiTRRT: + type: geometric::BiTRRT + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + temp_change_factor: 0.1 # how much to increase or decrease temp. default: 0.1 + init_temperature: 100 # initial temperature. default: 100 + frountier_threshold: 0.0 # dist new state to nearest neighbor to disqualify as frontier. default: 0.0 set in setup() + frountier_node_ratio: 0.1 # 1/10, or 1 nonfrontier for every 10 frontier. default: 0.1 + cost_threshold: 1e300 # the cost threshold. Any motion cost that is not better will not be expanded. default: inf + LBTRRT: + type: geometric::LBTRRT + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + goal_bias: 0.05 # When close to goal select goal, with this probability. default: 0.05 + epsilon: 0.4 # optimality approximation factor. default: 0.4 + BiEST: + type: geometric::BiEST + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + ProjEST: + type: geometric::ProjEST + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + goal_bias: 0.05 # When close to goal select goal, with this probability. default: 0.05 + LazyPRM: + type: geometric::LazyPRM + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + LazyPRMstar: + type: geometric::LazyPRMstar + SPARS: + type: geometric::SPARS + stretch_factor: 3.0 # roadmap spanner stretch factor. multiplicative upper bound on path quality. It does not make sense to make this parameter more than 3. default: 3.0 + sparse_delta_fraction: 0.25 # delta fraction for connection distance. This value represents the visibility range of sparse samples. default: 0.25 + dense_delta_fraction: 0.001 # delta fraction for interface detection. default: 0.001 + max_failures: 1000 # maximum consecutive failure limit. default: 1000 + SPARStwo: + type: geometric::SPARStwo + stretch_factor: 3.0 # roadmap spanner stretch factor. multiplicative upper bound on path quality. It does not make sense to make this parameter more than 3. default: 3.0 + sparse_delta_fraction: 0.25 # delta fraction for connection distance. This value represents the visibility range of sparse samples. default: 0.25 + dense_delta_fraction: 0.001 # delta fraction for interface detection. default: 0.001 + max_failures: 5000 # maximum consecutive failure limit. default: 5000 +arm_group: + default_planner_config: None + planner_configs: + - SBL + - EST + - LBKPIECE + - BKPIECE + - KPIECE + - RRT + - RRTConnect + - RRTstar + - TRRT + - PRM + - PRMstar + - FMT + - BFMT + - PDST + - STRIDE + - BiTRRT + - LBTRRT + - BiEST + - ProjEST + - LazyPRM + - LazyPRMstar + - SPARS + - SPARStwo + projection_evaluator: joints(joint2_to_joint1,joint3_to_joint2) + longest_valid_segment_fraction: 0.005 \ No newline at end of file diff --git a/mycobot_280/mycobot_280_moveit/config/ros_controllers.yaml b/mycobot_280/mycobot_280_moveit/config/ros_controllers.yaml new file mode 100644 index 0000000..6b814df --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/config/ros_controllers.yaml @@ -0,0 +1,26 @@ +# Simulation settings for using moveit_sim_controllers +moveit_sim_hw_interface: + joint_model_group: arm_group + joint_model_group_pose: init_pose +# Settings for ros_control_boilerplate control loop +generic_hw_control_loop: + loop_hz: 300 + cycle_time_error_threshold: 0.01 +# Settings for ros_control hardware interface +hardware_interface: + joints: + - vitual_joint + - joint2_to_joint1 + - joint3_to_joint2 + - joint4_to_joint3 + - joint5_to_joint4 + - joint6_to_joint5 + - joint6output_to_joint6 + sim_control_mode: 1 # 0: position, 1: velocity +# Publish all joint states +# Creates the /joint_states topic necessary in ROS +joint_state_controller: + type: joint_state_controller/JointStateController + publish_rate: 50 +controller_list: + [] \ No newline at end of file diff --git a/mycobot_280/mycobot_280_moveit/config/sensors_3d.yaml b/mycobot_280/mycobot_280_moveit/config/sensors_3d.yaml new file mode 100644 index 0000000..a4bb13e --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/config/sensors_3d.yaml @@ -0,0 +1,10 @@ +# The name of this file shouldn't be changed, or else the Setup Assistant won't detect it +sensors: + - filtered_cloud_topic: filtered_cloud + max_range: 5.0 + max_update_rate: 1.0 + padding_offset: 0.1 + padding_scale: 1.0 + point_cloud_topic: /head_mount_kinect/depth_registered/points + point_subsample: 1 + sensor_plugin: occupancy_map_monitor/PointCloudOctomapUpdater \ No newline at end of file diff --git a/mycobot_280/mycobot_280_moveit/launch/chomp_planning_pipeline.launch.xml b/mycobot_280/mycobot_280_moveit/launch/chomp_planning_pipeline.launch.xml new file mode 100644 index 0000000..1bd6340 --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/launch/chomp_planning_pipeline.launch.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/mycobot_280/mycobot_280_moveit/launch/default_warehouse_db.launch b/mycobot_280/mycobot_280_moveit/launch/default_warehouse_db.launch new file mode 100644 index 0000000..ec945e9 --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/launch/default_warehouse_db.launch @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280_moveit/launch/demo.launch b/mycobot_280/mycobot_280_moveit/launch/demo.launch new file mode 100644 index 0000000..77841f7 --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/launch/demo.launch @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [move_group/fake_controller_joint_states] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280_moveit/launch/demo_gazebo.launch b/mycobot_280/mycobot_280_moveit/launch/demo_gazebo.launch new file mode 100644 index 0000000..19f5276 --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/launch/demo_gazebo.launch @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [/joint_states] + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280_moveit/launch/fake_moveit_controller_manager.launch.xml b/mycobot_280/mycobot_280_moveit/launch/fake_moveit_controller_manager.launch.xml new file mode 100644 index 0000000..b185e48 --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/launch/fake_moveit_controller_manager.launch.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/mycobot_280/mycobot_280_moveit/launch/firefighter_moveit_controller_manager.launch.xml b/mycobot_280/mycobot_280_moveit/launch/firefighter_moveit_controller_manager.launch.xml new file mode 100644 index 0000000..2c55c0b --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/launch/firefighter_moveit_controller_manager.launch.xml @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/mycobot_280/mycobot_280_moveit/launch/firefighter_moveit_sensor_manager.launch.xml b/mycobot_280/mycobot_280_moveit/launch/firefighter_moveit_sensor_manager.launch.xml new file mode 100644 index 0000000..5d02698 --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/launch/firefighter_moveit_sensor_manager.launch.xml @@ -0,0 +1,3 @@ + + + diff --git a/mycobot_280/mycobot_280_moveit/launch/gazebo.launch b/mycobot_280/mycobot_280_moveit/launch/gazebo.launch new file mode 100644 index 0000000..843f2b5 --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/launch/gazebo.launch @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280_moveit/launch/joystick_control.launch b/mycobot_280/mycobot_280_moveit/launch/joystick_control.launch new file mode 100644 index 0000000..9411f6e --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/launch/joystick_control.launch @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280_moveit/launch/move_group.launch b/mycobot_280/mycobot_280_moveit/launch/move_group.launch new file mode 100644 index 0000000..dd001f6 --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/launch/move_group.launch @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280_moveit/launch/moveit.rviz b/mycobot_280/mycobot_280_moveit/launch/moveit.rviz new file mode 100644 index 0000000..38b3736 --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/launch/moveit.rviz @@ -0,0 +1,250 @@ +Panels: + - Class: rviz/Displays + Help Height: 84 + Name: Displays + Property Tree Widget: + Expanded: + - /MotionPlanning1 + - /MotionPlanning1/Scene Geometry1 + - /MotionPlanning1/Scene Robot1 + - /MotionPlanning1/Planning Request1 + - /MotionPlanning1/Planned Path1 + Splitter Ratio: 0.742560029 + Tree Height: 325 + - Class: rviz/Help + Name: Help + - Class: rviz/Views + Expanded: + - /Current View1 + Name: Views + Splitter Ratio: 0.5 +Toolbars: + toolButtonStyle: 2 +Visualization Manager: + Class: "" + Displays: + - Alpha: 0.5 + Cell Size: 1 + Class: rviz/Grid + Color: 160; 160; 164 + Enabled: true + Line Style: + Line Width: 0.0299999993 + 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 + - Acceleration_Scaling_Factor: 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_Goal_Tolerance: 0 + MoveIt_Planning_Attempts: 10 + MoveIt_Planning_Time: 5 + MoveIt_Use_Constraint_Aware_IK: true + MoveIt_Warehouse_Host: 127.0.0.1 + MoveIt_Warehouse_Port: 33829 + MoveIt_Workspace: + Center: + X: 0 + Y: 0 + Z: 0 + Size: + X: 2 + Y: 2 + Z: 2 + Name: MotionPlanning + Planned Path: + Color Enabled: false + Interrupt Display: false + Links: + All Links Enabled: true + Expand Joint Details: false + Expand Link Details: false + Expand Tree: false + Link Tree Style: Links in Alphabetic Order + joint1: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint2: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint3: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint4: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint5: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint6: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint6_flange: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + 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 + Trail Step Size: 1 + Trajectory Topic: move_group/display_planned_path + Planning Metrics: + Payload: 1 + Show Joint Torques: false + Show Manipulability: false + Show Manipulability Index: false + Show Weight Limit: false + TextHeight: 0.0799999982 + 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: mycobot_arm + Query Goal State: true + Query Start State: true + Show Workspace: false + Start State Alpha: 1 + Start State Color: 0; 255; 0 + Planning Scene Topic: move_group/monitored_planning_scene + Robot Description: robot_description + Scene Geometry: + Scene Alpha: 1 + Scene Color: 50; 230; 50 + Scene Display Time: 0.200000003 + Show Scene Geometry: true + Voxel Coloring: Z-Axis + Voxel Rendering: Occupied Voxels + Scene Robot: + 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 + joint1: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint2: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint3: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint4: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint5: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint6: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint6_flange: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + Robot Alpha: 0.5 + Show Robot Collision: false + Show Robot Visual: false + Value: true + Velocity_Scaling_Factor: 1 + Enabled: true + Global Options: + Background Color: 48; 48; 48 + Default Light: true + Fixed Frame: joint1 + Frame Rate: 30 + Name: root + Tools: + - Class: rviz/Interact + Hide Inactive Objects: true + - Class: rviz/MoveCamera + - Class: rviz/Select + Value: true + Views: + Current: + Class: rviz/XYOrbit + Distance: 1.39158678 + Enable Stereo Rendering: + Stereo Eye Separation: 0.0599999987 + Stereo Focal Distance: 1 + Swap Stereo Eyes: false + Value: false + Focal Point: + X: 0.113567002 + Y: 0.105920002 + Z: 2.23518001e-07 + Focal Shape Fixed Size: true + Focal Shape Size: 0.0500000007 + Invert Z Axis: false + Name: Current View + Near Clip Distance: 0.00999999978 + Pitch: 0.439796686 + Target Frame: joint1 + Value: XYOrbit (rviz) + Yaw: 2.5317657 + Saved: ~ +Window Geometry: + Displays: + collapsed: false + Height: 1028 + Help: + collapsed: false + Hide Left Dock: false + Hide Right Dock: false + MotionPlanning: + collapsed: false + MotionPlanning - Trajectory Slider: + collapsed: false + QMainWindow State: 000000ff00000000fd0000000100000000000002ad000003befc0200000007fb000000100044006900730070006c0061007900730100000028000001da000000d700fffffffb0000000800480065006c00700000000342000000bb0000007300fffffffb0000000a0056006900650077007300000003b0000000b0000000ad00fffffffb0000000c00430061006d00650072006100000002ff000001610000000000000000fb0000001e004d006f00740069006f006e00200050006c0061006e006e0069006e00670100000374000001890000000000000000fb00000044004d006f00740069006f006e0050006c0061006e006e0069006e00670020002d0020005400720061006a006500630074006f0072007900200053006c006900640065007201000002080000004a0000004a00fffffffb0000001c004d006f00740069006f006e0050006c0061006e006e0069006e006701000002580000018e0000018300ffffff00000471000003be00000001000000020000000100000002fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 + Views: + collapsed: false + Width: 1828 + X: 92 + Y: 24 diff --git a/mycobot_280/mycobot_280_moveit/launch/moveit_rviz.launch b/mycobot_280/mycobot_280_moveit/launch/moveit_rviz.launch new file mode 100644 index 0000000..e7dbcf8 --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/launch/moveit_rviz.launch @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280_moveit/launch/mycobot_moveit.launch b/mycobot_280/mycobot_280_moveit/launch/mycobot_moveit.launch new file mode 100644 index 0000000..c9d76a5 --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/launch/mycobot_moveit.launch @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [move_group/fake_controller_joint_states] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280_moveit/launch/ompl_planning_pipeline.launch.xml b/mycobot_280/mycobot_280_moveit/launch/ompl_planning_pipeline.launch.xml new file mode 100644 index 0000000..8a63206 --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/launch/ompl_planning_pipeline.launch.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280_moveit/launch/planning_context.launch b/mycobot_280/mycobot_280_moveit/launch/planning_context.launch new file mode 100644 index 0000000..33e312a --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/launch/planning_context.launch @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280_moveit/launch/planning_pipeline.launch.xml b/mycobot_280/mycobot_280_moveit/launch/planning_pipeline.launch.xml new file mode 100644 index 0000000..0a33ffe --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/launch/planning_pipeline.launch.xml @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/mycobot_280/mycobot_280_moveit/launch/ros_controllers.launch b/mycobot_280/mycobot_280_moveit/launch/ros_controllers.launch new file mode 100644 index 0000000..9ba1940 --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/launch/ros_controllers.launch @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/mycobot_280/mycobot_280_moveit/launch/run_benchmark_ompl.launch b/mycobot_280/mycobot_280_moveit/launch/run_benchmark_ompl.launch new file mode 100644 index 0000000..c2d7f8f --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/launch/run_benchmark_ompl.launch @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280_moveit/launch/sensor_manager.launch.xml b/mycobot_280/mycobot_280_moveit/launch/sensor_manager.launch.xml new file mode 100644 index 0000000..3343e60 --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/launch/sensor_manager.launch.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280_moveit/launch/setup_assistant.launch b/mycobot_280/mycobot_280_moveit/launch/setup_assistant.launch new file mode 100644 index 0000000..86999f6 --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/launch/setup_assistant.launch @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280_moveit/launch/trajectory_execution.launch.xml b/mycobot_280/mycobot_280_moveit/launch/trajectory_execution.launch.xml new file mode 100644 index 0000000..5a235db --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/launch/trajectory_execution.launch.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280_moveit/launch/warehouse.launch b/mycobot_280/mycobot_280_moveit/launch/warehouse.launch new file mode 100644 index 0000000..bb12ee3 --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/launch/warehouse.launch @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280_moveit/launch/warehouse_settings.launch.xml b/mycobot_280/mycobot_280_moveit/launch/warehouse_settings.launch.xml new file mode 100644 index 0000000..e473b08 --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/launch/warehouse_settings.launch.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280_moveit/package.xml b/mycobot_280/mycobot_280_moveit/package.xml new file mode 100644 index 0000000..bdbbd71 --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/package.xml @@ -0,0 +1,40 @@ + + + mycobot_280_moveit + 0.3.0 + + An automatically generated package with all the configuration and launch files for using the firefighter with the MoveIt! Motion Planning Framework + + zachary + zachary + + BSD + + http://moveit.ros.org/ + https://github.com/ros-planning/moveit/issues + https://github.com/ros-planning/moveit + + catkin + + moveit_ros_move_group + moveit_fake_controller_manager + moveit_kinematics + moveit_planners_ompl + moveit_ros_visualization + moveit_setup_assistant + joint_state_publisher + robot_state_publisher + xacro + + + roscpp + rospy + std_msgs + actionlib + moveit_msgs + mycobot_description + + mycobot_description + + + diff --git a/mycobot_280/mycobot_280_moveit/scripts/path_planning_and_obstacle_avoidance_demo.py b/mycobot_280/mycobot_280_moveit/scripts/path_planning_and_obstacle_avoidance_demo.py new file mode 100644 index 0000000..cd4024d --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/scripts/path_planning_and_obstacle_avoidance_demo.py @@ -0,0 +1,137 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import rospy, roslib, sys +import moveit_commander +from moveit_msgs.msg import RobotTrajectory +from trajectory_msgs.msg import JointTrajectoryPoint + +from geometry_msgs.msg import PoseStamped, Pose +from tf.transformations import euler_from_quaternion, quaternion_from_euler + + +class MoveItPlanningDemo: + def __init__(self): + # API to initialize move_group,初始化move_group的API + moveit_commander.roscpp_initialize(sys.argv) + + # Initialize the ROS node,初始化ROS节点 + rospy.init_node("moveit_ik_demo") + + # Initialize the scene object to monitor changes in the external environment + # 初始化场景对象,用来监听外部环境的变化 + self.scene = moveit_commander.PlanningSceneInterface() + rospy.sleep(1) + + # Initialize self.arm group in the robotic arm that needs to be controlled by move group + # 初始化需要使用move group控制的机械臂中的self.arm group + self.arm = moveit_commander.MoveGroupCommander("arm_group") + + # Get the name of the terminal link,获取终端link的名称 + self.end_effector_link = self.arm.get_end_effector_link() + + # Set the reference coordinate system used for the target position + # 设置目标位置所使用的参考坐标系 + self.reference_frame = "joint1" + self.arm.set_pose_reference_frame(self.reference_frame) + + # Allow replanning when motion planning fails,当运动规划失败后,允许重新规划 + self.arm.allow_replanning(True) + + # Set the allowable error of position (unit: meter) and attitude (unit: radian) + # 设置位置(单位:米)和姿态(单位:弧度)的允许误差 + self.arm.set_goal_position_tolerance(0.01) + self.arm.set_goal_orientation_tolerance(0.05) + + def moving(self): + # # Control the robotic arm to return to the initialization position first + # 控制机械臂先回到初始化位置 + self.arm.set_named_target("init_pose") + self.arm.go() + rospy.sleep(2) + + # Set the target pose in the robotic arm workspace, the position is described by x, y, z coordinates, + # 设置机械臂工作空间中的目标位姿,位置使用x、y、z坐标描述, + # Pose is described by quaternion, based on base_link coordinate system + # 姿态使用四元数描述,基于base_link坐标系 + target_pose = PoseStamped() + target_pose.header.frame_id = self.reference_frame + target_pose.header.stamp = rospy.Time.now() + target_pose.pose.position.x = 0.132 + target_pose.pose.position.y = -0.150 + target_pose.pose.position.z = 0.075 + target_pose.pose.orientation.x = 0.026 + target_pose.pose.orientation.y = 1.0 + target_pose.pose.orientation.z = 0.0 + target_pose.pose.orientation.w = 0.014 + + # Set the current state of the robot arm as the initial state of motion + # 设置机器臂当前的状态作为运动初始状态 + self.arm.set_start_state_to_current_state() + + # Set the target pose of the terminal motion of the robotic arm + # 设置机械臂终端运动的目标位姿 + self.arm.set_pose_target(target_pose, self.end_effector_link) + + # Plan the movement path,规划运动路径 + traj = self.arm.plan() + + # Control the motion of the robotic arm according to the planned motion path + # 按照规划的运动路径控制机械臂运动 + self.arm.execute(traj) + rospy.sleep(1) + + # Control the terminal of the robotic arm to move 5cm to the right. Parameter 1 represents y, 0,1,2,3,4,5 represents xyzrpy + # 控制机械臂终端向右移动5cm 參數1是代表y, 0,1,2,3,4,5 代表xyzrpy + self.arm.shift_pose_target(1, 0.12, self.end_effector_link) + self.arm.go() + rospy.sleep(1) + + self.arm.shift_pose_target(1, 0.1, self.end_effector_link) + self.arm.go() + rospy.sleep(1) + + # Control the terminal of the robotic arm to rotate 90 degrees in the opposite direction. 0,1,2,3,4,5 represent xyzrpy + # 控制机械臂终端反向旋转90度 0,1,2,3,4,5 代表xyzrpy + # self.arm.shift_pose_target(3, -1.57, end_effector_link) + # self.arm.go() + # rospy.sleep(1) + + def run(self): + self.scene.remove_world_object("suit") + + # Run once without obstacles,没有障碍物运行一次 + self.moving() + + # Add environment,添加环境 + quat = quaternion_from_euler(3.1415, 0, -1.57) + + suit_post = PoseStamped() + suit_post.header.frame_id = self.reference_frame + suit_post.pose.position.x = 0.0 + suit_post.pose.position.y = 0.0 + suit_post.pose.position.z = -0.02 + suit_post.pose.orientation.x = quat[0] + suit_post.pose.orientation.y = quat[1] + suit_post.pose.orientation.z = quat[2] + suit_post.pose.orientation.w = quat[3] + + suit_path = ( + roslib.packages.get_pkg_dir("mycobot_description") + + "/urdf/mycobot/suit_env.dae" + ) + # need `pyassimp==3.3` + self.scene.add_mesh("suit", suit_post, suit_path) + rospy.sleep(2) + + # Run it again if there is an environmental impact,有环境影响后再运行一次 + self.moving() + + # close and exit moveit,关闭并退出moveit + moveit_commander.roscpp_shutdown() + moveit_commander.os._exit(0) + + +if __name__ == "__main__": + o = MoveItPlanningDemo() + o.run() diff --git a/mycobot_280/mycobot_280_moveit/scripts/sync_plan.py b/mycobot_280/mycobot_280_moveit/scripts/sync_plan.py new file mode 100644 index 0000000..4021613 --- /dev/null +++ b/mycobot_280/mycobot_280_moveit/scripts/sync_plan.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python2 +import time +import rospy +from sensor_msgs.msg import JointState + +from pymycobot.mycobot import MyCobot + + +mc = None + + +def callback(data): + rospy.loginfo(rospy.get_caller_id() + "%s", data) + data_list = [] + for index, value in enumerate(data.position): + # if index != 2: + # value *= -1 + data_list.append(value) + + mc.send_radians(data_list, 80) + + +def listener(): + global mc + rospy.init_node("mycobot_reciver", anonymous=True) + + port = rospy.get_param("~port", "/dev/ttyUSB0") + baud = rospy.get_param("~baud", 1000000) + print(port, baud) + mc = MyCobot(port, baud) + + rospy.Subscriber("joint_states", JointState, callback) + + # spin() simply keeps python from exiting until this node is stopped + # spin() 只是阻止 python 退出,直到该节点停止 + rospy.spin() + + +if __name__ == "__main__": + listener() diff --git a/mycobot_280/mycobot_280jn/CMakeLists.txt b/mycobot_280/mycobot_280jn/CMakeLists.txt new file mode 100644 index 0000000..8ce314b --- /dev/null +++ b/mycobot_280/mycobot_280jn/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 2.8.3) +project(mycobot_280jn) +add_compile_options(-std=c++11) + +## Find catkin and any catkin packages +find_package(catkin REQUIRED COMPONENTS + roscpp + rospy + std_msgs + actionlib + image_transport + cv_bridge +) + +## Declare a catkin package +catkin_package( + CATKIN_DEPENDS std_msgs actionlib +) + +## Build talker and listener +include_directories(include ${catkin_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS}) + +catkin_install_python(PROGRAMS + scripts/follow_display.py + scripts/slider_control.py + scripts/teleop_keyboard.py + scripts/listen_real.py + scripts/listen_real_of_topic.py + scripts/detect_marker.py + scripts/following_marker.py + scripts/follow_and_pump.py + scripts/simple_gui.py + DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +) + +install(DIRECTORY launch DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} + PATTERN "setup_assistant.launch" EXCLUDE) +install(DIRECTORY config DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}) + + diff --git a/mycobot_280/mycobot_280jn/LICENSE b/mycobot_280/mycobot_280jn/LICENSE new file mode 100644 index 0000000..b8468e6 --- /dev/null +++ b/mycobot_280/mycobot_280jn/LICENSE @@ -0,0 +1,25 @@ +BSD 2-Clause License + +Copyright (c) 2020, Elephant Robotics +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. + +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/mycobot_280/mycobot_280jn/config/mycobot.rviz b/mycobot_280/mycobot_280jn/config/mycobot.rviz new file mode 100644 index 0000000..51ba33e --- /dev/null +++ b/mycobot_280/mycobot_280jn/config/mycobot.rviz @@ -0,0 +1,203 @@ +Panels: + - Class: rviz/Displays + Help Height: 78 + Name: Displays + Property Tree Widget: + Expanded: + - /Global Options1 + - /Status1 + - /RobotModel1 + - /TF1 + Splitter Ratio: 0.5 + Tree Height: 775 + - Class: rviz/Selection + Name: Selection + - Class: rviz/Tool Properties + Expanded: + - /2D Pose Estimate1 + - /2D Nav Goal1 + - /Publish Point1 + Name: Tool Properties + Splitter Ratio: 0.588679016 + - Class: rviz/Views + Expanded: + - /Current View1 + Name: Views + Splitter Ratio: 0.5 + - Class: rviz/Time + Experimental: false + Name: Time + SyncMode: 0 + SyncSource: "" +Toolbars: + toolButtonStyle: 2 +Visualization Manager: + Class: "" + Displays: + - Alpha: 0.5 + Cell Size: 1 + Class: rviz/Grid + Color: 160; 160; 164 + Enabled: true + Line Style: + Line Width: 0.0299999993 + 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/RobotModel + Collision Enabled: false + 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 + joint1: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint2: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint3: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint4: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint5: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint6: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint6_flange: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + Name: RobotModel + Robot Description: robot_description + TF Prefix: "" + Update Interval: 0 + Value: true + Visual Enabled: true + - Class: rviz/TF + Enabled: true + Frame Timeout: 15 + Frames: + All Enabled: true + joint1: + Value: true + joint2: + Value: true + joint3: + Value: true + joint4: + Value: true + joint5: + Value: true + joint6: + Value: true + joint6_flange: + Value: true + Marker Scale: 0.300000012 + Name: TF + Show Arrows: true + Show Axes: true + Show Names: true + Tree: + joint1: + joint2: + joint3: + joint4: + joint5: + joint6: + joint6_flange: + {} + Update Interval: 0 + Value: true + Enabled: true + Global Options: + Background Color: 48; 48; 48 + Default Light: true + Fixed Frame: joint1 + Frame Rate: 30 + Name: root + Tools: + - Class: rviz/Interact + Hide Inactive Objects: true + - Class: rviz/MoveCamera + - Class: rviz/Select + - Class: rviz/FocusCamera + - Class: rviz/Measure + - Class: rviz/SetInitialPose + Topic: /initialpose + - Class: rviz/SetGoal + Topic: /move_base_simple/goal + - Class: rviz/PublishPoint + Single click: true + Topic: /clicked_point + Value: true + Views: + Current: + Class: rviz/Orbit + Distance: 1.20289087 + Enable Stereo Rendering: + Stereo Eye Separation: 0.0599999987 + Stereo Focal Distance: 1 + Swap Stereo Eyes: false + Value: false + Focal Point: + X: -0.0706475973 + Y: -0.0814988762 + Z: 0.107583851 + Focal Shape Fixed Size: true + Focal Shape Size: 0.0500000007 + Invert Z Axis: false + Name: Current View + Near Clip Distance: 0.00999999978 + Pitch: 0.440398335 + Target Frame: + Value: Orbit (rviz) + Yaw: 0.430389732 + Saved: ~ +Window Geometry: + Displays: + collapsed: false + Height: 1056 + Hide Left Dock: false + Hide Right Dock: false + QMainWindow State: 000000ff00000000fd00000004000000000000016a00000396fc0200000008fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000006100fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000002800000396000000d700fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261000000010000022f00000396fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073010000002800000396000000ad00fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e100000197000000030000073f0000003efc0100000002fb0000000800540069006d006501000000000000073f0000030000fffffffb0000000800540069006d006501000000000000045000000000000000000000039a0000039600000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 + Selection: + collapsed: false + Time: + collapsed: false + Tool Properties: + collapsed: false + Views: + collapsed: false + Width: 1855 + X: 65 + Y: 24 diff --git a/mycobot_280/mycobot_280jn/config/mycobot_with_marker.rviz b/mycobot_280/mycobot_280jn/config/mycobot_with_marker.rviz new file mode 100644 index 0000000..8b0dc7f --- /dev/null +++ b/mycobot_280/mycobot_280jn/config/mycobot_with_marker.rviz @@ -0,0 +1,216 @@ +Panels: + - Class: rviz/Displays + Help Height: 78 + Name: Displays + Property Tree Widget: + Expanded: + - /Global Options1 + - /Status1 + - /RobotModel1 + - /TF1 + - /Marker1 + - /Marker1/Namespaces1 + Splitter Ratio: 0.5 + Tree Height: 775 + - Class: rviz/Selection + Name: Selection + - Class: rviz/Tool Properties + Expanded: + - /2D Pose Estimate1 + - /2D Nav Goal1 + - /Publish Point1 + Name: Tool Properties + Splitter Ratio: 0.588679016 + - Class: rviz/Views + Expanded: + - /Current View1 + Name: Views + Splitter Ratio: 0.5 + - Class: rviz/Time + Experimental: false + Name: Time + SyncMode: 0 + SyncSource: "" +Toolbars: + toolButtonStyle: 2 +Visualization Manager: + Class: "" + Displays: + - Alpha: 0.5 + Cell Size: 1 + Class: rviz/Grid + Color: 160; 160; 164 + Enabled: true + Line Style: + Line Width: 0.0299999993 + 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/RobotModel + Collision Enabled: false + 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 + joint1: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint2: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint3: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint4: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint5: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint6: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint6_flange: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + Name: RobotModel + Robot Description: robot_description + TF Prefix: "" + Update Interval: 0 + Value: true + Visual Enabled: true + - Class: rviz/TF + Enabled: true + Frame Timeout: 15 + Frames: + All Enabled: true + basic_shapes: + Value: true + joint1: + Value: true + joint2: + Value: true + joint3: + Value: true + joint4: + Value: true + joint5: + Value: true + joint6: + Value: true + joint6_flange: + Value: true + Marker Scale: 0.300000012 + Name: TF + Show Arrows: true + Show Axes: true + Show Names: true + Tree: + joint1: + joint2: + joint3: + joint4: + joint5: + joint6: + joint6_flange: + basic_shapes: + {} + Update Interval: 0 + Value: true + - Class: rviz/Marker + Enabled: true + Marker Topic: /visualization_marker + Name: Marker + Namespaces: + basic_cube: true + Queue Size: 100 + Value: true + Enabled: true + Global Options: + Background Color: 48; 48; 48 + Default Light: true + Fixed Frame: joint1 + Frame Rate: 30 + Name: root + Tools: + - Class: rviz/Interact + Hide Inactive Objects: true + - Class: rviz/MoveCamera + - Class: rviz/Select + - Class: rviz/FocusCamera + - Class: rviz/Measure + - Class: rviz/SetInitialPose + Topic: /initialpose + - Class: rviz/SetGoal + Topic: /move_base_simple/goal + - Class: rviz/PublishPoint + Single click: true + Topic: /clicked_point + Value: true + Views: + Current: + Class: rviz/Orbit + Distance: 2.11990476 + Enable Stereo Rendering: + Stereo Eye Separation: 0.0599999987 + Stereo Focal Distance: 1 + Swap Stereo Eyes: false + Value: false + Focal Point: + X: -0.0706475973 + Y: -0.0814988762 + Z: 0.107583851 + Focal Shape Fixed Size: true + Focal Shape Size: 0.0500000007 + Invert Z Axis: false + Name: Current View + Near Clip Distance: 0.00999999978 + Pitch: 0.375398338 + Target Frame: + Value: Orbit (rviz) + Yaw: 0.235389769 + Saved: ~ +Window Geometry: + Displays: + collapsed: false + Height: 1056 + Hide Left Dock: false + Hide Right Dock: false + QMainWindow State: 000000ff00000000fd00000004000000000000016a00000396fc0200000008fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000006100fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000002800000396000000d700fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261000000010000022f00000396fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073010000002800000396000000ad00fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e100000197000000030000073f0000003efc0100000002fb0000000800540069006d006501000000000000073f0000030000fffffffb0000000800540069006d006501000000000000045000000000000000000000039a0000039600000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 + Selection: + collapsed: false + Time: + collapsed: false + Tool Properties: + collapsed: false + Views: + collapsed: false + Width: 1855 + X: 65 + Y: 24 diff --git a/mycobot_280/mycobot_280jn/launch/detect_marker.launch b/mycobot_280/mycobot_280jn/launch/detect_marker.launch new file mode 100644 index 0000000..444638e --- /dev/null +++ b/mycobot_280/mycobot_280jn/launch/detect_marker.launch @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn/launch/detect_marker_with_topic.launch b/mycobot_280/mycobot_280jn/launch/detect_marker_with_topic.launch new file mode 100644 index 0000000..2bba726 --- /dev/null +++ b/mycobot_280/mycobot_280jn/launch/detect_marker_with_topic.launch @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn/launch/mycobot_follow.launch b/mycobot_280/mycobot_280jn/launch/mycobot_follow.launch new file mode 100644 index 0000000..7511e1f --- /dev/null +++ b/mycobot_280/mycobot_280jn/launch/mycobot_follow.launch @@ -0,0 +1,13 @@ + + + + + + + + + ["joint_states"] + + + + diff --git a/mycobot_280/mycobot_280jn/launch/simple_gui.launch b/mycobot_280/mycobot_280jn/launch/simple_gui.launch new file mode 100644 index 0000000..0a8d47a --- /dev/null +++ b/mycobot_280/mycobot_280jn/launch/simple_gui.launch @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn/launch/slider_control.launch b/mycobot_280/mycobot_280jn/launch/slider_control.launch new file mode 100644 index 0000000..ac42e42 --- /dev/null +++ b/mycobot_280/mycobot_280jn/launch/slider_control.launch @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn/launch/teleop_keyboard.launch b/mycobot_280/mycobot_280jn/launch/teleop_keyboard.launch new file mode 100644 index 0000000..6e70fd2 --- /dev/null +++ b/mycobot_280/mycobot_280jn/launch/teleop_keyboard.launch @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn/launch/test.launch b/mycobot_280/mycobot_280jn/launch/test.launch new file mode 100644 index 0000000..dbb1f00 --- /dev/null +++ b/mycobot_280/mycobot_280jn/launch/test.launch @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn/package.xml b/mycobot_280/mycobot_280jn/package.xml new file mode 100644 index 0000000..8335d7e --- /dev/null +++ b/mycobot_280/mycobot_280jn/package.xml @@ -0,0 +1,47 @@ + + + mycobot_280jn + 0.3.0 + The mycobot 280jn package + + ZhangLijun + ZhangLijun + + BSD + + https://github.com/elephantrobotics/mycobot_ros + + catkin + + roscpp + rospy + std_msgs + actionlib + mycobot_description + mycobot_communication + + mycobot_communication + mycobot_description + + roscpp + rospy + std_msgs + actionlib + joint_state_publisher + joint_state_publisher_gui + robot_state_publisher + xacro + joy + rviz + controller_manager + python-tk + mycobot_description + mycobot_communication + + + + + + + + diff --git a/mycobot_280/mycobot_280jn/scripts/detect_marker.py b/mycobot_280/mycobot_280jn/scripts/detect_marker.py new file mode 100644 index 0000000..4283ea1 --- /dev/null +++ b/mycobot_280/mycobot_280jn/scripts/detect_marker.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python +import rospy +import cv2 as cv +import numpy as np +from cv_bridge import CvBridge, CvBridgeError +from sensor_msgs.msg import Image +import tf +from tf.broadcaster import TransformBroadcaster +import tf_conversions +from mycobot_communication.srv import ( + GetCoords, + SetCoords, + GetAngles, + SetAngles, + GripperStatus, +) + + +class ImageConverter: + def __init__(self): + self.br = TransformBroadcaster() + self.bridge = CvBridge() + self.aruco_dict = cv.aruco.Dictionary_get(cv.aruco.DICT_6X6_250) + self.aruo_params = cv.aruco.DetectorParameters_create() + calibrationParams = cv.FileStorage( + "calibrationFileName.xml", cv.FILE_STORAGE_READ + ) + self.dist_coeffs = calibrationParams.getNode("distCoeffs").mat() + self.camera_matrix = None + # subscriber, listen wether has img come in. 订阅者,监听是否有img + self.image_sub = rospy.Subscriber("/camera/image", Image, self.callback) + + def callback(self, data): + """Callback function. + + Process image with OpenCV, detect Mark to get the pose. Then acccording the + pose to transforming. + """ + try: + # trans `rgb` to `gbr` for opencv. 将 `rgb` 转换为 opencv 的 `gbr`。 + cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8") + except CvBridgeError as e: + print(e) + size = cv_image.shape + focal_length = size[1] + center = [size[1] / 2, size[0] / 2] + if self.camera_matrix is None: + # calc the camera matrix, if don't have.如果没有,则计算相机矩阵 + self.camera_matrix = np.array( + [ + [focal_length, 0, center[0]], + [0, focal_length, center[1]], + [0, 0, 1], + ], + dtype=np.float32, + ) + gray = cv.cvtColor(cv_image, cv.COLOR_BGR2GRAY) + # detect aruco marker.检测 aruco 标记 + ret = cv.aruco.detectMarkers(gray, self.aruco_dict, parameters=self.aruo_params) + corners, ids = ret[0], ret[1] + # process marker data.处理标记数据 + if len(corners) > 0: + if ids is not None: + # print('corners:', corners, 'ids:', ids) + + # detect marker pose. 检测marker位姿。 + # argument: + # marker corners,标记角 + # marker size (meter),标记尺寸(米) + ret = cv.aruco.estimatePoseSingleMarkers( + corners, 0.05, self.camera_matrix, self.dist_coeffs + ) + (rvec, tvec) = (ret[0], ret[1]) + (rvec - tvec).any() + + print("rvec:", rvec, "tvec:", tvec) + + # just select first one detected marker.只需选择第一个检测到的标记。 + for i in range(rvec.shape[0]): + cv.aruco.drawDetectedMarkers(cv_image, corners) + cv.aruco.drawAxis( + cv_image, + self.camera_matrix, + self.dist_coeffs, + rvec[i, :, :], + tvec[i, :, :], + 0.03, + ) + + xyz = tvec[0, 0, :] + xyz = [xyz[0] - 0.045, xyz[1], xyz[2] - 0.03] + + # get quaternion for ros. 为ros获取四元数 + euler = rvec[0, 0, :] + tf_change = tf.transformations.quaternion_from_euler( + euler[0], euler[1], euler[2] + ) + print("tf_change:", tf_change) + + # trans pose according [joint1],根据 [joint1] 变换姿势 + self.br.sendTransform( + xyz, tf_change, rospy.Time.now(), "basic_shapes", "joint6_flange" + ) + + # [x, y, z, -172, 3, -46.8] + cv.imshow("Image", cv_image) + + cv.waitKey(3) + try: + pass + except CvBridgeError as e: + print(e) + + +if __name__ == "__main__": + try: + rospy.init_node("detect_marker") + rospy.loginfo("Starting cv_bridge_test node") + ImageConverter() + rospy.spin() + except KeyboardInterrupt: + print("Shutting down cv_bridge_test node.") + cv.destroyAllWindows() diff --git a/mycobot_280/mycobot_280jn/scripts/follow_and_pump.py b/mycobot_280/mycobot_280jn/scripts/follow_and_pump.py new file mode 100644 index 0000000..3a26319 --- /dev/null +++ b/mycobot_280/mycobot_280jn/scripts/follow_and_pump.py @@ -0,0 +1,194 @@ +#!/usr/bin/env python2 +# coding:utf-8 +import rospy +from visualization_msgs.msg import Marker +import time +import os + +# Type of message communicated with mycobot,与 mycobot 通信的消息类型 +from mycobot_communication.msg import MycobotSetAngles, MycobotSetCoords, MycobotPumpStatus + + +rospy.init_node("gipper_subscriber", anonymous=True) + +# Control the topic of mycobot, followed by angle, coordinates, gripper +# 控制 mycobot 的 topic,依次是角度、坐标、夹爪 +angle_pub = rospy.Publisher("mycobot/angles_goal", + MycobotSetAngles, queue_size=5) +coord_pub = rospy.Publisher("mycobot/coords_goal", + MycobotSetCoords, queue_size=5) +# 判断设备:ttyUSB*为M5;ttyACM*为wio,Judging equipment: ttyUSB* is M5;ttyACM* is wio +robot = os.popen("ls /dev/ttyUSB*").readline() + +if "dev" in robot: + Pin = [2, 5] +else: + Pin = [20, 21] + +pump_pub = rospy.Publisher("mycobot/pump_status", + MycobotPumpStatus, queue_size=5) + +# instantiate the message object,实例化消息对象 +angles = MycobotSetAngles() +coords = MycobotSetCoords() +pump = MycobotPumpStatus() + +# Deviation value from mycobot's real position,与 mycobot 真实位置的偏差值 +x_offset = -20 +y_offset = 20 +z_offset = 110 + +# With this variable limit, the fetching behavior is only done once +# 通过该变量限制,抓取行为只做一次 +flag = False + +# In order to compare whether the QR code moves later,为了后面比较二维码是否移动 +temp_x = temp_y = temp_z = 0.0 + +temp_time = time.time() + + +def pub_coords(x, y, z, rx=-150, ry=10, rz=-90, sp=70, m=2): + """Post coordinates,发布坐标""" + coords.x = x + coords.y = y + coords.z = z + coords.rx = rx + coords.ry = ry + coords.rz = rz + coords.speed = 70 + coords.model = m + # print(coords) + coord_pub.publish(coords) + + +def pub_angles(a, b, c, d, e, f, sp): + """Publishing angle,发布角度""" + angles.joint_1 = float(a) + angles.joint_2 = float(b) + angles.joint_3 = float(c) + angles.joint_4 = float(d) + angles.joint_5 = float(e) + angles.joint_6 = float(f) + angles.speed = sp + angle_pub.publish(angles) + + +def pub_pump(flag, Pin): + """Publish gripper status,发布夹爪状态""" + pump.Status = flag + pump.Pin1 = Pin[0] + pump.Pin2 = Pin[1] + pump_pub.publish(pump) + + +def target_is_moving(x, y, z): + """Determine whether the target moves""" + """判断目标是否移动""" + count = 0 + for o, n in zip((x, y, z), (temp_x, temp_y, temp_z)): + print(o, n) + if abs(o - n) < 2: + count += 1 + print(count) + if count == 3: + return False + return True + + +def grippercallback(data): + """callback function,回调函数""" + global flag, temp_x, temp_y, temp_z + # rospy.loginfo('gripper_subscriber get date :%s', data) + if flag: + return + + # Parse out the coordinate value,解析出坐标值 + # pump length: 88mm + x = float(format(data.pose.position.x * 1000, ".2f")) + y = float(format(data.pose.position.y * 1000, ".2f")) + z = float(format(data.pose.position.z * 1000, ".2f")) + + # When the running time is less than 30s, or the target position is still changing, perform tracking behavior + # 当运行时间小于 30s,或目标位置还在改变时,进行追踪行为 + if ( + time.time() - temp_time < 30 + or (temp_x == temp_y == temp_z == 0.0) + or target_is_moving(x - x_offset, y - y_offset, z) + ): + + x -= x_offset + y -= y_offset + pub_coords(x - 20, y, 280) + time.sleep(0.1) + + temp_x, temp_y, temp_z = x, y, z + return + else: #Indicates that the target is stationary and can try to grab, 表示目标处于静止状态,可以尝试抓取 + + print(x, y, z) + + # detect heigth + pump height + limit height + offset + x += x_offset + y += y_offset + z = z + 88 + z_offset + + pub_coords(x, y, z) + time.sleep(2.5) + + # down + for i in range(1, 17): + pub_coords(x, y, z - i * 5, rx=-160, sp=10) + time.sleep(0.1) + + time.sleep(2) + + pub_pump(True, Pin) + # pump on + + pub_coords(x, y, z + 20, -165) + time.sleep(1.5) + + pub_angles(0, 30, -50, -40, 0, 0, 50) + time.sleep(1.5) + + put_z = 140 + pub_coords(39.4, -174.7, put_z, -177.13, -4.13, -152.59, 70, 2) + time.sleep(1.5) + + for i in range(1, 8): + pub_coords(39.4, -174.7, put_z - i * 5, - + 177.13, -4.13, -152.59, 15, 2) + time.sleep(0.1) + + pub_pump(False, Pin) + + time.sleep(0.5) + + pub_angles(0, 30, -50, -40, 0, 0, 50) + time.sleep(1.5) + + # finally + flag = True + + +def main(): + for _ in range(10): + # pub_coords(150, 20, 220, -175, 0, -90, 70, 2) + pub_angles(0, 30, -50, -40, 0, 0, 50) + # pub_angles(random.randint(-30, 30), random.randint(-30, 30), random.randint(-30, 30), random.randint(-30, 30), random.randint(-30, 30), random.randint(-30, 30), 70) + time.sleep(0.5) + + pub_pump(False, Pin) + # time.sleep(2.5) + + # subscribers to mark information,mark 信息的订阅者 + rospy.Subscriber("visualization_marker", Marker, + grippercallback, queue_size=1) + + print("gripper test") + rospy.spin() + + +if __name__ == "__main__": + main() diff --git a/mycobot_280/mycobot_280jn/scripts/follow_display.py b/mycobot_280/mycobot_280jn/scripts/follow_display.py new file mode 100644 index 0000000..0815622 --- /dev/null +++ b/mycobot_280/mycobot_280jn/scripts/follow_display.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python2 +import time + +import rospy +from sensor_msgs.msg import JointState +from std_msgs.msg import Header +from visualization_msgs.msg import Marker + +from pymycobot.mycobot import MyCobot + + +def talker(): + rospy.init_node("display", anonymous=True) + + print("Try connect real mycobot...") + port = rospy.get_param("~port", "/dev/ttyTHS1") + baud = rospy.get_param("~baud", 1000000) + print("port: {}, baud: {}\n".format(port, baud)) + try: + mycobot = MyCobot(port, baud) + except Exception as e: + print(e) + print( + """\ + \rTry connect mycobot failed! + \rPlease check wether connected with mycobot. + \rPlease chckt wether the port or baud is right. + """ + ) + exit(1) + mycobot.release_all_servos() + time.sleep(0.1) + print("Rlease all servos over.\n") + + pub = rospy.Publisher("joint_states", JointState, queue_size=10) + pub_marker = rospy.Publisher("visualization_marker", Marker, queue_size=10) + rate = rospy.Rate(30) # 30hz + + # pub joint state + joint_state_send = JointState() + joint_state_send.header = Header() + + joint_state_send.name = [ + "joint2_to_joint1", + "joint3_to_joint2", + "joint4_to_joint3", + "joint5_to_joint4", + "joint6_to_joint5", + "joint6output_to_joint6", + ] + joint_state_send.velocity = [0] + joint_state_send.effort = [] + + marker_ = Marker() + marker_.header.frame_id = "/joint1" + marker_.ns = "my_namespace" + + print("publishing ...") + while not rospy.is_shutdown(): + joint_state_send.header.stamp = rospy.Time.now() + + angles = mycobot.get_radians() + data_list = [] + for index, value in enumerate(angles): + data_list.append(value) + + # rospy.loginfo('{}'.format(data_list)) + joint_state_send.position = data_list + + pub.publish(joint_state_send) + + coords = mycobot.get_coords() + + # marker + marker_.header.stamp = rospy.Time.now() + marker_.type = marker_.SPHERE + marker_.action = marker_.ADD + marker_.scale.x = 0.04 + marker_.scale.y = 0.04 + marker_.scale.z = 0.04 + + # marker position initial.标记位置初始 + # print(coords) + if not coords: + coords = [0, 0, 0, 0, 0, 0] + rospy.loginfo("error [101]: can not get coord values") + + marker_.pose.position.x = coords[1] / 1000 * -1 + marker_.pose.position.y = coords[0] / 1000 + marker_.pose.position.z = coords[2] / 1000 + + marker_.color.a = 1.0 + marker_.color.g = 1.0 + pub_marker.publish(marker_) + + rate.sleep() + + +if __name__ == "__main__": + try: + talker() + except rospy.ROSInterruptException: + pass diff --git a/mycobot_280/mycobot_280jn/scripts/following_marker.py b/mycobot_280/mycobot_280jn/scripts/following_marker.py new file mode 100644 index 0000000..797ec1e --- /dev/null +++ b/mycobot_280/mycobot_280jn/scripts/following_marker.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python2 +import time + +import rospy +from sensor_msgs.msg import JointState +from std_msgs.msg import Header +from visualization_msgs.msg import Marker +import tf + + +def talker(): + rospy.init_node("following_marker", anonymous=True) + + pub_marker = rospy.Publisher("visualization_marker", Marker, queue_size=10) + rate = rospy.Rate(20) + + listener = tf.TransformListener() + + marker_ = Marker() + marker_.header.frame_id = "/joint1" + marker_.ns = "basic_cube" + + print("publishing ...") + while not rospy.is_shutdown(): + now = rospy.Time.now() - rospy.Duration(0.1) + + try: + trans, rot = listener.lookupTransform("joint1", "basic_shapes", now) + except Exception as e: + print(e) + continue + + print(type(trans), trans) + print(type(rot), rot) + + # marker + marker_.header.stamp = now + marker_.type = marker_.CUBE + marker_.action = marker_.ADD + marker_.scale.x = 0.04 + marker_.scale.y = 0.04 + marker_.scale.z = 0.04 + + # marker position initial,标记位置初始化 + marker_.pose.position.x = trans[0] + marker_.pose.position.y = trans[1] + marker_.pose.position.z = trans[2] + marker_.pose.orientation.x = rot[0] + marker_.pose.orientation.y = rot[1] + marker_.pose.orientation.z = rot[2] + marker_.pose.orientation.w = rot[3] + + marker_.color.a = 1.0 + marker_.color.g = 1.0 + pub_marker.publish(marker_) + + rate.sleep() + + +if __name__ == "__main__": + try: + talker() + except rospy.ROSInterruptException: + pass diff --git a/mycobot_280/mycobot_280jn/scripts/listen_real.py b/mycobot_280/mycobot_280jn/scripts/listen_real.py new file mode 100644 index 0000000..5e4d9bc --- /dev/null +++ b/mycobot_280/mycobot_280jn/scripts/listen_real.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python2 +# license removed for brevity +import time +import math + +import rospy +from sensor_msgs.msg import JointState +from std_msgs.msg import Header +from mycobot_communication.srv import GetAngles + + +def talker(): + rospy.loginfo("start ...") + rospy.init_node("real_listener", anonymous=True) + pub = rospy.Publisher("joint_states", JointState, queue_size=10) + rate = rospy.Rate(30) # 30hz + + # pub joint state,发布关节状态 + joint_state_send = JointState() + joint_state_send.header = Header() + + joint_state_send.name = [ + "joint2_to_joint1", + "joint3_to_joint2", + "joint4_to_joint3", + "joint5_to_joint4", + "joint6_to_joint5", + "joint6output_to_joint6", + ] + joint_state_send.velocity = [0] + joint_state_send.effort = [] + + # waiting util server `get_joint_angles` enable.等待'get_joint_angles'服务启用 + rospy.loginfo("wait service") + rospy.wait_for_service("get_joint_angles") + func = rospy.ServiceProxy("get_joint_angles", GetAngles) + + rospy.loginfo("start loop ...") + while not rospy.is_shutdown(): + # get real angles from server.从服务器获得真实的角度。 + res = func() + if res.joint_1 == res.joint_2 == res.joint_3 == 0.0: + continue + radians_list = [ + res.joint_1 * (math.pi / 180), + res.joint_2 * (math.pi / 180), + res.joint_3 * (math.pi / 180), + res.joint_4 * (math.pi / 180), + res.joint_5 * (math.pi / 180), + res.joint_6 * (math.pi / 180), + ] + rospy.loginfo("res: {}".format(radians_list)) + + # publish angles.发布角度 + joint_state_send.header.stamp = rospy.Time.now() + joint_state_send.position = radians_list + pub.publish(joint_state_send) + rate.sleep() + + +if __name__ == "__main__": + try: + talker() + except rospy.ROSInterruptException: + pass diff --git a/mycobot_280/mycobot_280jn/scripts/listen_real_of_topic.py b/mycobot_280/mycobot_280jn/scripts/listen_real_of_topic.py new file mode 100644 index 0000000..ea3df92 --- /dev/null +++ b/mycobot_280/mycobot_280jn/scripts/listen_real_of_topic.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python2 +import math + +import rospy +from sensor_msgs.msg import JointState +from std_msgs.msg import Header +from mycobot_communication.msg import MycobotAngles + + +class Listener(object): + def __init__(self): + super(Listener, self).__init__() + + rospy.loginfo("start ...") + rospy.init_node("real_listener_1", anonymous=True) + # init publisher.初始化发布者 + self.pub = rospy.Publisher("joint_states", JointState, queue_size=10) + # init subscriber.初始化订阅者 + self.sub = rospy.Subscriber("mycobot/angles_real", MycobotAngles, self.callback) + rospy.spin() + + def callback(self, data): + """`mycobot/angles_real` subscriber callback method. + + Args: + data (MycobotAngles): callback argument. + """ + # ini publisher object. 初始化发布者对象 + joint_state_send = JointState() + joint_state_send.header = Header() + + joint_state_send.name = [ + "joint2_to_joint1", + "joint3_to_joint2", + "joint4_to_joint3", + "joint5_to_joint4", + "joint6_to_joint5", + "joint6output_to_joint6", + ] + joint_state_send.velocity = [0] + joint_state_send.effort = [] + joint_state_send.header.stamp = rospy.Time.now() + + # process callback data. 处理回调数据。 + radians_list = [ + data.joint_1 * (math.pi / 180), + data.joint_2 * (math.pi / 180), + data.joint_3 * (math.pi / 180), + data.joint_4 * (math.pi / 180), + data.joint_5 * (math.pi / 180), + data.joint_6 * (math.pi / 180), + ] + rospy.loginfo("res: {}".format(radians_list)) + + joint_state_send.position = radians_list + self.pub.publish(joint_state_send) + + +if __name__ == "__main__": + try: + Listener() + except rospy.ROSInterruptException: + pass diff --git a/mycobot_280/mycobot_280jn/scripts/simple_gui.py b/mycobot_280/mycobot_280jn/scripts/simple_gui.py new file mode 100644 index 0000000..9f4c791 --- /dev/null +++ b/mycobot_280/mycobot_280jn/scripts/simple_gui.py @@ -0,0 +1,478 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +import Tkinter as tk +from mycobot_communication.srv import GetCoords, SetCoords, GetAngles, SetAngles, GripperStatus +import rospy +import time +from rospy import ServiceException + + +class Window: + def __init__(self, handle): + self.win = handle + self.win.resizable(0, 0) # fixed window size,固定窗口大小 + + self.model = 0 + self.speed = rospy.get_param("~speed", 50) + + # set default speed,设置默认速度 + self.speed_d = tk.StringVar() + self.speed_d.set(str(self.speed)) + # print(self.speed) + self.connect_ser() + + # Get the data of the robotic arm,获取机械臂数据 + self.record_coords = [0, 0, 0, 0, 0, 0, self.speed, self.model] + self.res_angles = [0, 0, 0, 0, 0, 0, self.speed, self.model] + self.get_date() + + # get screen width and height.获取屏幕宽度和高度 + self.ws = self.win.winfo_screenwidth() # width of the screen + self.hs = self.win.winfo_screenheight() # height of the screen + # calculate x and y coordinates for the Tk root window + # 计算 Tk 根窗口的 x 和 y 坐标 + x = (self.ws / 2) - 190 + y = (self.hs / 2) - 250 + self.win.geometry("430x370+{}+{}".format(x, y)) + # layout,布局 + self.set_layout() + # input section,输入部分 + self.need_input() + # Show part,展示部分 + self.show_init() + + # Set the joint buttons 设置joint按钮 + tk.Button(self.frmLT, text="设置", width=5, command=self.get_joint_input).grid( + row=6, column=1, sticky="w", padx=3, pady=2 + ) + + # coordination settings button,coordination 设置按钮 + tk.Button(self.frmRT, text="设置", width=5, command=self.get_coord_input).grid( + row=6, column=1, sticky="w", padx=3, pady=2 + ) + + # Gripper switch button,夹爪开关按钮 + tk.Button(self.frmLB, text="夹爪(开)", command=self.gripper_open, width=5).grid( + row=1, column=0, sticky="w", padx=3, pady=50 + ) + tk.Button(self.frmLB, text="夹爪(关)", command=self.gripper_close, width=5).grid( + row=1, column=1, sticky="w", padx=3, pady=2 + ) + + def connect_ser(self): + rospy.init_node("simple_gui", anonymous=True, disable_signals=True) + + rospy.wait_for_service("get_joint_angles") + rospy.wait_for_service("set_joint_angles") + rospy.wait_for_service("get_joint_coords") + rospy.wait_for_service("set_joint_coords") + rospy.wait_for_service("switch_gripper_status") + try: + self.get_coords = rospy.ServiceProxy("get_joint_coords", GetCoords) + self.set_coords = rospy.ServiceProxy("set_joint_coords", SetCoords) + self.get_angles = rospy.ServiceProxy("get_joint_angles", GetAngles) + self.set_angles = rospy.ServiceProxy("set_joint_angles", SetAngles) + self.switch_gripper = rospy.ServiceProxy( + "switch_gripper_status", GripperStatus + ) + except: + print("start error ...") + exit(1) + + print("Connect service success.") + + def set_layout(self): + self.frmLT = tk.Frame(width=200, height=200) + self.frmLC = tk.Frame(width=200, height=200) + self.frmLB = tk.Frame(width=200, height=200) + self.frmRT = tk.Frame(width=200, height=200) + self.frmLT.grid(row=0, column=0, padx=1, pady=3) + self.frmLC.grid(row=1, column=0, padx=1, pady=3) + self.frmLB.grid(row=1, column=1, padx=2, pady=3) + self.frmRT.grid(row=0, column=1, padx=2, pady=3) + + def need_input(self): + # input hint,输入提示 + tk.Label(self.frmLT, text="Joint 1 ").grid(row=0) + tk.Label(self.frmLT, text="Joint 2 ").grid(row=1) # the second row,第二行 + tk.Label(self.frmLT, text="Joint 3 ").grid(row=2) + tk.Label(self.frmLT, text="Joint 4 ").grid(row=3) + tk.Label(self.frmLT, text="Joint 5 ").grid(row=4) + tk.Label(self.frmLT, text="Joint 6 ").grid(row=5) + + tk.Label(self.frmRT, text=" x ").grid(row=0) + tk.Label(self.frmRT, text=" y ").grid(row=1) # the second row,第二行 + tk.Label(self.frmRT, text=" z ").grid(row=2) + tk.Label(self.frmRT, text=" rx ").grid(row=3) + tk.Label(self.frmRT, text=" ry ").grid(row=4) + tk.Label(self.frmRT, text=" rz ").grid(row=5) + + # Set the default value of the input box,设置输入框的默认值 + self.j1_default = tk.StringVar() + self.j1_default.set(self.res_angles[0]) + self.j2_default = tk.StringVar() + self.j2_default.set(self.res_angles[1]) + self.j3_default = tk.StringVar() + self.j3_default.set(self.res_angles[2]) + self.j4_default = tk.StringVar() + self.j4_default.set(self.res_angles[3]) + self.j5_default = tk.StringVar() + self.j5_default.set(self.res_angles[4]) + self.j6_default = tk.StringVar() + self.j6_default.set(self.res_angles[5]) + + self.x_default = tk.StringVar() + self.x_default.set(self.record_coords[0]) + self.y_default = tk.StringVar() + self.y_default.set(self.record_coords[1]) + self.z_default = tk.StringVar() + self.z_default.set(self.record_coords[2]) + self.rx_default = tk.StringVar() + self.rx_default.set(self.record_coords[3]) + self.ry_default = tk.StringVar() + self.ry_default.set(self.record_coords[4]) + self.rz_default = tk.StringVar() + self.rz_default.set(self.record_coords[5]) + + # joint input box,joint 输入框 + self.J_1 = tk.Entry(self.frmLT, textvariable=self.j1_default) + self.J_1.grid(row=0, column=1, pady=3) + self.J_2 = tk.Entry(self.frmLT, textvariable=self.j2_default) + self.J_2.grid(row=1, column=1, pady=3) + self.J_3 = tk.Entry(self.frmLT, textvariable=self.j3_default) + self.J_3.grid(row=2, column=1, pady=3) + self.J_4 = tk.Entry(self.frmLT, textvariable=self.j4_default) + self.J_4.grid(row=3, column=1, pady=3) + self.J_5 = tk.Entry(self.frmLT, textvariable=self.j5_default) + self.J_5.grid(row=4, column=1, pady=3) + self.J_6 = tk.Entry(self.frmLT, textvariable=self.j6_default) + self.J_6.grid(row=5, column=1, pady=3) + + # coord input box,coord 输入框 + self.x = tk.Entry(self.frmRT, textvariable=self.x_default) + self.x.grid(row=0, column=1, pady=3, padx=0) + self.y = tk.Entry(self.frmRT, textvariable=self.y_default) + self.y.grid(row=1, column=1, pady=3) + self.z = tk.Entry(self.frmRT, textvariable=self.z_default) + self.z.grid(row=2, column=1, pady=3) + self.rx = tk.Entry(self.frmRT, textvariable=self.rx_default) + self.rx.grid(row=3, column=1, pady=3) + self.ry = tk.Entry(self.frmRT, textvariable=self.ry_default) + self.ry.grid(row=4, column=1, pady=3) + self.rz = tk.Entry(self.frmRT, textvariable=self.rz_default) + self.rz.grid(row=5, column=1, pady=3) + + # All input boxes, used to get the input data,所有输入框,用于拿输入的数据 + self.all_j = [self.J_1, self.J_2, self.J_3, self.J_4, self.J_5, self.J_6] + self.all_c = [self.x, self.y, self.z, self.rx, self.ry, self.rz] + + # speed input box,速度输入框 + tk.Label( + self.frmLB, + text="speed", + ).grid(row=0, column=0) + self.get_speed = tk.Entry(self.frmLB, textvariable=self.speed_d, width=10) + self.get_speed.grid(row=0, column=1) + + def show_init(self): + # show,显示 + tk.Label(self.frmLC, text="Joint 1 ").grid(row=0) + tk.Label(self.frmLC, text="Joint 2 ").grid(row=1) # the second row,第二行 + tk.Label(self.frmLC, text="Joint 3 ").grid(row=2) + tk.Label(self.frmLC, text="Joint 4 ").grid(row=3) + tk.Label(self.frmLC, text="Joint 5 ").grid(row=4) + tk.Label(self.frmLC, text="Joint 6 ").grid(row=5) + + # get数据 + + # show,展示出来 + self.cont_1 = tk.StringVar(self.frmLC) + self.cont_1.set(str(self.res_angles[0]) + "°") + self.cont_2 = tk.StringVar(self.frmLC) + self.cont_2.set(str(self.res_angles[1]) + "°") + self.cont_3 = tk.StringVar(self.frmLC) + self.cont_3.set(str(self.res_angles[2]) + "°") + self.cont_4 = tk.StringVar(self.frmLC) + self.cont_4.set(str(self.res_angles[3]) + "°") + self.cont_5 = tk.StringVar(self.frmLC) + self.cont_5.set(str(self.res_angles[4]) + "°") + self.cont_6 = tk.StringVar(self.frmLC) + self.cont_6.set(str(self.res_angles[5]) + "°") + self.cont_all = [ + self.cont_1, + self.cont_2, + self.cont_3, + self.cont_4, + self.cont_5, + self.cont_6, + self.speed, + self.model, + ] + + self.show_j1 = tk.Label( + self.frmLC, + textvariable=self.cont_1, + font=("Arial", 9), + width=7, + height=1, + bg="white", + ).grid(row=0, column=1, padx=0, pady=5) + + self.show_j2 = tk.Label( + self.frmLC, + textvariable=self.cont_2, + font=("Arial", 9), + width=7, + height=1, + bg="white", + ).grid(row=1, column=1, padx=0, pady=5) + self.show_j3 = tk.Label( + self.frmLC, + textvariable=self.cont_3, + font=("Arial", 9), + width=7, + height=1, + bg="white", + ).grid(row=2, column=1, padx=0, pady=5) + self.show_j4 = tk.Label( + self.frmLC, + textvariable=self.cont_4, + font=("Arial", 9), + width=7, + height=1, + bg="white", + ).grid(row=3, column=1, padx=0, pady=5) + self.show_j5 = tk.Label( + self.frmLC, + textvariable=self.cont_5, + font=("Arial", 9), + width=7, + height=1, + bg="white", + ).grid(row=4, column=1, padx=0, pady=5) + self.show_j6 = tk.Label( + self.frmLC, + textvariable=self.cont_6, + font=("Arial", 9), + width=7, + height=1, + bg="white", + ).grid(row=5, column=1, padx=5, pady=5) + + self.all_jo = [ + self.show_j1, + self.show_j2, + self.show_j3, + self.show_j4, + self.show_j5, + self.show_j6, + ] + + # show,显示 + tk.Label(self.frmLC, text=" x ").grid(row=0, column=3) + tk.Label(self.frmLC, text=" y ").grid(row=1, column=3) + tk.Label(self.frmLC, text=" z ").grid(row=2, column=3) + tk.Label(self.frmLC, text=" rx ").grid(row=3, column=3) + tk.Label(self.frmLC, text=" ry ").grid(row=4, column=3) + tk.Label(self.frmLC, text=" rz ").grid(row=5, column=3) + self.coord_x = tk.StringVar() + self.coord_x.set(str(self.record_coords[0])) + self.coord_y = tk.StringVar() + self.coord_y.set(str(self.record_coords[1])) + self.coord_z = tk.StringVar() + self.coord_z.set(str(self.record_coords[2])) + self.coord_rx = tk.StringVar() + self.coord_rx.set(str(self.record_coords[3])) + self.coord_ry = tk.StringVar() + self.coord_ry.set(str(self.record_coords[4])) + self.coord_rz = tk.StringVar() + self.coord_rz.set(str(self.record_coords[5])) + + self.coord_all = [ + self.coord_x, + self.coord_y, + self.coord_z, + self.coord_rx, + self.coord_ry, + self.coord_rz, + self.speed, + self.model, + ] + + self.show_x = tk.Label( + self.frmLC, + textvariable=self.coord_x, + font=("Arial", 9), + width=7, + height=1, + bg="white", + ).grid(row=0, column=4, padx=5, pady=5) + self.show_y = tk.Label( + self.frmLC, + textvariable=self.coord_y, + font=("Arial", 9), + width=7, + height=1, + bg="white", + ).grid(row=1, column=4, padx=5, pady=5) + self.show_z = tk.Label( + self.frmLC, + textvariable=self.coord_z, + font=("Arial", 9), + width=7, + height=1, + bg="white", + ).grid(row=2, column=4, padx=5, pady=5) + self.show_rx = tk.Label( + self.frmLC, + textvariable=self.coord_rx, + font=("Arial", 9), + width=7, + height=1, + bg="white", + ).grid(row=3, column=4, padx=5, pady=5) + self.show_ry = tk.Label( + self.frmLC, + textvariable=self.coord_ry, + font=("Arial", 9), + width=7, + height=1, + bg="white", + ).grid(row=4, column=4, padx=5, pady=5) + self.show_rz = tk.Label( + self.frmLC, + textvariable=self.coord_rz, + font=("Arial", 9), + width=7, + height=1, + bg="white", + ).grid(row=5, column=4, padx=5, pady=5) + + # mm, Unit show,单位展示 + self.unit = tk.StringVar() + self.unit.set("mm") + for i in range(6): + tk.Label(self.frmLC, textvariable=self.unit, font=("Arial", 9)).grid( + row=i, column=5 + ) + + def gripper_open(self): + try: + self.switch_gripper(True) + except ServiceException: + # Probably because the method has no return value, the service throws an unhandled error + # 可能由于该方法没有返回值,服务抛出无法处理的错误 + pass + + def gripper_close(self): + try: + self.switch_gripper(False) + except ServiceException: + pass + + def get_coord_input(self): + # Get the data input by coord and send it to the robotic arm + # 获取 coord 输入的数据,发送给机械臂 + c_value = [] + for i in self.all_c: + # print(type(i.get())) + c_value.append(float(i.get())) + self.speed = ( + int(float(self.get_speed.get())) if self.get_speed.get() else self.speed + ) + c_value.append(self.speed) + c_value.append(self.model) + # print(c_value) + try: + self.set_coords(*c_value) + except ServiceException: + pass + self.show_j_date(c_value[:-2], "coord") + + def get_joint_input(self): + # Get the data input by the joint and send it to the robotic arm + # 获取joint输入的数据,发送给机械臂 + j_value = [] + for i in self.all_j: + # print(type(i.get())) + j_value.append(float(i.get())) + self.speed = ( + int(float(self.get_speed.get())) if self.get_speed.get() else self.speed + ) + j_value.append(self.speed) + + try: + self.set_angles(*j_value) + except ServiceException: + pass + self.show_j_date(j_value[:-1]) + # return j_value,c_value,speed + + def get_date(self): + # Take the data of the robotic arm for display.拿机械臂的数据,用于展示 + t = time.time() + while time.time() - t < 2: + self.res = self.get_coords() + if self.res.x > 1: + break + time.sleep(0.1) + + t = time.time() + while time.time() - t < 2: + self.angles = self.get_angles() + if self.angles.joint_1 > 1: + break + time.sleep(0.1) + # print(self.angles.joint_1) + self.record_coords = [ + round(self.res.x, 2), + round(self.res.y, 2), + round(self.res.z, 2), + round(self.res.rx, 2), + round(self.res.ry, 2), + round(self.res.rz, 2), + self.speed, + self.model, + ] + self.res_angles = [ + round(self.angles.joint_1, 2), + round(self.angles.joint_2, 2), + round(self.angles.joint_3, 2), + round(self.angles.joint_4, 2), + round(self.angles.joint_5, 2), + round(self.angles.joint_6, 2), + ] + # print('coord:',self.record_coords) + # print('angles:',self.res_angles) + + # def send_input(self,dates): + def show_j_date(self, date, way=""): + # Show data,展示数据 + if way == "coord": + for i, j in zip(date, self.coord_all): + # print(i) + j.set(str(i)) + else: + for i, j in zip(date, self.cont_all): + j.set(str(i) + "°") + + def run(self): + while True: + try: + self.win.update() + time.sleep(0.001) + except tk.TclError as e: + if "application has been destroyed" in str(e): + break + else: + raise + + +def main(): + window = tk.Tk() + window.title("mycobot ros GUI") + Window(window).run() + + +if __name__ == "__main__": + main() diff --git a/mycobot_280/mycobot_280jn/scripts/slider_control.py b/mycobot_280/mycobot_280jn/scripts/slider_control.py new file mode 100644 index 0000000..a40abc0 --- /dev/null +++ b/mycobot_280/mycobot_280jn/scripts/slider_control.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python2 + +"""[summary] +This file obtains the joint angle of the manipulator in ROS, +and then sends it directly to the real manipulator using `pymycobot` API. +This file is [slider_control.launch] related script. +Passable parameters: + port: serial prot string. Defaults is '/dev/ttyTHS1' + baud: serial prot baudrate. Defaults is 1000000. +""" + +import rospy +from sensor_msgs.msg import JointState + +from pymycobot.mycobot import MyCobot + + +mc = None + + +def callback(data): + # rospy.loginfo(rospy.get_caller_id() + "%s", data.position) + print(data.position) + data_list = [] + for index, value in enumerate(data.position): + data_list.append(value) + + mc.send_radians(data_list, 80) + # time.sleep(0.5) + + +def listener(): + global mc + rospy.init_node("control_slider", anonymous=True) + + rospy.Subscriber("joint_states", JointState, callback) + port = rospy.get_param("~port", "/dev/ttyTHS1") + baud = rospy.get_param("~baud", 1000000) + print(port, baud) + mc = MyCobot(port, baud) + + # spin() simply keeps python from exiting until this node is stopped + # spin()只是阻止python退出,直到该节点停止 + print("spin ...") + rospy.spin() + + +if __name__ == "__main__": + listener() diff --git a/mycobot_280/mycobot_280jn/scripts/teleop_keyboard.py b/mycobot_280/mycobot_280jn/scripts/teleop_keyboard.py new file mode 100644 index 0000000..6bb47af --- /dev/null +++ b/mycobot_280/mycobot_280jn/scripts/teleop_keyboard.py @@ -0,0 +1,174 @@ +#!/usr/bin/env python +from __future__ import print_function +from mycobot_communication.srv import GetCoords, SetCoords, GetAngles, SetAngles, GripperStatus +import rospy +import sys +import select +import termios +import tty +import time + +import roslib + +# Terminal output prompt information. 终端输出提示信息 +msg = """\ +Mycobot Teleop Keyboard Controller +--------------------------- +Movimg options(control coordinations [x,y,z,rx,ry,rz]): + w(x+) + + a(y-) s(x-) d(y+) + + z(z-) x(z+) + +u(rx+) i(ry+) o(rz+) +j(rx-) k(ry-) l(rz-) + +Gripper control: + g - open + h - close + +Other: + 1 - Go to init pose + 2 - Go to home pose + 3 - Resave home pose + q - Quit +""" + + +def vels(speed, turn): + return "currently:\tspeed: %s\tchange percent: %s " % (speed, turn) + + +class Raw(object): + def __init__(self, stream): + self.stream = stream + self.fd = self.stream.fileno() + + def __enter__(self): + self.original_stty = termios.tcgetattr(self.stream) + tty.setcbreak(self.stream) + + def __exit__(self, type, value, traceback): + termios.tcsetattr(self.stream, termios.TCSANOW, self.original_stty) + + +def teleop_keyboard(): + rospy.init_node("teleop_keyboard") + + model = 0 + speed = rospy.get_param("~speed", 50) + change_percent = rospy.get_param("~change_percent", 5) + + change_angle = 180 * change_percent / 100 + change_len = 250 * change_percent / 100 + + rospy.wait_for_service("get_joint_angles") + rospy.wait_for_service("set_joint_angles") + rospy.wait_for_service("get_joint_coords") + rospy.wait_for_service("set_joint_coords") + rospy.wait_for_service("switch_gripper_status") + print("service ready.") + try: + get_coords = rospy.ServiceProxy("get_joint_coords", GetCoords) + set_coords = rospy.ServiceProxy("set_joint_coords", SetCoords) + get_angles = rospy.ServiceProxy("get_joint_angles", GetAngles) + set_angles = rospy.ServiceProxy("set_joint_angles", SetAngles) + switch_gripper = rospy.ServiceProxy( + "switch_gripper_status", GripperStatus) + except: + print("start error ...") + exit(1) + + init_pose = [0, 0, 0, 0, 0, 0, speed] + home_pose = [0, 8, -127, 40, 0, 0, speed] + + # rsp = set_angles(*init_pose) + + while True: + res = get_coords() + if res.x > 1: + break + time.sleep(0.1) + + record_coords = [res.x, res.y, res.z, res.rx, res.ry, res.rz, speed, model] + print(record_coords) + + try: + print(msg) + print(vels(speed, change_percent)) + # Keyboard keys call different motion functions. 键盘按键调用不同的运动功能 + while 1: + try: + # print("\r current coords: %s" % record_coords, end="") + with Raw(sys.stdin): + key = sys.stdin.read(1) + if key == "q": + break + elif key in ["w", "W"]: + record_coords[0] += change_len + set_coords(*record_coords) + elif key in ["s", "S"]: + record_coords[0] -= change_len + set_coords(*record_coords) + elif key in ["a", "A"]: + record_coords[1] -= change_len + set_coords(*record_coords) + elif key in ["d", "D"]: + record_coords[1] += change_len + set_coords(*record_coords) + elif key in ["z", "Z"]: + record_coords[2] -= change_len + set_coords(*record_coords) + elif key in ["x", "X"]: + record_coords[2] += change_len + set_coords(*record_coords) + elif key in ["u", "U"]: + record_coords[3] += change_angle + set_coords(*record_coords) + elif key in ["j", "J"]: + record_coords[3] -= change_angle + set_coords(*record_coords) + elif key in ["i", "I"]: + record_coords[4] += change_angle + set_coords(*record_coords) + elif key in ["k", "K"]: + record_coords[4] -= change_angle + set_coords(*record_coords) + elif key in ["o", "O"]: + record_coords[5] += change_angle + set_coords(*record_coords) + elif key in ["l", "L"]: + record_coords[5] -= change_angle + set_coords(*record_coords) + elif key in ["g", "G"]: + switch_gripper(True) + elif key in ["h", "H"]: + switch_gripper(False) + elif key == "1": + rsp = set_angles(*init_pose) + elif key in "2": + rsp = set_angles(*home_pose) + elif key in "3": + rep = get_angles() + home_pose[0] = rep.joint_1 + home_pose[1] = rep.joint_2 + home_pose[2] = rep.joint_3 + home_pose[3] = rep.joint_4 + home_pose[5] = rep.joint_5 + else: + continue + + except Exception as e: + # print(e) + continue + + except Exception as e: + print(e) + + +if __name__ == "__main__": + try: + teleop_keyboard() + except rospy.ROSInterruptException: + pass diff --git a/mycobot_280/mycobot_280jn/src/camera_display.cpp b/mycobot_280/mycobot_280jn/src/camera_display.cpp new file mode 100644 index 0000000..1f3abeb --- /dev/null +++ b/mycobot_280/mycobot_280jn/src/camera_display.cpp @@ -0,0 +1,29 @@ +#include +#include +#include +#include + +void imageCallback(const sensor_msgs::ImageConstPtr &msg) +{ + try + { + cv::imshow("view", cv_bridge::toCvShare(msg, "bgr8")->image); + cv::waitKey(30); + } + catch (cv_bridge::Exception &e) + { + ROS_ERROR("Could not convert from '%s' to 'bgr8'.", msg->encoding.c_str()); + } +} + +int main(int argc, char **argv) +{ + ros::init(argc, argv, "image_listener"); + ros::NodeHandle nh; + cv::namedWindow("view"); + cv::startWindowThread(); + image_transport::ImageTransport it(nh); + image_transport::Subscriber sub = it.subscribe("camera/image", 1, imageCallback); + ros::spin(); + cv::destroyWindow("view"); +} diff --git a/mycobot_280/mycobot_280jn/src/opencv_camera.cpp b/mycobot_280/mycobot_280jn/src/opencv_camera.cpp new file mode 100644 index 0000000..6501814 --- /dev/null +++ b/mycobot_280/mycobot_280jn/src/opencv_camera.cpp @@ -0,0 +1,60 @@ +#include +#include +#include +#include +#include // for converting the command line parameter to integer,用于将命令行参数转换为整数 + +int main(int argc, char **argv) +{ + // Check if video source has been passed as a parameter,检查视频源是否已作为参数传递 + if (argv[1] == NULL) + { + ROS_INFO("argv[1]=NULL\n"); + return 1; + } + + ros::init(argc, argv, "image_publisher"); // Initialize node,初始化节点 + ros::NodeHandle nh; + image_transport::ImageTransport it(nh); + image_transport::Publisher pub = it.advertise("camera/image", 1); // Publish topic,发布话题 + + ros::Rate loop_rate(200); // refresh Hz. + + // Convert the passed as command line parameter index for the video device to an integer, + // 将作为命令行参数传递的视频设备索引转换为整数 + std::istringstream video_sourceCmd(argv[1]); + int video_source; + // Check if it is indeed a number,检查它是否确实是一个数字 + if (!(video_sourceCmd >> video_source)) + { + ROS_INFO("video_sourceCmd is %d\n", video_source); + return 1; + } + + cv::VideoCapture cap(video_source); + // Check if video device can be opened with the given index,检查是否可以使用给定的索引打开视频设备 + if (!cap.isOpened()) + { + ROS_INFO("can not opencv video device\n"); + return 1; + } + cv::Mat frame; + sensor_msgs::ImagePtr msg; + + while (nh.ok()) + { + cap >> frame; + // cv::imshow("veiwer", frame); + // Check if grabbed frame is actually full with some content,检查抓取的帧是否实际上充满了一些内容 + if (!frame.empty()) + { + msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", frame).toImageMsg(); + pub.publish(msg); + //cv::Wait(1); + } + ros::spinOnce(); + loop_rate.sleep(); + // if(cv::waitKey(2) >= 0) + // break; + } +} diff --git a/mycobot_280/mycobot_280jn_moveit/.setup_assistant b/mycobot_280/mycobot_280jn_moveit/.setup_assistant new file mode 100644 index 0000000..9c5b74e --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/.setup_assistant @@ -0,0 +1,11 @@ +moveit_setup_assistant_config: + URDF: + package: mycobot_description + relative_path: urdf/jetsonNano/mycobot_urdf.urdf + xacro_args: "--inorder " + SRDF: + relative_path: config/firefighter.srdf + CONFIG: + author_name: zachary + author_email: lijun.zhang@elephantrobotics.com + generated_timestamp: 1626074107 diff --git a/mycobot_280/mycobot_280jn_moveit/CMakeLists.txt b/mycobot_280/mycobot_280jn_moveit/CMakeLists.txt new file mode 100644 index 0000000..6d02a2a --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/CMakeLists.txt @@ -0,0 +1,22 @@ +cmake_minimum_required(VERSION 2.8.3) +project(mycobot_280jn_moveit) + +find_package(catkin REQUIRED + rospy + std_msgs + moveit_msgs +) + +catkin_package() + +## Mark executable scripts (Python etc.) for installation +## in contrast to setup.py, you can choose the destination +catkin_install_python(PROGRAMS + scripts/sync_plan.py + scripts/path_planning_and_obstacle_avoidance_demo.py + DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +) + +install(DIRECTORY launch DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} + PATTERN "setup_assistant.launch" EXCLUDE) +install(DIRECTORY config DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}) diff --git a/mycobot_280/mycobot_280jn_moveit/LICENSE b/mycobot_280/mycobot_280jn_moveit/LICENSE new file mode 100644 index 0000000..b8468e6 --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/LICENSE @@ -0,0 +1,25 @@ +BSD 2-Clause License + +Copyright (c) 2020, Elephant Robotics +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. + +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/mycobot_280/mycobot_280jn_moveit/config/chomp_planning.yaml b/mycobot_280/mycobot_280jn_moveit/config/chomp_planning.yaml new file mode 100644 index 0000000..75258e5 --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/config/chomp_planning.yaml @@ -0,0 +1,18 @@ +planning_time_limit: 10.0 +max_iterations: 200 +max_iterations_after_collision_free: 5 +smoothness_cost_weight: 0.1 +obstacle_cost_weight: 1.0 +learning_rate: 0.01 +smoothness_cost_velocity: 0.0 +smoothness_cost_acceleration: 1.0 +smoothness_cost_jerk: 0.0 +ridge_factor: 0.01 +use_pseudo_inverse: false +pseudo_inverse_ridge_factor: 1e-4 +joint_update_limit: 0.1 +collision_clearence: 0.2 +collision_threshold: 0.07 +use_stochastic_descent: true +enable_failure_recovery: true +max_recovery_attempts: 5 \ No newline at end of file diff --git a/mycobot_280/mycobot_280jn_moveit/config/fake_controllers.yaml b/mycobot_280/mycobot_280jn_moveit/config/fake_controllers.yaml new file mode 100644 index 0000000..47a2eb3 --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/config/fake_controllers.yaml @@ -0,0 +1,9 @@ +controller_list: + - name: fake_arm_group_controller + joints: + - joint2_to_joint1 + - joint3_to_joint2 + - joint4_to_joint3 + - joint5_to_joint4 + - joint6_to_joint5 + - joint6output_to_joint6 \ No newline at end of file diff --git a/mycobot_280/mycobot_280jn_moveit/config/firefighter.srdf b/mycobot_280/mycobot_280jn_moveit/config/firefighter.srdf new file mode 100644 index 0000000..1c94891 --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/config/firefighter.srdf @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn_moveit/config/joint_limits.yaml b/mycobot_280/mycobot_280jn_moveit/config/joint_limits.yaml new file mode 100644 index 0000000..6e9612a --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/config/joint_limits.yaml @@ -0,0 +1,34 @@ +# joint_limits.yaml allows the dynamics properties specified in the URDF to be overwritten or augmented as needed +# 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: + joint2_to_joint1: + has_velocity_limits: false + max_velocity: 0 + has_acceleration_limits: false + max_acceleration: 0 + joint3_to_joint2: + has_velocity_limits: false + max_velocity: 0 + has_acceleration_limits: false + max_acceleration: 0 + joint4_to_joint3: + has_velocity_limits: false + max_velocity: 0 + has_acceleration_limits: false + max_acceleration: 0 + joint5_to_joint4: + has_velocity_limits: false + max_velocity: 0 + has_acceleration_limits: false + max_acceleration: 0 + joint6_to_joint5: + has_velocity_limits: false + max_velocity: 0 + has_acceleration_limits: false + max_acceleration: 0 + joint6output_to_joint6: + has_velocity_limits: false + max_velocity: 0 + has_acceleration_limits: false + max_acceleration: 0 \ No newline at end of file diff --git a/mycobot_280/mycobot_280jn_moveit/config/kinematics.yaml b/mycobot_280/mycobot_280jn_moveit/config/kinematics.yaml new file mode 100644 index 0000000..031b273 --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/config/kinematics.yaml @@ -0,0 +1,5 @@ +arm_group: + kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin + kinematics_solver_search_resolution: 0.005 + kinematics_solver_timeout: 0.005 + kinematics_solver_attempts: 3 \ No newline at end of file diff --git a/mycobot_280/mycobot_280jn_moveit/config/ompl_planning.yaml b/mycobot_280/mycobot_280jn_moveit/config/ompl_planning.yaml new file mode 100644 index 0000000..3f4d0c2 --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/config/ompl_planning.yaml @@ -0,0 +1,150 @@ +planner_configs: + SBL: + type: geometric::SBL + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + EST: + type: geometric::EST + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0 setup() + goal_bias: 0.05 # When close to goal select goal, with this probability. default: 0.05 + LBKPIECE: + type: geometric::LBKPIECE + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + border_fraction: 0.9 # Fraction of time focused on boarder default: 0.9 + min_valid_path_fraction: 0.5 # Accept partially valid moves above fraction. default: 0.5 + BKPIECE: + type: geometric::BKPIECE + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + border_fraction: 0.9 # Fraction of time focused on boarder default: 0.9 + failed_expansion_score_factor: 0.5 # When extending motion fails, scale score by factor. default: 0.5 + min_valid_path_fraction: 0.5 # Accept partially valid moves above fraction. default: 0.5 + KPIECE: + type: geometric::KPIECE + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + goal_bias: 0.05 # When close to goal select goal, with this probability. default: 0.05 + border_fraction: 0.9 # Fraction of time focused on boarder default: 0.9 (0.0,1.] + failed_expansion_score_factor: 0.5 # When extending motion fails, scale score by factor. default: 0.5 + min_valid_path_fraction: 0.5 # Accept partially valid moves above fraction. default: 0.5 + RRT: + type: geometric::RRT + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + goal_bias: 0.05 # When close to goal select goal, with this probability? default: 0.05 + RRTConnect: + type: geometric::RRTConnect + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + RRTstar: + type: geometric::RRTstar + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + goal_bias: 0.05 # When close to goal select goal, with this probability? default: 0.05 + delay_collision_checking: 1 # Stop collision checking as soon as C-free parent found. default 1 + TRRT: + type: geometric::TRRT + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + goal_bias: 0.05 # When close to goal select goal, with this probability? default: 0.05 + max_states_failed: 10 # when to start increasing temp. default: 10 + temp_change_factor: 2.0 # how much to increase or decrease temp. default: 2.0 + min_temperature: 10e-10 # lower limit of temp change. default: 10e-10 + init_temperature: 10e-6 # initial temperature. default: 10e-6 + frountier_threshold: 0.0 # dist new state to nearest neighbor to disqualify as frontier. default: 0.0 set in setup() + frountierNodeRatio: 0.1 # 1/10, or 1 nonfrontier for every 10 frontier. default: 0.1 + k_constant: 0.0 # value used to normalize expresssion. default: 0.0 set in setup() + PRM: + type: geometric::PRM + max_nearest_neighbors: 10 # use k nearest neighbors. default: 10 + PRMstar: + type: geometric::PRMstar + FMT: + type: geometric::FMT + num_samples: 1000 # number of states that the planner should sample. default: 1000 + radius_multiplier: 1.1 # multiplier used for the nearest neighbors search radius. default: 1.1 + nearest_k: 1 # use Knearest strategy. default: 1 + cache_cc: 1 # use collision checking cache. default: 1 + heuristics: 0 # activate cost to go heuristics. default: 0 + extended_fmt: 1 # activate the extended FMT*: adding new samples if planner does not finish successfully. default: 1 + BFMT: + type: geometric::BFMT + num_samples: 1000 # number of states that the planner should sample. default: 1000 + radius_multiplier: 1.0 # multiplier used for the nearest neighbors search radius. default: 1.0 + nearest_k: 1 # use the Knearest strategy. default: 1 + balanced: 0 # exploration strategy: balanced true expands one tree every iteration. False will select the tree with lowest maximum cost to go. default: 1 + optimality: 1 # termination strategy: optimality true finishes when the best possible path is found. Otherwise, the algorithm will finish when the first feasible path is found. default: 1 + heuristics: 1 # activates cost to go heuristics. default: 1 + cache_cc: 1 # use the collision checking cache. default: 1 + extended_fmt: 1 # Activates the extended FMT*: adding new samples if planner does not finish successfully. default: 1 + PDST: + type: geometric::PDST + STRIDE: + type: geometric::STRIDE + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + goal_bias: 0.05 # When close to goal select goal, with this probability. default: 0.05 + use_projected_distance: 0 # whether nearest neighbors are computed based on distances in a projection of the state rather distances in the state space itself. default: 0 + degree: 16 # desired degree of a node in the Geometric Near-neightbor Access Tree (GNAT). default: 16 + max_degree: 18 # max degree of a node in the GNAT. default: 12 + min_degree: 12 # min degree of a node in the GNAT. default: 12 + max_pts_per_leaf: 6 # max points per leaf in the GNAT. default: 6 + estimated_dimension: 0.0 # estimated dimension of the free space. default: 0.0 + min_valid_path_fraction: 0.2 # Accept partially valid moves above fraction. default: 0.2 + BiTRRT: + type: geometric::BiTRRT + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + temp_change_factor: 0.1 # how much to increase or decrease temp. default: 0.1 + init_temperature: 100 # initial temperature. default: 100 + frountier_threshold: 0.0 # dist new state to nearest neighbor to disqualify as frontier. default: 0.0 set in setup() + frountier_node_ratio: 0.1 # 1/10, or 1 nonfrontier for every 10 frontier. default: 0.1 + cost_threshold: 1e300 # the cost threshold. Any motion cost that is not better will not be expanded. default: inf + LBTRRT: + type: geometric::LBTRRT + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + goal_bias: 0.05 # When close to goal select goal, with this probability. default: 0.05 + epsilon: 0.4 # optimality approximation factor. default: 0.4 + BiEST: + type: geometric::BiEST + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + ProjEST: + type: geometric::ProjEST + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + goal_bias: 0.05 # When close to goal select goal, with this probability. default: 0.05 + LazyPRM: + type: geometric::LazyPRM + range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() + LazyPRMstar: + type: geometric::LazyPRMstar + SPARS: + type: geometric::SPARS + stretch_factor: 3.0 # roadmap spanner stretch factor. multiplicative upper bound on path quality. It does not make sense to make this parameter more than 3. default: 3.0 + sparse_delta_fraction: 0.25 # delta fraction for connection distance. This value represents the visibility range of sparse samples. default: 0.25 + dense_delta_fraction: 0.001 # delta fraction for interface detection. default: 0.001 + max_failures: 1000 # maximum consecutive failure limit. default: 1000 + SPARStwo: + type: geometric::SPARStwo + stretch_factor: 3.0 # roadmap spanner stretch factor. multiplicative upper bound on path quality. It does not make sense to make this parameter more than 3. default: 3.0 + sparse_delta_fraction: 0.25 # delta fraction for connection distance. This value represents the visibility range of sparse samples. default: 0.25 + dense_delta_fraction: 0.001 # delta fraction for interface detection. default: 0.001 + max_failures: 5000 # maximum consecutive failure limit. default: 5000 +arm_group: + default_planner_config: None + planner_configs: + - SBL + - EST + - LBKPIECE + - BKPIECE + - KPIECE + - RRT + - RRTConnect + - RRTstar + - TRRT + - PRM + - PRMstar + - FMT + - BFMT + - PDST + - STRIDE + - BiTRRT + - LBTRRT + - BiEST + - ProjEST + - LazyPRM + - LazyPRMstar + - SPARS + - SPARStwo + projection_evaluator: joints(joint2_to_joint1,joint3_to_joint2) + longest_valid_segment_fraction: 0.005 \ No newline at end of file diff --git a/mycobot_280/mycobot_280jn_moveit/config/ros_controllers.yaml b/mycobot_280/mycobot_280jn_moveit/config/ros_controllers.yaml new file mode 100644 index 0000000..6b814df --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/config/ros_controllers.yaml @@ -0,0 +1,26 @@ +# Simulation settings for using moveit_sim_controllers +moveit_sim_hw_interface: + joint_model_group: arm_group + joint_model_group_pose: init_pose +# Settings for ros_control_boilerplate control loop +generic_hw_control_loop: + loop_hz: 300 + cycle_time_error_threshold: 0.01 +# Settings for ros_control hardware interface +hardware_interface: + joints: + - vitual_joint + - joint2_to_joint1 + - joint3_to_joint2 + - joint4_to_joint3 + - joint5_to_joint4 + - joint6_to_joint5 + - joint6output_to_joint6 + sim_control_mode: 1 # 0: position, 1: velocity +# Publish all joint states +# Creates the /joint_states topic necessary in ROS +joint_state_controller: + type: joint_state_controller/JointStateController + publish_rate: 50 +controller_list: + [] \ No newline at end of file diff --git a/mycobot_280/mycobot_280jn_moveit/config/sensors_3d.yaml b/mycobot_280/mycobot_280jn_moveit/config/sensors_3d.yaml new file mode 100644 index 0000000..a4bb13e --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/config/sensors_3d.yaml @@ -0,0 +1,10 @@ +# The name of this file shouldn't be changed, or else the Setup Assistant won't detect it +sensors: + - filtered_cloud_topic: filtered_cloud + max_range: 5.0 + max_update_rate: 1.0 + padding_offset: 0.1 + padding_scale: 1.0 + point_cloud_topic: /head_mount_kinect/depth_registered/points + point_subsample: 1 + sensor_plugin: occupancy_map_monitor/PointCloudOctomapUpdater \ No newline at end of file diff --git a/mycobot_280/mycobot_280jn_moveit/launch/chomp_planning_pipeline.launch.xml b/mycobot_280/mycobot_280jn_moveit/launch/chomp_planning_pipeline.launch.xml new file mode 100644 index 0000000..f9900e0 --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/launch/chomp_planning_pipeline.launch.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn_moveit/launch/default_warehouse_db.launch b/mycobot_280/mycobot_280jn_moveit/launch/default_warehouse_db.launch new file mode 100644 index 0000000..f73ad4c --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/launch/default_warehouse_db.launch @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn_moveit/launch/demo.launch b/mycobot_280/mycobot_280jn_moveit/launch/demo.launch new file mode 100644 index 0000000..c4c7843 --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/launch/demo.launch @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [move_group/fake_controller_joint_states] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn_moveit/launch/demo_gazebo.launch b/mycobot_280/mycobot_280jn_moveit/launch/demo_gazebo.launch new file mode 100644 index 0000000..874d7b8 --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/launch/demo_gazebo.launch @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [/joint_states] + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn_moveit/launch/fake_moveit_controller_manager.launch.xml b/mycobot_280/mycobot_280jn_moveit/launch/fake_moveit_controller_manager.launch.xml new file mode 100644 index 0000000..6212c52 --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/launch/fake_moveit_controller_manager.launch.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn_moveit/launch/firefighter_moveit_controller_manager.launch.xml b/mycobot_280/mycobot_280jn_moveit/launch/firefighter_moveit_controller_manager.launch.xml new file mode 100644 index 0000000..ee39303 --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/launch/firefighter_moveit_controller_manager.launch.xml @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn_moveit/launch/firefighter_moveit_sensor_manager.launch.xml b/mycobot_280/mycobot_280jn_moveit/launch/firefighter_moveit_sensor_manager.launch.xml new file mode 100644 index 0000000..5d02698 --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/launch/firefighter_moveit_sensor_manager.launch.xml @@ -0,0 +1,3 @@ + + + diff --git a/mycobot_280/mycobot_280jn_moveit/launch/gazebo.launch b/mycobot_280/mycobot_280jn_moveit/launch/gazebo.launch new file mode 100644 index 0000000..74bea9a --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/launch/gazebo.launch @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn_moveit/launch/joystick_control.launch b/mycobot_280/mycobot_280jn_moveit/launch/joystick_control.launch new file mode 100644 index 0000000..9411f6e --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/launch/joystick_control.launch @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn_moveit/launch/move_group.launch b/mycobot_280/mycobot_280jn_moveit/launch/move_group.launch new file mode 100644 index 0000000..258f295 --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/launch/move_group.launch @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn_moveit/launch/moveit.rviz b/mycobot_280/mycobot_280jn_moveit/launch/moveit.rviz new file mode 100644 index 0000000..38b3736 --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/launch/moveit.rviz @@ -0,0 +1,250 @@ +Panels: + - Class: rviz/Displays + Help Height: 84 + Name: Displays + Property Tree Widget: + Expanded: + - /MotionPlanning1 + - /MotionPlanning1/Scene Geometry1 + - /MotionPlanning1/Scene Robot1 + - /MotionPlanning1/Planning Request1 + - /MotionPlanning1/Planned Path1 + Splitter Ratio: 0.742560029 + Tree Height: 325 + - Class: rviz/Help + Name: Help + - Class: rviz/Views + Expanded: + - /Current View1 + Name: Views + Splitter Ratio: 0.5 +Toolbars: + toolButtonStyle: 2 +Visualization Manager: + Class: "" + Displays: + - Alpha: 0.5 + Cell Size: 1 + Class: rviz/Grid + Color: 160; 160; 164 + Enabled: true + Line Style: + Line Width: 0.0299999993 + 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 + - Acceleration_Scaling_Factor: 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_Goal_Tolerance: 0 + MoveIt_Planning_Attempts: 10 + MoveIt_Planning_Time: 5 + MoveIt_Use_Constraint_Aware_IK: true + MoveIt_Warehouse_Host: 127.0.0.1 + MoveIt_Warehouse_Port: 33829 + MoveIt_Workspace: + Center: + X: 0 + Y: 0 + Z: 0 + Size: + X: 2 + Y: 2 + Z: 2 + Name: MotionPlanning + Planned Path: + Color Enabled: false + Interrupt Display: false + Links: + All Links Enabled: true + Expand Joint Details: false + Expand Link Details: false + Expand Tree: false + Link Tree Style: Links in Alphabetic Order + joint1: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint2: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint3: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint4: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint5: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint6: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint6_flange: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + 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 + Trail Step Size: 1 + Trajectory Topic: move_group/display_planned_path + Planning Metrics: + Payload: 1 + Show Joint Torques: false + Show Manipulability: false + Show Manipulability Index: false + Show Weight Limit: false + TextHeight: 0.0799999982 + 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: mycobot_arm + Query Goal State: true + Query Start State: true + Show Workspace: false + Start State Alpha: 1 + Start State Color: 0; 255; 0 + Planning Scene Topic: move_group/monitored_planning_scene + Robot Description: robot_description + Scene Geometry: + Scene Alpha: 1 + Scene Color: 50; 230; 50 + Scene Display Time: 0.200000003 + Show Scene Geometry: true + Voxel Coloring: Z-Axis + Voxel Rendering: Occupied Voxels + Scene Robot: + 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 + joint1: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint2: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint3: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint4: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint5: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint6: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + joint6_flange: + Alpha: 1 + Show Axes: false + Show Trail: false + Value: true + Robot Alpha: 0.5 + Show Robot Collision: false + Show Robot Visual: false + Value: true + Velocity_Scaling_Factor: 1 + Enabled: true + Global Options: + Background Color: 48; 48; 48 + Default Light: true + Fixed Frame: joint1 + Frame Rate: 30 + Name: root + Tools: + - Class: rviz/Interact + Hide Inactive Objects: true + - Class: rviz/MoveCamera + - Class: rviz/Select + Value: true + Views: + Current: + Class: rviz/XYOrbit + Distance: 1.39158678 + Enable Stereo Rendering: + Stereo Eye Separation: 0.0599999987 + Stereo Focal Distance: 1 + Swap Stereo Eyes: false + Value: false + Focal Point: + X: 0.113567002 + Y: 0.105920002 + Z: 2.23518001e-07 + Focal Shape Fixed Size: true + Focal Shape Size: 0.0500000007 + Invert Z Axis: false + Name: Current View + Near Clip Distance: 0.00999999978 + Pitch: 0.439796686 + Target Frame: joint1 + Value: XYOrbit (rviz) + Yaw: 2.5317657 + Saved: ~ +Window Geometry: + Displays: + collapsed: false + Height: 1028 + Help: + collapsed: false + Hide Left Dock: false + Hide Right Dock: false + MotionPlanning: + collapsed: false + MotionPlanning - Trajectory Slider: + collapsed: false + QMainWindow State: 000000ff00000000fd0000000100000000000002ad000003befc0200000007fb000000100044006900730070006c0061007900730100000028000001da000000d700fffffffb0000000800480065006c00700000000342000000bb0000007300fffffffb0000000a0056006900650077007300000003b0000000b0000000ad00fffffffb0000000c00430061006d00650072006100000002ff000001610000000000000000fb0000001e004d006f00740069006f006e00200050006c0061006e006e0069006e00670100000374000001890000000000000000fb00000044004d006f00740069006f006e0050006c0061006e006e0069006e00670020002d0020005400720061006a006500630074006f0072007900200053006c006900640065007201000002080000004a0000004a00fffffffb0000001c004d006f00740069006f006e0050006c0061006e006e0069006e006701000002580000018e0000018300ffffff00000471000003be00000001000000020000000100000002fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 + Views: + collapsed: false + Width: 1828 + X: 92 + Y: 24 diff --git a/mycobot_280/mycobot_280jn_moveit/launch/moveit_rviz.launch b/mycobot_280/mycobot_280jn_moveit/launch/moveit_rviz.launch new file mode 100644 index 0000000..8b23018 --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/launch/moveit_rviz.launch @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn_moveit/launch/mycobot_moveit.launch b/mycobot_280/mycobot_280jn_moveit/launch/mycobot_moveit.launch new file mode 100644 index 0000000..dd341dc --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/launch/mycobot_moveit.launch @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [move_group/fake_controller_joint_states] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn_moveit/launch/ompl_planning_pipeline.launch.xml b/mycobot_280/mycobot_280jn_moveit/launch/ompl_planning_pipeline.launch.xml new file mode 100644 index 0000000..da999df --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/launch/ompl_planning_pipeline.launch.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn_moveit/launch/planning_context.launch b/mycobot_280/mycobot_280jn_moveit/launch/planning_context.launch new file mode 100644 index 0000000..d5a9c1d --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/launch/planning_context.launch @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn_moveit/launch/planning_pipeline.launch.xml b/mycobot_280/mycobot_280jn_moveit/launch/planning_pipeline.launch.xml new file mode 100644 index 0000000..9c5ea2b --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/launch/planning_pipeline.launch.xml @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn_moveit/launch/ros_controllers.launch b/mycobot_280/mycobot_280jn_moveit/launch/ros_controllers.launch new file mode 100644 index 0000000..decd853 --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/launch/ros_controllers.launch @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn_moveit/launch/run_benchmark_ompl.launch b/mycobot_280/mycobot_280jn_moveit/launch/run_benchmark_ompl.launch new file mode 100644 index 0000000..652f50e --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/launch/run_benchmark_ompl.launch @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn_moveit/launch/sensor_manager.launch.xml b/mycobot_280/mycobot_280jn_moveit/launch/sensor_manager.launch.xml new file mode 100644 index 0000000..f29b1fd --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/launch/sensor_manager.launch.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn_moveit/launch/setup_assistant.launch b/mycobot_280/mycobot_280jn_moveit/launch/setup_assistant.launch new file mode 100644 index 0000000..17bbfec --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/launch/setup_assistant.launch @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn_moveit/launch/trajectory_execution.launch.xml b/mycobot_280/mycobot_280jn_moveit/launch/trajectory_execution.launch.xml new file mode 100644 index 0000000..c574d5c --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/launch/trajectory_execution.launch.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn_moveit/launch/warehouse.launch b/mycobot_280/mycobot_280jn_moveit/launch/warehouse.launch new file mode 100644 index 0000000..8736cf3 --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/launch/warehouse.launch @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn_moveit/launch/warehouse_settings.launch.xml b/mycobot_280/mycobot_280jn_moveit/launch/warehouse_settings.launch.xml new file mode 100644 index 0000000..e473b08 --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/launch/warehouse_settings.launch.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/mycobot_280/mycobot_280jn_moveit/package.xml b/mycobot_280/mycobot_280jn_moveit/package.xml new file mode 100644 index 0000000..772dd75 --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/package.xml @@ -0,0 +1,40 @@ + + + mycobot_280jn_moveit + 0.3.0 + + An automatically generated package with all the configuration and launch files for using the firefighter with the MoveIt! Motion Planning Framework + + zachary + zachary + + BSD + + http://moveit.ros.org/ + https://github.com/ros-planning/moveit/issues + https://github.com/ros-planning/moveit + + catkin + + moveit_ros_move_group + moveit_fake_controller_manager + moveit_kinematics + moveit_planners_ompl + moveit_ros_visualization + moveit_setup_assistant + joint_state_publisher + robot_state_publisher + xacro + + + roscpp + rospy + std_msgs + actionlib + moveit_msgs + mycobot_description + + mycobot_description + + + diff --git a/mycobot_280/mycobot_280jn_moveit/scripts/path_planning_and_obstacle_avoidance_demo.py b/mycobot_280/mycobot_280jn_moveit/scripts/path_planning_and_obstacle_avoidance_demo.py new file mode 100644 index 0000000..cd4024d --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/scripts/path_planning_and_obstacle_avoidance_demo.py @@ -0,0 +1,137 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import rospy, roslib, sys +import moveit_commander +from moveit_msgs.msg import RobotTrajectory +from trajectory_msgs.msg import JointTrajectoryPoint + +from geometry_msgs.msg import PoseStamped, Pose +from tf.transformations import euler_from_quaternion, quaternion_from_euler + + +class MoveItPlanningDemo: + def __init__(self): + # API to initialize move_group,初始化move_group的API + moveit_commander.roscpp_initialize(sys.argv) + + # Initialize the ROS node,初始化ROS节点 + rospy.init_node("moveit_ik_demo") + + # Initialize the scene object to monitor changes in the external environment + # 初始化场景对象,用来监听外部环境的变化 + self.scene = moveit_commander.PlanningSceneInterface() + rospy.sleep(1) + + # Initialize self.arm group in the robotic arm that needs to be controlled by move group + # 初始化需要使用move group控制的机械臂中的self.arm group + self.arm = moveit_commander.MoveGroupCommander("arm_group") + + # Get the name of the terminal link,获取终端link的名称 + self.end_effector_link = self.arm.get_end_effector_link() + + # Set the reference coordinate system used for the target position + # 设置目标位置所使用的参考坐标系 + self.reference_frame = "joint1" + self.arm.set_pose_reference_frame(self.reference_frame) + + # Allow replanning when motion planning fails,当运动规划失败后,允许重新规划 + self.arm.allow_replanning(True) + + # Set the allowable error of position (unit: meter) and attitude (unit: radian) + # 设置位置(单位:米)和姿态(单位:弧度)的允许误差 + self.arm.set_goal_position_tolerance(0.01) + self.arm.set_goal_orientation_tolerance(0.05) + + def moving(self): + # # Control the robotic arm to return to the initialization position first + # 控制机械臂先回到初始化位置 + self.arm.set_named_target("init_pose") + self.arm.go() + rospy.sleep(2) + + # Set the target pose in the robotic arm workspace, the position is described by x, y, z coordinates, + # 设置机械臂工作空间中的目标位姿,位置使用x、y、z坐标描述, + # Pose is described by quaternion, based on base_link coordinate system + # 姿态使用四元数描述,基于base_link坐标系 + target_pose = PoseStamped() + target_pose.header.frame_id = self.reference_frame + target_pose.header.stamp = rospy.Time.now() + target_pose.pose.position.x = 0.132 + target_pose.pose.position.y = -0.150 + target_pose.pose.position.z = 0.075 + target_pose.pose.orientation.x = 0.026 + target_pose.pose.orientation.y = 1.0 + target_pose.pose.orientation.z = 0.0 + target_pose.pose.orientation.w = 0.014 + + # Set the current state of the robot arm as the initial state of motion + # 设置机器臂当前的状态作为运动初始状态 + self.arm.set_start_state_to_current_state() + + # Set the target pose of the terminal motion of the robotic arm + # 设置机械臂终端运动的目标位姿 + self.arm.set_pose_target(target_pose, self.end_effector_link) + + # Plan the movement path,规划运动路径 + traj = self.arm.plan() + + # Control the motion of the robotic arm according to the planned motion path + # 按照规划的运动路径控制机械臂运动 + self.arm.execute(traj) + rospy.sleep(1) + + # Control the terminal of the robotic arm to move 5cm to the right. Parameter 1 represents y, 0,1,2,3,4,5 represents xyzrpy + # 控制机械臂终端向右移动5cm 參數1是代表y, 0,1,2,3,4,5 代表xyzrpy + self.arm.shift_pose_target(1, 0.12, self.end_effector_link) + self.arm.go() + rospy.sleep(1) + + self.arm.shift_pose_target(1, 0.1, self.end_effector_link) + self.arm.go() + rospy.sleep(1) + + # Control the terminal of the robotic arm to rotate 90 degrees in the opposite direction. 0,1,2,3,4,5 represent xyzrpy + # 控制机械臂终端反向旋转90度 0,1,2,3,4,5 代表xyzrpy + # self.arm.shift_pose_target(3, -1.57, end_effector_link) + # self.arm.go() + # rospy.sleep(1) + + def run(self): + self.scene.remove_world_object("suit") + + # Run once without obstacles,没有障碍物运行一次 + self.moving() + + # Add environment,添加环境 + quat = quaternion_from_euler(3.1415, 0, -1.57) + + suit_post = PoseStamped() + suit_post.header.frame_id = self.reference_frame + suit_post.pose.position.x = 0.0 + suit_post.pose.position.y = 0.0 + suit_post.pose.position.z = -0.02 + suit_post.pose.orientation.x = quat[0] + suit_post.pose.orientation.y = quat[1] + suit_post.pose.orientation.z = quat[2] + suit_post.pose.orientation.w = quat[3] + + suit_path = ( + roslib.packages.get_pkg_dir("mycobot_description") + + "/urdf/mycobot/suit_env.dae" + ) + # need `pyassimp==3.3` + self.scene.add_mesh("suit", suit_post, suit_path) + rospy.sleep(2) + + # Run it again if there is an environmental impact,有环境影响后再运行一次 + self.moving() + + # close and exit moveit,关闭并退出moveit + moveit_commander.roscpp_shutdown() + moveit_commander.os._exit(0) + + +if __name__ == "__main__": + o = MoveItPlanningDemo() + o.run() diff --git a/mycobot_280/mycobot_280jn_moveit/scripts/sync_plan.py b/mycobot_280/mycobot_280jn_moveit/scripts/sync_plan.py new file mode 100644 index 0000000..8cdd97e --- /dev/null +++ b/mycobot_280/mycobot_280jn_moveit/scripts/sync_plan.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python2 +import time +import rospy +from sensor_msgs.msg import JointState + +from pymycobot.mycobot import MyCobot + + +mc = None + + +def callback(data): + rospy.loginfo(rospy.get_caller_id() + "%s", data) + data_list = [] + for index, value in enumerate(data.position): + # if index != 2: + # value *= -1 + data_list.append(value) + + mc.send_radians(data_list, 80) + + +def listener(): + global mc + rospy.init_node("mycobot_reciver", anonymous=True) + + port = rospy.get_param("~port", "/dev/ttyTHS1") + baud = rospy.get_param("~baud", 1000000) + print(port, baud) + mc = MyCobot(port, baud) + + rospy.Subscriber("joint_states", JointState, callback) + + # spin() simply keeps python from exiting until this node is stopped + # spin() 只是阻止 python 退出,直到该节点停止 + rospy.spin() + + +if __name__ == "__main__": + listener()