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()