├── .gitignore ├── CMakeLists.txt ├── README.md ├── color.npy ├── imgs ├── 6dof_grasp.png ├── contact_grasp.png └── gqcnn.png ├── msg └── Grasp.msg ├── package.xml ├── rviz └── uoais.rviz ├── scene └── uoais.scene ├── segmap.npy ├── src ├── 6dof_graspnet_server.py ├── color_detector.py ├── contact_grasp_server.py ├── gqcnn_server.py └── test.py └── srv ├── GetTargetContactGrasp.srv ├── GetTargetContactGraspSegm.srv └── GetTargetPos.srv /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode/ 2 | pointnet2/ 3 | uoais/ 4 | 5 | # Byte-compiled / optimized / DLL files 6 | __pycache__/ 7 | *.py[cod] 8 | *$py.class 9 | 10 | # C extensions 11 | *.so 12 | 13 | # Distribution / packaging 14 | .Python 15 | build/ 16 | develop-eggs/ 17 | dist/ 18 | downloads/ 19 | eggs/ 20 | .eggs/ 21 | lib/ 22 | lib64/ 23 | parts/ 24 | sdist/ 25 | var/ 26 | wheels/ 27 | share/python-wheels/ 28 | *.egg-info/ 29 | .installed.cfg 30 | *.egg 31 | MANIFEST 32 | 33 | # PyInstaller 34 | # Usually these files are written by a python script from a template 35 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 36 | *.manifest 37 | *.spec 38 | 39 | # Installer logs 40 | pip-log.txt 41 | pip-delete-this-directory.txt 42 | 43 | # Unit test / coverage reports 44 | htmlcov/ 45 | .tox/ 46 | .nox/ 47 | .coverage 48 | .coverage.* 49 | .cache 50 | nosetests.xml 51 | coverage.xml 52 | *.cover 53 | *.py,cover 54 | .hypothesis/ 55 | .pytest_cache/ 56 | cover/ 57 | 58 | # Translations 59 | *.mo 60 | *.pot 61 | 62 | # Django stuff: 63 | *.log 64 | local_settings.py 65 | db.sqlite3 66 | db.sqlite3-journal 67 | 68 | # Flask stuff: 69 | instance/ 70 | .webassets-cache 71 | 72 | # Scrapy stuff: 73 | .scrapy 74 | 75 | # Sphinx documentation 76 | docs/_build/ 77 | 78 | # PyBuilder 79 | .pybuilder/ 80 | target/ 81 | 82 | # Jupyter Notebook 83 | .ipynb_checkpoints 84 | 85 | # IPython 86 | profile_default/ 87 | ipython_config.py 88 | 89 | # pyenv 90 | # For a library or package, you might want to ignore these files since the code is 91 | # intended to run in multiple environments; otherwise, check them in: 92 | # .python-version 93 | 94 | # pipenv 95 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 96 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 97 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 98 | # install all needed dependencies. 99 | #Pipfile.lock 100 | 101 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 102 | __pypackages__/ 103 | 104 | # Celery stuff 105 | celerybeat-schedule 106 | celerybeat.pid 107 | 108 | # SageMath parsed files 109 | *.sage.py 110 | 111 | # Environments 112 | .env 113 | .venv 114 | env/ 115 | venv/ 116 | ENV/ 117 | env.bak/ 118 | venv.bak/ 119 | 120 | # Spyder project settings 121 | .spyderproject 122 | .spyproject 123 | 124 | # Rope project settings 125 | .ropeproject 126 | 127 | # mkdocs documentation 128 | /site 129 | 130 | # mypy 131 | .mypy_cache/ 132 | .dmypy.json 133 | dmypy.json 134 | 135 | # Pyre type checker 136 | .pyre/ 137 | 138 | # pytype static type analyzer 139 | .pytype/ 140 | 141 | # Cython debug symbols 142 | cython_debug/ -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.8.3) 2 | project(deep_grasping_ros) 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 | roscpp 12 | rospy 13 | std_msgs 14 | message_generation 15 | geometry_msgs 16 | sensor_msgs 17 | ) 18 | 19 | ## System dependencies are found with CMake's conventions 20 | # find_package(Boost REQUIRED COMPONENTS system) 21 | 22 | 23 | ## Uncomment this if the package has a setup.py. This macro ensures 24 | ## modules and global scripts declared therein get installed 25 | ## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html 26 | # catkin_python_setup() 27 | 28 | ################################################ 29 | ## Declare ROS messages, services and actions ## 30 | ################################################ 31 | 32 | ## To declare and build messages, services or actions from within this 33 | ## package, follow these steps: 34 | ## * Let MSG_DEP_SET be the set of packages whose message types you use in 35 | ## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...). 36 | ## * In the file package.xml: 37 | ## * add a build_depend tag for "message_generation" 38 | ## * add a build_depend and a exec_depend tag for each package in MSG_DEP_SET 39 | ## * If MSG_DEP_SET isn't empty the following dependency has been pulled in 40 | ## but can be declared for certainty nonetheless: 41 | ## * add a exec_depend tag for "message_runtime" 42 | ## * In this file (CMakeLists.txt): 43 | ## * add "message_generation" and every package in MSG_DEP_SET to 44 | ## find_package(catkin REQUIRED COMPONENTS ...) 45 | ## * add "message_runtime" and every package in MSG_DEP_SET to 46 | ## catkin_package(CATKIN_DEPENDS ...) 47 | ## * uncomment the add_*_files sections below as needed 48 | ## and list every .msg/.srv/.action file to be processed 49 | ## * uncomment the generate_messages entry below 50 | ## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...) 51 | 52 | ## Generate messages in the 'msg' folder 53 | add_message_files( 54 | FILES 55 | Grasp.msg 56 | ) 57 | 58 | ## Generate services in the 'srv' folder 59 | add_service_files( 60 | FILES 61 | GetTargetContactGraspSegm.srv 62 | GetTargetContactGrasp.srv 63 | GetTargetPos.srv 64 | ) 65 | 66 | ## Generate actions in the 'action' folder 67 | # add_action_files( 68 | # FILES 69 | # Action1.action 70 | # Action2.action 71 | # ) 72 | 73 | ## Generate added messages and services with any dependencies listed here 74 | generate_messages( 75 | DEPENDENCIES 76 | std_msgs 77 | geometry_msgs 78 | sensor_msgs 79 | ) 80 | 81 | ################################################ 82 | ## Declare ROS dynamic reconfigure parameters ## 83 | ################################################ 84 | 85 | ## To declare and build dynamic reconfigure parameters within this 86 | ## package, follow these steps: 87 | ## * In the file package.xml: 88 | ## * add a build_depend and a exec_depend tag for "dynamic_reconfigure" 89 | ## * In this file (CMakeLists.txt): 90 | ## * add "dynamic_reconfigure" to 91 | ## find_package(catkin REQUIRED COMPONENTS ...) 92 | ## * uncomment the "generate_dynamic_reconfigure_options" section below 93 | ## and list every .cfg file to be processed 94 | 95 | ## Generate dynamic reconfigure parameters in the 'cfg' folder 96 | # generate_dynamic_reconfigure_options( 97 | # cfg/DynReconf1.cfg 98 | # cfg/DynReconf2.cfg 99 | # ) 100 | 101 | ################################### 102 | ## catkin specific configuration ## 103 | ################################### 104 | ## The catkin_package macro generates cmake config files for your package 105 | ## Declare things to be passed to dependent projects 106 | ## INCLUDE_DIRS: uncomment this if your package contains header files 107 | ## LIBRARIES: libraries you create in this project that dependent projects also need 108 | ## CATKIN_DEPENDS: catkin_packages dependent projects also need 109 | ## DEPENDS: system dependencies of this project that dependent projects also need 110 | catkin_package( 111 | # INCLUDE_DIRS include 112 | # LIBRARIES deep_grasping_ros 113 | # CATKIN_DEPENDS roscpp rospy std_msgs 114 | # DEPENDS system_lib 115 | ) 116 | 117 | ########### 118 | ## Build ## 119 | ########### 120 | 121 | ## Specify additional locations of header files 122 | ## Your package locations should be listed before other locations 123 | include_directories( 124 | # include 125 | ${catkin_INCLUDE_DIRS} 126 | ) 127 | 128 | ## Declare a C++ library 129 | # add_library(${PROJECT_NAME} 130 | # src/${PROJECT_NAME}/deep_grasping_ros.cpp 131 | # ) 132 | 133 | ## Add cmake target dependencies of the library 134 | ## as an example, code may need to be generated before libraries 135 | ## either from message generation or dynamic reconfigure 136 | # add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) 137 | 138 | ## Declare a C++ executable 139 | ## With catkin_make all packages are built within a single CMake context 140 | ## The recommended prefix ensures that target names across packages don't collide 141 | # add_executable(${PROJECT_NAME}_node src/deep_grasping_ros_node.cpp) 142 | 143 | ## Rename C++ executable without prefix 144 | ## The above recommended prefix causes long target names, the following renames the 145 | ## target back to the shorter version for ease of user use 146 | ## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node" 147 | # set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "") 148 | 149 | ## Add cmake target dependencies of the executable 150 | ## same as for the library above 151 | # add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) 152 | 153 | ## Specify libraries to link a library or executable target against 154 | # target_link_libraries(${PROJECT_NAME}_node 155 | # ${catkin_LIBRARIES} 156 | # ) 157 | 158 | ############# 159 | ## Install ## 160 | ############# 161 | 162 | # all install targets should use catkin DESTINATION variables 163 | # See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html 164 | 165 | ## Mark executable scripts (Python etc.) for installation 166 | ## in contrast to setup.py, you can choose the destination 167 | # install(PROGRAMS 168 | # scripts/my_python_script 169 | # DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} 170 | # ) 171 | 172 | ## Mark executables for installation 173 | ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_executables.html 174 | # install(TARGETS ${PROJECT_NAME}_node 175 | # RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} 176 | # ) 177 | 178 | ## Mark libraries for installation 179 | ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html 180 | # install(TARGETS ${PROJECT_NAME} 181 | # ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} 182 | # LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} 183 | # RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} 184 | # ) 185 | 186 | ## Mark cpp header files for installation 187 | # install(DIRECTORY include/${PROJECT_NAME}/ 188 | # DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} 189 | # FILES_MATCHING PATTERN "*.h" 190 | # PATTERN ".svn" EXCLUDE 191 | # ) 192 | 193 | ## Mark other files for installation (e.g. launch and bag files, etc.) 194 | # install(FILES 195 | # # myfile1 196 | # # myfile2 197 | # DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} 198 | # ) 199 | 200 | ############# 201 | ## Testing ## 202 | ############# 203 | 204 | ## Add gtest based cpp test target and link libraries 205 | # catkin_add_gtest(${PROJECT_NAME}-test test/test_deep_grasping_ros.cpp) 206 | # if(TARGET ${PROJECT_NAME}-test) 207 | # target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}) 208 | # endif() 209 | 210 | ## Add folders to be run by python nosetests 211 | # catkin_add_nosetests(test) 212 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Deep Grasping ROS 3 | 4 | - ROS wrapper for DNN based robotic grasping algorithms 5 | - Support GQ-CNN [[paper]](http://robotics.sciencemag.org/cgi/content/full/4/26/eaau4984?ijkey=IogH9u4mOL70s&keytype=ref&siteid=robotics) [[code]](https://github.com/BerkeleyAutomation/gqcnn) 6 | - Support 6-DoF-GraspNet [[paper]](https://arxiv.org/abs/1905.10520) [[code]](https://github.com/NVlabs/6dof-graspnet) 7 | - Support Contact-GraspNet [[paper]](https://arxiv.org/abs/2103.14127) [[code]](https://github.com/NVlabs/contact_graspnet) 8 | 9 | 10 | To generate a grasping point, simply use `get_target_grasp_pose` service 11 | ``` 12 | rosservice call /get_target_grasp_pose 13 | ``` 14 | 15 | Before run the deep grasping nodes, launch camera nodes 16 | ``` 17 | ROS_NAMESPACE=azure1 roslaunch azure_kinect_ros_driver driver.launch color_resolution:=1440P depth_mode:=WFOV_UNBINNED fps:=5 tf_prefix:=azure1_ 18 | ``` 19 | 20 | ## TODO 21 | 22 | - Cuurently, this repo may not work properly. I will modify it soon ... 23 | - python 2 --> python 3 24 | - remove TCP connections 25 | 26 | 27 | ## GQ-CNN 28 | 29 | 30 | 31 | 32 | ### RUN 33 | 34 | GQ-CNN Server 35 | ``` 36 | rosrun deep_grasping_ros gqcnn_server.py 37 | ``` 38 | 39 | GQ-CNN Client 40 | ``` 41 | conda activate gqcnn 42 | roscd deep_grasping_ros/src/gqcnn && python gqcnn_client.py 43 | ``` 44 | 45 | FC-GQ-CNN Client 46 | ``` 47 | conda activate gqcnn && \ 48 | roscd deep_grasping_ros/src/gqcnn && \ 49 | python fc_gqcnn_client.py 50 | ``` 51 | 52 | 53 | 54 | ## 6-DoF-GraspNet 55 | 56 | 57 | 58 | ### Setup 59 | 60 | ``` 61 | conda create -n 6dofgraspnet python=2 62 | python -m pip install -r requirements.txt 63 | cd src && git clone https://github.com/SeungBack/6dof-graspnet 64 | conda activate 6dofgraspnet && pip install -r requirements.txt 65 | ``` 66 | 67 | ### RUN 68 | 69 | 70 | 71 | 72 | Azure kinect node 73 | ``` 74 | ros27 && ROS_NAMESPACE=azure1 roslaunch azure_kinect_ros_driver driver.launch color_resolution:=1536P depth_mode:=WFOV_UNBINNED fps:=5 tf_prefix:=azure1_ 75 | ``` 76 | 77 | 6-dof-graspnet server 78 | ``` 79 | conda activate 6dofgraspnet \ 80 | && roscd deep_grasping_ros/src \ 81 | && python 6dgn_ros_server.py 82 | ``` 83 | 84 | 6-dof-graspnet client 85 | ``` 86 | conda activate 6dofgraspnet \ 87 | && roscd deep_grasping_ros/src/6dof-graspnet \ 88 | && python -m demo.6dgn_client --vae_checkpoint_folder checkpoints/npoints_1024_train_evaluator_0_allowed_categories__ngpus_1_/ 89 | ``` 90 | 91 | 92 | 93 | ## Contact-GraspNet 94 | 95 | 96 | 97 | ### RUN 98 | 99 | Robot 100 | ``` 101 | cw && ./franka.sh master 102 | ros27 && roslaunch franka_interface interface.launch load_gripper:=true load_demo_planning_scene:=false 103 | 104 | ``` 105 | 106 | Azure kinect node 107 | ``` 108 | ROS_NAMESPACE=azure1 roslaunch azure_kinect_ros_driver driver.launch color_resolution:=720P depth_mode:=WFOV_UNBINNED fps:=5 tf_prefix:=azure1_ 109 | 110 | rosrun tf static_transform_publisher 0.078997 0.001502 0.066975 0.697583 -0.005156 0.716441 -0.007980 /panda_hand /azure1_camera_base 100 111 | ``` 112 | 113 | contact graspnet server 114 | ``` 115 | ros27 && roscd deep_grasping_ros && python src/contact_grasp_server.py 116 | ``` 117 | 118 | contact graspnet client 119 | 120 | ``` 121 | conda activate contact_graspnet_env \ 122 | && roscd deep_grasping_ros/src/contact_graspnet \ 123 | && CUDA_VISIBLE_DEVICES=0 python contact_graspnet/contact_grasp_client.py --local_regions --filter_grasps 124 | ``` 125 | 126 | ``` 127 | conda activate uoais \ 128 | && roscd deep_grasping_ros/src/uoais \ 129 | && CUDA_VISIBLE_DEVICES=1 python demo/uoais_client.py 130 | 131 | ``` 132 | 133 | 134 | For Unstructured Contact-GraspNet 135 | ''' 136 | un \ 137 | && roslaunch gail_camera_manager gail_camera_driver_un.launch 138 | 139 | un \ 140 | && cd ~/catkin_ws/src/deep-grasping/src 141 | && python contact_grasp_server.py 142 | 143 | uncg \ 144 | && cd /home/ailab/catkin_ws/src/deep-grasping/src/contact_graspnet/contact_graspnet 145 | && python contact_grasp_client.py 146 | 147 | un \ 148 | && cd ~/catkin_ws/src/deep-grasping/src/uoais 149 | && python demo/uoais_client.py 150 | 151 | un \ 152 | && rosservice call /get_target_grasp_pose 153 | ''' 154 | 155 | 156 | 157 | 158 | 159 | 160 | ## Authors 161 | * **Seunghyeok Back** [seungback](https://github.com/SeungBack) 162 | -------------------------------------------------------------------------------- /color.npy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gist-ailab/deep-grasping/25412da29015541bbcea1bbec73c92a1a2178dd6/color.npy -------------------------------------------------------------------------------- /imgs/6dof_grasp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gist-ailab/deep-grasping/25412da29015541bbcea1bbec73c92a1a2178dd6/imgs/6dof_grasp.png -------------------------------------------------------------------------------- /imgs/contact_grasp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gist-ailab/deep-grasping/25412da29015541bbcea1bbec73c92a1a2178dd6/imgs/contact_grasp.png -------------------------------------------------------------------------------- /imgs/gqcnn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gist-ailab/deep-grasping/25412da29015541bbcea1bbec73c92a1a2178dd6/imgs/gqcnn.png -------------------------------------------------------------------------------- /msg/Grasp.msg: -------------------------------------------------------------------------------- 1 | string id 2 | float64 score 3 | float64 width 4 | geometry_msgs/TransformStamped transform -------------------------------------------------------------------------------- /package.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | deep_grasping_ros 4 | 0.0.0 5 | The deep_grasping_ros package 6 | 7 | 8 | 9 | 10 | demo 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 | roscpp 53 | rospy 54 | std_msgs 55 | roscpp 56 | rospy 57 | std_msgs 58 | roscpp 59 | rospy 60 | std_msgs 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /rviz/uoais.rviz: -------------------------------------------------------------------------------- 1 | Panels: 2 | - Class: rviz/Displays 3 | Help Height: 0 4 | Name: Displays 5 | Property Tree Widget: 6 | Expanded: 7 | - /MotionPlanning1/Scene Geometry1 8 | - /MotionPlanning1/Scene Robot1 9 | - /MotionPlanning1/Planning Request1 10 | - /PointCloud21 11 | Splitter Ratio: 0.5 12 | Tree Height: 140 13 | - Class: rviz/Selection 14 | Name: Selection 15 | - Class: rviz/Tool Properties 16 | Expanded: 17 | - /2D Pose Estimate1 18 | - /2D Nav Goal1 19 | - /Publish Point1 20 | Name: Tool Properties 21 | Splitter Ratio: 0.5886790156364441 22 | - Class: rviz/Views 23 | Expanded: 24 | - /Current View1 25 | Name: Views 26 | Splitter Ratio: 0.5 27 | - Class: rviz/Time 28 | Experimental: false 29 | Name: Time 30 | SyncMode: 0 31 | SyncSource: Image 32 | Preferences: 33 | PromptSaveOnExit: true 34 | Toolbars: 35 | toolButtonStyle: 2 36 | Visualization Manager: 37 | Class: "" 38 | Displays: 39 | - Alpha: 0.5 40 | Cell Size: 1 41 | Class: rviz/Grid 42 | Color: 160; 160; 164 43 | Enabled: true 44 | Line Style: 45 | Line Width: 0.029999999329447746 46 | Value: Lines 47 | Name: Grid 48 | Normal Cell Count: 0 49 | Offset: 50 | X: 0 51 | Y: 0 52 | Z: 0 53 | Plane: XY 54 | Plane Cell Count: 10 55 | Reference Frame: 56 | Value: true 57 | - Acceleration_Scaling_Factor: 1 58 | Class: moveit_rviz_plugin/MotionPlanning 59 | Enabled: true 60 | Move Group Namespace: "" 61 | MoveIt_Allow_Approximate_IK: false 62 | MoveIt_Allow_External_Program: false 63 | MoveIt_Allow_Replanning: false 64 | MoveIt_Allow_Sensor_Positioning: false 65 | MoveIt_Planning_Attempts: 10 66 | MoveIt_Planning_Time: 5 67 | MoveIt_Use_Cartesian_Path: false 68 | MoveIt_Use_Constraint_Aware_IK: false 69 | MoveIt_Warehouse_Host: 127.0.0.1 70 | MoveIt_Warehouse_Port: 33829 71 | MoveIt_Workspace: 72 | Center: 73 | X: 0 74 | Y: 0 75 | Z: 0 76 | Size: 77 | X: 2 78 | Y: 2 79 | Z: 2 80 | Name: MotionPlanning 81 | Planned Path: 82 | Color Enabled: false 83 | Interrupt Display: false 84 | Links: 85 | All Links Enabled: true 86 | Expand Joint Details: false 87 | Expand Link Details: false 88 | Expand Tree: false 89 | Link Tree Style: Links in Alphabetic Order 90 | azure_kinect: 91 | Alpha: 1 92 | Show Axes: false 93 | Show Trail: false 94 | Value: true 95 | panda_hand: 96 | Alpha: 1 97 | Show Axes: false 98 | Show Trail: false 99 | Value: true 100 | panda_leftfinger: 101 | Alpha: 1 102 | Show Axes: false 103 | Show Trail: false 104 | Value: true 105 | panda_link0: 106 | Alpha: 1 107 | Show Axes: false 108 | Show Trail: false 109 | Value: true 110 | panda_link1: 111 | Alpha: 1 112 | Show Axes: false 113 | Show Trail: false 114 | Value: true 115 | panda_link2: 116 | Alpha: 1 117 | Show Axes: false 118 | Show Trail: false 119 | Value: true 120 | panda_link3: 121 | Alpha: 1 122 | Show Axes: false 123 | Show Trail: false 124 | Value: true 125 | panda_link4: 126 | Alpha: 1 127 | Show Axes: false 128 | Show Trail: false 129 | Value: true 130 | panda_link5: 131 | Alpha: 1 132 | Show Axes: false 133 | Show Trail: false 134 | Value: true 135 | panda_link6: 136 | Alpha: 1 137 | Show Axes: false 138 | Show Trail: false 139 | Value: true 140 | panda_link7: 141 | Alpha: 1 142 | Show Axes: false 143 | Show Trail: false 144 | Value: true 145 | panda_link8: 146 | Alpha: 1 147 | Show Axes: false 148 | Show Trail: false 149 | panda_rightfinger: 150 | Alpha: 1 151 | Show Axes: false 152 | Show Trail: false 153 | Value: true 154 | world: 155 | Alpha: 1 156 | Show Axes: false 157 | Show Trail: false 158 | Loop Animation: false 159 | Robot Alpha: 0.5 160 | Robot Color: 150; 50; 150 161 | Show Robot Collision: false 162 | Show Robot Visual: true 163 | Show Trail: false 164 | State Display Time: 0.05 s 165 | Trail Step Size: 1 166 | Trajectory Topic: /move_group/display_planned_path 167 | Planning Metrics: 168 | Payload: 1 169 | Show Joint Torques: false 170 | Show Manipulability: false 171 | Show Manipulability Index: false 172 | Show Weight Limit: false 173 | TextHeight: 0.07999999821186066 174 | Planning Request: 175 | Colliding Link Color: 255; 0; 0 176 | Goal State Alpha: 1 177 | Goal State Color: 250; 128; 0 178 | Interactive Marker Size: 0 179 | Joint Violation Color: 255; 0; 255 180 | Planning Group: hand 181 | Query Goal State: false 182 | Query Start State: false 183 | Show Workspace: false 184 | Start State Alpha: 1 185 | Start State Color: 0; 255; 0 186 | Planning Scene Topic: move_group/monitored_planning_scene 187 | Robot Description: robot_description 188 | Scene Geometry: 189 | Scene Alpha: 1 190 | Scene Color: 50; 230; 50 191 | Scene Display Time: 0.009999999776482582 192 | Show Scene Geometry: true 193 | Voxel Coloring: Z-Axis 194 | Voxel Rendering: Occupied Voxels 195 | Scene Robot: 196 | Attached Body Color: 150; 50; 150 197 | Links: 198 | All Links Enabled: true 199 | Expand Joint Details: false 200 | Expand Link Details: false 201 | Expand Tree: false 202 | Link Tree Style: Links in Alphabetic Order 203 | azure_kinect: 204 | Alpha: 1 205 | Show Axes: false 206 | Show Trail: false 207 | Value: true 208 | panda_hand: 209 | Alpha: 1 210 | Show Axes: false 211 | Show Trail: false 212 | Value: true 213 | panda_leftfinger: 214 | Alpha: 1 215 | Show Axes: false 216 | Show Trail: false 217 | Value: true 218 | panda_link0: 219 | Alpha: 1 220 | Show Axes: false 221 | Show Trail: false 222 | Value: true 223 | panda_link1: 224 | Alpha: 1 225 | Show Axes: false 226 | Show Trail: false 227 | Value: true 228 | panda_link2: 229 | Alpha: 1 230 | Show Axes: false 231 | Show Trail: false 232 | Value: true 233 | panda_link3: 234 | Alpha: 1 235 | Show Axes: false 236 | Show Trail: false 237 | Value: true 238 | panda_link4: 239 | Alpha: 1 240 | Show Axes: false 241 | Show Trail: false 242 | Value: true 243 | panda_link5: 244 | Alpha: 1 245 | Show Axes: false 246 | Show Trail: false 247 | Value: true 248 | panda_link6: 249 | Alpha: 1 250 | Show Axes: false 251 | Show Trail: false 252 | Value: true 253 | panda_link7: 254 | Alpha: 1 255 | Show Axes: false 256 | Show Trail: false 257 | Value: true 258 | panda_link8: 259 | Alpha: 1 260 | Show Axes: false 261 | Show Trail: false 262 | panda_rightfinger: 263 | Alpha: 1 264 | Show Axes: false 265 | Show Trail: false 266 | Value: true 267 | world: 268 | Alpha: 1 269 | Show Axes: false 270 | Show Trail: false 271 | Robot Alpha: 1 272 | Show Robot Collision: false 273 | Show Robot Visual: true 274 | Value: true 275 | Velocity_Scaling_Factor: 1 276 | - Class: rviz/TF 277 | Enabled: true 278 | Frame Timeout: 15 279 | Frames: 280 | All Enabled: false 281 | azure1_camera_base: 282 | Value: false 283 | azure1_camera_body: 284 | Value: false 285 | azure1_camera_visor: 286 | Value: false 287 | azure1_depth_camera_link: 288 | Value: false 289 | azure1_imu_link: 290 | Value: false 291 | azure1_rgb_camera_link: 292 | Value: true 293 | azure_kinect: 294 | Value: false 295 | base: 296 | Value: true 297 | panda_EE: 298 | Value: false 299 | panda_K: 300 | Value: false 301 | panda_hand: 302 | Value: true 303 | panda_leftfinger: 304 | Value: false 305 | panda_link0: 306 | Value: false 307 | panda_link1: 308 | Value: false 309 | panda_link2: 310 | Value: false 311 | panda_link3: 312 | Value: false 313 | panda_link4: 314 | Value: false 315 | panda_link5: 316 | Value: false 317 | panda_link6: 318 | Value: false 319 | panda_link7: 320 | Value: false 321 | panda_link8: 322 | Value: false 323 | panda_rightfinger: 324 | Value: false 325 | target_grasp_pose: 326 | Value: true 327 | world: 328 | Value: false 329 | Marker Scale: 1 330 | Name: TF 331 | Show Arrows: true 332 | Show Axes: true 333 | Show Names: false 334 | Tree: 335 | world: 336 | base: 337 | panda_link0: 338 | panda_link1: 339 | panda_link2: 340 | panda_link3: 341 | panda_link4: 342 | panda_link5: 343 | panda_link6: 344 | panda_link7: 345 | panda_link8: 346 | azure_kinect: 347 | {} 348 | panda_EE: 349 | panda_K: 350 | {} 351 | panda_hand: 352 | azure1_camera_base: 353 | azure1_camera_body: 354 | {} 355 | azure1_camera_visor: 356 | {} 357 | azure1_depth_camera_link: 358 | azure1_imu_link: 359 | {} 360 | azure1_rgb_camera_link: 361 | {} 362 | panda_leftfinger: 363 | {} 364 | panda_rightfinger: 365 | {} 366 | target_grasp_pose: 367 | {} 368 | Update Interval: 0 369 | Value: true 370 | - Class: rviz/Marker 371 | Enabled: true 372 | Marker Topic: visualization_marker 373 | Name: Marker 374 | Namespaces: 375 | {} 376 | Queue Size: 100 377 | Value: true 378 | - Class: rviz/Image 379 | Enabled: true 380 | Image Topic: /uoais/amodal_mask 381 | Max Value: 1 382 | Median window: 5 383 | Min Value: 0 384 | Name: Image 385 | Normalize Range: true 386 | Queue Size: 2 387 | Transport Hint: raw 388 | Unreliable: false 389 | Value: true 390 | - Class: rviz/MarkerArray 391 | Enabled: true 392 | Marker Topic: /target_grasp 393 | Name: MarkerArray 394 | Namespaces: 395 | 0: true 396 | 1: true 397 | 10: true 398 | 100: true 399 | 1000: true 400 | 1001: true 401 | 1002: true 402 | 1003: true 403 | 1004: true 404 | 1005: true 405 | 1006: true 406 | 1007: true 407 | 1008: true 408 | 1009: true 409 | 101: true 410 | 1010: true 411 | 1011: true 412 | 1012: true 413 | 1013: true 414 | 1014: true 415 | 1015: true 416 | 1016: true 417 | 1017: true 418 | 1018: true 419 | 1019: true 420 | 102: true 421 | 1020: true 422 | 1021: true 423 | 1022: true 424 | 1023: true 425 | 1024: true 426 | 1025: true 427 | 1026: true 428 | 1027: true 429 | 1028: true 430 | 1029: true 431 | 103: true 432 | 1030: true 433 | 1031: true 434 | 1032: true 435 | 1033: true 436 | 1034: true 437 | 1035: true 438 | 1036: true 439 | 1037: true 440 | 1038: true 441 | 1039: true 442 | 104: true 443 | 1040: true 444 | 1041: true 445 | 1042: true 446 | 1043: true 447 | 1044: true 448 | 1045: true 449 | 1046: true 450 | 1047: true 451 | 1048: true 452 | 1049: true 453 | 105: true 454 | 1050: true 455 | 1051: true 456 | 1052: true 457 | 1053: true 458 | 1054: true 459 | 1055: true 460 | 1056: true 461 | 1057: true 462 | 1058: true 463 | 1059: true 464 | 106: true 465 | 1060: true 466 | 1061: true 467 | 1062: true 468 | 1063: true 469 | 1064: true 470 | 1065: true 471 | 1066: true 472 | 1067: true 473 | 1068: true 474 | 1069: true 475 | 107: true 476 | 1070: true 477 | 1071: true 478 | 1072: true 479 | 1073: true 480 | 1074: true 481 | 1075: true 482 | 1076: true 483 | 1077: true 484 | 1078: true 485 | 1079: true 486 | 108: true 487 | 1080: true 488 | 1081: true 489 | 1082: true 490 | 1083: true 491 | 1084: true 492 | 1085: true 493 | 1086: true 494 | 1087: true 495 | 1088: true 496 | 1089: true 497 | 109: true 498 | 1090: true 499 | 1091: true 500 | 1092: true 501 | 1093: true 502 | 1094: true 503 | 1095: true 504 | 1096: true 505 | 1097: true 506 | 1098: true 507 | 1099: true 508 | 11: true 509 | 110: true 510 | 1100: true 511 | 1101: true 512 | 1102: true 513 | 1103: true 514 | 1104: true 515 | 1105: true 516 | 1106: true 517 | 1107: true 518 | 1108: true 519 | 1109: true 520 | 111: true 521 | 1110: true 522 | 1111: true 523 | 1112: true 524 | 1113: true 525 | 1114: true 526 | 1115: true 527 | 1116: true 528 | 1117: true 529 | 1118: true 530 | 1119: true 531 | 112: true 532 | 1120: true 533 | 1121: true 534 | 1122: true 535 | 1123: true 536 | 1124: true 537 | 1125: true 538 | 1126: true 539 | 1127: true 540 | 1128: true 541 | 1129: true 542 | 113: true 543 | 1130: true 544 | 1131: true 545 | 1132: true 546 | 1133: true 547 | 1134: true 548 | 1135: true 549 | 1136: true 550 | 1137: true 551 | 1138: true 552 | 1139: true 553 | 114: true 554 | 1140: true 555 | 1141: true 556 | 1142: true 557 | 1143: true 558 | 1144: true 559 | 1145: true 560 | 1146: true 561 | 1147: true 562 | 1148: true 563 | 1149: true 564 | 115: true 565 | 1150: true 566 | 1151: true 567 | 1152: true 568 | 1153: true 569 | 1154: true 570 | 1155: true 571 | 1156: true 572 | 1157: true 573 | 1158: true 574 | 1159: true 575 | 116: true 576 | 1160: true 577 | 1161: true 578 | 1162: true 579 | 1163: true 580 | 1164: true 581 | 1165: true 582 | 1166: true 583 | 1167: true 584 | 1168: true 585 | 1169: true 586 | 117: true 587 | 1170: true 588 | 1171: true 589 | 1172: true 590 | 1173: true 591 | 1174: true 592 | 1175: true 593 | 1176: true 594 | 1177: true 595 | 1178: true 596 | 1179: true 597 | 118: true 598 | 1180: true 599 | 1181: true 600 | 1182: true 601 | 1183: true 602 | 1184: true 603 | 1185: true 604 | 1186: true 605 | 1187: true 606 | 1188: true 607 | 1189: true 608 | 119: true 609 | 1190: true 610 | 1191: true 611 | 1192: true 612 | 1193: true 613 | 1194: true 614 | 1195: true 615 | 1196: true 616 | 1197: true 617 | 1198: true 618 | 1199: true 619 | 12: true 620 | 120: true 621 | 1200: true 622 | 1201: true 623 | 1202: true 624 | 1203: true 625 | 1204: true 626 | 1205: true 627 | 1206: true 628 | 1207: true 629 | 1208: true 630 | 1209: true 631 | 121: true 632 | 1210: true 633 | 1211: true 634 | 1212: true 635 | 1213: true 636 | 1214: true 637 | 1215: true 638 | 1216: true 639 | 1217: true 640 | 1218: true 641 | 1219: true 642 | 122: true 643 | 1220: true 644 | 1221: true 645 | 1222: true 646 | 1223: true 647 | 1224: true 648 | 1225: true 649 | 1226: true 650 | 1227: true 651 | 1228: true 652 | 1229: true 653 | 123: true 654 | 1230: true 655 | 1231: true 656 | 1232: true 657 | 1233: true 658 | 1234: true 659 | 1235: true 660 | 1236: true 661 | 1237: true 662 | 1238: true 663 | 1239: true 664 | 124: true 665 | 1240: true 666 | 1241: true 667 | 1242: true 668 | 1243: true 669 | 1244: true 670 | 1245: true 671 | 1246: true 672 | 1247: true 673 | 1248: true 674 | 1249: true 675 | 125: true 676 | 1250: true 677 | 1251: true 678 | 1252: true 679 | 1253: true 680 | 1254: true 681 | 1255: true 682 | 1256: true 683 | 1257: true 684 | 1258: true 685 | 1259: true 686 | 126: true 687 | 1260: true 688 | 1261: true 689 | 1262: true 690 | 1263: true 691 | 1264: true 692 | 1265: true 693 | 1266: true 694 | 1267: true 695 | 1268: true 696 | 1269: true 697 | 127: true 698 | 1270: true 699 | 1271: true 700 | 1272: true 701 | 1273: true 702 | 1274: true 703 | 1275: true 704 | 1276: true 705 | 1277: true 706 | 1278: true 707 | 1279: true 708 | 128: true 709 | 1280: true 710 | 1281: true 711 | 1282: true 712 | 1283: true 713 | 1284: true 714 | 1285: true 715 | 1286: true 716 | 1287: true 717 | 1288: true 718 | 1289: true 719 | 129: true 720 | 1290: true 721 | 1291: true 722 | 1292: true 723 | 1293: true 724 | 1294: true 725 | 1295: true 726 | 1296: true 727 | 1297: true 728 | 1298: true 729 | 1299: true 730 | 13: true 731 | 130: true 732 | 1300: true 733 | 1301: true 734 | 1302: true 735 | 1303: true 736 | 1304: true 737 | 1305: true 738 | 1306: true 739 | 1307: true 740 | 1308: true 741 | 1309: true 742 | 131: true 743 | 1310: true 744 | 1311: true 745 | 1312: true 746 | 1313: true 747 | 1314: true 748 | 1315: true 749 | 1316: true 750 | 1317: true 751 | 1318: true 752 | 1319: true 753 | 132: true 754 | 1320: true 755 | 1321: true 756 | 1322: true 757 | 1323: true 758 | 1324: true 759 | 1325: true 760 | 1326: true 761 | 1327: true 762 | 1328: true 763 | 1329: true 764 | 133: true 765 | 1330: true 766 | 1331: true 767 | 1332: true 768 | 1333: true 769 | 1334: true 770 | 1335: true 771 | 1336: true 772 | 1337: true 773 | 1338: true 774 | 1339: true 775 | 134: true 776 | 1340: true 777 | 1341: true 778 | 1342: true 779 | 1343: true 780 | 1344: true 781 | 1345: true 782 | 1346: true 783 | 1347: true 784 | 1348: true 785 | 1349: true 786 | 135: true 787 | 1350: true 788 | 1351: true 789 | 1352: true 790 | 1353: true 791 | 1354: true 792 | 1355: true 793 | 1356: true 794 | 1357: true 795 | 1358: true 796 | 1359: true 797 | 136: true 798 | 1360: true 799 | 1361: true 800 | 1362: true 801 | 1363: true 802 | 1364: true 803 | 1365: true 804 | 1366: true 805 | 1367: true 806 | 1368: true 807 | 1369: true 808 | 137: true 809 | 1370: true 810 | 1371: true 811 | 1372: true 812 | 1373: true 813 | 1374: true 814 | 1375: true 815 | 1376: true 816 | 1377: true 817 | 1378: true 818 | 1379: true 819 | 138: true 820 | 1380: true 821 | 1381: true 822 | 1382: true 823 | 1383: true 824 | 1384: true 825 | 1385: true 826 | 1386: true 827 | 1387: true 828 | 1388: true 829 | 1389: true 830 | 139: true 831 | 1390: true 832 | 1391: true 833 | 1392: true 834 | 1393: true 835 | 1394: true 836 | 1395: true 837 | 1396: true 838 | 1397: true 839 | 1398: true 840 | 1399: true 841 | 14: true 842 | 140: true 843 | 1400: true 844 | 1401: true 845 | 1402: true 846 | 1403: true 847 | 1404: true 848 | 1405: true 849 | 1406: true 850 | 1407: true 851 | 1408: true 852 | 1409: true 853 | 141: true 854 | 1410: true 855 | 1411: true 856 | 1412: true 857 | 1413: true 858 | 1414: true 859 | 1415: true 860 | 1416: true 861 | 1417: true 862 | 1418: true 863 | 1419: true 864 | 142: true 865 | 1420: true 866 | 1421: true 867 | 1422: true 868 | 1423: true 869 | 1424: true 870 | 1425: true 871 | 1426: true 872 | 1427: true 873 | 1428: true 874 | 1429: true 875 | 143: true 876 | 1430: true 877 | 1431: true 878 | 1432: true 879 | 1433: true 880 | 1434: true 881 | 1435: true 882 | 1436: true 883 | 1437: true 884 | 1438: true 885 | 1439: true 886 | 144: true 887 | 1440: true 888 | 1441: true 889 | 1442: true 890 | 1443: true 891 | 1444: true 892 | 1445: true 893 | 1446: true 894 | 1447: true 895 | 1448: true 896 | 1449: true 897 | 145: true 898 | 1450: true 899 | 1451: true 900 | 1452: true 901 | 1453: true 902 | 1454: true 903 | 1455: true 904 | 1456: true 905 | 1457: true 906 | 1458: true 907 | 1459: true 908 | 146: true 909 | 1460: true 910 | 1461: true 911 | 1462: true 912 | 1463: true 913 | 1464: true 914 | 1465: true 915 | 1466: true 916 | 1467: true 917 | 1468: true 918 | 1469: true 919 | 147: true 920 | 1470: true 921 | 1471: true 922 | 1472: true 923 | 1473: true 924 | 1474: true 925 | 1475: true 926 | 1476: true 927 | 1477: true 928 | 1478: true 929 | 1479: true 930 | 148: true 931 | 1480: true 932 | 1481: true 933 | 1482: true 934 | 1483: true 935 | 1484: true 936 | 1485: true 937 | 1486: true 938 | 1487: true 939 | 1488: true 940 | 1489: true 941 | 149: true 942 | 1490: true 943 | 1491: true 944 | 1492: true 945 | 1493: true 946 | 1494: true 947 | 1495: true 948 | 1496: true 949 | 1497: true 950 | 1498: true 951 | 1499: true 952 | 15: true 953 | 150: true 954 | 1500: true 955 | 1501: true 956 | 1502: true 957 | 1503: true 958 | 1504: true 959 | 1505: true 960 | 1506: true 961 | 1507: true 962 | 1508: true 963 | 1509: true 964 | 151: true 965 | 1510: true 966 | 1511: true 967 | 1512: true 968 | 1513: true 969 | 1514: true 970 | 1515: true 971 | 1516: true 972 | 1517: true 973 | 1518: true 974 | 1519: true 975 | 152: true 976 | 1520: true 977 | 1521: true 978 | 1522: true 979 | 1523: true 980 | 1524: true 981 | 1525: true 982 | 1526: true 983 | 1527: true 984 | 1528: true 985 | 1529: true 986 | 153: true 987 | 1530: true 988 | 1531: true 989 | 1532: true 990 | 1533: true 991 | 1534: true 992 | 1535: true 993 | 1536: true 994 | 1537: true 995 | 1538: true 996 | 1539: true 997 | 154: true 998 | 1540: true 999 | 1541: true 1000 | 1542: true 1001 | 1543: true 1002 | 1544: true 1003 | 1545: true 1004 | 1546: true 1005 | 1547: true 1006 | 1548: true 1007 | 1549: true 1008 | 155: true 1009 | 1550: true 1010 | 1551: true 1011 | 1552: true 1012 | 1553: true 1013 | 1554: true 1014 | 1555: true 1015 | 1556: true 1016 | 1557: true 1017 | 1558: true 1018 | 1559: true 1019 | 156: true 1020 | 1560: true 1021 | 1561: true 1022 | 1562: true 1023 | 1563: true 1024 | 1564: true 1025 | 1565: true 1026 | 1566: true 1027 | 1567: true 1028 | 1568: true 1029 | 1569: true 1030 | 157: true 1031 | 1570: true 1032 | 1571: true 1033 | 1572: true 1034 | 1573: true 1035 | 1574: true 1036 | 1575: true 1037 | 1576: true 1038 | 1577: true 1039 | 1578: true 1040 | 1579: true 1041 | 158: true 1042 | 1580: true 1043 | 1581: true 1044 | 1582: true 1045 | 1583: true 1046 | 1584: true 1047 | 1585: true 1048 | 1586: true 1049 | 1587: true 1050 | 1588: true 1051 | 1589: true 1052 | 159: true 1053 | 1590: true 1054 | 1591: true 1055 | 1592: true 1056 | 1593: true 1057 | 1594: true 1058 | 1595: true 1059 | 1596: true 1060 | 1597: true 1061 | 1598: true 1062 | 1599: true 1063 | 16: true 1064 | 160: true 1065 | 1600: true 1066 | 1601: true 1067 | 1602: true 1068 | 1603: true 1069 | 1604: true 1070 | 1605: true 1071 | 1606: true 1072 | 1607: true 1073 | 1608: true 1074 | 1609: true 1075 | 161: true 1076 | 1610: true 1077 | 1611: true 1078 | 1612: true 1079 | 1613: true 1080 | 1614: true 1081 | 1615: true 1082 | 1616: true 1083 | 1617: true 1084 | 1618: true 1085 | 1619: true 1086 | 162: true 1087 | 1620: true 1088 | 1621: true 1089 | 1622: true 1090 | 1623: true 1091 | 1624: true 1092 | 1625: true 1093 | 1626: true 1094 | 1627: true 1095 | 1628: true 1096 | 1629: true 1097 | 163: true 1098 | 1630: true 1099 | 1631: true 1100 | 1632: true 1101 | 1633: true 1102 | 1634: true 1103 | 1635: true 1104 | 1636: true 1105 | 1637: true 1106 | 1638: true 1107 | 1639: true 1108 | 164: true 1109 | 1640: true 1110 | 1641: true 1111 | 1642: true 1112 | 1643: true 1113 | 1644: true 1114 | 1645: true 1115 | 1646: true 1116 | 1647: true 1117 | 1648: true 1118 | 1649: true 1119 | 165: true 1120 | 1650: true 1121 | 1651: true 1122 | 1652: true 1123 | 1653: true 1124 | 1654: true 1125 | 1655: true 1126 | 1656: true 1127 | 1657: true 1128 | 1658: true 1129 | 1659: true 1130 | 166: true 1131 | 1660: true 1132 | 1661: true 1133 | 1662: true 1134 | 1663: true 1135 | 1664: true 1136 | 1665: true 1137 | 1666: true 1138 | 1667: true 1139 | 1668: true 1140 | 1669: true 1141 | 167: true 1142 | 1670: true 1143 | 1671: true 1144 | 1672: true 1145 | 1673: true 1146 | 1674: true 1147 | 1675: true 1148 | 1676: true 1149 | 1677: true 1150 | 1678: true 1151 | 1679: true 1152 | 168: true 1153 | 1680: true 1154 | 1681: true 1155 | 1682: true 1156 | 1683: true 1157 | 1684: true 1158 | 1685: true 1159 | 1686: true 1160 | 1687: true 1161 | 1688: true 1162 | 1689: true 1163 | 169: true 1164 | 1690: true 1165 | 1691: true 1166 | 1692: true 1167 | 1693: true 1168 | 1694: true 1169 | 1695: true 1170 | 1696: true 1171 | 1697: true 1172 | 1698: true 1173 | 1699: true 1174 | 17: true 1175 | 170: true 1176 | 1700: true 1177 | 1701: true 1178 | 1702: true 1179 | 1703: true 1180 | 1704: true 1181 | 1705: true 1182 | 1706: true 1183 | 1707: true 1184 | 1708: true 1185 | 1709: true 1186 | 171: true 1187 | 1710: true 1188 | 1711: true 1189 | 1712: true 1190 | 1713: true 1191 | 1714: true 1192 | 1715: true 1193 | 1716: true 1194 | 1717: true 1195 | 1718: true 1196 | 1719: true 1197 | 172: true 1198 | 1720: true 1199 | 1721: true 1200 | 1722: true 1201 | 1723: true 1202 | 1724: true 1203 | 1725: true 1204 | 1726: true 1205 | 1727: true 1206 | 1728: true 1207 | 1729: true 1208 | 173: true 1209 | 1730: true 1210 | 1731: true 1211 | 1732: true 1212 | 1733: true 1213 | 1734: true 1214 | 1735: true 1215 | 1736: true 1216 | 1737: true 1217 | 1738: true 1218 | 1739: true 1219 | 174: true 1220 | 1740: true 1221 | 1741: true 1222 | 1742: true 1223 | 1743: true 1224 | 1744: true 1225 | 1745: true 1226 | 1746: true 1227 | 1747: true 1228 | 1748: true 1229 | 1749: true 1230 | 175: true 1231 | 1750: true 1232 | 1751: true 1233 | 1752: true 1234 | 1753: true 1235 | 1754: true 1236 | 1755: true 1237 | 1756: true 1238 | 1757: true 1239 | 1758: true 1240 | 1759: true 1241 | 176: true 1242 | 1760: true 1243 | 1761: true 1244 | 1762: true 1245 | 1763: true 1246 | 1764: true 1247 | 1765: true 1248 | 1766: true 1249 | 1767: true 1250 | 1768: true 1251 | 1769: true 1252 | 177: true 1253 | 1770: true 1254 | 1771: true 1255 | 1772: true 1256 | 1773: true 1257 | 1774: true 1258 | 1775: true 1259 | 1776: true 1260 | 1777: true 1261 | 1778: true 1262 | 1779: true 1263 | 178: true 1264 | 1780: true 1265 | 1781: true 1266 | 1782: true 1267 | 1783: true 1268 | 1784: true 1269 | 1785: true 1270 | 1786: true 1271 | 1787: true 1272 | 1788: true 1273 | 1789: true 1274 | 179: true 1275 | 1790: true 1276 | 1791: true 1277 | 1792: true 1278 | 1793: true 1279 | 1794: true 1280 | 1795: true 1281 | 1796: true 1282 | 1797: true 1283 | 1798: true 1284 | 1799: true 1285 | 18: true 1286 | 180: true 1287 | 1800: true 1288 | 1801: true 1289 | 1802: true 1290 | 1803: true 1291 | 1804: true 1292 | 1805: true 1293 | 1806: true 1294 | 1807: true 1295 | 1808: true 1296 | 1809: true 1297 | 181: true 1298 | 1810: true 1299 | 1811: true 1300 | 1812: true 1301 | 1813: true 1302 | 1814: true 1303 | 1815: true 1304 | 1816: true 1305 | 1817: true 1306 | 1818: true 1307 | 1819: true 1308 | 182: true 1309 | 1820: true 1310 | 1821: true 1311 | 1822: true 1312 | 1823: true 1313 | 1824: true 1314 | 1825: true 1315 | 1826: true 1316 | 1827: true 1317 | 1828: true 1318 | 1829: true 1319 | 183: true 1320 | 1830: true 1321 | 1831: true 1322 | 1832: true 1323 | 1833: true 1324 | 1834: true 1325 | 1835: true 1326 | 1836: true 1327 | 1837: true 1328 | 1838: true 1329 | 1839: true 1330 | 184: true 1331 | 1840: true 1332 | 1841: true 1333 | 1842: true 1334 | 1843: true 1335 | 1844: true 1336 | 1845: true 1337 | 1846: true 1338 | 1847: true 1339 | 1848: true 1340 | 1849: true 1341 | 185: true 1342 | 1850: true 1343 | 1851: true 1344 | 1852: true 1345 | 1853: true 1346 | 1854: true 1347 | 1855: true 1348 | 1856: true 1349 | 1857: true 1350 | 1858: true 1351 | 1859: true 1352 | 186: true 1353 | 1860: true 1354 | 1861: true 1355 | 1862: true 1356 | 1863: true 1357 | 1864: true 1358 | 1865: true 1359 | 1866: true 1360 | 1867: true 1361 | 1868: true 1362 | 1869: true 1363 | 187: true 1364 | 1870: true 1365 | 1871: true 1366 | 1872: true 1367 | 1873: true 1368 | 1874: true 1369 | 1875: true 1370 | 1876: true 1371 | 1877: true 1372 | 1878: true 1373 | 1879: true 1374 | 188: true 1375 | 1880: true 1376 | 1881: true 1377 | 1882: true 1378 | 1883: true 1379 | 1884: true 1380 | 1885: true 1381 | 1886: true 1382 | 1887: true 1383 | 1888: true 1384 | 1889: true 1385 | 189: true 1386 | 1890: true 1387 | 1891: true 1388 | 1892: true 1389 | 1893: true 1390 | 1894: true 1391 | 1895: true 1392 | 1896: true 1393 | 1897: true 1394 | 1898: true 1395 | 1899: true 1396 | 19: true 1397 | 190: true 1398 | 1900: true 1399 | 1901: true 1400 | 1902: true 1401 | 1903: true 1402 | 1904: true 1403 | 1905: true 1404 | 1906: true 1405 | 1907: true 1406 | 1908: true 1407 | 1909: true 1408 | 191: true 1409 | 1910: true 1410 | 1911: true 1411 | 1912: true 1412 | 1913: true 1413 | 1914: true 1414 | 1915: true 1415 | 1916: true 1416 | 1917: true 1417 | 1918: true 1418 | 1919: true 1419 | 192: true 1420 | 1920: true 1421 | 1921: true 1422 | 1922: true 1423 | 1923: true 1424 | 1924: true 1425 | 1925: true 1426 | 1926: true 1427 | 1927: true 1428 | 1928: true 1429 | 1929: true 1430 | 193: true 1431 | 1930: true 1432 | 1931: true 1433 | 1932: true 1434 | 1933: true 1435 | 1934: true 1436 | 1935: true 1437 | 1936: true 1438 | 1937: true 1439 | 1938: true 1440 | 1939: true 1441 | 194: true 1442 | 1940: true 1443 | 1941: true 1444 | 1942: true 1445 | 1943: true 1446 | 1944: true 1447 | 1945: true 1448 | 1946: true 1449 | 1947: true 1450 | 1948: true 1451 | 1949: true 1452 | 195: true 1453 | 1950: true 1454 | 1951: true 1455 | 1952: true 1456 | 1953: true 1457 | 1954: true 1458 | 1955: true 1459 | 1956: true 1460 | 1957: true 1461 | 1958: true 1462 | 1959: true 1463 | 196: true 1464 | 1960: true 1465 | 1961: true 1466 | 1962: true 1467 | 1963: true 1468 | 1964: true 1469 | 1965: true 1470 | 1966: true 1471 | 1967: true 1472 | 1968: true 1473 | 1969: true 1474 | 197: true 1475 | 1970: true 1476 | 1971: true 1477 | 1972: true 1478 | 1973: true 1479 | 1974: true 1480 | 1975: true 1481 | 1976: true 1482 | 1977: true 1483 | 1978: true 1484 | 1979: true 1485 | 198: true 1486 | 1980: true 1487 | 1981: true 1488 | 1982: true 1489 | 1983: true 1490 | 1984: true 1491 | 1985: true 1492 | 1986: true 1493 | 1987: true 1494 | 1988: true 1495 | 1989: true 1496 | 199: true 1497 | 1990: true 1498 | 1991: true 1499 | 1992: true 1500 | 1993: true 1501 | 1994: true 1502 | 1995: true 1503 | 1996: true 1504 | 1997: true 1505 | 1998: true 1506 | 1999: true 1507 | 2: true 1508 | 20: true 1509 | 200: true 1510 | 2000: true 1511 | 2001: true 1512 | 2002: true 1513 | 2003: true 1514 | 2004: true 1515 | 2005: true 1516 | 2006: true 1517 | 2007: true 1518 | 2008: true 1519 | 2009: true 1520 | 201: true 1521 | 2010: true 1522 | 2011: true 1523 | 2012: true 1524 | 2013: true 1525 | 2014: true 1526 | 2015: true 1527 | 2016: true 1528 | 2017: true 1529 | 2018: true 1530 | 2019: true 1531 | 202: true 1532 | 2020: true 1533 | 2021: true 1534 | 2022: true 1535 | 2023: true 1536 | 2024: true 1537 | 2025: true 1538 | 2026: true 1539 | 2027: true 1540 | 2028: true 1541 | 2029: true 1542 | 203: true 1543 | 2030: true 1544 | 2031: true 1545 | 2032: true 1546 | 2033: true 1547 | 2034: true 1548 | 2035: true 1549 | 2036: true 1550 | 2037: true 1551 | 2038: true 1552 | 2039: true 1553 | 204: true 1554 | 2040: true 1555 | 2041: true 1556 | 2042: true 1557 | 2043: true 1558 | 2044: true 1559 | 2045: true 1560 | 2046: true 1561 | 2047: true 1562 | 2048: true 1563 | 2049: true 1564 | 205: true 1565 | 2050: true 1566 | 2051: true 1567 | 2052: true 1568 | 2053: true 1569 | 2054: true 1570 | 2055: true 1571 | 2056: true 1572 | 2057: true 1573 | 2058: true 1574 | 2059: true 1575 | 206: true 1576 | 2060: true 1577 | 2061: true 1578 | 2062: true 1579 | 2063: true 1580 | 2064: true 1581 | 2065: true 1582 | 2066: true 1583 | 2067: true 1584 | 2068: true 1585 | 2069: true 1586 | 207: true 1587 | 2070: true 1588 | 2071: true 1589 | 2072: true 1590 | 2073: true 1591 | 2074: true 1592 | 2075: true 1593 | 2076: true 1594 | 2077: true 1595 | 2078: true 1596 | 2079: true 1597 | 208: true 1598 | 2080: true 1599 | 2081: true 1600 | 2082: true 1601 | 2083: true 1602 | 2084: true 1603 | 2085: true 1604 | 2086: true 1605 | 2087: true 1606 | 2088: true 1607 | 2089: true 1608 | 209: true 1609 | 2090: true 1610 | 2091: true 1611 | 2092: true 1612 | 2093: true 1613 | 2094: true 1614 | 2095: true 1615 | 2096: true 1616 | 2097: true 1617 | 2098: true 1618 | 2099: true 1619 | 21: true 1620 | 210: true 1621 | 2100: true 1622 | 2101: true 1623 | 2102: true 1624 | 2103: true 1625 | 2104: true 1626 | 2105: true 1627 | 2106: true 1628 | 2107: true 1629 | 2108: true 1630 | 2109: true 1631 | 211: true 1632 | 2110: true 1633 | 2111: true 1634 | 2112: true 1635 | 2113: true 1636 | 2114: true 1637 | 2115: true 1638 | 2116: true 1639 | 2117: true 1640 | 2118: true 1641 | 2119: true 1642 | 212: true 1643 | 2120: true 1644 | 2121: true 1645 | 2122: true 1646 | 2123: true 1647 | 2124: true 1648 | 2125: true 1649 | 2126: true 1650 | 2127: true 1651 | 2128: true 1652 | 2129: true 1653 | 213: true 1654 | 2130: true 1655 | 2131: true 1656 | 2132: true 1657 | 2133: true 1658 | 2134: true 1659 | 2135: true 1660 | 2136: true 1661 | 2137: true 1662 | 2138: true 1663 | 2139: true 1664 | 214: true 1665 | 2140: true 1666 | 2141: true 1667 | 2142: true 1668 | 2143: true 1669 | 2144: true 1670 | 2145: true 1671 | 2146: true 1672 | 2147: true 1673 | 2148: true 1674 | 2149: true 1675 | 215: true 1676 | 2150: true 1677 | 2151: true 1678 | 2152: true 1679 | 2153: true 1680 | 2154: true 1681 | 2155: true 1682 | 2156: true 1683 | 2157: true 1684 | 2158: true 1685 | 2159: true 1686 | 216: true 1687 | 2160: true 1688 | 2161: true 1689 | 2162: true 1690 | 2163: true 1691 | 2164: true 1692 | 2165: true 1693 | 2166: true 1694 | 2167: true 1695 | 2168: true 1696 | 2169: true 1697 | 217: true 1698 | 2170: true 1699 | 2171: true 1700 | 2172: true 1701 | 2173: true 1702 | 2174: true 1703 | 2175: true 1704 | 2176: true 1705 | 2177: true 1706 | 2178: true 1707 | 2179: true 1708 | 218: true 1709 | 2180: true 1710 | 2181: true 1711 | 2182: true 1712 | 2183: true 1713 | 2184: true 1714 | 2185: true 1715 | 2186: true 1716 | 2187: true 1717 | 2188: true 1718 | 2189: true 1719 | 219: true 1720 | 2190: true 1721 | 2191: true 1722 | 2192: true 1723 | 2193: true 1724 | 2194: true 1725 | 2195: true 1726 | 2196: true 1727 | 2197: true 1728 | 2198: true 1729 | 2199: true 1730 | 22: true 1731 | 220: true 1732 | 2200: true 1733 | 2201: true 1734 | 2202: true 1735 | 2203: true 1736 | 2204: true 1737 | 2205: true 1738 | 2206: true 1739 | 2207: true 1740 | 2208: true 1741 | 2209: true 1742 | 221: true 1743 | 2210: true 1744 | 2211: true 1745 | 2212: true 1746 | 2213: true 1747 | 2214: true 1748 | 2215: true 1749 | 2216: true 1750 | 2217: true 1751 | 2218: true 1752 | 2219: true 1753 | 222: true 1754 | 2220: true 1755 | 2221: true 1756 | 2222: true 1757 | 2223: true 1758 | 2224: true 1759 | 2225: true 1760 | 2226: true 1761 | 2227: true 1762 | 2228: true 1763 | 2229: true 1764 | 223: true 1765 | 2230: true 1766 | 2231: true 1767 | 2232: true 1768 | 2233: true 1769 | 2234: true 1770 | 2235: true 1771 | 2236: true 1772 | 2237: true 1773 | 2238: true 1774 | 2239: true 1775 | 224: true 1776 | 2240: true 1777 | 2241: true 1778 | 2242: true 1779 | 2243: true 1780 | 2244: true 1781 | 2245: true 1782 | 2246: true 1783 | 2247: true 1784 | 2248: true 1785 | 2249: true 1786 | 225: true 1787 | 2250: true 1788 | 2251: true 1789 | 2252: true 1790 | 2253: true 1791 | 2254: true 1792 | 2255: true 1793 | 2256: true 1794 | 2257: true 1795 | 2258: true 1796 | 2259: true 1797 | 226: true 1798 | 2260: true 1799 | 2261: true 1800 | 2262: true 1801 | 2263: true 1802 | 2264: true 1803 | 2265: true 1804 | 2266: true 1805 | 2267: true 1806 | 2268: true 1807 | 2269: true 1808 | 227: true 1809 | 2270: true 1810 | 2271: true 1811 | 2272: true 1812 | 2273: true 1813 | 2274: true 1814 | 2275: true 1815 | 2276: true 1816 | 2277: true 1817 | 2278: true 1818 | 2279: true 1819 | 228: true 1820 | 2280: true 1821 | 2281: true 1822 | 2282: true 1823 | 2283: true 1824 | 2284: true 1825 | 2285: true 1826 | 2286: true 1827 | 2287: true 1828 | 2288: true 1829 | 2289: true 1830 | 229: true 1831 | 2290: true 1832 | 2291: true 1833 | 2292: true 1834 | 2293: true 1835 | 2294: true 1836 | 2295: true 1837 | 2296: true 1838 | 2297: true 1839 | 2298: true 1840 | 2299: true 1841 | 23: true 1842 | 230: true 1843 | 2300: true 1844 | 2301: true 1845 | 2302: true 1846 | 2303: true 1847 | 2304: true 1848 | 2305: true 1849 | 2306: true 1850 | 2307: true 1851 | 2308: true 1852 | 2309: true 1853 | 231: true 1854 | 2310: true 1855 | 2311: true 1856 | 2312: true 1857 | 2313: true 1858 | 2314: true 1859 | 2315: true 1860 | 2316: true 1861 | 2317: true 1862 | 2318: true 1863 | 2319: true 1864 | 232: true 1865 | 2320: true 1866 | 2321: true 1867 | 2322: true 1868 | 2323: true 1869 | 2324: true 1870 | 2325: true 1871 | 2326: true 1872 | 2327: true 1873 | 2328: true 1874 | 2329: true 1875 | 233: true 1876 | 2330: true 1877 | 2331: true 1878 | 2332: true 1879 | 2333: true 1880 | 2334: true 1881 | 2335: true 1882 | 2336: true 1883 | 2337: true 1884 | 2338: true 1885 | 2339: true 1886 | 234: true 1887 | 2340: true 1888 | 2341: true 1889 | 2342: true 1890 | 2343: true 1891 | 2344: true 1892 | 2345: true 1893 | 2346: true 1894 | 2347: true 1895 | 2348: true 1896 | 2349: true 1897 | 235: true 1898 | 2350: true 1899 | 2351: true 1900 | 2352: true 1901 | 2353: true 1902 | 2354: true 1903 | 2355: true 1904 | 2356: true 1905 | 2357: true 1906 | 2358: true 1907 | 2359: true 1908 | 236: true 1909 | 2360: true 1910 | 2361: true 1911 | 2362: true 1912 | 2363: true 1913 | 2364: true 1914 | 2365: true 1915 | 2366: true 1916 | 2367: true 1917 | 2368: true 1918 | 2369: true 1919 | 237: true 1920 | 2370: true 1921 | 2371: true 1922 | 2372: true 1923 | 2373: true 1924 | 2374: true 1925 | 2375: true 1926 | 2376: true 1927 | 2377: true 1928 | 2378: true 1929 | 2379: true 1930 | 238: true 1931 | 2380: true 1932 | 2381: true 1933 | 2382: true 1934 | 2383: true 1935 | 2384: true 1936 | 2385: true 1937 | 2386: true 1938 | 2387: true 1939 | 2388: true 1940 | 2389: true 1941 | 239: true 1942 | 2390: true 1943 | 2391: true 1944 | 2392: true 1945 | 2393: true 1946 | 2394: true 1947 | 2395: true 1948 | 2396: true 1949 | 2397: true 1950 | 2398: true 1951 | 2399: true 1952 | 24: true 1953 | 240: true 1954 | 2400: true 1955 | 2401: true 1956 | 2402: true 1957 | 2403: true 1958 | 2404: true 1959 | 2405: true 1960 | 2406: true 1961 | 2407: true 1962 | 2408: true 1963 | 2409: true 1964 | 241: true 1965 | 2410: true 1966 | 2411: true 1967 | 2412: true 1968 | 2413: true 1969 | 2414: true 1970 | 2415: true 1971 | 2416: true 1972 | 2417: true 1973 | 2418: true 1974 | 2419: true 1975 | 242: true 1976 | 2420: true 1977 | 2421: true 1978 | 2422: true 1979 | 2423: true 1980 | 2424: true 1981 | 2425: true 1982 | 2426: true 1983 | 2427: true 1984 | 2428: true 1985 | 2429: true 1986 | 243: true 1987 | 2430: true 1988 | 2431: true 1989 | 2432: true 1990 | 2433: true 1991 | 2434: true 1992 | 2435: true 1993 | 2436: true 1994 | 2437: true 1995 | 2438: true 1996 | 2439: true 1997 | 244: true 1998 | 2440: true 1999 | 2441: true 2000 | 2442: true 2001 | 2443: true 2002 | 2444: true 2003 | 2445: true 2004 | 2446: true 2005 | 2447: true 2006 | 2448: true 2007 | 2449: true 2008 | 245: true 2009 | 2450: true 2010 | 2451: true 2011 | 2452: true 2012 | 2453: true 2013 | 2454: true 2014 | 2455: true 2015 | 2456: true 2016 | 2457: true 2017 | 2458: true 2018 | 2459: true 2019 | 246: true 2020 | 2460: true 2021 | 2461: true 2022 | 2462: true 2023 | 2463: true 2024 | 2464: true 2025 | 2465: true 2026 | 2466: true 2027 | 2467: true 2028 | 2468: true 2029 | 2469: true 2030 | 247: true 2031 | 2470: true 2032 | 2471: true 2033 | 2472: true 2034 | 2473: true 2035 | 2474: true 2036 | 2475: true 2037 | 2476: true 2038 | 2477: true 2039 | 2478: true 2040 | 2479: true 2041 | 248: true 2042 | 2480: true 2043 | 2481: true 2044 | 2482: true 2045 | 2483: true 2046 | 2484: true 2047 | 2485: true 2048 | 2486: true 2049 | 2487: true 2050 | 2488: true 2051 | 2489: true 2052 | 249: true 2053 | 2490: true 2054 | 2491: true 2055 | 2492: true 2056 | 2493: true 2057 | 2494: true 2058 | 2495: true 2059 | 2496: true 2060 | 2497: true 2061 | 2498: true 2062 | 2499: true 2063 | 25: true 2064 | 250: true 2065 | 2500: true 2066 | 2501: true 2067 | 2502: true 2068 | 2503: true 2069 | 2504: true 2070 | 2505: true 2071 | 2506: true 2072 | 2507: true 2073 | 2508: true 2074 | 2509: true 2075 | 251: true 2076 | 2510: true 2077 | 2511: true 2078 | 2512: true 2079 | 2513: true 2080 | 2514: true 2081 | 2515: true 2082 | 2516: true 2083 | 2517: true 2084 | 2518: true 2085 | 2519: true 2086 | 252: true 2087 | 2520: true 2088 | 2521: true 2089 | 2522: true 2090 | 2523: true 2091 | 2524: true 2092 | 2525: true 2093 | 2526: true 2094 | 2527: true 2095 | 2528: true 2096 | 2529: true 2097 | 253: true 2098 | 2530: true 2099 | 2531: true 2100 | 2532: true 2101 | 2533: true 2102 | 2534: true 2103 | 254: true 2104 | 2548: true 2105 | 2549: true 2106 | 255: true 2107 | 2550: true 2108 | 2551: true 2109 | 2552: true 2110 | 2553: true 2111 | 2554: true 2112 | 2555: true 2113 | 2556: true 2114 | 2557: true 2115 | 2558: true 2116 | 2559: true 2117 | 256: true 2118 | 2560: true 2119 | 2561: true 2120 | 2562: true 2121 | 2563: true 2122 | 2564: true 2123 | 2565: true 2124 | 2566: true 2125 | 2567: true 2126 | 2568: true 2127 | 2569: true 2128 | 257: true 2129 | 2570: true 2130 | 2571: true 2131 | 2572: true 2132 | 2573: true 2133 | 2574: true 2134 | 2575: true 2135 | 2576: true 2136 | 2577: true 2137 | 2578: true 2138 | 2579: true 2139 | 258: true 2140 | 2580: true 2141 | 2581: true 2142 | 2582: true 2143 | 2583: true 2144 | 2584: true 2145 | 2585: true 2146 | 2586: true 2147 | 2587: true 2148 | 2588: true 2149 | 2589: true 2150 | 259: true 2151 | 2590: true 2152 | 2591: true 2153 | 2592: true 2154 | 2593: true 2155 | 2594: true 2156 | 2595: true 2157 | 2596: true 2158 | 2597: true 2159 | 2598: true 2160 | 2599: true 2161 | 26: true 2162 | 260: true 2163 | 2600: true 2164 | 2601: true 2165 | 2602: true 2166 | 2603: true 2167 | 2604: true 2168 | 2605: true 2169 | 2606: true 2170 | 2607: true 2171 | 2608: true 2172 | 2609: true 2173 | 261: true 2174 | 2610: true 2175 | 2611: true 2176 | 2612: true 2177 | 2613: true 2178 | 2614: true 2179 | 2615: true 2180 | 2616: true 2181 | 2617: true 2182 | 2618: true 2183 | 2619: true 2184 | 262: true 2185 | 2620: true 2186 | 2621: true 2187 | 2622: true 2188 | 2623: true 2189 | 2624: true 2190 | 2625: true 2191 | 2626: true 2192 | 2627: true 2193 | 2628: true 2194 | 2629: true 2195 | 263: true 2196 | 2630: true 2197 | 2631: true 2198 | 2632: true 2199 | 2633: true 2200 | 2634: true 2201 | 2635: true 2202 | 2636: true 2203 | 2637: true 2204 | 2638: true 2205 | 2639: true 2206 | 264: true 2207 | 2640: true 2208 | 2641: true 2209 | 2642: true 2210 | 2643: true 2211 | 2644: true 2212 | 2645: true 2213 | 2646: true 2214 | 2647: true 2215 | 2648: true 2216 | 2649: true 2217 | 265: true 2218 | 2650: true 2219 | 2651: true 2220 | 2652: true 2221 | 2653: true 2222 | 2654: true 2223 | 2655: true 2224 | 2656: true 2225 | 2657: true 2226 | 2658: true 2227 | 2659: true 2228 | 266: true 2229 | 2660: true 2230 | 2661: true 2231 | 2662: true 2232 | 2663: true 2233 | 2664: true 2234 | 2665: true 2235 | 2666: true 2236 | 2667: true 2237 | 2668: true 2238 | 2669: true 2239 | 267: true 2240 | 2670: true 2241 | 2671: true 2242 | 2672: true 2243 | 2673: true 2244 | 2674: true 2245 | 2675: true 2246 | 2676: true 2247 | 2677: true 2248 | 2678: true 2249 | 2679: true 2250 | 268: true 2251 | 2680: true 2252 | 2681: true 2253 | 2682: true 2254 | 2683: true 2255 | 2684: true 2256 | 2685: true 2257 | 2686: true 2258 | 2687: true 2259 | 2688: true 2260 | 2689: true 2261 | 269: true 2262 | 2690: true 2263 | 2691: true 2264 | 2692: true 2265 | 2693: true 2266 | 2694: true 2267 | 2695: true 2268 | 2696: true 2269 | 2697: true 2270 | 2698: true 2271 | 2699: true 2272 | 27: true 2273 | 270: true 2274 | 2700: true 2275 | 2701: true 2276 | 2702: true 2277 | 2703: true 2278 | 2704: true 2279 | 2705: true 2280 | 2706: true 2281 | 2707: true 2282 | 2708: true 2283 | 2709: true 2284 | 271: true 2285 | 2710: true 2286 | 2711: true 2287 | 2712: true 2288 | 2713: true 2289 | 2714: true 2290 | 2715: true 2291 | 2716: true 2292 | 2717: true 2293 | 2718: true 2294 | 2719: true 2295 | 272: true 2296 | 2720: true 2297 | 2721: true 2298 | 2722: true 2299 | 2723: true 2300 | 2724: true 2301 | 2725: true 2302 | 2726: true 2303 | 2727: true 2304 | 2728: true 2305 | 2729: true 2306 | 273: true 2307 | 2730: true 2308 | 2731: true 2309 | 2732: true 2310 | 2733: true 2311 | 2734: true 2312 | 2735: true 2313 | 2736: true 2314 | 2737: true 2315 | 2738: true 2316 | 2739: true 2317 | 274: true 2318 | 2740: true 2319 | 2741: true 2320 | 2742: true 2321 | 2743: true 2322 | 2744: true 2323 | 2745: true 2324 | 2746: true 2325 | 2747: true 2326 | 2748: true 2327 | 2749: true 2328 | 275: true 2329 | 2750: true 2330 | 2751: true 2331 | 2752: true 2332 | 2753: true 2333 | 2754: true 2334 | 2755: true 2335 | 2756: true 2336 | 2757: true 2337 | 2758: true 2338 | 2759: true 2339 | 276: true 2340 | 2760: true 2341 | 2761: true 2342 | 2762: true 2343 | 2763: true 2344 | 2764: true 2345 | 2765: true 2346 | 2766: true 2347 | 2767: true 2348 | 2768: true 2349 | 2769: true 2350 | 277: true 2351 | 2770: true 2352 | 2771: true 2353 | 2772: true 2354 | 2773: true 2355 | 2774: true 2356 | 2775: true 2357 | 2776: true 2358 | 2777: true 2359 | 2778: true 2360 | 2779: true 2361 | 278: true 2362 | 2780: true 2363 | 2781: true 2364 | 2782: true 2365 | 2783: true 2366 | 2784: true 2367 | 2785: true 2368 | 2786: true 2369 | 2787: true 2370 | 2788: true 2371 | 2789: true 2372 | 279: true 2373 | 2790: true 2374 | 2791: true 2375 | 2792: true 2376 | 2793: true 2377 | 2794: true 2378 | 2795: true 2379 | 2796: true 2380 | 2797: true 2381 | 2798: true 2382 | 2799: true 2383 | 28: true 2384 | 280: true 2385 | 2800: true 2386 | 2801: true 2387 | 2802: true 2388 | 2803: true 2389 | 2804: true 2390 | 2805: true 2391 | 2806: true 2392 | 2807: true 2393 | 2808: true 2394 | 2809: true 2395 | 281: true 2396 | 2810: true 2397 | 2811: true 2398 | 2812: true 2399 | 2813: true 2400 | 2814: true 2401 | 2815: true 2402 | 2816: true 2403 | 2817: true 2404 | 2818: true 2405 | 2819: true 2406 | 282: true 2407 | 2820: true 2408 | 2821: true 2409 | 2822: true 2410 | 2823: true 2411 | 2824: true 2412 | 2825: true 2413 | 2826: true 2414 | 2827: true 2415 | 2828: true 2416 | 2829: true 2417 | 283: true 2418 | 2830: true 2419 | 2831: true 2420 | 2832: true 2421 | 2833: true 2422 | 2834: true 2423 | 2835: true 2424 | 2836: true 2425 | 2837: true 2426 | 2838: true 2427 | 2839: true 2428 | 284: true 2429 | 2840: true 2430 | 2841: true 2431 | 2842: true 2432 | 2843: true 2433 | 2844: true 2434 | 2845: true 2435 | 2846: true 2436 | 2847: true 2437 | 2848: true 2438 | 2849: true 2439 | 285: true 2440 | 2850: true 2441 | 2851: true 2442 | 2852: true 2443 | 2853: true 2444 | 2854: true 2445 | 2855: true 2446 | 2856: true 2447 | 2857: true 2448 | 2858: true 2449 | 2859: true 2450 | 286: true 2451 | 2860: true 2452 | 2861: true 2453 | 2862: true 2454 | 2863: true 2455 | 2864: true 2456 | 2865: true 2457 | 2866: true 2458 | 2867: true 2459 | 2868: true 2460 | 2869: true 2461 | 287: true 2462 | 2870: true 2463 | 2871: true 2464 | 2872: true 2465 | 2873: true 2466 | 2874: true 2467 | 2875: true 2468 | 2876: true 2469 | 2877: true 2470 | 2878: true 2471 | 2879: true 2472 | 288: true 2473 | 2880: true 2474 | 2881: true 2475 | 2882: true 2476 | 2883: true 2477 | 2884: true 2478 | 2885: true 2479 | 2886: true 2480 | 2887: true 2481 | 2888: true 2482 | 2889: true 2483 | 289: true 2484 | 2890: true 2485 | 2891: true 2486 | 2892: true 2487 | 2893: true 2488 | 2894: true 2489 | 2895: true 2490 | 2896: true 2491 | 2897: true 2492 | 2898: true 2493 | 2899: true 2494 | 29: true 2495 | 290: true 2496 | 2900: true 2497 | 2901: true 2498 | 2902: true 2499 | 2903: true 2500 | 2904: true 2501 | 2905: true 2502 | 2906: true 2503 | 2907: true 2504 | 2908: true 2505 | 2909: true 2506 | 291: true 2507 | 2910: true 2508 | 2911: true 2509 | 2912: true 2510 | 2913: true 2511 | 2914: true 2512 | 2915: true 2513 | 2916: true 2514 | 2917: true 2515 | 2918: true 2516 | 2919: true 2517 | 292: true 2518 | 2920: true 2519 | 2921: true 2520 | 2922: true 2521 | 2923: true 2522 | 2924: true 2523 | 293: true 2524 | 294: true 2525 | 295: true 2526 | 296: true 2527 | 297: true 2528 | 298: true 2529 | 299: true 2530 | 3: true 2531 | 30: true 2532 | 300: true 2533 | 301: true 2534 | 302: true 2535 | 303: true 2536 | 304: true 2537 | 305: true 2538 | 306: true 2539 | 307: true 2540 | 308: true 2541 | 309: true 2542 | 31: true 2543 | 310: true 2544 | 311: true 2545 | 312: true 2546 | 313: true 2547 | 314: true 2548 | 315: true 2549 | 316: true 2550 | 317: true 2551 | 318: true 2552 | 319: true 2553 | 32: true 2554 | 320: true 2555 | 321: true 2556 | 322: true 2557 | 323: true 2558 | 324: true 2559 | 325: true 2560 | 326: true 2561 | 327: true 2562 | 328: true 2563 | 329: true 2564 | 33: true 2565 | 330: true 2566 | 331: true 2567 | 332: true 2568 | 333: true 2569 | 334: true 2570 | 335: true 2571 | 336: true 2572 | 337: true 2573 | 338: true 2574 | 339: true 2575 | 34: true 2576 | 340: true 2577 | 341: true 2578 | 342: true 2579 | 343: true 2580 | 344: true 2581 | 345: true 2582 | 346: true 2583 | 347: true 2584 | 348: true 2585 | 349: true 2586 | 35: true 2587 | 350: true 2588 | 351: true 2589 | 352: true 2590 | 353: true 2591 | 354: true 2592 | 355: true 2593 | 356: true 2594 | 357: true 2595 | 358: true 2596 | 359: true 2597 | 36: true 2598 | 360: true 2599 | 361: true 2600 | 362: true 2601 | 363: true 2602 | 364: true 2603 | 365: true 2604 | 366: true 2605 | 367: true 2606 | 368: true 2607 | 369: true 2608 | 37: true 2609 | 370: true 2610 | 371: true 2611 | 372: true 2612 | 373: true 2613 | 374: true 2614 | 375: true 2615 | 376: true 2616 | 377: true 2617 | 378: true 2618 | 379: true 2619 | 38: true 2620 | 380: true 2621 | 381: true 2622 | 382: true 2623 | 383: true 2624 | 384: true 2625 | 385: true 2626 | 386: true 2627 | 387: true 2628 | 388: true 2629 | 389: true 2630 | 39: true 2631 | 390: true 2632 | 391: true 2633 | 392: true 2634 | 393: true 2635 | 394: true 2636 | 395: true 2637 | 396: true 2638 | 397: true 2639 | 398: true 2640 | 399: true 2641 | 4: true 2642 | 40: true 2643 | 400: true 2644 | 401: true 2645 | 402: true 2646 | 403: true 2647 | 404: true 2648 | 405: true 2649 | 406: true 2650 | 407: true 2651 | 408: true 2652 | 409: true 2653 | 41: true 2654 | 410: true 2655 | 411: true 2656 | 412: true 2657 | 413: true 2658 | 414: true 2659 | 415: true 2660 | 416: true 2661 | 417: true 2662 | 418: true 2663 | 419: true 2664 | 42: true 2665 | 420: true 2666 | 421: true 2667 | 422: true 2668 | 423: true 2669 | 424: true 2670 | 425: true 2671 | 426: true 2672 | 427: true 2673 | 428: true 2674 | 429: true 2675 | 43: true 2676 | 430: true 2677 | 431: true 2678 | 432: true 2679 | 433: true 2680 | 434: true 2681 | 435: true 2682 | 436: true 2683 | 437: true 2684 | 438: true 2685 | 439: true 2686 | 44: true 2687 | 440: true 2688 | 441: true 2689 | 442: true 2690 | 443: true 2691 | 444: true 2692 | 445: true 2693 | 446: true 2694 | 447: true 2695 | 448: true 2696 | 449: true 2697 | 45: true 2698 | 450: true 2699 | 451: true 2700 | 452: true 2701 | 453: true 2702 | 454: true 2703 | 455: true 2704 | 456: true 2705 | 457: true 2706 | 458: true 2707 | 459: true 2708 | 46: true 2709 | 460: true 2710 | 461: true 2711 | 462: true 2712 | 463: true 2713 | 464: true 2714 | 465: true 2715 | 466: true 2716 | 467: true 2717 | 468: true 2718 | 469: true 2719 | 47: true 2720 | 470: true 2721 | 471: true 2722 | 472: true 2723 | 473: true 2724 | 474: true 2725 | 475: true 2726 | 476: true 2727 | 477: true 2728 | 478: true 2729 | 479: true 2730 | 48: true 2731 | 480: true 2732 | 481: true 2733 | 482: true 2734 | 483: true 2735 | 484: true 2736 | 485: true 2737 | 486: true 2738 | 487: true 2739 | 488: true 2740 | 489: true 2741 | 49: true 2742 | 490: true 2743 | 491: true 2744 | 492: true 2745 | 493: true 2746 | 494: true 2747 | 495: true 2748 | 496: true 2749 | 497: true 2750 | 498: true 2751 | 499: true 2752 | 5: true 2753 | 50: true 2754 | 500: true 2755 | 501: true 2756 | 502: true 2757 | 503: true 2758 | 504: true 2759 | 505: true 2760 | 506: true 2761 | 507: true 2762 | 508: true 2763 | 509: true 2764 | 51: true 2765 | 510: true 2766 | 511: true 2767 | 512: true 2768 | 513: true 2769 | 514: true 2770 | 515: true 2771 | 516: true 2772 | 517: true 2773 | 518: true 2774 | 519: true 2775 | 52: true 2776 | 520: true 2777 | 521: true 2778 | 522: true 2779 | 523: true 2780 | 524: true 2781 | 525: true 2782 | 526: true 2783 | 527: true 2784 | 528: true 2785 | 529: true 2786 | 53: true 2787 | 530: true 2788 | 531: true 2789 | 532: true 2790 | 533: true 2791 | 534: true 2792 | 535: true 2793 | 536: true 2794 | 537: true 2795 | 538: true 2796 | 539: true 2797 | 54: true 2798 | 540: true 2799 | 541: true 2800 | 542: true 2801 | 543: true 2802 | 544: true 2803 | 545: true 2804 | 546: true 2805 | 547: true 2806 | 548: true 2807 | 549: true 2808 | 55: true 2809 | 550: true 2810 | 551: true 2811 | 552: true 2812 | 553: true 2813 | 554: true 2814 | 555: true 2815 | 556: true 2816 | 557: true 2817 | 558: true 2818 | 559: true 2819 | 56: true 2820 | 560: true 2821 | 561: true 2822 | 562: true 2823 | 563: true 2824 | 564: true 2825 | 565: true 2826 | 566: true 2827 | 567: true 2828 | 568: true 2829 | 569: true 2830 | 57: true 2831 | 570: true 2832 | 571: true 2833 | 572: true 2834 | 573: true 2835 | 574: true 2836 | 575: true 2837 | 576: true 2838 | 577: true 2839 | 578: true 2840 | 579: true 2841 | 58: true 2842 | 580: true 2843 | 581: true 2844 | 582: true 2845 | 583: true 2846 | 584: true 2847 | 585: true 2848 | 586: true 2849 | 587: true 2850 | 588: true 2851 | 589: true 2852 | 59: true 2853 | 590: true 2854 | 591: true 2855 | 592: true 2856 | 593: true 2857 | 594: true 2858 | 595: true 2859 | 596: true 2860 | 597: true 2861 | 598: true 2862 | 599: true 2863 | 6: true 2864 | 60: true 2865 | 600: true 2866 | 601: true 2867 | 602: true 2868 | 603: true 2869 | 604: true 2870 | 605: true 2871 | 606: true 2872 | 607: true 2873 | 608: true 2874 | 609: true 2875 | 61: true 2876 | 610: true 2877 | 611: true 2878 | 612: true 2879 | 613: true 2880 | 614: true 2881 | 615: true 2882 | 616: true 2883 | 617: true 2884 | 618: true 2885 | 619: true 2886 | 62: true 2887 | 620: true 2888 | 621: true 2889 | 622: true 2890 | 623: true 2891 | 624: true 2892 | 625: true 2893 | 626: true 2894 | 627: true 2895 | 628: true 2896 | 629: true 2897 | 63: true 2898 | 630: true 2899 | 631: true 2900 | 632: true 2901 | 633: true 2902 | 634: true 2903 | 635: true 2904 | 636: true 2905 | 637: true 2906 | 638: true 2907 | 639: true 2908 | 64: true 2909 | 640: true 2910 | 641: true 2911 | 642: true 2912 | 643: true 2913 | 644: true 2914 | 645: true 2915 | 646: true 2916 | 647: true 2917 | 648: true 2918 | 649: true 2919 | 65: true 2920 | 650: true 2921 | 651: true 2922 | 652: true 2923 | 653: true 2924 | 654: true 2925 | 655: true 2926 | 656: true 2927 | 657: true 2928 | 658: true 2929 | 659: true 2930 | 66: true 2931 | 660: true 2932 | 661: true 2933 | 662: true 2934 | 663: true 2935 | 664: true 2936 | 665: true 2937 | 666: true 2938 | 667: true 2939 | 668: true 2940 | 669: true 2941 | 67: true 2942 | 670: true 2943 | 671: true 2944 | 672: true 2945 | 673: true 2946 | 674: true 2947 | 675: true 2948 | 676: true 2949 | 677: true 2950 | 678: true 2951 | 679: true 2952 | 68: true 2953 | 680: true 2954 | 681: true 2955 | 682: true 2956 | 683: true 2957 | 684: true 2958 | 685: true 2959 | 686: true 2960 | 687: true 2961 | 688: true 2962 | 689: true 2963 | 69: true 2964 | 690: true 2965 | 691: true 2966 | 692: true 2967 | 693: true 2968 | 694: true 2969 | 695: true 2970 | 696: true 2971 | 697: true 2972 | 698: true 2973 | 699: true 2974 | 7: true 2975 | 70: true 2976 | 700: true 2977 | 701: true 2978 | 702: true 2979 | 703: true 2980 | 704: true 2981 | 705: true 2982 | 706: true 2983 | 707: true 2984 | 708: true 2985 | 709: true 2986 | 71: true 2987 | 710: true 2988 | 711: true 2989 | 712: true 2990 | 713: true 2991 | 714: true 2992 | 715: true 2993 | 716: true 2994 | 717: true 2995 | 718: true 2996 | 719: true 2997 | 72: true 2998 | 720: true 2999 | 721: true 3000 | 722: true 3001 | 723: true 3002 | 724: true 3003 | 725: true 3004 | 726: true 3005 | 727: true 3006 | 728: true 3007 | 729: true 3008 | 73: true 3009 | 730: true 3010 | 731: true 3011 | 732: true 3012 | 733: true 3013 | 734: true 3014 | 735: true 3015 | 736: true 3016 | 737: true 3017 | 738: true 3018 | 739: true 3019 | 74: true 3020 | 740: true 3021 | 741: true 3022 | 742: true 3023 | 743: true 3024 | 744: true 3025 | 745: true 3026 | 746: true 3027 | 747: true 3028 | 748: true 3029 | 749: true 3030 | 75: true 3031 | 750: true 3032 | 751: true 3033 | 752: true 3034 | 753: true 3035 | 754: true 3036 | 755: true 3037 | 756: true 3038 | 757: true 3039 | 758: true 3040 | 759: true 3041 | 76: true 3042 | 760: true 3043 | 761: true 3044 | 762: true 3045 | 763: true 3046 | 764: true 3047 | 765: true 3048 | 766: true 3049 | 767: true 3050 | 768: true 3051 | 769: true 3052 | 77: true 3053 | 770: true 3054 | 771: true 3055 | 772: true 3056 | 773: true 3057 | 774: true 3058 | 775: true 3059 | 776: true 3060 | 777: true 3061 | 778: true 3062 | 779: true 3063 | 78: true 3064 | 780: true 3065 | 781: true 3066 | 782: true 3067 | 783: true 3068 | 784: true 3069 | 785: true 3070 | 786: true 3071 | 787: true 3072 | 788: true 3073 | 789: true 3074 | 79: true 3075 | 790: true 3076 | 791: true 3077 | 792: true 3078 | 793: true 3079 | 794: true 3080 | 795: true 3081 | 796: true 3082 | 797: true 3083 | 798: true 3084 | 799: true 3085 | 8: true 3086 | 80: true 3087 | 800: true 3088 | 801: true 3089 | 802: true 3090 | 803: true 3091 | 804: true 3092 | 805: true 3093 | 806: true 3094 | 807: true 3095 | 808: true 3096 | 809: true 3097 | 81: true 3098 | 810: true 3099 | 811: true 3100 | 812: true 3101 | 813: true 3102 | 814: true 3103 | 815: true 3104 | 816: true 3105 | 817: true 3106 | 818: true 3107 | 819: true 3108 | 82: true 3109 | 820: true 3110 | 821: true 3111 | 822: true 3112 | 823: true 3113 | 824: true 3114 | 825: true 3115 | 826: true 3116 | 827: true 3117 | 828: true 3118 | 829: true 3119 | 83: true 3120 | 830: true 3121 | 831: true 3122 | 832: true 3123 | 833: true 3124 | 834: true 3125 | 835: true 3126 | 836: true 3127 | 837: true 3128 | 838: true 3129 | 839: true 3130 | 84: true 3131 | 840: true 3132 | 841: true 3133 | 842: true 3134 | 843: true 3135 | 844: true 3136 | 845: true 3137 | 846: true 3138 | 847: true 3139 | 848: true 3140 | 849: true 3141 | 85: true 3142 | 850: true 3143 | 851: true 3144 | 852: true 3145 | 853: true 3146 | 854: true 3147 | 855: true 3148 | 856: true 3149 | 857: true 3150 | 858: true 3151 | 859: true 3152 | 86: true 3153 | 860: true 3154 | 861: true 3155 | 862: true 3156 | 863: true 3157 | 864: true 3158 | 865: true 3159 | 866: true 3160 | 867: true 3161 | 868: true 3162 | 869: true 3163 | 87: true 3164 | 870: true 3165 | 871: true 3166 | 872: true 3167 | 873: true 3168 | 874: true 3169 | 875: true 3170 | 876: true 3171 | 877: true 3172 | 878: true 3173 | 879: true 3174 | 88: true 3175 | 880: true 3176 | 881: true 3177 | 882: true 3178 | 883: true 3179 | 884: true 3180 | 885: true 3181 | 886: true 3182 | 887: true 3183 | 888: true 3184 | 889: true 3185 | 89: true 3186 | 890: true 3187 | 891: true 3188 | 892: true 3189 | 893: true 3190 | 894: true 3191 | 895: true 3192 | 896: true 3193 | 897: true 3194 | 898: true 3195 | 899: true 3196 | 9: true 3197 | 90: true 3198 | 900: true 3199 | 901: true 3200 | 902: true 3201 | 903: true 3202 | 904: true 3203 | 905: true 3204 | 906: true 3205 | 907: true 3206 | 908: true 3207 | 909: true 3208 | 91: true 3209 | 910: true 3210 | 911: true 3211 | 912: true 3212 | 913: true 3213 | 914: true 3214 | 915: true 3215 | 916: true 3216 | 917: true 3217 | 918: true 3218 | 919: true 3219 | 92: true 3220 | 920: true 3221 | 921: true 3222 | 922: true 3223 | 923: true 3224 | 924: true 3225 | 925: true 3226 | 926: true 3227 | 927: true 3228 | 928: true 3229 | 929: true 3230 | 93: true 3231 | 930: true 3232 | 931: true 3233 | 932: true 3234 | 933: true 3235 | 934: true 3236 | 935: true 3237 | 936: true 3238 | 937: true 3239 | 938: true 3240 | 939: true 3241 | 94: true 3242 | 940: true 3243 | 941: true 3244 | 942: true 3245 | 943: true 3246 | 944: true 3247 | 945: true 3248 | 946: true 3249 | 947: true 3250 | 948: true 3251 | 949: true 3252 | 95: true 3253 | 950: true 3254 | 951: true 3255 | 952: true 3256 | 953: true 3257 | 954: true 3258 | 955: true 3259 | 956: true 3260 | 957: true 3261 | 958: true 3262 | 959: true 3263 | 96: true 3264 | 960: true 3265 | 961: true 3266 | 962: true 3267 | 963: true 3268 | 964: true 3269 | 965: true 3270 | 966: true 3271 | 967: true 3272 | 968: true 3273 | 969: true 3274 | 97: true 3275 | 970: true 3276 | 971: true 3277 | 972: true 3278 | 973: true 3279 | 974: true 3280 | 975: true 3281 | 976: true 3282 | 977: true 3283 | 978: true 3284 | 979: true 3285 | 98: true 3286 | 980: true 3287 | 981: true 3288 | 982: true 3289 | 983: true 3290 | 984: true 3291 | 985: true 3292 | 986: true 3293 | 987: true 3294 | 988: true 3295 | 989: true 3296 | 99: true 3297 | 990: true 3298 | 991: true 3299 | 992: true 3300 | 993: true 3301 | 994: true 3302 | 995: true 3303 | 996: true 3304 | 997: true 3305 | 998: true 3306 | 999: true 3307 | Queue Size: 100 3308 | Value: true 3309 | - Alpha: 1 3310 | Autocompute Intensity Bounds: true 3311 | Autocompute Value Bounds: 3312 | Max Value: 10 3313 | Min Value: -10 3314 | Value: true 3315 | Axis: Z 3316 | Channel Name: intensity 3317 | Class: rviz/PointCloud2 3318 | Color: 255; 255; 255 3319 | Color Transformer: RGB8 3320 | Decay Time: 0 3321 | Enabled: true 3322 | Invert Rainbow: false 3323 | Max Color: 255; 255; 255 3324 | Max Intensity: 4096 3325 | Min Color: 0; 0; 0 3326 | Min Intensity: 0 3327 | Name: PointCloud2 3328 | Position Transformer: XYZ 3329 | Queue Size: 10 3330 | Selectable: true 3331 | Size (Pixels): 3 3332 | Size (m): 0.009999999776482582 3333 | Style: Flat Squares 3334 | Topic: /azure1/points2 3335 | Unreliable: false 3336 | Use Fixed Frame: true 3337 | Use rainbow: true 3338 | Value: true 3339 | - Class: rviz/MarkerArray 3340 | Enabled: true 3341 | Marker Topic: /occupied_cells_vis_array 3342 | Name: MarkerArray 3343 | Namespaces: 3344 | map: true 3345 | Queue Size: 100 3346 | Value: true 3347 | - Class: rviz/Image 3348 | Enabled: true 3349 | Image Topic: /azure1/rgb/image_raw 3350 | Max Value: 1 3351 | Median window: 5 3352 | Min Value: 0 3353 | Name: Image 3354 | Normalize Range: true 3355 | Queue Size: 2 3356 | Transport Hint: raw 3357 | Unreliable: false 3358 | Value: true 3359 | - Class: rviz/Image 3360 | Enabled: true 3361 | Image Topic: /azure1/depth_to_rgb/image_raw 3362 | Max Value: 1 3363 | Median window: 5 3364 | Min Value: 0 3365 | Name: Image 3366 | Normalize Range: true 3367 | Queue Size: 2 3368 | Transport Hint: raw 3369 | Unreliable: false 3370 | Value: true 3371 | - Class: octomap_rviz_plugin/OccupancyGrid 3372 | Enabled: true 3373 | Max. Height Display: 3.4028234663852886e+38 3374 | Max. Octree Depth: 16 3375 | Min. Height Display: -3.4028234663852886e+38 3376 | Name: OccupancyGrid 3377 | Octomap Topic: "" 3378 | Queue Size: 5 3379 | Value: true 3380 | Voxel Alpha: 1 3381 | Voxel Coloring: Z-Axis 3382 | Voxel Rendering: Occupied Voxels 3383 | Enabled: true 3384 | Global Options: 3385 | Background Color: 48; 48; 48 3386 | Default Light: true 3387 | Fixed Frame: world 3388 | Frame Rate: 30 3389 | Name: root 3390 | Tools: 3391 | - Class: rviz/Interact 3392 | Hide Inactive Objects: true 3393 | - Class: rviz/MoveCamera 3394 | - Class: rviz/Select 3395 | - Class: rviz/FocusCamera 3396 | - Class: rviz/Measure 3397 | - Class: rviz/SetInitialPose 3398 | Theta std deviation: 0.2617993950843811 3399 | Topic: /initialpose 3400 | X std deviation: 0.5 3401 | Y std deviation: 0.5 3402 | - Class: rviz/SetGoal 3403 | Topic: /move_base_simple/goal 3404 | - Class: rviz/PublishPoint 3405 | Single click: true 3406 | Topic: /clicked_point 3407 | Value: true 3408 | Views: 3409 | Current: 3410 | Class: rviz/Orbit 3411 | Distance: 0.7680066823959351 3412 | Enable Stereo Rendering: 3413 | Stereo Eye Separation: 0.05999999865889549 3414 | Stereo Focal Distance: 1 3415 | Swap Stereo Eyes: false 3416 | Value: false 3417 | Focal Point: 3418 | X: 0.3741230070590973 3419 | Y: -0.09905186295509338 3420 | Z: 0.11417256295681 3421 | Focal Shape Fixed Size: false 3422 | Focal Shape Size: 0.05000000074505806 3423 | Invert Z Axis: false 3424 | Name: Current View 3425 | Near Clip Distance: 0.009999999776482582 3426 | Pitch: 0.7797966599464417 3427 | Target Frame: 3428 | Value: Orbit (rviz) 3429 | Yaw: 1.2435557842254639 3430 | Saved: ~ 3431 | Window Geometry: 3432 | Displays: 3433 | collapsed: true 3434 | Height: 1023 3435 | Hide Left Dock: true 3436 | Hide Right Dock: true 3437 | Image: 3438 | collapsed: false 3439 | MotionPlanning: 3440 | collapsed: true 3441 | MotionPlanning - Trajectory Slider: 3442 | collapsed: false 3443 | QMainWindow State: 000000ff00000000fd0000000400000000000001f300000257fc020000000bfb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261fb000000280020002d0020005400720061006a006500630074006f0072007900200053006c00690064006500720000000000ffffffff0000000000000000fb000000100044006900730070006c006100790073000000014c000000c9000000c900fffffffb0000001c004d006f00740069006f006e0050006c0061006e006e0069006e0067000000021b000001880000017d00fffffffb00000044004d006f00740069006f006e0050006c0061006e006e0069006e00670020002d0020005400720061006a006500630074006f0072007900200053006c00690064006500720000000000ffffffff0000004100ffffff000000010000017300000363fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073000000003d00000363000000a400fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b20000000000000000000000020000039f00000109fc0100000005fb0000000a0049006d0061006700650100000000000001330000005e00fffffffb0000000a0049006d00610067006501000001390000012a0000005e00fffffffb0000000a0049006d0061006700650100000269000001360000005e00fffffffb0000000a0049006d006100670065010000027f000001200000000000000000fb0000000a00560069006500770073030000004e00000080000002e100000197000000030000039f00000039fc0100000002fb0000000800540069006d006501000000000000039f000002eb00fffffffb0000000800540069006d006501000000000000045000000000000000000000039f0000025700000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 3444 | Selection: 3445 | collapsed: false 3446 | Time: 3447 | collapsed: false 3448 | Tool Properties: 3449 | collapsed: false 3450 | Views: 3451 | collapsed: true 3452 | Width: 927 3453 | X: 67 3454 | Y: 27 3455 | -------------------------------------------------------------------------------- /scene/uoais.scene: -------------------------------------------------------------------------------- 1 | (noname)+++ 2 | * Box_0 3 | 1 4 | box 5 | 1.5 0.2 1.5 6 | 0.98 0.04 0.07 7 | 0.706816 0.00353693 0.00353411 0.707379 8 | 0 0 0 0 9 | * Ground 10 | 1 11 | box 12 | 4.0755 0.143 1.43 13 | 0 -0.01 -0.07 14 | -0.0111648 0.7073 0.706737 -0.0111737 15 | 0 0 0 0 16 | * Wall 17 | 1 18 | box 19 | 2.85 0.1 1 20 | -0.53 -0.41 0.4 21 | 0 0 0.710353 0.703846 22 | 0 0 0 0 23 | . 24 | -------------------------------------------------------------------------------- /segmap.npy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gist-ailab/deep-grasping/25412da29015541bbcea1bbec73c92a1a2178dd6/segmap.npy -------------------------------------------------------------------------------- /src/6dof_graspnet_server.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import rospy 4 | import ros_numpy 5 | import cv2, cv_bridge 6 | import numpy as np 7 | import message_filters 8 | 9 | from sensor_msgs.msg import Image, CameraInfo, PointCloud2 10 | 11 | from easy_tcp_python2_3 import socket_utils as su 12 | from open3d_ros_helper import open3d_ros_helper as orh 13 | import open3d 14 | 15 | class GraspNet(): 16 | 17 | def __init__(self): 18 | 19 | rospy.init_node("graspnet") 20 | rospy.loginfo("Starting 6dof_graspnet node") 21 | self.cv_bridge = cv_bridge.CvBridge() 22 | 23 | # initialize dnn server 24 | self.sock, add = su.initialize_server('localhost', 7777) 25 | 26 | self.camera_info = rospy.wait_for_message("/azure1/rgb/camera_info", CameraInfo) 27 | self.data = {} 28 | self.data["intrinsics_matrix"] = np.array(self.camera_info.K).reshape(3, 3) 29 | 30 | rgb_sub = message_filters.Subscriber("/azure1/rgb/image_raw", Image, buff_size=2048*1536*3) 31 | depth_sub = message_filters.Subscriber("/azure1/depth_to_rgb/image_raw", Image, buff_size=2048*1536) 32 | point_sub = message_filters.Subscriber("/azure1/points2", PointCloud2, buff_size=2048*1536*3) 33 | self.ts = message_filters.ApproximateTimeSynchronizer([rgb_sub, depth_sub, point_sub], queue_size=1, slop=1) 34 | self.ts.registerCallback(self.inference) 35 | 36 | 37 | 38 | self.result_pub = rospy.Publisher("/classification_result", Image, queue_size=1) 39 | 40 | def inference(self, rgb, depth, pcl_msg): 41 | 42 | # convert ros imgmsg to opencv img 43 | rgb = self.cv_bridge.imgmsg_to_cv2(rgb, desired_encoding='bgr8') 44 | depth = self.cv_bridge.imgmsg_to_cv2(depth, desired_encoding='32FC1') 45 | 46 | 47 | o3dpc = orh.rospc_to_o3dpc(pcl_msg, remove_nans=True) 48 | o3dpc = o3dpc.voxel_down_sample(0.001) 49 | o3dpc_ds = orh.apply_pass_through_filter(o3dpc, [-0.3, 0.3], [-0.3, 0.3], [0, 1.0]) 50 | plane_model, inliers = o3dpc_ds.segment_plane(distance_threshold=0.01, 51 | ransac_n=10, 52 | num_iterations=100) 53 | inlier_cloud = o3dpc_ds.select_down_sample(inliers) 54 | inlier_cloud.paint_uniform_color([1.0, 0, 0]) 55 | outlier_cloud = o3dpc_ds.select_down_sample(inliers, invert=True) 56 | outlier_cloud.paint_uniform_color([0, 1, 0]) 57 | idx = np.random.choice(np.asarray(outlier_cloud.points).shape[0], 10000, replace=False) 58 | outlier_cloud = outlier_cloud.select_down_sample(idx, invert=True) 59 | open3d.visualization.draw_geometries([outlier_cloud]) 60 | rospy.loginfo_once("Visualizing tabletop segmentation") 61 | cloud_npy = np.asarray(outlier_cloud.points) 62 | # cloud_npy = cloud_npy[idx, :] 63 | 64 | self.data["image"] = rgb 65 | self.data["depth"] = depth 66 | self.data["smoothed_object_pc"] = cloud_npy 67 | 68 | # send image to dnn client 69 | rospy.loginfo_once("Sending rgb, depth, pcl to 6 dof graspnet client") 70 | su.sendall_pickle(self.sock, self.data) 71 | grasp = su.recvall_pickle(self.sock) 72 | print(grasp) 73 | 74 | 75 | if __name__ == '__main__': 76 | 77 | grasp_net = GraspNet() 78 | rospy.spin() -------------------------------------------------------------------------------- /src/color_detector.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | ## sudo apt install ros-melodic-ros-numpy 4 | ## pip install open3d==0.9.0, pyrsistent=0.16 5 | ## pip install open3d-ros-helper 6 | 7 | 8 | import rospy 9 | import cv2, cv_bridge 10 | import numpy as np 11 | from sensor_msgs.msg import Image, PointCloud2, CameraInfo 12 | from geometry_msgs.msg import Point 13 | from open3d_ros_helper import open3d_ros_helper as orh 14 | import copy 15 | import tf2_ros 16 | from visualization_msgs.msg import Marker, MarkerArray 17 | from panda_control.srv import get_target_pos 18 | 19 | 20 | class ColorDetector(): 21 | 22 | def __init__(self): 23 | 24 | rospy.init_node("color_detector") 25 | rospy.loginfo("Starting color_detector node") 26 | 27 | 28 | self.cv_bridge = cv_bridge.CvBridge() 29 | self.result_pub = rospy.Publisher("/color_detect", Image, queue_size=1) 30 | # RED 31 | self.lower_bound = np.array([155, 25, 0]) # hsv 32 | self.upper_bound = np.array([179, 255, 255]) # hsv 33 | self.tf_buffer = tf2_ros.Buffer(rospy.Duration(1.0)) 34 | self.listener = tf2_ros.TransformListener(self.tf_buffer) 35 | 36 | # get K and H from camera to robot base 37 | camera_info = rospy.wait_for_message("/azure1/rgb/camera_info", CameraInfo) 38 | self.K = np.array(camera_info.K).reshape(3, 3) 39 | get_XYZ_to_pick_srv = rospy.Service('/get_XYZ_to_pick', get_target_pos, self.get_XYZ_to_pick) 40 | self.XYZ_to_pick_markers_pub = rospy.Publisher('/XYZ_to_Pick', MarkerArray, queue_size=1) 41 | 42 | 43 | def get_transform_cam_to_world(self): 44 | while True: 45 | try: 46 | transform_cam_to_world = self.tf_buffer.lookup_transform("world", "azure1_rgb_camera_link", rospy.Time(), rospy.Duration(5.0)) 47 | except (tf2_ros.LookupException, tf2_ros.ConnectivityException, tf2_ros.ExtrapolationException) as e: 48 | print(e) 49 | rospy.sleep(0.5) 50 | else: 51 | self.H_cam_to_world = orh.msg_to_se3(transform_cam_to_world) 52 | print("Got transform from camera to the robot base") 53 | break 54 | 55 | def get_XYZ_to_pick(self, msg): 56 | 57 | rospy.loginfo("Wating for /azure1/rgb/image_raw") 58 | # get rgb 59 | rgb_msg = rospy.wait_for_message("/azure1/rgb/image_raw", Image) 60 | rgb = self.cv_bridge.imgmsg_to_cv2(rgb_msg, desired_encoding='bgr8') 61 | # get point cloud 62 | pc_msg = rospy.wait_for_message("/azure1/points2", PointCloud2) 63 | cloud_cam = orh.rospc_to_o3dpc(pc_msg, remove_nans=True) 64 | 65 | self.get_transform_cam_to_world() 66 | 67 | 68 | # red region detection in 2D 69 | rgb = cv2.cvtColor(rgb, cv2.COLOR_BGR2HSV) 70 | mask = cv2.inRange(rgb, self.lower_bound, self.upper_bound) 71 | ys, xs = np.where(mask) 72 | xy_to_pick = (int(np.median(xs)), int(np.median(ys))) 73 | rospy.loginfo("xy_to_pick: {}".format(xy_to_pick)) 74 | 75 | # get corresponding 3D pointcloud and get the median position 76 | cloud_center = orh.crop_with_2dmask(copy.deepcopy(cloud_cam), np.array(mask, dtype=bool), self.K) 77 | cloud_center = cloud_center.transform(self.H_cam_to_world) 78 | cloud_center_npy = np.asarray(cloud_center.points) 79 | valid_mask = (np.nan_to_num(cloud_center_npy) != 0).any(axis=1) 80 | cloud_center_npy = cloud_center_npy[valid_mask] 81 | XYZ_to_pick = np.median(cloud_center_npy, axis=0) 82 | 83 | rospy.loginfo("XYZ_to_pick: {}".format(XYZ_to_pick)) 84 | self.publish_markers(XYZ_to_pick) 85 | 86 | result = cv2.bitwise_and(rgb, rgb, mask=mask) 87 | result = cv2.cvtColor(result, cv2.COLOR_HSV2BGR) 88 | result = cv2.circle(result, xy_to_pick, 50, (0, 255, 0), 10) 89 | 90 | # convert opencv img to ros imgmsg 91 | img_msg = self.cv_bridge.cv2_to_imgmsg(result, encoding='bgr8') 92 | 93 | # publish it as topic 94 | self.result_pub.publish(img_msg) 95 | rospy.loginfo_once("Published the result as topic. check /color_detect") 96 | 97 | pos = Point() 98 | pos.x = XYZ_to_pick[0] 99 | pos.y = XYZ_to_pick[1] 100 | pos.z = XYZ_to_pick[2] 101 | 102 | return pos 103 | 104 | def publish_markers(self, XYZ): 105 | 106 | # Delete all existing markers 107 | markers = MarkerArray() 108 | marker = Marker() 109 | marker.action = Marker.DELETEALL 110 | markers.markers.append(marker) 111 | self.XYZ_to_pick_markers_pub.publish(markers) 112 | 113 | # Object markers 114 | markers = MarkerArray() 115 | marker = Marker() 116 | marker.header.frame_id = "world" 117 | marker.header.stamp = rospy.Time() 118 | marker.action = Marker.ADD 119 | marker.pose.position.x = XYZ[0] 120 | marker.pose.position.y = XYZ[1] 121 | marker.pose.position.z = XYZ[2] 122 | marker.pose.orientation.x = 0.0 123 | marker.pose.orientation.y = 0.0 124 | marker.pose.orientation.z = 0.0 125 | marker.pose.orientation.w = 1.0 126 | marker.color.r = 1 127 | marker.color.g = 0 128 | marker.color.b = 0 129 | marker.color.a = 0.5 130 | marker.ns = "XYZ_to_pick" 131 | marker.id = 0 132 | marker.type = Marker.SPHERE 133 | marker.scale.x = 0.1 134 | marker.scale.y = 0.1 135 | marker.scale.z = 0.1 136 | markers.markers.append(marker) 137 | self.XYZ_to_pick_markers_pub.publish(markers) 138 | 139 | 140 | if __name__ == '__main__': 141 | 142 | color_detector = ColorDetector() 143 | rospy.spin() -------------------------------------------------------------------------------- /src/contact_grasp_server.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | from math import degrees 4 | import rospy 5 | import ros_numpy 6 | import cv2, cv_bridge 7 | import numpy as np 8 | import message_filters 9 | import pcl 10 | 11 | import tf2_ros 12 | from sensor_msgs.msg import Image, CameraInfo, PointCloud2 13 | from easy_tcp_python2_3 import socket_utils as su 14 | from open3d_ros_helper import open3d_ros_helper as orh 15 | from visualization_msgs.msg import MarkerArray, Marker 16 | from geometry_msgs.msg import Point 17 | from deep_grasping_ros.msg import Grasp 18 | from deep_grasping_ros.srv import GetTargetContactGraspSegm, GetTargetContactGraspSegmResponse 19 | from scipy.spatial.transform import Rotation as R 20 | import matplotlib.pyplot as plt 21 | from matplotlib import cm 22 | 23 | 24 | class ContactGraspNet(): 25 | 26 | def __init__(self): 27 | 28 | rospy.init_node("contact_graspnet") 29 | rospy.loginfo("Starting contact_graspnet node") 30 | 31 | # initialize dnn server 32 | self.grasp_sock, _ = su.initialize_server('localhost', 7777) 33 | self.segm_sock, _ = su.initialize_server('localhost', 6666) 34 | rospy.loginfo("Successfully got camera info") 35 | self.camera_info = rospy.wait_for_message("/azure_kinect_12/rgb/camera_info", CameraInfo) 36 | self.data = {} 37 | self.data["intrinsics_matrix"] = np.array(self.camera_info.K).reshape(3, 3) 38 | 39 | self.bridge = cv_bridge.CvBridge() 40 | self.grasp_srv = rospy.Service('/get_target_grasp_pose', GetTargetContactGraspSegm, self.get_target_grasp_pose) 41 | 42 | 43 | # tf publisher 44 | self.br = tf2_ros.TransformBroadcaster() 45 | self.tf_buffer = tf2_ros.Buffer(rospy.Duration(1.0)) 46 | self.listener = tf2_ros.TransformListener(self.tf_buffer) 47 | 48 | # marker 49 | self.marker_pub = rospy.Publisher("target_grasp", MarkerArray, queue_size = 1) 50 | self.marker_id = 0 51 | self.cmap = plt.get_cmap("YlGn") 52 | control_points = np.load("/home/ailab/catkin_ws/src/deep-grasping/src/contact_graspnet/gripper_control_points/panda.npy")[:, :3] 53 | control_points = [[0, 0, 0], control_points[0, :], control_points[1, :], control_points[-2, :], control_points[-1, :]] 54 | control_points = np.asarray(control_points, dtype=np.float32) 55 | control_points[1:3, 2] = 0.0584 56 | control_points = np.tile(np.expand_dims(control_points, 0), [1, 1, 1]).squeeze() 57 | mid_point = 0.5*(control_points[1, :] + control_points[2, :]) 58 | self.grasp_line_plot = np.array([np.zeros((3,)), mid_point, control_points[1], control_points[3], 59 | control_points[1], control_points[2], control_points[4]]) 60 | 61 | self.uoais_vm_pub = rospy.Publisher("uoais/visible_mask", Image, queue_size=1) 62 | self.uoais_am_pub = rospy.Publisher("uoais/amodal_mask", Image, queue_size=1) 63 | 64 | self.img_size = (1280, 720) 65 | 66 | 67 | def get_target_grasp_pose(self, msg): 68 | 69 | # while True: 70 | # try: 71 | # # H_base_to_cam = self.tf_buffer.lookup_transform("panda_link0", "azure1_rgb_camera_link", rospy.Time(), rospy.Duration(5.0)) 72 | # # H_base_to_hand = self.tf_buffer.lookup_transform("panda_link0", "panda_hand", rospy.Time(), rospy.Duration(5.0)) 73 | # # H_cam_to_hand = self.tf_buffer.lookup_transform("azure1_rgb_camera_link", "panda_hand", rospy.Time(), rospy.Duration(5.0)) 74 | # H_base_to_cam = self.tf_buffer.lookup_transform("panda_link0", "azure1_rgb_camera_link", rospy.Time(), rospy.Duration(5.0)) 75 | # H_base_to_hand = self.tf_buffer.lookup_transform("panda_link0", "panda_hand", rospy.Time(), rospy.Duration(5.0)) 76 | # H_cam_to_hand = self.tf_buffer.lookup_transform("azure1_rgb_camera_link", "panda_hand", rospy.Time(), rospy.Duration(5.0)) 77 | # except (tf2_ros.LookupException, tf2_ros.ConnectivityException, tf2_ros.ExtrapolationException) as e: 78 | # print(e) 79 | # rospy.sleep(0.5) 80 | # else: 81 | # H_base_to_cam = orh.msg_to_se3(H_base_to_cam) 82 | # H_base_to_hand = orh.msg_to_se3(H_base_to_hand) 83 | # H_cam_to_hand = orh.msg_to_se3(H_cam_to_hand) 84 | # break 85 | 86 | 87 | self.initialize_marker() 88 | self.marker_id = 0 89 | 90 | rgb = rospy.wait_for_message("/azure_kinect_12/rgb/image_raw", Image) 91 | rgb = self.bridge.imgmsg_to_cv2(rgb, desired_encoding='bgr8') 92 | print(rgb.shape) 93 | # rgb = cv2.resize(rgb, self.img_size) 94 | # rgb = rgb[240:480, 215:640, :] 95 | rgb = cv2.resize(rgb, self.img_size)[:,:,::-1] 96 | self.data["rgb"] = rgb 97 | 98 | depth = rospy.wait_for_message("/azure_kinect_12/depth_to_rgb/image_raw", Image) 99 | depth = self.bridge.imgmsg_to_cv2(depth, desired_encoding='32FC1') 100 | # depth = cv2.resize(depth, self.img_size) 101 | # depth = depth[240:480, 215:640] 102 | depth = cv2.resize(depth, self.img_size) 103 | depth = np.float32(depth) / 1000 104 | print(np.unique(depth)) 105 | self.data["depth"] = depth 106 | 107 | su.sendall_pickle(self.segm_sock, self.data) 108 | segm = su.recvall_pickle(self.segm_sock) 109 | self.data["segm"] = segm['segm'] 110 | 111 | # send start signal to dnn client 112 | su.sendall_pickle(self.grasp_sock, self.data) 113 | 114 | pred_grasps_cam, scores, contact_pts, segm_result = su.recvall_pickle(self.grasp_sock) 115 | segmap, vis, occlusions = \ 116 | self.bridge.cv2_to_imgmsg(segm_result["segm"]), segm_result["vis"], segm_result["occlusions"].tolist() 117 | self.uoais_am_pub.publish(self.bridge.cv2_to_imgmsg(vis)) 118 | 119 | rospy.loginfo("sdfsdfsdfsfsdfsdfsd") 120 | 121 | if pred_grasps_cam is None: 122 | rospy.logwarn_once("No grasps are detected") 123 | return None 124 | rospy.loginfo("Grasp detected") 125 | 126 | all_pts = [] 127 | grasps = [] 128 | for k in pred_grasps_cam.keys(): 129 | if len(scores[k]) == 0: 130 | rospy.logwarn_once("No grasps are detected") 131 | continue 132 | for i, pred_grasp_cam in enumerate(pred_grasps_cam[k]): 133 | H_cam_to_target = pred_grasp_cam 134 | 135 | ## visualize gripper point 136 | # calculate p_cam_to_gripper 137 | p_hand_to_gripper = self.grasp_line_plot 138 | p_hand_to_gripper[2:,0] = np.sign(p_hand_to_gripper[2:,0]) * 0.08/2 139 | p_gripper_to_cam = np.matmul(p_hand_to_gripper, H_cam_to_target[:3, :3].T) 140 | p_gripper_to_cam += np.expand_dims(H_cam_to_target[:3, 3], 0) 141 | H_gripper_to_cam = np.concatenate((p_gripper_to_cam, np.ones([7, 1])), axis=1) 142 | # p_base_to_gripper 143 | p_base_to_gripper = np.matmul(H_base_to_cam, H_gripper_to_cam.T)[:3, :] 144 | all_pts.append(p_base_to_gripper) # [3, 15] 145 | self.publish_marker(p_base_to_gripper, "panda_link0", scores[k][i]) 146 | 147 | H_base_to_target = np.matmul(H_base_to_cam, H_cam_to_target) 148 | H_base_to_target[:3, :3] = np.matmul(H_base_to_target[:3, :3], H_cam_to_hand[:3, :3]) 149 | t_target_grasp = orh.se3_to_transform_stamped(H_base_to_target, "panda_link0", "target_grasp_pose") 150 | 151 | grasp = Grasp() 152 | grasp.id = "obj_{}_grasp_{}".format(int(k), i) 153 | grasp.score = scores[k][i] 154 | grasp.transform = t_target_grasp 155 | grasps.append(grasp) 156 | 157 | return GetTargetContactGraspSegmResponse(grasps, segmap, occlusions) 158 | 159 | def initialize_marker(self): 160 | # Delete all existing markers 161 | marker_array = MarkerArray() 162 | marker = Marker() 163 | marker.action = Marker.DELETEALL 164 | marker_array.markers.append(marker) 165 | self.marker_pub.publish(marker_array) 166 | 167 | def publish_marker(self, pts, frame_id, score): 168 | 169 | 170 | markers = [] 171 | for i in range(pts.shape[1]): 172 | marker = Marker() 173 | marker.header.frame_id = frame_id 174 | marker.header.stamp = rospy.Time() 175 | marker.type = marker.SPHERE 176 | marker.action = marker.ADD 177 | marker.ns = str(self.marker_id) 178 | marker.id = self.marker_id 179 | self.marker_id += 1 180 | marker.pose.position.x = pts[0][i] 181 | marker.pose.position.y = pts[1][i] 182 | marker.pose.position.z = pts[2][i] 183 | marker.pose.orientation.x = 0.0 184 | marker.pose.orientation.y = 0.0 185 | marker.pose.orientation.z = 0.0 186 | marker.pose.orientation.w = 1.0 187 | marker.color.r = self.cmap(score)[0] 188 | marker.color.g = self.cmap(score)[1] 189 | marker.color.b = self.cmap(score)[2] 190 | marker.color.a = self.cmap(score)[3] 191 | 192 | marker.type = Marker.SPHERE 193 | marker.scale.x = 0.01 194 | marker.scale.y = 0.01 195 | marker.scale.z = 0.01 196 | markers.append(marker) 197 | 198 | point_pairs = [[0, 1], [1, 2], [2, 4], [2, 5], [3, 4], [5, 6]] 199 | for p1, p2 in point_pairs: 200 | marker = Marker() 201 | marker.header.frame_id = frame_id 202 | marker.header.stamp = rospy.Time() 203 | marker.type = marker.LINE_STRIP 204 | marker.action = marker.ADD 205 | marker.ns = str(self.marker_id) 206 | marker.id = self.marker_id 207 | marker.scale.x = 0.02 208 | marker.scale.y = 0.02 209 | marker.scale.z = 0.02 210 | self.marker_id += 1 211 | marker.pose.position.x = 0.0 212 | marker.pose.position.y = 0.0 213 | marker.pose.position.z = 0.0 214 | marker.pose.orientation.x = 0.0 215 | marker.pose.orientation.y = 0.0 216 | marker.pose.orientation.z = 0.0 217 | marker.pose.orientation.w = 1.0 218 | marker.color.r = self.cmap(score)[0] 219 | marker.color.g = self.cmap(score)[1] 220 | marker.color.b = self.cmap(score)[2] 221 | marker.color.a = self.cmap(score)[3] 222 | marker.points = [] 223 | line_point_1 = Point() 224 | line_point_1.x = pts[0][p1] 225 | line_point_1.y = pts[1][p1] 226 | line_point_1.z = pts[2][p1] 227 | marker.points.append(line_point_1) 228 | line_point_2 = Point() 229 | line_point_2.x = pts[0][p2] 230 | line_point_2.y = pts[1][p2] 231 | line_point_2.z = pts[2][p2] 232 | marker.points.append(line_point_2) 233 | markers.append(marker) 234 | 235 | marker_array = MarkerArray() 236 | marker_array.markers = markers 237 | self.marker_pub.publish(marker_array) 238 | 239 | 240 | if __name__ == '__main__': 241 | 242 | grasp_net = ContactGraspNet() 243 | rospy.spin() -------------------------------------------------------------------------------- /src/gqcnn_server.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | from math import degrees 4 | import rospy 5 | import ros_numpy 6 | import cv2, cv_bridge 7 | import numpy as np 8 | import message_filters 9 | 10 | import tf2_ros 11 | from sensor_msgs.msg import Image, CameraInfo, PointCloud2 12 | from easy_tcp_python2_3 import socket_utils as su 13 | from open3d_ros_helper import open3d_ros_helper as orh 14 | from visualization_msgs.msg import MarkerArray, Marker 15 | from geometry_msgs.msg import Point 16 | from deep_grasping_ros.msg import Grasp 17 | from deep_grasping_ros.srv import GetTargetContactGrasp, GetTargetContactGraspResponse 18 | from scipy.spatial.transform import Rotation as R 19 | import matplotlib.pyplot as plt 20 | from matplotlib import cm 21 | 22 | 23 | class GQCNN(): 24 | 25 | def __init__(self): 26 | 27 | rospy.init_node("fc_gqcnn") 28 | rospy.loginfo("Starting fc_gqcnn node") 29 | 30 | # initialize dnn server 31 | self.grasp_sock, _ = su.initialize_server('localhost', 5555) 32 | rospy.loginfo("Wating for camera info") 33 | self.camera_info = rospy.wait_for_message("/azure1/rgb/camera_info", CameraInfo) 34 | self.data = {} 35 | self.data["intrinsics_matrix"] = np.array(self.camera_info.K).reshape(3, 3) 36 | 37 | self.bridge = cv_bridge.CvBridge() 38 | self.grasp_srv = rospy.Service('/get_target_grasp_pose', GetTargetContactGrasp, self.get_target_grasp_pose) 39 | 40 | # tf publisher 41 | self.br = tf2_ros.TransformBroadcaster() 42 | self.tf_buffer = tf2_ros.Buffer(rospy.Duration(1.0)) 43 | self.listener = tf2_ros.TransformListener(self.tf_buffer) 44 | 45 | # marker 46 | self.marker_pub = rospy.Publisher("target_grasp", MarkerArray, queue_size = 1) 47 | self.marker_id = 0 48 | self.cmap = plt.get_cmap("YlGn") 49 | control_points = np.load("/home/demo/catkin_ws/src/deep_grasping_ros/src/contact_graspnet/gripper_control_points/panda.npy")[:, :3] 50 | control_points = [[0, 0, 0], control_points[0, :], control_points[1, :], control_points[-2, :], control_points[-1, :]] 51 | control_points = np.asarray(control_points, dtype=np.float32) 52 | control_points[1:3, 2] = 0.0584 53 | control_points = np.tile(np.expand_dims(control_points, 0), [1, 1, 1]).squeeze() 54 | mid_point = 0.5*(control_points[1, :] + control_points[2, :]) 55 | self.grasp_line_plot = np.array([np.zeros((3,)), mid_point, control_points[1], control_points[3], 56 | control_points[1], control_points[2], control_points[4]]) 57 | 58 | 59 | self.vis_img_pub = rospy.Publisher("grasp_vis", Image, queue_size=1) 60 | # params 61 | self.img_size = (512, 384) # FC-GQ-CNN-PJ 62 | 63 | 64 | def get_target_grasp_pose(self, msg): 65 | 66 | while True: 67 | try: 68 | H_base_to_cam = self.tf_buffer.lookup_transform("panda_link0", "azure1_rgb_camera_link", rospy.Time(), rospy.Duration(5.0)) 69 | H_base_to_hand = self.tf_buffer.lookup_transform("panda_link0", "panda_hand", rospy.Time(), rospy.Duration(5.0)) 70 | H_cam_to_hand = self.tf_buffer.lookup_transform("azure1_rgb_camera_link", "panda_hand", rospy.Time(), rospy.Duration(5.0)) 71 | except (tf2_ros.LookupException, tf2_ros.ConnectivityException, tf2_ros.ExtrapolationException) as e: 72 | print(e) 73 | rospy.sleep(0.5) 74 | else: 75 | H_base_to_cam = orh.msg_to_se3(H_base_to_cam) 76 | H_base_to_hand = orh.msg_to_se3(H_base_to_hand) 77 | H_cam_to_hand = orh.msg_to_se3(H_cam_to_hand) 78 | break 79 | 80 | rgb = rospy.wait_for_message("/azure1/rgb/image_raw", Image) 81 | rgb = self.bridge.imgmsg_to_cv2(rgb, desired_encoding='bgr8') 82 | rgb = cv2.resize(rgb, self.img_size) 83 | self.data["rgb"] = rgb 84 | 85 | depth = rospy.wait_for_message("/azure1/depth_to_rgb/image_raw", Image) 86 | depth = self.bridge.imgmsg_to_cv2(depth, desired_encoding='32FC1') 87 | depth = cv2.resize(depth, self.img_size) 88 | self.data["depth"] = depth 89 | 90 | # !TODO: merge with cable & tool segmentation 91 | self.data["segm_mask"] = None 92 | self.initialize_marker() 93 | self.marker_id = 0 94 | 95 | 96 | # send image to dnn client 97 | rospy.loginfo_once("Sending rgb, depth to GQ-CNN client") 98 | su.sendall_pickle(self.grasp_sock, self.data) 99 | pred_grasp = su.recvall_pickle(self.grasp_sock) 100 | 101 | if pred_grasp is None: 102 | rospy.logwarn_once("No grasps are detected") 103 | return None 104 | 105 | H_cam_to_target = np.eye(4) 106 | pos = pred_grasp["pose"].position 107 | cx = int(pred_grasp["x"]) 108 | cy = int(pred_grasp["y"]) 109 | z = depth[cy, cx] - 0.1034 110 | # z = pred_grasp["depth"] - 0.1034 111 | if z == 0: 112 | print("oh my god!!!!!!!!11") 113 | z = np.median(depth[cy-5:cy+5, cx-5:cx+5]) 114 | r = R.from_rotvec(pred_grasp["angle"] * np.array([0, 0, 1])) 115 | H_cam_to_target[:3, :3] = r.as_dcm() 116 | H_cam_to_target[:3, 3] = [pos.x, pos.y, z] 117 | 118 | self.vis_img_pub.publish(self.bridge.cv2_to_imgmsg(pred_grasp["vis_img"], encoding="bgr8")) 119 | 120 | 121 | grasps = [] 122 | ## visualize gripper point 123 | # calculate p_cam_to_gripper 124 | p_hand_to_gripper = self.grasp_line_plot 125 | p_hand_to_gripper[2:,0] = np.sign(p_hand_to_gripper[2:,0]) * 0.08/2 126 | p_gripper_to_cam = np.matmul(p_hand_to_gripper, H_cam_to_target[:3, :3].T) 127 | p_gripper_to_cam += np.expand_dims(H_cam_to_target[:3, 3], 0) 128 | H_gripper_to_cam = np.concatenate((p_gripper_to_cam, np.ones([7, 1])), axis=1) 129 | # p_base_to_gripper 130 | p_base_to_gripper = np.matmul(H_base_to_cam, H_gripper_to_cam.T)[:3, :] 131 | self.publish_marker(p_base_to_gripper, "panda_link0", pred_grasp["q_value"]) 132 | 133 | H_base_to_target = np.matmul(H_base_to_cam, H_cam_to_target) 134 | H_base_to_target[:3, :3] = np.matmul(H_base_to_target[:3, :3], H_cam_to_hand[:3, :3]) 135 | t_target_grasp = orh.se3_to_transform_stamped(H_base_to_target, "panda_link0", "target_grasp_pose") 136 | 137 | grasp = Grasp() 138 | grasp.id = "obj" 139 | grasp.score = pred_grasp["q_value"] 140 | grasp.transform = t_target_grasp 141 | grasp.width = pred_grasp["width"] 142 | grasps.append(grasp) 143 | 144 | return GetTargetContactGraspResponse(grasps) 145 | 146 | def initialize_marker(self): 147 | # Delete all existing markers 148 | marker_array = MarkerArray() 149 | marker = Marker() 150 | marker.action = Marker.DELETEALL 151 | marker_array.markers.append(marker) 152 | self.marker_pub.publish(marker_array) 153 | 154 | def publish_marker(self, pts, frame_id, score): 155 | 156 | markers = [] 157 | for i in range(pts.shape[1]): 158 | marker = Marker() 159 | marker.header.frame_id = frame_id 160 | marker.header.stamp = rospy.Time() 161 | marker.type = marker.SPHERE 162 | marker.action = marker.ADD 163 | marker.ns = str(self.marker_id) 164 | marker.id = self.marker_id 165 | self.marker_id += 1 166 | marker.pose.position.x = pts[0][i] 167 | marker.pose.position.y = pts[1][i] 168 | marker.pose.position.z = pts[2][i] 169 | marker.pose.orientation.x = 0.0 170 | marker.pose.orientation.y = 0.0 171 | marker.pose.orientation.z = 0.0 172 | marker.pose.orientation.w = 1.0 173 | marker.color.r = self.cmap(score)[0] 174 | marker.color.g = self.cmap(score)[1] 175 | marker.color.b = self.cmap(score)[2] 176 | marker.color.a = self.cmap(score)[3] 177 | 178 | marker.type = Marker.SPHERE 179 | marker.scale.x = 0.01 180 | marker.scale.y = 0.01 181 | marker.scale.z = 0.01 182 | markers.append(marker) 183 | 184 | point_pairs = [[0, 1], [1, 2], [2, 4], [2, 5], [3, 4], [5, 6]] 185 | for p1, p2 in point_pairs: 186 | marker = Marker() 187 | marker.header.frame_id = frame_id 188 | marker.header.stamp = rospy.Time() 189 | marker.type = marker.LINE_STRIP 190 | marker.action = marker.ADD 191 | marker.ns = str(self.marker_id) 192 | marker.id = self.marker_id 193 | marker.scale.x = 0.02 194 | marker.scale.y = 0.02 195 | marker.scale.z = 0.02 196 | self.marker_id += 1 197 | marker.pose.position.x = 0.0 198 | marker.pose.position.y = 0.0 199 | marker.pose.position.z = 0.0 200 | marker.pose.orientation.x = 0.0 201 | marker.pose.orientation.y = 0.0 202 | marker.pose.orientation.z = 0.0 203 | marker.pose.orientation.w = 1.0 204 | marker.color.r = self.cmap(score)[0] 205 | marker.color.g = self.cmap(score)[1] 206 | marker.color.b = self.cmap(score)[2] 207 | marker.color.a = self.cmap(score)[3] 208 | marker.points = [] 209 | line_point_1 = Point() 210 | line_point_1.x = pts[0][p1] 211 | line_point_1.y = pts[1][p1] 212 | line_point_1.z = pts[2][p1] 213 | marker.points.append(line_point_1) 214 | line_point_2 = Point() 215 | line_point_2.x = pts[0][p2] 216 | line_point_2.y = pts[1][p2] 217 | line_point_2.z = pts[2][p2] 218 | marker.points.append(line_point_2) 219 | markers.append(marker) 220 | 221 | marker_array = MarkerArray() 222 | marker_array.markers = markers 223 | self.marker_pub.publish(marker_array) 224 | 225 | if __name__ == '__main__': 226 | 227 | gqcnn = GQCNN() 228 | rospy.spin() -------------------------------------------------------------------------------- /src/test.py: -------------------------------------------------------------------------------- 1 | import imgviz 2 | import numpy as np 3 | import cv2 4 | import matplotlib.pyplot as plt 5 | 6 | color = np.load("/home/demo/catkin_ws/src/deep_grasping_ros/color.npy") 7 | segmap = np.load("/home/demo/catkin_ws/src/deep_grasping_ros/segmap.npy") 8 | 9 | masks = [] 10 | for id in np.unique(segmap): 11 | if id == 0.0: 12 | continue 13 | mask = np.zeros_like(segmap) 14 | mask = np.where(segmap==id, True, False) 15 | masks.append(mask) 16 | masks = np.array(masks) 17 | 18 | insviz = imgviz.instances2rgb( 19 | image=color, 20 | masks=masks, 21 | labels=np.uint8(np.unique(segmap))[1:] 22 | ) 23 | plt.figure(dpi=200) 24 | plt.plot() 25 | plt.imshow(insviz) 26 | img = imgviz.io.pyplot_to_numpy() 27 | plt.close() 28 | print(img.shape, np.max(img)) 29 | # mg = imgviz.io.pyplot_to_numpy() 30 | 31 | # plt.imshow(insviz) -------------------------------------------------------------------------------- /srv/GetTargetContactGrasp.srv: -------------------------------------------------------------------------------- 1 | --- 2 | deep_grasping_ros/Grasp[] target_grasps 3 | 4 | -------------------------------------------------------------------------------- /srv/GetTargetContactGraspSegm.srv: -------------------------------------------------------------------------------- 1 | --- 2 | deep_grasping_ros/Grasp[] target_grasps 3 | sensor_msgs/Image segmap 4 | int32[] occlusions 5 | 6 | -------------------------------------------------------------------------------- /srv/GetTargetPos.srv: -------------------------------------------------------------------------------- 1 | --- 2 | geometry_msgs/Point position --------------------------------------------------------------------------------