├── .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
--------------------------------------------------------------------------------