From 5a04d76d9f5fcac7b0a38f87c8311dc06e428714 Mon Sep 17 00:00:00 2001 From: zachary Date: Fri, 30 Apr 2021 10:54:22 +0800 Subject: [PATCH 1/9] update README and modify launch --- README.md | 40 +++++++++++++++++++++++++++ launch/mycobot_teleop_keyboard.launch | 4 +-- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0f46a59..113bcf6 100644 --- a/README.md +++ b/README.md @@ -132,6 +132,46 @@ python scripts/test.py rosrun myCobotROS display.py ``` +- **Open the keyboard controller** + + - launch + + ``` + roslaunch myCobotROS mycobot_teleop_keyboard.launch PORT:=/dev/ttyUSB0 + ``` + + - open another terminal run script + + ``` + rosrun myCobotROS teleop_keyboard.py _speed:=60 _change_size:=10 + ``` + + Then you will see this: + + ``` + Mycobot Teleop Keyboard Controller + --------------------------- + Movimg options(control coord [x,y,z,rx,ry,rz]): + w(x+) + + a(y-) s(x-) d(y+) + + 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 - + 3 - + q - Quit + + currently: speed 50 change size 10 + ``` + - - - - + + + + diff --git a/scripts/mycobot_ros.py b/scripts/mycobot_ros.py index 8e6c946..e9daabc 100755 --- a/scripts/mycobot_ros.py +++ b/scripts/mycobot_ros.py @@ -1,4 +1,5 @@ #!/usr/bin/env python2 +import time import rospy from myCobotROS.srv import * @@ -7,7 +8,7 @@ from pymycobot.mycobot import MyCobot mc = None -def mycobot_services(): +def create_handle(): global mc rospy.init_node('mycobot_services') rospy.loginfo('start ...') @@ -16,6 +17,8 @@ def mycobot_services(): rospy.loginfo("%s,%s" % (port, baud)) mc = MyCobot(port, baud) + +def create_services(): rospy.Service('set_joint_angles', SetAngles, set_angles) rospy.Service('get_joint_angles', GetAngles, get_angles) rospy.Service('set_joint_coords', SetCoords, set_coords) @@ -79,6 +82,48 @@ def switch_status(req): mc.set_gripper_state(1, 80) +robot_msg = ''' +MyCobot Status +-------------------------------- +Joint Limit: + joint 1: -170 ~ +170 + joint 2: -170 ~ +170 + joint 3: -170 ~ +170 + joint 4: -170 ~ +170 + joint 5: -170 ~ +170 + joint 6: -180 ~ +180 + +Connect Status: %s + +Servo Infomation: %s + +Servo Temperature: %s + +Atom Version: %s +''' + + +def output_robot_message(): + connect_status = False + servo_infomation = 'unknown' + servo_temperature = 'unknown' + atom_version = 'unknown' + + if mc: + cn = mc.is_controller_connected() + if cn == 1: + connect_status = True + time.sleep(.1) + si = mc.is_all_servo_enable() + if si == 1: + servo_infomation = 'all connected' + + print(robot_msg % (connect_status, servo_infomation, + servo_temperature, atom_version)) + + if __name__ == '__main__': # print(MyCobot.__dict__) - mycobot_services() + create_handle() + output_robot_message() + create_services() From 2581131bbe39bac0520ff64526703aef2aaeae96 Mon Sep 17 00:00:00 2001 From: zachary Date: Thu, 6 May 2021 12:37:06 +0800 Subject: [PATCH 3/9] change package name. --- CMakeLists.txt | 2 +- README.md | 22 +++++++++++----------- READMEcn.md | 14 +++++++------- docker-compose.yml | 2 +- launch/communication_service.launch | 2 +- launch/control_slider.launch | 6 +++--- launch/mycobot.launch | 4 ++-- launch/mycobot_teleop_keyboard.launch | 8 ++++---- package.xml | 4 ++-- scripts/client.py | 2 +- scripts/teleop_keyboard.py | 2 +- urdf/mycobot_urdf.urdf | 14 +++++++------- 12 files changed, 41 insertions(+), 41 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ea877b8..28c77d8 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 2.8.3) -project(myCobotROS) +project(mycobot_ros) add_compile_options(-std=c++11) ## Find catkin and any catkin packages diff --git a/README.md b/README.md index 113bcf6..cdbc2c9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# myCobotROS +# mycobot_ros [![jaywcjlove/sb](https://jaywcjlove.github.io/sb/lang/chinese.svg)](READMEcn.md) @@ -46,7 +46,7 @@ This command does three things: 3) `docker-compose up ros` This runs the image specified in the `docker-compose.yml`, which by default runs - the command `roslaunch myCobotROS control_slider.launch` within the container. + the command `roslaunch mycobot_ros control_slider.launch` within the container. ### Option 2: Local @@ -64,7 +64,7 @@ Install ros package in your src folder of your Catkin workspace. ```bash $ cd ~/catkin_ws/src -$ git clone https://github.com/elephantrobotics/myCobotROS.git +$ git clone https://github.com/elephantrobotics/mycobot_ros.git $ cd ~/catkin_ws $ catkin_make $ source ~/catkin_ws/devel/setup.bash @@ -73,7 +73,7 @@ $ source ~/catkin_ws/devel/setup.bash #### 1.3 Test Python API ```bash -cd ~/catkin_ws/src/myCobotROS +cd ~/catkin_ws/src/mycobot_ros python scripts/test.py ``` @@ -109,13 +109,13 @@ python scripts/test.py - launch ros and rviz ``` - roslaunch myCobotROS control_slider.launch + roslaunch mycobot_ros control_slider.launch ``` - run python script ``` - rosrun myCobotROS control_slider.py + rosrun mycobot_ros control_slider.py ``` - **The model moves with the real manipulator** @@ -123,13 +123,13 @@ python scripts/test.py - launch ros and rviz ``` - roslanuch myCobotROS mycobot.launch + roslanuch mycobot_ros mycobot.launch ``` - run python script ``` - rosrun myCobotROS display.py + rosrun mycobot_ros display.py ``` - **Open the keyboard controller** @@ -137,13 +137,13 @@ python scripts/test.py - launch ``` - roslaunch myCobotROS mycobot_teleop_keyboard.launch PORT:=/dev/ttyUSB0 + roslaunch mycobot_ros mycobot_teleop_keyboard.launch PORT:=/dev/ttyUSB0 ``` - open another terminal run script ``` - rosrun myCobotROS teleop_keyboard.py _speed:=60 _change_size:=10 + rosrun mycobot_ros teleop_keyboard.py _speed:=60 _change_size:=10 ``` Then you will see this: @@ -175,7 +175,7 @@ python scripts/test.py ## Q & A diff --git a/READMEcn.md b/READMEcn.md index 3bc9497..62d5f65 100644 --- a/READMEcn.md +++ b/READMEcn.md @@ -1,4 +1,4 @@ -# myCobotROS +# mycobot_ros [![jaywcjlove/sb](https://jaywcjlove.github.io/sb/lang/english.svg)](README.md) @@ -33,7 +33,7 @@ pip install pymycobot --user ```bash $ cd ~/catkin_ws/src -$ git clone https://github.com/elephantrobotics/myCobotROS.git +$ git clone https://github.com/elephantrobotics/mycobot_ros.git $ cd ~/catkin_ws $ catkin_make ``` @@ -41,7 +41,7 @@ $ catkin_make ### 1.3 你可以选择测试 Python API ```bash -cd ~/catkin_ws/src/myCobotROS +cd ~/catkin_ws/src/mycobot_ros python scripts/test.py ``` @@ -77,13 +77,13 @@ python scripts/test.py - 启动 ros 和 rviz ``` - roslaunch myCobotROS control_slider.launch + roslaunch mycobot_ros control_slider.launch ``` - 运行 python 脚本 ``` - rosrun myCobotROS control_slider.py + rosrun mycobot_ros control_slider.py ``` - 仿真模型同步机械臂 @@ -91,13 +91,13 @@ python scripts/test.py - 启动 ros 和 rviz ``` - roslanuch myCobotROS mycobot.launch + roslanuch mycobot_ros mycobot.launch ``` - 运行 python 脚本 ``` - rosrun myCobotROS display.py + rosrun mycobot_ros display.py ``` ## Q & A diff --git a/docker-compose.yml b/docker-compose.yml index e11f3fb..28da39c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.4' x-app: &common - command: [ "roslaunch myCobotROS control_slider.launch" ] + command: [ "roslaunch mycobot_ros control_slider.launch" ] privileged: true environment: PYTHONUNBUFFERED: 1 diff --git a/launch/communication_service.launch b/launch/communication_service.launch index 7cfdf62..a9dd474 100644 --- a/launch/communication_service.launch +++ b/launch/communication_service.launch @@ -3,7 +3,7 @@ - + diff --git a/launch/control_slider.launch b/launch/control_slider.launch index 82d03c3..c0cee8a 100644 --- a/launch/control_slider.launch +++ b/launch/control_slider.launch @@ -1,6 +1,6 @@ - - + + @@ -12,7 +12,7 @@ - + diff --git a/launch/mycobot.launch b/launch/mycobot.launch index 75df517..ed7af6f 100644 --- a/launch/mycobot.launch +++ b/launch/mycobot.launch @@ -1,6 +1,6 @@ - - + + diff --git a/launch/mycobot_teleop_keyboard.launch b/launch/mycobot_teleop_keyboard.launch index 66d55ed..6762ad6 100644 --- a/launch/mycobot_teleop_keyboard.launch +++ b/launch/mycobot_teleop_keyboard.launch @@ -2,8 +2,8 @@ - - + + @@ -13,9 +13,9 @@ - + - + diff --git a/package.xml b/package.xml index 90171d2..6c72855 100644 --- a/package.xml +++ b/package.xml @@ -1,8 +1,8 @@ - myCobotROS + mycobot_ros 0.1.0 - The myCobotROS package + The mycobot_ros package ZhangLijun BSD diff --git a/scripts/client.py b/scripts/client.py index da0cc6b..ec11c81 100755 --- a/scripts/client.py +++ b/scripts/client.py @@ -1,7 +1,7 @@ #!/usr/bin/env python2 import sys import rospy -from myCobotROS.srv import * +from mycobot_ros.srv import * def test(): diff --git a/scripts/teleop_keyboard.py b/scripts/teleop_keyboard.py index 7e520ff..9f82552 100755 --- a/scripts/teleop_keyboard.py +++ b/scripts/teleop_keyboard.py @@ -11,7 +11,7 @@ import copy import time import roslib -roslib.load_manifest('myCobotROS') +roslib.load_manifest('mycobot_ros') msg = """ diff --git a/urdf/mycobot_urdf.urdf b/urdf/mycobot_urdf.urdf index fc403c9..60e05cd 100755 --- a/urdf/mycobot_urdf.urdf +++ b/urdf/mycobot_urdf.urdf @@ -8,7 +8,7 @@ - + @@ -17,7 +17,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -39,7 +39,7 @@ - + @@ -52,7 +52,7 @@ - + @@ -63,7 +63,7 @@ - + @@ -74,7 +74,7 @@ - + From e5f32081f69fa49da9dfc93c97c623da762779d0 Mon Sep 17 00:00:00 2001 From: zachary Date: Thu, 6 May 2021 16:33:22 +0800 Subject: [PATCH 4/9] update teleop controller. --- scripts/teleop_keyboard.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/scripts/teleop_keyboard.py b/scripts/teleop_keyboard.py index 9f82552..b0d4917 100755 --- a/scripts/teleop_keyboard.py +++ b/scripts/teleop_keyboard.py @@ -17,11 +17,13 @@ roslib.load_manifest('mycobot_ros') msg = """ Mycobot Teleop Keyboard Controller --------------------------- -Movimg options(control coord [x,y,z,rx,ry,rz]): +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-) @@ -31,8 +33,8 @@ Gripper control: Other: 1 - Go to init pose - 2 - - 3 - + 2 - Go to home pose + 3 - Resave home pose q - Quit """ @@ -88,7 +90,7 @@ def teleop_keyboard(): while True: res = get_coords() - if res.x > 5: + if res.x > 1: break time.sleep(.1) @@ -102,6 +104,7 @@ def teleop_keyboard(): print(vels(speed, change_size)) while(1): try: + print("\r current coords: %s" % record_coords, end="") key = getKey(key_timeout) if key == 'q': break @@ -158,6 +161,7 @@ def teleop_keyboard(): home_pose[5] = rep.joint_5 else: continue + except Exception as e: # print(e) continue From 215ce256b2acb29d975eeceb0e9f639df7bf76b6 Mon Sep 17 00:00:00 2001 From: zachary Date: Thu, 6 May 2021 16:34:38 +0800 Subject: [PATCH 5/9] feat: added moveit configuration. --- CMakeLists.txt | 10 +- config/chomp_planning.yaml | 18 ++ config/fake_controllers.yaml | 9 + config/firefighter.srdf | 43 +++ config/joint_limits.yaml | 34 +++ config/kinematics.yaml | 5 + config/ompl_planning.yaml | 148 +++++++++++ config/ros_controllers.yaml | 35 +++ config/sensors_3d.yaml | 3 + launch/chomp_planning_pipeline.launch.xml | 10 + launch/default_warehouse_db.launch | 15 ++ launch/demo.launch | 59 +++++ launch/demo_gazebo.launch | 70 +++++ .../fake_moveit_controller_manager.launch.xml | 9 + ...ghter_moveit_controller_manager.launch.xml | 10 + ...refighter_moveit_sensor_manager.launch.xml | 3 + launch/gazebo.launch | 23 ++ launch/joystick_control.launch | 17 ++ launch/move_group.launch | 77 ++++++ launch/moveit.rviz | 250 ++++++++++++++++++ launch/moveit_rviz.launch | 16 ++ launch/ompl_planning_pipeline.launch.xml | 22 ++ launch/planning_context.launch | 24 ++ launch/planning_pipeline.launch.xml | 10 + launch/ros_controllers.launch | 11 + launch/run_benchmark_ompl.launch | 22 ++ launch/sensor_manager.launch.xml | 17 ++ launch/setup_assistant.launch | 15 ++ launch/trajectory_execution.launch.xml | 20 ++ launch/warehouse.launch | 15 ++ launch/warehouse_settings.launch.xml | 16 ++ package.xml | 24 +- 32 files changed, 1056 insertions(+), 4 deletions(-) create mode 100644 config/chomp_planning.yaml create mode 100644 config/fake_controllers.yaml create mode 100644 config/firefighter.srdf create mode 100644 config/joint_limits.yaml create mode 100644 config/kinematics.yaml create mode 100644 config/ompl_planning.yaml create mode 100644 config/ros_controllers.yaml create mode 100644 config/sensors_3d.yaml create mode 100644 launch/chomp_planning_pipeline.launch.xml create mode 100644 launch/default_warehouse_db.launch create mode 100644 launch/demo.launch create mode 100644 launch/demo_gazebo.launch create mode 100644 launch/fake_moveit_controller_manager.launch.xml create mode 100644 launch/firefighter_moveit_controller_manager.launch.xml create mode 100644 launch/firefighter_moveit_sensor_manager.launch.xml create mode 100644 launch/gazebo.launch create mode 100644 launch/joystick_control.launch create mode 100644 launch/move_group.launch create mode 100644 launch/moveit.rviz create mode 100644 launch/moveit_rviz.launch create mode 100644 launch/ompl_planning_pipeline.launch.xml create mode 100644 launch/planning_context.launch create mode 100644 launch/planning_pipeline.launch.xml create mode 100644 launch/ros_controllers.launch create mode 100644 launch/run_benchmark_ompl.launch create mode 100644 launch/sensor_manager.launch.xml create mode 100644 launch/setup_assistant.launch create mode 100644 launch/trajectory_execution.launch.xml create mode 100644 launch/warehouse.launch create mode 100644 launch/warehouse_settings.launch.xml diff --git a/CMakeLists.txt b/CMakeLists.txt index 28c77d8..6eb716e 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,8 @@ find_package(catkin REQUIRED COMPONENTS genmsg message_generation serial + actionlib + moveit_msgs ) add_message_files(FILES @@ -28,7 +30,9 @@ add_service_files(FILES generate_messages(DEPENDENCIES std_msgs) ## Declare a catkin package -catkin_package(CATKIN_DEPENDS message_runtime std_msgs) +catkin_package( + CATKIN_DEPENDS message_runtime std_msgs actionlib moveit_msgs +) ## Build talker and listener include_directories(include ${catkin_INCLUDE_DIRS}) @@ -44,5 +48,9 @@ catkin_install_python(PROGRAMS 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/config/chomp_planning.yaml b/config/chomp_planning.yaml new file mode 100644 index 0000000..75258e5 --- /dev/null +++ b/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/config/fake_controllers.yaml b/config/fake_controllers.yaml new file mode 100644 index 0000000..512725e --- /dev/null +++ b/config/fake_controllers.yaml @@ -0,0 +1,9 @@ +controller_list: + - name: fake_mycobot_arm_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/config/firefighter.srdf b/config/firefighter.srdf new file mode 100644 index 0000000..37f1d40 --- /dev/null +++ b/config/firefighter.srdf @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/joint_limits.yaml b/config/joint_limits.yaml new file mode 100644 index 0000000..6e9612a --- /dev/null +++ b/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/config/kinematics.yaml b/config/kinematics.yaml new file mode 100644 index 0000000..0290bbd --- /dev/null +++ b/config/kinematics.yaml @@ -0,0 +1,5 @@ +mycobot_arm: + 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/config/ompl_planning.yaml b/config/ompl_planning.yaml new file mode 100644 index 0000000..acdfcd2 --- /dev/null +++ b/config/ompl_planning.yaml @@ -0,0 +1,148 @@ +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 +mycobot_arm: + default_planner_config: RRT + 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 \ No newline at end of file diff --git a/config/ros_controllers.yaml b/config/ros_controllers.yaml new file mode 100644 index 0000000..b7aaea5 --- /dev/null +++ b/config/ros_controllers.yaml @@ -0,0 +1,35 @@ +# Simulation settings for using moveit_sim_controllers +moveit_sim_hw_interface: + joint_model_group: mycobot_arm + 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: + - 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: + - name: mycobot_controller + action_ns: follow_joint_trajectory + default: True + type: FollowJointTrajectory + 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/config/sensors_3d.yaml b/config/sensors_3d.yaml new file mode 100644 index 0000000..d2955dc --- /dev/null +++ b/config/sensors_3d.yaml @@ -0,0 +1,3 @@ +# The name of this file shouldn't be changed, or else the Setup Assistant won't detect it +sensors: + - {} \ No newline at end of file diff --git a/launch/chomp_planning_pipeline.launch.xml b/launch/chomp_planning_pipeline.launch.xml new file mode 100644 index 0000000..06a3d4d --- /dev/null +++ b/launch/chomp_planning_pipeline.launch.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/launch/default_warehouse_db.launch b/launch/default_warehouse_db.launch new file mode 100644 index 0000000..d794ae3 --- /dev/null +++ b/launch/default_warehouse_db.launch @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/launch/demo.launch b/launch/demo.launch new file mode 100644 index 0000000..6e9e240 --- /dev/null +++ b/launch/demo.launch @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + [move_group/fake_controller_joint_states] + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/launch/demo_gazebo.launch b/launch/demo_gazebo.launch new file mode 100644 index 0000000..903d5a2 --- /dev/null +++ b/launch/demo_gazebo.launch @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [/joint_states] + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/launch/fake_moveit_controller_manager.launch.xml b/launch/fake_moveit_controller_manager.launch.xml new file mode 100644 index 0000000..ecb363c --- /dev/null +++ b/launch/fake_moveit_controller_manager.launch.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/launch/firefighter_moveit_controller_manager.launch.xml b/launch/firefighter_moveit_controller_manager.launch.xml new file mode 100644 index 0000000..8bd4853 --- /dev/null +++ b/launch/firefighter_moveit_controller_manager.launch.xml @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/launch/firefighter_moveit_sensor_manager.launch.xml b/launch/firefighter_moveit_sensor_manager.launch.xml new file mode 100644 index 0000000..5d02698 --- /dev/null +++ b/launch/firefighter_moveit_sensor_manager.launch.xml @@ -0,0 +1,3 @@ + + + diff --git a/launch/gazebo.launch b/launch/gazebo.launch new file mode 100644 index 0000000..00d0739 --- /dev/null +++ b/launch/gazebo.launch @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/launch/joystick_control.launch b/launch/joystick_control.launch new file mode 100644 index 0000000..9411f6e --- /dev/null +++ b/launch/joystick_control.launch @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/launch/move_group.launch b/launch/move_group.launch new file mode 100644 index 0000000..d801862 --- /dev/null +++ b/launch/move_group.launch @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/launch/moveit.rviz b/launch/moveit.rviz new file mode 100644 index 0000000..38b3736 --- /dev/null +++ b/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/launch/moveit_rviz.launch b/launch/moveit_rviz.launch new file mode 100644 index 0000000..b44e3f5 --- /dev/null +++ b/launch/moveit_rviz.launch @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + diff --git a/launch/ompl_planning_pipeline.launch.xml b/launch/ompl_planning_pipeline.launch.xml new file mode 100644 index 0000000..6c39d7f --- /dev/null +++ b/launch/ompl_planning_pipeline.launch.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + diff --git a/launch/planning_context.launch b/launch/planning_context.launch new file mode 100644 index 0000000..214e340 --- /dev/null +++ b/launch/planning_context.launch @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/launch/planning_pipeline.launch.xml b/launch/planning_pipeline.launch.xml new file mode 100644 index 0000000..d1e4c20 --- /dev/null +++ b/launch/planning_pipeline.launch.xml @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/launch/ros_controllers.launch b/launch/ros_controllers.launch new file mode 100644 index 0000000..255177f --- /dev/null +++ b/launch/ros_controllers.launch @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/launch/run_benchmark_ompl.launch b/launch/run_benchmark_ompl.launch new file mode 100644 index 0000000..066ed63 --- /dev/null +++ b/launch/run_benchmark_ompl.launch @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/launch/sensor_manager.launch.xml b/launch/sensor_manager.launch.xml new file mode 100644 index 0000000..6d2cd5b --- /dev/null +++ b/launch/sensor_manager.launch.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/launch/setup_assistant.launch b/launch/setup_assistant.launch new file mode 100644 index 0000000..d0674f0 --- /dev/null +++ b/launch/setup_assistant.launch @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/launch/trajectory_execution.launch.xml b/launch/trajectory_execution.launch.xml new file mode 100644 index 0000000..d1a0ab3 --- /dev/null +++ b/launch/trajectory_execution.launch.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/launch/warehouse.launch b/launch/warehouse.launch new file mode 100644 index 0000000..fbae8fb --- /dev/null +++ b/launch/warehouse.launch @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/launch/warehouse_settings.launch.xml b/launch/warehouse_settings.launch.xml new file mode 100644 index 0000000..e473b08 --- /dev/null +++ b/launch/warehouse_settings.launch.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/package.xml b/package.xml index 6c72855..5fb5438 100644 --- a/package.xml +++ b/package.xml @@ -4,13 +4,25 @@ 0.1.0 The mycobot_ros package - ZhangLijun - BSD - ZhangLijun + ZhangLijun + + BSD + + 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 @@ -23,6 +35,12 @@ serial message_runtime + actionlib + moveit_msgs + + actionlib + moveit_msgs + From 13ced40a6f30685559dbbfae0eca01856e3b1f66 Mon Sep 17 00:00:00 2001 From: zachary Date: Thu, 6 May 2021 16:36:08 +0800 Subject: [PATCH 6/9] feat: add listen plan exec script. --- scripts/sync_signal.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100755 scripts/sync_signal.py diff --git a/scripts/sync_signal.py b/scripts/sync_signal.py new file mode 100755 index 0000000..74f8b7f --- /dev/null +++ b/scripts/sync_signal.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python2 +import time, subprocess +import rospy +from sensor_msgs.msg import JointState + +from pymycobot.mycobot import MyCobot + + +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(): + rospy.init_node('mycobot_reciver', anonymous=True) + + rospy.Subscriber("joint_states", JointState, callback) + + # spin() simply keeps python from exiting until this node is stopped + rospy.spin() + +if __name__ == '__main__': + port = subprocess.check_output(['echo -n /dev/ttyUSB*'], + shell=True) + mc = MyCobot(port) + listener() \ No newline at end of file From d2e71b1cdf51790574ba68453a3fe665e378d8d9 Mon Sep 17 00:00:00 2001 From: zachary Date: Mon, 10 May 2021 14:07:31 +0800 Subject: [PATCH 7/9] improve teleop. --- package.xml | 1 - scripts/mycobot_ros.py | 2 -- scripts/teleop_keyboard.py | 29 +++++++++++++++-------------- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/package.xml b/package.xml index 5fb5438..4d6c7d5 100644 --- a/package.xml +++ b/package.xml @@ -26,7 +26,6 @@ roscpp rospy std_msgs - serial message_generation roscpp diff --git a/scripts/mycobot_ros.py b/scripts/mycobot_ros.py index 9ed34a8..d3e73f7 100755 --- a/scripts/mycobot_ros.py +++ b/scripts/mycobot_ros.py @@ -74,10 +74,8 @@ def get_coords(req): def switch_status(req): if mc: if req.Status: - print(1) mc.set_gripper_state(0, 80) else: - print(2) mc.set_gripper_state(1, 80) diff --git a/scripts/teleop_keyboard.py b/scripts/teleop_keyboard.py index b0d4917..6f9bc26 100755 --- a/scripts/teleop_keyboard.py +++ b/scripts/teleop_keyboard.py @@ -39,21 +39,23 @@ Other: """ -def getKey(key_timeout): - tty.setraw(sys.stdin.fileno()) - rlist, _, _ = select.select([sys.stdin], [], [], key_timeout) - if rlist: - key = sys.stdin.read(1) - else: - key = '' - termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings) - return key - - def vels(speed, turn): return "currently:\tspeed %s\tchange size %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(): global settings settings = termios.tcgetattr(sys.stdin) @@ -105,7 +107,8 @@ def teleop_keyboard(): while(1): try: print("\r current coords: %s" % record_coords, end="") - key = getKey(key_timeout) + with Raw(sys.stdin): + key = sys.stdin.read(1) if key == 'q': break elif key in ['w', 'W']: @@ -168,8 +171,6 @@ def teleop_keyboard(): except Exception as e: print(e) - finally: - termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings) if __name__ == "__main__": From 1dac351c91ad03ef0391015c645f66a9f964fd2b Mon Sep 17 00:00:00 2001 From: zachary Date: Wed, 12 May 2021 16:39:47 +0800 Subject: [PATCH 8/9] update name. --- CMakeLists.txt | 15 ++- README.md | 16 +++ .../{mycobot.launch => mycobot_follow.launch} | 0 ...ol_slider.launch => mycobot_slider.launch} | 8 +- scripts/camera.py | 106 ++++++++++++++++++ scripts/cilibrate_camera.py | 31 +++++ scripts/{display.py => follow_display.py} | 28 ++++- .../{control_slider.py => slider_control.py} | 16 +-- src/camera_display.cpp | 30 +++++ src/opencv_camera.cpp | 60 ++++++++++ 10 files changed, 292 insertions(+), 18 deletions(-) rename launch/{mycobot.launch => mycobot_follow.launch} (100%) rename launch/{control_slider.launch => mycobot_slider.launch} (72%) create mode 100755 scripts/camera.py create mode 100644 scripts/cilibrate_camera.py rename scripts/{display.py => follow_display.py} (76%) rename scripts/{control_slider.py => slider_control.py} (77%) create mode 100644 src/camera_display.cpp create mode 100644 src/opencv_camera.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 6eb716e..27f2481 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,9 +9,10 @@ find_package(catkin REQUIRED COMPONENTS std_msgs genmsg message_generation - serial actionlib moveit_msgs + image_transport + cv_bridge ) add_message_files(FILES @@ -35,16 +36,17 @@ catkin_package( ) ## Build talker and listener -include_directories(include ${catkin_INCLUDE_DIRS}) +include_directories(include ${catkin_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS}) catkin_install_python(PROGRAMS - scripts/display.py - scripts/control_slider.py + scripts/follow_display.py + scripts/slider_control.py scripts/control_marker.py scripts/mycobot_ros.py scripts/listen_real.py scripts/teleop_keyboard.py scripts/client.py + scripts/camera.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} ) @@ -52,5 +54,10 @@ install(DIRECTORY launch DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} PATTERN "setup_assistant.launch" EXCLUDE) install(DIRECTORY config DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}) +find_package(OpenCV REQUIRED) +add_executable(opencv_camera src/opencv_camera) +target_link_libraries(opencv_camera ${catkin_LIBRARIES} ${OpenCV_LIBRARIES}) +add_executable(camera_display src/camera_display) +target_link_libraries(camera_display ${catkin_LIBRARIES} ${OpenCV_LIBRARIES}) diff --git a/README.md b/README.md index cdbc2c9..eebcdc0 100644 --- a/README.md +++ b/README.md @@ -155,6 +155,8 @@ python scripts/test.py w(x+) a(y-) s(x-) d(y+) + + z(z-) x(z+) u(rx+) i(ry+) o(rz+) j(rx-) k(ry-) l(rz-) @@ -172,6 +174,20 @@ python scripts/test.py currently: speed 50 change size 10 ``` +## MoveIT + +### Execute plan with actual robot. + +``` +roslaunch mycobot_ros demo.launch +``` + +Open a new terminal and run: + +``` +rosrun mycobot_ros sync_signal.py +``` + + @@ -12,7 +15,10 @@ - + diff --git a/scripts/camera.py b/scripts/camera.py new file mode 100755 index 0000000..d5a638f --- /dev/null +++ b/scripts/camera.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python +import rospy +import cv2 as cv +import numpy as np +from geometry_msgs.msg import Twist +from cv_bridge import CvBridge, CvBridgeError +from sensor_msgs.msg import Image +from visualization_msgs.msg import Marker +import tf_conversions +from myCobotROS.srv import ( + GetCoords, SetCoords, GetAngles, SetAngles, GripperStatus) + + +class image_converter: + def __init__(self): + self.mark_pub = rospy.Publisher("/bebop/marker", Marker, queue_size=1) + 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 + # rospy.wait_for_service('get_joint_coords') + # rospy.wait_for_service('set_joint_coords') + + try: + self.get_coords = rospy.ServiceProxy('get_joint_coords', GetCoords) + self.set_coords = rospy.ServiceProxy('set_joint_coords', SetCoords) + except: + print('Error: cannot connect service...') + exit(1) + self.image_sub = rospy.Subscriber("/camera/image", Image, self.callback) + + + def callback(self, data): + try: + cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8") + # sucess, cv_image = self.cap.read() + 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: + 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) + corners, ids, rejectImaPoint = cv.aruco.detectMarkers(gray, self.aruco_dict, parameters=self.aruo_params) + if len(corners) > 0: + if ids is not None: + # print('corners:', corners, 'ids:', ids) + rvec, tvec, _ = cv.aruco.estimatePoseSingleMarkers(corners, 0.05, self.camera_matrix, self.dist_coeffs) + (rvec - tvec).any() + + print('rvec:', rvec, 'tvec:', tvec) + + 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) + + res = self.get_coords() + if res.x == res.y == 0.0: + return + record_coords = [ + res.x, res.y, res.z, res.rx, res.ry, res.rz, 60, 1 + ] + print(record_coords) + + # [x, y, z, -172, 3, -46.8] + cv.imshow("Image", cv_image) + + + # marker = Marker() + # marker.header.frame_id = '/joint1' + # 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.pose.position.x = center_x / 100 + # marker.pose.position.y = center_y / 100 + # marker.pose.position.z = 0 + + # marker.color.a = 1.0 + # marker.color.g = 1.0 + + cv.waitKey(3) + try: + # self.mark_pub.publish(marker) + pass + except CvBridgeError as e: + print e +if __name__ == '__main__': + try: + rospy.init_node("cv_bridge_test") + rospy.loginfo("Starting cv_bridge_test node") + image_converter() + rospy.spin() + except KeyboardInterrupt: + print "Shutting down cv_bridge_test node." + cv.destroyAllWindows() \ No newline at end of file diff --git a/scripts/cilibrate_camera.py b/scripts/cilibrate_camera.py new file mode 100644 index 0000000..16b3e7d --- /dev/null +++ b/scripts/cilibrate_camera.py @@ -0,0 +1,31 @@ +import numpy as np +import cv2 +import cv2.aruco as aruco +import glob + +def calibrateKd(im_fpath, aruco_len=60.0): + (w, h) = (6, 4) + criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.01) + objp = np.zeros((w*h, 3), np.float32) + objp[:, :2] = np.mgrid[0:w, 0:h].T.reshape(-1, 2) + objp *= aruco_len + objpoints, imgpoints = [], [] + images = glob.glob(f'{im_fpath}/*') + for fname in images: + img = cv2.imread(fname) + gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + ret, corners = cv2.findChessboardCorners(gray, (w, h), None) + if ret == True: + objpoints.append(objp) + corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria) + imgpoints.append(corners2) + img = cv2.drawChessboardCorners(img, (6, 4), corners2, ret) + + ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shap[::-1], None, None) + tot_error = 0 + for i in range(len(objpoints)): + imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist) + error = cv2.norm(imgpoints[i], imgpoints2, cv2.NORM_L2)/len(imgpoints2) + tot_error += error + print(tot_error) + return mtx, dist diff --git a/scripts/display.py b/scripts/follow_display.py similarity index 76% rename from scripts/display.py rename to scripts/follow_display.py index e18c893..238dcea 100755 --- a/scripts/display.py +++ b/scripts/follow_display.py @@ -1,7 +1,6 @@ #!/usr/bin/env python2 # license removed for brevity import time -import subprocess import rospy from sensor_msgs.msg import JointState @@ -12,9 +11,28 @@ from pymycobot.mycobot import MyCobot def talker(): + rospy.init_node('display', anonymous=True) + + print('Try connect real mycobot...') + port = rospy.get_param('~port', '/dev/ttyUSB0') + baud = rospy.get_param('~baud', 115200) + 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(.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) - rospy.init_node('display', anonymous=True) rate = rospy.Rate(30) # 30hz # pub joint state @@ -36,6 +54,7 @@ def talker(): marker_.header.frame_id = '/joint1' marker_.ns = 'my_namespace' + print('publishing ...') while not rospy.is_shutdown(): joint_state_send.header.stamp = rospy.Time.now() @@ -44,7 +63,7 @@ def talker(): for index, value in enumerate(angles): data_list.append(value) - rospy.loginfo('{}'.format(data_list)) + # rospy.loginfo('{}'.format(data_list)) joint_state_send.position = data_list pub.publish(joint_state_send) @@ -77,9 +96,6 @@ def talker(): if __name__ == '__main__': - port = subprocess.check_output(['echo -n /dev/ttyUSB*'], - shell=True).decode() - mycobot = MyCobot(port) try: talker() except rospy.ROSInterruptException: diff --git a/scripts/control_slider.py b/scripts/slider_control.py similarity index 77% rename from scripts/control_slider.py rename to scripts/slider_control.py index f565676..3da56fa 100755 --- a/scripts/control_slider.py +++ b/scripts/slider_control.py @@ -9,11 +9,13 @@ 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 = [] - print(data.position) for index, value in enumerate(data.position): data_list.append(value) @@ -22,19 +24,19 @@ def callback(data): def listener(): + global mc rospy.init_node('control_slider', anonymous=True) rospy.Subscriber("joint_states", JointState, callback) + port = rospy.get_param('~port', '/dev/ttyUSB0') + baud = rospy.get_param('~baud', 115200) + print(port, baud) + mc = MyCobot(port, baud) # spin() simply keeps python from exiting until this node is stopped + print('sping ...') rospy.spin() if __name__ == '__main__': - print('sart') - port = subprocess.check_output(['echo -n /dev/ttyUSB*'], - shell=True).decode() - print(port) - mc = MyCobot(port) - print(mc) listener() diff --git a/src/camera_display.cpp b/src/camera_display.cpp new file mode 100644 index 0000000..8df928d --- /dev/null +++ b/src/camera_display.cpp @@ -0,0 +1,30 @@ +#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"); + +} \ No newline at end of file diff --git a/src/opencv_camera.cpp b/src/opencv_camera.cpp new file mode 100644 index 0000000..9ace009 --- /dev/null +++ b/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; + } + +} \ No newline at end of file From 05d9327390a0cab0f5faf0228df021a8d66ecf9a Mon Sep 17 00:00:00 2001 From: zachary Date: Wed, 12 May 2021 19:26:31 +0800 Subject: [PATCH 9/9] change name --- CMakeLists.txt | 2 +- launch/communication_service.launch | 2 +- package.xml | 1 - scripts/camera.py | 2 +- scripts/listen_real.py | 2 +- scripts/{mycobot_ros.py => mycobot_services.py} | 2 +- scripts/teleop_keyboard.py | 2 +- 7 files changed, 6 insertions(+), 7 deletions(-) rename scripts/{mycobot_ros.py => mycobot_services.py} (98%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 27f2481..31beb6b 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,7 +42,7 @@ catkin_install_python(PROGRAMS scripts/follow_display.py scripts/slider_control.py scripts/control_marker.py - scripts/mycobot_ros.py + scripts/mycobot_services.py scripts/listen_real.py scripts/teleop_keyboard.py scripts/client.py diff --git a/launch/communication_service.launch b/launch/communication_service.launch index a9dd474..363568f 100644 --- a/launch/communication_service.launch +++ b/launch/communication_service.launch @@ -3,7 +3,7 @@ - + diff --git a/package.xml b/package.xml index 4d6c7d5..ac79a27 100644 --- a/package.xml +++ b/package.xml @@ -31,7 +31,6 @@ roscpp rospy std_msgs - serial message_runtime actionlib diff --git a/scripts/camera.py b/scripts/camera.py index d5a638f..7d3a33a 100755 --- a/scripts/camera.py +++ b/scripts/camera.py @@ -7,7 +7,7 @@ from cv_bridge import CvBridge, CvBridgeError from sensor_msgs.msg import Image from visualization_msgs.msg import Marker import tf_conversions -from myCobotROS.srv import ( +from mycobot_ros.srv import ( GetCoords, SetCoords, GetAngles, SetAngles, GripperStatus) diff --git a/scripts/listen_real.py b/scripts/listen_real.py index b9085c6..8549633 100755 --- a/scripts/listen_real.py +++ b/scripts/listen_real.py @@ -6,7 +6,7 @@ import math import rospy from sensor_msgs.msg import JointState from std_msgs.msg import Header -from myCobotROS.srv import GetAngles +from mycobot_ros.srv import GetAngles def talker(): diff --git a/scripts/mycobot_ros.py b/scripts/mycobot_services.py similarity index 98% rename from scripts/mycobot_ros.py rename to scripts/mycobot_services.py index d3e73f7..b6f2940 100755 --- a/scripts/mycobot_ros.py +++ b/scripts/mycobot_services.py @@ -1,7 +1,7 @@ #!/usr/bin/env python2 import time import rospy -from myCobotROS.srv import * +from mycobot_ros.srv import * from pymycobot.mycobot import MyCobot diff --git a/scripts/teleop_keyboard.py b/scripts/teleop_keyboard.py index 6f9bc26..c52b336 100755 --- a/scripts/teleop_keyboard.py +++ b/scripts/teleop_keyboard.py @@ -1,6 +1,6 @@ #!/usr/bin/env python from __future__ import print_function -from myCobotROS.srv import ( +from mycobot_ros.srv import ( GetCoords, SetCoords, GetAngles, SetAngles, GripperStatus) import rospy import sys