├── .gitignore ├── CMakeLists.txt ├── README.md ├── package.xml └── scripts ├── hand_gesture.py ├── hand_trakcing.py ├── ngcs ├── 1.ngc ├── 2.ngc ├── 3.ngc ├── 4.ngc ├── 5.ngc ├── 6.ngc └── hand_heart.ngc └── simple_ngc.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.0.2) 2 | project(jetmax_demos) 3 | 4 | ## Compile as C++11, supported in ROS Kinetic and newer 5 | # add_compile_options(-std=c++11) 6 | 7 | ## Find catkin macros and libraries 8 | ## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) 9 | ## is used, also find other catkin packages 10 | find_package(catkin REQUIRED COMPONENTS 11 | rospy 12 | ) 13 | 14 | ## System dependencies are found with CMake's conventions 15 | # find_package(Boost REQUIRED COMPONENTS system) 16 | 17 | 18 | ## Uncomment this if the package has a setup.py. This macro ensures 19 | ## modules and global scripts declared therein get installed 20 | ## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html 21 | # catkin_python_setup() 22 | 23 | ################################################ 24 | ## Declare ROS messages, services and actions ## 25 | ################################################ 26 | 27 | ## To declare and build messages, services or actions from within this 28 | ## package, follow these steps: 29 | ## * Let MSG_DEP_SET be the set of packages whose message types you use in 30 | ## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...). 31 | ## * In the file package.xml: 32 | ## * add a build_depend tag for "message_generation" 33 | ## * add a build_depend and a exec_depend tag for each package in MSG_DEP_SET 34 | ## * If MSG_DEP_SET isn't empty the following dependency has been pulled in 35 | ## but can be declared for certainty nonetheless: 36 | ## * add a exec_depend tag for "message_runtime" 37 | ## * In this file (CMakeLists.txt): 38 | ## * add "message_generation" and every package in MSG_DEP_SET to 39 | ## find_package(catkin REQUIRED COMPONENTS ...) 40 | ## * add "message_runtime" and every package in MSG_DEP_SET to 41 | ## catkin_package(CATKIN_DEPENDS ...) 42 | ## * uncomment the add_*_files sections below as needed 43 | ## and list every .msg/.srv/.action file to be processed 44 | ## * uncomment the generate_messages entry below 45 | ## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...) 46 | 47 | ## Generate messages in the 'msg' folder 48 | # add_message_files( 49 | # FILES 50 | # Message1.msg 51 | # Message2.msg 52 | # ) 53 | 54 | ## Generate services in the 'srv' folder 55 | # add_service_files( 56 | # FILES 57 | # Service1.srv 58 | # Service2.srv 59 | # ) 60 | 61 | ## Generate actions in the 'action' folder 62 | # add_action_files( 63 | # FILES 64 | # Action1.action 65 | # Action2.action 66 | # ) 67 | 68 | ## Generate added messages and services with any dependencies listed here 69 | # generate_messages( 70 | # DEPENDENCIES 71 | # std_msgs # Or other packages containing msgs 72 | # ) 73 | 74 | ################################################ 75 | ## Declare ROS dynamic reconfigure parameters ## 76 | ################################################ 77 | 78 | ## To declare and build dynamic reconfigure parameters within this 79 | ## package, follow these steps: 80 | ## * In the file package.xml: 81 | ## * add a build_depend and a exec_depend tag for "dynamic_reconfigure" 82 | ## * In this file (CMakeLists.txt): 83 | ## * add "dynamic_reconfigure" to 84 | ## find_package(catkin REQUIRED COMPONENTS ...) 85 | ## * uncomment the "generate_dynamic_reconfigure_options" section below 86 | ## and list every .cfg file to be processed 87 | 88 | ## Generate dynamic reconfigure parameters in the 'cfg' folder 89 | # generate_dynamic_reconfigure_options( 90 | # cfg/DynReconf1.cfg 91 | # cfg/DynReconf2.cfg 92 | # ) 93 | 94 | ################################### 95 | ## catkin specific configuration ## 96 | ################################### 97 | ## The catkin_package macro generates cmake config files for your package 98 | ## Declare things to be passed to dependent projects 99 | ## INCLUDE_DIRS: uncomment this if your package contains header files 100 | ## LIBRARIES: libraries you create in this project that dependent projects also need 101 | ## CATKIN_DEPENDS: catkin_packages dependent projects also need 102 | ## DEPENDS: system dependencies of this project that dependent projects also need 103 | catkin_package( 104 | # INCLUDE_DIRS include 105 | # LIBRARIES jetmax_demos 106 | # CATKIN_DEPENDS rospy 107 | # DEPENDS system_lib 108 | ) 109 | 110 | ########### 111 | ## Build ## 112 | ########### 113 | 114 | ## Specify additional locations of header files 115 | ## Your package locations should be listed before other locations 116 | include_directories( 117 | # include 118 | ${catkin_INCLUDE_DIRS} 119 | ) 120 | 121 | ## Declare a C++ library 122 | # add_library(${PROJECT_NAME} 123 | # src/${PROJECT_NAME}/jetmax_demos.cpp 124 | # ) 125 | 126 | ## Add cmake target dependencies of the library 127 | ## as an example, code may need to be generated before libraries 128 | ## either from message generation or dynamic reconfigure 129 | # add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) 130 | 131 | ## Declare a C++ executable 132 | ## With catkin_make all packages are built within a single CMake context 133 | ## The recommended prefix ensures that target names across packages don't collide 134 | # add_executable(${PROJECT_NAME}_node src/jetmax_demos_node.cpp) 135 | 136 | ## Rename C++ executable without prefix 137 | ## The above recommended prefix causes long target names, the following renames the 138 | ## target back to the shorter version for ease of user use 139 | ## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node" 140 | # set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "") 141 | 142 | ## Add cmake target dependencies of the executable 143 | ## same as for the library above 144 | # add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) 145 | 146 | ## Specify libraries to link a library or executable target against 147 | # target_link_libraries(${PROJECT_NAME}_node 148 | # ${catkin_LIBRARIES} 149 | # ) 150 | 151 | ############# 152 | ## Install ## 153 | ############# 154 | 155 | # all install targets should use catkin DESTINATION variables 156 | # See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html 157 | 158 | ## Mark executable scripts (Python etc.) for installation 159 | ## in contrast to setup.py, you can choose the destination 160 | # catkin_install_python(PROGRAMS 161 | # scripts/my_python_script 162 | # DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} 163 | # ) 164 | 165 | ## Mark executables for installation 166 | ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_executables.html 167 | # install(TARGETS ${PROJECT_NAME}_node 168 | # RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} 169 | # ) 170 | 171 | ## Mark libraries for installation 172 | ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html 173 | # install(TARGETS ${PROJECT_NAME} 174 | # ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} 175 | # LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} 176 | # RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} 177 | # ) 178 | 179 | ## Mark cpp header files for installation 180 | # install(DIRECTORY include/${PROJECT_NAME}/ 181 | # DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} 182 | # FILES_MATCHING PATTERN "*.h" 183 | # PATTERN ".svn" EXCLUDE 184 | # ) 185 | 186 | ## Mark other files for installation (e.g. launch and bag files, etc.) 187 | # install(FILES 188 | # # myfile1 189 | # # myfile2 190 | # DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} 191 | # ) 192 | 193 | ############# 194 | ## Testing ## 195 | ############# 196 | 197 | ## Add gtest based cpp test target and link libraries 198 | # catkin_add_gtest(${PROJECT_NAME}-test test/test_jetmax_demos.cpp) 199 | # if(TARGET ${PROJECT_NAME}-test) 200 | # target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}) 201 | # endif() 202 | 203 | ## Add folders to be run by python nosetests 204 | # catkin_add_nosetests(test) 205 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # jetmax_demos 2 | 3 | 4 | 5 | ## 1. Demonstration 6 | 7 | hand_gesture: https://www.youtube.com/watch?v=vrQrUa9UXr8&ab_channel=Hiwonder 8 | 9 | 10 | -------------------------------------------------------------------------------- /package.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | jetmax_demos 4 | 0.0.0 5 | The jetmax_demos package 6 | 7 | 8 | 9 | 10 | lucas 11 | 12 | 13 | 14 | 15 | 16 | TODO 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | catkin 52 | rospy 53 | rospy 54 | rospy 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /scripts/hand_gesture.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import cv2 3 | import math 4 | import threading 5 | import numpy as np 6 | import rospy 7 | import queue 8 | from sensor_msgs.msg import Image 9 | import hiwonder 10 | from hiwonder import serial_servo as ss 11 | import mediapipe as mp 12 | import simple_ngc 13 | 14 | ROS_NODE_NAME = "hand_gesture" 15 | DEFAULT_X, DEFAULT_Y, DEFAULT_Z = 0, 138 + 8.14, 84.4 + 128.4 16 | IMAGE_PIXEL_PRE_100MM_X, IMAGE_PIXEL_PRE_100MM_Y = 260, 280 17 | IMAGE_PROC_SIZE = 640, 480 18 | ORG_PIXEL_X, ORG_PIXEL_Y = 328.3, 380.23 19 | 20 | image_queue = queue.Queue(maxsize=1) 21 | mp_drawing = mp.solutions.drawing_utils 22 | mp_hands = mp.solutions.hands 23 | hands = mp_hands.Hands( 24 | static_image_mode=False, 25 | max_num_hands=2, 26 | min_detection_confidence=0.75, 27 | min_tracking_confidence=0.5) 28 | 29 | 30 | class HandGesture: 31 | def __init__(self): 32 | self.moving_color = None 33 | self.target_colors = {} 34 | self.position = DEFAULT_X, DEFAULT_Y, DEFAULT_X 35 | self.lock = threading.RLock() 36 | self.position = 0, 0, 0 37 | self.runner = None 38 | self.count = 0 39 | self.gesture_str = '' 40 | 41 | 42 | ik = hiwonder.kinematic.IKinematic() 43 | state = HandGesture() 44 | ps = (-205, 0 + 10, 150), (-205, 0 + 10, 120), (-205, 0 + 10, 190) 45 | 46 | 47 | def vector_2d_angle(v1, v2): 48 | """ 49 | Solve the angle between two vector 50 | """ 51 | v1_x = v1[0] 52 | v1_y = v1[1] 53 | v2_x = v2[0] 54 | v2_y = v2[1] 55 | try: 56 | angle_ = math.degrees(math.acos( 57 | (v1_x * v2_x + v1_y * v2_y) / (((v1_x ** 2 + v1_y ** 2) ** 0.5) * ((v2_x ** 2 + v2_y ** 2) ** 0.5)))) 58 | except: 59 | angle_ = 65535. 60 | if angle_ > 180.: 61 | angle_ = 65535. 62 | return angle_ 63 | 64 | 65 | def hand_angle(hand_): 66 | """ 67 | Obtain the angle of the corresponding hand-related vector, and determine the gesture according to the angle 68 | """ 69 | angle_list = [] 70 | # ---------------------------- thumb 71 | angle_ = vector_2d_angle( 72 | ((int(hand_[0][0]) - int(hand_[2][0])), (int(hand_[0][1]) - int(hand_[2][1]))), 73 | ((int(hand_[3][0]) - int(hand_[4][0])), (int(hand_[3][1]) - int(hand_[4][1]))) 74 | ) 75 | angle_list.append(angle_) 76 | # ---------------------------- index 77 | angle_ = vector_2d_angle( 78 | ((int(hand_[0][0]) - int(hand_[6][0])), (int(hand_[0][1]) - int(hand_[6][1]))), 79 | ((int(hand_[7][0]) - int(hand_[8][0])), (int(hand_[7][1]) - int(hand_[8][1]))) 80 | ) 81 | angle_list.append(angle_) 82 | # ---------------------------- middle 83 | angle_ = vector_2d_angle( 84 | ((int(hand_[0][0]) - int(hand_[10][0])), (int(hand_[0][1]) - int(hand_[10][1]))), 85 | ((int(hand_[11][0]) - int(hand_[12][0])), (int(hand_[11][1]) - int(hand_[12][1]))) 86 | ) 87 | angle_list.append(angle_) 88 | # ---------------------------- ring 89 | angle_ = vector_2d_angle( 90 | ((int(hand_[0][0]) - int(hand_[14][0])), (int(hand_[0][1]) - int(hand_[14][1]))), 91 | ((int(hand_[15][0]) - int(hand_[16][0])), (int(hand_[15][1]) - int(hand_[16][1]))) 92 | ) 93 | angle_list.append(angle_) 94 | # ---------------------------- pink 95 | angle_ = vector_2d_angle( 96 | ((int(hand_[0][0]) - int(hand_[18][0])), (int(hand_[0][1]) - int(hand_[18][1]))), 97 | ((int(hand_[19][0]) - int(hand_[20][0])), (int(hand_[19][1]) - int(hand_[20][1]))) 98 | ) 99 | angle_list.append(angle_) 100 | return angle_list 101 | 102 | 103 | def h_gesture(angle_list): 104 | """ 105 | Use the angle of the corresponding hand-related to define the gesture 106 | 107 | """ 108 | thr_angle = 65. 109 | thr_angle_thumb = 53. 110 | thr_angle_s = 49. 111 | gesture_str = None 112 | if 65535. not in angle_list: 113 | if (angle_list[0] > thr_angle_thumb) and (angle_list[1] > thr_angle) and (angle_list[2] > thr_angle) and ( 114 | angle_list[3] > thr_angle) and (angle_list[4] > thr_angle): 115 | gesture_str = "fist" 116 | elif (angle_list[0] < thr_angle_s) and (angle_list[1] < thr_angle_s) and (angle_list[2] > thr_angle) and ( 117 | angle_list[3] > thr_angle) and (angle_list[4] > thr_angle): 118 | gesture_str = "hand_heart" 119 | elif (angle_list[0] < thr_angle_s) and (angle_list[1] < thr_angle_s) and (angle_list[2] > thr_angle) and ( 120 | angle_list[3] > thr_angle) and (angle_list[4] < thr_angle_s): 121 | gesture_str = "nico-nico-ni" 122 | elif (angle_list[0] < thr_angle_s) and (angle_list[1] > thr_angle) and (angle_list[2] > thr_angle) and ( 123 | angle_list[3] > thr_angle) and (angle_list[4] > thr_angle): 124 | gesture_str = "hand_heart" 125 | elif (angle_list[0] > 5) and (angle_list[1] < thr_angle_s) and (angle_list[2] > thr_angle) and ( 126 | angle_list[3] > thr_angle) and (angle_list[4] > thr_angle): 127 | gesture_str = "one" 128 | elif (angle_list[0] > thr_angle_thumb) and (angle_list[1] < thr_angle_s) and (angle_list[2] < thr_angle_s) and ( 129 | angle_list[3] > thr_angle) and (angle_list[4] > thr_angle): 130 | gesture_str = "two" 131 | elif (angle_list[0] > thr_angle_thumb) and (angle_list[1] < thr_angle_s) and (angle_list[2] < thr_angle_s) and ( 132 | angle_list[3] < thr_angle_s) and (angle_list[4] > thr_angle): 133 | gesture_str = "three" 134 | elif (angle_list[0] > thr_angle_thumb) and (angle_list[1] > thr_angle) and (angle_list[2] < thr_angle_s) and ( 135 | angle_list[3] < thr_angle_s) and (angle_list[4] < thr_angle_s): 136 | gesture_str = "three" 137 | elif (angle_list[0] > thr_angle_thumb) and (angle_list[1] < thr_angle_s) and (angle_list[2] < thr_angle_s) and ( 138 | angle_list[3] < thr_angle_s) and (angle_list[4] < thr_angle_s): 139 | gesture_str = "four" 140 | elif (angle_list[0] < thr_angle_s) and (angle_list[1] < thr_angle_s) and (angle_list[2] < thr_angle_s) and ( 141 | angle_list[3] < thr_angle_s) and (angle_list[4] < thr_angle_s): 142 | gesture_str = "five" 143 | elif (angle_list[0] < thr_angle_s) and (angle_list[1] > thr_angle) and (angle_list[2] > thr_angle) and ( 144 | angle_list[3] > thr_angle) and (angle_list[4] < thr_angle_s): 145 | gesture_str = "six" 146 | else: 147 | "none" 148 | return gesture_str 149 | 150 | 151 | ngcs = { 152 | 'one': 'ngcs/1.ngc', 153 | 'two': 'ngcs/2.ngc', 154 | 'three': 'ngcs/3.ngc', 155 | 'four': 'ngcs/4.ngc', 156 | 'five': 'ngcs/5.ngc', 157 | 'six': 'ngcs/6.ngc', 158 | 'hand_heart': 'ngcs/hand_heart.ngc', 159 | } 160 | 161 | 162 | def move_to_pos(x, y, z, t): 163 | pos = ik.resolve(x, y, z) 164 | if pos is None: 165 | return 166 | p1, p2, p3 = pos 167 | if p3 < 490: 168 | p3 = 490 169 | ss.set_position(1, int(p1 + 40), t) 170 | ss.set_position(2, int(p2), t) 171 | ss.set_position(3, int(p3), t) 172 | state.position = x, y, z 173 | 174 | 175 | def draw_num(num): 176 | if num in ngcs: 177 | simple_ngc.draw_ngc(ngcs[num]) 178 | move_to_pos(DEFAULT_X, DEFAULT_Y, DEFAULT_Z, 1000) 179 | rospy.sleep(1.2) 180 | 181 | 182 | def image_proc(): 183 | img = image_queue.get(block=True) 184 | 185 | if state.runner is not None and state.runner.isAlive(): 186 | img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) 187 | cv2.imshow(ROS_NODE_NAME, img) 188 | cv2.waitKey(1) 189 | return 190 | 191 | results = hands.process(img) 192 | img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) 193 | if results.multi_handedness: 194 | for label in results.multi_handedness: 195 | pass 196 | if results.multi_hand_landmarks: 197 | for hand_landmarks in results.multi_hand_landmarks: 198 | rospy.logdebug('hand_landmarks:', hand_landmarks) 199 | mp_drawing.draw_landmarks(img, hand_landmarks, mp_hands.HAND_CONNECTIONS) 200 | hand_local = [] 201 | for i in range(21): 202 | x = hand_landmarks.landmark[i].x * img.shape[1] 203 | y = hand_landmarks.landmark[i].y * img.shape[0] 204 | hand_local.append((x, y)) 205 | if hand_local: 206 | angle_list = hand_angle(hand_local) 207 | gesture_str = h_gesture(angle_list) 208 | cv2.putText(img, gesture_str, (0, 200), 0, 1.5, (100, 100, 255), 5) 209 | if gesture_str != state.gesture_str: 210 | state.count = 0 211 | state.gesture_str = gesture_str 212 | state.count += 1 213 | else: 214 | state.count = 0 215 | 216 | if state.count > 5: 217 | state.count = 0 218 | state.runner = threading.Thread(target=draw_num, args=(state.gesture_str,), daemon=True) 219 | state.runner.start() 220 | 221 | cv2.imshow(ROS_NODE_NAME, img) 222 | cv2.waitKey(1) 223 | 224 | 225 | def image_callback(ros_image): 226 | image = np.ndarray(shape=(ros_image.height, ros_image.width, 3), dtype=np.uint8, buffer=ros_image.data) 227 | image = cv2.flip(image, 1) 228 | try: 229 | image_queue.put_nowait(image.copy()) 230 | except queue.Full: 231 | pass 232 | 233 | 234 | if __name__ == '__main__': 235 | rospy.init_node(ROS_NODE_NAME, log_level=rospy.DEBUG) 236 | rospy.sleep(0.2) 237 | hiwonder.motor1.set_speed(0) 238 | hiwonder.motor2.set_speed(100) 239 | hiwonder.pwm_servo1.set_position(90, 1000) 240 | move_to_pos(DEFAULT_X, DEFAULT_Y, DEFAULT_Z, 1000) 241 | rospy.sleep(1) 242 | hiwonder.motor2.set_speed(0) 243 | image_sub = rospy.Subscriber('/usb_cam/image_rect_color', Image, image_callback) 244 | while True: 245 | try: 246 | image_proc() 247 | if rospy.is_shutdown(): 248 | break 249 | except Exception as e: 250 | print(e) 251 | break 252 | -------------------------------------------------------------------------------- /scripts/hand_trakcing.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import sys 3 | import cv2 4 | import math 5 | import threading 6 | import numpy as np 7 | import rospy 8 | import queue 9 | from sensor_msgs.msg import Image 10 | import hiwonder 11 | import mediapipe as mp 12 | import hiwonder 13 | 14 | ROS_NODE_NAME = "hand_gesture" 15 | 16 | 17 | class HandGesture: 18 | def __init__(self): 19 | self.moving_color = None 20 | self.target_colors = {} 21 | self.lock = threading.RLock 22 | self.position = 0, 0, 0 23 | self.runner = None 24 | self.count = 0 25 | self.gesture_str = '' 26 | self.servo_x = 500 27 | self.pid_x = hiwonder.PID(0.10, 0, 0.01) 28 | self.pid_z = hiwonder.PID(0.13, 0, 0.015) 29 | 30 | 31 | 32 | def vector_2d_angle(v1, v2): 33 | """ 34 | Solve the angle between two vector 35 | """ 36 | v1_x = v1[0] 37 | v1_y = v1[1] 38 | v2_x = v2[0] 39 | v2_y = v2[1] 40 | try: 41 | angle_ = math.degrees(math.acos( 42 | (v1_x * v2_x + v1_y * v2_y) / (((v1_x ** 2 + v1_y ** 2) ** 0.5) * ((v2_x ** 2 + v2_y ** 2) ** 0.5)))) 43 | except: 44 | angle_ = 65535. 45 | if angle_ > 180.: 46 | angle_ = 65535. 47 | return angle_ 48 | 49 | 50 | def hand_angle(hand_): 51 | """ 52 | Obtain the angle of the corresponding hand-related vector, and determine the gesture according to the angle 53 | """ 54 | angle_list = [] 55 | # ---------------------------- thumb 56 | angle_ = vector_2d_angle( 57 | ((int(hand_[0][0]) - int(hand_[2][0])), (int(hand_[0][1]) - int(hand_[2][1]))), 58 | ((int(hand_[3][0]) - int(hand_[4][0])), (int(hand_[3][1]) - int(hand_[4][1]))) 59 | ) 60 | angle_list.append(angle_) 61 | # ---------------------------- index 62 | angle_ = vector_2d_angle( 63 | ((int(hand_[0][0]) - int(hand_[6][0])), (int(hand_[0][1]) - int(hand_[6][1]))), 64 | ((int(hand_[7][0]) - int(hand_[8][0])), (int(hand_[7][1]) - int(hand_[8][1]))) 65 | ) 66 | angle_list.append(angle_) 67 | # ---------------------------- middle 68 | angle_ = vector_2d_angle( 69 | ((int(hand_[0][0]) - int(hand_[10][0])), (int(hand_[0][1]) - int(hand_[10][1]))), 70 | ((int(hand_[11][0]) - int(hand_[12][0])), (int(hand_[11][1]) - int(hand_[12][1]))) 71 | ) 72 | angle_list.append(angle_) 73 | # ---------------------------- ring 74 | angle_ = vector_2d_angle( 75 | ((int(hand_[0][0]) - int(hand_[14][0])), (int(hand_[0][1]) - int(hand_[14][1]))), 76 | ((int(hand_[15][0]) - int(hand_[16][0])), (int(hand_[15][1]) - int(hand_[16][1]))) 77 | ) 78 | angle_list.append(angle_) 79 | # ---------------------------- pink 80 | angle_ = vector_2d_angle( 81 | ((int(hand_[0][0]) - int(hand_[18][0])), (int(hand_[0][1]) - int(hand_[18][1]))), 82 | ((int(hand_[19][0]) - int(hand_[20][0])), (int(hand_[19][1]) - int(hand_[20][1]))) 83 | ) 84 | angle_list.append(angle_) 85 | return angle_list 86 | 87 | 88 | def h_gesture(angle_list): 89 | """ 90 | Use the angle of the corresponding hand-related to define the gesture 91 | 92 | """ 93 | thr_angle = 65. 94 | thr_angle_thumb = 53. 95 | thr_angle_s = 49. 96 | gesture_str = None 97 | if 65535. not in angle_list: 98 | if (angle_list[0] > thr_angle_thumb) and (angle_list[1] > thr_angle) and (angle_list[2] > thr_angle) and ( 99 | angle_list[3] > thr_angle) and (angle_list[4] > thr_angle): 100 | gesture_str = "fist" 101 | elif (angle_list[0] < thr_angle_s) and (angle_list[1] < thr_angle_s) and (angle_list[2] > thr_angle) and ( 102 | angle_list[3] > thr_angle) and (angle_list[4] > thr_angle): 103 | gesture_str = "hand_heart" 104 | elif (angle_list[0] < thr_angle_s) and (angle_list[1] < thr_angle_s) and (angle_list[2] > thr_angle) and ( 105 | angle_list[3] > thr_angle) and (angle_list[4] < thr_angle_s): 106 | gesture_str = "nico-nico-ni" 107 | elif (angle_list[0] < thr_angle_s) and (angle_list[1] > thr_angle) and (angle_list[2] > thr_angle) and ( 108 | angle_list[3] > thr_angle) and (angle_list[4] > thr_angle): 109 | gesture_str = "hand_heart" 110 | elif (angle_list[0] > 5) and (angle_list[1] < thr_angle_s) and (angle_list[2] > thr_angle) and ( 111 | angle_list[3] > thr_angle) and (angle_list[4] > thr_angle): 112 | gesture_str = "one" 113 | elif (angle_list[0] > thr_angle_thumb) and (angle_list[1] < thr_angle_s) and (angle_list[2] < thr_angle_s) and ( 114 | angle_list[3] > thr_angle) and (angle_list[4] > thr_angle): 115 | gesture_str = "two" 116 | elif (angle_list[0] > thr_angle_thumb) and (angle_list[1] < thr_angle_s) and (angle_list[2] < thr_angle_s) and ( 117 | angle_list[3] < thr_angle_s) and (angle_list[4] > thr_angle): 118 | gesture_str = "three" 119 | elif (angle_list[0] > thr_angle_thumb) and (angle_list[1] > thr_angle) and (angle_list[2] < thr_angle_s) and ( 120 | angle_list[3] < thr_angle_s) and (angle_list[4] < thr_angle_s): 121 | gesture_str = "OK" 122 | elif (angle_list[0] > thr_angle_thumb) and (angle_list[1] < thr_angle_s) and (angle_list[2] < thr_angle_s) and ( 123 | angle_list[3] < thr_angle_s) and (angle_list[4] < thr_angle_s): 124 | gesture_str = "four" 125 | elif (angle_list[0] < thr_angle_s) and (angle_list[1] < thr_angle_s) and (angle_list[2] < thr_angle_s) and ( 126 | angle_list[3] < thr_angle_s) and (angle_list[4] < thr_angle_s): 127 | gesture_str = "five" 128 | elif (angle_list[0] < thr_angle_s) and (angle_list[1] > thr_angle) and (angle_list[2] > thr_angle) and ( 129 | angle_list[3] > thr_angle) and (angle_list[4] < thr_angle_s): 130 | gesture_str = "six" 131 | else: 132 | "none" 133 | return gesture_str 134 | 135 | 136 | 137 | 138 | def image_proc(img): 139 | ret_img = np.copy(img) 140 | if state.runner is not None: 141 | return img_ret 142 | 143 | results = hands.process(img) 144 | if results.multi_handedness: 145 | for label in results.multi_handedness: 146 | print(label) 147 | if results.multi_hand_landmarks: 148 | for hand_landmarks in results.multi_hand_landmarks: 149 | mp_drawing.draw_landmarks(ret_img, hand_landmarks, mp_hands.HAND_CONNECTIONS) 150 | hand_local = [(landmark.x * ret_img.shape[1], landmark.y * ret_img.shape[0]) for landmark in hand_landmarks.landmark] 151 | if hand_local: 152 | angle_list = hand_angle(hand_local) 153 | gesture_str = h_gesture(angle_list) 154 | if gesture_str == 'fist': 155 | hiwonder.buzzer.on() 156 | else: 157 | hiwonder.buzzer.off() 158 | print(hand_local[0]) 159 | x, y = hand_local[0] 160 | if abs(320 - x) > 0: 161 | e = 320 - x 162 | state.pid_x.update(e) 163 | state.servo_x += state.pid_x.output 164 | jetmax.set_servo(1, state.servo_x, 0.01) 165 | if abs(300 - y) > 0: 166 | e = 300 - y 167 | state.pid_z.update(e) 168 | cx, cy, cz = jetmax.position 169 | cz -= state.pid_z.output 170 | jetmax.set_position((cx, cy, cz), 0.01) 171 | else: 172 | state.count = 0 173 | 174 | return ret_img 175 | 176 | 177 | def image_proc_b(): 178 | image = image_queue.get(block=True) 179 | image = image_proc(image) 180 | image = cv2.resize(image, (1024, 768)) 181 | image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) 182 | cv2.imshow(ROS_NODE_NAME, image) 183 | cv2.waitKey(1) 184 | 185 | 186 | def image_callback(ros_image): 187 | try: 188 | image = np.ndarray(shape=(ros_image.height, ros_image.width, 3), dtype=np.uint8, buffer=ros_image.data) 189 | image = cv2.flip(image, 1) 190 | image_queue.put_nowait(image) 191 | except: 192 | pass 193 | 194 | 195 | 196 | if __name__ == '__main__': 197 | rospy.init_node(ROS_NODE_NAME, log_level=rospy.DEBUG) 198 | rospy.sleep(0.2) 199 | state = HandGesture() 200 | image_queue = queue.Queue(maxsize=1) 201 | mp_drawing = mp.solutions.drawing_utils 202 | mp_hands = mp.solutions.hands 203 | hands = mp_hands.Hands( 204 | static_image_mode=False, 205 | max_num_hands=1, 206 | min_detection_confidence=0.70, 207 | min_tracking_confidence=0.3) 208 | 209 | jetmax = hiwonder.JetMax() 210 | jetmax.go_home() 211 | rospy.sleep(1) 212 | hiwonder.motor2.set_speed(0) 213 | image_sub = rospy.Subscriber('/usb_cam/image_rect_color', Image, image_callback, queue_size=1) 214 | while True: 215 | try: 216 | image_proc_b() 217 | except Exception as e: 218 | print(e) 219 | sys.exit() 220 | -------------------------------------------------------------------------------- /scripts/ngcs/1.ngc: -------------------------------------------------------------------------------- 1 | (Generated with: DXF2GCODE, Version: Py3.7.10 PyQt5.10.1, Date: $Date: Fri Oct 25 20:45:56 2019 +0200 $) 2 | (Created from file: /home/lucas/1.dxf) 3 | (Output format description: G-CODE for LinuxCNC) 4 | (Time: Wed Jul 14 19:51:40 2021) 5 | G21 (Units in millimeters) 6 | G90 (Absolute programming) 7 | G64 (Default cutting) G17 (XY plane) G40 (Cancel radius comp.) G49 (Cancel length comp.) 8 | G0 Z 100.000 9 | 10 | (*** LAYER: 0 ***) 11 | T1 M6 12 | S6000 13 | 14 | (* SHAPE Nr: 0 *) 15 | G0 X 0.387 Y 99.938 16 | M3 M8 17 | G0 Z 30.000 18 | F150 19 | G1 Z 30.000 20 | F400 21 | G1 X 0.387 Y 99.938 22 | G1 X 0.470 Y 99.912 23 | G1 X 0.551 Y 99.878 24 | G1 X 0.629 Y 99.838 25 | G1 X 0.703 Y 99.792 26 | G1 X 0.773 Y 99.738 27 | G1 X 0.838 Y 99.680 28 | G1 X 0.897 Y 99.615 29 | G1 X 0.950 Y 99.546 30 | G1 X 0.997 Y 99.472 31 | G1 X 1.038 Y 99.394 32 | G1 X 1.000 Y -1.029 33 | F100 34 | G1 Z 50.000 35 | G0 Z 100.000 36 | M9 M5 37 | G0 X 0.000 Y 0.000 38 | M2 (Program end) 39 | -------------------------------------------------------------------------------- /scripts/ngcs/2.ngc: -------------------------------------------------------------------------------- 1 | (Generated with: DXF2GCODE, Version: Py3.7.10 PyQt5.10.1, Date: $Date: Fri Oct 25 20:45:56 2019 +0200 $) 2 | (Created from file: /home/lucas/2.dxf) 3 | (Output format description: G-CODE for LinuxCNC) 4 | (Time: Wed Jul 14 17:42:28 2021) 5 | G21 (Units in millimeters) 6 | G90 (Absolute programming) 7 | G64 (Default cutting) G17 (XY plane) G40 (Cancel radius comp.) G49 (Cancel length comp.) 8 | G0 Z 100.000 9 | 10 | (*** LAYER: 0 ***) 11 | T1 M6 12 | S6000 13 | 14 | (* SHAPE Nr: 0 *) 15 | G0 X -28.221 Y 81.245 16 | M3 M8 17 | G0 Z 30.000 18 | F150 19 | G1 Z 30.000 20 | F400 21 | G1 X -28.221 Y 86.007 22 | G1 X -28.218 Y 86.084 23 | G1 X -28.209 Y 86.161 24 | G1 X -28.195 Y 86.236 25 | G1 X -28.174 Y 86.311 26 | G1 X -28.148 Y 86.383 27 | G1 X -28.116 Y 86.454 28 | G1 X -23.354 Y 95.978 29 | G1 X -23.315 Y 96.048 30 | G1 X -23.271 Y 96.115 31 | G1 X -23.221 Y 96.178 32 | G1 X -23.166 Y 96.238 33 | G1 X -18.405 Y 100.999 34 | G1 X -18.346 Y 101.054 35 | G1 X -18.282 Y 101.104 36 | G1 X -18.215 Y 101.148 37 | G1 X -18.145 Y 101.187 38 | G1 X -8.621 Y 105.949 39 | G1 X -8.550 Y 105.981 40 | G1 X -8.478 Y 106.007 41 | G1 X -8.403 Y 106.027 42 | G1 X -8.328 Y 106.042 43 | G1 X -8.251 Y 106.051 44 | G1 X -8.174 Y 106.054 45 | G1 X 10.874 Y 106.054 46 | G1 X 10.951 Y 106.051 47 | G1 X 11.028 Y 106.042 48 | G1 X 11.104 Y 106.027 49 | G1 X 11.178 Y 106.007 50 | G1 X 11.251 Y 105.981 51 | G1 X 11.321 Y 105.949 52 | G1 X 20.845 Y 101.187 53 | G1 X 20.915 Y 101.148 54 | G1 X 20.983 Y 101.104 55 | G1 X 21.046 Y 101.054 56 | G1 X 21.105 Y 100.999 57 | G1 X 25.867 Y 96.238 58 | G1 X 25.921 Y 96.178 59 | G1 X 25.971 Y 96.115 60 | G1 X 26.015 Y 96.048 61 | G1 X 26.054 Y 95.978 62 | G1 X 30.816 Y 86.454 63 | G1 X 30.848 Y 86.383 64 | G1 X 30.874 Y 86.311 65 | G1 X 30.895 Y 86.236 66 | G1 X 30.910 Y 86.161 67 | G1 X 30.919 Y 86.084 68 | G1 X 30.922 Y 86.007 69 | G1 X 30.922 Y 76.483 70 | G1 X 30.919 Y 76.406 71 | G1 X 30.910 Y 76.329 72 | G1 X 30.895 Y 76.253 73 | G1 X 30.874 Y 76.179 74 | G1 X 30.848 Y 76.106 75 | G1 X 30.816 Y 76.036 76 | G1 X 26.054 Y 66.512 77 | G1 X 26.025 Y 66.457 78 | G1 X 25.992 Y 66.404 79 | G1 X 16.468 Y 52.119 80 | G1 X 16.430 Y 52.065 81 | G1 X 16.388 Y 52.014 82 | G1 X 16.343 Y 51.966 83 | G1 X -29.569 Y 6.054 84 | G1 X 34.683 Y 6.054 85 | F150 86 | G1 Z 30.000 87 | G0 Z 100.000 88 | M9 M5 89 | G0 X 0.000 Y 0.000 90 | M2 (Program end) -------------------------------------------------------------------------------- /scripts/ngcs/3.ngc: -------------------------------------------------------------------------------- 1 | (Generated with: DXF2GCODE, Version: Py3.7.10 PyQt5.10.1, Date: $Date: Fri Oct 25 20:45:56 2019 +0200 $) 2 | (Created from file: /home/lucas/3.dxf) 3 | (Output format description: G-CODE for LinuxCNC) 4 | (Time: Thu Jul 15 10:50:26 2021) 5 | G21 (Units in millimeters) 6 | G90 (Absolute programming) 7 | G64 (Default cutting) G17 (XY plane) G40 (Cancel radius comp.) G49 (Cancel length comp.) 8 | G0 Z 100.000 9 | 10 | (*** LAYER: 0 ***) 11 | T1 M6 12 | S6000 13 | 14 | (* SHAPE Nr: 0 *) 15 | G0 X -19.610 Y 104.420 16 | M3 M8 17 | G0 Z 30.000 18 | F150 19 | G1 Z 30.000 20 | F600 21 | G1 X 2.612 Y 104.420 22 | G1 X 3.041 Y 104.416 23 | G1 X 3.470 Y 104.404 24 | G1 X 3.899 Y 104.384 25 | G1 X 4.327 Y 104.357 26 | G1 X 4.755 Y 104.321 27 | G1 X 5.182 Y 104.277 28 | G1 X 5.608 Y 104.226 29 | G1 X 6.033 Y 104.167 30 | G1 X 6.457 Y 104.100 31 | G1 X 6.879 Y 104.025 32 | G1 X 7.300 Y 103.942 33 | G1 X 7.720 Y 103.851 34 | G1 X 8.137 Y 103.753 35 | G1 X 8.553 Y 103.647 36 | G1 X 8.967 Y 103.534 37 | G1 X 9.379 Y 103.412 38 | G1 X 9.788 Y 103.283 39 | G1 X 10.195 Y 103.147 40 | G1 X 10.599 Y 103.003 41 | G1 X 11.001 Y 102.852 42 | G1 X 11.400 Y 102.693 43 | G1 X 11.795 Y 102.527 44 | G1 X 12.188 Y 102.354 45 | G1 X 12.577 Y 102.173 46 | G1 X 12.963 Y 101.986 47 | G1 X 13.345 Y 101.791 48 | G1 X 13.724 Y 101.589 49 | G1 X 14.099 Y 101.380 50 | G1 X 14.470 Y 101.164 51 | G1 X 14.837 Y 100.942 52 | G1 X 15.200 Y 100.713 53 | G1 X 15.558 Y 100.477 54 | G1 X 15.912 Y 100.234 55 | G1 X 16.262 Y 99.985 56 | G1 X 16.607 Y 99.730 57 | G1 X 16.947 Y 99.468 58 | G1 X 17.282 Y 99.200 59 | G1 X 17.612 Y 98.926 60 | G1 X 17.937 Y 98.645 61 | G1 X 18.257 Y 98.359 62 | G1 X 18.571 Y 98.067 63 | G1 X 18.880 Y 97.769 64 | G1 X 19.184 Y 97.466 65 | G1 X 19.481 Y 97.157 66 | G1 X 19.774 Y 96.843 67 | G1 X 20.060 Y 96.523 68 | G1 X 20.340 Y 96.198 69 | G1 X 20.614 Y 95.868 70 | G1 X 20.882 Y 95.532 71 | G1 X 21.144 Y 95.192 72 | G1 X 21.399 Y 94.848 73 | G1 X 21.648 Y 94.498 74 | G1 X 21.891 Y 94.144 75 | G1 X 22.127 Y 93.786 76 | G1 X 22.356 Y 93.423 77 | G1 X 22.579 Y 93.056 78 | G1 X 22.794 Y 92.685 79 | G1 X 23.003 Y 92.310 80 | G1 X 23.205 Y 91.931 81 | G1 X 23.400 Y 91.549 82 | G1 X 23.588 Y 91.163 83 | G1 X 23.768 Y 90.774 84 | G1 X 23.941 Y 90.381 85 | G1 X 24.107 Y 89.985 86 | G1 X 24.266 Y 89.587 87 | G1 X 24.417 Y 89.185 88 | G1 X 24.561 Y 88.781 89 | G1 X 24.698 Y 88.374 90 | G1 X 24.827 Y 87.965 91 | G1 X 24.948 Y 87.553 92 | G1 X 25.061 Y 87.139 93 | G1 X 25.167 Y 86.723 94 | G1 X 25.266 Y 86.305 95 | G1 X 25.356 Y 85.886 96 | G1 X 25.439 Y 85.465 97 | G1 X 25.514 Y 85.042 98 | G1 X 25.581 Y 84.619 99 | G1 X 25.640 Y 84.193 100 | G1 X 25.692 Y 83.767 101 | G1 X 25.735 Y 83.341 102 | G1 X 25.771 Y 82.913 103 | G1 X 25.799 Y 82.485 104 | G1 X 25.818 Y 82.056 105 | G1 X 25.830 Y 81.627 106 | G1 X 25.834 Y 81.198 107 | G1 X 25.830 Y 80.769 108 | G1 X 25.818 Y 80.340 109 | G1 X 25.799 Y 79.911 110 | G1 X 25.771 Y 79.483 111 | G1 X 25.735 Y 79.055 112 | G1 X 25.692 Y 78.628 113 | G1 X 25.640 Y 78.202 114 | G1 X 25.581 Y 77.777 115 | G1 X 25.514 Y 77.353 116 | G1 X 25.439 Y 76.931 117 | G1 X 25.356 Y 76.510 118 | G1 X 25.266 Y 76.090 119 | G1 X 25.167 Y 75.672 120 | G1 X 25.061 Y 75.257 121 | G1 X 24.948 Y 74.843 122 | G1 X 24.827 Y 74.431 123 | G1 X 24.698 Y 74.022 124 | G1 X 24.561 Y 73.615 125 | G1 X 24.417 Y 73.211 126 | G1 X 24.266 Y 72.809 127 | G1 X 24.107 Y 72.410 128 | G1 X 23.941 Y 72.015 129 | G1 X 23.768 Y 71.622 130 | G1 X 23.588 Y 71.233 131 | G1 X 23.400 Y 70.847 132 | G1 X 23.205 Y 70.464 133 | G1 X 23.003 Y 70.086 134 | G1 X 22.794 Y 69.711 135 | G1 X 22.579 Y 69.340 136 | G1 X 22.356 Y 68.973 137 | G1 X 22.127 Y 68.610 138 | G1 X 21.891 Y 68.252 139 | G1 X 21.648 Y 67.898 140 | G1 X 21.399 Y 67.548 141 | G1 X 21.144 Y 67.203 142 | G1 X 20.882 Y 66.863 143 | G1 X 20.614 Y 66.528 144 | G1 X 20.340 Y 66.198 145 | G1 X 20.060 Y 65.873 146 | G1 X 19.774 Y 65.553 147 | G1 X 19.481 Y 65.239 148 | G1 X 19.184 Y 64.930 149 | G1 X 18.880 Y 64.626 150 | G1 X 18.571 Y 64.328 151 | G1 X 18.257 Y 64.036 152 | G1 X 17.937 Y 63.750 153 | G1 X 17.612 Y 63.470 154 | G1 X 17.282 Y 63.196 155 | G1 X 16.947 Y 62.928 156 | G1 X 16.607 Y 62.666 157 | G1 X 16.262 Y 62.411 158 | G1 X 15.912 Y 62.162 159 | G1 X 15.558 Y 61.919 160 | G1 X 15.200 Y 61.683 161 | G1 X 14.837 Y 61.454 162 | G1 X 14.470 Y 61.231 163 | G1 X 14.099 Y 61.016 164 | G1 X 13.724 Y 60.807 165 | G1 X 13.345 Y 60.605 166 | G1 X 12.963 Y 60.410 167 | G1 X 12.577 Y 60.222 168 | G1 X 12.188 Y 60.042 169 | G1 X 11.795 Y 59.869 170 | G1 X 11.400 Y 59.702 171 | G1 X 11.001 Y 59.544 172 | G1 X 10.599 Y 59.392 173 | G1 X 10.195 Y 59.249 174 | G1 X 9.788 Y 59.112 175 | G1 X 9.379 Y 58.983 176 | G1 X 8.967 Y 58.862 177 | G1 X 8.553 Y 58.748 178 | G1 X 8.137 Y 58.643 179 | G1 X 7.720 Y 58.544 180 | G1 X 7.300 Y 58.454 181 | G1 X 6.879 Y 58.371 182 | G1 X 6.457 Y 58.296 183 | G1 X 6.033 Y 58.229 184 | G1 X 5.608 Y 58.170 185 | G1 X 5.182 Y 58.118 186 | G1 X 4.755 Y 58.075 187 | G1 X 4.327 Y 58.039 188 | G1 X 3.899 Y 58.011 189 | G1 X 3.470 Y 57.991 190 | G1 X 3.041 Y 57.980 191 | G1 X 2.612 Y 57.976 192 | G1 X -8.499 Y 57.976 193 | G1 X 2.612 Y 59.420 194 | G1 X 3.041 Y 59.416 195 | G1 X 3.470 Y 59.404 196 | G1 X 3.899 Y 59.384 197 | G1 X 4.327 Y 59.357 198 | G1 X 4.755 Y 59.321 199 | G1 X 5.182 Y 59.277 200 | G1 X 5.608 Y 59.226 201 | G1 X 6.033 Y 59.167 202 | G1 X 6.457 Y 59.100 203 | G1 X 6.879 Y 59.025 204 | G1 X 7.300 Y 58.942 205 | G1 X 7.720 Y 58.851 206 | G1 X 8.137 Y 58.753 207 | G1 X 8.553 Y 58.647 208 | G1 X 8.967 Y 58.534 209 | G1 X 9.379 Y 58.412 210 | G1 X 9.788 Y 58.283 211 | G1 X 10.195 Y 58.147 212 | G1 X 10.599 Y 58.003 213 | G1 X 11.001 Y 57.852 214 | G1 X 11.400 Y 57.693 215 | G1 X 11.795 Y 57.527 216 | G1 X 12.188 Y 57.354 217 | G1 X 12.577 Y 57.173 218 | G1 X 12.963 Y 56.986 219 | G1 X 13.346 Y 56.791 220 | G1 X 13.724 Y 56.589 221 | G1 X 14.099 Y 56.380 222 | G1 X 14.470 Y 56.164 223 | G1 X 14.837 Y 55.942 224 | G1 X 15.200 Y 55.713 225 | G1 X 15.558 Y 55.477 226 | G1 X 15.912 Y 55.234 227 | G1 X 16.262 Y 54.985 228 | G1 X 16.607 Y 54.730 229 | G1 X 16.947 Y 54.468 230 | G1 X 17.282 Y 54.200 231 | G1 X 17.612 Y 53.926 232 | G1 X 17.937 Y 53.645 233 | G1 X 18.257 Y 53.359 234 | G1 X 18.571 Y 53.067 235 | G1 X 18.880 Y 52.769 236 | G1 X 19.184 Y 52.466 237 | G1 X 19.482 Y 52.157 238 | G1 X 19.774 Y 51.843 239 | G1 X 20.060 Y 51.523 240 | G1 X 20.340 Y 51.198 241 | G1 X 20.614 Y 50.868 242 | G1 X 20.882 Y 50.532 243 | G1 X 21.144 Y 50.192 244 | G1 X 21.399 Y 49.848 245 | G1 X 21.648 Y 49.498 246 | G1 X 21.891 Y 49.144 247 | G1 X 22.127 Y 48.786 248 | G1 X 22.356 Y 48.423 249 | G1 X 22.579 Y 48.056 250 | G1 X 22.794 Y 47.685 251 | G1 X 23.003 Y 47.310 252 | G1 X 23.205 Y 46.931 253 | G1 X 23.400 Y 46.549 254 | G1 X 23.588 Y 46.163 255 | G1 X 23.768 Y 45.774 256 | G1 X 23.941 Y 45.381 257 | G1 X 24.107 Y 44.985 258 | G1 X 24.266 Y 44.587 259 | G1 X 24.417 Y 44.185 260 | G1 X 24.561 Y 43.781 261 | G1 X 24.698 Y 43.374 262 | G1 X 24.827 Y 42.965 263 | G1 X 24.948 Y 42.553 264 | G1 X 25.061 Y 42.139 265 | G1 X 25.167 Y 41.723 266 | G1 X 25.266 Y 41.305 267 | G1 X 25.356 Y 40.886 268 | G1 X 25.439 Y 40.465 269 | G1 X 25.514 Y 40.042 270 | G1 X 25.581 Y 39.619 271 | G1 X 25.640 Y 39.193 272 | G1 X 25.692 Y 38.767 273 | G1 X 25.735 Y 38.341 274 | G1 X 25.771 Y 37.913 275 | G1 X 25.799 Y 37.485 276 | G1 X 25.818 Y 37.056 277 | G1 X 25.830 Y 36.627 278 | G1 X 25.834 Y 36.198 279 | G1 X 25.834 Y 25.642 280 | G1 X 25.830 Y 25.213 281 | G1 X 25.818 Y 24.784 282 | G1 X 25.799 Y 24.355 283 | G1 X 25.771 Y 23.927 284 | G1 X 25.735 Y 23.500 285 | G1 X 25.692 Y 23.073 286 | G1 X 25.640 Y 22.647 287 | G1 X 25.581 Y 22.222 288 | G1 X 25.514 Y 21.798 289 | G1 X 25.439 Y 21.375 290 | G1 X 25.356 Y 20.954 291 | G1 X 25.266 Y 20.535 292 | G1 X 25.167 Y 20.117 293 | G1 X 25.061 Y 19.701 294 | G1 X 24.948 Y 19.287 295 | G1 X 24.827 Y 18.876 296 | G1 X 24.698 Y 18.466 297 | G1 X 24.561 Y 18.059 298 | G1 X 24.417 Y 17.655 299 | G1 X 24.266 Y 17.253 300 | G1 X 24.107 Y 16.855 301 | G1 X 23.941 Y 16.459 302 | G1 X 23.768 Y 16.066 303 | G1 X 23.587 Y 15.677 304 | G1 X 23.400 Y 15.291 305 | G1 X 23.205 Y 14.909 306 | G1 X 23.003 Y 14.530 307 | G1 X 22.794 Y 14.155 308 | G1 X 22.579 Y 13.784 309 | G1 X 22.356 Y 13.417 310 | G1 X 22.127 Y 13.055 311 | G1 X 21.891 Y 12.696 312 | G1 X 21.648 Y 12.342 313 | G1 X 21.399 Y 11.993 314 | G1 X 21.144 Y 11.648 315 | G1 X 20.882 Y 11.308 316 | G1 X 20.614 Y 10.973 317 | G1 X 20.340 Y 10.642 318 | G1 X 20.060 Y 10.317 319 | G1 X 19.774 Y 9.998 320 | G1 X 19.481 Y 9.683 321 | G1 X 19.184 Y 9.374 322 | G1 X 18.880 Y 9.071 323 | G1 X 18.571 Y 8.773 324 | G1 X 18.257 Y 8.481 325 | G1 X 17.937 Y 8.195 326 | G1 X 17.612 Y 7.914 327 | G1 X 17.282 Y 7.640 328 | G1 X 16.947 Y 7.372 329 | G1 X 16.607 Y 7.111 330 | G1 X 16.262 Y 6.855 331 | G1 X 15.912 Y 6.606 332 | G1 X 15.558 Y 6.364 333 | G1 X 15.200 Y 6.128 334 | G1 X 14.837 Y 5.898 335 | G1 X 14.470 Y 5.676 336 | G1 X 14.099 Y 5.460 337 | G1 X 13.724 Y 5.251 338 | G1 X 13.345 Y 5.049 339 | G1 X 12.963 Y 4.855 340 | G1 X 12.577 Y 4.667 341 | G1 X 12.188 Y 4.486 342 | G1 X 11.795 Y 4.313 343 | G1 X 11.400 Y 4.147 344 | G1 X 11.001 Y 3.988 345 | G1 X 10.599 Y 3.837 346 | G1 X 10.195 Y 3.693 347 | G1 X 9.788 Y 3.557 348 | G1 X 9.379 Y 3.428 349 | G1 X 8.967 Y 3.307 350 | G1 X 8.553 Y 3.193 351 | G1 X 8.137 Y 3.087 352 | G1 X 7.720 Y 2.989 353 | G1 X 7.300 Y 2.898 354 | G1 X 6.879 Y 2.815 355 | G1 X 6.457 Y 2.741 356 | G1 X 6.033 Y 2.673 357 | G1 X 5.608 Y 2.614 358 | G1 X 5.182 Y 2.563 359 | G1 X 4.755 Y 2.519 360 | G1 X 4.327 Y 2.483 361 | G1 X 3.899 Y 2.456 362 | G1 X 3.470 Y 2.436 363 | G1 X 3.041 Y 2.424 364 | G1 X 2.612 Y 2.420 365 | G1 X -19.610 Y 10.420 366 | F150 367 | G1 Z 60.000 368 | G0 Z 100.000 369 | M9 M5 370 | G0 X 0.000 Y 0.000 371 | M2 (Program end) 372 | -------------------------------------------------------------------------------- /scripts/ngcs/4.ngc: -------------------------------------------------------------------------------- 1 | (Generated with: DXF2GCODE, Version: Py3.7.10 PyQt5.10.1, Date: $Date: Fri Oct 25 20:45:56 2019 +0200 $) 2 | (Created from file: /home/lucas/4.dxf) 3 | (Output format description: G-CODE for LinuxCNC) 4 | (Time: Wed Jul 14 19:47:30 2021) 5 | G21 (Units in millimeters) 6 | G90 (Absolute programming) 7 | G64 (Default cutting) G17 (XY plane) G40 (Cancel radius comp.) G49 (Cancel length comp.) 8 | G0 Z 100.000 9 | 10 | (*** LAYER: 0 ***) 11 | T1 M6 12 | S6000 13 | 14 | (* SHAPE Nr: 0 *) 15 | G0 X -13.076 Y 100.811 16 | M3 M8 17 | G0 Z 30.000 18 | F150 19 | G1 Z 30.000 20 | F400 21 | G1 X -34.934 Y 24.308 22 | G1 X 30.296 Y 24.308 23 | F150 24 | G1 Z 50.000 25 | G0 Z 100.000 26 | M9 M5 27 | 28 | (* SHAPE Nr: 1 *) 29 | G0 X 3.629 Y 90.099 30 | M3 M8 31 | G0 Z 30.000 32 | G1 Z 30.000 33 | F400 34 | G1 X 3.629 Y -4.889 35 | F150 36 | G1 Z 30.000 37 | G0 Z 100.000 38 | M9 M5 39 | G0 X 0.000 Y 0.000 40 | M2 (Program end) 41 | -------------------------------------------------------------------------------- /scripts/ngcs/5.ngc: -------------------------------------------------------------------------------- 1 | (Generated with: DXF2GCODE, Version: Py3.7.10 PyQt5.10.1, Date: $Date: Fri Oct 25 20:45:56 2019 +0200 $) 2 | (Created from file: /home/lucas/5.dxf) 3 | (Output format description: G-CODE for LinuxCNC) 4 | (Time: Thu Jul 15 10:47:51 2021) 5 | G21 (Units in millimeters) 6 | G90 (Absolute programming) 7 | G64 (Default cutting) G17 (XY plane) G40 (Cancel radius comp.) G49 (Cancel length comp.) 8 | G0 Z 100.000 9 | 10 | (*** LAYER: 0 ***) 11 | T1 M6 12 | S6000 13 | 14 | (* SHAPE Nr: 0 *) 15 | G0 X -21.295 Y 101.825 16 | M3 M8 17 | G0 Z 30.000 18 | F150 19 | G1 Z 30.000 20 | F400 21 | G1 X -26.963 Y 49.582 22 | G1 X -24.209 Y 52.336 23 | G1 X -24.152 Y 52.389 24 | G1 X -24.091 Y 52.437 25 | G1 X -24.027 Y 52.480 26 | G1 X -23.960 Y 52.518 27 | G1 X -23.890 Y 52.551 28 | G1 X -23.818 Y 52.578 29 | G1 X -9.532 Y 57.340 30 | G1 X -9.455 Y 57.362 31 | G1 X -9.376 Y 57.378 32 | G1 X -9.296 Y 57.388 33 | G1 X -9.216 Y 57.391 34 | G1 X 5.070 Y 57.391 35 | G1 X 5.150 Y 57.388 36 | G1 X 5.230 Y 57.378 37 | G1 X 5.309 Y 57.362 38 | G1 X 5.386 Y 57.340 39 | G1 X 19.672 Y 52.578 40 | G1 X 19.744 Y 52.551 41 | G1 X 19.814 Y 52.518 42 | G1 X 19.881 Y 52.480 43 | G1 X 19.946 Y 52.437 44 | G1 X 20.006 Y 52.389 45 | G1 X 20.063 Y 52.336 46 | G1 X 29.587 Y 42.813 47 | G1 X 29.639 Y 42.756 48 | G1 X 29.687 Y 42.695 49 | G1 X 29.730 Y 42.631 50 | G1 X 29.768 Y 42.564 51 | G1 X 29.801 Y 42.494 52 | G1 X 29.828 Y 42.422 53 | G1 X 34.590 Y 28.136 54 | G1 X 34.612 Y 28.059 55 | G1 X 34.628 Y 27.980 56 | G1 X 34.638 Y 27.900 57 | G1 X 34.641 Y 27.820 58 | G1 X 34.641 Y 18.296 59 | G1 X 34.638 Y 18.216 60 | G1 X 34.628 Y 18.136 61 | G1 X 34.612 Y 18.057 62 | G1 X 34.590 Y 17.980 63 | G1 X 29.828 Y 3.694 64 | G1 X 29.801 Y 3.622 65 | G1 X 29.768 Y 3.552 66 | G1 X 29.730 Y 3.484 67 | G1 X 29.687 Y 3.420 68 | G1 X 29.639 Y 3.360 69 | G1 X 29.587 Y 3.303 70 | G1 X 20.063 Y -6.221 71 | G1 X 20.006 Y -6.273 72 | G1 X 19.946 Y -6.321 73 | G1 X 19.881 Y -6.364 74 | G1 X 19.814 Y -6.402 75 | G1 X 19.744 Y -6.435 76 | G1 X 19.672 Y -6.462 77 | G1 X 5.386 Y -11.224 78 | G1 X 5.309 Y -11.247 79 | G1 X 5.230 Y -11.263 80 | G1 X 5.150 Y -11.272 81 | G1 X 5.070 Y -11.275 82 | G1 X -9.216 Y -11.275 83 | G1 X -9.296 Y -11.272 84 | G1 X -9.376 Y -11.263 85 | G1 X -9.455 Y -11.247 86 | G1 X -9.532 Y -11.224 87 | G1 X -23.818 Y -6.462 88 | G1 X -23.890 Y -6.435 89 | G1 X -23.960 Y -6.402 90 | G1 X -24.027 Y -6.364 91 | G1 X -24.091 Y -6.321 92 | G1 X -24.152 Y -6.273 93 | G1 X -24.209 Y -6.221 94 | G1 X -28.970 Y -1.459 95 | G1 X -29.025 Y -1.400 96 | G1 X -29.075 Y -1.336 97 | G1 X -29.119 Y -1.269 98 | G1 X -29.158 Y -1.199 99 | G1 X -33.920 Y 8.325 100 | F150 101 | G1 Z 30.000 102 | G0 Z 100.000 103 | M9 M5 104 | 105 | (* SHAPE Nr: 1 *) 106 | G0 X -18.501 Y 88.725 107 | M3 M8 108 | G0 Z 30.000 109 | G1 Z 25.000 110 | F400 111 | G1 X 19.561 Y 88.725 112 | F150 113 | G1 Z 30.000 114 | G0 Z 100.000 115 | M9 M5 116 | G0 X 0.000 Y 0.000 117 | M2 (Program end) 118 | -------------------------------------------------------------------------------- /scripts/ngcs/6.ngc: -------------------------------------------------------------------------------- 1 | (Generated with: DXF2GCODE, Version: Py3.7.10 PyQt5.10.1, Date: $Date: Fri Oct 25 20:45:56 2019 +0200 $) 2 | (Created from file: /home/lucas/6.dxf) 3 | (Output format description: G-CODE for LinuxCNC) 4 | (Time: Wed Jul 14 19:44:16 2021) 5 | G21 (Units in millimeters) 6 | G90 (Absolute programming) 7 | G64 (Default cutting) G17 (XY plane) G40 (Cancel radius comp.) G49 (Cancel length comp.) 8 | G0 Z 100.000 9 | 10 | (*** LAYER: 0 ***) 11 | T1 M6 12 | S6000 13 | 14 | (* SHAPE Nr: 0 *) 15 | G0 X 25.708 Y 93.016 16 | M3 M8 17 | G0 Z 30.000 18 | F150 19 | G1 Z 30.000 20 | F400 21 | G1 X 21.132 Y 102.169 22 | G1 X 7.393 Y 106.749 23 | G1 X -1.807 Y 106.749 24 | G1 X -15.613 Y 102.147 25 | G1 X -24.837 Y 88.311 26 | G1 X -29.540 Y 64.793 27 | G1 X -29.540 Y 41.205 28 | G1 X -24.875 Y 22.546 29 | G1 X -15.714 Y 13.385 30 | G1 X -1.807 Y 8.749 31 | G1 X 2.631 Y 8.749 32 | G1 X 16.539 Y 13.385 33 | G1 X 25.729 Y 22.575 34 | G1 X 30.365 Y 36.482 35 | G1 X 30.365 Y 40.920 36 | G1 X 25.729 Y 54.828 37 | G1 X 16.539 Y 64.018 38 | G1 X 2.631 Y 68.654 39 | G1 X -1.807 Y 68.654 40 | G1 X -15.714 Y 64.018 41 | G1 X -25.071 Y 54.661 42 | F150 43 | G1 Z 30.000 44 | G0 Z 100.000 45 | M9 M5 46 | G0 X 0.000 Y 0.000 47 | M2 (Program end) -------------------------------------------------------------------------------- /scripts/ngcs/hand_heart.ngc: -------------------------------------------------------------------------------- 1 | (Generated with: DXF2GCODE, Version: Py3.7.10 PyQt5.10.1, Date: $Date: Fri Oct 25 20:45:56 2019 +0200 $) 2 | (Created from file: /home/lucas/h.dxf) 3 | (Output format description: G-CODE for LinuxCNC) 4 | (Time: Fri Jul 16 10:30:20 2021) 5 | G21 (Units in millimeters) 6 | G90 (Absolute programming) 7 | G64 (Default cutting) G17 (XY plane) G40 (Cancel radius comp.) G49 (Cancel length comp.) 8 | G0 Z 100.000 9 | 10 | (*** LAYER: 0 ***) 11 | T1 M6 12 | S6000 13 | 14 | (* SHAPE Nr: 0 *) 15 | G0 X -8.144 Y 6.296 16 | M3 M8 17 | G0 Z 30.000 18 | F150 19 | G1 Z 30.000 20 | F100 21 | G1 X -8.144 Y 6.296 22 | G1 X -8.401 Y 6.467 23 | G1 X -8.653 Y 6.644 24 | G1 X -8.902 Y 6.827 25 | G1 X -9.147 Y 7.018 26 | G1 X -9.389 Y 7.215 27 | G1 X -9.625 Y 7.417 28 | G1 X -9.857 Y 7.624 29 | G1 X -10.084 Y 7.838 30 | G1 X -10.306 Y 8.056 31 | G1 X -32.663 Y 30.413 32 | G1 X -55.014 Y 52.764 33 | G1 X -55.027 Y 52.777 34 | G1 X -55.029 Y 52.778 35 | G1 X -55.050 Y 52.798 36 | G1 X -55.051 Y 52.800 37 | G1 X -55.072 Y 52.820 38 | G1 X -55.073 Y 52.821 39 | G1 X -55.094 Y 52.841 40 | G1 X -55.095 Y 52.842 41 | G1 X -55.116 Y 52.862 42 | G1 X -55.117 Y 52.864 43 | G1 X -55.138 Y 52.884 44 | G1 X -55.139 Y 52.885 45 | G1 X -55.159 Y 52.905 46 | G1 X -55.160 Y 52.906 47 | G1 X -55.181 Y 52.927 48 | G1 X -55.182 Y 52.928 49 | G1 X -55.203 Y 52.948 50 | G1 X -55.204 Y 52.949 51 | G1 X -55.224 Y 52.969 52 | G1 X -55.225 Y 52.970 53 | G1 X -55.245 Y 52.990 54 | G1 X -55.246 Y 52.991 55 | G1 X -55.267 Y 53.012 56 | G1 X -55.268 Y 53.013 57 | G1 X -55.288 Y 53.033 58 | G1 X -55.289 Y 53.034 59 | G1 X -55.309 Y 53.054 60 | G1 X -55.310 Y 53.055 61 | G1 X -55.330 Y 53.075 62 | G1 X -55.331 Y 53.076 63 | G1 X -55.351 Y 53.096 64 | G1 X -55.352 Y 53.097 65 | G1 X -55.372 Y 53.117 66 | G1 X -55.373 Y 53.118 67 | G1 X -55.393 Y 53.138 68 | G1 X -55.394 Y 53.139 69 | G1 X -55.414 Y 53.159 70 | G1 X -55.414 Y 53.160 71 | G1 X -55.435 Y 53.180 72 | G1 X -55.435 Y 53.181 73 | G1 X -55.455 Y 53.201 74 | G1 X -55.456 Y 53.202 75 | G1 X -55.476 Y 53.222 76 | G1 X -55.476 Y 53.223 77 | G1 X -55.496 Y 53.243 78 | G1 X -55.497 Y 53.244 79 | G1 X -55.517 Y 53.264 80 | G1 X -55.537 Y 53.285 81 | G1 X -55.558 Y 53.306 82 | G1 X -55.578 Y 53.326 83 | G1 X -55.598 Y 53.347 84 | G1 X -55.618 Y 53.367 85 | G1 X -55.618 Y 53.368 86 | G1 X -55.638 Y 53.388 87 | G1 X -55.658 Y 53.409 88 | G1 X -55.659 Y 53.409 89 | G1 X -55.883 Y 53.640 90 | G1 X -56.104 Y 53.872 91 | G1 X -56.467 Y 54.260 92 | G1 X -56.823 Y 54.653 93 | G1 X -57.175 Y 55.051 94 | G1 X -57.521 Y 55.453 95 | G1 X -57.862 Y 55.860 96 | G1 X -58.197 Y 56.272 97 | G1 X -58.526 Y 56.688 98 | G1 X -58.850 Y 57.108 99 | G1 X -59.168 Y 57.533 100 | G1 X -59.480 Y 57.962 101 | G1 X -59.782 Y 58.389 102 | G1 X -60.079 Y 58.820 103 | G1 X -60.369 Y 59.255 104 | G1 X -60.653 Y 59.694 105 | G1 X -60.932 Y 60.136 106 | G1 X -61.204 Y 60.583 107 | G1 X -61.471 Y 61.033 108 | G1 X -61.731 Y 61.486 109 | G1 X -61.985 Y 61.943 110 | G1 X -62.233 Y 62.404 111 | G1 X -62.474 Y 62.868 112 | G1 X -62.710 Y 63.335 113 | G1 X -62.938 Y 63.805 114 | G1 X -63.161 Y 64.278 115 | G1 X -63.377 Y 64.754 116 | G1 X -63.587 Y 65.233 117 | G1 X -63.793 Y 65.722 118 | G1 X -63.992 Y 66.214 119 | G1 X -64.185 Y 66.708 120 | G1 X -64.370 Y 67.205 121 | G1 X -64.549 Y 67.705 122 | G1 X -64.721 Y 68.206 123 | G1 X -64.886 Y 68.711 124 | G1 X -65.045 Y 69.217 125 | G1 X -65.196 Y 69.725 126 | G1 X -65.340 Y 70.236 127 | G1 X -65.477 Y 70.748 128 | G1 X -65.610 Y 71.274 129 | G1 X -65.736 Y 71.802 130 | G1 X -65.855 Y 72.331 131 | G1 X -65.966 Y 72.862 132 | G1 X -66.069 Y 73.394 133 | G1 X -66.165 Y 73.928 134 | G1 X -66.254 Y 74.462 135 | G1 X -66.336 Y 74.999 136 | G1 X -66.410 Y 75.536 137 | G1 X -66.476 Y 76.074 138 | G1 X -66.535 Y 76.613 139 | G1 X -66.587 Y 77.153 140 | G1 X -66.631 Y 77.693 141 | G1 X -66.667 Y 78.234 142 | G1 X -66.696 Y 78.776 143 | G1 X -66.718 Y 79.318 144 | G1 X -66.732 Y 79.860 145 | G1 X -66.738 Y 80.369 146 | G1 X -66.737 Y 80.878 147 | G1 X -66.730 Y 81.386 148 | G1 X -66.717 Y 81.895 149 | G1 X -66.697 Y 82.404 150 | G1 X -66.670 Y 82.912 151 | G1 X -66.636 Y 83.420 152 | G1 X -66.596 Y 83.927 153 | G1 X -66.550 Y 84.434 154 | G1 X -66.496 Y 84.940 155 | G1 X -66.432 Y 85.484 156 | G1 X -66.360 Y 86.026 157 | G1 X -66.280 Y 86.568 158 | G1 X -66.192 Y 87.108 159 | G1 X -66.097 Y 87.647 160 | G1 X -65.995 Y 88.185 161 | G1 X -65.885 Y 88.721 162 | G1 X -65.767 Y 89.255 163 | G1 X -65.642 Y 89.788 164 | G1 X -65.509 Y 90.319 165 | G1 X -65.369 Y 90.848 166 | G1 X -65.222 Y 91.375 167 | G1 X -65.067 Y 91.900 168 | G1 X -64.905 Y 92.423 169 | G1 X -64.735 Y 92.944 170 | G1 X -64.558 Y 93.461 171 | G1 X -64.380 Y 93.960 172 | G1 X -64.196 Y 94.456 173 | G1 X -64.004 Y 94.949 174 | G1 X -63.806 Y 95.439 175 | G1 X -63.601 Y 95.927 176 | G1 X -63.390 Y 96.412 177 | G1 X -63.171 Y 96.894 178 | G1 X -62.947 Y 97.373 179 | G1 X -62.715 Y 97.849 180 | G1 X -62.478 Y 98.321 181 | G1 X -62.233 Y 98.791 182 | G1 X -61.983 Y 99.257 183 | G1 X -61.726 Y 99.719 184 | G1 X -61.462 Y 100.178 185 | G1 X -61.193 Y 100.633 186 | G1 X -60.907 Y 101.101 187 | G1 X -60.614 Y 101.564 188 | G1 X -60.315 Y 102.024 189 | G1 X -60.009 Y 102.479 190 | G1 X -59.697 Y 102.930 191 | G1 X -59.379 Y 103.376 192 | G1 X -59.054 Y 103.818 193 | G1 X -58.723 Y 104.255 194 | G1 X -58.386 Y 104.687 195 | G1 X -58.035 Y 105.124 196 | G1 X -57.678 Y 105.556 197 | G1 X -57.315 Y 105.983 198 | G1 X -56.946 Y 106.405 199 | G1 X -56.571 Y 106.821 200 | G1 X -56.190 Y 107.232 201 | G1 X -55.803 Y 107.638 202 | G1 X -55.411 Y 108.038 203 | G1 X -55.012 Y 108.432 204 | G1 X -55.010 Y 108.434 205 | G1 X -54.599 Y 108.830 206 | G1 X -54.183 Y 109.219 207 | G1 X -53.763 Y 109.604 208 | G1 X -53.338 Y 109.984 209 | G1 X -52.909 Y 110.359 210 | G1 X -52.539 Y 110.674 211 | G1 X -52.166 Y 110.984 212 | G1 X -51.789 Y 111.289 213 | G1 X -51.409 Y 111.590 214 | G1 X -51.025 Y 111.887 215 | G1 X -50.637 Y 112.178 216 | G1 X -50.240 Y 112.469 217 | G1 X -49.839 Y 112.754 218 | G1 X -49.434 Y 113.033 219 | G1 X -49.025 Y 113.307 220 | G1 X -48.612 Y 113.575 221 | G1 X -48.196 Y 113.837 222 | G1 X -47.787 Y 114.085 223 | G1 X -47.375 Y 114.327 224 | G1 X -46.959 Y 114.563 225 | G1 X -46.540 Y 114.792 226 | G1 X -46.117 Y 115.015 227 | G1 X -45.691 Y 115.232 228 | G1 X -45.262 Y 115.442 229 | G1 X -44.827 Y 115.646 230 | G1 X -44.389 Y 115.843 231 | G1 X -43.948 Y 116.033 232 | G1 X -43.504 Y 116.216 233 | G1 X -43.057 Y 116.391 234 | G1 X -42.607 Y 116.559 235 | G1 X -42.155 Y 116.720 236 | G1 X -41.700 Y 116.874 237 | G1 X -41.242 Y 117.020 238 | G1 X -40.783 Y 117.159 239 | G1 X -40.372 Y 117.276 240 | G1 X -39.959 Y 117.387 241 | G1 X -39.546 Y 117.493 242 | G1 X -39.130 Y 117.593 243 | G1 X -38.713 Y 117.687 244 | G1 X -38.295 Y 117.775 245 | G1 X -37.876 Y 117.858 246 | G1 X -37.369 Y 117.950 247 | G1 X -36.859 Y 118.034 248 | G1 X -36.349 Y 118.111 249 | G1 X -35.838 Y 118.180 250 | G1 X -35.325 Y 118.240 251 | G1 X -34.812 Y 118.293 252 | G1 X -34.333 Y 118.335 253 | G1 X -33.854 Y 118.372 254 | G1 X -33.374 Y 118.402 255 | G1 X -32.894 Y 118.426 256 | G1 X -32.414 Y 118.444 257 | G1 X -31.934 Y 118.456 258 | G1 X -31.372 Y 118.462 259 | G1 X -30.811 Y 118.462 260 | G1 X -30.250 Y 118.453 261 | G1 X -29.689 Y 118.438 262 | G1 X -29.128 Y 118.415 263 | G1 X -28.507 Y 118.382 264 | G1 X -27.886 Y 118.341 265 | G1 X -27.266 Y 118.292 266 | G1 X -26.646 Y 118.236 267 | G1 X -26.641 Y 118.235 268 | G1 X -26.613 Y 118.232 269 | G1 X -26.473 Y 118.214 270 | G1 X -26.333 Y 118.194 271 | G1 X -26.020 Y 118.141 272 | G1 X -25.707 Y 118.082 273 | G1 X -25.395 Y 118.016 274 | G1 X -25.003 Y 117.925 275 | G1 X -24.613 Y 117.827 276 | G1 X -24.224 Y 117.722 277 | G1 X -23.838 Y 117.610 278 | G1 X -23.413 Y 117.478 279 | G1 X -22.990 Y 117.339 280 | G1 X -22.570 Y 117.193 281 | G1 X -22.152 Y 117.040 282 | G1 X -21.737 Y 116.879 283 | G1 X -21.338 Y 116.718 284 | G1 X -20.941 Y 116.550 285 | G1 X -20.547 Y 116.377 286 | G1 X -20.156 Y 116.198 287 | G1 X -19.767 Y 116.013 288 | G1 X -19.381 Y 115.822 289 | G1 X -18.998 Y 115.625 290 | G1 X -18.601 Y 115.414 291 | G1 X -18.206 Y 115.197 292 | G1 X -17.815 Y 114.974 293 | G1 X -17.427 Y 114.746 294 | G1 X -17.043 Y 114.512 295 | G1 X -16.662 Y 114.272 296 | G1 X -16.284 Y 114.027 297 | G1 X -15.910 Y 113.777 298 | G1 X -15.535 Y 113.518 299 | G1 X -15.164 Y 113.255 300 | G1 X -14.797 Y 112.986 301 | G1 X -14.433 Y 112.712 302 | G1 X -14.073 Y 112.433 303 | G1 X -13.717 Y 112.149 304 | G1 X -13.365 Y 111.860 305 | G1 X -13.017 Y 111.567 306 | G1 X -12.623 Y 111.224 307 | G1 X -12.234 Y 110.876 308 | G1 X -11.850 Y 110.522 309 | G1 X -11.471 Y 110.163 310 | G1 X -11.098 Y 109.797 311 | G1 X -10.730 Y 109.427 312 | G1 X -10.368 Y 109.051 313 | G1 X -10.043 Y 108.704 314 | G1 X -9.723 Y 108.354 315 | G1 X -9.408 Y 108.000 316 | G1 X -9.096 Y 107.641 317 | G1 X -8.790 Y 107.279 318 | G1 X -8.488 Y 106.913 319 | G1 X -8.190 Y 106.543 320 | G1 X -7.875 Y 106.141 321 | G1 X -7.566 Y 105.736 322 | G1 X -7.261 Y 105.326 323 | G1 X -6.962 Y 104.913 324 | G1 X -6.668 Y 104.496 325 | G1 X -6.379 Y 104.076 326 | G1 X -6.095 Y 103.651 327 | G1 X -5.770 Y 103.151 328 | G1 X -5.451 Y 102.645 329 | G1 X -5.139 Y 102.136 330 | G1 X -4.833 Y 101.622 331 | G1 X -4.535 Y 101.105 332 | G1 X -4.244 Y 100.583 333 | G1 X -3.971 Y 100.081 334 | G1 X -3.705 Y 99.576 335 | G1 X -3.444 Y 99.068 336 | G1 X -3.190 Y 98.556 337 | G1 X -2.941 Y 98.042 338 | G1 X -2.698 Y 97.525 339 | G1 X -2.435 Y 96.946 340 | G1 X -2.178 Y 96.363 341 | G1 X -1.928 Y 95.778 342 | G1 X -1.685 Y 95.190 343 | G1 X -1.449 Y 94.599 344 | G1 X -1.220 Y 94.005 345 | G1 X -1.001 Y 93.418 346 | G1 X -0.788 Y 92.830 347 | G1 X -0.581 Y 92.239 348 | G1 X -0.380 Y 91.646 349 | G1 X -0.185 Y 91.051 350 | G1 X 0.003 Y 90.454 351 | G1 X 0.131 Y 90.037 352 | G1 X 0.191 Y 90.164 353 | G1 X 0.486 Y 90.785 354 | G1 X 0.787 Y 91.402 355 | G1 X 1.094 Y 92.016 356 | G1 X 1.407 Y 92.628 357 | G1 X 1.725 Y 93.236 358 | G1 X 2.049 Y 93.842 359 | G1 X 2.381 Y 94.445 360 | G1 X 2.718 Y 95.045 361 | G1 X 3.063 Y 95.641 362 | G1 X 3.413 Y 96.234 363 | G1 X 3.770 Y 96.822 364 | G1 X 4.134 Y 97.407 365 | G1 X 4.482 Y 97.955 366 | G1 X 4.837 Y 98.498 367 | G1 X 5.198 Y 99.037 368 | G1 X 5.565 Y 99.572 369 | G1 X 5.939 Y 100.103 370 | G1 X 6.318 Y 100.630 371 | G1 X 6.682 Y 101.123 372 | G1 X 7.052 Y 101.612 373 | G1 X 7.428 Y 102.096 374 | G1 X 7.810 Y 102.576 375 | G1 X 8.198 Y 103.051 376 | G1 X 8.591 Y 103.522 377 | G1 X 8.969 Y 103.963 378 | G1 X 9.352 Y 104.399 379 | G1 X 9.741 Y 104.830 380 | G1 X 10.136 Y 105.256 381 | G1 X 10.535 Y 105.677 382 | G1 X 10.940 Y 106.093 383 | G1 X 11.330 Y 106.484 384 | G1 X 11.726 Y 106.869 385 | G1 X 12.126 Y 107.249 386 | G1 X 12.531 Y 107.623 387 | G1 X 12.941 Y 107.993 388 | G1 X 13.355 Y 108.356 389 | G1 X 13.760 Y 108.701 390 | G1 X 14.168 Y 109.041 391 | G1 X 14.582 Y 109.374 392 | G1 X 15.000 Y 109.702 393 | G1 X 15.422 Y 110.024 394 | G1 X 15.849 Y 110.341 395 | G1 X 16.255 Y 110.633 396 | G1 X 16.666 Y 110.920 397 | G1 X 17.080 Y 111.201 398 | G1 X 17.498 Y 111.476 399 | G1 X 17.920 Y 111.745 400 | G1 X 18.346 Y 112.008 401 | G1 X 18.775 Y 112.266 402 | G1 X 19.213 Y 112.519 403 | G1 X 19.654 Y 112.766 404 | G1 X 20.100 Y 113.006 405 | G1 X 20.548 Y 113.240 406 | G1 X 21.000 Y 113.466 407 | G1 X 21.456 Y 113.686 408 | G1 X 21.915 Y 113.899 409 | G1 X 22.377 Y 114.105 410 | G1 X 22.797 Y 114.284 411 | G1 X 23.219 Y 114.457 412 | G1 X 23.644 Y 114.625 413 | G1 X 24.071 Y 114.786 414 | G1 X 24.500 Y 114.940 415 | G1 X 24.932 Y 115.089 416 | G1 X 25.366 Y 115.231 417 | G1 X 25.802 Y 115.366 418 | G1 X 26.239 Y 115.496 419 | G1 X 26.679 Y 115.618 420 | G1 X 27.115 Y 115.733 421 | G1 X 27.553 Y 115.842 422 | G1 X 27.993 Y 115.944 423 | G1 X 28.434 Y 116.039 424 | G1 X 28.876 Y 116.127 425 | G1 X 29.320 Y 116.209 426 | G1 X 29.765 Y 116.284 427 | G1 X 30.211 Y 116.352 428 | G1 X 30.658 Y 116.414 429 | G1 X 31.105 Y 116.468 430 | G1 X 31.554 Y 116.516 431 | G1 X 32.003 Y 116.558 432 | G1 X 32.483 Y 116.594 433 | G1 X 32.963 Y 116.622 434 | G1 X 33.444 Y 116.642 435 | G1 X 33.924 Y 116.655 436 | G1 X 34.405 Y 116.659 437 | G1 X 34.886 Y 116.655 438 | G1 X 35.367 Y 116.644 439 | G1 X 35.848 Y 116.624 440 | G1 X 36.328 Y 116.597 441 | G1 X 36.807 Y 116.561 442 | G1 X 37.286 Y 116.517 443 | G1 X 37.765 Y 116.466 444 | G1 X 38.242 Y 116.406 445 | G1 X 38.680 Y 116.345 446 | G1 X 39.118 Y 116.276 447 | G1 X 39.554 Y 116.200 448 | G1 X 39.990 Y 116.118 449 | G1 X 40.423 Y 116.028 450 | G1 X 40.856 Y 115.932 451 | G1 X 41.286 Y 115.829 452 | G1 X 41.715 Y 115.719 453 | G1 X 42.143 Y 115.602 454 | G1 X 42.568 Y 115.479 455 | G1 X 42.991 Y 115.349 456 | G1 X 43.405 Y 115.215 457 | G1 X 43.817 Y 115.073 458 | G1 X 44.226 Y 114.926 459 | G1 X 44.633 Y 114.771 460 | G1 X 45.038 Y 114.610 461 | G1 X 45.439 Y 114.442 462 | G1 X 45.838 Y 114.268 463 | G1 X 46.234 Y 114.088 464 | G1 X 46.627 Y 113.900 465 | G1 X 46.990 Y 113.720 466 | G1 X 47.350 Y 113.534 467 | G1 X 47.707 Y 113.342 468 | G1 X 48.061 Y 113.145 469 | G1 X 48.412 Y 112.941 470 | G1 X 48.759 Y 112.732 471 | G1 X 49.103 Y 112.517 472 | G1 X 49.443 Y 112.297 473 | G1 X 49.754 Y 112.088 474 | G1 X 50.063 Y 111.874 475 | G1 X 50.367 Y 111.654 476 | G1 X 50.668 Y 111.430 477 | G1 X 50.965 Y 111.201 478 | G1 X 51.258 Y 110.967 479 | G1 X 51.548 Y 110.728 480 | G1 X 51.845 Y 110.473 481 | G1 X 52.138 Y 110.213 482 | G1 X 52.425 Y 109.947 483 | G1 X 52.708 Y 109.676 484 | G1 X 52.985 Y 109.400 485 | G1 X 53.257 Y 109.118 486 | G1 X 53.484 Y 108.875 487 | G1 X 53.706 Y 108.628 488 | G1 X 53.924 Y 108.377 489 | G1 X 53.944 Y 108.358 490 | G1 X 53.946 Y 108.356 491 | G1 X 54.004 Y 108.300 492 | G1 X 54.006 Y 108.298 493 | G1 X 54.065 Y 108.242 494 | G1 X 54.066 Y 108.240 495 | G1 X 54.125 Y 108.184 496 | G1 X 54.126 Y 108.182 497 | G1 X 54.184 Y 108.126 498 | G1 X 54.186 Y 108.124 499 | G1 X 54.244 Y 108.068 500 | G1 X 54.246 Y 108.066 501 | G1 X 54.304 Y 108.009 502 | G1 X 54.305 Y 108.007 503 | G1 X 54.363 Y 107.950 504 | G1 X 54.365 Y 107.949 505 | G1 X 54.422 Y 107.892 506 | G1 X 54.424 Y 107.890 507 | G1 X 54.481 Y 107.833 508 | G1 X 54.483 Y 107.831 509 | G1 X 54.540 Y 107.774 510 | G1 X 54.542 Y 107.772 511 | G1 X 54.599 Y 107.714 512 | G1 X 54.601 Y 107.712 513 | G1 X 54.658 Y 107.655 514 | G1 X 54.660 Y 107.653 515 | G1 X 54.716 Y 107.595 516 | G1 X 54.718 Y 107.593 517 | G1 X 54.775 Y 107.536 518 | G1 X 54.776 Y 107.534 519 | G1 X 54.833 Y 107.476 520 | G1 X 54.835 Y 107.474 521 | G1 X 54.891 Y 107.416 522 | G1 X 54.893 Y 107.414 523 | G1 X 54.949 Y 107.355 524 | G1 X 54.951 Y 107.354 525 | G1 X 55.007 Y 107.295 526 | G1 X 55.009 Y 107.293 527 | G1 X 55.064 Y 107.235 528 | G1 X 55.066 Y 107.233 529 | G1 X 55.122 Y 107.174 530 | G1 X 55.124 Y 107.172 531 | G1 X 55.179 Y 107.113 532 | G1 X 55.181 Y 107.111 533 | G1 X 55.237 Y 107.052 534 | G1 X 55.238 Y 107.050 535 | G1 X 55.294 Y 106.991 536 | G1 X 55.295 Y 106.989 537 | G1 X 55.351 Y 106.930 538 | G1 X 55.352 Y 106.928 539 | G1 X 55.407 Y 106.868 540 | G1 X 55.409 Y 106.867 541 | G1 X 55.464 Y 106.807 542 | G1 X 55.466 Y 106.805 543 | G1 X 55.520 Y 106.745 544 | G1 X 55.522 Y 106.743 545 | G1 X 55.577 Y 106.683 546 | G1 X 55.578 Y 106.681 547 | G1 X 55.633 Y 106.621 548 | G1 X 55.635 Y 106.619 549 | G1 X 55.689 Y 106.559 550 | G1 X 55.899 Y 106.325 551 | G1 X 56.107 Y 106.089 552 | G1 X 56.446 Y 105.695 553 | G1 X 56.780 Y 105.296 554 | G1 X 57.108 Y 104.894 555 | G1 X 57.431 Y 104.486 556 | G1 X 57.748 Y 104.075 557 | G1 X 58.060 Y 103.659 558 | G1 X 58.366 Y 103.239 559 | G1 X 58.667 Y 102.815 560 | G1 X 58.961 Y 102.387 561 | G1 X 59.250 Y 101.955 562 | G1 X 59.539 Y 101.509 563 | G1 X 59.822 Y 101.060 564 | G1 X 60.099 Y 100.606 565 | G1 X 60.369 Y 100.149 566 | G1 X 60.632 Y 99.688 567 | G1 X 60.889 Y 99.224 568 | G1 X 61.140 Y 98.755 569 | G1 X 61.384 Y 98.284 570 | G1 X 61.621 Y 97.808 571 | G1 X 61.852 Y 97.330 572 | G1 X 62.076 Y 96.849 573 | G1 X 62.293 Y 96.364 574 | G1 X 62.503 Y 95.876 575 | G1 X 62.706 Y 95.386 576 | G1 X 62.903 Y 94.892 577 | G1 X 63.092 Y 94.396 578 | G1 X 63.275 Y 93.897 579 | G1 X 63.450 Y 93.398 580 | G1 X 63.617 Y 92.897 581 | G1 X 63.778 Y 92.393 582 | G1 X 63.932 Y 91.886 583 | G1 X 64.079 Y 91.378 584 | G1 X 64.218 Y 90.868 585 | G1 X 64.351 Y 90.356 586 | G1 X 64.476 Y 89.842 587 | G1 X 64.595 Y 89.326 588 | G1 X 64.706 Y 88.809 589 | G1 X 64.809 Y 88.290 590 | G1 X 64.906 Y 87.770 591 | G1 X 64.998 Y 87.232 592 | G1 X 65.082 Y 86.693 593 | G1 X 65.159 Y 86.153 594 | G1 X 65.228 Y 85.612 595 | G1 X 65.289 Y 85.070 596 | G1 X 65.342 Y 84.527 597 | G1 X 65.388 Y 83.984 598 | G1 X 65.426 Y 83.439 599 | G1 X 65.456 Y 82.895 600 | G1 X 65.479 Y 82.350 601 | G1 X 65.494 Y 81.804 602 | G1 X 65.501 Y 81.259 603 | G1 X 65.500 Y 80.713 604 | G1 X 65.491 Y 80.168 605 | G1 X 65.475 Y 79.623 606 | G1 X 65.451 Y 79.078 607 | G1 X 65.419 Y 78.533 608 | G1 X 65.379 Y 77.989 609 | G1 X 65.332 Y 77.445 610 | G1 X 65.277 Y 76.903 611 | G1 X 65.214 Y 76.361 612 | G1 X 65.144 Y 75.820 613 | G1 X 65.066 Y 75.280 614 | G1 X 64.981 Y 74.751 615 | G1 X 64.889 Y 74.223 616 | G1 X 64.790 Y 73.696 617 | G1 X 64.684 Y 73.170 618 | G1 X 64.570 Y 72.647 619 | G1 X 64.449 Y 72.125 620 | G1 X 64.320 Y 71.604 621 | G1 X 64.184 Y 71.086 622 | G1 X 64.041 Y 70.569 623 | G1 X 63.891 Y 70.055 624 | G1 X 63.733 Y 69.542 625 | G1 X 63.568 Y 69.032 626 | G1 X 63.396 Y 68.525 627 | G1 X 63.217 Y 68.019 628 | G1 X 63.031 Y 67.517 629 | G1 X 62.838 Y 67.017 630 | G1 X 62.644 Y 66.534 631 | G1 X 62.444 Y 66.055 632 | G1 X 62.236 Y 65.578 633 | G1 X 62.023 Y 65.105 634 | G1 X 61.802 Y 64.634 635 | G1 X 61.576 Y 64.166 636 | G1 X 61.343 Y 63.701 637 | G1 X 61.103 Y 63.240 638 | G1 X 60.858 Y 62.782 639 | G1 X 60.606 Y 62.328 640 | G1 X 60.347 Y 61.877 641 | G1 X 60.083 Y 61.429 642 | G1 X 59.813 Y 60.985 643 | G1 X 59.536 Y 60.545 644 | G1 X 59.260 Y 60.120 645 | G1 X 58.979 Y 59.698 646 | G1 X 58.692 Y 59.279 647 | G1 X 58.399 Y 58.865 648 | G1 X 58.101 Y 58.455 649 | G1 X 57.797 Y 58.048 650 | G1 X 57.488 Y 57.646 651 | G1 X 57.174 Y 57.248 652 | G1 X 56.854 Y 56.854 653 | G1 X 56.529 Y 56.465 654 | G1 X 56.192 Y 56.072 655 | G1 X 55.850 Y 55.684 656 | G1 X 55.503 Y 55.301 657 | G1 X 55.151 Y 54.922 658 | G1 X 54.794 Y 54.548 659 | G1 X 54.432 Y 54.179 660 | G1 X 54.065 Y 53.815 661 | G1 X 53.693 Y 53.456 662 | G1 X 53.317 Y 53.102 663 | G1 X 52.935 Y 52.753 664 | G1 X 30.595 Y 30.413 665 | G1 X 8.160 Y 7.978 666 | G1 X 8.157 Y 7.975 667 | G1 X 7.934 Y 7.759 668 | G1 X 7.706 Y 7.548 669 | G1 X 7.473 Y 7.343 670 | G1 X 7.235 Y 7.143 671 | G1 X 6.992 Y 6.949 672 | G1 X 6.745 Y 6.761 673 | G1 X 6.496 Y 6.580 674 | G1 X 6.242 Y 6.405 675 | G1 X 5.984 Y 6.236 676 | G1 X 5.723 Y 6.073 677 | G1 X 5.457 Y 5.917 678 | G1 X 5.188 Y 5.767 679 | G1 X 4.915 Y 5.623 680 | G1 X 4.639 Y 5.486 681 | G1 X 4.360 Y 5.356 682 | G1 X 4.078 Y 5.232 683 | G1 X 3.793 Y 5.115 684 | G1 X 3.505 Y 5.004 685 | G1 X 3.215 Y 4.901 686 | G1 X 2.922 Y 4.804 687 | G1 X 2.627 Y 4.715 688 | G1 X -0.627 Y 0.715 689 | G1 X -2.627 Y -2.715 690 | G1 X -4.627 Y -4.715 691 | G1 X -6.627 Y -6.715 692 | G1 X -8.627 Y -8.715 693 | F150 694 | G1 Z 30.000 695 | G0 Z 100.000 696 | M9 M5 697 | G0 X 0.000 Y 0.000 698 | M2 (Program end) 699 | -------------------------------------------------------------------------------- /scripts/simple_ngc.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import sys 3 | import math 4 | import re 5 | import sys 6 | import math 7 | import time 8 | import rospy 9 | import hiwonder 10 | from hiwonder import serial_servo as ssr 11 | import line_interpolation 12 | 13 | DEFAULT_X, DEFAULT_Y, DEFAULT_Z = 0, 0, 100 14 | OFFSET_X, OFFSET_Y, OFFSET_Z = 0, 100, 17 15 | ikinematic = hiwonder.kinematic.IKinematic() 16 | 17 | current_pos = (DEFAULT_X, DEFAULT_Y, DEFAULT_Z) 18 | speed = 80 19 | 20 | 21 | def move_to_pos(x, y, z, t): 22 | global current_pos 23 | end_x = -x + OFFSET_X 24 | end_x = end_x 25 | end_y = y + OFFSET_Y 26 | end_z = z + OFFSET_Z 27 | pos = ikinematic.resolve(end_x, end_y, end_z) 28 | if pos is None: 29 | return 30 | p1, p2, p3 = pos 31 | ssr.set_position(1, int(p1), t) 32 | ssr.set_position(2, int(p2), t) 33 | ssr.set_position(3, int(p3), t) 34 | current_pos = x, y, z 35 | 36 | 37 | fake_points = [] 38 | 39 | 40 | def draw(points): 41 | global current_pos, speed 42 | for i, (x, y, z) in enumerate(points): 43 | c_x, c_y, c_z = current_pos 44 | dist = math.sqrt((c_x - x) ** 2 + (c_y - y) ** 2 + (c_z - z) ** 2) 45 | t = dist / speed 46 | move_to_pos(x, y, z, int(t * 1000)) 47 | fake_points.append((x, y)) 48 | time.sleep(t) 49 | 50 | 51 | def get_param(cmd, param_name): 52 | try: 53 | i = cmd.index(param_name) 54 | return float(cmd[i + 1]) 55 | except Exception as e: 56 | # print(e) 57 | return None 58 | 59 | 60 | def draw_ngc(path, speed_l=80): 61 | global speed 62 | speed = speed_l 63 | move_to_pos(DEFAULT_X, DEFAULT_Y, DEFAULT_Z, 1000) 64 | time.sleep(1) 65 | gcodes = [] 66 | with open(path, 'r') as f: 67 | gcodes = f.readlines() 68 | space = re.compile(' +') 69 | for gcode in gcodes: 70 | if gcode == '': 71 | continue 72 | gcode = space.sub(' ', gcode) 73 | gcode = gcode.strip().split(' ') 74 | instruct = gcode[0] 75 | if len(instruct) < 2: 76 | continue 77 | if instruct[0] == 'G': 78 | code = int(instruct[1:]) 79 | if code == 0: 80 | c_x, c_y, c_z = current_pos 81 | x = get_param(gcode, 'X') 82 | y = get_param(gcode, 'Y') 83 | z = get_param(gcode, 'Z') 84 | x = current_pos[0] if x is None else x 85 | y = current_pos[1] if y is None else y 86 | z = current_pos[2] if z is None else z 87 | t = math.sqrt((c_x - x) ** 2 + (c_y - y) ** 2 + (c_z - z) ** 2) / speed 88 | move_to_pos(x, y, z, int(t * 1000)) 89 | time.sleep(t) 90 | elif code == 1: 91 | c_x, c_y, c_z = current_pos 92 | x = get_param(gcode, 'X') 93 | y = get_param(gcode, 'Y') 94 | z = get_param(gcode, 'Z') 95 | x = c_x if x is None else x 96 | y = c_y if y is None else y 97 | z = c_z if z is None else z 98 | if z != c_z: 99 | t = math.sqrt((c_x - x) ** 2 + (c_y - y) ** 2 + (c_z - z) ** 2) / speed 100 | move_to_pos(x, y, z, int(t * 1000)) 101 | else: 102 | points = line_interpolation(c_x, c_y, x, y) 103 | tmp = [] 104 | for p in points: 105 | p.append(c_z) 106 | tmp.append(p) 107 | draw(tmp) 108 | time.sleep(0.01) 109 | else: 110 | pass 111 | elif instruct[0] == 'M': 112 | code = int(instruct[1:]) 113 | if code == 0: 114 | pass 115 | elif code == 1: 116 | pass 117 | elif code == 2: 118 | pass 119 | else: 120 | pass 121 | elif instruct[0] == 'F': 122 | speed = int(instruct[1:]) 123 | --------------------------------------------------------------------------------