diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f6fca57 --- /dev/null +++ b/.gitignore @@ -0,0 +1,37 @@ +# Don't track the content of these folders # +############################################ +src/*/lib/ +src/*/build +src/*/devel +src/*/install + +# Don't track catkin build files # +################################## +core + +# vscode and other system specific files # +########################################## +.* + +# Include gitignore # +##################### +!.gitignore + +# Compiled source # +################### +*.o +*.so + +# Packages # +############ +*.tar +*.gz +*.zip + +# Other # +######### +*.backup +*.old +*.custom +*.run +*.debug diff --git a/src/docker-compose.yml b/docker_env/docker-compose.yml similarity index 72% rename from src/docker-compose.yml rename to docker_env/docker-compose.yml index 6fcfa2f..dfee363 100644 --- a/src/docker-compose.yml +++ b/docker_env/docker-compose.yml @@ -3,6 +3,10 @@ # docker-compose.yml format version version: '3' +networks: + ros: + driver: bridge + # Define services services: # ROS Development Service @@ -55,10 +59,30 @@ services: build: ./gazebo # Mount gazebo folder on host to app folder in container volumes: - - ./gazebo/.gazebo:/root/.gazebo + #- .docker_env/gazebo/.gazebo:/root/.gazebo + - ../src/rrrobot_ws:/app/rrrobot_ws + # Set DISPLAY variable and network mode for GUIs + environment: + - DISPLAY=${IP_ADDRESS}:0.0 + # network_mode: "host" + # Set working directory in container to app folder + #working_dir: /home/rrrobot + hostname: "rrrobot-env" + networks: + - ros + + # GEAR Production Service + gear: + # Use Dockerfile in gear folder + build: ./gear + # Mount gear folder on host to app folder in container + volumes: + - ../src/rrrobot_ws:/app/rrrobot_ws # Set DISPLAY variable and network mode for GUIs environment: - DISPLAY=${IP_ADDRESS}:0.0 - network_mode: "host" # Set working directory in container to app folder working_dir: /app + hostname: "rrrobot-env" + networks: + - ros diff --git a/docker_env/gazebo/Dockerfile b/docker_env/gazebo/Dockerfile new file mode 100644 index 0000000..f6fecd2 --- /dev/null +++ b/docker_env/gazebo/Dockerfile @@ -0,0 +1,40 @@ +# Gazebo Dockerfile + +# Use official image for Gazebo 9.x +FROM gazebo:gzserver9 + +RUN apt-get update +# Install packages required for developing with gazebo +RUN apt-get install -y libgazebo9-dev +RUN sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' +RUN apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 +RUN apt-get install -y curl +RUN curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654' | apt-key add - +RUN apt-get update +# Install packages required for developing with ROS +RUN apt-get install -y ros-melodic-desktop-full +RUN echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc +RUN apt install -y python-rosdep +RUN rosdep init +RUN rosdep update +RUN apt-get install -y ros-melodic-pid +# user id 1000 should be the same as the host user, so that you can access files +# from inside the docker container and also on the host +RUN useradd -u 1000 rrrobot +# set to no password +RUN passwd --delete rrrobot +# add to sudo users +RUN usermod -aG sudo rrrobot +# set the entry point +WORKDIR /home/rrrobot +RUN chown -R rrrobot:rrrobot /home/rrrobot + +# Initialize the environment in .bashrc +RUN echo "source /opt/ros/melodic/setup.bash" >> /home/rrrobot/.bashrc +RUN echo "source /usr/share/gazebo/setup.sh" >> /home/rrrobot/.bashrc +RUN echo "export GAZEBO_MODEL_PATH=/home/rrrobot/rrrobot_src/src/gazebo_models:\$GAZEBO_MODEL_PATH" >> /home/rrrobot/.bashrc +RUN echo "export GAZEBO_PLUGIN_PATH=/home/rrrobot/rrrobot_src/lib:\$GAZEBO_PLUGIN_PATH" >> /home/rrrobot/.bashrc + +USER rrrobot + +CMD ["/bin/bash"] diff --git a/docker_env/gazebo/build.sh b/docker_env/gazebo/build.sh new file mode 100755 index 0000000..3501289 --- /dev/null +++ b/docker_env/gazebo/build.sh @@ -0,0 +1 @@ +docker image build . -t eecs467:rrrobot diff --git a/docker_env/gazebo/run_rrrobot_image.sh b/docker_env/gazebo/run_rrrobot_image.sh new file mode 120000 index 0000000..a96893e --- /dev/null +++ b/docker_env/gazebo/run_rrrobot_image.sh @@ -0,0 +1 @@ +../../run_rrrobot_image.sh \ No newline at end of file diff --git a/docker_env/gear/Dockerfile b/docker_env/gear/Dockerfile new file mode 100644 index 0000000..bd90f3b --- /dev/null +++ b/docker_env/gear/Dockerfile @@ -0,0 +1,67 @@ +# GEAR Dockerfile + +# Use official image for Gazebo 9.x +FROM gazebo:gzserver9 + +RUN apt-get update +# Install packages required for developing with gazebo +RUN apt-get install -y libgazebo9-dev +RUN sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' +RUN apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 +RUN apt-get install -y curl +RUN curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654' | apt-key add - +RUN apt-get update +# Install packages required for developing with ROS +RUN apt-get install -y ros-melodic-desktop-full +RUN echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc +RUN apt install -y python-rosdep +RUN rosdep init +RUN rosdep update +# user id 1000 should be the same as the host user, so that you can access files +# from inside the docker container and also on the host +RUN useradd -u 1000 rrrobot +# set to no password +RUN passwd --delete rrrobot +# add to sudo users +RUN usermod -aG sudo rrrobot +# set the entry point +WORKDIR /app/rrrobot_ws +RUN mkdir /home/rrrobot +RUN chown -R rrrobot:rrrobot /home/rrrobot + +# Initialize the environment in .bashrc +RUN echo "source /opt/ros/melodic/setup.bash" >> /home/rrrobot/.bashrc +RUN echo "source /usr/share/gazebo/setup.sh" >> /home/rrrobot/.bashrc +RUN echo "export GAZEBO_MODEL_PATH=/app/rrrobot_ws/src/gazebo_models:\$GAZEBO_MODEL_PATH" >> /home/rrrobot/.bashrc +RUN echo "export GAZEBO_PLUGIN_PATH=/opt/ros/melodic/lib:/app/rrrobot_ws/devel/lib:\$GAZEBO_PLUGIN_PATH" >> /home/rrrobot/.bashrc + +USER rrrobot + +# Install Gazebo Environment for Agile Robotics (GEAR) +RUN sudo apt-get update && \ + sudo apt-get install -y \ + wget + +RUN sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable bionic main" > /etc/apt/sources.list.d/gazebo-stable.list' && \ + wget http://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add - && \ + sudo apt-get update && \ + sudo apt-get install -y \ + ariac3 + +# CV Model Dependencies +RUN sudo apt-get update && \ + sudo apt-get install -y \ + python3-pip + +RUN pip3 install -U \ + numpy \ + torch \ + torchvision \ + Pillow + +RUN pip3 install pyyaml +RUN pip3 install rospkg +RUN pip3 install matplotlib +RUN sudo apt-get install python3-tk + +CMD ["/bin/bash"] diff --git a/src/ros-dev/Dockerfile b/docker_env/ros-dev/Dockerfile similarity index 100% rename from src/ros-dev/Dockerfile rename to docker_env/ros-dev/Dockerfile diff --git a/docker_env/ros-dev/build.sh b/docker_env/ros-dev/build.sh new file mode 100755 index 0000000..cfbcc1d --- /dev/null +++ b/docker_env/ros-dev/build.sh @@ -0,0 +1 @@ +docker image build . --rm -t eecs467:rrrobot diff --git a/docker_env/ros-dev/run_rrrobot_image.sh b/docker_env/ros-dev/run_rrrobot_image.sh new file mode 100755 index 0000000..1ca90ae --- /dev/null +++ b/docker_env/ros-dev/run_rrrobot_image.sh @@ -0,0 +1 @@ +../run_rrrobot_image.sh diff --git a/src/ros-turtlesim/Dockerfile b/docker_env/ros-turtlesim/Dockerfile similarity index 100% rename from src/ros-turtlesim/Dockerfile rename to docker_env/ros-turtlesim/Dockerfile diff --git a/docker_env/ros-turtlesim/build.sh b/docker_env/ros-turtlesim/build.sh new file mode 100755 index 0000000..cfbcc1d --- /dev/null +++ b/docker_env/ros-turtlesim/build.sh @@ -0,0 +1 @@ +docker image build . --rm -t eecs467:rrrobot diff --git a/docker_env/ros-turtlesim/run_rrrobot_image.sh b/docker_env/ros-turtlesim/run_rrrobot_image.sh new file mode 100755 index 0000000..6ddfaa5 --- /dev/null +++ b/docker_env/ros-turtlesim/run_rrrobot_image.sh @@ -0,0 +1,5 @@ +#docker run -i -h rrrobot-env -t eecs467:rrrobot bash + +xhost +local:docker #rrrobot-env +docker run -it --rm --privileged --device=/dev/dri:/dev/dri -e DISPLAY=$DISPLAY -v $PWD:/app -v /tmp/.X11-unix:/tmp/.X11-unix -h rrrobot-env eecs467:rrrobot +xhost -local:docker #rrrobot-env diff --git a/src/ros-turtlesim/turtlesim.sh b/docker_env/ros-turtlesim/turtlesim.sh old mode 100644 new mode 100755 similarity index 100% rename from src/ros-turtlesim/turtlesim.sh rename to docker_env/ros-turtlesim/turtlesim.sh diff --git a/src/ros/Dockerfile b/docker_env/ros/Dockerfile similarity index 100% rename from src/ros/Dockerfile rename to docker_env/ros/Dockerfile diff --git a/docker_env/ros/build.sh b/docker_env/ros/build.sh new file mode 100755 index 0000000..cfbcc1d --- /dev/null +++ b/docker_env/ros/build.sh @@ -0,0 +1 @@ +docker image build . --rm -t eecs467:rrrobot diff --git a/docker_env/ros/run_rrrobot_image.sh b/docker_env/ros/run_rrrobot_image.sh new file mode 100755 index 0000000..2f1a611 --- /dev/null +++ b/docker_env/ros/run_rrrobot_image.sh @@ -0,0 +1,5 @@ +#docker run -i -h rrrobot-env -t eecs467:rrrobot bash + +#docker run -it --rm --security-opt seccomp=unconfined -v $SSH_AUTH_SOCK:/ssh-agent --env SSH_AUTH_SOCK=/ssh-agent --device=/dev/dri:/dev/dri -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --env QT_X11_NO_MITSHM=1 -h rrrobot-env eecs467:rrrobot + +../run_rrrobot_image.sh diff --git a/docs/documentation.md b/docs/documentation.md new file mode 100644 index 0000000..e93b3f9 --- /dev/null +++ b/docs/documentation.md @@ -0,0 +1,78 @@ +# Documentation + +## Page Links +- [Home](home.md) +- [Documentation](documentation.md) +- [GEAR](gear.md) + +## Table of Contents +- [Directory Structure](#directory-structure) + - [docker_env](#dockerenv) + - [docs](#docs) + - [src](#src) + - [src/rrrobot_ws/src/gazebo_models](#srcrrrobotwssrcgazebomodels) + - [src/rrrobot_ws/src/rrrobot](#srcrrrobotwssrcrrrobot) + - [src/rrrobot_ws/world](#srcrrrobotwsworld) + - [utils](#utils) + +## Directory Structure + +In the RRRobot folder of our repository we have the following folders. + +### docker_env + +This contains the [docker-compose.yml](https://github.com/EECS-467-W20-RRRobot-Project/RRRobot/blob/master/docker_env/docker-compose.yml) file and folders for each docker service described in the [home](home.md) page. **gear** is the docker image used for our final simulation. + +### docs + +This contains the markdown files used to generate the project website pages and project documents like the poster and proposal. + +### src + +This contains the rrrobot_ws catkin workspace for our ROS development. Inside the `rrrobot_ws` folder is a [run_all.sh](https://github.com/EECS-467-W20-RRRobot-Project/RRRobot/blob/master/src/rrrobot_ws/run_all.sh) that will run the final simulation. See the [GEAR](gear.md) page for full instructions on using this. + +In `rrrobot_ws/src`, we have a `gazebo_models` and `rrrobot` folder. + +#### src/rrrobot_ws/src/gazebo_models + +`gazebo_models`, as the name implies, contains 3D models we used in our testing. These include a fanuc robot arm with gripper, paper bag, plastic bottle, pop can, etc. For our final simulation, we decided to use simple cubes to represent trash (red) and recycling (green) items to make the ur10 arm's vacuum suction gripper work well. We also have the images that are passed to the CV model for classification in the `recycling_images` and `trash_images` folders. `model_mappings.txt` defines the model to use, location of image, and ground truth classification in a comma separated format. + +#### src/rrrobot_ws/src/rrrobot + +Our ROS package contains several folders. + +`config` contains the configuration `.yaml` files that we use to overwrite ARIAC's default configuration. These files remove a bunch of the parts that we don't need and specify that we only need 1 depth camera. + +`include` contains the header files for the names of topics that are used by our ROS nodes and the class definition for `ArmRepresentation`. + +`launch` contains the launch file that we use to overwrite ARIAC's default launch file. + +`msg` contains the definitions for the custom ROS messages used by our nodes. + +`scripts` contains the bash scripts we used throughout testing. These include sending the arm to the home position, publishing a test message for the arm controller to listen to, and running the modified version of the GEAR simulation environment. + +`src` contains the source code for our ROS nodes. + +- `arm_controller_node.cpp` receives a pose from rrrobot_node to pick up the object, then uses inverse kinematics to determine the joint positions that will achieve the desired end-effector pose. +- `arm_representation_node.cpp` interfaces with [KDL](http://docs.ros.org/melodic/api/orocos_kdl/html/index.html) to perform inverse and forward kinematics on our ur10 robot arm model. +- `cv_model.py` uses `pytorch_pretrain_model.pt` to classify images that it receives and send the classification to rrrobot_node. +- `depth_camera_node.cpp` takes depth camera information and determines an end-effector pose for the robot arm to reach so it can pick up the object. +- `image_display.py` is a test script that uses [matplotlib](https://matplotlib.org/) to display images. +- `model_insertion_plugin.cpp` and `object_spawner_node.cpp` interface with gazebo to spawn the items in the simulation so the arm can sort them. +- `rrrobot_node.cpp` is the main node that handles interactions between the different nodes. + +`test` contains some ROS nodes that we created to test forward and inverse kinematics. + +`CMakeLists.txt` is used by our build system, [CMake](https://cmake.org), to build and compile our ROS package. + +`package.xml` defines the metadata for our ROS package. + +#### src/rrrobot_ws/world + +This folder contains the world files that we use to overwrite ARIAC's defaults. + +In `gear.py` we have disabled all but two of the bins as we only need to classify recycling and trash. + +### utils + +This contains config.xlaunch which is used by VcXsrv to automatically start the server with the desired settings (see [home](home.md) page for more information). diff --git a/docs/gear.md b/docs/gear.md new file mode 100644 index 0000000..df5712b --- /dev/null +++ b/docs/gear.md @@ -0,0 +1,152 @@ +# GEAR Simulation + +## Page Links +- [Home](home.md) +- [Documentation](documentation.md) +- [GEAR](gear.md) + +## Table of Contents +- [Running GEAR Container](#running-gear-container) +- [Building & Running Simulation](#building--running-simulation) +- [Controlling Sample Environment](#controlling-sample-environment) + - [Start Competition](#start-competition) + - [Controlling Arms](#controlling-arms) +- [Running Full Simulation](#running-full-simulation) + - [Manual Process for Testing](#manual-process-for-testing) + - [Semi-Automated Process](#semi-automated-process) + +## Running GEAR Container + +1. On your local system, go to `docker_env` folder + - `cd /PATH/TO/RRRobot/docker_env` +2. Start GEAR docker container + - `docker-compose run --rm gear` + +## Building & Running Simulation + +1. Source ROS Setup + - `source /opt/ros/melodic/setup.bash` +2. Run Simulation + - Sample Environment + - `roslaunch osrf_gear sample_environment.launch` + - See [controlling sample environment](#controlling-sample-environment) for more information. + - Final Simulation + - See [running full simulation](#running-full-simulation) for more information. + + +## Controlling Sample Environment + +While sample environment is running, open a new terminal (see tips & tricks section of [home](home.md)) on the running docker container. The following sections provide a brief overview of the commands that can be used to control various aspects of the simulation. For a full list, check out the [ARIAC 2019 Wiki](https://bitbucket.org/osrf/ariac/wiki/2019/tutorials/gear_interface). + +[sample_run.sh](https://github.com/EECS-467-W20-RRRobot-Project/RRRobot/blob/master/src/rrrobot_ws/src/rrrobot/scripts/sample_run.sh) moves arm 1 over the gasket part, picks it up, moves it to AGV1's tray, drops it, and moves back to the starting position. + +### Start Competition + +`rosservice call /ariac/start_competition` + +### Controlling Arms + +#### Gripper + +- Turn gripper suction on + - `rosservice call /ariac/arm1/gripper/control "enable: true"` +- Turn gripper suction off + - `rosservice call /ariac/arm1/gripper/control "enable: false"` + +#### Joints + +Move `arm1` over a gasket part + +``` +rostopic pub /ariac/arm1/arm/command trajectory_msgs/JointTrajectory "{joint_names: \ + ['linear_arm_actuator_joint', 'shoulder_pan_joint', 'shoulder_lift_joint', 'elbow_joint', 'wrist_1_joint', 'wrist_2_joint', 'wrist_3_joint'], \ + points: [ \ +{time_from_start: {secs: 2}, \ + positions: [0.15, 3.14, -1.570, 2.14, 3.1, -1.59, 0.126]}, \ +{time_from_start: {secs: 4}, \ + positions: [-0.35, 3.14, -0.6, 2.3, 3.0, -1.59, 0.126]}, \ +{time_from_start: {secs: 6}, \ + positions: [-0.35, 3.14, -0.5, 2.3, 3.05, -1.59, 0.126]}, \ +]}" -1 +``` + +Move part to `AGV1`'s tray + +``` +rostopic pub /ariac/arm1/arm/command trajectory_msgs/JointTrajectory "{joint_names: \ + ['linear_arm_actuator_joint', 'shoulder_pan_joint', 'shoulder_lift_joint', 'elbow_joint', 'wrist_1_joint', 'wrist_2_joint', 'wrist_3_joint'], \ + points: [ \ +{time_from_start: {secs: 2}, \ + positions: [0.0, 3.14, -1.570, 2.14, 3.27, -1.51, 0.0]}, \ +{time_from_start: {secs: 5}, \ + positions: [1.0, 1.85, 0, -0.38, 1.57, -1.51, 0.00]}, \ +{time_from_start: {secs: 7}, \ + positions: [1.0, 1.507, 0, -0.38, 0.38, -1.51, 0.00]}, \ +{time_from_start: {secs: 10}, \ + positions: [1.18, 1.507, 0.38, -0.38, 1.55, 1.75, 0.127]}, \ +]}" -1 +``` + +Return to starting position + +``` +rostopic pub /ariac/arm1/arm/command trajectory_msgs/JointTrajectory "{joint_names: \ + ['linear_arm_actuator_joint', 'shoulder_pan_joint', 'shoulder_lift_joint', 'elbow_joint', 'wrist_1_joint', 'wrist_2_joint', 'wrist_3_joint'], \ + points: [ \ +{time_from_start: {secs: 5}, \ + positions: [0.0, 3.14, -1.570, 2.14, 3.27, -1.51, 0.0]}, \ +]}" -1 +``` + +## Running Full Simulation + +### Manual Process for Testing + +#### Terminal 1: ARIAC Environment + +- `cd /app/rrrobot_ws/src/rrrobot/scripts` +- `./rrrobot_run_no_build.sh` + +#### Terminal 2: Build RRRobot Package & Arm Controller Node + +- `cd /app/rrrobot_ws` +- `catkin_make clean` +- `catkin_make` +- `source devel/setup.bash` +- `rosrun rrrobot arm_controller_node` + +#### Terminal 3: CV Model + +- `cd /app/rrrobot_ws/src/rrrobot/src/` +- `python3 cv_model.py` + +#### Terminal 4: Depth Camera Node (for getting pick up location) + +- `cd /app/rrrobot_ws/` +- `source devel/setup.bash` +- `rosrun rrrobot depth_camera_node` + +#### Terminal 5: Run the main rrrobot node + +- `cd /app/rrrobot_ws/` +- `source devel/setup.bash` +- `rosrun rrrobot rrrobot_node` + +#### Terminal 6: Run the node to spawn random objects onto the conveyor belt + +- `cd /app/rrrobot_ws/` +- `source devel/setup.bash` +- `rosrun rrrobot object_spawner_node` + +### Semi-Automated Process + +#### Terminal 1 + +In terminal 1, run the script that will build all components and run the nodes. You may need to adjust the sleep times in [run_all.sh](https://github.com/EECS-467-W20-RRRobot-Project/RRRobot/blob/master/src/rrrobot_ws/run_all.sh) based on your system's performance such that there is enough time for each component to finish before proceeding. + +- `cd /app/rrrobot_ws/` +- `./run_all.sh` + +#### Terminal 2 + +When a new item is spawned after the arm drops off the previous item, the conveyor belt must be manually started again using `rosservice call /ariac/conveyor/control "power: 100"` so that the item moves to the depth camera and the process can continue. You can do this in a new terminal since terminal 1 is running all of the simulation nodes. diff --git a/docs/home.md b/docs/home.md index 7a2455e..8f3f3ce 100644 --- a/docs/home.md +++ b/docs/home.md @@ -1,5 +1,10 @@ # RRRobot! +## Page Links +- [Home](home.md) +- [Documentation](documentation.md) +- [GEAR](gear.md) + ## Table of Contents - [Contributors](#contributors) - [Documents](#documents) @@ -8,6 +13,10 @@ - [Docker Compose Services](#docker-compose-services) - [GUI Support](#gui-support) - [Running Docker Containers](#running-docker-containers) + - [Gazebo Grasping Simulation](#gazebo-grasping-simulation) + - [Tips & Tricks](#tips--tricks) +- [Source Code Documentation](#source-code-documentation) +- [GEAR Final Simulation](#gear-final-simulation) ## Contributors @@ -28,6 +37,8 @@ 1. [Project Poster](1.%20Project%20Poster.pdf) 2. [Project Proposal](2.%20Project%20Proposal.pdf) +3. [Final Project Report - Overleaf (Read-Only)](https://www.overleaf.com/read/ncvksrzpvbmr) +4. [Draft Video](https://youtu.be/powEVDPQNEY) ## Introduction @@ -35,6 +46,10 @@ Repository for UMICH EECS 467: Autonomous Robotics (W20) RRRobot! project. To get started, you will need to install Docker on your system. Information on what Docker is, how to install it, and how to use it can be found in [Getting Started with Docker](https://sravanbalaji.com/Web%20Pages/blog_docker.html). +Once installed, you can run our final simulation by following the instructions on the [GEAR](gear.md) page. + +Information about our source code can be found on the [Documentation](documentation.md) page. + ## Development Guide At this point, you should have Docker Desktop, Toolbox, or Engine setup on your host system. In this section, you will find a list of the different docker-compose services available and how to run them. @@ -51,15 +66,19 @@ ros-turtlesim is a container that tests whether GUI support is working. This wil #### ros -ros is the production container for all ROS nodes we create. This is meant to run our final code and interface with the gazebo container for simulation. +ros is a container based on the ROS Melodic docker image. This is provided for convenience, but not used for running the final simulation. #### gazebo -Similarly to ros, gazebo is the production container for gazebo. This is meant to run our final simulation. +gazebo is a container based on the Gazebo Server 9 docker image. This is provided for convenience, but not used for running the final simulation. + +#### gear + +The GEAR container includes the Gazebo Environment for Agile Robotics from the Agile Robotics for Industrial Automation Competition 2019. This is used for running the final simulation. ### GUI Support -If using VcXsrv for Windows to enable GUI applications, run XLaunch using [config.xlaunch](utils/config.xlaunch). This will enable the following settings: +If using VcXsrv for Windows to enable GUI applications, run XLaunch using [config.xlaunch](https://github.com/EECS-467-W20-RRRobot-Project/RRRobot/blob/master/utils/config.xlaunch). This will enable the following settings: - Display Settings - Multiple Windows @@ -83,7 +102,12 @@ libGL error: failed to load driver: swrast As mentioned in [No libGL libraries when running Gazebo from ROS](https://github.com/microsoft/WSL/issues/3644#issuecomment-434556680), this can be resolved by disabling `No native OpenGL` in the VcXsrv configuration. -Additionally, be sure to update the `IP_ADDRESS` variable in [.env](src/.env) with your computer's IP Address to enable X forwarding. +You will need to update your environment variable with your IP Address to enable X forwarding. You can create a file called **.env** in the same directory as the docker-compose.yml file with your IP address as shown below. You can also edit the [docker-compose.yml](https://github.com/EECS-467-W20-RRRobot-Project/RRRobot/blob/master/docker_env/docker-compose.yml) to remove the dependence on the `IP_ADDRESS` environment variable. + +``` +# .env for docker-compose +IP_ADDRESS= +``` ### Running Docker Containers @@ -95,5 +119,35 @@ Additionally, be sure to update the `IP_ADDRESS` variable in [.env](src/.env) wi - Other: `docker-machine env` 3. Navigate to src folder - `cd /PATH/TO/rrrobot/src` -4. Use Docker Compose to run a service (refer to [docker-compose.yml](src/docker-compose.yml) or [Docker Compose Services](#docker-compose-services)) +4. Use Docker Compose to run a service (refer to [docker-compose.yml](https://github.com/EECS-467-W20-RRRobot-Project/RRRobot/blob/master/docker_env/docker-compose.yml) or [Docker Compose Services](#docker-compose-services)) - `docker-compose run --rm ` + +### Gazebo Grasping Simulation + +1. Source ROS Setup + - `source /opt/ros/melodic/setup.bash` +2. Build the drivers for the simulation + - `cd /app/rrrobot_src/src/simulation_drivers/` + - `source build.sh` +3. Start ros master node + - `roscore &` +4. Run the gazebo simulator - this will bring up gazebo with a robotic arm + - `gazebo /app/rrrobot_src/world/rrrobot.world` +5. Run control and perception programs + +### Tips & Tricks + +- Clear space on docker machine + - `docker system prune --volumes` +- See running containers + - `docker ps` +- Attach a new terminal to a running container + - `docker exec -it -u root bash` + +## Source Code Documentation + +Documentation on our source code can be found on the [Documentation](documentation.md) page. + +## GEAR Final Simulation + +Instructions for running our final GEAR simulation can be found on the [GEAR](gear.md) page. diff --git a/run_rrrobot_image.sh b/run_rrrobot_image.sh new file mode 100755 index 0000000..c3d8186 --- /dev/null +++ b/run_rrrobot_image.sh @@ -0,0 +1,3 @@ +xhost +local:docker #rrrobot-env +docker run -it --rm --device=/dev/input/event4 --device=/dev/dri:/dev/dri -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v $PWD/rrrobot_src:/home/rrrobot/rrrobot_src -h rrrobot-env eecs467:rrrobot +xhost -local:docker #rrrobot-env diff --git a/src/.env b/src/.env deleted file mode 100644 index 48e746e..0000000 --- a/src/.env +++ /dev/null @@ -1,3 +0,0 @@ -# .env for docker-compose - -IP_ADDRESS=192.168.1.14 diff --git a/src/gazebo/Dockerfile b/src/gazebo/Dockerfile deleted file mode 100644 index 238d984..0000000 --- a/src/gazebo/Dockerfile +++ /dev/null @@ -1,6 +0,0 @@ -# Gazebo Dockerfile - -# Use official image for Gazebo 9.x -FROM gazebo:gzserver9 - -CMD ["/bin/bash"] diff --git a/src/rrrobot_ws/build.sh b/src/rrrobot_ws/build.sh new file mode 100644 index 0000000..912ee85 --- /dev/null +++ b/src/rrrobot_ws/build.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +catkin_make clean && +catkin_make && +catkin_make install && + +source devel/setup.bash +export GAZEBO_RESOURCE_PATH=$(pwd)/world:$GAZEBO_RESOURCE_PATH diff --git a/src/rrrobot_ws/run_all.sh b/src/rrrobot_ws/run_all.sh new file mode 100755 index 0000000..2e68849 --- /dev/null +++ b/src/rrrobot_ws/run_all.sh @@ -0,0 +1,60 @@ +#!/bin/bash + +# Build Workspace +cd /app/rrrobot_ws +catkin_make clean +catkin_make +source devel/setup.bash +export GAZEBO_RESOURCE_PATH=$(pwd)/world:$GAZEBO_RESOURCE_PATH + +# ARIAC Environment +cd /app/rrrobot_ws/src/rrrobot/scripts +./rrrobot_run_no_build.sh & +sleep 25 +rosparam set /use_sim_time true + +# CV Model +cd /app/rrrobot_ws/src/rrrobot/src +python3 cv_model.py & +sleep 10 + +# Arm Controller Node +cd /app/rrrobot_ws +rosrun rrrobot arm_controller_node & +sleep 3 + +# Depth Camera Node +rosrun rrrobot depth_camera_node & +sleep 3 + +# RRRobot Node +rosrun rrrobot rrrobot_node & +sleep 3 + +# Object Spawner +rosrun rrrobot object_spawner_node & +sleep 3 + +# Start Competition +source /opt/ros/melodic/setup.bash +rosservice call /ariac/start_competition +sleep 1 +rosservice call /ariac/conveyor/control "power: 100" +sleep 1 +rosservice call /ariac/arm1/gripper/control "enable: false" +sleep 1 +rosservice call /ariac/arm1/gripper/control "enable: true" +sleep 1 +rosservice call /ariac/arm1/gripper/control "enable: false" + +#/app/rrrobot_ws/src/rrrobot/scripts/rrrobot_run_no_build.sh & +# cd /app/rrrobot_ws/src/rrrobot/src +# python3 cv_model.py & +# cd /app/rrrobot_ws/devel/lib/rrrobot +# ./rrrobot_node & +# ./depth_camera_node >> /dev/null & +# ./object_spawner_node & +# ./arm_controller_node & +# rostopic echo /arm_controller/destination & +# rostopic echo /desired_grasp_pose & +# rostopic echo /cv_model & diff --git a/src/rrrobot_ws/src/CMakeLists.txt b/src/rrrobot_ws/src/CMakeLists.txt new file mode 100644 index 0000000..e5cafb2 --- /dev/null +++ b/src/rrrobot_ws/src/CMakeLists.txt @@ -0,0 +1,67 @@ +# toplevel CMakeLists.txt for a catkin workspace +# catkin/cmake/toplevel.cmake + +cmake_minimum_required(VERSION 3.0.2) + +set(CATKIN_TOPLEVEL TRUE) + +# search for catkin within the workspace +set(_cmd "catkin_find_pkg" "catkin" "${CMAKE_SOURCE_DIR}") +execute_process(COMMAND ${_cmd} + RESULT_VARIABLE _res + OUTPUT_VARIABLE _out + ERROR_VARIABLE _err + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE +) +if(NOT _res EQUAL 0 AND NOT _res EQUAL 2) + # searching fot catkin resulted in an error + string(REPLACE ";" " " _cmd_str "${_cmd}") + message(FATAL_ERROR "Search for 'catkin' in workspace failed (${_cmd_str}): ${_err}") +endif() + +# include catkin from workspace or via find_package() +if(_res EQUAL 0) + set(catkin_EXTRAS_DIR "${CMAKE_SOURCE_DIR}/${_out}/cmake") + # include all.cmake without add_subdirectory to let it operate in same scope + include(${catkin_EXTRAS_DIR}/all.cmake NO_POLICY_SCOPE) + add_subdirectory("${_out}") + +else() + # use either CMAKE_PREFIX_PATH explicitly passed to CMake as a command line argument + # or CMAKE_PREFIX_PATH from the environment + if(NOT DEFINED CMAKE_PREFIX_PATH) + if(NOT "$ENV{CMAKE_PREFIX_PATH}" STREQUAL "") + if(NOT WIN32) + string(REPLACE ":" ";" CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH}) + else() + set(CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH}) + endif() + endif() + endif() + + # list of catkin workspaces + set(catkin_search_path "") + foreach(path ${CMAKE_PREFIX_PATH}) + if(EXISTS "${path}/.catkin") + list(FIND catkin_search_path ${path} _index) + if(_index EQUAL -1) + list(APPEND catkin_search_path ${path}) + endif() + endif() + endforeach() + + # search for catkin in all workspaces + set(CATKIN_TOPLEVEL_FIND_PACKAGE TRUE) + find_package(catkin QUIET + NO_POLICY_SCOPE + PATHS ${catkin_search_path} + NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH) + unset(CATKIN_TOPLEVEL_FIND_PACKAGE) + + if(NOT catkin_FOUND) + message(FATAL_ERROR "find_package(catkin) failed. catkin was neither found in the workspace nor in the CMAKE_PREFIX_PATH. One reason may be that no ROS setup.sh was sourced before.") + endif() +endif() + +catkin_workspace() diff --git a/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/arm_joint_and_link_definitions.jpg b/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/arm_joint_and_link_definitions.jpg new file mode 100644 index 0000000..5d97c90 Binary files /dev/null and b/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/arm_joint_and_link_definitions.jpg differ diff --git a/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/meshes/arm_link_1.STL b/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/meshes/arm_link_1.STL new file mode 100644 index 0000000..1cc6dee Binary files /dev/null and b/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/meshes/arm_link_1.STL differ diff --git a/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/meshes/arm_link_2.STL b/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/meshes/arm_link_2.STL new file mode 100644 index 0000000..7960a24 Binary files /dev/null and b/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/meshes/arm_link_2.STL differ diff --git a/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/meshes/arm_link_3.STL b/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/meshes/arm_link_3.STL new file mode 100644 index 0000000..d81bd58 Binary files /dev/null and b/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/meshes/arm_link_3.STL differ diff --git a/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/meshes/arm_link_4.STL b/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/meshes/arm_link_4.STL new file mode 100644 index 0000000..f764555 Binary files /dev/null and b/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/meshes/arm_link_4.STL differ diff --git a/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/meshes/arm_link_5.STL b/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/meshes/arm_link_5.STL new file mode 100644 index 0000000..1c02f3f Binary files /dev/null and b/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/meshes/arm_link_5.STL differ diff --git a/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/meshes/arm_link_6.STL b/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/meshes/arm_link_6.STL new file mode 100644 index 0000000..3e2ee1c Binary files /dev/null and b/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/meshes/arm_link_6.STL differ diff --git a/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/meshes/base_link.STL b/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/meshes/base_link.STL new file mode 100644 index 0000000..6469280 Binary files /dev/null and b/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/meshes/base_link.STL differ diff --git a/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/model.config b/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/model.config new file mode 100644 index 0000000..af365ca --- /dev/null +++ b/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/model.config @@ -0,0 +1,11 @@ + + + fanuc_robotic_arm_with_gripper + 1.0 + model.sdf + + + + + + diff --git a/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/model.sdf b/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/model.sdf new file mode 100644 index 0000000..e9b00bb --- /dev/null +++ b/src/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm_with_gripper/model.sdf @@ -0,0 +1,956 @@ + + + + + 0 0 0 3.14159 -0 0 + + 86.082 + + 4.3404 + 0 + 0.0020207 + 2.4866 + 0 + 6.1574 + + -0.003895 -0.062844 -0.11068 0 -0 0 + + 1 + 0 + 0 + 0 + + 0 0 0 0 -0 0 + + + /home/rrrobot/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm/meshes/base_link.STL + 1 1 1 + + + + 1 + + + __default__ + + 0.3 0.3 0.3 1 + 0.7 0.7 0.7 1 + 0.01 0.01 0.01 1 + 0 0 0 1 + + 0 + 1 + + + 0 + 10 + 0 0 0 0 -0 0 + + + /home/rrrobot/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm/meshes/base_link.STL + 1 1 1 + + + + + + 1 + 1 + 0 0 0 + 0 + 0 + + + 1 + 0 + 0 + 1 + + 0 + + + + + 0 + 1e+06 + + + 0 + 1 + 1 + + 0 + 0.2 + 1e+13 + 1 + 0.01 + 0 + + + 1 + -0.01 + 0 + 0.2 + 1e+13 + 1 + + + + + + + 0.001715 0.003779 0.661683 1.5708 -0 0 + + 266.27 + + 279.51 + 0 + 4.6477 + 43.386 + 34.265 + 255.26 + + 0.093634 -0.51398 -0.1614 0 -0 0 + + 1 + 0 + 0 + 0 + + 0 0 0 0 -0 0 + + + /home/rrrobot/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm/meshes/arm_link_1.STL + 1 1 1 + + + + 1 + + + __default__ + + 0.3 0.3 0.3 1 + 0.7 0.7 0.7 1 + 0.01 0.01 0.01 1 + 0 0 0 1 + + 0 + 1 + + + 0 + 10 + 0 0 0 0 -0 0 + + + /home/rrrobot/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm/meshes/arm_link_1.STL + 1 1 1 + + + + + + 1 + 1 + 0 0 0 + 0 + 0 + + + 1 + 0 + 0 + 1 + + 0 + + + + + 0 + 1e+06 + + + 0 + 1 + 1 + + 0 + 0.2 + 1e+13 + 1 + 0.01 + 0 + + + 1 + -0.01 + 0 + 0.2 + 1e+13 + 1 + + + + + + + -0.068455 0.275759 0.315754 -1.571 0 0 + + 60.795 + + 8.1939 + 0 + 0 + 0.76659 + 0 + 8.0226 + + 0.25344 -1.009 -0.57114 0 -0 0 + + 1 + 0 + 0 + 0 + + 0 0 0 0 -0 0 + + + /home/rrrobot/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm/meshes/arm_link_2.STL + 1 1 1 + + + + 1 + + + __default__ + + 0.3 0.3 0.3 1 + 0.7 0.7 0.7 1 + 0.01 0.01 0.01 1 + 0 0 0 1 + + 0 + 1 + + + 0 + 10 + 0 0 0 0 -0 0 + + + /home/rrrobot/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm/meshes/arm_link_2.STL + 1 1 1 + + + + + + 1 + 1 + 0 0 0 + 0 + 0 + + + 1 + 0 + 0 + 1 + + 0 + + + + + 0 + 1e+06 + + + 0 + 1 + 1 + + 0 + 0.2 + 1e+13 + 1 + 0.01 + 0 + + + 1 + -0.01 + 0 + 0.2 + 1e+13 + 1 + + + + + + + -0.00025 -0.94659 5.45119 1.5708 -0 0 + + 63.612 + + 6.6124 + 0.099584 + 0 + 5.9295 + 0 + 1.9517 + + 0.00756 -3.4862 -0.40714 0 -0 0 + + 1 + 0 + 0 + 0 + + 0 0 0 0 -0 0 + + + /home/rrrobot/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm/meshes/arm_link_3.STL + 1 1 1 + + + + 1 + + + __default__ + + 0.3 0.3 0.3 1 + 0.7 0.7 0.7 1 + 0.01 0.01 0.01 1 + 0 0 0 1 + + 0 + 1 + + + 0 + 10 + 0 0 0 0 -0 0 + + + /home/rrrobot/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm/meshes/arm_link_3.STL + 1 1 1 + + + + + + 1 + 1 + 0 0 0 + 0 + 0 + + + 1 + 0 + 0 + 1 + + 0 + + + + + 0 + 1e+06 + + + 0 + 1 + 1 + + 0 + 0.2 + 1e+13 + 1 + 0.01 + 0 + + + 1 + -0.01 + 0 + 0.2 + 1e+13 + 1 + + + + + + + -0.000257 -3.97477 2.07064 -1.5708 7e-06 3.14159 + + 6.6264 + + 0.089718 + 0 + 0.017666 + 0.092881 + 3e-08 + 0.028564 + + -0.028814 0 -2.454 0 -0 0 + + 1 + 0 + 0 + 0 + + 0 0 0 0 -0 0 + + + /home/rrrobot/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm/meshes/arm_link_4.STL + 1 1 1 + + + + 1 + + + __default__ + + 0.3 0.3 0.3 1 + 0.7 0.7 0.7 1 + 0.01 0.01 0.01 1 + 0 0 0 1 + + 0 + 1 + + + 0 + 10 + 0 0 0 0 -0 0 + + + /home/rrrobot/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm/meshes/arm_link_4.STL + 1 1 1 + + + + + + 1 + 1 + 0 0 0 + 0 + 0 + + + 1 + 0 + 0 + 1 + + 0 + + + + + 0 + 1e+06 + + + 0 + 1 + 1 + + 0 + 0.2 + 1e+13 + 1 + 0.01 + 0 + + + 1 + -0.01 + 0 + 0.2 + 1e+13 + 1 + + + + + + + 0.000743 -4.767 2.06498 -1.5708 7e-06 3.14159 + + 5.1229 + + 0.038195 + 4e-07 + 0 + 0.066675 + 6e-07 + 0.04821 + + -0.010371 1e-06 -3.0669 0 -0 0 + + 1 + 0 + 0 + 0 + + 0 0 0 0 -0 0 + + + /home/rrrobot/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm/meshes/arm_link_5.STL + 1 1 1 + + + + 1 + + + __default__ + + 0.3 0.3 0.3 1 + 0.7 0.7 0.7 1 + 0.01 0.01 0.01 1 + 0 0 0 1 + + 0 + 1 + + + 0 + 10 + 0 0 0 0 -0 0 + + + /home/rrrobot/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm/meshes/arm_link_5.STL + 1 1 1 + + + + + + 1 + 1 + 0 0 0 + 0 + 0 + + + 1 + 0 + 0 + 1 + + 0 + + + + + 0 + 1e+06 + + + 0 + 1 + 1 + + 0 + 0.2 + 1e+13 + 1 + 0.01 + 0 + + + 1 + -0.01 + 0 + 0.2 + 1e+13 + 1 + + + + + + + -2.06426 -5.37015 4.13075 1.88334 1.57078 0.312546 + + 0.72893 + + 0.00131 + 0 + 0 + 0.0012978 + 0 + 0.0024341 + + 2.0657 2.0642 -3.5441 0 -0 0 + + 1 + 0 + 0 + 0 + + 0 0 0 0 -0 0 + + + /home/rrrobot/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm/meshes/arm_link_6.STL + 1 1 1 + + + + 1 + + + __default__ + + 0.3 0.3 0.3 1 + 0.7 0.7 0.7 1 + 0.01 0.01 0.01 1 + 0 0 0 1 + + 0 + 1 + + + 0 + 10 + 0 0 0 0 -0 0 + + + /home/rrrobot/rrrobot_ws/src/gazebo_models/fanuc_robotic_arm/meshes/arm_link_6.STL + 1 1 1 + + + + + + 1 + 1 + 0 0 0 + 0 + 0 + + + 1 + 0 + 0 + 1 + + 0 + + + + + 0 + 1e+06 + + + 0 + 1 + 1 + + 0 + 0.2 + 1e+13 + 1 + 0.01 + 0 + + + 1 + -0.01 + 0 + 0.2 + 1e+13 + 1 + + + + + + + + 0.72893 + + 0.00131 + 0 + 0 + 0.0012978 + 0 + 0.0024341 + + 0 0 0 0 -0 0 + + -0.000802 -1.86676 2.06269 -1e-06 -1e-06 0 + 0 + 0 + 0 + 0 + + + link_2 + link_3 + 0 -3.65 -0.6 0 -0 0 + + 1 0 0 + 0 + + -1.79769e+308 + 1.79769e+308 + -2e+07 + -1 + + + 0 + 0 + 0 + 0 + + + + + + 0 + 0.2 + + + 0 + 0.2 + + + + + + link_5 + link_6 + 2.065 2.065 -3.5 0 -0 0 + + 0 0 1 + 0 + + -1.79769e+308 + 1.79769e+308 + -2e+07 + -1 + + + 0 + 0 + 0 + 0 + + + + + + 0 + 0.2 + + + 0 + 0.2 + + + + + + link_6 + link_7 + 0 0 0 0 -0 0 + + + + 0 + 0.2 + + + 0 + 0.2 + + + + + + link_1 + link_2 + 0 -0.41 -0.61 0 -0 0 + + 1 0 0 + 0 + + -1.79769e+308 + 1.79769e+308 + -2e+07 + -1 + + + 0 + 0 + 0 + 0 + + + + + + 0 + 0.2 + + + 0 + 0.2 + + + + + + base + link_1 + 0 0 0 0 -0 0 + + 0 1 0 + 0 + + -1.79769e+308 + 1.79769e+308 + -2e+07 + -1 + + + 0 + 0 + 0 + 0 + + + + + + 0 + 0.2 + + + 0 + 0.2 + + + + + + link_4 + link_5 + 0 0 -3.15 0 -0 0 + + 1 0 0 + 0 + + -1.79769e+308 + 1.79769e+308 + -2e+07 + -1 + + + 0 + 0 + 0 + 0 + + + + + + 0 + 0.2 + + + 0 + 0.2 + + + + + + link_3 + link_4 + 0 0 -2.7 0 -0 0 + + 0 0 1 + 0 + + -1.79769e+308 + 1.79769e+308 + -2e+07 + -1 + + + 0 + 0 + 0 + 0 + + + + + + 0 + 0.2 + + + 0 + 0.2 + + + + + + link_6 + link_7 + + + world + base + + 0 + 0 + + + /arm_node/vacuum_gripper + link_7 + grasping + + + + diff --git a/src/rrrobot_ws/src/gazebo_models/generic_recyclable/model.config b/src/rrrobot_ws/src/gazebo_models/generic_recyclable/model.config new file mode 100644 index 0000000..93a785e --- /dev/null +++ b/src/rrrobot_ws/src/gazebo_models/generic_recyclable/model.config @@ -0,0 +1,11 @@ + + + generic_recyclable + 1.0 + model.sdf + + + + + + diff --git a/src/rrrobot_ws/src/gazebo_models/generic_recyclable/model.sdf b/src/rrrobot_ws/src/gazebo_models/generic_recyclable/model.sdf new file mode 100644 index 0000000..e1db174 --- /dev/null +++ b/src/rrrobot_ws/src/gazebo_models/generic_recyclable/model.sdf @@ -0,0 +1,104 @@ + + + + + + 0.208095 + + 0.0180922 + 0 + 0 + 0.0180922 + 0 + 0.0346825 + + 0 0 0 0 -0 0 + + 0 + 0 + 0 + 0 0 0 0 -0 0 + 1 + + + + 0.05 0.05 0.05 + + + + + + __default__ + + 0 1 0 1 + 0.7 0.7 0.7 1 + 0.01 0.01 0.01 1 + 0 0 0 1 + + 0 0 0 0 -0 0 + 0 + 1 + + + 0 + 10 + 0 0 0 0 -0 0 + + + 0.05 0.05 0.05 + + + + + + 1 + 1 + 0 0 0 + 0 + 0 + + + 1 + 0 + 0 + 1 + + 0 + + + + + 0 + 1e+06 + + + 0 + 1 + 1 + + 0 + 0.2 + 1e+13 + 1 + 0.01 + 0 + + + 1 + -0.01 + 0 + 0.2 + 1e+13 + 1 + + + + + + 0 + 1 + + diff --git a/src/rrrobot_ws/src/gazebo_models/generic_trash/model.config b/src/rrrobot_ws/src/gazebo_models/generic_trash/model.config new file mode 100644 index 0000000..f94e5b7 --- /dev/null +++ b/src/rrrobot_ws/src/gazebo_models/generic_trash/model.config @@ -0,0 +1,11 @@ + + + generic_trash + 1.0 + model.sdf + + + + + + diff --git a/src/rrrobot_ws/src/gazebo_models/generic_trash/model.sdf b/src/rrrobot_ws/src/gazebo_models/generic_trash/model.sdf new file mode 100644 index 0000000..c2e7583 --- /dev/null +++ b/src/rrrobot_ws/src/gazebo_models/generic_trash/model.sdf @@ -0,0 +1,104 @@ + + + + + + 0.208095 + + 0.0180922 + 0 + 0 + 0.0180922 + 0 + 0.0346825 + + 0 0 0 0 -0 0 + + 0 + 0 + 0 + 0 0 0 0 -0 0 + 1 + + + + 0.05 0.05 0.05 + + + + + + __default__ + + 1 0 0 1 + 0.7 0.7 0.7 1 + 0.01 0.01 0.01 1 + 0 0 0 1 + + 0 0 0 0 -0 0 + 0 + 1 + + + 0 + 10 + 0 0 0 0 -0 0 + + + 0.05 0.05 0.05 + + + + + + 1 + 1 + 0 0 0 + 0 + 0 + + + 1 + 0 + 0 + 1 + + 0 + + + + + 0 + 1e+06 + + + 0 + 1 + 1 + + 0 + 0.2 + 1e+13 + 1 + 0.01 + 0 + + + 1 + -0.01 + 0 + 0.2 + 1e+13 + 1 + + + + + + 0 + 1 + + diff --git a/src/rrrobot_ws/src/gazebo_models/model_mappings.txt b/src/rrrobot_ws/src/gazebo_models/model_mappings.txt new file mode 100644 index 0000000..4d50cf3 --- /dev/null +++ b/src/rrrobot_ws/src/gazebo_models/model_mappings.txt @@ -0,0 +1,10 @@ +generic_recyclable,/app/rrrobot_ws/src/gazebo_models/recycling_images/plastic.jpg,plastic +generic_recyclable,/app/rrrobot_ws/src/gazebo_models/recycling_images/paper.jpg,paper +generic_recyclable,/app/rrrobot_ws/src/gazebo_models/recycling_images/metal.jpg,metal +generic_recyclable,/app/rrrobot_ws/src/gazebo_models/recycling_images/glass.jpg,glass +generic_recyclable,/app/rrrobot_ws/src/gazebo_models/recycling_images/cardboard.jpg,cardboard +generic_trash,/app/rrrobot_ws/src/gazebo_models/trash_images/trash_1.jpg,trash +generic_trash,/app/rrrobot_ws/src/gazebo_models/trash_images/trash_2.jpg,trash +generic_trash,/app/rrrobot_ws/src/gazebo_models/trash_images/trash_3.jpg,trash +generic_trash,/app/rrrobot_ws/src/gazebo_models/trash_images/trash_4.jpg,trash +generic_trash,/app/rrrobot_ws/src/gazebo_models/trash_images/trash_5.jpg,trash \ No newline at end of file diff --git a/src/rrrobot_ws/src/gazebo_models/paper_bag/Paper Bag.DAE b/src/rrrobot_ws/src/gazebo_models/paper_bag/Paper Bag.DAE new file mode 100644 index 0000000..a0ff5f9 --- /dev/null +++ b/src/rrrobot_ws/src/gazebo_models/paper_bag/Paper Bag.DAE @@ -0,0 +1,126 @@ + + + + + mjromero + OpenCOLLADA for 3ds Max; Version: 1.6; Revision: 56 + file:///H:/Mis%20documentos/bloquesy%20cosas/practicas%203ds%20max/Bolsa%20Papel/3ds%20max/Paper%20bag.max + + 2017-07-31T16:26:54 + 2017-07-31T16:26:54 + + Z_UP + + + + + + + + 0 0 0 1 + + + 0 0 0 1 + + + 0.5 0.5 0.5 1 + + + 0 0 0 1 + + + 100 + + + + + + + + + + + + + + + + 0.1570231 -0.105446 -0.007125242 -0.1598551 0.1080584 -0.01002244 0.1586887 0.1070889 -0.008937941 -0.1500799 -0.1003692 0.4991263 0.1531902 -0.1029003 0.4991385 -0.1485021 0.09890961 0.4989986 0.149455 0.09962042 0.4990371 -0.1573265 -0.105622 -0.007294969 0.12238 -5.02077e-5 0.4990322 -6.68292e-7 0.08707978 0.4990436 -0.1167417 -8.9509e-5 0.4990592 -7.75578e-5 -0.09285945 0.123766 0.1213802 3.00351e-5 0.122904 -7.51709e-5 0.09104288 0.1219491 -0.1215511 2.45438e-5 0.1227231 -0.07428053 0.08807476 0.4989812 -0.07728139 0.09131136 0.1227406 0.07437215 0.0870838 0.4990449 0.07711482 0.09164551 0.1227804 0.07438268 -0.0885378 0.4990685 0.07695247 -0.09628585 0.1228761 -0.07434899 -0.0885352 0.499053 -0.07742611 -0.09193451 0.1227526 -0.1495914 -0.09907865 0.400042 -0.1486291 -0.09913221 0.3010025 -0.1499763 -0.1000288 0.27844 -0.1545307 -0.1029392 0.09870736 0.1563658 -0.1046421 0.09869511 0.1492257 -0.09937503 0.2788301 0.1477944 -0.09847438 0.3009923 0.1480128 -0.09865156 0.4000453 0.1545204 0.1031248 0.0987145 0.1495993 0.09969658 0.2786238 0.1481074 0.09858462 0.3009819 0.1506272 0.1007968 0.4000673 -0.1543783 0.1029059 0.09868881 -0.1514088 0.101321 0.2776 -0.1480662 0.09855293 0.3009331 -0.1516091 0.1013559 0.400013 -7.75401e-5 -0.09002667 0.4245362 -7.12341e-6 -0.09200111 0.3498559 -3.08548e-7 -0.08934782 0.2713054 -4.22397e-5 -0.09387872 0.2002811 0.1198069 -7.06583e-5 0.4244973 0.1178973 -7.16264e-5 0.3499614 0.1169614 2.97552e-7 0.2782122 0.1234721 9.04198e-5 0.2002369 -7.10409e-5 0.09619696 0.424372 -1.60684e-5 0.08814785 0.3499703 1.14101e-5 0.08802473 0.2713078 -5.79015e-5 0.09081475 0.2002723 -0.1175051 -1.4622e-4 0.4244348 -0.1191918 -7.24568e-5 0.3498846 -0.1186286 -2.01147e-6 0.2780477 -0.1243704 -5.44851e-7 0.2002611 -0.07420125 0.08852287 0.4245181 -0.0743159 0.08733863 0.3498693 -0.07508583 0.08801118 0.2781729 -0.07734007 0.09061988 0.2002766 0.0742389 0.08955044 0.4244684 0.07434907 0.08709329 0.3498578 0.07491975 0.09002602 0.2777678 0.07705332 0.09211756 0.200296 0.07419166 -0.09083341 0.4243698 0.07406973 -0.0926656 0.3499599 0.07506952 -0.0893329 0.2781765 0.07678578 -0.09594696 0.2002443 -0.07412823 -0.09070091 0.424478 -0.07421657 -0.0898018 0.3498226 -0.07503115 -0.08995067 0.2781199 -0.07648015 -0.1023282 0.2001969 0.06392583 -0.08853274 0.4990684 0.03920211 -0.08853311 0.4662523 -2.24918e-4 -0.09291829 0.4610525 -0.03961729 -0.0975601 0.4657715 -0.06190137 -0.0888825 0.4989295 -0.1537667 4.67644e-5 -0.00377921 -8.16215e-5 0.1024168 -0.003747602 0.153609 4.10797e-5 -0.00378185 -7.78675e-5 -0.1022567 -0.003621348 0.1158543 -0.09783641 0.05925344 -4.92764e-5 -0.09192416 0.1224664 -0.1154838 -0.1037512 0.05942767 0.1370554 0.05178893 0.05911912 0.1370974 -0.05171498 0.05912826 -0.1159229 0.09791884 0.05923034 -7.53879e-5 0.0906233 0.1224484 0.1158525 0.09668583 0.05917031 -0.1382136 -0.05165935 0.05919777 -0.1377501 0.05179088 0.05912242 0.1478038 -0.09847169 0.2883299 0.1116308 -0.09344975 0.3253661 0.07435545 -0.08854632 0.3126115 0.1127603 -0.09429942 0.27839 0.1481503 0.09862128 0.2883219 0.1317791 0.04988121 0.3254364 0.1158124 -7.17306e-5 0.3125785 0.1330867 0.05044345 0.2785098 -0.1490853 0.09941493 0.2882247 -0.1116911 0.09278386 0.3253824 -0.07435013 0.08708211 0.3125534 -0.1127275 0.09413334 0.2782826 -0.148636 -0.09916195 0.2883419 -0.1324325 -0.04998533 0.3254768 -0.1177972 -7.37307e-5 0.3125725 -0.1338099 -0.05036123 0.2784544 -0.07405291 -0.09228744 0.3125558 -0.03750848 -0.08944433 0.2783099 -4.94243e-5 -0.08956315 0.3125972 -0.03711018 -0.09195925 0.34989 0.1331032 -0.05043582 0.2716029 0.1317767 -0.05001513 0.3254236 0.07428831 0.08791766 0.3125223 0.0375275 0.0888088 0.2780996 1.53491e-6 0.08708899 0.312562 0.03712741 0.08754835 0.3499683 -0.1336322 0.05043551 0.2716063 -0.1323415 0.04984318 0.3254267 -0.03872238 0.09084229 0.1222918 0.03857161 0.09112602 0.1223918 -0.03749999 0.08801102 0.2713999 -0.03712896 0.088814 0.3499627 0.1127138 0.09394959 0.2716255 0.1117119 0.09270617 0.3253865 0.03860285 -0.0921672 0.1221988 -0.03871435 -0.0919071 0.1228665 0.03749996 -0.08933905 0.2713827 0.03715049 -0.09136638 0.3499916 -0.1127212 -0.09463664 0.2716061 -0.1118606 -0.09435877 0.3253771 0.1505774 -0.1007577 0.4497259 0.1112477 -0.09606587 0.4990922 0.07442457 -0.08854163 0.4617867 0.1116278 -0.09345438 0.412219 0.1486266 -0.09916752 0.3505134 0.07379352 -0.09597012 0.3871461 0.07650722 -0.09279265 0.1565544 0.156621 -0.10485 0.04717133 0.1155521 -0.09959162 0.1492839 0.07708405 -0.09250377 0.2389414 0.1540311 -0.1026841 0.1501072 0.1506487 0.1006455 0.4496431 0.1409535 0.04674112 0.4990457 0.1239392 8.86868e-6 0.4619064 0.1321329 0.04978134 0.4123535 0.14805 0.09856482 0.3505312 0.1225129 -6.04067e-5 0.3871693 0.1260331 4.25806e-4 0.161448 0.1545676 0.1031672 0.04709869 0.1388106 0.05122636 0.1495669 0.1221361 5.01677e-5 0.2389104 0.1548655 0.103456 0.1501608 -0.1509744 0.1008123 0.4495069 -0.1115393 0.09267369 0.4990095 -0.07402596 0.09134445 0.4618586 -0.1117686 0.09538693 0.412233 -0.1502791 0.1004345 0.3505591 -0.07430122 0.08758033 0.3871813 -0.07674374 0.08995215 0.156524 -0.1555132 0.1038661 0.0470915 -0.1159348 0.09755519 0.1493369 -0.07730662 0.09061868 0.2389856 -0.154022 0.1026061 0.1501576 -0.1479763 -0.09848777 0.449662 -0.1339836 -0.04935077 0.4989456 -0.1170881 -1.37959e-4 0.4618655 -0.1402921 -0.04757719 0.4122735 -0.1498055 -0.09884576 0.350773 -0.1196525 -1.17782e-4 0.3871343 -0.1229693 2.13197e-5 0.1624554 -0.1546801 -0.1030895 0.04712587 -0.1390085 -0.05142468 0.1495611 -0.1225024 -9.98759e-5 0.2389354 -0.1540788 -0.1025638 0.1501559 -0.07710348 -0.09534686 0.15743 -6.75395e-5 -0.09195584 0.156459 -0.03877614 -0.09652982 0.2003984 -0.07721802 -0.09300815 0.238887 -6.86456e-5 -0.09203077 0.238969 5.23739e-5 -0.08904973 0.3871821 -0.03715649 -0.09599241 0.4246064 -0.07435472 -0.08899517 0.3872031 0.1369101 -0.0518853 0.149496 0.1389018 -0.04756865 0.4991774 0.1320231 -0.04992287 0.412279 0.0773282 0.09123627 0.1565853 -6.05058e-5 0.09104404 0.1565375 0.03852774 0.09211983 0.2003998 0.07699192 0.0926218 0.238991 -6.53733e-5 0.0906172 0.2389916 -4.63096e-5 0.0880123 0.4617405 0.03714154 0.08707947 0.4990688 0.07433926 0.08796104 0.4618356 0.03705394 0.08830334 0.4244478 7.03577e-6 0.09523329 0.38727 0.07433055 0.08736131 0.3872006 -0.1375836 0.05191216 0.1495007 -0.1321982 0.04975081 0.4990612 -0.1328263 0.0497375 0.4122464 -0.03866342 0.09060202 0.2004057 -0.03715305 0.08719818 0.4989771 -0.03703713 0.09383985 0.4245011 0.1158519 0.097316 0.1493602 0.1113942 0.09382756 0.499011 0.1108054 0.09879265 0.4122307 0.03853684 -0.09927157 0.2003966 0.03718165 -0.09006732 0.4243722 -0.1160469 -0.09722067 0.1493366 -0.07428721 -0.08911386 0.4617918 -0.1114674 -0.09412864 0.499081 -0.1118388 -0.09438032 0.4121691 -1.79534e-4 -0.09219256 0.4429166 0.05671626 -0.08912579 0.4454036 0.01947978 -0.08878802 0.4636008 0.06910402 -0.08853274 0.4990689 0.05534561 -0.08853274 0.4803824 -0.06808645 -0.08861164 0.4989904 -0.05673744 -0.09462872 0.4451633 -0.05394399 -0.0918574 0.4802711 -0.02001343 -0.09798356 0.4633823 -1.03206e-4 -0.09715725 0.05898534 0.1428477 2.8399e-5 0.03758132 -8.28799e-5 0.09733194 0.05904507 -0.1433446 2.42997e-5 0.0375925 0.1116783 -0.09345455 0.3009856 0.1317925 0.04988747 0.3010539 -0.1117005 0.09265997 0.3009748 -0.1325063 -0.04994541 0.3010511 -0.03717647 -0.09226881 0.3126745 0.1317874 -0.05002812 0.301053 0.03715264 0.08735468 0.3126193 -0.1323112 0.04986802 0.3010547 -7.32692e-5 0.0907103 0.1231803 -0.03713968 0.08730524 0.3126479 0.1116434 0.09294087 0.300977 -7.75578e-5 -0.09190364 0.122684 0.03712779 -0.0885212 0.3126641 -0.1115935 -0.09388722 0.3009945 0.1114289 -0.09517115 0.4557559 0.1115549 -0.09373837 0.3687892 0.115629 -0.1019824 0.1041579 0.1156813 -0.09887564 0.1944649 0.1420375 0.04655913 0.4558722 0.1328305 0.04949094 0.3688393 0.1368999 0.05202042 0.1043532 0.1392694 0.05112687 0.194557 -0.1116102 0.09526847 0.4557333 -0.1115318 0.09426752 0.3688172 -0.1160608 0.09883908 0.1041337 -0.1160045 0.09716181 0.1944703 -0.1391599 -0.04787003 0.4556924 -0.13703 -0.04862651 0.3689299 -0.1388166 -0.05161433 0.104343 -0.1511494 -0.04765955 0.1946633 -0.03879533 -0.0927818 0.1567544 -0.03867855 -0.09231964 0.2390459 -0.03716059 -0.08974729 0.3873081 0.136901 -0.05197078 0.1043302 0.1371426 -0.05176083 0.1945804 0.1344933 -0.04910846 0.4558495 0.1317605 -0.04997896 0.368838 0.03860677 0.09191086 0.1568787 0.03853688 0.09154534 0.2390967 0.03714087 0.08706598 0.4618592 0.03703611 0.09069414 0.3872198 -0.1377076 0.05200965 0.1043307 -0.1381348 0.05172508 0.1945811 -0.1325498 0.04981832 0.455759 -0.1325239 0.04979563 0.3688407 -0.03874556 0.09061255 0.15658 -0.038666 0.09060279 0.2391051 -0.03718442 0.0906113 0.4617865 -0.03703771 0.09022499 0.3872766 0.1161285 0.09739103 0.1041439 0.1158292 0.09726372 0.1944702 0.1111653 0.09636933 0.4556953 0.1113628 0.09519043 0.3688598 0.03862335 -0.09354831 0.1568961 0.03851672 -0.09301426 0.2390091 0.0372564 -0.09359958 0.3872365 -0.1158197 -0.1004162 0.1040659 -0.1156387 -0.1006658 0.1945028 -0.111595 -0.09362758 0.4557228 -0.1124132 -0.09662411 0.368724 0.02837658 -0.0886189 0.4440244 0.0628914 -0.08852085 0.4722298 -0.06235039 -0.09088258 0.472038 -0.02859876 -0.09912874 0.4440064 -0.1085987 -0.0570326 0.01165283 -0.1092093 3.2278e-5 0.01102025 -0.1085652 0.05706089 0.0112561 -7.86192e-5 0.05761302 0.01118933 0.1084505 0.05709741 0.01165088 0.109116 2.96759e-5 0.01094599 0.108443 -0.05703181 0.011653 -7.71271e-5 -0.05770738 0.01104148 0.1053816 -0.09769163 0.1649112 0.1156861 -0.09877782 0.1563665 0.1456796 -0.1012782 0.1572459 0.1536828 -0.102418 0.1659196 0.1502126 -0.09225347 0.156654 0.1369098 -0.05186975 0.1534771 0.1334066 -0.04090407 0.1627124 0.1258112 -0.001916913 0.1591042 0.1253816 1.78888e-4 0.1533563 0.1269107 0.001503985 0.1593115 0.1384083 0.03955755 0.1609043 0.1392944 0.05102027 0.1548934 0.151315 0.09166245 0.1571966 0.1546521 0.1033535 0.1653091 0.1456792 0.1025606 0.1573673 0.1158923 0.09725392 0.1538699 0.1068162 0.09550145 0.163685 0.07819976 0.09135345 0.1637541 -0.1065413 0.09571925 0.1641094 -0.1159913 0.0973553 0.1552396 -0.1482525 0.1017126 0.1545493 -0.1540554 0.1026561 0.1630502 -0.1509203 0.0930703 0.1560411 -0.1376984 0.0518713 0.159543 -0.1328023 0.03465533 0.1686564 -0.122343 5.60335e-6 0.1701257 -0.1360646 -0.03809676 0.1640762 -0.1399155 -0.0511272 0.1572744 -0.1515624 -0.09358164 0.1555388 -0.1541407 -0.102654 0.1644896 -0.1476371 -0.1016511 0.1552638 -0.1160784 -0.09723482 0.1538424 -0.1071443 -0.09662046 0.1633105 0.07840557 -0.09390518 0.1570841 0.07723345 -0.09372798 0.1655522 -0.07893367 0.09115331 0.1569507 -0.0775125 0.09084245 0.1658397 -0.07719108 -0.09619118 0.1651521 -0.07816379 -0.09523806 0.157295 -6.44457e-5 -0.09208443 0.1659037 0.07725874 0.09125174 0.1657652 -5.9062e-5 0.09109154 0.1658088 -0.03881215 -0.09328061 0.1658568 0.0386036 0.09202094 0.1657612 -0.03875433 0.09061287 0.166051 0.03862283 -0.09428452 0.1657005 0.1078772 -0.09807828 0.157071 0.1157144 -0.09855444 0.1652217 0.1430011 -0.1009192 0.1655293 0.1537727 -0.1024908 0.1566006 0.1491623 -0.08925073 0.1645233 0.1369108 -0.05186505 0.162987 0.1343296 -0.04375094 0.15437 0.1260184 -0.004829448 0.1531182 0.1257181 5.79963e-4 0.1598158 0.1278852 0.003784662 0.1544632 0.1384395 0.04257467 0.1557131 0.1395728 0.05098948 0.1627829 0.1502396 0.08870079 0.1643514 0.1546906 0.1033658 0.1572027 0.1430298 0.1021381 0.1649689 0.1158878 0.09722351 0.1629705 0.1092746 0.09598083 0.1552544 0.07896107 0.09143265 0.1563 -0.1090091 0.09621017 0.1558213 -0.1160002 0.09727436 0.1643131 -0.1455534 0.1014012 0.1626558 -0.1540121 0.1026344 0.1539563 -0.1499908 0.09003206 0.1637328 -0.1377641 0.0518598 0.1689508 -0.1335436 0.03756636 0.1606586 -0.1231384 1.86229e-4 0.1601487 -0.1366726 -0.04108498 0.1573316 -0.1406073 -0.05091592 0.1652509 -0.1509839 -0.09042223 0.1630064 -0.1540683 -0.1025896 0.1554461 -0.1449346 -0.1014244 0.1634334 -0.1160546 -0.0973143 0.1632309 -0.109701 -0.09652256 0.154783 0.07712535 -0.09307803 0.1562525 0.07646047 -0.09292403 0.1615972 0.07686978 -0.09290174 0.1612886 -0.07762309 0.09027201 0.1562239 -0.0770179 0.09003131 0.1616688 -0.07692681 0.0899578 0.1614775 -0.07556149 -0.09566708 0.1608165 -0.07578886 -0.09516104 0.1616054 -0.07733577 -0.09551626 0.1570397 -6.44717e-5 -0.09116606 0.1614405 0.07655855 0.0903424 0.1615178 -5.84956e-5 0.09014455 0.1614337 -0.03843855 -0.09215748 0.1615741 0.03823941 0.09106047 0.1615859 -0.0383855 0.08967779 0.1615696 0.03826437 -0.09308648 0.1615599 0.1056142 -0.09707806 0.1612585 0.1145862 -0.09784999 0.1610426 0.1429553 -0.1002101 0.1616398 0.1522915 -0.1015191 0.1615224 0.1482624 -0.08993854 0.160838 0.1355837 -0.05143006 0.1585038 0.1325604 -0.04198443 0.1588478 0.1248202 -0.00323121 0.1564294 0.1245078 2.70049e-4 0.1568278 0.1263765 0.002432413 0.1571084 0.137534 0.04052015 0.1587643 0.1384097 0.0503514 0.1591334 0.1493813 0.0892568 0.1609974 0.1533333 0.1024617 0.1615347 0.1429974 0.1013619 0.1614183 0.1147939 0.09621099 0.1586807 0.1070208 0.09473572 0.1597313 0.07722929 0.09043128 0.1604737 -0.1067488 0.09498443 0.1602254 -0.1148919 0.09632995 0.1600453 -0.1455017 0.1005755 0.1588888 -0.1526146 0.1016551 0.1588134 -0.1490494 0.09062552 0.1601653 -0.1364158 0.05131504 0.1644886 -0.1319121 0.03571321 0.1648973 -0.1210822 -5.53576e-5 0.1658261 -0.1351464 -0.03923929 0.1609754 -0.1390023 -0.0505755 0.1615635 -0.1499088 -0.09115348 0.1595195 -0.1527184 -0.1017309 0.1602921 -0.1448914 -0.1006576 0.1596002 -0.1149465 -0.09639065 0.1587917 -0.1073772 -0.09574173 0.1593449 0.07666764 -0.09283141 0.1603724 -0.07708471 0.08998842 0.1604557 -0.07701669 -0.09617227 0.1601675 -0.1499838 -0.1000266 0.2722442 0.1492582 -0.09939238 0.2718686 0.1497144 0.09979083 0.2720906 -0.1518449 0.1016983 0.273131 -1.60191e-6 -0.08933249 0.2781971 0.1170041 5.30644e-8 0.2712177 1.10233e-5 0.08800813 0.2781796 -0.1186232 -2.08736e-6 0.2713935 -0.07508776 0.08802556 0.271323 0.07491408 0.09008709 0.2716984 0.07506917 -0.08934965 0.2713084 -0.0750502 -0.08969299 0.2713988 0.112761 -0.0943116 0.2715602 0.1331076 0.05043996 0.2715903 -0.1127068 0.09431598 0.271666 -0.1338512 -0.05035129 0.2715689 -0.03750483 -0.08935822 0.2714038 0.1330834 -0.05043994 0.2785098 0.03752818 0.0888512 0.2715585 -0.1335991 0.05043912 0.2785066 -0.03750003 0.08799461 0.2782752 0.1127105 0.09395774 0.2783276 0.03750002 -0.08931886 0.2782744 -0.1127166 -0.09463497 0.2783338 -0.1486589 -0.09910633 0.274506 0.1478298 -0.09837726 0.2745284 0.1482852 0.09877209 0.2744864 -0.1504958 0.1007156 0.2741961 -1.53857e-6 -0.08846611 0.2739672 0.1158261 -3.33451e-6 0.2739551 1.01954e-5 0.08714981 0.2739677 -0.117485 -5.21718e-6 0.2739544 -0.07435097 0.08715194 0.2739707 0.07418518 0.08924906 0.2739498 0.07433649 -0.08846767 0.2739404 -0.07431008 -0.0889551 0.2740091 0.1116825 -0.09338819 0.2741947 0.1317974 0.04996198 0.2742685 -0.1116499 0.09322499 0.2741608 -0.1324998 -0.04988996 0.2742643 -0.03714767 -0.08850817 0.2740734 0.1317961 -0.04996465 0.274268 0.03716758 0.08795731 0.27405 -0.1323081 0.04995298 0.2742657 -0.03714146 0.0871361 0.27406 0.1116227 0.09305614 0.2741955 0.03713984 -0.08845408 0.2740597 -0.1116435 -0.09369601 0.2741928 0.1564267 -0.1049183 -0.006520439 -0.1592518 0.107525 -0.009429557 0.158089 0.1065476 -0.008348611 -0.1493257 -0.09971511 0.4991833 0.1524514 -0.1022297 0.4992067 -0.1477454 0.09825883 0.4989357 0.1487459 0.09891602 0.4990053 -0.156722 -0.1051094 -0.006685187 0.1213811 -2.95135e-5 0.4989903 -2.23214e-6 0.08608009 0.4990186 -0.1157419 -1.06956e-4 0.4990499 -7.20444e-5 -0.09189656 0.1240358 0.1203808 3.70408e-5 0.122936 -7.61754e-5 0.09096826 0.1229464 -0.1205515 2.03633e-5 0.1226938 -0.07435346 0.08708131 0.4988932 -0.07733217 0.09031442 0.1226812 0.07446202 0.08608813 0.4990214 0.07716753 0.09064742 0.1227481 0.07448365 -0.08754291 0.4990685 0.07694409 -0.09528859 0.1228027 -0.074418 -0.08753771 0.4990374 -0.07759847 -0.09094949 0.1227473 -0.1488653 -0.09839121 0.4000289 -0.1478592 -0.09849401 0.3010068 -0.1492078 -0.09939678 0.2785402 -0.1537737 -0.1022858 0.09870154 0.1555818 -0.1040217 0.09867623 0.1484535 -0.09874581 0.278919 0.1470266 -0.09783371 0.3009994 0.1472469 -0.09800882 0.4000636 0.153764 0.1024707 0.09871572 0.1488316 0.09906085 0.2787047 0.1473448 0.09793775 0.3009785 0.1498257 0.1002001 0.400106 -0.1536089 0.1022677 0.09866448 -0.1506429 0.1006783 0.2776185 -0.1473051 0.09790643 0.3008804 -0.1508345 0.1007236 0.4000247 -1.56026e-4 -0.08903228 0.4246072 -1.50859e-5 -0.09100117 0.3498493 -8.26074e-7 -0.08836796 0.2711057 -6.81192e-6 -0.09287935 0.2002834 0.1188074 -6.9928e-5 0.4245291 0.1169022 -7.17007e-5 0.3500597 0.1159683 5.77993e-7 0.2783295 0.1224734 1.21296e-4 0.200197 -1.42801e-4 0.09520392 0.4242787 -3.30189e-5 0.08715382 0.350078 2.24192e-5 0.08704452 0.2711101 -3.82428e-5 0.08981496 0.2002657 -0.1165084 -2.2099e-4 0.4244041 -0.118192 -7.31075e-5 0.349906 -0.1176369 -4.01406e-6 0.2781758 -0.1233759 -1.03097e-4 0.2002851 -0.07422934 0.08752465 0.4245709 -0.07437052 0.08634015 0.3498759 -0.07517159 0.08701815 0.2782538 -0.07742363 0.08962338 0.2002738 0.07437895 0.08856031 0.4244713 0.07441677 0.08609559 0.349853 0.07499009 0.08903062 0.2778328 0.07712227 0.09112009 0.2003134 0.07422224 -0.08983847 0.4242741 0.0741289 -0.09167212 0.3500574 0.07513894 -0.08833888 0.2782608 0.07678316 -0.0949472 0.2002222 -0.07408971 -0.08970173 0.4244905 -0.07423607 -0.08880279 0.3497826 -0.075102 -0.08896406 0.2782668 -0.07653758 -0.1013309 0.2001517 0.06392583 -0.08753274 0.4990684 0.03920354 -0.08753348 0.4662251 -4.51679e-4 -0.0919451 0.4610909 -0.03947379 -0.09657069 0.465793 -0.06185942 -0.08789321 0.4987897 -0.1530854 4.69218e-5 -0.003047172 -9.61248e-5 0.1017973 -0.002962751 0.1529235 5.84027e-5 -0.003054003 -8.78555e-5 -0.1016444 -0.002830807 0.1159602 -0.09684209 0.05924312 -5.21459e-5 -0.09092886 0.1223696 -0.1154974 -0.1027533 0.05936582 0.1360791 0.05195409 0.05897924 0.1361217 -0.05188845 0.05899404 -0.1160112 0.09692437 0.05917332 -7.51217e-5 0.08962335 0.1224577 0.1159401 0.09569136 0.0591123 -0.1372351 -0.05182313 0.05907218 -0.1367737 0.05195761 0.05898545 0.1470434 -0.09782853 0.2882393 0.1117427 -0.09245638 0.3253921 0.07441688 -0.0875488 0.3126459 0.11289 -0.09331062 0.2784638 0.1473922 0.09797663 0.2882233 0.130825 0.05017997 0.3254575 0.1148125 -7.18971e-5 0.3125856 0.13214 0.05074965 0.2786094 -0.1483385 0.09877226 0.2880539 -0.1118557 0.09179761 0.3253976 -0.07441815 0.08608444 0.3125481 -0.1128926 0.0931486 0.2783374 -0.1478762 -0.0985167 0.2882612 -0.1314797 -0.05028656 0.3255154 -0.1167972 -7.5352e-5 0.3125747 -0.1328596 -0.05065462 0.2785589 -0.07408611 -0.091288 0.3125614 -0.037524 -0.08845403 0.2784479 -7.63851e-5 -0.08856408 0.3126307 -0.03710429 -0.09095971 0.3498605 0.1321737 -0.05072812 0.2713778 0.1308224 -0.05031355 0.3254392 0.07435632 0.08692045 0.3124915 0.03755076 0.08781233 0.2781802 4.74609e-7 0.086089 0.3125603 0.03709687 0.08654995 0.3500158 -0.1327052 0.05073458 0.2713798 -0.1313863 0.05013908 0.3254359 -0.03869063 0.09065092 0.1213108 0.03829174 0.09109866 0.1214321 -0.03750002 0.08703077 0.2712021 -0.03709795 0.08781565 0.3500111 0.1128403 0.09297091 0.2714636 0.1118608 0.09171735 0.3253945 0.03861826 -0.0915374 0.1214222 -0.03872358 -0.09090742 0.1228428 0.03750178 -0.08836124 0.2711732 0.03717496 -0.09036831 0.3500486 -0.1128558 -0.09366288 0.2714226 -0.1119673 -0.09336448 0.3253824 0.1498235 -0.1001061 0.4498097 0.1114195 -0.09508093 0.4991118 0.0745041 -0.08754485 0.4617758 0.1117187 -0.09245861 0.4122057 0.1478587 -0.09852698 0.3505194 0.07381221 -0.0949706 0.3871216 0.07669734 -0.09181093 0.156563 0.1558471 -0.1042168 0.04717704 0.1156521 -0.09859917 0.1492129 0.07712162 -0.09150881 0.2388484 0.153249 -0.1020651 0.1500346 0.1498988 0.09998399 0.4496517 0.1399887 0.04700258 0.4990188 0.1229419 5.20446e-5 0.4619657 0.1311731 0.05005442 0.4124192 0.1472765 0.09793296 0.3505806 0.121513 -5.55443e-5 0.3871716 0.125107 8.03234e-4 0.1614482 0.1538035 0.1025245 0.04704364 0.137846 0.05147781 0.1496463 0.1211399 5.9687e-5 0.2388245 0.1541049 0.1028069 0.1501731 -0.1502018 0.1001785 0.4494706 -0.1116685 0.09168378 0.4989515 -0.07407943 0.09034655 0.4618221 -0.1119301 0.0944002 0.4122494 -0.1495163 0.09978938 0.3506028 -0.07435243 0.08658218 0.3872139 -0.0768976 0.08896407 0.1565192 -0.154743 0.1032317 0.04702615 -0.1160791 0.09656602 0.1493104 -0.07738334 0.0896223 0.2389489 -0.1532553 0.1019641 0.1501479 -0.1472487 -0.09780224 0.449636 -0.1330327 -0.04965366 0.498882 -0.1160898 -1.89935e-4 0.4618399 -0.139338 -0.04787682 0.4122776 -0.1490344 -0.09821084 0.3508214 -0.1186539 -1.70845e-4 0.3871383 -0.1228041 9.09536e-5 0.1634392 -0.1538699 -0.102506 0.0470705 -0.1380548 -0.05171914 0.1496215 -0.1215101 -1.57363e-4 0.2388259 -0.1533238 -0.1019081 0.1501544 -0.07755717 -0.0944697 0.1575874 -6.01693e-5 -0.09095887 0.1563815 -0.03884735 -0.09553242 0.2003865 -0.0772802 -0.09201789 0.2387625 -5.57039e-5 -0.09103502 0.2388778 5.65615e-5 -0.08804975 0.3871779 -0.03714702 -0.09499893 0.42472 -0.07440085 -0.0879964 0.3872213 0.1359524 -0.05217248 0.1494804 0.1379418 -0.0478418 0.4992388 0.1310591 -0.05018761 0.4123027 0.07736927 0.09024248 0.1564819 -4.68704e-5 0.09004805 0.1564491 0.03854296 0.09111995 0.2003999 0.07705121 0.09162427 0.2389533 -5.15456e-5 0.08961824 0.2389483 -8.90731e-5 0.08701693 0.4616544 0.03714123 0.08607954 0.4990568 0.07445417 0.0869683 0.4618003 0.03698358 0.08730689 0.4244015 -1.25632e-5 0.09423611 0.3873425 0.07442807 0.08636686 0.3872403 -0.136627 0.05220332 0.1495031 -0.1312481 0.05006228 0.499047 -0.1318749 0.05004546 0.4122405 -0.03866135 0.08960202 0.2004033 -0.03718215 0.08620133 0.4989032 -0.0369711 0.09284208 0.4244918 0.1160149 0.0963294 0.1493531 0.1115566 0.09284157 0.4989729 0.1109666 0.09780584 0.4122463 0.03855665 -0.09827179 0.2003909 0.03720115 -0.08906952 0.424309 -0.1161352 -0.09622507 0.1493052 -0.07424004 -0.08811571 0.4617535 -0.1116098 -0.09313888 0.4990917 -0.1119572 -0.09338745 0.4121548 -3.34396e-4 -0.09120651 0.4429776 0.05672971 -0.08812684 0.4453599 0.01939016 -0.08779212 0.4635882 0.06910455 -0.08753274 0.4990689 0.05534463 -0.08753277 0.4803751 -0.06802397 -0.08761539 0.4989306 -0.05654273 -0.0936479 0.4451546 -0.05375178 -0.09087902 0.4801947 -0.02011606 -0.09698902 0.4634013 -1.28808e-4 -0.09616091 0.05890371 0.1418806 2.79845e-5 0.03732694 -8.82006e-5 0.09633628 0.0589521 -0.1423746 1.97761e-5 0.03734933 0.1118073 -0.09246302 0.3009702 0.1308408 0.05019353 0.3010302 -0.1118548 0.09167229 0.3009487 -0.13155 -0.05023647 0.3010246 -0.03721314 -0.09127016 0.3127114 0.1308349 -0.05033179 0.3010284 0.03716378 0.08635491 0.3126009 -0.1313559 0.05016259 0.3010319 -7.41178e-5 0.09060879 0.1241751 -0.03713962 0.08630529 0.3126581 0.111779 0.09195041 0.300953 -6.87327e-5 -0.09150551 0.1236013 0.03711407 -0.08752164 0.3126905 -0.1116827 -0.09289122 0.3009891 0.1115923 -0.09418507 0.4557862 0.111598 -0.0927393 0.3687892 0.115799 -0.1009971 0.1041767 0.1157584 -0.09787883 0.1944444 0.1410807 0.04683079 0.4559762 0.1318627 0.04974269 0.3688436 0.1359529 0.05233994 0.1043857 0.1383069 0.05139427 0.1945106 -0.111727 0.09427579 0.4557025 -0.1117125 0.09328441 0.3688466 -0.1162264 0.09785291 0.1041302 -0.1161559 0.09617337 0.1944616 -0.1382055 -0.04815903 0.4556174 -0.1360881 -0.04894886 0.369024 -0.1378638 -0.05191765 0.1043522 -0.1501938 -0.0479458 0.1947327 -0.03884609 -0.09178413 0.1567088 -0.0386911 -0.09132468 0.2389465 -0.03715983 -0.08874873 0.3873618 0.1359507 -0.05228189 0.1043356 0.1361813 -0.05203587 0.1945631 0.1335319 -0.04937097 0.4559326 0.1307936 -0.05023389 0.3688409 0.03860872 0.09091394 0.1568004 0.03856287 0.09054685 0.2390483 0.03714022 0.08606611 0.4618428 0.03693068 0.08969977 0.3872297 -0.1367527 0.05230644 0.1043286 -0.1371744 0.0520033 0.1945675 -0.1316014 0.0501354 0.455752 -0.1315677 0.05008806 0.3688464 -0.03873115 0.0896173 0.1564837 -0.03866601 0.0896036 0.239065 -0.03722921 0.08961626 0.4616977 -0.03693562 0.08923246 0.3873434 0.1162912 0.09640439 0.1041507 0.1159661 0.09627325 0.1944557 0.1113215 0.09538327 0.4556378 0.1115461 0.09420992 0.3689305 0.03863497 -0.09254885 0.1568654 0.03852255 -0.09202362 0.2388728 0.03734931 -0.09260406 0.387219 -0.1158183 -0.09941881 0.1039935 -0.1156656 -0.09966616 0.1945006 -0.1117209 -0.09263553 0.4557205 -0.1125403 -0.09563223 0.3687235 0.02832597 -0.0876217 0.4439693 0.0628821 -0.08752093 0.4722206 -0.06215699 -0.0899039 0.4719688 -0.02863452 -0.09813149 0.4440714 -0.1087425 -0.05715959 0.01263426 -0.1093734 2.98983e-5 0.0120067 -0.1086967 0.05721668 0.01223509 -8.47301e-5 0.05777585 0.01217597 0.1086031 0.05722866 0.0126304 0.1092808 3.6516e-5 0.01193231 0.1085687 -0.0571726 0.01263503 -7.32902e-5 -0.05786783 0.01202852 0.1054877 -0.09670221 0.1650101 0.1157678 -0.0977917 0.1562219 0.1457885 -0.1002919 0.157122 0.1529131 -0.1017938 0.1660536 0.1492778 -0.09257875 0.1565113 0.1359631 -0.05217475 0.1533731 0.1324518 -0.04115584 0.1628709 0.1248433 -0.00203232 0.1593275 0.1244131 4.1289e-4 0.1532704 0.1261255 0.002078737 0.1595418 0.1374488 0.03975644 0.1611036 0.1383159 0.05122331 0.1548586 0.1503671 0.09194045 0.1570412 0.1538865 0.1027273 0.165457 0.1458158 0.1015729 0.1572914 0.1160718 0.09627384 0.153785 0.106991 0.0945247 0.1638093 0.07843368 0.09038953 0.1638811 -0.1067082 0.09473789 0.1642047 -0.1161336 0.09637114 0.1551339 -0.1483897 0.1007268 0.154452 -0.1532946 0.1020304 0.1632222 -0.1499725 0.09335999 0.1559078 -0.1367446 0.05215386 0.1594407 -0.131858 0.03493402 0.1688314 -0.1213589 -2.6207e-5 0.1703001 -0.1351888 -0.03845722 0.1643972 -0.1389591 -0.05141788 0.1572463 -0.1506046 -0.09384249 0.155418 -0.1533934 -0.1020043 0.164629 -0.1477802 -0.1006637 0.1551969 -0.1162017 -0.09624457 0.1537776 -0.1072032 -0.0956451 0.1635231 0.07873578 -0.09296127 0.1570861 0.07729144 -0.09273846 0.1656845 -0.0792862 0.09021752 0.1569546 -0.07760432 0.08985063 0.1659284 -0.07723101 -0.09520961 0.1653391 -0.07800589 -0.09425077 0.1573128 -4.73275e-5 -0.09109499 0.1660476 0.0773541 0.09025914 0.1658405 -4.03404e-5 0.0900972 0.1659134 -0.03886568 -0.09229674 0.1660275 0.03860484 0.09102745 0.1658751 -0.03875152 0.0896181 0.1661532 0.03864602 -0.0933066 0.1659082 0.1079861 -0.09709246 0.1569434 0.1157963 -0.0975609 0.1653003 0.1431089 -0.09992845 0.1656116 0.15301 -0.1018694 0.1564215 0.148218 -0.08955187 0.1646556 0.1359655 -0.05216098 0.1631239 0.1333804 -0.04399262 0.1541685 0.1250463 -0.004989253 0.1529466 0.1248554 9.88579e-4 0.1601136 0.1269767 0.004187906 0.1543539 0.1374565 0.04275738 0.1557308 0.1385974 0.05116883 0.162911 0.1492851 0.0889704 0.164479 0.1539267 0.1027463 0.1570219 0.1431606 0.1011511 0.1650623 0.1160626 0.09624449 0.1630753 0.1094264 0.09500042 0.155129 0.07908783 0.09044512 0.1562066 -0.1091642 0.09522883 0.1557078 -0.1161499 0.09628931 0.1643985 -0.1456979 0.1004172 0.1627599 -0.1532612 0.1019889 0.1538174 -0.1490514 0.0903431 0.1638775 -0.1368175 0.0521555 0.1690794 -0.1325885 0.03783585 0.1605353 -0.1231784 1.60459e-4 0.1591498 -0.1357239 -0.04139708 0.1572824 -0.1397128 -0.05118549 0.1656075 -0.1500265 -0.09062967 0.1632071 -0.1533211 -0.1019414 0.1552994 -0.1450472 -0.1004367 0.1635414 -0.1161549 -0.09633173 0.1633875 -0.1097569 -0.09553002 0.1546747 0.07760969 -0.09221485 0.156395 0.0757472 -0.09269658 0.1609343 0.07778391 -0.09251276 0.1611743 -0.0780518 0.08937386 0.1563216 -0.07614225 0.08955441 0.1615927 -0.07723273 0.08901024 0.16157 -0.07558082 -0.09466774 0.1607858 -0.07508666 -0.0944588 0.1617228 -0.07752874 -0.09454463 0.1571764 -5.55396e-5 -0.0901664 0.161465 0.07667761 0.08935093 0.1615708 -4.03153e-5 0.08914483 0.161449 -0.03849188 -0.09116079 0.1616354 0.03824257 0.09006076 0.1616096 -0.03837705 0.08867793 0.1615838 0.03828738 -0.09209105 0.1616526 0.105731 -0.09608492 0.1612606 0.1146686 -0.09685353 0.1610264 0.1430627 -0.09921584 0.1616418 0.1515384 -0.1008612 0.1615375 0.1473139 -0.09025526 0.1608525 0.1346315 -0.05173559 0.1585074 0.1315915 -0.04223179 0.158852 0.1238314 -0.003370936 0.1564815 0.1235447 5.30028e-4 0.1568973 0.1255241 0.002949133 0.1571884 0.136564 0.04070718 0.1589194 0.1374247 0.0505149 0.1591886 0.1484202 0.08953322 0.1609926 0.1525802 0.1018043 0.1615618 0.1431458 0.1003731 0.161439 0.1149749 0.09522755 0.1586709 0.1071839 0.09374912 0.1597364 0.07726283 0.08943374 0.1604122 -0.1069116 0.09399776 0.1602244 -0.1150424 0.09534135 0.1600483 -0.1456446 0.09958597 0.1589066 -0.1518711 0.1009865 0.158824 -0.1480976 0.09093166 0.1601809 -0.1354591 0.05160546 0.1645084 -0.1309517 0.03599102 0.1649189 -0.1200827 -8.10787e-5 0.1658115 -0.1342026 -0.03956439 0.1610353 -0.1380527 -0.05086846 0.1616753 -0.148942 -0.09140632 0.159558 -0.1520008 -0.1010379 0.1603616 -0.1450269 -0.09966715 0.1596262 -0.115059 -0.0953971 0.1588057 -0.1074296 -0.09474377 0.1593816 0.0770571 -0.09374971 0.1604435 -0.07761438 0.08914084 0.1604884 -0.07646876 -0.09541101 0.1598207 -0.1492787 -0.09940637 0.2719006 0.1485177 -0.09878471 0.2715814 0.1489884 0.09917735 0.27178 -0.1511537 0.1011105 0.2727108 -3.22644e-6 -0.08833795 0.2783014 0.1160454 6.51546e-8 0.2709333 2.20444e-5 0.08701199 0.2782668 -0.117661 -3.83476e-6 0.2711212 -0.07517543 0.08704634 0.2711402 0.07498346 0.08911023 0.271496 0.07513817 -0.08837171 0.2711112 -0.07512212 -0.08871114 0.2712233 0.1128908 -0.09333504 0.2713885 0.1321823 0.05073771 0.2713552 -0.1128792 0.0933485 0.2714809 -0.1329445 -0.05065078 0.2712719 -0.0375125 -0.088378 0.271206 0.1321356 -0.05074281 0.2786091 0.03755572 0.08787367 0.2713495 -0.1326507 0.05074044 0.2786051 -0.03750004 0.08699853 0.2783637 0.11284 0.09296837 0.2783937 0.0374965 -0.08832318 0.2783672 -0.1128367 -0.09364627 0.2784235 -0.1479304 -0.09843975 0.2743481 0.147089 -0.0977198 0.2743908 0.1475583 0.09810915 0.2743074 -0.1498875 0.1001226 0.2736686 -2.71405e-6 -0.08746785 0.2739082 0.1148285 -3.50493e-6 0.2738853 2.13129e-5 0.08615158 0.2739092 -0.1164875 -7.42188e-6 0.2738844 -0.07442104 0.086156 0.2739144 0.07424801 0.08825384 0.273875 0.07439264 -0.08747099 0.2738815 -0.07436947 -0.08795702 0.2739916 0.1118159 -0.09239853 0.2741422 0.1308495 0.05027287 0.274199 -0.1118228 0.09224387 0.2740743 -0.1315479 -0.05018793 0.2741925 -0.03715417 -0.08750919 0.2740287 0.1308474 -0.05027269 0.2741975 0.03719557 0.08695997 0.2739828 -0.1313587 0.05025863 0.2741932 -0.0371415 0.08613778 0.274002 0.111744 0.09206488 0.2741438 0.03713992 -0.08745576 0.2740017 -0.1117782 -0.0927065 0.2741403 + + + + + + + + + + -0.1059497 -0.9943181 0.0103105 0.008378435 -0.9972624 0.07346781 0.002869497 -0.995299 0.09680744 0.02560177 -0.9963331 0.08163764 0.1723663 -0.9850187 0.005300514 0.01360614 -0.9979925 0.06185514 0.002963144 -0.9996532 0.02616922 0.01774034 -0.9971093 0.07387991 -0.07139462 -0.9950039 0.06978656 0.9641058 -0.002792048 0.2655037 0.9708881 -0.1533233 0.1840335 0.9762967 -0.1651562 0.1398864 0.9671047 4.14451e-4 0.2543781 0.9994639 -0.007005557 -0.03197918 0.9756494 0.1734724 0.1342226 0.9732212 0.1696494 0.1551117 0.004498092 0.9952226 0.09752755 0.06355542 0.9924405 0.1049884 0.08826741 0.9944635 0.05701853 0.005320756 0.9956553 0.09296277 0.05078165 0.996941 0.05941325 -2.66241e-4 0.9999575 -0.009222201 -0.05270493 0.9980901 0.03222444 -0.08761133 0.9944642 0.05801245 -0.0656715 0.9917399 0.1101773 -0.9661888 -0.0025867 0.2578229 -0.975953 0.1436507 0.1639515 -0.9784685 0.1637834 0.1255958 -0.9699724 0.004523509 0.2431726 -0.9995619 0.004180549 0.02930062 -0.9764424 -0.1667314 0.1369712 -0.9705811 -0.1574584 0.1821516 -0.1360755 -0.9899719 0.03793719 -0.1401475 -0.9901233 -0.003825394 -0.1119827 -0.9933678 -0.02608076 -0.1289672 -0.9915293 0.01539432 -0.05916946 -0.993484 -0.09740945 -0.06143644 -0.9975188 -0.03437768 -0.06942198 -0.9940201 -0.0842894 -0.12968 -0.988803 -0.0738352 -0.1371793 -0.9895004 -0.04550556 0.9471673 -0.3157829 0.05617115 0.9484075 -0.3170488 0.001822031 0.9540961 -0.2987577 -0.02108009 0.9517184 -0.306057 0.02368787 0.9464968 -0.3088953 -0.09342054 0.9544874 -0.2981659 -0.00711903 0.9467368 -0.3019297 -0.1119281 0.9467404 -0.3062018 -0.09961487 0.9469439 -0.3173534 -0.050836 0.1625306 0.982973 0.08571986 0.1366967 0.9901506 0.03026255 0.1645209 0.9862559 -0.01523222 0.1542892 0.9876808 0.02610911 0.05461841 0.9984851 -0.006658752 0.06802416 0.9976698 0.005263244 0.0857631 0.9930308 -0.08083612 0.1651555 0.9847417 -0.05483972 0.1825795 0.9831707 0.006330919 -0.9495724 0.3089503 0.0534986 -0.9483993 0.3169551 -0.0088479 -0.9527675 0.3012371 -0.0386053 -0.9563375 0.2910571 0.02653907 -0.9638469 0.265673 -0.02042429 -0.9602334 0.2791953 -0.001398531 -0.9504836 0.2855655 -0.1226101 -0.9502624 0.2933854 -0.1045286 -0.9492799 0.3089993 -0.05819917 0.03320308 -0.9994332 -0.005535685 0.07085118 -0.9866099 -0.1469045 0.01552469 -0.9903024 -0.138059 0.0366646 -0.9986458 -0.03690606 0.001624527 -0.9945394 -0.1043501 0.02696082 -0.9990727 -0.03357122 0.007962476 -0.9999461 0.006664439 -0.005891315 -0.9995473 0.02950472 0.01950566 -0.9990087 0.04001306 0.9483865 0.3116939 0.05839427 0.9484385 0.3132004 -0.04868321 0.9478385 0.3028646 -0.09937425 0.9524592 0.3036706 0.02460933 0.9467645 0.3019524 -0.1116315 0.9545102 0.2981082 -0.006464828 0.9464559 0.3089823 -0.09354804 0.9543045 0.2984307 -0.01556045 0.9489196 0.315497 -0.00365289 -0.06801312 0.9972081 0.03082659 -0.07033867 0.9953998 -0.06505169 -0.02326212 0.9964738 -0.08061502 -0.01112992 0.9997695 0.01835866 -0.01102107 0.9961371 -0.0871169 0.001060297 0.999998 0.001644768 0.01695056 0.9940294 -0.1077877 0.03053237 0.9984043 -0.04750581 -0.06770372 0.9976939 0.004797697 -0.9458203 -0.3110501 0.09312222 -0.942745 -0.3326006 -0.02466968 -0.9484167 -0.3013217 -0.09854469 -0.9553568 -0.2945738 0.02279865 -0.9516857 -0.2813321 -0.1230708 -0.9610329 -0.27642 -0.002796917 -0.9642385 -0.2642172 -0.02081824 -0.9551732 -0.2959041 -0.009216108 -0.9551124 -0.2950661 0.02638775 -0.03175106 0.1913815 0.981002 0.00100448 0.07461795 -0.9972118 0.2798661 0.02750247 0.959645 8.48588e-4 0.1015139 -0.9948337 7.54586e-6 0.9960739 -0.08852519 -6.66544e-5 0.9999477 -0.01022653 -0.03101365 0.9983494 -0.04833883 -0.1520501 0.9872558 0.04697724 -0.1535186 0.9875826 -0.03335572 -0.1295291 0.9893664 -0.06615332 -0.1356518 0.9904654 0.02401993 -0.1489531 0.9888122 -0.007964336 -0.1583629 0.9873796 0.001661884 -0.01541295 -0.629796 0.7766076 -0.005513373 -0.9628872 -0.2698478 0.009230289 -0.9996762 0.02371368 -0.008825048 -0.3981421 -0.9172813 0.003512713 -0.9956777 -0.09280962 0.01371797 -0.9995572 -0.02640517 -0.02446683 -0.998073 -0.05702328 0.1379476 -0.9899105 0.03236614 0.1431157 -0.9885451 -0.0479213 0.120087 -0.9886993 -0.08973782 0.08921187 -0.9959978 0.00545414 0.1066317 -0.9942843 -0.005329926 0.1259428 -0.9920282 0.00429406 -0.1509479 -0.988003 -0.03263197 -0.1606948 -0.9864089 -0.03427397 -0.1717969 -0.9849368 -0.01962367 -0.1634346 -0.9860873 -0.03034912 -0.100971 -0.9948893 -1.12686e-5 -0.07952391 -0.9967737 0.01086702 -0.03058416 -0.9949361 0.09574358 -0.0909375 -0.9957679 0.01329005 -0.1442669 -0.9895002 -0.00875135 -0.1444153 -0.9895121 -0.003117912 -0.04308951 -0.9990712 -1.33192e-5 -0.01869313 -0.9995251 0.0244964 -0.190124 -0.9817227 -0.008562009 -0.1699852 -0.9852677 -0.01878151 -0.4843364 -0.8631862 -0.1425753 -0.3301987 -0.9439093 -0.001986229 -0.154258 -0.9879882 -0.009165552 -0.1109168 -0.993782 0.009729172 -0.09999131 -0.9924515 0.07100397 -0.1060946 -0.9894257 -0.0988965 0.00262423 -0.9997538 0.0220342 -0.05798516 -0.9895093 -0.1323214 -0.08185659 -0.9935412 -0.07858435 -0.07710361 -0.9968124 0.02049554 -0.03757405 -0.9949571 0.09299796 -0.107831 -0.990757 -0.0822976 -0.1266015 -0.9816275 0.1427561 -0.1297553 -0.976566 0.1717047 -0.1366923 -0.9889873 -0.05673867 -0.06900457 -0.9779425 0.1971467 0.9742672 -0.2208984 -0.04480368 0.9871134 -0.1586961 0.0205627 0.9648362 -0.2614657 0.02695777 0.9567581 -0.2716627 -0.103987 0.9287633 -0.3686768 0.03841923 0.937123 -0.3439209 -0.05932109 0.9685646 -0.2468933 -0.0304349 0.9597484 -0.2730778 -0.06566045 0.938459 -0.344853 -0.01926334 0.9483645 -0.3169929 -0.01097216 0.9677846 -0.251743 -0.004285189 0.9714 -0.2374448 -0.00144901 0.7781196 -0.6281105 0.002662527 0.5524701 -0.8131079 -0.1833911 0.8695679 -0.4938022 0.003339002 0.9485494 -0.3156373 0.02504475 0.9470273 -0.3195137 -0.03240652 0.9569166 -0.2903621 -7.13804e-4 0.9646102 -0.2514509 -0.07937079 0.9544836 -0.2939361 0.05062088 0.9734126 -0.2234389 0.05042814 0.9830489 -0.1830609 0.01017704 0.9624678 -0.2674027 0.04638468 0.9553069 -0.2822511 0.08788027 0.9608773 -0.2755512 0.02804422 0.9332829 -0.3017043 0.194827 0.9252521 -0.297751 0.2350596 0.956329 -0.2902447 0.03453745 0.9162713 -0.2945345 0.2714704 0.1442002 0.9892803 0.02303872 0.1662757 0.9856353 0.02958705 0.1292636 0.9899088 0.05806443 0.1167812 0.9926816 0.03074604 0.07292303 0.9934476 0.08800121 0.05347264 0.9979017 0.03650563 0.02809638 0.9982127 -0.05274398 0.1615257 0.9867313 -0.01645479 0.1496114 0.9887332 -0.00481553 0.1690793 0.9852264 -0.0272261 0.1806958 0.9831011 -0.02934662 0.05121152 0.9981576 -0.03253813 0.1538551 0.9880816 0.004839979 0.1656616 0.9861763 0.003539549 0.4287039 0.898143 -0.09773508 0.3525346 0.9357908 -0.003883288 0.1302237 0.9907584 0.03794231 0.1201905 0.9926571 0.0136412 0.1443833 0.9891661 0.0265291 0.1669378 0.9813538 -0.09527155 0.08356635 0.9964983 0.002788591 0.09182848 0.9918172 -0.0886919 0.1496563 0.9850454 -0.08537391 0.1513629 0.9884393 0.008782914 0.07671534 0.9963773 0.03670182 0.1444525 0.9840137 -0.1041665 0.1743463 0.9656578 0.1926355 0.1724446 0.9674891 0.1850077 0.1421903 0.9869814 -0.07516424 0.08767206 0.9792196 0.1828728 -0.9787811 0.2022915 0.03264643 -0.9532876 0.3006586 -0.0291052 -0.9508972 0.3028975 0.06362204 -0.9543859 0.2890028 0.07499873 -0.9438284 0.3303302 0.00836015 -0.9191839 0.3918522 0.03940829 -0.9037983 0.4270472 0.02791881 -0.9540466 0.2996299 -0.004135932 -0.9846099 0.1740619 0.01568164 -0.9610095 0.2722148 -0.04857759 -0.9419284 0.3223492 -0.09413785 -0.9309834 0.3643943 -0.02205853 -0.1651381 -0.06963418 -0.9838092 -0.952847 0.3033127 -0.009169536 -0.9543553 0.2982315 0.01624539 -0.9583084 0.2857195 0.00307441 -0.9537528 0.2944608 -0.06040224 -0.8838757 0.3925512 -0.2542974 -0.8892177 0.4550894 -0.04674748 -0.9357639 0.346975 -0.06288268 -0.8964025 0.2703727 -0.3512279 -0.9556391 0.2862444 -0.06941221 -0.9197307 0.368122 0.1363148 -0.9840453 0.1683956 -0.0574292 -0.9382582 0.2419273 0.2472703 -0.9066956 0.2994865 0.2970032 -0.9668852 0.253307 0.031123 -0.9236692 0.2802714 0.2613106 0.4536865 -0.87716 -0.1573494 0.05075891 -0.997672 0.04554333 -0.007370188 -0.9969698 0.07743851 -0.01711814 -0.9894382 -0.1439408 -0.03542775 -0.9993695 -0.002310554 0.07120248 -0.9973909 0.01190335 0.05353005 -0.9838737 -0.1706667 0.05742618 -0.9973247 0.04522768 0.03992787 -0.9815586 -0.186945 0.0621852 -0.9902618 0.1245574 0.01255577 -0.9949632 0.09945178 -0.01294168 -0.9957472 0.09121455 5.17526e-4 -0.9798656 0.1996576 0.007672409 -0.9802164 0.19778 0.07190966 -0.9818419 0.1755434 -0.00418761 -0.9999821 0.004250091 0.07848608 -0.9943862 -0.07096527 -0.009473919 -0.9934832 -0.1135843 -7.62045e-4 -0.998557 -0.05369683 -0.03852773 -0.9991792 -0.01250746 0.0461324 -0.9987696 -0.01819648 0.9387761 0.3445112 0.003366256 0.9503607 0.3111033 -0.005418003 0.9795949 0.08799522 -0.180695 0.995831 -0.09116138 -0.003158382 0.9965213 0.08284462 0.009067026 0.9721217 0.2329769 0.02647927 0.9602308 0.275301 -0.04654161 0.9577495 0.2871804 0.0155984 0.9413509 0.3372731 0.01026007 0.9560392 0.2923979 -0.02219106 0.9612772 0.2750397 0.01730332 0.9504145 0.3103245 0.0202722 0.9613535 0.2642454 0.07729009 0.9161265 0.2944402 0.272061 0.9294615 0.2922961 0.2250871 0.9363183 0.3053397 0.1734235 0.9444012 0.3274155 0.03009009 0.9632897 0.2630692 -0.05354819 0.9437364 0.3282516 0.04015706 0.960009 0.2731503 -0.06141302 0.9613436 0.262503 -0.08313027 0.9674438 0.2498532 -0.04032247 0.9541507 0.2939075 -0.05669811 0.9493194 0.3141381 -0.0104825 0.9640273 0.2647411 -0.02373724 0.9689963 0.2450975 -0.031198 0.9736165 0.228171 -0.002962125 0.9669528 0.2549379 -0.002994858 0.9475414 0.3196168 -0.003206905 -0.04106877 0.9937939 0.1033781 -0.00194513 0.9969264 0.07831945 -0.01363537 0.9959843 0.08848247 -0.01872161 0.9943367 -0.1046137 -0.01965874 0.9997852 0.006566855 -0.01522154 0.9998842 -2.70366e-5 -0.00123929 0.9934934 -0.1138828 -0.06895883 0.9974678 -0.01739533 -0.09535796 0.9925962 -0.07523208 -0.05928517 0.9975317 0.03762664 -0.02599633 0.9984871 0.04845071 -0.01382776 0.9989655 0.04332212 -0.01100914 0.9802022 0.197693 -0.02754869 0.977523 0.2090211 -0.06937119 0.9768518 0.2023566 0.04276346 0.9953679 0.08610476 0.001563852 0.9996865 0.02498875 3.07324e-4 0.9999283 0.01197517 6.53287e-4 0.9998666 0.01632387 -0.08986818 0.9956751 0.02355329 -0.1149181 0.9927467 0.0353266 -0.1400454 0.9901406 -0.002956029 0.07035641 0.9964442 0.04635575 0.07176059 0.9930454 0.09333448 0.01959899 0.9971786 -0.07246241 0.1054378 0.9943764 -0.009926209 -0.09751512 0.9944414 -0.03971154 -0.9491802 -0.3131351 0.03167346 -0.9549412 -0.2967876 0.002106495 -0.9545981 -0.2908788 -0.06427989 -0.9641356 -0.2654014 0.002124672 -0.9588515 -0.2793751 -0.05053085 -0.9566699 -0.2911651 -0.002382419 -0.9534311 -0.3013425 0.01271347 -0.9578239 -0.2866198 -0.02055505 -0.9604213 -0.2782196 0.01359887 -0.9541739 -0.2990776 0.01022751 -0.9628134 -0.2606412 0.07110951 -0.924739 -0.2762966 0.2617595 -0.9269646 -0.2990664 0.2264861 -0.9114187 -0.3180675 0.2610537 -0.9520057 -0.3056375 0.01645803 -0.9556652 -0.2943287 0.008642305 -0.9550833 -0.296192 0.009281108 -0.9501498 -0.311469 0.01422221 -0.9483725 -0.3170834 0.006906908 -0.9485818 -0.3145584 0.03529222 -0.942706 -0.3333112 0.01445646 -0.9391552 -0.3434197 -0.007096453 -0.9513807 -0.3079611 0.005887238 -0.9575104 -0.286891 0.02945368 -0.964347 -0.2642429 0.014504 -0.9562706 -0.2924281 -0.005687901 -0.9432416 -0.3316639 -0.01715721 -0.01441143 0.9952515 0.09626327 -0.002076818 0.9999949 0.002399887 -0.002814003 0.9947622 -0.1021774 1.75351e-5 0.9991957 0.04009723 3.22963e-5 0.9802495 0.1977651 0.02909287 0.9968477 0.07381265 0.04479266 0.9950414 0.0888048 -0.06602784 0.9977741 0.009337679 -0.1020938 0.992532 -0.06676037 -0.1519796 0.9878516 0.03242851 -0.1627413 0.9866456 -0.006748483 -0.1267595 0.9875297 0.09336513 -0.1747753 0.9767387 -0.1242385 -0.2339164 0.9639256 -0.1270064 -0.1629802 0.9866038 0.007099082 -0.1493054 0.9887909 -5.87991e-4 -0.1747714 0.9790103 -0.1048515 -0.1369237 0.9904754 0.01450111 -0.1307995 0.9869961 -0.09343527 -0.1265062 0.9786792 0.1618129 -0.1522988 0.9780232 0.1423928 -0.1034103 0.9920998 -0.07102458 -0.1624026 0.9859916 0.03802606 -0.156163 0.9860573 0.0574822 -0.1504572 0.9884723 0.01687758 -0.09672124 0.9947061 0.03471129 -0.05731699 0.9980866 -0.02319277 -0.1611464 0.9868058 -0.01569013 -0.1833258 0.9805056 -0.07071363 -0.1236706 0.991444 -0.04176604 -0.011617 -0.9994628 0.03064575 -0.01981711 -0.9997872 0.005726953 -0.02318216 -0.9779174 -0.2077023 -0.005830368 -0.9906436 0.1363502 -0.001816737 -0.9778039 0.209514 -0.01950248 -0.9978049 0.06328446 -0.09290865 -0.9955207 0.01750738 -0.01391553 -0.9986485 0.0500753 -0.001417107 -0.99737 0.07246357 0.19296 -0.9716319 -0.1367406 -0.1578999 -0.9872949 -0.01778848 0.05887642 -0.975352 -0.2126548 0.08826672 -0.9956012 0.03141856 0.1428694 -0.9897363 0.003193816 0.1002439 -0.9825661 -0.1565729 0.02694504 -0.9996345 0.002218093 0.1126493 -0.9877488 -0.1079925 0.134572 -0.9737588 0.1835325 0.125298 -0.9801718 0.1535043 0.1272639 -0.989916 -0.06221253 -0.04716102 -0.9981527 0.03830101 0.06900884 -0.997494 0.01560528 0.1423733 -0.989756 -0.01062898 0.1258827 -0.9920425 0.002295936 0.15944 -0.9867286 -0.03075119 0.1350131 -0.9908407 -0.002500964 0.1235151 -0.9923427 -5.55017e-5 0.1184156 -0.9928622 0.01423314 0.1271029 -0.9918895 5.50414e-4 0.09436521 -0.9955204 -0.005873174 0.1548618 -0.9860512 -0.0609988 0.05061712 -0.9971957 0.05512488 -0.01345596 -0.9989533 0.04371703 -0.001431657 -0.9996285 0.02721443 0.08961862 -0.9958974 0.01251964 0.2267613 -0.9731941 -0.0383762 -5.36227e-4 -0.9999999 -4.00526e-5 0.009302407 -0.9999141 0.009232581 0 -1 0 9.76814e-4 -0.9999727 0.007308333 -0.06247948 -0.9962502 0.05984917 -0.1934075 -0.9786775 0.06916548 -0.1947108 -0.9808221 0.008691772 -0.1435048 -0.9894156 -0.02152192 -0.1922144 -0.9783773 0.07636511 -0.04194566 -0.9892849 0.139843 0.03575472 -0.9972419 -0.06503972 0.102622 -0.9945384 -0.01902867 0.1640434 0.002379729 -0.9864503 0.1315102 -0.1557877 -0.9789971 0.00611091 -0.1628312 -0.986635 -0.1526811 -0.1312495 -0.9795213 -0.1647166 -0.006840071 -0.9863173 -0.1256895 0.1407946 -0.982028 -0.003836891 0.1604413 -0.9870379 0.1438197 0.1269963 -0.9814214 0.1811894 0.1859943 -0.9657 0.3244332 0.002435705 -0.9459054 0.1850497 -0.2047758 -0.9611574 0.0112002 -0.3229898 -0.9463362 -0.1875605 -0.1960493 -0.9624893 -0.3210901 -0.0134356 -0.9469533 -0.1776878 0.1886187 -0.9658416 -0.006659163 0.31794 -0.9480874 -0.1088584 -0.9858259 0.1276611 -0.08161859 -0.9861218 0.1445765 -0.09893961 -0.993995 0.04674502 -0.108903 -0.9862971 0.1239289 -0.1419645 -0.9868728 0.07699554 0.9441977 0.3282041 0.02779971 0.9460965 0.3223025 0.03197607 0.9463233 0.3208558 0.03903568 0.951439 0.3078352 -0.001127836 0.9649109 0.2242276 0.1366339 0.9856511 0.1472522 0.08251461 0.9386207 -0.3446189 0.01512266 0.9085401 -0.4032436 0.1093141 0.9830068 -0.1827098 -0.01774131 0.978549 -0.2030429 0.03486348 0.957962 -0.2868844 0.002494747 0.9479371 -0.2779959 0.1553488 0.9517379 -0.2815969 0.1220581 -0.08716708 0.9926797 0.08359976 -0.1362205 0.9905522 -0.01581872 -0.1366808 0.987702 0.07591643 -0.1795474 0.9800795 0.08489342 -0.1518814 0.9804083 0.1254264 0.1551601 0.9813436 0.1135343 0.1423058 0.9841551 0.1057726 0.1398914 0.9901478 0.006142624 0.1371959 0.9857489 0.0973475 0.1532101 0.9862998 0.06115153 -0.9518076 -0.3066589 0.004756023 -0.9514131 -0.3078885 0.004214558 -0.951345 -0.3081267 8.21669e-4 -0.9561923 -0.2924886 -0.01211212 -0.9620768 -0.2727585 -0.003274705 0.9965838 0.00305492 -0.08253178 -0.9392429 0.3148813 -0.1366474 -0.9489208 0.2922801 -0.1188338 -0.9613101 0.2754684 -1.6155e-4 -0.9642654 0.2647877 0.008925391 -0.96342 0.2679771 0.003208116 0.1457751 -0.9875991 0.05828919 0.1406683 -0.9900552 0.00181986 0.1431348 -0.9874419 0.06686369 0.1233207 -0.9902535 0.06472939 0.05583366 -0.992546 0.1083289 -0.389464 0.9182966 -0.07105781 -0.9141312 -0.3889819 0.1142678 0.5296673 0.8475783 -0.0326118 0.3059137 0.9475581 -0.09246873 -0.5479325 -0.7612529 0.346791 0.01933504 -0.9993413 0.03070965 0.05333408 -0.9966962 -0.06125457 -0.008932146 -0.9996603 -0.02448476 -0.1190629 0.9914733 -0.05295927 -0.003159145 0.999712 -0.02378877 -0.01818028 0.9997168 -0.01535243 -0.008449749 0.9998637 -0.01417583 -0.0335337 0.9975438 0.0614982 -0.02301374 -0.9954301 -0.09267844 -0.1168597 -0.9931462 -0.002084901 0.713274 -0.2274545 0.6629514 -0.0824389 -0.9964642 0.0162151 -0.1073545 -0.9942188 -0.001992244 -0.1359084 -0.9907115 -0.004434886 0.9181284 0.2876316 -0.2725958 0.9176701 0.2856655 -0.2761827 0.922296 0.3028105 -0.2401579 0.9234341 0.3077348 -0.2292785 0.9223406 0.2986988 -0.2450857 0.9224227 0.2955502 -0.2485686 0.9338541 0.2393462 -0.265763 0.9359348 0.2240604 -0.271704 0.9079012 0.1356441 -0.3966312 0.9081215 0.1363305 -0.3958907 0.910085 0.1342981 -0.392058 0.9119859 0.1435039 -0.3843021 0.825097 -0.4608251 -0.3268869 0.6665902 -0.6136364 -0.4232114 0.6161101 -0.7118205 -0.337224 0.7497282 -0.6168005 -0.2397179 0.8945339 -0.1386581 -0.4249506 0.8902549 -0.1639368 -0.4249365 0.9482471 -0.1350297 -0.2873924 0.9467273 -0.171608 -0.2725028 0.9250987 -0.257924 -0.2786888 0.9254886 -0.2573617 -0.2779135 0.9278398 -0.2627748 -0.2646935 0.928569 -0.2624744 -0.2624252 -0.1484081 0.9887099 -0.02068511 -0.09772804 0.9951948 -0.006051721 -0.1810105 0.9834325 0.009788129 -0.1630932 0.9865975 -0.005100342 0.1627783 0.9866622 9.84615e-4 -0.8756543 0.4769073 0.07608557 0.1504941 0.9886062 -0.003049896 0.1429164 0.9895737 -0.01785952 0.1448534 0.9892591 -0.01959042 -0.905146 -0.3156871 -0.2846972 -0.9039173 -0.3154036 -0.2888846 -0.9142743 -0.321263 -0.2467642 -0.9161378 -0.3249106 -0.2347869 -0.9228238 -0.2980354 -0.244072 -0.92143 -0.3016012 -0.2449561 -0.9177439 -0.271805 -0.2896002 -0.9161312 -0.273867 -0.2927467 -0.9192567 -0.2885534 -0.2677763 -0.9197736 -0.2889042 -0.2656142 -0.8728997 0.317119 -0.3707851 -0.8648281 0.3310039 -0.3775034 -0.8937268 0.3554008 -0.2737565 -0.8958383 0.3546824 -0.2677205 -0.8911251 0.2718185 -0.3633326 -0.8924096 0.2686585 -0.3625293 -0.912807 0.2373297 -0.3323522 -0.9150153 0.238464 -0.3253951 -0.9359366 0.2111938 -0.2818158 -0.9391886 0.2093809 -0.2721846 0.1355141 -0.9904327 -0.02606012 0.133299 -0.9905961 -0.03083397 0.1125266 -0.9935504 -0.01398144 0.05243958 -0.9979513 -0.03665243 -0.7021942 -0.7022386 -0.1174067 0.9143713 0.3261839 0.2398523 0.9137394 0.3241514 0.2449613 0.9203104 0.32268 0.2211479 0.9228597 0.3198098 0.2145968 0.9288488 0.2978153 0.2203311 0.928574 0.2953791 0.2247257 0.9310625 0.2565351 0.2594464 0.9322647 0.2370036 0.2733346 0.9494904 0.1714639 0.2628083 0.9562637 0.1285251 0.2627565 0.9602169 0.08238923 0.2668252 0.9684357 0.05885793 0.2422147 0.8214433 -0.5393301 0.185348 0.7646643 -0.6223805 0.1671258 0.9661583 -0.2208097 0.1333455 0.9670408 -0.1826216 0.1774298 0.9177968 -0.272195 0.2890658 0.929435 -0.2875714 0.2311995 -0.9293979 -0.2680213 0.2537403 -0.927053 -0.2734057 0.256558 -0.9383653 -0.2590879 0.2287878 -0.9413645 -0.2565563 0.2191157 -0.9389036 -0.2689779 0.2147344 -0.9392013 -0.2663232 0.2167321 -0.9343434 -0.262409 0.2411307 -0.9322602 -0.2633472 0.2480707 -0.941145 0.003769995 0.3379821 -0.9412663 0.001048055 0.3376634 -0.9238617 0.2977794 0.2404309 -0.9253514 0.3038816 0.2266733 -0.94366 0.2829957 0.1715207 -0.9415503 0.2938028 0.1648124 -0.9388081 0.2534669 0.2332249 -0.9393708 0.2469829 0.23787 -0.9394255 0.2636982 0.2189592 -0.9399182 0.2653596 0.214798 -0.1334432 -0.989663 0.0525353 -0.05614844 -0.9966817 0.05893094 0.9479011 -0.3108865 0.06952008 0.9502877 -0.3042145 0.06638455 0.1729238 0.9811279 0.08651901 0.07007102 0.9959489 0.05635557 -0.9518709 0.2979744 0.07178485 -0.9552653 0.2880494 0.06705162 0.00649742 -0.9989794 0.04469553 0.05938503 -0.9980802 0.01758802 0.948761 0.3080382 0.07046321 0.9461485 0.3132413 0.08174931 -0.02799352 0.9973435 0.06724565 -0.06283348 0.9952177 0.0747908 -0.9493759 -0.3056508 0.07254712 -0.8917548 -0.3300832 0.3095458 3.84126e-5 0.9983174 0.05798559 -0.0111175 0.9982232 0.05853878 -0.1213411 0.9912634 0.05170165 -0.1558246 0.9842472 0.08352328 -7.9534e-5 -0.9983166 0.05800004 0.001175481 -0.9982558 0.05902541 0.1346134 -0.9895052 0.05252266 0.1454449 -0.9866846 0.07279595 -0.1373061 -0.9883931 0.06500939 0.9423404 -0.3178972 0.1045762 0.1802959 0.9439015 0.2766649 -0.9458168 0.3103431 0.09548718 0.9502825 0.3042077 0.06648896 -0.9565037 -0.2838871 0.06714619 0.003329762 0.9854109 0.1701591 -0.00860948 0.997396 -0.07160518 0.1112719 0.9937031 -0.01314263 -0.02557272 0.9960284 -0.08528485 -0.01768433 0.9977619 -0.06448562 -0.1756958 0.9844401 -0.002957982 -0.01781944 0.9965251 -0.0813642 -0.006728011 0.9994826 -0.03145392 0.07535092 0.9942766 -0.07573821 -0.9752254 0.1688331 -0.1429363 -0.9692403 0.1564101 -0.190024 -0.9614295 0.002712786 -0.2750381 -0.9651806 -4.3543e-4 -0.2615838 -0.9745675 -0.1770849 -0.1373283 -0.9994451 0.005876294 0.03278834 -0.9716538 -0.1730335 -0.1610851 -0.0933468 -0.9938354 -0.05981257 -0.0671576 -0.9915614 -0.1108875 -0.004508864 -0.9944836 -0.1047944 -0.005316288 -0.9953204 -0.09648293 6.90008e-4 -0.9757069 0.219079 -0.04565169 -0.9973701 -0.05629067 0.09282424 -0.9938228 -0.06082596 0.04641923 -0.9985244 -0.02818009 0.06927817 -0.9908111 -0.1161629 0.9776691 -0.1666649 -0.1280077 0.9744837 -0.1462629 -0.1702603 0.9636038 0.002475234 -0.2673233 0.9681273 -0.004520316 -0.250418 0.9755405 0.1700309 -0.1393208 0.9998797 -0.004900349 -0.01471682 0.9689674 0.1603908 -0.1880878 0.1185395 0.9926071 0.02606653 0.1533015 0.9881718 0.003908605 0.149176 0.9880701 -0.03825961 0.1352869 0.9906879 -0.01532618 0.06142282 0.997522 0.03430716 0.05924048 0.993472 0.09748872 0.1367754 0.9880892 0.07051449 0.06937692 0.9942638 0.08140228 0.1503967 0.9876855 0.04310778 -0.9528183 0.3028155 0.02097505 -0.9453838 0.3259528 -0.002075224 -0.9441975 0.3245704 -0.05608311 -0.9504157 0.31007 -0.02380523 -0.9547521 0.2973206 0.00699895 -0.9467509 0.3080892 0.09350891 -0.9456815 0.3110549 0.09450642 -0.9475193 0.3012616 0.1069985 -0.9444479 0.3262301 0.03990184 -0.1709909 -0.9851558 0.01516801 -0.1497329 -0.988279 -0.02974538 -0.1756585 -0.9807655 -0.08510773 -0.1606973 -0.9866606 -0.02602133 -0.06801459 -0.99767 -0.005343374 -0.05460833 -0.9984857 0.006660297 -0.1728149 -0.9836681 0.05031979 -0.08578128 -0.9932559 0.07800183 -0.1953139 -0.9806288 -0.0148228 0.9514891 -0.3052648 0.038495 0.9455331 -0.3254233 0.008180288 0.946767 -0.3174126 -0.05368118 0.9551116 -0.2950415 -0.02669064 0.9604465 -0.2784616 0.001274008 0.9640518 -0.2649423 0.02023926 0.9493642 -0.2981628 0.09902876 0.9513479 -0.2850202 0.1170497 0.947071 -0.3176669 0.04630553 -0.01554632 0.9907722 0.1346437 -0.0708288 0.9870629 0.1438405 -0.03321862 0.999433 0.005508922 -0.03664408 0.9986476 0.03688279 -0.02696066 0.9990739 0.0335313 -0.001644036 0.9948778 0.1010719 0.005844993 0.9995494 -0.0294407 -0.007928272 0.9999468 -0.006610543 -0.01945179 0.9990084 -0.04004944 -0.9469197 -0.3072539 0.09454202 -0.945754 -0.322429 0.03986131 -0.9455022 -0.3203382 -0.05838742 -0.9511724 -0.3076666 -0.02474396 -0.9547742 -0.297264 0.006342995 -0.9475397 -0.3013067 0.1066899 -0.9530125 -0.3025339 0.01550201 -0.9466941 -0.3082079 0.0936924 -0.9459804 -0.3242084 0.003173885 0.02326756 -0.9967492 0.07713449 0.07033141 -0.9956185 0.06162386 0.06799491 -0.9972059 -0.03093611 0.01114822 -0.9997677 -0.01844563 -0.001058151 -0.999998 -0.001712489 0.01101756 -0.9964059 0.08398702 -0.03046605 -0.9984044 0.04754343 -0.01696431 -0.9940117 0.1079488 0.06764833 -0.9976977 -0.00480199 0.9474766 0.3058102 0.09363861 0.9393435 0.3429775 -6.19626e-4 0.9429635 0.3197814 -0.0925184 0.9540762 0.2986864 -0.02290968 0.9612454 0.2756814 0.002664118 0.9525405 0.2808353 0.1174661 0.9538863 0.3000274 0.00918753 0.9643788 0.2636837 0.02108255 0.9523866 0.3037335 -0.02656716 -0.01838179 -0.3461319 0.9380057 0.005789158 -0.9998772 0.01456122 0.04219486 -0.2604038 0.9645774 -0.002277525 0.1990414 0.9799884 -3.8068e-5 -0.9963452 0.08541835 3.10212e-5 -0.9999484 0.01015533 0.03093249 -0.9983522 0.04833125 0.1367169 -0.9886193 0.06277173 0.1666287 -0.9855257 0.03120908 0.1650939 -0.9851462 -0.04723221 0.1420022 -0.989576 -0.0239728 0.1555815 -0.9877912 0.007935111 0.1716062 -0.9851643 -0.001590353 -0.009650713 0.9993171 -0.0356683 0.0106872 0.9887465 0.1492182 -0.001667807 0.459498 -0.8881773 0.01434666 -0.306529 0.9517532 -0.003490157 0.995968 0.08964168 -0.01369952 0.9995599 0.02631353 0.02452184 0.9980714 0.05702803 -0.1271285 0.9881456 0.08606225 -0.1558663 0.9867073 0.04598227 -0.1508504 0.9880205 -0.03255007 -0.09538846 0.9954248 -0.005503614 -0.1128224 0.993602 0.005121587 -0.1389008 0.9902987 -0.00387039 0.1773652 0.9839547 0.01935708 0.1714706 0.9846294 0.03320824 0.1626897 0.9861547 0.03210918 0.1692437 0.9851089 0.03028317 0.07959872 0.9967674 -0.0109026 0.1014295 0.9948427 3.74998e-6 0.0973587 0.9951589 -0.0134196 0.03061937 0.994926 -0.09583593 0.1571273 0.9875431 0.008348672 0.1573261 0.9875418 0.003118897 0.04939699 0.9987792 -5.95683e-5 0.01877851 0.9995239 -0.02447886 0.2338726 0.9644914 0.1227185 0.1740041 0.9845753 0.01827971 0.4187005 0.8790869 0.2278072 0.2940033 0.9482747 0.1197376 0.1664273 0.9860168 0.008528736 0.1054993 0.9918788 -0.07103826 0.1230578 0.9923564 -0.009250071 0.06087592 0.9961584 0.06294979 -0.002750895 0.9997536 -0.0220311 0.1060276 0.9895918 0.09729442 0.0792539 0.9966688 -0.0192375 0.0818454 0.9936383 0.07735814 0.03757126 0.9949611 -0.09295486 0.1330425 0.9877856 0.08111379 0.1368134 0.9764763 -0.1666617 0.1392911 0.9802257 -0.1405552 0.184368 0.981458 0.05242652 0.06889912 0.9787899 -0.1929331 -0.9640452 0.2643886 -0.02675082 -0.9858834 0.1663022 -0.01943226 -0.9725375 0.2280946 0.04630061 -0.9560192 0.2743749 0.1036611 -0.937509 0.3428883 0.05919871 -0.9291775 0.3676383 -0.0383601 -0.9586192 0.2770303 0.0655994 -0.9687293 0.2462779 0.03017853 -0.9355356 0.3527093 0.01922235 -0.9455595 0.3252769 0.01059128 -0.9667215 0.2557952 0.004270972 -0.9714808 0.2371122 0.001625465 -0.8814757 0.4721583 -0.0081886 -0.5772397 0.786904 0.21812 -0.7695718 0.63836 0.01598966 -0.9458063 0.3236584 -0.02637363 -0.94554 0.3238926 0.03236903 -0.9634717 0.2555901 0.07997532 -0.9543397 0.2987224 8.15755e-4 -0.9544901 0.2938522 -0.0509864 -0.9736202 0.22235 -0.05122632 -0.9621707 0.2686195 -0.045509 -0.98318 0.182346 -0.01033662 -0.9554749 0.2817141 -0.08777899 -0.9567323 0.2897836 -0.02624434 -0.925468 0.3023298 -0.228267 -0.9325861 0.3111718 -0.182908 -0.9471322 0.3191444 -0.03297748 -0.9185985 0.2943497 -0.2636953 -0.1356141 -0.9890705 -0.05786723 -0.1792084 -0.9833758 -0.02926457 -0.1563849 -0.9874306 -0.02290143 -0.1228222 -0.9919521 -0.03075322 -0.05348749 -0.9979039 -0.03642929 -0.07295091 -0.9934419 -0.08804204 -0.1675407 -0.9857286 0.01641214 -0.02799932 -0.9982106 0.05283576 -0.161923 -0.9867914 0.004878654 -0.1818752 -0.9829497 0.02704124 -0.1868374 -0.9819542 0.02928312 -0.05119333 -0.9981593 0.03251679 -0.1469535 -0.9891344 -0.004224195 -0.170976 -0.9852682 -0.003715957 -0.4293436 -0.8934558 0.1319119 -0.3287152 -0.9400135 0.09121821 -0.1420154 -0.9891086 -0.03867409 -0.150272 -0.9882938 -0.02633733 -0.1323697 -0.9911086 -0.01348835 -0.1076948 -0.9930791 0.04686018 -0.0835656 -0.9964983 -0.00284501 -0.1668029 -0.9815516 0.09345113 -0.153781 -0.9880775 -0.007379283 -0.1496543 -0.9851512 0.08414552 -0.07679495 -0.9963748 -0.03660189 -0.1768997 -0.9789662 0.1016446 -0.17919 -0.9671966 -0.18006 -0.1849808 -0.961423 -0.2035874 -0.2033062 -0.9767737 0.0676736 -0.08756613 -0.9799387 -0.1790317 0.9496635 -0.3067773 -0.0634572 0.9505847 -0.3092086 0.02790961 0.9771878 -0.2097508 -0.03329728 0.9534412 -0.2921048 -0.07499766 0.9196416 -0.390801 -0.03916599 0.9441356 -0.3294577 -0.008092576 0.9530596 -0.3027538 0.00418854 0.9042552 -0.4260779 -0.02793049 0.9832203 -0.1818049 -0.01499503 0.9585081 -0.2807783 0.04925189 0.9407343 -0.325834 0.09408107 0.9313957 -0.3633562 0.02177865 0.1510008 -0.004589252 0.988523 0.9541215 -0.2992847 0.008997527 0.952125 -0.3051776 -0.01801645 0.9543993 -0.2926045 0.05919849 0.9554831 -0.2950394 -0.001964082 0.9360373 -0.3463818 0.0620789 0.889855 -0.4538446 0.04672488 0.8837165 -0.3922057 0.2553817 0.9554007 -0.2867576 0.07056586 0.8959478 -0.2702528 0.3524786 0.9200645 -0.3674813 -0.1357894 0.9809287 -0.1853221 0.05860509 0.9076411 -0.3042112 -0.2892118 0.938603 -0.2513725 -0.2362967 0.9574307 -0.2871238 -0.02977147 0.9260615 -0.2802054 -0.2527747 -0.906733 0.3690402 0.20407 -0.05129066 0.9976903 -0.04453494 0.00866198 0.9969414 -0.07767025 -0.07109482 0.997398 -0.01195475 0.03555532 0.9993652 0.002254018 0.01711239 0.9896528 0.1424585 -0.05348079 0.9841506 0.1690774 -0.05084676 0.9857235 0.1605104 -0.05749138 0.9973317 -0.04499204 -0.06220275 0.9902471 -0.1246652 -0.01256819 0.9949641 -0.09944132 0.01294351 0.995756 -0.09111746 -0.007733315 0.9811834 -0.1929232 -5.36969e-4 0.9807835 -0.1950986 -0.07171288 0.9826084 -0.1712832 0.00939007 0.9934952 0.1134868 -0.07851205 0.9943776 0.07105657 0.00418664 0.999982 -0.004292154 7.5272e-4 0.9985514 0.05379982 -0.046135 0.9987694 0.01819981 0.03870458 0.9991745 0.01234541 -0.9359468 -0.3521079 -0.004840048 -0.9491261 -0.3148516 0.005307668 -0.9973563 -0.06954894 -0.02105518 -0.9965753 0.08126518 0.01528175 -0.9828523 -0.0427352 0.1793737 -0.9601848 -0.2752617 0.04771028 -0.9725564 -0.2311079 -0.02689103 -0.9384592 -0.3452379 -0.01025694 -0.9570995 -0.2893082 -0.01617019 -0.9450058 -0.3265359 -0.01839064 -0.9609233 -0.276334 -0.0163077 -0.956152 -0.2920362 0.02209407 -0.9615057 -0.2636737 -0.07734898 -0.9295784 -0.2970387 -0.2182937 -0.9184507 -0.294178 -0.2644004 -0.932211 -0.3607881 -0.02854018 -0.9354176 -0.314383 -0.1617324 -0.9590364 -0.2765487 0.06140042 -0.9440823 -0.3272105 -0.04051904 -0.9634694 -0.2624413 0.05339907 -0.9602436 -0.2664862 0.08317082 -0.9514854 -0.3024044 0.05680745 -0.9654171 -0.2575786 0.04028752 -0.9628608 -0.2689513 0.02375535 -0.9463392 -0.3230073 0.01041053 -0.9691281 -0.2445577 0.03134369 -0.9736894 -0.2278582 0.003084522 -0.9657969 -0.2592826 0.002980714 -0.944486 -0.3285361 0.003201822 0.03687526 -0.9938518 -0.1043965 0.002033582 -0.995888 -0.09057093 0.01429922 -0.9948639 -0.1002063 0.01524232 -0.9998838 -5.53305e-5 0.01966186 -0.9997846 -0.006650067 0.01872039 -0.9945012 0.1030391 0.001354384 -0.993691 0.112144 0.09526991 -0.9925306 0.07620142 0.06896468 -0.9974678 0.01737865 0.05933147 -0.9975336 -0.03750158 0.02600327 -0.9984934 -0.04832222 0.01383415 -0.9989702 -0.04320976 0.02754557 -0.9786144 -0.2038508 0.01101472 -0.981096 -0.1932081 0.06930933 -0.9778817 -0.1973415 -2.61229e-4 -0.9999279 -0.0120039 -0.001581123 -0.9996846 -0.02506168 -0.04282907 -0.9953603 -0.08616052 -6.15553e-4 -0.9998662 -0.01634404 0.1149181 -0.9927453 -0.03536161 0.08981271 -0.9956799 -0.0235638 -0.07037881 -0.9964375 -0.04646847 0.1400673 -0.9901376 0.002940135 -0.0715763 -0.9930786 -0.09312177 -0.01959341 -0.997179 0.07245807 -0.1053154 -0.9943891 0.009949054 0.09759939 -0.9944326 0.03972604 0.9465463 0.3208801 -0.03295301 0.9559156 0.2936328 -0.002240843 0.9589407 0.2788041 0.05197133 0.964449 0.2642612 -0.002028939 0.954963 0.2895218 0.06498267 0.9507232 0.3097884 -0.0125058 0.9576594 0.287903 -5.89859e-4 0.9481843 0.317608 -0.008467985 0.9600836 0.2794313 -0.01255617 0.9579489 0.2862008 0.02057325 0.9630286 0.2598011 -0.07127028 0.9270712 0.3035709 -0.2199629 0.9271023 0.2760883 -0.2534887 0.9401339 0.3404517 -0.01552273 0.9112143 0.3266552 -0.250968 0.9488873 0.315299 -0.01412417 0.9553623 0.2952809 -0.009590714 0.9560007 0.2932318 -0.008800707 0.9470973 0.3208723 -0.006897578 0.9395835 0.3420296 -0.01409246 0.9455742 0.3235835 -0.03439767 0.9501337 0.3117875 -0.005878318 0.9360325 0.3518461 0.006885855 0.9578717 0.2856722 -0.02954944 0.9645721 0.2634245 -0.01442793 0.9550265 0.2964658 0.005687441 0.9401331 0.340396 0.01674204 0.01413117 -0.994274 -0.1059224 0.002039365 -0.9999949 -0.002467083 0.00258662 -0.9949259 0.100577 -5.45634e-5 -0.9992001 -0.0399887 -9.01178e-5 -0.9811546 -0.1932244 -0.0291102 -0.9968479 -0.07380195 -0.04478689 -0.9950312 -0.08892164 0.06590445 -0.9977812 -0.009443127 0.1021734 -0.9925202 0.0668145 0.1640182 -0.9858977 -0.03322341 0.1688147 -0.9856252 0.006669197 0.1262246 -0.9876238 -0.09309464 0.1746243 -0.9770147 0.1222655 0.2246708 -0.9667773 0.1219209 0.1610868 -0.9869402 3.89958e-4 0.1665148 -0.9860002 -0.008751353 0.1514954 -0.9840757 0.0929729 0.1393446 -0.9901566 -0.01315832 0.1748846 -0.9791904 0.1029635 0.1332823 -0.9785488 -0.1570924 0.1454154 -0.9870836 0.06723351 0.1650808 -0.9762452 -0.1403343 0.167843 -0.9850782 -0.03807432 0.1614043 -0.9852121 -0.05749616 0.1074594 -0.9935732 -0.03556425 0.1611927 -0.9867663 -0.01758714 0.1664594 -0.9859276 0.01542674 0.0685704 -0.9973862 0.02278239 0.1896357 -0.9793025 0.07074553 0.1365369 -0.9897369 0.04217575 0.01201499 0.9993294 -0.03458815 0.01981761 0.9997872 -0.005738331 0.02711324 0.9787467 0.2032721 0.00584652 0.99063 -0.1364483 0.001858419 0.9788036 -0.2047929 0.01955075 0.9978036 -0.06329118 0.09279709 0.9955313 -0.01749309 0.004520726 0.998674 -0.05128196 -0.00344954 0.9973685 -0.07241724 -0.5774426 0.8095812 0.1055387 0.2336185 0.9722979 0.007698498 -0.05663848 0.9761401 0.2096248 -0.1532936 0.9881712 -0.004334406 -0.09141142 0.9952599 -0.03319305 -0.1386076 0.9844653 0.1077769 -0.02890837 0.9995815 -0.001077358 -0.1002162 0.9827622 0.1553554 -0.1410593 0.9738212 -0.1782544 -0.1798757 0.9818968 0.05935863 -0.1373383 0.9792682 -0.1489025 -0.1483112 0.9888834 0.01064205 -0.06940144 0.9974638 -0.01579448 0.04687859 0.9981635 -0.03836694 -0.1314429 0.9913213 -0.002246639 -0.1464481 0.9892152 0.002513002 -0.1716164 0.9846817 0.03082145 -0.1238938 0.9921944 -0.01416139 -0.1341999 0.9909542 -4.46987e-4 -0.1324374 0.9911911 -6.92078e-4 -0.1056092 0.9943903 0.005877984 -0.1551779 0.9859996 0.0610292 -0.05086646 0.9971696 -0.05536688 0.01347307 0.9989536 -0.04370399 -0.08972609 0.9958861 -0.01265081 0.00134341 0.9996263 -0.02729861 -0.2268713 0.9731749 0.03821345 9.85606e-4 0.9999995 5.58267e-5 -0.009209991 0.9999145 -0.009286561 -9.78111e-4 0.9999728 -0.007310175 1.46801e-10 1 -1.59435e-6 0.06231343 0.9962803 -0.05952146 0.1930111 0.9787485 -0.06926815 0.1944064 0.9808818 -0.008782634 0.1925613 0.9783066 -0.07639574 0.1439989 0.9893547 0.02101734 0.04136072 0.9891739 -0.140799 -0.03567976 0.9972488 0.06497612 -0.1025519 0.9945469 0.01896642 -0.006201447 0.1676108 0.9858338 -0.1359244 0.160206 0.9776803 -0.1695916 -0.002393425 0.9855115 0.1703224 0.006854971 0.9853645 0.1573333 0.1355259 0.9782019 0.003953119 -0.1651598 0.9862589 0.1301364 -0.1452604 0.9807976 -0.1484435 -0.1311104 0.980191 -0.334828 -0.002576416 0.9422758 -0.1871098 -0.1919597 0.963401 -0.1907976 0.2107296 0.9587436 -0.01138947 0.3320413 0.9431961 0.1936031 0.202146 0.9600286 0.3316112 0.0135086 0.9433194 0.1835569 -0.1945961 0.9635556 0.00689953 -0.326847 0.9450521 0.1051357 0.9866613 -0.124281 0.08420967 0.9858102 -0.1452133 0.1211807 0.9909012 -0.05856432 0.1406716 0.9815075 -0.1298246 0.2037332 0.9768344 -0.06547949 -0.9387139 -0.3350109 -0.0811401 -0.9390116 -0.3414931 -0.04049355 -0.9277529 -0.3724673 -0.02329595 -0.9517072 -0.3069973 0.002455359 -0.9647063 -0.2237305 -0.1388753 -0.9861615 -0.1382006 -0.09157508 -0.9401631 0.3403642 -0.01566927 -0.9107311 0.4013154 -0.09754391 -0.9828016 0.1830242 0.02456529 -0.978298 0.2045409 -0.03310584 -0.9528251 0.3032978 -0.01160074 -0.941251 0.2934816 -0.1670779 -0.9419424 0.3167517 -0.1114134 0.1622985 -0.9832734 -0.08265969 0.1608271 -0.986959 0.006825694 0.1404216 -0.9874022 -0.0729297 0.1795052 -0.9801753 -0.08386998 0.1519721 -0.9806502 -0.1234077 -0.1522613 -0.982159 -0.1103638 -0.1451474 -0.9836994 -0.1061495 -0.1711972 -0.9848522 -0.02752504 -0.1802628 -0.9767566 -0.1159821 -0.2410014 -0.9694729 -0.04517183 0.9457119 0.3207439 -0.05246242 0.9439673 0.3297196 -0.01451173 0.9345062 0.3559458 -8.98284e-4 0.9561857 0.2924825 0.01277114 0.9668325 0.2545659 -0.02076206 -0.9954019 0.01047688 0.09521147 0.9495875 -0.2944035 0.1077502 0.9479546 -0.2959659 0.1174146 0.9551964 -0.2957528 -0.0114007 0.9594189 -0.2696793 -0.08239207 0.9480992 -0.3179645 -0.002554809 -0.1792868 0.9803152 -0.08269459 -0.1713193 0.9850273 -0.0192541 -0.2252989 0.9730752 -0.04863038 -0.1232413 0.990316 -0.06391879 -0.05520348 0.9926728 -0.1074866 0.8921508 0.4498625 0.04111746 0.1692231 -0.9621587 -0.2135746 -0.2813306 -0.9542234 0.1015422 -0.9983733 -0.03380527 0.04591219 0.1232891 0.9778936 -0.1688898 -0.4572545 0.8523545 0.2537915 -0.05328208 0.9967087 0.06109736 0.008854017 0.9996684 0.02417791 0.1281418 -0.9904127 0.05159932 0.003292195 -0.9997128 0.023737 0.01818678 -0.9997171 0.01533251 0.008061957 -0.9998648 0.01433702 -0.005224126 -0.9973263 -0.07289116 0.0273802 0.9951159 0.09483922 0.1077288 0.9941608 -0.006228898 -0.9439178 0.329743 -0.01699298 0.08239694 0.9964657 -0.01633061 0.1298928 0.9915084 0.006245292 0.186124 0.9825009 0.007061786 -0.9127282 -0.3424944 0.2227665 -0.9138849 -0.3015682 0.2717922 -0.9143578 -0.305519 0.2657213 -0.9136437 -0.350631 0.2057013 -0.9236149 -0.2959457 0.2436219 -0.9235159 -0.2989285 0.240334 -0.9375221 -0.2252848 0.2651398 -0.9355462 -0.2399351 0.2592 -0.9153388 -0.1171658 0.3852623 -0.9154607 -0.1304889 0.3806629 -0.9167575 -0.09714901 0.3874504 -0.918218 -0.1025077 0.3825807 -0.6505946 0.6912208 0.3145478 -0.6986547 0.5927535 0.4006556 -0.8318056 0.4556538 0.3169845 -0.7669441 0.600234 0.2269717 -0.8923647 0.1645381 0.4202528 -0.8959634 0.1407536 0.4212339 -0.9476247 0.1722775 0.2689388 -0.9490455 0.1364837 0.2840509 -0.9231973 0.273611 0.2698959 -0.9220533 0.2749531 0.2724306 -0.9254128 0.2923985 0.241069 -0.9239337 0.2931031 0.2458399 0.1649796 -0.9859992 0.02423399 0.1449335 -0.9893973 0.009340524 0.1812074 -0.9833918 -0.01023373 0.1629399 -0.986622 0.005239168 -0.155061 -0.9878736 -0.007871143 -0.9884179 -0.009397658 -0.151465 -0.15051 -0.9886035 0.003135671 -0.1729234 -0.9846629 0.02316321 -0.2113309 -0.9771476 0.0228435 0.9046434 0.3619565 0.2249619 0.9003479 0.330608 0.2829697 0.9007285 0.3358127 0.2755323 0.9066691 0.3680791 0.2060799 0.9224764 0.3015253 0.2410805 0.9238138 0.2980846 0.2402362 0.9184967 0.2736856 0.285412 0.9198924 0.2719492 0.2825626 0.9221037 0.2877893 0.2586546 0.9216015 0.2874327 0.2608316 0.896779 -0.3536328 0.2659534 0.871191 -0.3294933 0.3639512 0.8780698 -0.3177445 0.3578152 0.8988537 -0.3528828 0.2598762 0.895103 -0.2698172 0.3549497 0.8939632 -0.2728236 0.3555239 0.9128972 -0.2577033 0.3165559 0.9087806 -0.2597388 0.3265788 0.9365075 -0.2459686 0.2499066 0.9318002 -0.2489645 0.2641309 -0.1570835 0.9871177 0.03038717 -0.1944824 0.9801292 0.03902911 -0.1127207 0.9935336 0.01360478 -0.04998953 0.9980407 0.03762541 0.9699121 0.1915687 0.1502399 -0.9095304 -0.3668338 -0.1954158 -0.9124217 -0.3384098 -0.2301424 -0.909511 -0.3544429 -0.2171634 -0.9115848 -0.3643578 -0.1904116 -0.9292573 -0.2961301 -0.2208797 -0.9295127 -0.29832 -0.2168206 -0.9342725 -0.2376925 -0.2657764 -0.932754 -0.2565957 -0.253236 -0.9596801 -0.1217957 -0.2533374 -0.952897 -0.1665748 -0.2534565 -0.9717852 -0.04678201 -0.2311814 -0.9640439 -0.0694618 -0.2565043 -0.7752154 0.6078848 -0.171805 -0.8338975 0.5165288 -0.1944556 -0.9674736 0.2192805 -0.1261379 -0.9680887 0.180101 -0.1742635 -0.9187742 0.2836832 -0.27455 -0.923595 0.3227054 -0.2069625 0.9288161 0.3092701 -0.2040898 0.926864 0.2873778 -0.2415308 0.9254429 0.3033171 -0.2270557 0.9310552 0.3071205 -0.1970104 0.9399604 0.2670401 -0.2125184 0.93965 0.2696188 -0.2106268 0.933953 0.2513035 -0.2541227 0.9368277 0.2557631 -0.2386196 0.9093639 0.006814342 -0.4159457 0.9094882 0.002550201 -0.4157219 0.9267436 -0.30479 -0.2196575 0.9244013 -0.2972418 -0.2390181 0.9424535 -0.2943525 -0.1585497 0.9445654 -0.2837094 -0.1652424 0.938888 -0.2634352 -0.2215655 0.9354253 -0.2892459 -0.2032639 0.9315926 -0.3114885 -0.1873765 0.9315227 -0.3109771 -0.1885698 0.1384421 0.9890531 -0.05106665 0.05638123 0.9967527 -0.05749264 -0.9468878 0.3144824 -0.06711517 -0.9506979 0.3034544 -0.06394537 -0.1781012 -0.9803124 -0.08524995 -0.070311 -0.9959997 -0.05514331 0.9509645 -0.301642 -0.06840163 0.955651 -0.2873421 -0.064542 -0.006534125 0.9990398 -0.04332169 -0.05960325 0.9980938 -0.016012 -0.9477919 -0.3114419 -0.06851493 -0.9433293 -0.3222313 -0.07935344 0.02800469 -0.9974576 -0.06552918 0.06306218 -0.9953302 -0.07308166 0.948411 0.3091153 -0.07045749 0.8765036 0.3344972 -0.346198 -8.30795e-5 -0.9984002 -0.05654191 0.01110475 -0.9983075 -0.05708548 0.1263438 -0.9907245 -0.05002214 0.1682324 -0.9820922 -0.08480989 1.19358e-4 0.9984077 -0.05641196 -0.001189839 0.9983304 -0.05774762 -0.1394546 0.9889234 -0.05082512 -0.1572877 0.9850848 -0.06977391 0.1497075 0.9865236 -0.06602079 -0.9395412 0.3267843 -0.1023453 -0.1854356 -0.9260294 -0.3287598 0.9431187 -0.3190563 -0.09343632 -0.9507111 -0.3034112 -0.06395274 0.9568821 0.2832122 -0.06455517 -0.005147596 -0.01946662 0.9997973 0.04902993 -0.04659031 0.99771 0.04958182 -0.04632531 0.9976951 -0.005044681 -0.01886067 0.9998094 -5.62608e-4 -9.85901e-5 0.9999998 -5.35123e-4 5.29706e-5 0.9999999 -0.026082 0.007263563 0.9996335 -0.02287112 -0.02179856 0.9995008 -0.02274629 -0.02209439 0.9994971 -0.0260657 0.007299976 0.9996337 -0.04181302 0.002097257 0.9991233 -0.0410969 0.002407983 0.9991523 -0.008670451 -0.05770017 0.9982963 0.0477303 -0.03930746 0.9980866 0.04983759 -0.0381261 0.9980294 -0.008599589 -0.05768583 0.9982978 -0.005583223 -0.08758659 0.9961412 -0.005607395 -0.08770523 0.9961306 0.06029975 -0.01847246 0.9980094 -0.0432445 -0.03521922 0.9984435 -0.04237796 -0.03753229 0.9983963 0.06052561 -0.01862626 0.9979928 0.009521756 -0.001952213 0.9999527 0.009299187 -0.00185462 0.999955 0.0576504 0.01950923 0.9981461 0.0583933 0.01989514 0.9980955 -1.89107e-4 -0.01209181 0.9999268 -0.001921166 -0.02538888 0.9996759 -0.001934053 -0.02485984 0.999689 -1.89858e-4 -0.01207901 0.999927 0.003044441 -0.02327102 0.9997244 0.003072976 -0.02349019 0.9997194 0.01331831 0.004926856 0.9998991 0.01367749 0.005057205 0.9998936 -0.002018979 -0.07391411 0.9972625 -0.002029374 -0.07337274 0.9973025 0.006539078 -0.0373399 0.9992813 0.006586684 -0.03752972 0.9992738 0.002889936 -0.01011039 0.9999447 0.007364883 0.0182006 0.9998073 0.007696603 0.01595225 0.9998432 0.003011197 -0.01075827 0.9999376 -0.13019 0.001148171 0.9914885 -0.4144489 0.02510102 0.9097264 -0.4133579 0.0249215 0.9102275 -0.1299245 -3.49626e-4 0.9915239 0.004034013 -0.03739595 0.9992924 0.004289198 -0.03833894 0.9992556 -1.87728e-6 -2.8531e-5 1 -2.01161e-6 -2.79936e-5 1 -9.13785e-5 -3.61344e-6 1 -9.20763e-5 0 1 -0.8019559 0.003544977 0.5973727 -0.9087732 0 0.4172901 -0.9087747 6.67957e-5 0.4172871 -0.80094 0.00384128 0.5987324 0.01742454 0.06292515 0.9978661 0.01854761 0.05667488 0.9982203 0.8087317 -0.1144027 0.5769446 0.4172399 -0.07959367 0.9053043 0.4300597 -0.08140726 0.8991227 0.8146613 -0.1129538 0.5688309 0.917405 0.01221473 0.3977675 0.9175326 0.0172508 0.3972863 0.01585093 0.1392789 0.9901263 0.01683356 0.1310703 0.9912301 0.1196494 -0.006712649 0.9927936 0.1196251 -0.007122905 0.9927936 + + + + + + + + + + 0.9947715 0.005661786 7.35611e-4 1 0 1 0.9955027 0.002134442 1 0.9761944 0.9999908 0.03008249 0.9832373 0.9999928 0.01192948 0.964985 0.9999751 0.9579326 0.9614924 0.9999897 0.9714648 0.007894099 0.005319327 0 0.4939374 1 0.887692 0.4981732 0.999989 0.9044677 0.5060624 0.999989 0.1335871 0.5015814 0.2616985 0.06153363 0.4944052 0.2618815 0.8845657 0.4984185 0.2616981 0.9209443 0.5055946 0.2616997 0.1185483 0.7302606 0.9999903 0.9090725 0.7397115 0.2617628 0.9241616 0.2658582 0.999989 0.9044676 0.2571657 0.2617872 0.9257231 0.7341417 0.999989 0.07730633 0.7425188 0.2620571 0.04121223 0.2695116 0.999989 0.07730651 0.2602105 0.2616985 0.06153372 0.9703481 0.8057281 0.0317032 0.9703633 0.6113809 0.03457379 0.9744916 0.5669004 0.03036034 0.9881701 0.2145039 0.0161601 0.9933124 0.2145059 0.004053712 0.9709494 0.5676938 0.02855888 0.9664568 0.6113551 0.03268793 0.9671332 0.8056724 0.03185192 0.9775782 0.2145039 0.9874548 0.9615074 0.5672996 0.9721054 0.9563977 0.6113552 0.967419 0.966465 0.8056762 0.9754219 0.983403 0.2145037 0.9764856 0.9741248 0.5653607 0.9690776 0.9636382 0.6113552 0.9562476 0.9747597 0.8056225 0.9692369 0.5018268 0.8536198 0.07037508 0.5018266 0.7072517 0.06115404 0.5018239 0.5535265 0.07360917 0.5015814 0.4137727 0.05241242 0.4939374 0.8536203 0.8796464 0.4939374 0.7072529 0.8736606 0.494271 0.5664343 0.8707248 0.4944052 0.4137732 0.8911021 0.4981732 0.8536203 0.9468964 0.4981732 0.7072517 0.9094155 0.4981759 0.5535265 0.9087732 0.4984185 0.4137727 0.9218624 0.5060624 0.8536204 0.1312091 0.5060623 0.707253 0.1259245 0.5057288 0.5660886 0.1277137 0.5055945 0.4137734 0.1097296 0.7301524 0.8536202 0.9111816 0.7304282 0.7072517 0.9056677 0.7327387 0.5664341 0.9087732 0.7397894 0.4137727 0.9209388 0.2664315 0.8536201 0.9159293 0.2658609 0.7072517 0.9045212 0.2640836 0.5656688 0.9181676 0.2573979 0.4137722 0.9279197 0.7337632 0.8536203 0.06661531 0.7332925 0.7072518 0.05808932 0.7363867 0.5664343 0.07360899 0.7421212 0.4137714 0.04278538 0.269868 0.8536197 0.06721282 0.2697726 0.7072517 0.07140088 0.2673867 0.5661994 0.070768 0.262358 0.4137693 0.01309213 0.7017522 0.999989 0.07730633 0.6244236 0.9356577 0.07730636 0.5018296 0.9253274 0.05700716 0.3774745 0.9346174 0.03531376 0.308095 0.9999889 0.0757269 0.5055906 0.01197508 0.01879799 0.4984171 0.011933 0.9741055 0.4944091 0.01197508 0.9843662 0.5015827 0.01218265 0.01517609 0.8637018 0.1370726 0.03402799 0.5015814 0.2612871 0.06153363 0.1406793 0.1375376 0.006439745 0.7346506 0.1370966 0.9335138 0.2541959 0.137108 0.9336514 0.8603516 0.1371436 0.9549081 0.4984185 0.2612873 0.9209436 0.1361947 0.1370336 0.9491691 0.7454901 0.1372183 0.06650659 0.265364 0.1371019 0.06796393 0.9664568 0.586732 0.03268793 0.8507138 0.6591835 0.05442044 0.7341397 0.6340674 0.07726166 0.8540865 0.5668714 0.05050185 0.9565482 0.5867321 0.9675385 0.725202 0.6593034 0.916952 0.4939373 0.6340674 0.8671548 0.7277694 0.5670518 0.9210128 0.9667637 0.5867325 0.9602189 0.8470002 0.6591835 0.9309754 0.7304882 0.6340674 0.9044687 0.850212 0.5666956 0.9372452 0.9705378 0.5867372 0.03459105 0.7370999 0.6593035 0.08466622 0.5060624 0.634068 0.1302855 0.7388993 0.5669351 0.08036336 0.2702842 0.6340674 0.05982137 0.3845426 0.5665679 0.07311577 0.5018266 0.6340674 0.07251653 0.3856691 0.7073716 0.06135345 0.2607765 0.5541455 0.9210068 0.2626803 0.6593034 0.916952 0.2660527 0.6340674 0.9083568 0.3808946 0.5662879 0.9125028 0.4981732 0.6340674 0.904512 0.3820157 0.7073715 0.9066463 0.2722604 0.5541575 0.08099425 0.2748995 0.6593034 0.08492184 0.6192554 0.2618909 0.9211477 0.3775823 0.261838 0.9228212 0.6154573 0.5537081 0.9087093 0.6143308 0.7073715 0.9125419 0.1460531 0.5540709 0.9363641 0.1493062 0.6591835 0.9306083 0.6224177 0.2618992 0.06159157 0.3807451 0.2618992 0.06159163 0.6191052 0.5537082 0.07366535 0.6179842 0.7073716 0.06412068 0.1496968 0.554081 0.04900244 0.152417 0.6591457 0.05022243 0.9751329 0.9030482 0.02202147 0.8492031 0.9999944 0.04229677 0.7343776 0.9269143 0.07727844 0.8506124 0.8295606 0.05441189 0.9690629 0.7085137 0.02946559 0.7326455 0.7804791 0.04267344 0.7408059 0.3280937 0.057495 0.9941772 0.1133967 0.003215283 0.8630314 0.3138879 0.02582824 0.742833 0.4898098 0.05883408 0.9859797 0.3154489 0.01312658 0.9661915 0.9030482 0.9752486 0.7107276 0.9999938 0.9456733 0.4939375 0.9270225 0.8925604 0.7246701 0.8296462 0.9180256 0.9562256 0.7085136 0.9672824 0.4939375 0.7804391 0.8881109 0.8988628 0.3376215 0.4944053 0.9776167 0.1133907 0.9876783 0.7318099 0.3141378 0.9389967 0.4944052 0.4898105 0.8869076 0.9790126 0.3154489 0.9885947 0.9727801 0.9028244 0.9666905 0.846584 0.9999893 0.9304681 0.7295023 0.9270049 0.9243215 0.847227 0.8295984 0.9430951 0.9705708 0.708523 0.9649906 0.7303721 0.780436 0.9067918 0.7379686 0.327973 0.917833 0.9870106 0.1133931 0.9808229 0.8603746 0.3138883 0.9532163 0.7397894 0.4898098 0.9209385 0.9822958 0.3154489 0.9750779 0.9676377 0.9030372 0.03678089 0.7341191 0.9999901 0.07984108 0.5060624 0.9270178 0.1325101 0.7258549 0.8296491 0.0600884 0.9689908 0.7090214 0.03087354 0.5060623 0.7804374 0.1244878 0.5055945 0.3376193 0.116827 0.9886547 0.1133905 0.01558051 0.7438012 0.3141379 0.06410256 0.5055945 0.4898102 0.1156115 0.9864117 0.3154489 0.01756784 0.2627133 0.3282202 0.05058697 0.5015814 0.3279547 0.0613794 0.3808959 0.4140218 0.04009154 0.2604321 0.4898098 0.05651751 0.5015814 0.4898098 0.06102574 0.5018272 0.7805232 0.07490647 0.3855806 0.8535917 0.0426228 0.2695721 0.7804798 0.07517397 0.2541336 0.3141379 0.9329718 0.2740645 0.9999928 0.9392189 0.2630704 0.8296462 0.9177288 0.2564736 0.3282422 0.9237984 0.4984185 0.3281219 0.9229133 0.3777331 0.4140218 0.9279405 0.2575144 0.4898098 0.9302704 0.4984185 0.4898098 0.9209388 0.4981732 0.9269874 0.9087733 0.3820157 0.999989 0.9044677 0.2660589 0.9270031 0.9085363 0.3820158 0.8536801 0.910144 0.4981732 0.780436 0.9424148 0.2659231 0.780436 0.9057659 0.2653291 0.3141379 0.06853995 0.2754377 0.999989 0.08539179 0.2755597 0.8296463 0.08344051 0.619104 0.4140218 0.9208726 0.6143307 0.9999889 0.9050007 0.6143302 0.8536799 0.935927 0.1363462 0.3138884 0.9520809 0.1502892 0.9999914 0.9358265 0.1520931 0.8295879 0.9589658 0.6222668 0.4140218 0.02729607 0.6180716 0.8535963 0.07017529 0.1391757 0.3138887 0.0368681 0.2693966 0.9269145 0.07460448 0.1536734 0.9999905 0.05129763 0.1523434 0.8295608 0.05009708 0.5018271 0.8896682 0.06035307 0.6791092 0.8947792 0.07455033 0.5631252 0.9304932 0.07615668 0.7179469 0.999989 0.0773063 0.6749203 0.9633265 0.07730633 0.2888039 0.999989 0.07695472 0.3236756 0.8942603 0.04903612 0.3324456 0.9633114 0.06195608 0.4396698 0.9299662 0.03333873 0.5015814 0.1367125 0.03715679 0.4944052 0.09505051 0.9516107 0.4984185 0.1368519 0.952196 0.5055945 0.09505051 0.05047444 0.8507137 0.6113868 0.05442065 0.7251954 0.6115366 0.9169859 0.8470564 0.6113868 0.9304039 0.736993 0.6115367 0.08441553 0.3856691 0.6342173 0.0599134 0.2626803 0.6115366 0.916972 0.3820157 0.6342173 0.9057483 0.2748408 0.6115366 0.08502856 0.4984185 0.2616065 0.9208564 0.6143308 0.6342173 0.9055189 0.1494162 0.6113868 0.9317243 0.5015814 0.2616067 0.06161088 0.6179842 0.6342173 0.07736218 0.1530755 0.6113846 0.05238628 0.8498245 0.9149516 0.04645091 0.8505965 0.744385 0.05306619 0.8629499 0.2251498 0.01473138 0.8633239 0.4024114 0.02915993 0.7098511 0.9150347 0.9490414 0.7236019 0.7444751 0.9202816 0.7352661 0.225529 0.9329871 0.7311324 0.40263 0.9404007 0.8468903 0.915027 0.942574 0.8464453 0.7443824 0.9378697 0.8606786 0.2251474 0.959179 0.8605574 0.4024113 0.9513789 0.727334 0.9150336 0.06361321 0.7307022 0.7444763 0.07031277 0.7446715 0.2255313 0.06469861 0.7262552 0.4026332 0.02613357 0.3805875 0.3284818 0.05752656 0.3808959 0.4900278 0.05969378 0.3856016 0.7806134 0.07165679 0.2535502 0.225529 0.9329829 0.2545104 0.4026294 0.9337413 0.2667723 0.9150318 0.9254618 0.2626808 0.7444748 0.9169329 0.3774393 0.3287766 0.9269537 0.3777331 0.4900277 0.9252587 0.3820157 0.9270176 0.9044043 0.3820157 0.7805258 0.9212755 0.2649145 0.2255293 0.06816033 0.2661402 0.4026295 0.06680474 0.275179 0.9150307 0.08430454 0.2751684 0.7444749 0.08436066 0.6193978 0.3282241 0.9209 0.619104 0.4900277 0.9208725 0.6143302 0.9270169 0.9208929 0.6143308 0.7805258 0.919082 0.1354736 0.2251457 0.9524322 0.1363226 0.4024114 0.9518573 0.1509799 0.9150048 0.94767 0.150443 0.744385 0.9421557 0.6225882 0.3287102 0.05395016 0.6222668 0.4900278 0.05647889 0.6180528 0.7806123 0.05373034 0.1395802 0.2251483 0.02197623 0.1405635 0.4024114 0.02084017 0.1531876 0.9149507 0.05361325 0.1506324 0.744258 0.0396587 0.5907292 0.8921021 0.07691807 0.6985463 0.9473505 0.07736212 0.3062162 0.9470917 0.06646279 0.4124926 0.8918316 0.02797234 0.8373936 0.2292849 0.04176819 0.8374166 0.4944094 0.04113182 0.837263 0.7593335 0.04099545 0.4984172 0.7595109 0.04130986 0.1594429 0.7595257 0.04176819 0.1594192 0.4944092 0.04113182 0.159443 0.2292847 0.0417681 0.4984173 0.2292848 0.0413394 0.8310772 0.3441781 0.03470337 0.8633779 0.3279039 0.029659 0.9571753 0.3295703 0.01799661 0.9848834 0.3460966 0.01440835 0.06604755 0.3284541 0.9745629 0.2541336 0.3221558 0.9329686 0.3049338 0.3397572 0.9220417 0.4862913 0.3322999 0.8981569 0.4939359 0.3218142 0.8969784 0.9011554 0.3329912 0.498482 0.6776912 0.3362526 0.9377471 0.7309594 0.3247941 0.9405318 0.9199122 0.3295323 0.9780418 0.9784896 0.3448657 0.9879054 0.04291809 0.3297108 0.9765249 0.1362837 0.3228889 0.951758 0.1646519 0.3417303 0.9435813 0.2544757 0.3418376 0.9241406 0.8308685 0.3426187 0.9446182 0.8604981 0.3256162 0.9522504 0.961503 0.324191 0.9725778 0.9823808 0.3403911 0.9752351 0.07352269 0.327222 0.02682951 0.265479 0.334054 0.0681906 0.3456396 0.3513782 0.08353516 0.5055455 0.3542692 0.1161186 0.6815803 0.3422873 0.07342854 0.7425127 0.3294533 0.06124023 0.9404007 0.3261859 0.02479663 0.9867916 0.3432792 0.01739192 0.04044688 0.3255495 0.01624888 0.1391742 0.3227945 0.03682554 0.1669082 0.340824 0.0397557 0.7458466 0.3289895 0.05263796 0.7431609 0.3453786 0.05316374 0.7437643 0.3286976 0.9230313 0.7403088 0.3460222 0.9219525 0.2605624 0.344367 0.04179257 0.2582643 0.3293048 0.04628655 0.5015814 0.3460771 0.0608049 0.2568421 0.3459067 0.9238639 0.4984185 0.3459392 0.9231262 0.3806103 0.3458983 0.05527237 0.3774474 0.345823 0.9274493 0.6193897 0.346415 0.920898 0.6225524 0.3455168 0.05062571 0.8388681 0.3292541 0.03291884 0.863461 0.3448373 0.03066465 0.948777 0.3453979 0.01966381 0.9851495 0.3284409 0.01410171 0.07996637 0.3433436 0.9712905 0.2541336 0.340351 0.9329667 0.2916151 0.3241149 0.9249073 0.4725644 0.3215766 0.898984 0.8977276 0.3339089 0.4949702 0.5099477 0.3239965 0.9046203 0.691712 0.3263146 0.9378706 0.7308971 0.3399529 0.941388 0.9061631 0.3430165 0.9746907 0.9785204 0.3296206 0.9880178 0.05117691 0.3443602 0.9745609 0.1362988 0.3403808 0.9516104 0.1568812 0.3256959 0.9458299 0.2516097 0.3276879 0.924681 0.8386139 0.3267751 0.946902 0.8604957 0.343041 0.9518761 0.9530457 0.3397722 0.9711158 0.9822265 0.323174 0.9752018 0.0878225 0.3417877 0.02977553 0.2655954 0.3520597 0.06800666 0.3320695 0.3362701 0.08118388 0.5056451 0.3369723 0.1166562 0.6955525 0.3295764 0.07142404 0.7415993 0.3443416 0.05928069 0.9258656 0.340038 0.02671969 0.9864748 0.3261121 0.01761591 0.04884902 0.3412186 0.01733378 0.13921 0.3408053 0.03648672 0.1589246 0.324715 0.04013082 0.7415791 0.3282993 0.0572764 0.7418274 0.3376348 0.0570789 0.7409725 0.3371396 0.05736738 0.7395927 0.3282986 0.9182076 0.7396562 0.3378296 0.9181038 0.7380021 0.3374569 0.9177096 0.2624708 0.336706 0.04799339 0.2627016 0.3374145 0.04782823 0.2628143 0.3283013 0.05057332 0.5015846 0.3375286 0.06504425 0.2590063 0.337634 0.9196414 0.4984152 0.3375297 0.9187409 0.3817537 0.3377092 0.06044027 0.3785934 0.3378109 0.9230063 0.6182371 0.3378053 0.9165682 0.6214233 0.3376265 0.05612013 0.8317578 0.337211 0.03754324 0.8599283 0.3368283 0.03393212 0.9486406 0.3379664 0.02294183 0.9804661 0.3377052 0.01841253 0.07682961 0.3363689 0.9684947 0.2561916 0.3317977 0.9288373 0.2999095 0.3324738 0.919435 0.4798776 0.3276502 0.8952926 0.4942318 0.3284108 0.8942209 0.8997438 0.3288547 0.5032476 0.6820991 0.3320295 0.9349976 0.7279833 0.3329442 0.9377797 0.9087135 0.3367197 0.9720294 0.9745438 0.337699 0.9837084 0.05137503 0.3374938 0.9709386 0.13973 0.3321725 0.9469154 0.1639829 0.3342094 0.9400601 0.2566049 0.3358692 0.9200546 0.8315181 0.33519 0.9412186 0.857024 0.3348338 0.947494 0.9528584 0.3325406 0.9672868 0.9778199 0.3323904 0.9707781 0.0850364 0.3350476 0.0326809 0.2681054 0.3435121 0.07219204 0.3407375 0.3442983 0.08627257 0.5058541 0.3460967 0.1200154 0.6869504 0.3365375 0.07620364 0.7399039 0.3375931 0.06412381 0.9291326 0.3337342 0.02994835 0.982728 0.3352094 0.0219481 0.04904687 0.3339159 0.02087387 0.1426697 0.332354 0.04073936 0.1661748 0.3333916 0.04374352 0.7409763 0.3354691 0.05738109 0.7387546 0.335653 0.9179542 0.7366573 0.3352468 0.04936379 0.9743903 0.5555495 0.03044307 0.9709494 0.5547863 0.02855891 0.9618353 0.5552641 0.9723514 0.975264 0.5575074 0.9706156 0.5018239 0.5664343 0.07360908 0.494271 0.5535291 0.8707442 0.498176 0.5664341 0.9087732 0.5057288 0.5538518 0.1278294 0.7327387 0.5535265 0.9087733 0.2640969 0.5543051 0.9183607 0.7363867 0.5535265 0.07360908 0.2673334 0.5536599 0.07199129 0.8540865 0.5539639 0.05050194 0.7277722 0.5541457 0.9210082 0.8501303 0.5541971 0.9380177 0.7389005 0.5542613 0.0803721 0.3845426 0.5537173 0.0735597 0.2607765 0.567053 0.9210052 0.3808946 0.5540446 0.9126073 0.2722436 0.5670468 0.08103126 0.6154573 0.5666157 0.9087092 0.1460587 0.5667566 0.9364522 0.6191053 0.5666157 0.07366535 0.1496987 0.5667485 0.048942 0.03466356 0.5597081 0.02953529 0.03300679 0.5597141 0.9664516 0.03217602 0.5597106 0.9574137 0.03349543 0.5596948 0.02937451 0.5018214 0.5584664 0.07762527 0.4942562 0.5584664 0.8671895 0.4981785 0.5584664 0.9047865 0.5057437 0.5584655 0.1312702 0.7304935 0.5584664 0.9047866 0.2663565 0.5584639 0.9145488 0.7341365 0.5584135 0.07762519 0.2696078 0.5584658 0.07534879 0.8507085 0.5588995 0.05473945 0.7255199 0.5590793 0.9169887 0.846837 0.5588979 0.9330044 0.7367022 0.5590791 0.0844509 0.3856639 0.5586462 0.0774259 0.2629991 0.5590793 0.9169868 0.382021 0.5586458 0.9085429 0.274497 0.5590793 0.08505738 0.614336 0.5586462 0.9047232 0.149443 0.5588984 0.9322629 0.6179789 0.5586462 0.07768106 0.1530623 0.5588986 0.05330679 7.35611e-4 0.005661786 0.9947715 0 0.002134442 0.9955027 1 0.005319327 0.007894099 0 0 -1.19209e-7 0.03268793 0.586732 0.9664568 0.02855888 0.5676938 0.9709494 0.03268793 0.6113551 0.9664568 0.03268793 0.586732 0.9664568 0.03978109 0.5867325 0.03323624 0.03092241 0.5653607 0.02587524 0.04375237 0.6113552 0.03636181 0.03978109 0.5867325 0.03323624 0.03246152 0.5867321 0.9565482 0.02789462 0.5672996 0.9615074 0.03258097 0.6113552 0.9563977 0.03246152 0.5867321 0.9565482 0.5015814 0.06153363 0.2612871 0.7425188 0.04121223 0.2620571 0.6224177 0.06159157 0.2618992 0.5015814 0.06161088 0.2616067 0.03459105 0.5867372 0.02946225 0.03036034 0.5669004 0.02550837 0.03457379 0.6113809 0.02963674 0.03459105 0.5867372 0.02946225 0.4944053 0.3376215 0.8988628 0.498482 0.3329912 0.9011554 1 0.005319327 0.007894099 0.003215283 0.1133967 0.9941772 7.35611e-4 0.005661786 0.9947715 0.4949702 0.3339089 0.8977276 0.4944053 0.3376215 0.8988628 0.4944053 0.3376215 0.8988628 0.004053712 0.2145059 0.9933124 0.003215283 0.1133967 0.9941772 0.02855891 0.5547863 0.9709494 0.01440835 0.3460966 0.9848834 0.01192948 0.9999928 0.9832373 0.02202147 0.9030482 0.9751329 0.02202147 0.9030482 0.9751329 0.03185192 0.8056724 0.9671332 0.03185192 0.8056724 0.9671332 0.02946559 0.7085137 0.9690629 0.02946559 0.7085137 0.9690629 0.03268793 0.6113551 0.9664568 0.01917708 0.1133931 0.01298943 0 0 -1.19209e-7 0.02351445 0.2145037 0.01659706 0.01917708 0.1133931 0.01298943 0.02938443 0.5575074 0.02473605 0.0247649 0.3403911 0.01761919 0.04206741 0.9999751 0.03501496 0.03330946 0.9028244 0.02721989 0.03330946 0.9028244 0.02721989 0.03076315 0.8056225 0.0252403 0.03076315 0.8056225 0.0252403 0.03500938 0.708523 0.0294292 0.03500938 0.708523 0.0294292 0.04375237 0.6113552 0.03636181 0.01232165 0.1133907 0.9776167 0 0.002134442 0.9955027 0.01254523 0.2145039 0.9775782 0.01232165 0.1133907 0.9776167 0.02764863 0.5552641 0.9618353 0.01209456 0.3448657 0.9784896 0.02853525 0.9999897 0.9614924 0.02475142 0.9030482 0.9661915 0.02475142 0.9030482 0.9661915 0.02457809 0.8056762 0.966465 0.02457809 0.8056762 0.966465 0.03271759 0.7085136 0.9562256 0.03271759 0.7085136 0.9562256 0.03258097 0.6113552 0.9563977 0.01558051 0.1133905 0.01134524 0.0161601 0.2145039 0.01182985 0.01558051 0.1133905 0.01134524 0.03044307 0.5555495 0.02560973 0.01739192 0.3432792 0.01320839 0.03008249 0.9999908 0.02380556 0.03678089 0.9030372 0.03236234 0.03678089 0.9030372 0.03236234 0.0317032 0.8057281 0.02965194 0.0317032 0.8057281 0.02965194 0.03087354 0.7090214 0.03100923 0.03087354 0.7090214 0.03100923 0.03457379 0.6113809 0.02963674 0.9921059 0 0.005319327 0.981202 0.4944094 0.01197508 0.981202 0.4944094 0.01197508 1 1 0 1 1 0 0.4984171 0.9741055 0.011933 0.4984171 0.9741055 0.011933 0 0.9955027 0.002134442 0 0.9955027 0.002134442 0.01563382 0.4944091 0.01197508 0.01563382 0.4944091 0.01197508 0.005228519 7.35611e-4 0.005661786 0.005228519 7.35611e-4 0.005661786 0.4984173 0.01517609 0.01218265 0.4984173 0.01517609 0.01218265 0.9921059 0 0.005319327 0.01410171 0.3284409 0.9851495 0.01312658 0.3154489 0.9859797 0.01312658 0.3154489 0.9859797 0.004053712 0.2145059 0.9933124 0.0119822 0.3296206 0.9785204 0.01140535 0.3154489 0.9790126 0.01140535 0.3154489 0.9790126 0.01254523 0.2145039 0.9775782 0.02479821 0.323174 0.01777351 0.02492213 0.3154489 0.01770425 0.02492213 0.3154489 0.01770425 0.02351445 0.2145037 0.01659706 0.01761591 0.3261121 0.01352519 0.01756784 0.3154489 0.01358828 0.01756784 0.3154489 0.01358828 0.0161601 0.2145039 0.01182985 0.7372867 0.3282202 0.05058697 0.7371857 0.3283013 0.05057332 0.01440835 0.3460966 0.9848834 0.01841253 0.3377052 0.9804661 0.4949702 0.3339089 0.8977276 0.8942209 0.3284108 0.4942318 0.498482 0.3329912 0.9011554 0.5032476 0.3288547 0.8997438 0.01209456 0.3448657 0.9784896 0.01629162 0.337699 0.9745438 0.0247649 0.3403911 0.01761919 0.02922189 0.3323904 0.02218005 0.01739192 0.3432792 0.01320839 0.0219481 0.3352094 0.017272 0.7372867 0.3282202 0.05058697 0.7375292 0.336706 0.04799339 0.7375292 0.336706 0.04799339 0.7394376 0.344367 0.04179257 0.7372984 0.3374145 0.04782823 0.2633427 0.3352468 0.04936379 0.01841253 0.3377052 0.9804661 0.01410171 0.3284409 0.9851495 0.8942209 0.3284108 0.4942318 0.8969784 0.3218142 0.4939359 0.9046203 0.3239965 0.5099477 0.5032476 0.3288547 0.8997438 0.01629162 0.337699 0.9745438 0.0119822 0.3296206 0.9785204 0.02922189 0.3323904 0.02218005 0.02479821 0.323174 0.01777351 0.0219481 0.3352094 0.017272 0.01761591 0.3261121 0.01352519 0.02855888 0.5676938 0.9709494 0.03092241 0.5653607 0.02587524 0.02789462 0.5672996 0.9615074 0.03036034 0.5669004 0.02550837 0.9664516 0.5597141 0.03300679 0.9574137 0.5597106 0.967824 0.9706255 0.5596948 0.9665046 0.9704647 0.5597081 0.03466356 0.02855891 0.5547863 0.9709494 0.02938443 0.5575074 0.02473605 0.02764863 0.5552641 0.9618353 0.03044307 0.5555495 0.02560973 0.9664516 0.5597141 0.03300679 0.9574137 0.5597106 0.967824 0.9706255 0.5596948 0.9665046 0.9704647 0.5597081 0.03466356 + + + + + + + + + + + + + + + +

80 0 80 20 1 20 81 2 81 81 2 81 220 3 220 80 0 80 81 2 81 22 4 22 82 5 82 82 5 82 220 3 220 81 2 81 82 5 82 7 6 7 79 7 79 79 7 79 220 3 220 82 5 82 79 7 79 0 8 0 80 0 80 80 0 80 220 3 220 79 7 79 78 9 78 2 10 2 83 11 83 83 11 83 221 12 221 78 9 78 83 11 83 12 13 12 84 14 84 84 14 84 221 12 221 83 11 83 84 14 84 0 15 475 78 9 78 78 9 78 221 12 221 84 14 84 77 16 77 1 17 1 85 18 85 85 18 85 222 19 222 77 16 77 85 18 85 16 20 16 86 21 86 86 21 86 222 19 222 85 18 85 86 21 86 18 22 18 87 23 87 87 23 87 222 19 222 86 21 86 87 23 87 2 24 476 77 16 77 77 16 77 222 19 222 87 23 87 76 25 76 7 26 477 88 27 88 88 27 88 223 28 223 76 25 76 88 27 88 14 29 14 89 30 89 89 30 89 223 28 223 88 27 88 89 30 89 1 31 478 76 25 76 76 25 76 223 28 223 89 30 89 90 32 90 29 33 29 91 34 91 91 34 91 224 35 224 90 32 90 91 34 91 64 36 64 92 37 92 92 37 92 224 35 224 91 34 91 92 37 92 65 38 65 93 39 93 93 39 93 224 35 224 92 37 92 93 39 93 28 40 28 90 32 90 90 32 90 224 35 224 93 39 93 94 41 94 33 42 33 95 43 95 95 43 95 225 44 225 94 41 94 95 43 95 44 45 44 96 46 96 96 46 96 225 44 225 95 43 95 96 46 96 45 47 45 97 48 97 97 48 97 225 44 225 96 46 96 97 48 97 32 49 32 94 41 94 94 41 94 225 44 225 97 48 97 98 50 98 37 51 37 99 52 99 99 52 99 226 53 226 98 50 98 99 52 99 56 54 56 100 55 100 100 55 100 226 53 226 99 52 99 100 55 100 57 56 57 101 57 101 101 57 101 226 53 226 100 55 100 101 57 101 36 58 36 98 50 98 98 50 98 226 53 226 101 57 101 102 59 102 24 60 24 103 61 103 103 61 103 227 62 227 102 59 102 103 61 103 52 63 52 104 64 104 104 64 104 227 62 227 103 61 103 104 64 104 53 65 53 105 66 105 105 66 105 227 62 227 104 64 104 105 66 105 25 67 25 102 59 102 102 59 102 227 62 227 105 66 105 106 68 106 69 69 69 107 70 107 107 70 107 228 71 228 106 68 106 107 70 107 431 72 431 108 73 108 108 73 108 228 71 228 107 70 107 108 73 108 40 74 40 109 75 109 109 75 109 228 71 228 108 73 108 109 75 109 68 76 68 106 68 106 106 68 106 228 71 228 109 75 109 90 77 479 28 78 480 444 79 444 444 79 444 229 80 229 90 77 479 444 79 444 45 81 45 96 82 96 96 82 96 229 80 229 444 79 444 96 82 96 44 83 44 111 84 111 111 84 111 229 80 229 96 82 96 111 84 111 29 85 481 90 77 482 90 77 482 229 80 229 111 84 111 112 86 112 61 87 61 113 88 113 113 88 113 230 89 230 112 86 112 113 88 113 433 90 433 114 91 114 114 91 114 230 89 230 113 88 113 114 91 114 48 92 48 115 93 115 115 93 115 230 89 230 114 91 114 115 93 115 60 94 60 112 86 112 112 86 112 230 89 230 115 93 115 98 95 483 36 96 484 446 97 446 446 97 446 231 98 231 98 95 483 446 97 446 53 99 53 104 100 104 104 100 104 231 98 231 446 97 446 104 100 104 52 101 52 117 102 117 117 102 117 231 98 231 104 100 104 117 102 117 37 103 485 98 95 486 98 95 486 231 98 231 117 102 117 118 104 118 13 105 13 119 106 119 119 106 119 232 107 232 118 104 118 119 106 119 18 22 18 86 21 86 86 21 86 232 107 232 119 106 119 86 21 86 16 20 16 118 104 118 118 104 118 232 107 232 86 21 86 114 91 114 433 90 433 447 108 447 447 108 447 233 109 233 114 91 114 447 108 447 57 56 57 100 55 100 100 55 100 233 109 233 447 108 447 100 55 100 56 54 56 121 110 121 121 110 121 233 109 233 100 55 100 121 110 121 48 92 48 114 91 114 114 91 114 233 109 233 121 110 121 94 111 487 32 112 488 448 113 448 448 113 448 234 114 234 94 111 487 448 113 448 61 87 61 112 86 112 112 86 112 234 114 234 448 113 448 112 86 112 60 94 60 123 115 123 123 115 123 234 114 234 112 86 112 123 115 123 33 116 489 94 111 490 94 111 490 234 114 234 123 115 123 124 117 124 11 118 11 125 119 125 125 119 125 235 120 235 124 117 124 125 119 125 22 4 22 81 2 81 81 2 81 235 120 235 125 119 125 81 2 491 20 1 492 124 117 493 124 117 493 235 120 494 81 2 491 108 73 108 431 72 431 449 121 449 449 121 449 236 122 236 108 73 108 449 121 449 65 38 65 92 37 92 92 37 92 236 122 236 449 121 449 92 37 92 64 36 64 127 123 127 127 123 127 236 122 236 92 37 92 127 123 127 40 74 40 108 73 108 108 73 108 236 122 236 127 123 127 102 124 495 25 125 496 450 126 450 450 126 450 237 127 237 102 124 495 450 126 450 69 69 69 106 68 106 106 68 106 237 127 237 450 126 450 106 68 106 68 76 68 129 128 129 129 128 129 237 127 237 106 68 106 129 128 129 24 129 497 102 124 498 102 124 498 237 127 237 129 128 129 130 130 130 4 131 4 131 132 131 131 132 131 238 133 238 130 130 130 131 132 131 19 134 19 132 135 132 132 135 132 238 133 238 131 132 131 132 135 132 63 136 63 133 137 133 133 137 133 238 133 238 132 135 132 133 137 133 30 138 30 130 130 130 130 130 130 238 133 238 133 137 133 134 139 134 30 138 30 133 137 133 133 137 133 239 140 239 134 139 134 133 137 133 63 136 63 135 141 135 135 141 135 239 140 239 133 137 133 135 141 135 64 36 64 91 34 91 91 34 91 239 140 239 135 141 135 91 34 91 29 33 29 134 139 134 134 139 134 239 140 239 91 34 91 136 142 136 20 1 20 80 0 80 136 142 136 80 0 80 240 143 240 375 144 375 136 142 136 240 143 240 329 145 329 375 144 375 240 143 240 80 0 80 0 8 0 137 146 137 137 146 137 240 143 240 80 0 80 137 146 137 27 147 27 138 148 138 138 148 138 240 143 240 137 146 137 296 149 296 66 150 66 330 151 330 296 149 296 343 152 343 241 153 241 66 150 66 296 149 296 241 153 241 139 154 139 66 150 66 241 153 241 344 155 344 241 153 241 343 152 343 428 156 428 439 157 439 241 153 241 428 156 428 241 153 241 344 155 344 299 158 299 428 156 428 344 155 344 439 157 439 437 159 437 139 154 139 139 154 139 241 153 241 439 157 439 141 160 141 6 161 6 142 162 142 142 162 142 242 163 242 141 160 141 142 162 142 8 164 8 143 165 143 143 165 143 242 163 242 142 162 142 143 165 143 43 166 43 144 167 144 144 167 144 242 163 242 143 165 143 144 167 144 34 168 34 141 160 141 141 160 141 242 163 242 144 167 144 145 169 145 34 168 34 144 167 144 144 167 144 243 170 243 145 169 145 144 167 144 43 166 43 146 171 146 146 171 146 243 170 243 144 167 144 146 171 146 44 45 44 95 43 95 95 43 95 243 170 243 146 171 146 95 43 95 33 42 33 145 169 145 145 169 145 243 170 243 95 43 95 147 172 147 350 173 350 305 174 305 83 11 83 2 10 2 148 175 148 148 175 148 244 176 244 83 11 83 148 175 148 31 177 31 149 178 149 149 178 149 244 176 244 148 175 148 46 179 46 147 172 499 305 174 500 305 174 500 306 180 306 46 179 46 306 180 306 353 181 353 245 182 245 46 179 46 306 180 306 245 182 245 150 183 150 46 179 46 245 182 245 354 184 354 245 182 245 353 181 353 429 185 429 440 186 440 245 182 245 429 185 429 245 182 245 354 184 354 309 187 309 429 185 429 354 184 354 440 186 440 432 188 432 150 183 150 150 183 150 245 182 245 440 186 440 152 189 152 5 190 5 153 191 153 153 191 153 246 192 246 152 189 152 153 191 153 15 193 15 154 194 154 154 194 154 246 192 246 153 191 153 154 194 154 55 195 55 155 196 155 155 196 155 246 192 246 154 194 154 155 196 155 38 197 38 152 189 152 152 189 152 246 192 246 155 196 155 156 198 156 38 197 38 155 196 155 155 196 155 247 199 247 156 198 156 155 196 155 55 195 55 157 200 157 157 200 157 247 199 247 155 196 155 157 200 157 56 54 56 99 52 99 99 52 99 247 199 247 157 200 157 99 52 99 37 51 37 156 198 156 156 198 156 247 199 247 99 52 99 158 201 158 16 20 16 85 18 85 158 201 158 85 18 85 248 202 248 378 203 378 158 201 158 248 202 248 331 204 331 378 203 378 248 202 248 85 18 85 1 17 1 159 205 159 159 205 159 248 202 248 85 18 85 159 205 159 35 206 35 160 207 160 160 207 160 248 202 248 159 205 159 314 208 314 58 209 58 332 210 332 314 208 314 361 211 361 249 212 249 58 209 58 314 208 314 249 212 249 161 213 161 58 209 58 249 212 249 362 214 362 249 212 249 361 211 361 430 215 430 441 216 441 249 212 249 430 215 430 249 212 249 362 214 362 317 217 317 430 215 430 362 214 362 441 216 441 435 218 435 161 213 161 161 213 161 249 212 249 441 216 441 163 219 163 3 220 3 164 221 164 164 221 164 250 222 250 163 219 163 164 221 164 10 223 10 165 224 165 165 224 165 250 222 250 164 221 164 165 224 165 51 225 51 166 226 166 166 226 166 250 222 250 165 224 165 166 226 166 23 227 23 163 219 163 163 219 163 250 222 250 166 226 166 167 228 167 23 227 23 166 226 166 166 226 166 251 229 251 167 228 167 166 226 166 51 225 51 168 230 168 168 230 168 251 229 251 166 226 166 168 230 168 52 63 52 103 61 103 103 61 103 251 229 251 168 230 168 103 61 103 24 60 24 167 228 167 167 228 167 251 229 251 103 61 103 169 231 169 14 29 14 88 27 88 88 27 88 252 232 252 169 231 169 88 27 88 7 26 501 170 233 170 170 233 170 252 232 252 88 27 88 170 233 170 26 234 26 171 235 171 171 235 171 252 232 252 170 233 170 322 236 322 54 237 54 321 238 321 322 236 322 369 239 369 253 240 253 54 237 54 322 236 322 253 240 253 172 241 172 54 237 54 253 240 253 370 242 370 253 240 253 369 239 369 427 243 427 442 244 442 253 240 253 427 243 427 253 240 253 370 242 370 325 245 325 427 243 427 370 242 370 442 244 442 434 246 434 172 241 172 172 241 172 253 240 253 442 244 442 174 247 174 22 4 22 125 119 125 125 119 125 254 248 254 174 247 174 125 119 125 11 118 11 175 249 175 175 249 175 254 248 254 125 119 125 335 250 335 42 251 42 176 252 176 176 252 176 338 253 338 335 250 335 176 252 176 70 254 70 333 255 333 333 255 333 338 253 338 176 252 176 177 256 177 70 254 70 176 252 176 176 252 176 255 257 255 177 256 177 176 252 176 42 251 42 178 258 178 178 258 178 255 257 255 176 252 176 178 258 178 41 259 41 443 260 443 443 260 443 255 257 255 178 258 178 443 260 443 438 261 438 177 256 177 177 256 177 255 257 255 443 260 443 179 262 179 39 263 39 180 264 180 180 264 180 256 265 256 179 262 179 180 264 180 67 266 67 181 267 181 181 267 181 256 265 256 180 264 180 181 267 181 68 76 68 109 75 109 109 75 109 256 265 256 181 267 181 109 75 109 40 74 40 179 262 179 179 262 179 256 265 256 109 75 109 137 268 502 0 15 503 84 14 84 84 14 84 257 269 257 137 268 502 350 270 504 147 271 505 303 272 303 46 273 46 302 274 302 303 272 303 303 272 303 147 271 506 46 273 46 182 275 182 27 276 507 137 268 508 137 268 508 257 269 257 182 275 182 347 277 347 258 278 258 346 279 346 46 273 46 150 280 150 258 278 258 46 273 46 258 278 258 347 277 347 302 274 302 46 273 46 347 277 347 150 280 150 432 281 432 110 282 110 110 282 110 258 278 258 150 280 150 428 283 509 299 284 510 346 279 346 428 283 509 346 279 346 258 278 258 110 282 110 428 283 509 258 278 258 143 285 143 8 286 8 183 287 183 183 287 183 259 288 259 143 285 143 183 287 183 4 289 511 130 290 512 130 290 512 259 288 259 183 287 183 130 290 513 30 291 514 184 292 184 184 292 184 259 288 259 130 290 513 184 292 184 43 293 43 143 285 143 143 285 143 259 288 259 184 292 184 146 294 146 43 293 43 184 292 184 184 292 184 260 295 260 146 294 146 184 292 184 30 291 515 134 296 516 134 296 516 260 295 260 184 292 184 134 296 517 29 85 518 111 84 111 111 84 111 260 295 260 134 296 517 111 84 111 44 83 44 146 294 146 146 294 146 260 295 260 111 84 111 185 297 185 18 22 18 119 106 119 119 106 119 261 298 261 185 297 185 119 106 119 13 105 13 186 299 186 186 299 186 261 298 261 119 106 119 337 300 337 50 301 50 187 302 187 187 302 187 339 303 339 337 300 337 187 302 187 62 304 62 336 305 336 336 305 336 339 303 339 187 302 187 188 306 188 62 304 62 187 302 187 187 302 187 262 307 262 188 306 188 187 302 187 50 301 50 189 308 189 189 308 189 262 307 262 187 302 187 189 308 189 49 309 49 445 310 445 445 310 445 262 307 262 189 308 189 445 310 445 436 311 436 188 306 188 188 306 188 262 307 262 445 310 445 190 312 190 9 313 9 191 314 191 191 314 191 263 315 263 190 312 190 191 314 191 17 316 17 192 317 192 192 317 192 263 315 263 191 314 191 192 317 192 59 318 59 193 319 193 193 319 193 263 315 263 192 317 192 193 319 193 47 320 47 190 312 190 190 312 190 263 315 263 193 319 193 194 321 194 47 320 47 193 319 193 193 319 193 264 322 264 194 321 194 193 319 193 59 318 59 195 323 195 195 323 195 264 322 264 193 319 193 195 323 195 60 94 60 115 93 115 115 93 115 264 322 264 195 323 195 115 93 115 48 92 48 194 321 194 194 321 194 264 322 264 115 93 115 159 324 519 1 31 520 89 30 89 89 30 89 265 325 265 159 324 519 89 30 89 14 29 14 169 231 169 169 231 169 265 325 265 89 30 89 321 326 321 54 327 54 320 328 320 196 329 196 35 330 521 159 324 522 159 324 522 265 325 265 196 329 196 365 331 365 266 332 266 364 333 364 54 327 54 172 334 172 266 332 266 54 327 54 266 332 266 365 331 365 320 328 320 54 327 54 365 331 365 172 334 172 434 335 434 116 336 116 116 336 116 266 332 266 172 334 172 430 337 523 317 338 524 364 333 364 430 337 523 364 333 364 266 332 266 116 336 116 430 337 523 266 332 266 165 339 165 10 340 10 197 341 197 197 341 197 267 342 267 165 339 165 197 341 197 5 343 525 152 344 526 152 344 526 267 342 267 197 341 197 152 344 527 38 345 528 198 346 198 198 346 198 267 342 267 152 344 527 198 346 198 51 347 51 165 339 165 165 339 165 267 342 267 198 346 198 168 348 168 51 347 51 198 346 198 198 346 198 268 349 268 168 348 168 198 346 198 38 345 529 156 350 530 156 350 530 268 349 268 198 346 198 156 350 531 37 103 532 117 102 117 117 102 117 268 349 268 156 350 531 117 102 117 52 101 52 168 348 168 168 348 168 268 349 268 117 102 117 186 299 186 13 105 13 118 104 118 118 104 118 269 351 269 186 299 186 118 104 118 16 20 16 158 201 158 158 201 158 269 351 269 118 104 118 332 210 332 58 209 58 199 352 199 199 352 199 340 353 340 332 210 332 199 352 199 50 301 50 337 300 337 337 300 337 340 353 340 199 352 199 189 308 189 50 301 50 199 352 199 199 352 199 270 354 270 189 308 189 199 352 199 58 209 58 161 213 161 161 213 161 270 354 270 199 352 199 161 213 161 435 218 435 120 355 120 120 355 120 270 354 270 161 213 161 120 355 120 49 309 49 189 308 189 189 308 189 270 354 270 120 355 120 154 194 154 15 193 15 200 356 200 200 356 200 271 357 271 154 194 154 200 356 200 9 313 9 190 312 190 190 312 190 271 357 271 200 356 200 190 312 190 47 320 47 201 358 201 201 358 201 271 357 271 190 312 190 201 358 201 55 195 55 154 194 154 154 194 154 271 357 271 201 358 201 157 200 157 55 195 55 201 358 201 201 358 201 272 359 272 157 200 157 201 358 201 47 320 47 194 321 194 194 321 194 272 359 272 201 358 201 194 321 194 48 92 48 121 110 121 121 110 121 272 359 272 194 321 194 121 110 121 56 54 56 157 200 157 157 200 157 272 359 272 121 110 121 148 360 533 2 24 534 87 23 87 87 23 87 273 361 273 148 360 533 87 23 87 18 22 18 185 297 185 87 23 87 185 297 185 359 362 359 87 23 87 359 362 359 273 361 273 336 305 336 62 304 62 312 363 312 312 363 312 313 364 313 336 305 336 202 365 202 31 366 535 148 360 536 148 360 536 273 361 273 202 365 202 357 367 357 274 368 274 356 369 356 62 304 62 188 306 188 274 368 274 62 304 62 274 368 274 357 367 357 312 363 312 62 304 62 357 367 357 188 306 188 436 311 436 122 370 122 122 370 122 274 368 274 188 306 188 429 371 537 309 372 538 356 369 356 429 371 537 356 369 356 274 368 274 122 370 122 429 371 537 274 368 274 192 317 192 17 316 17 203 373 203 203 373 203 275 374 275 192 317 192 203 373 203 6 375 539 141 376 540 141 376 540 275 374 275 203 373 203 141 376 541 34 377 542 204 378 204 204 378 204 275 374 275 141 376 541 204 378 204 59 318 59 192 317 192 192 317 192 275 374 275 204 378 204 195 323 195 59 318 59 204 378 204 204 378 204 276 379 276 195 323 195 204 378 204 34 377 543 145 380 544 145 380 544 276 379 276 204 378 204 145 380 545 33 116 546 123 115 123 123 115 123 276 379 276 145 380 545 123 115 123 60 94 60 195 323 195 195 323 195 276 379 276 123 115 123 175 249 175 11 118 11 124 117 124 124 117 124 277 381 277 175 249 175 124 117 124 20 1 20 136 142 136 136 142 136 277 381 277 124 117 124 330 151 330 66 150 66 205 382 205 205 382 205 341 383 341 330 151 330 205 382 205 42 251 42 335 250 335 335 250 335 341 383 341 205 382 205 178 258 178 42 251 42 205 382 205 205 382 205 278 384 278 178 258 178 205 382 205 66 150 66 139 154 139 139 154 139 278 384 278 205 382 205 139 154 139 437 159 437 126 385 126 126 385 126 278 384 278 139 154 139 126 385 126 41 259 41 178 258 178 178 258 178 278 384 278 126 385 126 135 141 135 63 136 63 206 386 206 206 386 206 279 387 279 135 141 135 206 386 206 39 263 39 179 262 179 179 262 179 279 387 279 206 386 206 179 262 179 40 74 40 127 123 127 127 123 127 279 387 279 179 262 179 127 123 127 64 36 64 135 141 135 135 141 135 279 387 279 127 123 127 170 388 547 7 6 7 82 5 82 82 5 82 280 389 280 170 388 547 22 4 22 174 247 174 383 390 383 22 4 22 383 390 383 334 391 334 82 5 82 22 4 22 334 391 334 82 5 82 334 391 334 280 389 280 333 255 333 70 254 70 328 392 328 207 393 207 26 394 548 170 388 549 170 388 549 280 389 280 207 393 207 373 395 373 281 396 281 372 397 372 70 254 70 177 256 177 281 396 281 70 254 70 281 396 281 373 395 373 328 392 328 70 254 70 373 395 373 177 256 177 438 261 438 128 398 128 128 398 128 281 396 281 177 256 177 427 399 550 325 400 551 372 397 372 427 399 550 372 397 372 281 396 281 128 398 128 427 399 550 281 396 281 208 401 208 21 402 21 209 403 209 209 403 209 282 404 282 208 401 208 209 403 209 3 405 552 163 406 553 163 406 553 282 404 282 209 403 209 163 406 554 23 407 555 210 408 210 210 408 210 282 404 282 163 406 554 210 408 210 67 266 67 208 401 208 208 401 208 282 404 282 210 408 210 181 267 181 67 266 67 210 408 210 210 408 210 283 409 283 181 267 181 210 408 210 23 407 556 167 410 557 167 410 557 283 409 283 210 408 210 167 410 558 24 129 559 129 128 129 129 128 129 283 409 283 167 410 558 129 128 129 68 76 68 181 267 181 181 267 181 283 409 283 129 128 129 211 411 211 39 263 39 206 386 206 206 386 206 284 412 284 211 411 211 206 386 206 63 136 63 212 413 212 212 413 212 284 412 284 206 386 206 212 413 212 72 414 72 213 415 213 213 415 213 284 412 284 212 413 212 213 415 213 73 416 73 211 411 211 211 411 211 284 412 284 213 415 213 132 135 132 19 134 19 214 417 214 214 417 214 285 418 285 132 135 132 214 417 214 71 419 71 215 420 215 215 420 215 285 418 285 214 417 214 215 420 215 72 414 72 212 413 212 212 413 212 285 418 285 215 420 215 212 413 212 63 136 63 132 135 132 132 135 132 285 418 285 212 413 212 216 421 216 21 402 21 208 401 208 208 401 208 286 422 286 216 421 216 208 401 208 67 266 67 217 423 217 217 423 217 286 422 286 208 401 208 217 423 217 74 424 74 218 425 218 218 425 218 286 422 286 217 423 217 218 425 218 75 426 75 216 421 216 216 421 216 286 422 286 218 425 218 180 264 180 39 263 39 211 411 211 211 411 211 287 427 287 180 264 180 211 411 211 73 416 73 219 428 219 219 428 219 287 427 287 211 411 211 219 428 219 74 424 74 217 423 217 217 423 217 287 427 287 219 428 219 217 423 217 67 266 67 180 264 180 180 264 180 287 427 287 217 423 217 289 429 289 290 430 290 291 431 291 291 431 291 292 432 292 293 433 293 293 433 293 294 434 294 295 435 295 291 431 291 293 433 293 295 435 295 289 429 289 291 431 291 295 435 295 289 429 289 295 435 295 288 436 288 7 437 560 76 438 561 289 429 289 289 429 289 288 436 288 7 437 560 76 438 562 1 439 563 290 430 290 290 430 290 289 429 289 76 438 562 1 439 564 77 440 565 291 431 291 291 431 291 290 430 290 1 439 564 77 440 566 2 441 567 292 432 292 292 432 292 291 431 291 77 440 566 2 441 568 78 442 569 293 433 293 293 433 293 292 432 292 2 441 568 78 442 570 0 443 571 294 434 294 294 434 294 293 433 293 78 442 570 0 443 572 79 444 573 295 435 295 295 435 295 294 434 294 0 443 572 79 444 574 7 437 575 288 436 288 288 436 288 295 435 295 79 444 574 138 148 138 342 445 342 329 145 329 329 145 329 240 143 240 138 148 138 342 445 342 138 148 138 297 446 297 138 148 138 27 147 27 140 447 140 297 446 297 138 148 138 140 447 140 297 446 297 140 447 140 298 448 298 298 448 298 140 447 140 345 449 345 345 450 576 140 451 577 300 452 300 140 451 578 27 276 579 182 275 182 300 452 300 140 451 578 182 275 182 300 452 300 182 275 182 301 453 301 301 453 301 182 275 182 348 454 348 182 275 182 257 269 257 349 455 349 349 455 349 348 454 348 182 275 182 257 269 257 84 14 84 12 13 12 257 269 257 12 13 12 304 456 304 349 455 349 257 269 257 304 456 304 12 13 12 83 11 83 244 176 244 12 13 12 244 176 244 351 457 351 304 456 304 12 13 12 351 457 351 351 457 351 244 176 244 149 178 149 149 178 149 352 458 352 351 457 351 352 458 352 149 178 149 307 459 307 149 178 149 31 177 31 151 460 151 307 459 307 149 178 149 151 460 151 307 459 307 151 460 151 308 461 308 308 461 308 151 460 151 355 462 355 355 463 580 151 464 581 310 465 310 151 464 582 31 366 583 202 365 202 310 465 310 151 464 582 202 365 202 310 465 310 202 365 202 311 466 311 311 466 311 202 365 202 358 467 358 202 365 202 273 361 273 359 362 359 359 362 359 358 467 358 202 365 202 160 207 160 360 468 360 331 204 331 331 204 331 248 202 248 160 207 160 360 468 360 160 207 160 315 469 315 160 207 160 35 206 35 162 470 162 315 469 315 160 207 160 162 470 162 315 469 315 162 470 162 316 471 316 316 471 316 162 470 162 363 472 363 363 473 584 162 474 585 318 475 318 162 474 586 35 330 587 196 329 196 318 475 318 162 474 586 196 329 196 318 475 318 196 329 196 319 476 319 319 476 319 196 329 196 366 477 366 196 329 196 265 325 265 169 231 169 366 477 366 196 329 196 169 231 169 366 477 366 169 231 169 367 478 367 169 231 169 252 232 252 171 235 171 367 478 367 169 231 169 171 235 171 367 478 367 171 235 171 368 479 368 368 479 368 171 235 171 323 480 323 171 235 171 26 234 26 173 481 173 323 480 323 171 235 171 173 481 173 323 480 323 173 481 173 324 482 324 324 482 324 173 481 173 371 483 371 371 484 588 173 485 589 326 486 326 173 485 590 26 394 591 207 393 207 326 486 326 173 485 590 207 393 207 326 486 326 207 393 207 327 487 327 327 487 327 207 393 207 374 488 374 334 391 334 374 488 374 207 393 207 207 393 207 280 389 280 334 391 334 136 142 136 424 489 424 377 490 377 158 201 158 425 491 425 380 492 380 174 247 592 426 493 426 383 390 593 381 494 381 174 247 174 254 248 254 254 248 254 387 495 387 381 494 381 387 495 387 254 248 254 175 249 175 175 249 175 384 496 384 387 495 387 385 497 385 185 297 185 261 298 261 261 298 261 388 498 388 385 497 385 388 498 388 261 298 261 186 299 186 186 299 186 386 499 386 388 498 388 386 499 386 186 299 186 269 351 269 269 351 269 389 500 389 386 499 386 389 500 389 269 351 269 158 201 158 158 201 158 380 492 380 389 500 389 408 501 408 359 362 359 185 297 185 185 297 185 385 497 385 408 501 408 384 496 384 175 249 175 277 381 277 277 381 277 390 502 390 384 496 384 390 502 390 277 381 277 136 142 136 136 142 136 377 490 377 390 502 390 391 503 391 296 149 296 330 151 330 330 151 330 376 504 376 391 503 391 392 505 392 343 152 343 296 149 296 296 149 296 391 503 391 392 505 392 393 506 393 344 155 344 343 152 343 343 152 343 392 505 392 393 506 393 394 507 394 299 158 299 344 155 344 344 155 344 393 506 393 394 507 394 395 508 395 346 509 346 299 510 594 299 510 594 394 511 595 395 508 395 396 512 396 347 513 347 346 509 346 346 509 346 395 508 395 396 512 396 397 514 397 302 515 302 347 513 347 347 513 347 396 512 396 397 514 397 398 516 398 303 517 303 302 515 302 302 515 302 397 514 397 398 516 398 399 518 399 350 519 596 303 517 303 303 517 303 398 516 398 399 518 399 400 520 400 305 521 305 350 522 350 350 522 350 399 523 597 400 520 400 401 524 401 306 525 306 305 521 598 305 521 598 400 520 599 401 524 401 402 526 402 353 527 353 306 525 306 306 525 306 401 524 401 402 526 402 403 528 403 354 529 354 353 527 353 353 527 353 402 526 402 403 528 403 404 530 404 309 531 309 354 529 354 354 529 354 403 528 403 404 530 404 405 532 405 356 369 356 309 372 600 309 372 600 404 533 601 405 532 405 406 534 406 357 367 357 356 369 356 356 369 356 405 532 405 406 534 406 407 535 407 312 363 312 357 367 357 357 367 357 406 534 406 407 535 407 408 501 408 313 364 313 312 363 312 312 363 312 407 535 407 408 501 408 409 536 409 314 208 314 332 210 332 332 210 332 379 537 379 409 536 409 410 538 410 361 211 361 314 208 314 314 208 314 409 536 409 410 538 410 411 539 411 362 214 362 361 211 361 361 211 361 410 538 410 411 539 411 412 540 412 317 217 317 362 214 362 362 214 362 411 539 411 412 540 412 413 541 413 364 542 364 317 543 602 317 543 602 412 544 603 413 541 413 414 545 414 365 546 365 364 542 364 364 542 364 413 541 413 414 545 414 415 547 415 320 548 320 365 546 365 365 546 365 414 545 414 415 547 415 416 549 416 321 550 321 320 548 320 320 548 320 415 547 415 416 549 416 417 551 417 322 552 322 321 553 321 321 553 321 416 554 416 417 551 417 418 555 418 369 556 369 322 552 322 322 552 322 417 551 417 418 555 418 419 557 419 370 558 370 369 556 369 369 556 369 418 555 418 419 557 419 420 559 420 325 560 325 370 558 370 370 558 370 419 557 419 420 559 420 421 561 421 372 397 372 325 400 604 325 400 604 420 562 605 421 561 421 422 563 422 373 395 373 372 397 372 372 397 372 421 561 421 422 563 422 423 564 423 328 392 328 373 395 373 373 395 373 422 563 422 423 564 423 382 565 382 333 255 333 328 392 328 328 392 328 423 564 423 382 565 382 136 142 136 375 144 375 424 489 424 376 504 376 424 489 424 375 144 375 375 144 375 329 145 329 376 504 376 330 151 330 377 490 377 424 489 424 424 489 424 376 504 376 330 151 330 158 201 158 378 203 378 425 491 425 379 537 379 425 491 425 378 203 378 378 203 378 331 204 331 379 537 379 332 210 332 380 492 380 425 491 425 425 491 425 379 537 379 332 210 332 174 247 606 381 494 607 426 493 426 382 565 610 426 493 426 381 494 608 381 494 608 333 255 609 382 565 610 334 391 334 383 390 383 426 493 611 426 493 611 382 565 382 334 391 334 333 255 333 381 494 381 387 495 387 387 495 387 338 253 338 333 255 333 338 253 338 387 495 387 384 496 384 384 496 384 335 250 335 338 253 338 336 305 336 385 497 385 388 498 388 388 498 388 339 303 339 336 305 336 339 303 339 388 498 388 386 499 386 386 499 386 337 300 337 339 303 339 337 300 337 386 499 386 389 500 389 389 500 389 340 353 340 337 300 337 340 353 340 389 500 389 380 492 380 380 492 380 332 210 332 340 353 340 313 364 313 408 501 408 385 497 385 385 497 385 336 305 336 313 364 313 335 250 335 384 496 384 390 502 390 390 502 390 341 383 341 335 250 335 341 383 341 390 502 390 377 490 377 377 490 377 330 151 330 341 383 341 342 445 342 391 503 391 376 504 376 376 504 376 329 145 329 342 445 342 297 446 297 392 505 392 391 503 391 391 503 391 342 445 342 297 446 297 298 448 298 393 506 393 392 505 392 392 505 392 297 446 297 298 448 298 345 449 345 394 507 394 393 506 393 393 506 393 298 448 298 345 449 345 300 566 300 395 567 395 394 568 612 394 568 612 345 569 613 300 566 300 301 570 301 396 571 396 395 567 395 395 567 395 300 566 300 301 570 301 348 572 348 397 573 397 396 571 396 396 571 396 301 570 301 348 572 348 349 574 349 398 575 398 397 573 397 397 573 397 348 572 348 349 574 349 304 576 304 399 577 399 398 575 398 398 575 398 349 574 349 304 576 304 351 457 616 400 578 400 399 579 614 399 579 614 304 456 615 351 457 616 352 458 352 401 580 401 400 578 617 400 578 617 351 457 351 352 458 352 307 459 307 402 581 402 401 580 401 401 580 401 352 458 352 307 459 307 308 461 308 403 582 403 402 581 402 402 581 402 307 459 307 308 461 308 355 462 355 404 583 404 403 582 403 403 582 403 308 461 308 355 462 355 310 465 310 405 532 405 404 533 618 404 533 618 355 463 619 310 465 310 311 466 311 406 534 406 405 532 405 405 532 405 310 465 310 311 466 311 358 467 358 407 535 407 406 534 406 406 534 406 311 466 311 358 467 358 359 362 359 408 501 408 407 535 407 407 535 407 358 467 358 359 362 359 360 468 360 409 536 409 379 537 379 379 537 379 331 204 331 360 468 360 315 469 315 410 538 410 409 536 409 409 536 409 360 468 360 315 469 315 316 471 316 411 539 411 410 538 410 410 538 410 315 469 315 316 471 316 363 472 363 412 540 412 411 539 411 411 539 411 316 471 316 363 472 363 318 584 318 413 585 413 412 586 620 412 586 620 363 587 621 318 584 318 319 588 319 414 589 414 413 585 413 413 585 413 318 584 318 319 588 319 366 590 366 415 591 415 414 589 414 414 589 414 319 588 319 366 590 366 367 592 367 416 593 416 415 591 415 415 591 415 366 590 366 367 592 367 368 594 368 417 595 417 416 593 416 416 593 416 367 592 367 368 594 368 323 596 323 418 597 418 417 595 417 417 595 417 368 594 368 323 596 323 324 598 324 419 599 419 418 597 418 418 597 418 323 596 323 324 598 324 371 600 371 420 601 420 419 599 419 419 599 419 324 598 324 371 600 371 326 486 326 421 561 421 420 562 622 420 562 622 371 484 623 326 486 326 327 487 327 422 563 422 421 561 421 421 561 421 326 486 326 327 487 327 374 488 374 423 564 423 422 563 422 422 563 422 327 487 327 374 488 374 334 391 334 382 565 382 423 564 423 423 564 423 374 488 374 334 391 334 463 602 463 93 39 93 65 38 65 65 38 65 461 603 461 463 602 463 464 604 464 97 48 97 45 47 45 45 47 45 456 605 456 464 604 464 465 606 465 101 57 101 57 56 57 57 56 57 459 607 459 465 606 465 466 608 466 105 66 105 53 65 53 53 65 53 458 609 458 466 608 466 467 610 467 107 70 107 69 69 69 69 69 69 462 611 462 467 610 467 468 612 468 444 79 444 28 78 624 28 78 624 452 613 452 468 612 468 469 614 469 113 88 113 61 87 61 61 87 61 460 615 460 469 614 469 470 616 470 446 97 446 36 96 625 36 96 625 454 617 454 470 616 470 471 618 471 447 108 447 433 90 433 433 90 433 457 619 457 471 618 471 472 620 472 448 113 448 32 112 626 32 112 626 453 621 453 472 620 472 473 622 473 449 121 449 431 72 431 431 72 431 455 623 455 473 622 473 474 624 474 450 126 450 25 125 627 25 125 627 451 625 451 474 624 474 452 626 628 28 40 28 93 39 93 93 39 93 463 602 463 452 626 628 453 627 629 32 49 32 97 48 97 97 48 97 464 604 464 453 627 629 454 628 630 36 58 36 101 57 101 101 57 101 465 606 465 454 628 630 451 629 631 25 67 25 105 66 105 105 66 105 466 608 466 451 629 631 455 623 455 431 72 431 107 70 107 107 70 107 467 610 467 455 623 455 456 630 456 45 81 45 444 79 444 444 79 444 468 612 468 456 630 456 457 619 457 433 90 433 113 88 113 113 88 113 469 614 469 457 619 457 458 631 458 53 99 53 446 97 446 446 97 446 470 616 470 458 631 458 459 607 459 57 56 57 447 108 447 447 108 447 471 618 471 459 607 459 460 615 460 61 87 61 448 113 448 448 113 448 472 620 472 460 615 460 461 603 461 65 38 65 449 121 449 449 121 449 473 622 473 461 603 461 462 611 462 69 69 69 450 126 450 450 126 450 474 624 474 462 611 462 439 157 439 463 602 463 461 603 461 461 603 461 437 159 437 439 157 439 440 186 440 464 604 464 456 605 456 456 605 456 432 188 432 440 186 440 441 216 441 465 606 465 459 607 459 459 607 459 435 218 435 441 216 441 442 244 442 466 608 466 458 609 458 458 609 458 434 246 434 442 244 442 443 260 443 467 610 467 462 611 462 462 611 462 438 261 438 443 260 443 110 282 110 468 612 468 452 613 452 452 613 452 428 283 632 110 282 110 445 310 445 469 614 469 460 615 460 460 615 460 436 311 436 445 310 445 116 336 116 470 616 470 454 617 454 454 617 454 430 337 633 116 336 116 120 355 120 471 618 471 457 619 457 457 619 457 49 309 49 120 355 120 122 370 122 472 620 472 453 621 453 453 621 453 429 371 634 122 370 122 126 385 126 473 622 473 455 623 455 455 623 455 41 259 41 126 385 126 128 398 128 474 624 474 451 625 451 451 625 451 427 399 635 128 398 128 428 156 428 452 626 636 463 602 463 463 602 463 439 157 439 428 156 428 429 185 429 453 627 637 464 604 464 464 604 464 440 186 440 429 185 429 430 215 430 454 628 638 465 606 465 465 606 465 441 216 441 430 215 430 427 243 427 451 629 639 466 608 466 466 608 466 442 244 442 427 243 427 41 259 41 455 623 455 467 610 467 467 610 467 443 260 443 41 259 41 432 281 432 456 630 456 468 612 468 468 612 468 110 282 110 432 281 432 49 309 49 457 619 457 469 614 469 469 614 469 445 310 445 49 309 49 434 335 434 458 631 458 470 616 470 470 616 470 116 336 116 434 335 434 435 218 435 459 607 459 471 618 471 471 618 471 120 355 120 435 218 435 436 311 436 460 615 460 472 620 472 472 620 472 122 370 122 436 311 436 437 159 437 461 603 461 473 622 473 473 622 473 126 385 126 437 159 437 438 261 438 462 611 462 474 624 474 474 624 474 128 398 128 438 261 438 556 632 81 495 633 20 555 634 80 555 634 80 695 635 220 556 632 81 557 636 82 497 637 22 556 632 81 556 632 81 695 635 220 557 636 82 554 638 79 482 639 7 557 636 82 557 636 82 695 635 220 554 638 79 555 634 80 475 640 0 554 638 79 554 638 79 695 635 220 555 634 80 558 641 83 477 642 2 553 643 78 553 643 78 696 644 221 558 641 83 559 645 84 487 646 12 558 641 83 558 641 83 696 644 221 559 645 84 553 643 78 475 647 475 559 645 84 559 645 84 696 644 221 553 643 78 560 648 85 476 649 1 552 650 77 552 650 77 697 651 222 560 648 85 561 652 86 491 653 16 560 648 85 560 648 85 697 651 222 561 652 86 562 654 87 493 655 18 561 652 86 561 652 86 697 651 222 562 654 87 552 650 77 477 656 476 562 654 87 562 654 87 697 651 222 552 650 77 563 657 88 482 658 477 551 659 76 551 659 76 698 660 223 563 657 88 564 661 89 489 662 14 563 657 88 563 657 88 698 660 223 564 661 89 551 659 76 476 663 478 564 661 89 564 661 89 698 660 223 551 659 76 566 664 91 504 665 29 565 666 90 565 666 90 699 667 224 566 664 91 567 668 92 539 669 64 566 664 91 566 664 91 699 667 224 567 668 92 568 670 93 540 671 65 567 668 92 567 668 92 699 667 224 568 670 93 565 666 90 503 672 28 568 670 93 568 670 93 699 667 224 565 666 90 570 673 95 508 674 33 569 675 94 569 675 94 700 676 225 570 673 95 571 677 96 519 678 44 570 673 95 570 673 95 700 676 225 571 677 96 572 679 97 520 680 45 571 677 96 571 677 96 700 676 225 572 679 97 569 675 94 507 681 32 572 679 97 572 679 97 700 676 225 569 675 94 574 682 99 512 683 37 573 684 98 573 684 98 701 685 226 574 682 99 575 686 100 531 687 56 574 682 99 574 682 99 701 685 226 575 686 100 576 688 101 532 689 57 575 686 100 575 686 100 701 685 226 576 688 101 573 684 98 511 690 36 576 688 101 576 688 101 701 685 226 573 684 98 578 691 103 499 692 24 577 693 102 577 693 102 702 694 227 578 691 103 579 695 104 527 696 52 578 691 103 578 691 103 702 694 227 579 695 104 580 697 105 528 698 53 579 695 104 579 695 104 702 694 227 580 697 105 577 693 102 500 699 25 580 697 105 580 697 105 702 694 227 577 693 102 582 700 107 544 701 69 581 702 106 581 702 106 703 703 228 582 700 107 583 704 108 906 705 431 582 700 107 582 700 107 703 703 228 583 704 108 584 706 109 515 707 40 583 704 108 583 704 108 703 703 228 584 706 109 581 702 106 543 708 68 584 706 109 584 706 109 703 703 228 581 702 106 919 709 444 503 710 480 565 711 479 565 711 479 704 712 229 919 709 444 571 713 96 520 714 45 919 709 444 919 709 444 704 712 229 571 713 96 586 715 111 519 716 44 571 713 96 571 713 96 704 712 229 586 715 111 565 711 482 504 717 481 586 715 111 586 715 111 704 712 229 565 711 482 588 718 113 536 719 61 587 720 112 587 720 112 705 721 230 588 718 113 589 722 114 908 723 433 588 718 113 588 718 113 705 721 230 589 722 114 590 724 115 523 725 48 589 722 114 589 722 114 705 721 230 590 724 115 587 720 112 535 726 60 590 724 115 590 724 115 705 721 230 587 720 112 921 727 446 511 728 484 573 729 483 573 729 483 706 730 231 921 727 446 579 731 104 528 732 53 921 727 446 921 727 446 706 730 231 579 731 104 592 733 117 527 734 52 579 731 104 579 731 104 706 730 231 592 733 117 573 729 486 512 735 485 592 733 117 592 733 117 706 730 231 573 729 486 594 736 119 488 737 13 593 738 118 593 738 118 707 739 232 594 736 119 561 652 86 493 655 18 594 736 119 594 736 119 707 739 232 561 652 86 593 738 118 491 653 16 561 652 86 561 652 86 707 739 232 593 738 118 922 740 447 908 723 433 589 722 114 589 722 114 708 741 233 922 740 447 575 686 100 532 689 57 922 740 447 922 740 447 708 741 233 575 686 100 596 742 121 531 687 56 575 686 100 575 686 100 708 741 233 596 742 121 589 722 114 523 725 48 596 742 121 596 742 121 708 741 233 589 722 114 923 743 448 507 744 488 569 745 487 569 745 487 709 746 234 923 743 448 587 720 112 536 719 61 923 743 448 923 743 448 709 746 234 587 720 112 598 747 123 535 726 60 587 720 112 587 720 112 709 746 234 598 747 123 569 745 490 508 748 489 598 747 123 598 747 123 709 746 234 569 745 490 600 749 125 486 750 11 599 751 124 599 751 124 710 752 235 600 749 125 556 632 81 497 637 22 600 749 125 600 749 125 710 752 235 556 632 81 599 751 493 495 633 492 556 632 491 556 632 491 710 752 494 599 751 493 924 753 449 906 705 431 583 704 108 583 704 108 711 754 236 924 753 449 567 668 92 540 671 65 924 753 449 924 753 449 711 754 236 567 668 92 602 755 127 539 669 64 567 668 92 567 668 92 711 754 236 602 755 127 583 704 108 515 707 40 602 755 127 602 755 127 711 754 236 583 704 108 925 756 450 500 757 496 577 758 495 577 758 495 712 759 237 925 756 450 581 702 106 544 701 69 925 756 450 925 756 450 712 759 237 581 702 106 604 760 129 543 708 68 581 702 106 581 702 106 712 759 237 604 760 129 577 758 498 499 761 497 604 760 129 604 760 129 712 759 237 577 758 498 606 762 131 479 763 4 605 764 130 605 764 130 713 765 238 606 762 131 607 766 132 494 767 19 606 762 131 606 762 131 713 765 238 607 766 132 608 768 133 538 769 63 607 766 132 607 766 132 713 765 238 608 768 133 605 764 130 505 770 30 608 768 133 608 768 133 713 765 238 605 764 130 608 768 133 505 770 30 609 771 134 609 771 134 714 772 239 608 768 133 610 773 135 538 769 63 608 768 133 608 768 133 714 772 239 610 773 135 566 664 91 539 669 64 610 773 135 610 773 135 714 772 239 566 664 91 609 771 134 504 665 29 566 664 91 566 664 91 714 772 239 609 771 134 555 634 80 495 633 20 611 774 136 715 775 240 555 634 80 611 774 136 715 775 240 611 774 136 850 776 375 715 775 240 850 776 375 804 777 329 612 778 137 475 640 0 555 634 80 555 634 80 715 775 240 612 778 137 613 779 138 502 780 27 612 778 137 612 778 137 715 775 240 613 779 138 805 781 330 541 782 66 771 783 296 716 784 241 818 785 343 771 783 296 716 784 241 771 783 296 541 782 66 716 784 241 541 782 66 614 786 139 818 785 343 716 784 241 819 787 344 716 784 241 914 788 439 903 789 428 819 787 344 716 784 241 903 789 428 819 787 344 903 789 428 774 790 299 614 786 139 912 791 437 914 788 439 914 788 439 716 784 241 614 786 139 617 792 142 481 793 6 616 794 141 616 794 141 717 795 242 617 792 142 618 796 143 483 797 8 617 792 142 617 792 142 717 795 242 618 796 143 619 798 144 518 799 43 618 796 143 618 796 143 717 795 242 619 798 144 616 794 141 509 800 34 619 798 144 619 798 144 717 795 242 616 794 141 619 798 144 509 800 34 620 801 145 620 801 145 718 802 243 619 798 144 621 803 146 518 799 43 619 798 144 619 798 144 718 802 243 621 803 146 570 673 95 519 678 44 621 803 146 621 803 146 718 802 243 570 673 95 620 801 145 508 674 33 570 673 95 570 673 95 718 802 243 620 801 145 780 804 305 825 805 350 622 806 147 623 807 148 477 642 2 558 641 83 558 641 83 719 808 244 623 807 148 624 809 149 506 810 31 623 807 148 623 807 148 719 808 244 624 809 149 780 804 500 622 806 499 521 811 46 521 811 46 781 812 306 780 804 500 720 813 245 828 814 353 781 812 306 720 813 245 781 812 306 521 811 46 720 813 245 521 811 46 625 815 150 828 814 353 720 813 245 829 816 354 720 813 245 915 817 440 904 818 429 829 816 354 720 813 245 904 818 429 829 816 354 904 818 429 784 819 309 625 815 150 907 820 432 915 817 440 915 817 440 720 813 245 625 815 150 628 821 153 480 822 5 627 823 152 627 823 152 721 824 246 628 821 153 629 825 154 490 826 15 628 821 153 628 821 153 721 824 246 629 825 154 630 827 155 530 828 55 629 825 154 629 825 154 721 824 246 630 827 155 627 823 152 513 829 38 630 827 155 630 827 155 721 824 246 627 823 152 630 827 155 513 829 38 631 830 156 631 830 156 722 831 247 630 827 155 632 832 157 530 828 55 630 827 155 630 827 155 722 831 247 632 832 157 574 682 99 531 687 56 632 832 157 632 832 157 722 831 247 574 682 99 631 830 156 512 683 37 574 682 99 574 682 99 722 831 247 631 830 156 560 648 85 491 653 16 633 833 158 723 834 248 560 648 85 633 833 158 723 834 248 633 833 158 853 835 378 723 834 248 853 835 378 806 836 331 634 837 159 476 649 1 560 648 85 560 648 85 723 834 248 634 837 159 635 838 160 510 839 35 634 837 159 634 837 159 723 834 248 635 838 160 807 840 332 533 841 58 789 842 314 724 843 249 836 844 361 789 842 314 724 843 249 789 842 314 533 841 58 724 843 249 533 841 58 636 845 161 836 844 361 724 843 249 837 846 362 724 843 249 916 847 441 905 848 430 837 846 362 724 843 249 905 848 430 837 846 362 905 848 430 792 849 317 636 845 161 910 850 435 916 847 441 916 847 441 724 843 249 636 845 161 639 851 164 478 852 3 638 853 163 638 853 163 725 854 250 639 851 164 640 855 165 485 856 10 639 851 164 639 851 164 725 854 250 640 855 165 641 857 166 526 858 51 640 855 165 640 855 165 725 854 250 641 857 166 638 853 163 498 859 23 641 857 166 641 857 166 725 854 250 638 853 163 641 857 166 498 859 23 642 860 167 642 860 167 726 861 251 641 857 166 643 862 168 526 858 51 641 857 166 641 857 166 726 861 251 643 862 168 578 691 103 527 696 52 643 862 168 643 862 168 726 861 251 578 691 103 642 860 167 499 692 24 578 691 103 578 691 103 726 861 251 642 860 167 563 657 88 489 662 14 644 863 169 644 863 169 727 864 252 563 657 88 645 865 170 482 658 501 563 657 88 563 657 88 727 864 252 645 865 170 646 866 171 501 867 26 645 865 170 645 865 170 727 864 252 646 866 171 796 868 321 529 869 54 797 870 322 728 871 253 844 872 369 797 870 322 728 871 253 797 870 322 529 869 54 728 871 253 529 869 54 647 873 172 844 872 369 728 871 253 845 874 370 728 871 253 917 875 442 902 876 427 845 874 370 728 871 253 902 876 427 845 874 370 902 876 427 800 877 325 647 873 172 909 878 434 917 875 442 917 875 442 728 871 253 647 873 172 600 749 125 497 637 22 649 879 174 649 879 174 729 880 254 600 749 125 650 881 175 486 750 11 600 749 125 600 749 125 729 880 254 650 881 175 651 882 176 517 883 42 810 884 335 810 884 335 813 885 338 651 882 176 808 886 333 545 887 70 651 882 176 651 882 176 813 885 338 808 886 333 651 882 176 545 887 70 652 888 177 652 888 177 730 889 255 651 882 176 653 890 178 517 883 42 651 882 176 651 882 176 730 889 255 653 890 178 918 891 443 516 892 41 653 890 178 653 890 178 730 889 255 918 891 443 652 888 177 913 893 438 918 891 443 918 891 443 730 889 255 652 888 177 655 894 180 514 895 39 654 896 179 654 896 179 731 897 256 655 894 180 656 898 181 542 899 67 655 894 180 655 894 180 731 897 256 656 898 181 584 706 109 543 708 68 656 898 181 656 898 181 731 897 256 584 706 109 654 896 179 515 707 40 584 706 109 584 706 109 731 897 256 654 896 179 559 645 84 475 647 503 612 900 502 612 900 502 732 901 257 559 645 84 778 902 303 622 903 505 825 904 504 778 902 303 777 905 302 521 906 46 521 906 46 622 903 506 778 902 303 612 900 508 502 907 507 657 908 182 657 908 182 732 901 257 612 900 508 821 909 346 733 910 258 822 911 347 733 910 258 625 912 150 521 906 46 822 911 347 733 910 258 521 906 46 822 911 347 521 906 46 777 905 302 585 913 110 907 914 432 625 912 150 625 912 150 733 910 258 585 913 110 821 909 346 774 915 510 903 916 509 733 910 258 821 909 346 903 916 509 733 910 258 903 916 509 585 913 110 658 917 183 483 918 8 618 919 143 618 919 143 734 920 259 658 917 183 605 921 512 479 922 511 658 917 183 658 917 183 734 920 259 605 921 512 659 923 184 505 924 514 605 921 513 605 921 513 734 920 259 659 923 184 618 919 143 518 925 43 659 923 184 659 923 184 734 920 259 618 919 143 659 923 184 518 925 43 621 926 146 621 926 146 735 927 260 659 923 184 609 928 516 505 924 515 659 923 184 659 923 184 735 927 260 609 928 516 586 715 111 504 717 518 609 928 517 609 928 517 735 927 260 586 715 111 621 926 146 519 716 44 586 715 111 586 715 111 735 927 260 621 926 146 594 736 119 493 655 18 660 929 185 660 929 185 736 930 261 594 736 119 661 931 186 488 737 13 594 736 119 594 736 119 736 930 261 661 931 186 662 932 187 525 933 50 812 934 337 812 934 337 814 935 339 662 932 187 811 936 336 537 937 62 662 932 187 662 932 187 814 935 339 811 936 336 662 932 187 537 937 62 663 938 188 663 938 188 737 939 262 662 932 187 664 940 189 525 933 50 662 932 187 662 932 187 737 939 262 664 940 189 920 941 445 524 942 49 664 940 189 664 940 189 737 939 262 920 941 445 663 938 188 911 943 436 920 941 445 920 941 445 737 939 262 663 938 188 666 944 191 484 945 9 665 946 190 665 946 190 738 947 263 666 944 191 667 948 192 492 949 17 666 944 191 666 944 191 738 947 263 667 948 192 668 950 193 534 951 59 667 948 192 667 948 192 738 947 263 668 950 193 665 946 190 522 952 47 668 950 193 668 950 193 738 947 263 665 946 190 668 950 193 522 952 47 669 953 194 669 953 194 739 954 264 668 950 193 670 955 195 534 951 59 668 950 193 668 950 193 739 954 264 670 955 195 590 724 115 535 726 60 670 955 195 670 955 195 739 954 264 590 724 115 669 953 194 523 725 48 590 724 115 590 724 115 739 954 264 669 953 194 564 661 89 476 663 520 634 956 519 634 956 519 740 957 265 564 661 89 644 863 169 489 662 14 564 661 89 564 661 89 740 957 265 644 863 169 795 958 320 529 959 54 796 960 321 634 956 522 510 961 521 671 962 196 671 962 196 740 957 265 634 956 522 839 963 364 741 964 266 840 965 365 741 964 266 647 966 172 529 959 54 840 965 365 741 964 266 529 959 54 840 965 365 529 959 54 795 958 320 591 967 116 909 968 434 647 966 172 647 966 172 741 964 266 591 967 116 839 963 364 792 969 524 905 970 523 741 964 266 839 963 364 905 970 523 741 964 266 905 970 523 591 967 116 672 971 197 485 972 10 640 973 165 640 973 165 742 974 267 672 971 197 627 975 526 480 976 525 672 971 197 672 971 197 742 974 267 627 975 526 673 977 198 513 978 528 627 975 527 627 975 527 742 974 267 673 977 198 640 973 165 526 979 51 673 977 198 673 977 198 742 974 267 640 973 165 673 977 198 526 979 51 643 980 168 643 980 168 743 981 268 673 977 198 631 982 530 513 978 529 673 977 198 673 977 198 743 981 268 631 982 530 592 733 117 512 735 532 631 982 531 631 982 531 743 981 268 592 733 117 643 980 168 527 734 52 592 733 117 592 733 117 743 981 268 643 980 168 593 738 118 488 737 13 661 931 186 661 931 186 744 983 269 593 738 118 633 833 158 491 653 16 593 738 118 593 738 118 744 983 269 633 833 158 674 984 199 533 841 58 807 840 332 807 840 332 815 985 340 674 984 199 812 934 337 525 933 50 674 984 199 674 984 199 815 985 340 812 934 337 674 984 199 525 933 50 664 940 189 664 940 189 745 986 270 674 984 199 636 845 161 533 841 58 674 984 199 674 984 199 745 986 270 636 845 161 595 987 120 910 850 435 636 845 161 636 845 161 745 986 270 595 987 120 664 940 189 524 942 49 595 987 120 595 987 120 745 986 270 664 940 189 675 988 200 490 826 15 629 825 154 629 825 154 746 989 271 675 988 200 665 946 190 484 945 9 675 988 200 675 988 200 746 989 271 665 946 190 676 990 201 522 952 47 665 946 190 665 946 190 746 989 271 676 990 201 629 825 154 530 828 55 676 990 201 676 990 201 746 989 271 629 825 154 676 990 201 530 828 55 632 832 157 632 832 157 747 991 272 676 990 201 669 953 194 522 952 47 676 990 201 676 990 201 747 991 272 669 953 194 596 742 121 523 725 48 669 953 194 669 953 194 747 991 272 596 742 121 632 832 157 531 687 56 596 742 121 596 742 121 747 991 272 632 832 157 562 654 87 477 656 534 623 992 533 623 992 533 748 993 273 562 654 87 660 929 185 493 655 18 562 654 87 834 994 359 660 929 185 562 654 87 748 993 273 834 994 359 562 654 87 787 995 312 537 937 62 811 936 336 811 936 336 788 996 313 787 995 312 623 992 536 506 997 535 677 998 202 677 998 202 748 993 273 623 992 536 831 999 356 749 1000 274 832 1001 357 749 1000 274 663 938 188 537 937 62 832 1001 357 749 1000 274 537 937 62 832 1001 357 537 937 62 787 995 312 597 1002 122 911 943 436 663 938 188 663 938 188 749 1000 274 597 1002 122 831 999 356 784 1003 538 904 1004 537 749 1000 274 831 999 356 904 1004 537 749 1000 274 904 1004 537 597 1002 122 678 1005 203 492 949 17 667 948 192 667 948 192 750 1006 275 678 1005 203 616 1007 540 481 1008 539 678 1005 203 678 1005 203 750 1006 275 616 1007 540 679 1009 204 509 1010 542 616 1007 541 616 1007 541 750 1006 275 679 1009 204 667 948 192 534 951 59 679 1009 204 679 1009 204 750 1006 275 667 948 192 679 1009 204 534 951 59 670 955 195 670 955 195 751 1011 276 679 1009 204 620 1012 544 509 1010 543 679 1009 204 679 1009 204 751 1011 276 620 1012 544 598 747 123 508 748 546 620 1012 545 620 1012 545 751 1011 276 598 747 123 670 955 195 535 726 60 598 747 123 598 747 123 751 1011 276 670 955 195 599 751 124 486 750 11 650 881 175 650 881 175 752 1013 277 599 751 124 611 774 136 495 633 20 599 751 124 599 751 124 752 1013 277 611 774 136 680 1014 205 541 782 66 805 781 330 805 781 330 816 1015 341 680 1014 205 810 884 335 517 883 42 680 1014 205 680 1014 205 816 1015 341 810 884 335 680 1014 205 517 883 42 653 890 178 653 890 178 753 1016 278 680 1014 205 614 786 139 541 782 66 680 1014 205 680 1014 205 753 1016 278 614 786 139 601 1017 126 912 791 437 614 786 139 614 786 139 753 1016 278 601 1017 126 653 890 178 516 892 41 601 1017 126 601 1017 126 753 1016 278 653 890 178 681 1018 206 538 769 63 610 773 135 610 773 135 754 1019 279 681 1018 206 654 896 179 514 895 39 681 1018 206 681 1018 206 754 1019 279 654 896 179 602 755 127 515 707 40 654 896 179 654 896 179 754 1019 279 602 755 127 610 773 135 539 669 64 602 755 127 602 755 127 754 1019 279 610 773 135 557 636 82 482 639 7 645 1020 547 645 1020 547 755 1021 280 557 636 82 858 1022 383 649 879 174 497 637 22 809 1023 334 858 1022 383 497 637 22 809 1023 334 497 637 22 557 636 82 755 1021 280 809 1023 334 557 636 82 803 1024 328 545 887 70 808 886 333 645 1020 549 501 1025 548 682 1026 207 682 1026 207 755 1021 280 645 1020 549 847 1027 372 756 1028 281 848 1029 373 756 1028 281 652 888 177 545 887 70 848 1029 373 756 1028 281 545 887 70 848 1029 373 545 887 70 803 1024 328 603 1030 128 913 893 438 652 888 177 652 888 177 756 1028 281 603 1030 128 847 1027 372 800 1031 551 902 1032 550 756 1028 281 847 1027 372 902 1032 550 756 1028 281 902 1032 550 603 1030 128 684 1033 209 496 1034 21 683 1035 208 683 1035 208 757 1036 282 684 1033 209 638 1037 553 478 1038 552 684 1033 209 684 1033 209 757 1036 282 638 1037 553 685 1039 210 498 1040 555 638 1037 554 638 1037 554 757 1036 282 685 1039 210 683 1035 208 542 899 67 685 1039 210 685 1039 210 757 1036 282 683 1035 208 685 1039 210 542 899 67 656 898 181 656 898 181 758 1041 283 685 1039 210 642 1042 557 498 1040 556 685 1039 210 685 1039 210 758 1041 283 642 1042 557 604 760 129 499 761 559 642 1042 558 642 1042 558 758 1041 283 604 760 129 656 898 181 543 708 68 604 760 129 604 760 129 758 1041 283 656 898 181 681 1018 206 514 895 39 686 1043 211 686 1043 211 759 1044 284 681 1018 206 687 1045 212 538 769 63 681 1018 206 681 1018 206 759 1044 284 687 1045 212 688 1046 213 547 1047 72 687 1045 212 687 1045 212 759 1044 284 688 1046 213 686 1043 211 548 1048 73 688 1046 213 688 1046 213 759 1044 284 686 1043 211 689 1049 214 494 767 19 607 766 132 607 766 132 760 1050 285 689 1049 214 690 1051 215 546 1052 71 689 1049 214 689 1049 214 760 1050 285 690 1051 215 687 1045 212 547 1047 72 690 1051 215 690 1051 215 760 1050 285 687 1045 212 607 766 132 538 769 63 687 1045 212 687 1045 212 760 1050 285 607 766 132 683 1035 208 496 1034 21 691 1053 216 691 1053 216 761 1054 286 683 1035 208 692 1055 217 542 899 67 683 1035 208 683 1035 208 761 1054 286 692 1055 217 693 1056 218 549 1057 74 692 1055 217 692 1055 217 761 1054 286 693 1056 218 691 1053 216 550 1058 75 693 1056 218 693 1056 218 761 1054 286 691 1053 216 686 1043 211 514 895 39 655 894 180 655 894 180 762 1059 287 686 1043 211 694 1060 219 548 1048 73 686 1043 211 686 1043 211 762 1059 287 694 1060 219 692 1055 217 549 1057 74 694 1060 219 694 1060 219 762 1059 287 692 1055 217 655 894 180 542 899 67 692 1055 217 692 1055 217 762 1059 287 655 894 180 766 1061 291 765 1062 290 764 1063 289 768 1064 293 767 1065 292 766 1061 291 770 1066 295 769 1067 294 768 1064 293 770 1066 295 768 1064 293 766 1061 291 770 1066 295 766 1061 291 764 1063 289 763 1068 288 770 1066 295 764 1063 289 764 1063 289 551 1069 561 482 1070 560 482 1070 560 763 1068 288 764 1063 289 765 1062 290 476 1071 563 551 1069 562 551 1069 562 764 1063 289 765 1062 290 766 1061 291 552 1072 565 476 1071 564 476 1071 564 765 1062 290 766 1061 291 767 1065 292 477 1073 567 552 1072 566 552 1072 566 766 1061 291 767 1065 292 768 1064 293 553 1074 569 477 1073 568 477 1073 568 767 1065 292 768 1064 293 769 1067 294 475 1075 571 553 1074 570 553 1074 570 768 1064 293 769 1067 294 770 1066 295 554 1076 573 475 1075 572 475 1075 572 769 1067 294 770 1066 295 763 1068 288 482 1070 575 554 1076 574 554 1076 574 770 1066 295 763 1068 288 804 777 329 817 1077 342 613 779 138 613 779 138 715 775 240 804 777 329 772 1078 297 613 779 138 817 1077 342 615 1079 140 502 780 27 613 779 138 615 1079 140 613 779 138 772 1078 297 773 1080 298 615 1079 140 772 1078 297 820 1081 345 615 1079 140 773 1080 298 775 1082 300 615 1083 577 820 1084 576 657 908 182 502 907 579 615 1083 578 657 908 182 615 1083 578 775 1082 300 776 1085 301 657 908 182 775 1082 300 823 1086 348 657 908 182 776 1085 301 824 1087 349 732 901 257 657 908 182 657 908 182 823 1086 348 824 1087 349 487 646 12 559 645 84 732 901 257 779 1088 304 487 646 12 732 901 257 779 1088 304 732 901 257 824 1087 349 719 808 244 558 641 83 487 646 12 826 1089 351 719 808 244 487 646 12 826 1089 351 487 646 12 779 1088 304 624 809 149 719 808 244 826 1089 351 826 1089 351 827 1090 352 624 809 149 782 1091 307 624 809 149 827 1090 352 626 1092 151 506 810 31 624 809 149 626 1092 151 624 809 149 782 1091 307 783 1093 308 626 1092 151 782 1091 307 830 1094 355 626 1092 151 783 1093 308 785 1095 310 626 1096 581 830 1097 580 677 998 202 506 997 583 626 1096 582 677 998 202 626 1096 582 785 1095 310 786 1098 311 677 998 202 785 1095 310 833 1099 358 677 998 202 786 1098 311 834 994 359 748 993 273 677 998 202 677 998 202 833 1099 358 834 994 359 806 836 331 835 1100 360 635 838 160 635 838 160 723 834 248 806 836 331 790 1101 315 635 838 160 835 1100 360 637 1102 162 510 839 35 635 838 160 637 1102 162 635 838 160 790 1101 315 791 1103 316 637 1102 162 790 1101 315 838 1104 363 637 1102 162 791 1103 316 793 1105 318 637 1106 585 838 1107 584 671 962 196 510 961 587 637 1106 586 671 962 196 637 1106 586 793 1105 318 794 1108 319 671 962 196 793 1105 318 841 1109 366 671 962 196 794 1108 319 644 863 169 740 957 265 671 962 196 644 863 169 671 962 196 841 1109 366 842 1110 367 644 863 169 841 1109 366 646 866 171 727 864 252 644 863 169 646 866 171 644 863 169 842 1110 367 843 1111 368 646 866 171 842 1110 367 798 1112 323 646 866 171 843 1111 368 648 1113 173 501 867 26 646 866 171 648 1113 173 646 866 171 798 1112 323 799 1114 324 648 1113 173 798 1112 323 846 1115 371 648 1113 173 799 1114 324 801 1116 326 648 1117 589 846 1118 588 682 1026 207 501 1025 591 648 1117 590 682 1026 207 648 1117 590 801 1116 326 802 1119 327 682 1026 207 801 1116 326 849 1120 374 682 1026 207 802 1119 327 682 1026 207 849 1120 374 809 1023 334 809 1023 334 755 1021 280 682 1026 207 852 1121 377 899 1122 424 611 774 136 855 1123 380 900 1124 425 633 833 158 858 1022 593 901 1125 426 649 879 592 729 880 254 649 879 174 856 1126 381 856 1126 381 862 1127 387 729 880 254 650 881 175 729 880 254 862 1127 387 862 1127 387 859 1128 384 650 881 175 736 930 261 660 929 185 860 1129 385 860 1129 385 863 1130 388 736 930 261 661 931 186 736 930 261 863 1130 388 863 1130 388 861 1131 386 661 931 186 744 983 269 661 931 186 861 1131 386 861 1131 386 864 1132 389 744 983 269 633 833 158 744 983 269 864 1132 389 864 1132 389 855 1123 380 633 833 158 660 929 185 834 994 359 883 1133 408 883 1133 408 860 1129 385 660 929 185 752 1013 277 650 881 175 859 1128 384 859 1128 384 865 1134 390 752 1013 277 611 774 136 752 1013 277 865 1134 390 865 1134 390 852 1121 377 611 774 136 805 781 330 771 783 296 866 1135 391 866 1135 391 851 1136 376 805 781 330 771 783 296 818 785 343 867 1137 392 867 1137 392 866 1135 391 771 783 296 818 785 343 819 787 344 868 1138 393 868 1138 393 867 1137 392 818 785 343 819 787 344 774 790 299 869 1139 394 869 1139 394 868 1138 393 819 787 344 774 1140 594 821 1141 346 870 1142 395 870 1142 395 869 1143 595 774 1140 594 821 1141 346 822 1144 347 871 1145 396 871 1145 396 870 1142 395 821 1141 346 822 1144 347 777 1146 302 872 1147 397 872 1147 397 871 1145 396 822 1144 347 777 1146 302 778 1148 303 873 1149 398 873 1149 398 872 1147 397 777 1146 302 778 1148 303 825 1150 596 874 1151 399 874 1151 399 873 1149 398 778 1148 303 825 1152 350 780 1153 305 875 1154 400 875 1154 400 874 1155 597 825 1152 350 780 1153 598 781 1156 306 876 1157 401 876 1157 401 875 1154 599 780 1153 598 781 1156 306 828 1158 353 877 1159 402 877 1159 402 876 1157 401 781 1156 306 828 1158 353 829 1160 354 878 1161 403 878 1161 403 877 1159 402 828 1158 353 829 1160 354 784 1162 309 879 1163 404 879 1163 404 878 1161 403 829 1160 354 784 1003 600 831 999 356 880 1164 405 880 1164 405 879 1165 601 784 1003 600 831 999 356 832 1001 357 881 1166 406 881 1166 406 880 1164 405 831 999 356 832 1001 357 787 995 312 882 1167 407 882 1167 407 881 1166 406 832 1001 357 787 995 312 788 996 313 883 1133 408 883 1133 408 882 1167 407 787 995 312 807 840 332 789 842 314 884 1168 409 884 1168 409 854 1169 379 807 840 332 789 842 314 836 844 361 885 1170 410 885 1170 410 884 1168 409 789 842 314 836 844 361 837 846 362 886 1171 411 886 1171 411 885 1170 410 836 844 361 837 846 362 792 849 317 887 1172 412 887 1172 412 886 1171 411 837 846 362 792 1173 602 839 1174 364 888 1175 413 888 1175 413 887 1176 603 792 1173 602 839 1174 364 840 1177 365 889 1178 414 889 1178 414 888 1175 413 839 1174 364 840 1177 365 795 1179 320 890 1180 415 890 1180 415 889 1178 414 840 1177 365 795 1179 320 796 1181 321 891 1182 416 891 1182 416 890 1180 415 795 1179 320 796 1183 321 797 1184 322 892 1185 417 892 1185 417 891 1186 416 796 1183 321 797 1184 322 844 1187 369 893 1188 418 893 1188 418 892 1185 417 797 1184 322 844 1187 369 845 1189 370 894 1190 419 894 1190 419 893 1188 418 844 1187 369 845 1189 370 800 1191 325 895 1192 420 895 1192 420 894 1190 419 845 1189 370 800 1031 604 847 1027 372 896 1193 421 896 1193 421 895 1194 605 800 1031 604 847 1027 372 848 1029 373 897 1195 422 897 1195 422 896 1193 421 847 1027 372 848 1029 373 803 1024 328 898 1196 423 898 1196 423 897 1195 422 848 1029 373 803 1024 328 808 886 333 857 1197 382 857 1197 382 898 1196 423 803 1024 328 899 1122 424 850 776 375 611 774 136 850 776 375 899 1122 424 851 1136 376 851 1136 376 804 777 329 850 776 375 899 1122 424 852 1121 377 805 781 330 805 781 330 851 1136 376 899 1122 424 900 1124 425 853 835 378 633 833 158 853 835 378 900 1124 425 854 1169 379 854 1169 379 806 836 331 853 835 378 900 1124 425 855 1123 380 807 840 332 807 840 332 854 1169 379 900 1124 425 901 1125 426 856 1126 607 649 879 606 856 1126 608 901 1125 426 857 1197 610 857 1197 610 808 886 609 856 1126 608 901 1125 611 858 1022 383 809 1023 334 809 1023 334 857 1197 382 901 1125 611 862 1127 387 856 1126 381 808 886 333 808 886 333 813 885 338 862 1127 387 859 1128 384 862 1127 387 813 885 338 813 885 338 810 884 335 859 1128 384 863 1130 388 860 1129 385 811 936 336 811 936 336 814 935 339 863 1130 388 861 1131 386 863 1130 388 814 935 339 814 935 339 812 934 337 861 1131 386 864 1132 389 861 1131 386 812 934 337 812 934 337 815 985 340 864 1132 389 855 1123 380 864 1132 389 815 985 340 815 985 340 807 840 332 855 1123 380 860 1129 385 883 1133 408 788 996 313 788 996 313 811 936 336 860 1129 385 865 1134 390 859 1128 384 810 884 335 810 884 335 816 1015 341 865 1134 390 852 1121 377 865 1134 390 816 1015 341 816 1015 341 805 781 330 852 1121 377 851 1136 376 866 1135 391 817 1077 342 817 1077 342 804 777 329 851 1136 376 866 1135 391 867 1137 392 772 1078 297 772 1078 297 817 1077 342 866 1135 391 867 1137 392 868 1138 393 773 1080 298 773 1080 298 772 1078 297 867 1137 392 868 1138 393 869 1139 394 820 1081 345 820 1081 345 773 1080 298 868 1138 393 869 1198 612 870 1199 395 775 1200 300 775 1200 300 820 1201 613 869 1198 612 870 1199 395 871 1202 396 776 1203 301 776 1203 301 775 1200 300 870 1199 395 871 1202 396 872 1204 397 823 1205 348 823 1205 348 776 1203 301 871 1202 396 872 1204 397 873 1206 398 824 1207 349 824 1207 349 823 1205 348 872 1204 397 873 1206 398 874 1208 399 779 1209 304 779 1209 304 824 1207 349 873 1206 398 874 1210 614 875 1211 400 826 1089 616 826 1089 616 779 1088 615 874 1210 614 875 1211 617 876 1212 401 827 1090 352 827 1090 352 826 1089 351 875 1211 617 876 1212 401 877 1213 402 782 1091 307 782 1091 307 827 1090 352 876 1212 401 877 1213 402 878 1214 403 783 1093 308 783 1093 308 782 1091 307 877 1213 402 878 1214 403 879 1215 404 830 1094 355 830 1094 355 783 1093 308 878 1214 403 879 1165 618 880 1164 405 785 1095 310 785 1095 310 830 1097 619 879 1165 618 880 1164 405 881 1166 406 786 1098 311 786 1098 311 785 1095 310 880 1164 405 881 1166 406 882 1167 407 833 1099 358 833 1099 358 786 1098 311 881 1166 406 882 1167 407 883 1133 408 834 994 359 834 994 359 833 1099 358 882 1167 407 854 1169 379 884 1168 409 835 1100 360 835 1100 360 806 836 331 854 1169 379 884 1168 409 885 1170 410 790 1101 315 790 1101 315 835 1100 360 884 1168 409 885 1170 410 886 1171 411 791 1103 316 791 1103 316 790 1101 315 885 1170 410 886 1171 411 887 1172 412 838 1104 363 838 1104 363 791 1103 316 886 1171 411 887 1216 620 888 1217 413 793 1218 318 793 1218 318 838 1219 621 887 1216 620 888 1217 413 889 1220 414 794 1221 319 794 1221 319 793 1218 318 888 1217 413 889 1220 414 890 1222 415 841 1223 366 841 1223 366 794 1221 319 889 1220 414 890 1222 415 891 1224 416 842 1225 367 842 1225 367 841 1223 366 890 1222 415 891 1224 416 892 1226 417 843 1227 368 843 1227 368 842 1225 367 891 1224 416 892 1226 417 893 1228 418 798 1229 323 798 1229 323 843 1227 368 892 1226 417 893 1228 418 894 1230 419 799 1231 324 799 1231 324 798 1229 323 893 1228 418 894 1230 419 895 1232 420 846 1233 371 846 1233 371 799 1231 324 894 1230 419 895 1194 622 896 1193 421 801 1116 326 801 1116 326 846 1118 623 895 1194 622 896 1193 421 897 1195 422 802 1119 327 802 1119 327 801 1116 326 896 1193 421 897 1195 422 898 1196 423 849 1120 374 849 1120 374 802 1119 327 897 1195 422 898 1196 423 857 1197 382 809 1023 334 809 1023 334 849 1120 374 898 1196 423 540 671 65 568 670 93 938 1234 463 938 1234 463 936 1235 461 540 671 65 520 680 45 572 679 97 939 1236 464 939 1236 464 931 1237 456 520 680 45 532 689 57 576 688 101 940 1238 465 940 1238 465 934 1239 459 532 689 57 528 698 53 580 697 105 941 1240 466 941 1240 466 933 1241 458 528 698 53 544 701 69 582 700 107 942 1242 467 942 1242 467 937 1243 462 544 701 69 503 710 624 919 709 444 943 1244 468 943 1244 468 927 1245 452 503 710 624 536 719 61 588 718 113 944 1246 469 944 1246 469 935 1247 460 536 719 61 511 728 625 921 727 446 945 1248 470 945 1248 470 929 1249 454 511 728 625 908 723 433 922 740 447 946 1250 471 946 1250 471 932 1251 457 908 723 433 507 744 626 923 743 448 947 1252 472 947 1252 472 928 1253 453 507 744 626 906 705 431 924 753 449 948 1254 473 948 1254 473 930 1255 455 906 705 431 500 757 627 925 756 450 949 1256 474 949 1256 474 926 1257 451 500 757 627 568 670 93 503 672 28 927 1258 628 927 1258 628 938 1234 463 568 670 93 572 679 97 507 681 32 928 1259 629 928 1259 629 939 1236 464 572 679 97 576 688 101 511 690 36 929 1260 630 929 1260 630 940 1238 465 576 688 101 580 697 105 500 699 25 926 1261 631 926 1261 631 941 1240 466 580 697 105 582 700 107 906 705 431 930 1255 455 930 1255 455 942 1242 467 582 700 107 919 709 444 520 714 45 931 1262 456 931 1262 456 943 1244 468 919 709 444 588 718 113 908 723 433 932 1251 457 932 1251 457 944 1246 469 588 718 113 921 727 446 528 732 53 933 1263 458 933 1263 458 945 1248 470 921 727 446 922 740 447 532 689 57 934 1239 459 934 1239 459 946 1250 471 922 740 447 923 743 448 536 719 61 935 1247 460 935 1247 460 947 1252 472 923 743 448 924 753 449 540 671 65 936 1235 461 936 1235 461 948 1254 473 924 753 449 925 756 450 544 701 69 937 1243 462 937 1243 462 949 1256 474 925 756 450 936 1235 461 938 1234 463 914 788 439 914 788 439 912 791 437 936 1235 461 931 1237 456 939 1236 464 915 817 440 915 817 440 907 820 432 931 1237 456 934 1239 459 940 1238 465 916 847 441 916 847 441 910 850 435 934 1239 459 933 1241 458 941 1240 466 917 875 442 917 875 442 909 878 434 933 1241 458 937 1243 462 942 1242 467 918 891 443 918 891 443 913 893 438 937 1243 462 927 1245 452 943 1244 468 585 913 110 585 913 110 903 916 632 927 1245 452 935 1247 460 944 1246 469 920 941 445 920 941 445 911 943 436 935 1247 460 929 1249 454 945 1248 470 591 967 116 591 967 116 905 970 633 929 1249 454 932 1251 457 946 1250 471 595 987 120 595 987 120 524 942 49 932 1251 457 928 1253 453 947 1252 472 597 1002 122 597 1002 122 904 1004 634 928 1253 453 930 1255 455 948 1254 473 601 1017 126 601 1017 126 516 892 41 930 1255 455 926 1257 451 949 1256 474 603 1030 128 603 1030 128 902 1032 635 926 1257 451 938 1234 463 927 1258 636 903 789 428 903 789 428 914 788 439 938 1234 463 939 1236 464 928 1259 637 904 818 429 904 818 429 915 817 440 939 1236 464 940 1238 465 929 1260 638 905 848 430 905 848 430 916 847 441 940 1238 465 941 1240 466 926 1261 639 902 876 427 902 876 427 917 875 442 941 1240 466 942 1242 467 930 1255 455 516 892 41 516 892 41 918 891 443 942 1242 467 943 1244 468 931 1262 456 907 914 432 907 914 432 585 913 110 943 1244 468 944 1246 469 932 1251 457 524 942 49 524 942 49 920 941 445 944 1246 469 945 1248 470 933 1263 458 909 968 434 909 968 434 591 967 116 945 1248 470 946 1250 471 934 1239 459 910 850 435 910 850 435 595 987 120 946 1250 471 947 1252 472 935 1247 460 911 943 436 911 943 436 597 1002 122 947 1252 472 948 1254 473 936 1235 461 912 791 437 912 791 437 601 1017 126 948 1254 473 949 1256 474 937 1243 462 913 893 438 913 893 438 603 1030 128 949 1256 474 131 1264 131 4 1265 4 479 1266 4 479 1266 4 606 1267 131 131 1264 131 19 1268 19 131 1264 131 606 1267 131 606 1267 131 494 1269 19 19 1268 19 142 1270 142 6 1271 6 481 1272 6 481 1272 6 617 1273 142 142 1270 142 8 1274 8 142 1270 142 617 1273 142 617 1273 142 483 1275 8 8 1274 8 153 1276 153 5 1277 5 480 1278 5 480 1278 5 628 1279 153 153 1276 153 15 1280 15 153 1276 153 628 1279 153 628 1279 153 490 1281 15 15 1280 15 164 1282 164 3 1283 3 478 1284 3 478 1284 3 639 1285 164 164 1282 164 10 1286 10 164 1282 164 639 1285 164 639 1285 164 485 1287 10 10 1286 10 183 1288 183 8 1274 8 483 1275 8 483 1275 8 658 1289 183 183 1288 183 4 1265 511 183 1288 183 658 1289 183 658 1289 183 479 1266 511 4 1265 511 191 1290 191 9 1291 9 484 1292 9 484 1292 9 666 1293 191 191 1290 191 17 1294 17 191 1290 191 666 1293 191 666 1293 191 492 1295 17 17 1294 17 197 1296 197 10 1286 10 485 1287 10 485 1287 10 672 1297 197 197 1296 197 5 1277 525 197 1296 197 672 1297 197 672 1297 197 480 1278 525 5 1277 525 200 1298 200 15 1280 15 490 1281 15 490 1281 15 675 1299 200 200 1298 200 9 1291 9 200 1298 200 675 1299 200 675 1299 200 484 1292 9 9 1291 9 203 1300 203 17 1294 17 492 1295 17 492 1295 17 678 1301 203 203 1300 203 6 1271 539 203 1300 203 678 1301 203 678 1301 203 481 1272 539 6 1271 539 209 1302 209 21 1303 21 496 1304 21 496 1304 21 684 1305 209 209 1302 209 3 1283 552 209 1302 209 684 1305 209 684 1305 209 478 1284 552 3 1283 552 213 1306 213 72 1307 72 547 1308 72 547 1308 72 688 1309 213 213 1306 213 73 1310 73 213 1306 213 688 1309 213 688 1309 213 548 1311 73 73 1310 73 214 1312 214 19 1268 19 494 1269 19 494 1269 19 689 1313 214 214 1312 214 71 1314 71 214 1312 214 689 1313 214 689 1313 214 546 1315 71 71 1314 71 215 1316 215 71 1317 71 546 1318 71 546 1318 71 690 1319 215 215 1316 215 72 1307 72 215 1316 215 690 1319 215 690 1319 215 547 1308 72 72 1307 72 21 1303 21 216 1320 216 691 1321 216 691 1321 216 496 1304 21 21 1303 21 218 1322 218 74 1323 74 549 1324 74 549 1324 74 693 1325 218 218 1322 218 75 1326 75 218 1322 218 693 1325 218 693 1325 218 550 1327 75 75 1326 75 216 1320 216 75 1328 75 550 1329 75 550 1329 75 691 1321 216 216 1320 216 219 1330 219 73 1310 73 548 1311 73 548 1311 73 694 1331 219 219 1330 219 74 1323 74 219 1330 219 694 1331 219 694 1331 219 549 1324 74 74 1323 74

+
+
+
+
+ + + + + 0 0 0 + + + + + + + + + + + 0.4733447 0.4733447 0.4733447 + + + + + + + + + + 1 + 1 + 1 + 1 + + + + + + + + +
\ No newline at end of file diff --git a/src/rrrobot_ws/src/gazebo_models/paper_bag/images/paper-bag-1.jpg b/src/rrrobot_ws/src/gazebo_models/paper_bag/images/paper-bag-1.jpg new file mode 100644 index 0000000..b419959 Binary files /dev/null and b/src/rrrobot_ws/src/gazebo_models/paper_bag/images/paper-bag-1.jpg differ diff --git a/src/rrrobot_ws/src/gazebo_models/paper_bag/model.config b/src/rrrobot_ws/src/gazebo_models/paper_bag/model.config new file mode 100644 index 0000000..1ce102d --- /dev/null +++ b/src/rrrobot_ws/src/gazebo_models/paper_bag/model.config @@ -0,0 +1,11 @@ + + + paper_bag + 1.0 + model.sdf + + + + + + diff --git a/src/rrrobot_ws/src/gazebo_models/paper_bag/model.sdf b/src/rrrobot_ws/src/gazebo_models/paper_bag/model.sdf new file mode 100644 index 0000000..5b4a684 --- /dev/null +++ b/src/rrrobot_ws/src/gazebo_models/paper_bag/model.sdf @@ -0,0 +1,107 @@ + + + + + + 1 + + 0.166667 + 0 + 0 + 0.166667 + 0 + 0.166667 + + 0 0 0 0 -0 0 + + 0 0 0 0 -0 0 + 1 + 0 + 0 + 0 + + 0 0 0 0 -0 0 + + + /app/rrrobot_ws/src/gazebo_models/paper_bag/Paper Bag.DAE + 1 1 1 + + + + 1 + + + __default__ + + 0.804 0.521 0.247 1 + 0.7 0.7 0.7 1 + 0.01 0.01 0.01 1 + 0 0 0 1 + + 0 + 1 + + + 0 + 10 + 0 0 0 0 -0 0 + + + /app/rrrobot_ws/src/gazebo_models/paper_bag/Paper Bag.DAE + 1 1 1 + + + + + + 1 + 1 + 0 0 0 + 0 + 0 + + + 1 + 0 + 0 + 1 + + 0 + + + + + 0 + 1e+06 + + + 0 + 1 + 1 + + 0 + 0.2 + 1e+13 + 1 + 0.01 + 0 + + + 1 + -0.01 + 0 + 0.2 + 1e+13 + 1 + + + + + + 0 + 1 + + diff --git a/src/rrrobot_ws/src/gazebo_models/plastic_bottle/images/plastic-bottle-1.jpg b/src/rrrobot_ws/src/gazebo_models/plastic_bottle/images/plastic-bottle-1.jpg new file mode 100644 index 0000000..7e35d58 Binary files /dev/null and b/src/rrrobot_ws/src/gazebo_models/plastic_bottle/images/plastic-bottle-1.jpg differ diff --git a/src/rrrobot_ws/src/gazebo_models/plastic_bottle/meshes/plastic_bottle.STL b/src/rrrobot_ws/src/gazebo_models/plastic_bottle/meshes/plastic_bottle.STL new file mode 100644 index 0000000..fb93350 Binary files /dev/null and b/src/rrrobot_ws/src/gazebo_models/plastic_bottle/meshes/plastic_bottle.STL differ diff --git a/src/rrrobot_ws/src/gazebo_models/plastic_bottle/model.config b/src/rrrobot_ws/src/gazebo_models/plastic_bottle/model.config new file mode 100644 index 0000000..2db2c1d --- /dev/null +++ b/src/rrrobot_ws/src/gazebo_models/plastic_bottle/model.config @@ -0,0 +1,11 @@ + + + plastic_bottle + 1.0 + model.sdf + + + + + + diff --git a/src/rrrobot_ws/src/gazebo_models/plastic_bottle/model.sdf b/src/rrrobot_ws/src/gazebo_models/plastic_bottle/model.sdf new file mode 100644 index 0000000..8276f5d --- /dev/null +++ b/src/rrrobot_ws/src/gazebo_models/plastic_bottle/model.sdf @@ -0,0 +1,107 @@ + + + + + + 1 + + 0.166667 + 0 + 0 + 0.166667 + 0 + 0.166667 + + 0.172 0.63 0 0 -0 0 + + 0 0 -1.05917 1.5708 -0 0 + 1 + 0 + 0 + 0 + + 0 0 0 0 -0 0 + + + /app/rrrobot_ws/src/gazebo_models/plastic_bottle/meshes/plastic_bottle.STL + 1 1 1 + + + + 1 + + + __default__ + + 0.3 0.3 0.3 1 + 0.7 0.7 0.7 1 + 0.01 0.01 0.01 1 + 0 0 0 1 + + 0 + 1 + + + 0 + 10 + 0 0 0 0 -0 0 + + + /app/rrrobot_ws/src/gazebo_models/plastic_bottle/meshes/plastic_bottle.STL + 1 1 1 + + + + + + 1 + 1 + 0 0 0 + 0 + 0 + + + 1 + 0 + 0 + 1 + + 0 + + + + + 0 + 1e+06 + + + 0 + 1 + 1 + + 0 + 0.2 + 1e+13 + 1 + 0.01 + 0 + + + 1 + -0.01 + 0 + 0.2 + 1e+13 + 1 + + + + + + 0 + 1 + + diff --git a/src/rrrobot_ws/src/gazebo_models/pop_can/images/pop-can-1.jpg b/src/rrrobot_ws/src/gazebo_models/pop_can/images/pop-can-1.jpg new file mode 100644 index 0000000..c0ab06b Binary files /dev/null and b/src/rrrobot_ws/src/gazebo_models/pop_can/images/pop-can-1.jpg differ diff --git a/src/rrrobot_ws/src/gazebo_models/pop_can/model.config b/src/rrrobot_ws/src/gazebo_models/pop_can/model.config new file mode 100644 index 0000000..a18e617 --- /dev/null +++ b/src/rrrobot_ws/src/gazebo_models/pop_can/model.config @@ -0,0 +1,11 @@ + + + pop_can + 1.0 + model.sdf + + + + + + diff --git a/src/rrrobot_ws/src/gazebo_models/pop_can/model.sdf b/src/rrrobot_ws/src/gazebo_models/pop_can/model.sdf new file mode 100644 index 0000000..ff67a2d --- /dev/null +++ b/src/rrrobot_ws/src/gazebo_models/pop_can/model.sdf @@ -0,0 +1,107 @@ + + + + + + 1 + + 0.166667 + 0 + 0 + 0.166667 + 0 + 0.166667 + + 0.02 -0.05 0.023 0 -0 0 + + -0 0 0.08 1.5708 -0 0 + 1 + 0 + 0 + 0 + + 0 0 0 0 -0 0 + + + /app/rrrobot_ws/src/gazebo_models/pop_can/original_5.stl + 1 1 1 + + + + 1 + + + __default__ + + 0.3 0.3 0.3 1 + 0.7 0.7 0.7 1 + 0.01 0.01 0.01 1 + 0 0 0 1 + + 0 + 1 + + + 0 + 10 + 0 0 0 0 -0 0 + + + /app/rrrobot_ws/src/gazebo_models/pop_can/original_5.stl + 1 1 1 + + + + + + 1 + 1 + 0 0 0 + 0 + 0 + + + 1 + 0 + 0 + 1 + + 0 + + + + + 0 + 1e+06 + + + 0 + 1 + 1 + + 0 + 0.2 + 1e+13 + 1 + 0.01 + 0 + + + 1 + -0.01 + 0 + 0.2 + 1e+13 + 1 + + + + + + 0 + 1 + + diff --git a/src/rrrobot_ws/src/gazebo_models/pop_can/original_5.stl b/src/rrrobot_ws/src/gazebo_models/pop_can/original_5.stl new file mode 100644 index 0000000..7c5a133 Binary files /dev/null and b/src/rrrobot_ws/src/gazebo_models/pop_can/original_5.stl differ diff --git a/src/rrrobot_ws/src/gazebo_models/pringles/model.config b/src/rrrobot_ws/src/gazebo_models/pringles/model.config new file mode 100644 index 0000000..4dbc164 --- /dev/null +++ b/src/rrrobot_ws/src/gazebo_models/pringles/model.config @@ -0,0 +1,11 @@ + + + pringles + 1.0 + model.sdf + + + + + + diff --git a/src/rrrobot_ws/src/gazebo_models/pringles/model.sdf b/src/rrrobot_ws/src/gazebo_models/pringles/model.sdf new file mode 100644 index 0000000..3fb4425 --- /dev/null +++ b/src/rrrobot_ws/src/gazebo_models/pringles/model.sdf @@ -0,0 +1,224 @@ + + + + + + 1 + + 0.145833 + 0 + 0 + 0.145833 + 0 + 0.125 + + 0 0 0 0 -0 0 + + 0 0 0 0 -0 0 + 1 + 0 + 0 + 0 + + 0 0 0 0 -0 0 + + + 0.07 + 0.3 + + + + 1 + + + __default__ + + 1 0.3 0.3 1 + 0.7 0.7 0.7 1 + 0.01 0.01 0.01 1 + 0 0 0 1 + + 0 + 1 + + + 0 + 10 + 0 0 0 0 -0 0 + + + 0.07 + 0.3 + + + + + + 1 + 1 + 0 0 0 + 0 + 0 + + + 1 + 0 + 0 + 1 + + 0 + + + + + 0 + 1e+06 + + + 0 + 1 + 1 + + 0 + 0.2 + 1e+13 + 1 + 0.01 + 0 + + + 1 + -0.01 + 0 + 0.2 + 1e+13 + 1 + + + + + + + + 0 + + 0 + 0 + 0 + 0 + 0 + 0 + + 0 0 0 0 -0 0 + + 0 -0 0.15 -0.000193 0.000381 0 + 1 + 0 + 0 + 0 + + 0 0 0 0 -0 0 + + + 0.075 + 0.01 + + + + 1 + + + __default__ + + 1 0.3 0.3 1 + 0.7 0.7 0.7 1 + 0.01 0.01 0.01 1 + 0 0 0 1 + + 0 + 1 + + + 0 + 10 + 0 0 0 0 -0 0 + + + 0.075 + 0.01 + + + + + + 1 + 1 + 0 0 0 + 0 + 0 + + + 1 + 0 + 0 + 1 + + 0 + + + + + 0 + 1e+06 + + + 0 + 1 + 1 + + 0 + 0.2 + 1e+13 + 1 + 0.01 + 0 + + + 1 + -0.01 + 0 + 0.2 + 1e+13 + 1 + + + + + + + link_3 + link_4 + 0 0 0 0 -0 0 + + + + 0 + 0.2 + + + 0 + 0.2 + + + + + 0 + 1 + + diff --git a/src/rrrobot_ws/src/gazebo_models/recycling_images/cardboard.jpg b/src/rrrobot_ws/src/gazebo_models/recycling_images/cardboard.jpg new file mode 100644 index 0000000..6860969 Binary files /dev/null and b/src/rrrobot_ws/src/gazebo_models/recycling_images/cardboard.jpg differ diff --git a/src/rrrobot_ws/src/gazebo_models/recycling_images/glass.jpg b/src/rrrobot_ws/src/gazebo_models/recycling_images/glass.jpg new file mode 100644 index 0000000..6d210a5 Binary files /dev/null and b/src/rrrobot_ws/src/gazebo_models/recycling_images/glass.jpg differ diff --git a/src/rrrobot_ws/src/gazebo_models/recycling_images/metal.jpg b/src/rrrobot_ws/src/gazebo_models/recycling_images/metal.jpg new file mode 100644 index 0000000..d6cd78e Binary files /dev/null and b/src/rrrobot_ws/src/gazebo_models/recycling_images/metal.jpg differ diff --git a/src/rrrobot_ws/src/gazebo_models/recycling_images/paper.jpg b/src/rrrobot_ws/src/gazebo_models/recycling_images/paper.jpg new file mode 100644 index 0000000..c026d01 Binary files /dev/null and b/src/rrrobot_ws/src/gazebo_models/recycling_images/paper.jpg differ diff --git a/src/rrrobot_ws/src/gazebo_models/recycling_images/plastic.jpg b/src/rrrobot_ws/src/gazebo_models/recycling_images/plastic.jpg new file mode 100644 index 0000000..9a27f62 Binary files /dev/null and b/src/rrrobot_ws/src/gazebo_models/recycling_images/plastic.jpg differ diff --git a/src/rrrobot_ws/src/gazebo_models/square_trash_can/model.config b/src/rrrobot_ws/src/gazebo_models/square_trash_can/model.config new file mode 100644 index 0000000..a86768c --- /dev/null +++ b/src/rrrobot_ws/src/gazebo_models/square_trash_can/model.config @@ -0,0 +1,11 @@ + + + square_trash_can + 1.0 + model.sdf + + + + + + diff --git a/src/rrrobot_ws/src/gazebo_models/square_trash_can/model.sdf b/src/rrrobot_ws/src/gazebo_models/square_trash_can/model.sdf new file mode 100644 index 0000000..2f4ebc7 --- /dev/null +++ b/src/rrrobot_ws/src/gazebo_models/square_trash_can/model.sdf @@ -0,0 +1,582 @@ + + + + + + 1 + + 0.166667 + 0 + 0 + 0.166667 + 0 + 0.166667 + + 0 0 0 0 -0 0 + + -0 0.25 0.082 0 -0 0 + 1 + 0 + 0 + 0 + + 0 0 0 0 -0 0 + + + 0.5 0.02 0.8 + + + + 1 + + + __default__ + + 0.3 0.3 0.3 1 + 0.7 0.7 0.7 1 + 0.01 0.01 0.01 1 + 0 0 0 1 + + 0 + 1 + + + 0 + 10 + 0 0 0 0 -0 0 + + + 0.5 0.02 0.8 + + + + + + 1 + 1 + 0 0 0 + 0 + 0 + + + 1 + 0 + 0 + 1 + + 0 + + + + + 0 + 1e+06 + + + 0 + 1 + 1 + + 0 + 0.2 + 1e+13 + 1 + 0.01 + 0 + + + 1 + -0.01 + 0 + 0.2 + 1e+13 + 1 + + + + + + + + 1 + + 0.166667 + 0 + 0 + 0.166667 + 0 + 0.166667 + + 0 0 0 0 -0 0 + + -0 -0.25 0.082 0 -0 0 + 1 + 0 + 0 + 0 + + 0 0 0 0 -0 0 + + + 0.5 0.02 0.8 + + + + 1 + + + __default__ + + 0.3 0.3 0.3 1 + 0.7 0.7 0.7 1 + 0.01 0.01 0.01 1 + 0 0 0 1 + + 0 + 1 + + + 0 + 10 + 0 0 0 0 -0 0 + + + 0.5 0.02 0.8 + + + + + + 1 + 1 + 0 0 0 + 0 + 0 + + + 1 + 0 + 0 + 1 + + 0 + + + + + 0 + 1e+06 + + + 0 + 1 + 1 + + 0 + 0.2 + 1e+13 + 1 + 0.01 + 0 + + + 1 + -0.01 + 0 + 0.2 + 1e+13 + 1 + + + + + + + + 1 + + 0.166667 + 0 + 0 + 0.166667 + 0 + 0.166667 + + 0 0 0 0 -0 0 + + 0.25 0 0.082 0 -0 0 + 1 + 0 + 0 + 0 + + 0 0 0 0 -0 0 + + + 0.02 0.5 0.8 + + + + 1 + + + __default__ + + 0.3 0.3 0.3 1 + 0.7 0.7 0.7 1 + 0.01 0.01 0.01 1 + 0 0 0 1 + + 0 + 1 + + + 0 + 10 + 0 0 0 0 -0 0 + + + 0.02 0.5 0.8 + + + + + + 1 + 1 + 0 0 0 + 0 + 0 + + + 1 + 0 + 0 + 1 + + 0 + + + + + 0 + 1e+06 + + + 0 + 1 + 1 + + 0 + 0.2 + 1e+13 + 1 + 0.01 + 0 + + + 1 + -0.01 + 0 + 0.2 + 1e+13 + 1 + + + + + + + + 1 + + 0.166667 + 0 + 0 + 0.166667 + 0 + 0.166667 + + 0 0 0 0 -0 0 + + -0.25 0 0.082 0 -0 0 + 1 + 0 + 0 + 0 + + 0 0 0 0 -0 0 + + + 0.02 0.5 0.8 + + + + 1 + + + __default__ + + 0.3 0.3 0.3 1 + 0.7 0.7 0.7 1 + 0.01 0.01 0.01 1 + 0 0 0 1 + + 0 + 1 + + + 0 + 10 + 0 0 0 0 -0 0 + + + 0.02 0.5 0.8 + + + + + + 1 + 1 + 0 0 0 + 0 + 0 + + + 1 + 0 + 0 + 1 + + 0 + + + + + 0 + 1e+06 + + + 0 + 1 + 1 + + 0 + 0.2 + 1e+13 + 1 + 0.01 + 0 + + + 1 + -0.01 + 0 + 0.2 + 1e+13 + 1 + + + + + + + + 5000 + + 104.333 + 0 + 0 + 104.333 + 0 + 208.333 + + 0 0 0 0 -0 0 + + -0 -0 -0.328 0 -0 0 + 1 + 0 + 0 + 0 + + 0 0 0 0 -0 0 + + + 0.5 0.5 0.02 + + + + 1 + + + __default__ + + 0.3 0.3 0.3 1 + 0.7 0.7 0.7 1 + 0.01 0.01 0.01 1 + 0 0 0 1 + + 0 + 1 + + + 0 + 10 + 0 0 0 0 -0 0 + + + 0.5 0.5 0.02 + + + + + + 1 + 1 + 0 0 0 + 0 + 0 + + + 1 + 0 + 0 + 1 + + 0 + + + + + 0 + 1e+06 + + + 0 + 1 + 1 + + 0 + 0.2 + 1e+13 + 1 + 0.01 + 0 + + + 1 + -0.01 + 0 + 0.2 + 1e+13 + 1 + + + + + + + link_1 + link_1_clone_0 + 0 0 0 0 -0 0 + + + + 0 + 0.2 + + + 0 + 0.2 + + + + + + link_1 + link_1_clone_0_clone_0 + 0 0 0 0 -0 0 + + + + 0 + 0.2 + + + 0 + 0.2 + + + + + + link_1_clone_0 + link_1_clone + 0 0 0 0 -0 0 + + + + 0 + 0.2 + + + 0 + 0.2 + + + + + + link_1_clone_0_clone + link_1 + 0 0 0 0 -0 0 + + + + 0 + 0.2 + + + 0 + 0.2 + + + + + + link_1_clone + link_1_clone_0_clone + 0 0 0 0 -0 0 + + + + 0 + 0.2 + + + 0 + 0.2 + + + + + 0 + 1 + + diff --git a/src/rrrobot_ws/src/gazebo_models/trash_images/trash_1.jpg b/src/rrrobot_ws/src/gazebo_models/trash_images/trash_1.jpg new file mode 100644 index 0000000..8a3f517 Binary files /dev/null and b/src/rrrobot_ws/src/gazebo_models/trash_images/trash_1.jpg differ diff --git a/src/rrrobot_ws/src/gazebo_models/trash_images/trash_2.jpg b/src/rrrobot_ws/src/gazebo_models/trash_images/trash_2.jpg new file mode 100644 index 0000000..d936231 Binary files /dev/null and b/src/rrrobot_ws/src/gazebo_models/trash_images/trash_2.jpg differ diff --git a/src/rrrobot_ws/src/gazebo_models/trash_images/trash_3.jpg b/src/rrrobot_ws/src/gazebo_models/trash_images/trash_3.jpg new file mode 100644 index 0000000..af59ed8 Binary files /dev/null and b/src/rrrobot_ws/src/gazebo_models/trash_images/trash_3.jpg differ diff --git a/src/rrrobot_ws/src/gazebo_models/trash_images/trash_4.jpg b/src/rrrobot_ws/src/gazebo_models/trash_images/trash_4.jpg new file mode 100644 index 0000000..dd4ded0 Binary files /dev/null and b/src/rrrobot_ws/src/gazebo_models/trash_images/trash_4.jpg differ diff --git a/src/rrrobot_ws/src/gazebo_models/trash_images/trash_5.jpg b/src/rrrobot_ws/src/gazebo_models/trash_images/trash_5.jpg new file mode 100644 index 0000000..4df58c2 Binary files /dev/null and b/src/rrrobot_ws/src/gazebo_models/trash_images/trash_5.jpg differ diff --git a/src/rrrobot_ws/src/gazebo_models/unit_box/image.png b/src/rrrobot_ws/src/gazebo_models/unit_box/image.png new file mode 100644 index 0000000..8082704 Binary files /dev/null and b/src/rrrobot_ws/src/gazebo_models/unit_box/image.png differ diff --git a/src/rrrobot_ws/src/gazebo_models/unit_box/model.config b/src/rrrobot_ws/src/gazebo_models/unit_box/model.config new file mode 100644 index 0000000..2a703a6 --- /dev/null +++ b/src/rrrobot_ws/src/gazebo_models/unit_box/model.config @@ -0,0 +1,11 @@ + + + unit_box + 1.0 + model.sdf + + + + + + diff --git a/src/rrrobot_ws/src/gazebo_models/unit_box/model.sdf b/src/rrrobot_ws/src/gazebo_models/unit_box/model.sdf new file mode 100644 index 0000000..1c42598 --- /dev/null +++ b/src/rrrobot_ws/src/gazebo_models/unit_box/model.sdf @@ -0,0 +1,104 @@ + + + + + + 0.208095 + + 0.0180922 + 0 + 0 + 0.0180922 + 0 + 0.0346825 + + 0 0 0 0 -0 0 + + 0 + 0 + 0 + 0 0 0 0 -0 0 + 1 + + + + 0.05 0.05 0.05 + + + + + + __default__ + + 1 0 0 1 + 0.7 0.7 0.7 1 + 0.01 0.01 0.01 1 + 0 0 0 1 + + 0 0 0 0 -0 0 + 0 + 1 + + + 0 + 10 + 0 0 0 0 -0 0 + + + 0.05 0.05 0.05 + + + + + + 1 + 1 + 0 0 0 + 0 + 0 + + + 1 + 0 + 0 + 1 + + 0 + + + + + 0 + 1e+06 + + + 0 + 1 + 1 + + 0 + 0.2 + 1e+13 + 1 + 0.01 + 0 + + + 1 + -0.01 + 0 + 0.2 + 1e+13 + 1 + + + + + + 0 + 1 + + diff --git a/src/rrrobot_ws/src/rrrobot/CMakeLists.txt b/src/rrrobot_ws/src/rrrobot/CMakeLists.txt new file mode 100644 index 0000000..f4f4440 --- /dev/null +++ b/src/rrrobot_ws/src/rrrobot/CMakeLists.txt @@ -0,0 +1,163 @@ +cmake_minimum_required(VERSION 2.8.3) +project(rrrobot) + +set(CMAKE_BUILD_TYPE Debug) + +find_package(catkin REQUIRED COMPONENTS + osrf_gear + roscpp + sensor_msgs + std_srvs + trajectory_msgs + std_msgs + geometry_msgs + gazebo_ros + message_generation + pcl_ros + pcl_conversions +) + +find_package(gazebo REQUIRED) +find_package(PCL 1.8 REQUIRED) +find_package(Eigen3 REQUIRED) +find_package(orocos_kdl REQUIRED) + +## Uncomment this if the package has a setup.py. This macro ensures +## modules and global scripts declared therein get installed +## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html +# catkin_python_setup() + +## Generate messages in the 'msg' folder +add_message_files( + FILES + model_insertion.msg + arm_command.msg +) + +## Generate added messages and services with any dependencies listed here +generate_messages( + DEPENDENCIES + std_msgs + geometry_msgs +) + +catkin_package( + INCLUDE_DIRS +# LIBRARIES simulation_env + CATKIN_DEPENDS roscpp std_msgs geometry_msgs gazebo_ros +# DEPENDS system_lib +) + +########### +## Build ## +########### +include_directories( + include + ${catkin_INCLUDE_DIRS} + ${roscpp_INCLUDE_DIRS} + ${std_msgs_INCLUDE_DIRS} + ${geometry_msgs_INCLUDE_DIRS} + ${GAZEBO_INCLUDE_DIRS} + ${PCL_INCLUDE_DIRS} + ${Eigen3_INCLUDE_DIRS} +) + +add_library(insert_model SHARED + src/model_insertion_plugin.cpp +) +add_dependencies(insert_model ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + + +## Declare a C++ executable +add_executable(rrrobot_node src/rrrobot_node.cpp) +add_dependencies(rrrobot_node ${catkin_EXPORTED_TARGETS} rrrobot_generate_messages_cpp) +target_link_libraries(rrrobot_node ${catkin_LIBRARIES}) + +add_executable(arm_controller_node src/arm_controller_node.cpp src/arm_representation.cpp) +add_dependencies(arm_controller_node ${catkin_EXPORTED_TARGETS}) +target_link_libraries(arm_controller_node ${catkin_LIBRARIES} ${orocos_kdl_LIBRARIES}) + +add_executable(test_arm test/test_arm.cpp src/arm_representation.cpp) +add_dependencies(test_arm ${catkin_EXPORTED_TARGETS}) +target_link_libraries(test_arm ${catkin_LIBRARIES} ${orocos_kdl_LIBRARIES}) + +add_executable(depth_camera_node src/depth_camera_node.cpp) +add_dependencies(depth_camera_node ${catkin_EXPORTED_TARGETS}) +target_link_libraries(depth_camera_node ${catkin_LIBRARIES} ${PCL_LIBRARIES}) + +add_executable(test_insert_object test/test_insert_object.cpp) +add_executable(object_spawner_node src/object_spawner_node.cpp) + +add_dependencies(test_insert_object insert_model) +add_dependencies(object_spawner_node insert_model) + +target_link_libraries(test_insert_object + ${catkin_LIBRARIES} +) +target_link_libraries(object_spawner_node + ${catkin_LIBRARIES} +) + +target_link_libraries(insert_model + ${catkin_LIBRARIES} + ${GAZEBO_LIBRARIES} +) + +############# +## Install ## +############# + +# all install targets should use catkin DESTINATION variables +# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html + +## Mark executable scripts (Python etc.) for installation +# install(PROGRAMS +# script/rrrobot_node.py +# script/tf2_example.py +# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +# ) + +## Mark executables and/or libraries for installation +install(TARGETS rrrobot_node + ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +) + +install(TARGETS arm_controller_node + ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +) + +install(TARGETS depth_camera_node + ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +) + +## Mark cpp header files for installation +# install(DIRECTORY include/${PROJECT_NAME}/ +# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} +# FILES_MATCHING PATTERN "*.h" +# PATTERN ".svn" EXCLUDE +# ) + +## Mark other files for installation (e.g. launch and bag files, etc.) +# install(FILES +# config/sample_gear_conf.yaml +# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/config +# ) + +############# +## Testing ## +############# + +## Add gtest based cpp test target and link libraries +# catkin_add_gtest(${PROJECT_NAME}-test test/test_ariac_example.cpp) +# if(TARGET ${PROJECT_NAME}-test) +# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}) +# endif() + +## Add folders to be run by python nosetests +# catkin_add_nosetests(test) \ No newline at end of file diff --git a/src/rrrobot_ws/src/rrrobot/config/rrrobot.yaml b/src/rrrobot_ws/src/rrrobot/config/rrrobot.yaml new file mode 100644 index 0000000..5edde78 --- /dev/null +++ b/src/rrrobot_ws/src/rrrobot/config/rrrobot.yaml @@ -0,0 +1,14 @@ +# Competition configuration options +options: + insert_models_over_bins: true # Whether or not to insert the models that are specified in models_over_bins + spawn_extra_models: true # Whether or not to spawn the models that are specified in models_to_spawn + gazebo_state_logging: true # Whether or not to generate a gazebo state log + belt_population_cycles: 5 # How many cycles to spawn parts on the conveyor + model_type_aliases: # Aliases for model types which can be used in the configuration file + order_part1: piston_rod_part # Wherever 'order_part1' is used in the configuration file, use 'piston_rod_part' + order_part2: gear_part + order_part3: pulley_part + visualize_drop_regions: false # Whether or not to visualize drop regions (world frame only) + +time_limit: 600 # Maximum time allowed for the trial once started, in seconds +random_seed: 1 # Seed for the pseudo random number generator (used to randomize model names) diff --git a/src/rrrobot_ws/src/rrrobot/config/rrrobot_sensors.yaml b/src/rrrobot_ws/src/rrrobot/config/rrrobot_sensors.yaml new file mode 100644 index 0000000..ca58aa4 --- /dev/null +++ b/src/rrrobot_ws/src/rrrobot/config/rrrobot_sensors.yaml @@ -0,0 +1,6 @@ +sensors: + depth_camera_1: + type: depth_camera + pose: + xyz: [1.0, 1.2, 1.4] + rpy: [0, 1.21, 0] diff --git a/src/rrrobot_ws/src/rrrobot/include/arm_representation.h b/src/rrrobot_ws/src/rrrobot/include/arm_representation.h new file mode 100644 index 0000000..fc8f129 --- /dev/null +++ b/src/rrrobot_ws/src/rrrobot/include/arm_representation.h @@ -0,0 +1,59 @@ +// arm_representation.h + +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include +#include + +#include "topic_names.h" +#include "rrrobot/arm_command.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +// using namespace std; +using std::string; + +class ArmRepresentation +{ +public: + ArmRepresentation(const KDL::Frame &base_pose = KDL::Frame(KDL::Rotation::Quaternion(0, 0, 0, 1), KDL::Vector(0.3, 0.92, 0.9))); //KDL::Frame(KDL::Vector(0.3, 0.92, 1))); + + int calculateForwardKinematics(const KDL::JntArray &joint_positions, KDL::Frame &end_effector_pose, int joint_nbr = -1); + + int calculateInverseKinematics(const std::vector &cur_configuration, + const KDL::Frame &desired_end_effector_pose, + KDL::JntArray &final_joint_configuration); + + std::vector get_joint_names(); + + KDL::Chain *getChain(); + +private: + KDL::Chain chain; + + // KDL::ChainFkSolverPos_recursive fk_solver; + // KDL::ChainIkSolverPos_LMA ik_solver; +}; diff --git a/src/rrrobot_ws/src/rrrobot/include/topic_names.h b/src/rrrobot_ws/src/rrrobot/include/topic_names.h new file mode 100644 index 0000000..de17340 --- /dev/null +++ b/src/rrrobot_ws/src/rrrobot/include/topic_names.h @@ -0,0 +1,18 @@ +// topic_names.h + +// COMPUTER VISION +#define CV_CLASSIFICATION_CHANNEL "/cv_model" // CV Model classifications + +// DEPTH CAMERA +#define DESIRED_GRASP_POSE_CHANNEL "/desired_grasp_pose" // Pose determined from depth camera + +// ARM CONTROLLER +#define ARM_DESTINATION_CHANNEL "/arm_controller/destination" // Sent from rrrobot_node to arm_controller when depth camera sees item +#define ARM_COMMAND_CHANNEL "/ariac/arm1/arm/command" // Send joint trajectories to arm +#define ARM_JOINT_STATES_CHANNEL "/ariac/arm1/joint_states" // See arm's current joint states +#define GRIPPER_STATE_CHANNEL "/ariac/arm1/gripper/state" // Get the state of the gripper +#define GRIPPER_CONTROL_CHANNEL "/ariac/arm1/gripper/control" // Turn gripper on or off + +// COMPETITION +#define START_COMPETITION_CHANNEL "/ariac/start_competition" // Start ARIAC competition +#define CONVEYOR_POWER_CHANNEL "/ariac/conveyor/control" // Turn conveyor belt on or off diff --git a/src/rrrobot_ws/src/rrrobot/launch/rrrobot.launch b/src/rrrobot_ws/src/rrrobot/launch/rrrobot.launch new file mode 100644 index 0000000..224c26d --- /dev/null +++ b/src/rrrobot_ws/src/rrrobot/launch/rrrobot.launch @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/rrrobot_ws/src/rrrobot/msg/arm_command.msg b/src/rrrobot_ws/src/rrrobot/msg/arm_command.msg new file mode 100644 index 0000000..18962c4 --- /dev/null +++ b/src/rrrobot_ws/src/rrrobot/msg/arm_command.msg @@ -0,0 +1,2 @@ +geometry_msgs/Pose grab_location +geometry_msgs/Pose drop_location \ No newline at end of file diff --git a/src/rrrobot_ws/src/rrrobot/msg/model_insertion.msg b/src/rrrobot_ws/src/rrrobot/msg/model_insertion.msg new file mode 100644 index 0000000..72337ab --- /dev/null +++ b/src/rrrobot_ws/src/rrrobot/msg/model_insertion.msg @@ -0,0 +1,2 @@ +string model_name +geometry_msgs/Pose pose \ No newline at end of file diff --git a/src/rrrobot_ws/src/rrrobot/package.xml b/src/rrrobot_ws/src/rrrobot/package.xml new file mode 100644 index 0000000..a2b13b5 --- /dev/null +++ b/src/rrrobot_ws/src/rrrobot/package.xml @@ -0,0 +1,32 @@ + + + rrrobot + 1.0.0 + RRRobot package + Sravan Balaji + Chenxi Gu + Jake Johnson + Derek Witcpalek + + MIT + + catkin + + osrf_gear + roscpp + sensor_msgs + std_srvs + trajectory_msgs + std_msgs + geometry_msgs + gazebo_ros + message_generation + pcl_ros + pcl_conversion + gazebo + PCL + Eigen3 + orocos_kdl + message_runtime + + \ No newline at end of file diff --git a/src/rrrobot_ws/src/rrrobot/scripts/arm_home_position.sh b/src/rrrobot_ws/src/rrrobot/scripts/arm_home_position.sh new file mode 100644 index 0000000..690127b --- /dev/null +++ b/src/rrrobot_ws/src/rrrobot/scripts/arm_home_position.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +rostopic pub /ariac/arm1/arm/command trajectory_msgs/JointTrajectory "{joint_names: \ + ['linear_arm_actuator_joint', 'shoulder_pan_joint', 'shoulder_lift_joint', 'elbow_joint', 'wrist_1_joint', 'wrist_2_joint', 'wrist_3_joint'], \ + points: [ \ +{time_from_start: {secs: 5}, \ + positions: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}, \ +]}" -1 diff --git a/src/rrrobot_ws/src/rrrobot/scripts/arm_pub_test.sh b/src/rrrobot_ws/src/rrrobot/scripts/arm_pub_test.sh new file mode 100755 index 0000000..1dc4c79 --- /dev/null +++ b/src/rrrobot_ws/src/rrrobot/scripts/arm_pub_test.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +source /app/rrrobot_ws/devel/setup.bash + +rostopic pub /arm_controller/destination rrrobot/arm_command "grab_location: + position: + x: 1.22 + y: 1.22 + z: 0.9725 + orientation: + x: 0.0 + y: 0.707 + z: 0.0 + w: 0.707 +drop_location: + position: + x: -0.3 + y: 0.383 + z: 1.0 + orientation: + x: 0.0 + y: 0.707 + z: 0.0 + w: 0.707" \ +-1 diff --git a/src/rrrobot_ws/src/rrrobot/scripts/arm_pub_test_continuous.sh b/src/rrrobot_ws/src/rrrobot/scripts/arm_pub_test_continuous.sh new file mode 100755 index 0000000..6ce4da3 --- /dev/null +++ b/src/rrrobot_ws/src/rrrobot/scripts/arm_pub_test_continuous.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +#rostopic pub /target_pose geometry_msgs/Pose '{position: {x: 0.875, y: 0.75, z: 1.5}, orientation: {x: 0, y: 0, z: 0, w: 0}}' +rostopic pub /arm_controller/destination rrrobot/arm_command "grab_location: + position: + x: 1.2 + y: 0.2 + z: 1.0 + orientation: + x: 0.0 + y: 0.0 + z: 0.0 + w: 0.0 +drop_location: + position: + x: -0.3 + y: 1.15 + z: 1.5 + orientation: + x: 0.0 + y: 0.0 + z: 0.0 + w: 0.0" diff --git a/src/rrrobot_ws/src/rrrobot/scripts/arm_test.sh b/src/rrrobot_ws/src/rrrobot/scripts/arm_test.sh new file mode 100644 index 0000000..1357345 --- /dev/null +++ b/src/rrrobot_ws/src/rrrobot/scripts/arm_test.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +cd /app/rrrobot_ws +# catkin_make clean +catkin_make +# catkin_make install +source devel/setup.bash +rosrun rrrobot arm_controller_node diff --git a/src/rrrobot_ws/src/rrrobot/scripts/rrrobot_run.sh b/src/rrrobot_ws/src/rrrobot/scripts/rrrobot_run.sh new file mode 100755 index 0000000..ed6de85 --- /dev/null +++ b/src/rrrobot_ws/src/rrrobot/scripts/rrrobot_run.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +cd /app/rrrobot_ws/ + +# catkin_make clean +catkin_make +# catkin_make install + +cd /app/rrrobot_ws/src/rrrobot/scripts + +sudo cp ../launch/rrrobot.launch /opt/ros/melodic/share/osrf_gear/launch +sudo cp ../../../world/gear.py /opt/ros/melodic/lib/osrf_gear/gear.py +sudo cp ../../../world/gear.world.template /opt/ros/melodic/share/osrf_gear/worlds/gear.world.template + +roslaunch osrf_gear rrrobot.launch diff --git a/src/rrrobot_ws/src/rrrobot/scripts/rrrobot_run_no_build.sh b/src/rrrobot_ws/src/rrrobot/scripts/rrrobot_run_no_build.sh new file mode 100755 index 0000000..1fab546 --- /dev/null +++ b/src/rrrobot_ws/src/rrrobot/scripts/rrrobot_run_no_build.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +sudo cp ../launch/rrrobot.launch /opt/ros/melodic/share/osrf_gear/launch +sudo cp ../../../world/gear.py /opt/ros/melodic/lib/osrf_gear/gear.py +sudo cp ../../../world/gear.world.template /opt/ros/melodic/share/osrf_gear/worlds/gear.world.template + +roslaunch osrf_gear rrrobot.launch diff --git a/src/rrrobot_ws/src/rrrobot/scripts/sample_run.sh b/src/rrrobot_ws/src/rrrobot/scripts/sample_run.sh new file mode 100755 index 0000000..d1516ae --- /dev/null +++ b/src/rrrobot_ws/src/rrrobot/scripts/sample_run.sh @@ -0,0 +1,62 @@ +#!/bin/bash + +# Start Competition +rosservice call /ariac/start_competition + +# Wait +sleep 2 + +# Move arm1 over a gasket part +rostopic pub /ariac/arm1/arm/command trajectory_msgs/JointTrajectory "{joint_names: \ + ['linear_arm_actuator_joint', 'shoulder_pan_joint', 'shoulder_lift_joint', 'elbow_joint', 'wrist_1_joint', 'wrist_2_joint', 'wrist_3_joint'], \ + points: [ \ +{time_from_start: {secs: 2}, \ + positions: [0.15, 3.14, -1.570, 2.14, 3.1, -1.59, 0.126]}, \ +{time_from_start: {secs: 4}, \ + positions: [-0.35, 3.14, -0.6, 2.3, 3.0, -1.59, 0.126]}, \ +{time_from_start: {secs: 6}, \ + positions: [-0.35, 3.14, -0.5, 2.3, 3.05, -1.59, 0.126]}, \ +]}" -1 + +# Wait for arm to move +sleep 8 + +# Turn gripper suction on +rosservice call /ariac/arm1/gripper/control "enable: true" + +# Wait for suction +sleep 2 + +# Move part to AGV1's tray +rostopic pub /ariac/arm1/arm/command trajectory_msgs/JointTrajectory "{joint_names: \ + ['linear_arm_actuator_joint', 'shoulder_pan_joint', 'shoulder_lift_joint', 'elbow_joint', 'wrist_1_joint', 'wrist_2_joint', 'wrist_3_joint'], \ + points: [ \ +{time_from_start: {secs: 2}, \ + positions: [0.0, 3.14, -1.570, 2.14, 3.27, -1.51, 0.0]}, \ +{time_from_start: {secs: 5}, \ + positions: [1.0, 1.85, 0, -0.38, 1.57, -1.51, 0.00]}, \ +{time_from_start: {secs: 7}, \ + positions: [1.0, 1.507, 0, -0.38, 0.38, -1.51, 0.00]}, \ +{time_from_start: {secs: 10}, \ + positions: [1.18, 1.507, 0.38, -0.38, 1.55, 1.75, 0.127]}, \ +]}" -1 + +# Wait for arm to move +sleep 12 + +# Turn gripper suction off +rosservice call /ariac/arm1/gripper/control "enable: false" + +# Wait for suction +sleep 2 + +# Return to starting position +rostopic pub /ariac/arm1/arm/command trajectory_msgs/JointTrajectory "{joint_names: \ + ['linear_arm_actuator_joint', 'shoulder_pan_joint', 'shoulder_lift_joint', 'elbow_joint', 'wrist_1_joint', 'wrist_2_joint', 'wrist_3_joint'], \ + points: [ \ +{time_from_start: {secs: 5}, \ + positions: [0.0, 3.14, -1.570, 2.14, 3.27, -1.51, 0.0]}, \ +]}" -1 + +# Wait for arm to move +sleep 7 diff --git a/src/rrrobot_ws/src/rrrobot/src/arm_controller_node.cpp b/src/rrrobot_ws/src/rrrobot/src/arm_controller_node.cpp new file mode 100644 index 0000000..c6c0d7f --- /dev/null +++ b/src/rrrobot_ws/src/rrrobot/src/arm_controller_node.cpp @@ -0,0 +1,550 @@ +// arm_controller_node.cpp + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include "topic_names.h" +#include "rrrobot/arm_command.h" +#include "arm_representation.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include /* srand, rand */ +#include /* time */ +#include + +#include +#include + +using namespace std; + +class ArmController +{ +public: + // Constructor + ArmController(ros::NodeHandle &node, ArmRepresentation *arm_, double time_per_step, int retry_attempts, double item_attach_z_adjustment) : gripper_enabled_(false), item_attached_(false), arm(arm_), time_per_step(time_per_step), retry_attempts(retry_attempts), item_attach_z_adjustment(item_attach_z_adjustment) + { + arm_joint_trajectory_publisher_ = node.advertise(ARM_COMMAND_CHANNEL, 10); + + gripper_ = node.serviceClient(GRIPPER_CONTROL_CHANNEL); + + arm_current_joint_states_.resize(arm->getChain()->getNrOfJoints(), 0.0); + + /* initialize random seed: */ + srand(time(NULL)); + } + + // Receive joint state messages + void joint_state_callback(const sensor_msgs::JointState &joint_state_msg) + { + // Copy joint states to private variable arm_current_joint_states_ + int nbr_joints = arm->getChain()->getNrOfJoints(); + vector msg_joint_names = joint_state_msg.name; + vector cur_joint_names = arm->get_joint_names(); + vector position = joint_state_msg.position; + + // Set all values to 0 + for (int i = 0; i < nbr_joints; ++i) + { + arm_current_joint_states_[i] = 0.0; + } + + // Match up joint names from message to internal joint names order + for (size_t i = 0; i < position.size(); ++i) + { + for (size_t j = 0; j < cur_joint_names.size(); ++j) + { + if (msg_joint_names[i].compare(cur_joint_names[j]) == 0) + { + arm_current_joint_states_[j] = position[i]; + } + } + } + } + + // Receive gripper state messages + void gripper_state_callback(const osrf_gear::VacuumGripperState::ConstPtr &gripper_state_msg) + { + // Store message states in private variables + gripper_enabled_ = gripper_state_msg->enabled; + item_attached_ = gripper_state_msg->attached; + } + + // Receive message from RRRobot node with desired pose to pick up object from conveyor belt + void arm_destination_callback(const rrrobot::arm_command &target_pose) + { + ROS_INFO("Received target pose"); + int attempts = 0; + int nbr_joints = arm->getChain()->getNrOfJoints(); + vector positions; + + // Turn on suction + while (!gripper_control(true)) + { + if (attempts == retry_attempts) + { + ROS_ERROR("STEP 1: Suction failed, not going to target"); + return; + } + + ros::Duration(1).sleep(); + attempts++; + } + + ROS_INFO("STEP 1: Suction turned on"); + + // Move arm to pickup item from conveyor belt + attempts = 1; + if (calc_joint_positions(target_pose.grab_location, above_conveyor, positions)) + send_joint_trajectory(positions, arm_action_phase::bin_to_belt); + + // Check if target has been reached + while (!have_reached_target(frame_to_pose(calc_end_effector_pose()), target_pose.grab_location)) + { + if (attempts == retry_attempts) + { + ROS_ERROR("STEP 2: Did not reach target in allotted time"); + return; + } + + if (calc_joint_positions(target_pose.grab_location, get_randomized_start_state(above_conveyor) /*target_pose.grab_location.position.y)*/, positions)) + send_joint_trajectory(positions, arm_action_phase::bin_to_belt); + attempts++; + } + + ROS_INFO("STEP 2: Reached target conveyor belt position"); + + attempts = 0; + geometry_msgs::Pose target_location = target_pose.grab_location; + + // Wait until object is attached + while (!item_attached_) + { + if (attempts == retry_attempts) + { + ROS_ERROR("STEP 3: Could not pick up item"); + return; + } + + // If item is not able to attach, adjust z and try again + target_location.position.z -= item_attach_z_adjustment; // meters + if (calc_joint_positions(target_location, arm_current_joint_states_, positions)) + send_joint_trajectory(positions, arm_action_phase::item_pickup_adjustment); + attempts++; + } + + ROS_INFO("STEP 3: Item picked up"); + + // Move item to desired position + attempts = 1; + KDL::Frame end_effector_pose; + + if (target_pose.drop_location.position.y > 1.0) + { + positions = bin1; + KDL::JntArray pos(positions.size()); + for (size_t idx = 0; idx < positions.size(); ++idx) + { + pos(idx) = positions[idx]; + } + arm->calculateForwardKinematics(pos, end_effector_pose); + } + else + { + positions = bin2; + KDL::JntArray pos(positions.size()); + for (size_t idx = 0; idx < positions.size(); ++idx) + { + pos(idx) = positions[idx]; + } + arm->calculateForwardKinematics(pos, end_effector_pose); + } + + // Check if target has been reached + while (!have_reached_target(frame_to_pose(calc_end_effector_pose()), frame_to_pose(end_effector_pose))) //target_pose.drop_location)) + { + if (attempts == retry_attempts) + { + ROS_ERROR("STEP 4: Did not reach target in allotted time"); + return; + } + + send_joint_trajectory(positions, arm_action_phase::belt_to_bin); + attempts++; + } + + ROS_INFO("STEP 4: Reached drop location"); + + // Turn off suction + attempts = 0; + while (!gripper_control(false)) + { + if (attempts == retry_attempts) + { + ROS_ERROR("STEP 5: Suction not turning off... ¯\\_(ツ)_/¯"); + return; + } + + ros::Duration(1).sleep(); + attempts++; + } + + ROS_INFO("STEP 5: Suction turned off"); + + // Wait until object is detached + attempts = 0; + while (item_attached_) + { + if (attempts == retry_attempts) + { + ROS_ERROR("STEP 6: Item not detaching.. ¯\\_(ツ)_/¯"); + } + + ros::Duration(1).sleep(); + attempts++; + } + + ROS_INFO("STEP 6: Dropped item in bin"); + } + +private: + // Private variables + bool gripper_enabled_; + bool item_attached_; + ros::Publisher arm_joint_trajectory_publisher_; + ros::ServiceClient gripper_; + vector arm_current_joint_states_; + ArmRepresentation *arm; + enum arm_action_phase + { + belt_to_bin, + bin_to_belt, + item_pickup_adjustment + }; + double time_per_step; + int retry_attempts; + double item_attach_z_adjustment; + // Define intermediate joint positions + const vector above_conveyor = {0, 0, -M_PI / 2, M_PI / 2, -M_PI / 2, -M_PI / 2, 0}; + const vector above_bins = {0, M_PI, -M_PI / 2, M_PI / 2, -M_PI / 2, -M_PI / 2, 0}; + const vector bin1 = {0.05, 0.0, -2.2, -2.2, -0.25, 1.5708, 0.0}; + const vector bin2 = {-0.7, 0.0, -2.2, -2.2, -0.25, 1.5708, 0.0}; + + // Randomize start state to avoid inverse kinematics getting stuck in local minimum + vector get_randomized_start_state(const vector &preferred_state) + { + vector cur; + std::stringstream location; + location << "Random location: "; + // cur.push_back(y); + for (size_t pos = 0; pos < arm->getChain()->getNrOfJoints(); ++pos) { + int val = rand() % 2; + double diff = 0; + + if (val == 1) { + diff = -0.1; + } + else { + diff = 0.1; + } + + cur.push_back(preferred_state[pos] + diff); + location << cur[pos] << " "; + } + + location << '\n'; + ROS_INFO(location.str().c_str()); + + return cur; + } + + // Use inverse kinematics to calculate joint positions to reach desired pose + bool calc_joint_positions(const geometry_msgs::Pose &pose, const vector &start_state, vector &positions) + { + KDL::Frame desired_end_effector_pose = pose_to_frame(pose); + KDL::JntArray final_joint_configuration(arm->getChain()->getNrOfJoints()); + + // ROS_INFO("cur_configuration (%i x %i)", cur_configuration.rows(), cur_configuration.columns()); + + int error_code = arm->calculateInverseKinematics(start_state, desired_end_effector_pose, final_joint_configuration); + + // Check status of IK and print error message if there is a failure + if (error_code != 0) + { + ROS_ERROR("Inverse Kinematics Failure: %i", error_code); + } + + // Convert data attribute (Eigen::VectorXd) of KDL::JntArray to double[] via data() function + int nbr_joints = arm->getChain()->getNrOfJoints(); + Eigen::VectorXd mat = final_joint_configuration.data; + positions.clear(); + std::stringstream pos_str; + pos_str << "Calculated joint positions: "; + + for (size_t idx = 0; idx < arm->getChain()->getNrOfJoints(); ++idx) + { + positions.push_back(mat[idx]); + pos_str << mat[idx] << " "; + } + + pos_str << '\n'; + + ROS_INFO(pos_str.str().c_str()); + + return (error_code == 0); + } + + // Use forward kinematics to calculate end effector pose from current joint states + KDL::Frame calc_end_effector_pose() + { + int num_joints = arm->getChain()->getNrOfJoints(); + + KDL::Frame end_effector_pose; + KDL::JntArray joint_positions(num_joints); + + // Copy current joint states values into JntArray + for (int i = 0; i < num_joints; ++i) + { + joint_positions(i) = arm_current_joint_states_[i]; + } + + int error_code = arm->calculateForwardKinematics(joint_positions, end_effector_pose); + + // Check status of FK and do something if there is a failure + if (error_code != 0) + { + ROS_ERROR("Forward Kinematics Failure: %i", error_code); + } + + return end_effector_pose; + } + + // Convert from Pose to KDL::Frame + KDL::Frame pose_to_frame(const geometry_msgs::Pose &pose) + { + double p_x = pose.position.x; + double p_y = pose.position.y; + double p_z = pose.position.z; + + double q_x = pose.orientation.x; + double q_y = pose.orientation.y; + double q_z = pose.orientation.z; + double q_w = pose.orientation.w; + + KDL::Rotation rot(KDL::Rotation::Quaternion(q_x, q_y, q_z, q_w)); + KDL::Vector pos(p_x, p_y, p_z); + return KDL::Frame(rot, pos); + } + + // Convert from KDL::Frame to Pose + geometry_msgs::Pose frame_to_pose(const KDL::Frame &frame) + { + double p_x = frame.p.x(); + double p_y = frame.p.y(); + double p_z = frame.p.z(); + + double q_x, q_y, q_z, q_w; + frame.M.GetQuaternion(q_x, q_y, q_z, q_w); + + geometry_msgs::Pose pose; + + pose.position.x = p_x; + pose.position.y = p_y; + pose.position.z = p_z; + + pose.orientation.x = q_x; + pose.orientation.y = q_y; + pose.orientation.z = q_z; + pose.orientation.w = q_w; + + return pose; + } + + // Send desired joint states to joint controller + void send_joint_trajectory(const vector &target, arm_action_phase phase) + { + // Declare JointTrajectory message + trajectory_msgs::JointTrajectory msg; + + // Fill the names of the joints to be controlled + msg.joint_names = arm->get_joint_names(); + + int num_points = 3; + + // Create points in the trajectory + msg.points.resize(num_points); + + for (int i = 0; i < num_points; ++i) + { + if (i == 0) + { + if (phase == arm_action_phase::belt_to_bin) + { + msg.points[i].positions = above_conveyor; + } + else if (phase == arm_action_phase::bin_to_belt) + { + msg.points[i].positions = above_bins; + } + else if (phase == arm_action_phase::item_pickup_adjustment) + { + num_points = 1; + msg.points.resize(num_points); + msg.points[i].positions = target; + msg.points[i].time_from_start = ros::Duration(time_per_step); + break; + } + + msg.points[i].time_from_start = ros::Duration((i + 1) * time_per_step); + } + else if (i == 1) + { + if (phase == arm_action_phase::belt_to_bin) + { + msg.points[i].positions = above_bins; + } + else if (phase == arm_action_phase::bin_to_belt) + { + msg.points[i].positions = above_conveyor; + } + + msg.points[i].time_from_start = ros::Duration((i + 1) * time_per_step); + } + else if (i == (num_points - 1)) + { + msg.points[i].positions = target; + msg.points[i].time_from_start = ros::Duration((i + 1) * time_per_step); + } + } + + arm_joint_trajectory_publisher_.publish(msg); + + // Wait to reach target + ros::Duration((num_points + 1) * time_per_step).sleep(); + } + + // Turn gripper on or off + bool gripper_control(bool state) + { + osrf_gear::VacuumGripperControl srv; + srv.request.enable = state; + + bool success = gripper_.call(srv); + + if (!success) + { + ROS_ERROR("Could not enable gripper"); + } + + return success; + } + + // Check if the end effector has reached the target position (within threshold) + bool have_reached_target(geometry_msgs::Pose cur, geometry_msgs::Pose target) + { + // Threshold values + float pos_thresh = 0.15; // Meters + float rot_thresh = 0.05; + + float pos_err = fabs(cur.position.x - target.position.x) + + fabs(cur.position.y - target.position.y) + + fabs(cur.position.z - target.position.z); + + // ROS_INFO_STREAM("pos_err: " << pos_err << " (" << pos_thresh << ")"); + + if (pos_err > pos_thresh) + { + return false; + } + + float qx_err = fabs(fabs(cur.orientation.x) - fabs(target.orientation.x)); + float qy_err = fabs(fabs(cur.orientation.y) - fabs(target.orientation.y)); + float qz_err = fabs(fabs(cur.orientation.z) - fabs(target.orientation.z)); + float qw_err = fabs(fabs(cur.orientation.w) - fabs(target.orientation.w)); + + // ROS_INFO_STREAM("qx_err: " << qx_err << " (" << rot_thresh << ")"); + // ROS_INFO_STREAM("qy_err: " << qy_err << " (" << rot_thresh << ")"); + // ROS_INFO_STREAM("qz_err: " << qz_err << " (" << rot_thresh << ")"); + // ROS_INFO_STREAM("qw_err: " << qw_err << " (" << rot_thresh << ")"); + + if (qx_err > rot_thresh) + { + return false; + } + + if (qy_err > rot_thresh) + { + return false; + } + + if (qz_err > rot_thresh) + { + return false; + } + + if (qw_err > rot_thresh) + { + return false; + } + + return true; + } +}; + +int main(int argc, char **argv) +{ + ROS_INFO("Starting arm_controller_node"); + + // Last argument is the default name of the node. + ros::init(argc, argv, "arm_controller_node"); + + ros::NodeHandle node; + + ArmRepresentation arm; + + // Set parameters + double time_per_step = 3.0; // seconds + int retry_attempts = 3; + double item_attach_z_adjustment = 0.05; // meters + ArmController ac(node, &arm, time_per_step, retry_attempts, item_attach_z_adjustment); + + // Start asynchronous spinner to receive messages on subscribed topics + ros::AsyncSpinner spinner(0); + spinner.start(); + + // Subscribe to ROS topics + ros::Subscriber arm_destination_sub = node.subscribe(ARM_DESTINATION_CHANNEL, 1, &ArmController::arm_destination_callback, &ac); + ros::Subscriber gripper_state_sub = node.subscribe(GRIPPER_STATE_CHANNEL, 1, &ArmController::gripper_state_callback, &ac); + ros::Subscriber joint_state_sub = node.subscribe(ARM_JOINT_STATES_CHANNEL, 1, &ArmController::joint_state_callback, &ac); + + ROS_INFO("Setup complete"); + + // Execute callbacks on new data until ctrl-c + ros::waitForShutdown(); + + return 0; +} diff --git a/src/rrrobot_ws/src/rrrobot/src/arm_representation.cpp b/src/rrrobot_ws/src/rrrobot/src/arm_representation.cpp new file mode 100644 index 0000000..c11b7b9 --- /dev/null +++ b/src/rrrobot_ws/src/rrrobot/src/arm_representation.cpp @@ -0,0 +1,124 @@ +// arm_representation.cpp + +#include "arm_representation.h" +#include + +using namespace std; + +// Constructor +ArmRepresentation::ArmRepresentation(const KDL::Frame &base_pose) +{ + // Parameters for coordinate transformations of robot links and joints + const double base_len = 0.2; + const double shoulder_height = 0.1273; + const double upper_arm_length = 0.612; + const double forearm_length = 0.5723; + const double shoulder_offset = 0.220941; + const double elbow_offset = -0.1719; + const double wrist_1_length = 0.163941 - elbow_offset - shoulder_offset; + const double wrist_2_length = 0.1157; + const double wrist_3_length = 0.0922; + + // Define chain of links and joints using KDL + KDL::Segment linear_arm_actuator("linear_arm_actuator_joint", + KDL::Joint(KDL::Joint::JointType::None), base_pose); + chain.addSegment(linear_arm_actuator); + + const KDL::Vector pos_base(0, 0, base_len / 2); + const KDL::Rotation rot_base(KDL::Rotation::Quaternion(0, 0, 0, 1)); + KDL::Segment base_link("base_link", KDL::Joint(KDL::Joint::JointType::None), //KDL::Joint("linear_arm_actuator_joint", KDL::Joint::JointType::TransY), + KDL::Frame(rot_base, pos_base)); + chain.addSegment(base_link); + + const KDL::Vector pos_shoulder(0, 0, shoulder_height); + const KDL::Rotation rot_shoulder(KDL::Rotation::Quaternion(0, 0, 0, 1)); + KDL::Segment shoulder_link("shoulder_link", KDL::Joint("linear_arm_actuator_joint", KDL::Joint::JointType::TransY), //KDL::Joint("shoulder_pan_joint", KDL::Joint::JointType::RotZ), + KDL::Frame(rot_shoulder, pos_shoulder)); + chain.addSegment(shoulder_link); + + const KDL::Vector pos_upper_arm(0, shoulder_offset, 0); + const KDL::Rotation rot_upper_arm(KDL::Rotation::Quaternion(0, sqrt(2) / 2, 0, sqrt(2) / 2)); + KDL::Segment upper_arm_link("upper_arm_link", KDL::Joint("shoulder_pan_joint", KDL::Joint::JointType::RotZ), //KDL::Joint("shoulder_lift_joint", KDL::Joint::JointType::RotY), + KDL::Frame(rot_upper_arm, pos_upper_arm)); + chain.addSegment(upper_arm_link); + + const KDL::Vector pos_forearm(0, elbow_offset, upper_arm_length); + const KDL::Rotation rot_forearm(KDL::Rotation::Quaternion(0, 0, 0, 1)); + KDL::Segment forearm_link("forearm_link", KDL::Joint("shoulder_lift_joint", KDL::Joint::JointType::RotY), //KDL::Joint("elbow_joint", KDL::Joint::JointType::RotY), + KDL::Frame(rot_forearm, pos_forearm)); + chain.addSegment(forearm_link); + + const KDL::Vector pos_wrist_1(0, 0, forearm_length); + const KDL::Rotation rot_wrist_1(KDL::Rotation::Quaternion(0, sqrt(2) / 2, 0, sqrt(2) / 2)); + KDL::Segment wrist_1_link("wrist_1_link", KDL::Joint("elbow_joint", KDL::Joint::JointType::RotY), //KDL::Joint("wrist_1_joint", KDL::Joint::JointType::RotY), + KDL::Frame(rot_wrist_1, pos_wrist_1)); + chain.addSegment(wrist_1_link); + + const KDL::Vector pos_wrist_2(0, wrist_1_length, 0); + const KDL::Rotation rot_wrist_2(KDL::Rotation::Quaternion(0, 0, 0, 1)); + KDL::Segment wrist_2_link("wrist_2_link", KDL::Joint("wrist_1_joint", KDL::Joint::JointType::RotY), //KDL::Joint("wrist_2_joint", KDL::Joint::JointType::RotZ), + KDL::Frame(rot_wrist_2, pos_wrist_2)); + chain.addSegment(wrist_2_link); + + const KDL::Vector pos_wrist_3(0, 0, wrist_2_length); + const KDL::Rotation rot_wrist_3(KDL::Rotation::Quaternion(0, 0, 0, 1)); + KDL::Segment wrist_3_link("wrist_3_link", KDL::Joint("wrist_2_joint", KDL::Joint::JointType::RotZ), //KDL::Joint("wrist_3_joint", KDL::Joint::JointType::RotY), + KDL::Frame(rot_wrist_3, pos_wrist_3)); + chain.addSegment(wrist_3_link); + + const KDL::Vector pos_ee(0, wrist_3_length, 0.0); + const KDL::Rotation rot_ee(KDL::Rotation::Quaternion(0, 0, sqrt(2) / 2, sqrt(2) / 2)); + KDL::Segment ee_link("ee_link", KDL::Joint("wrist_3_joint", KDL::Joint::JointType::RotY), //KDL::Joint(KDL::Joint::JointType::None), + KDL::Frame(rot_ee, pos_ee)); + chain.addSegment(ee_link); +} + +// Use KDL to calculate position of end effector from joint states +int ArmRepresentation::calculateForwardKinematics(const KDL::JntArray &joint_positions, KDL::Frame &end_effector_pose, int joint_nbr) +{ + KDL::ChainFkSolverPos_recursive fk_solver(chain); + int status = fk_solver.JntToCart(joint_positions, end_effector_pose, joint_nbr); + + return status; +} + +// Use KDL to calculate joint states from position of end effector +int ArmRepresentation::calculateInverseKinematics(const vector &cur_configuration, + const KDL::Frame &desired_end_effector_pose, + KDL::JntArray &final_joint_configuration) +{ + KDL::ChainIkSolverPos_LMA ik_solver(chain, 1e-3, 2000, 1e-8); + + // Convert cur_configuration vector to JntArray + int num_joints = chain.getNrOfJoints(); + KDL::JntArray pos(num_joints); + KDL::SetToZero(pos); + + for (int i = 0; i < num_joints; ++i) { + pos(i) = cur_configuration[i]; + } + + int status = ik_solver.CartToJnt(pos, desired_end_effector_pose, final_joint_configuration); + + return status; +} + +// Get vector of joint names +vector ArmRepresentation::get_joint_names() +{ + vector joint_names; + + for (auto it : chain.segments) + { + if (it.getJoint().getType() != KDL::Joint::JointType::None) + joint_names.push_back(it.getJoint().getName()); + } + + return joint_names; +} + +// Return reference to object +KDL::Chain *ArmRepresentation::getChain() +{ + return &chain; +} diff --git a/src/rrrobot_ws/src/rrrobot/src/cv_model.py b/src/rrrobot_ws/src/rrrobot/src/cv_model.py new file mode 100644 index 0000000..dfcf096 --- /dev/null +++ b/src/rrrobot_ws/src/rrrobot/src/cv_model.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python +# cv_model.py + +import rospy +from std_msgs.msg import String + +import os, torch, torchvision +import numpy as np +from torch import nn +from PIL import Image + + +class Model_mobilenet(nn.Module): + def __init__(self): + super(Model_mobilenet, self).__init__() + self.mobilenet = torchvision.models.mobilenet_v2(pretrained=True) + + self.mobilenet.classifier = nn.Sequential( + nn.Dropout(p=0.2, inplace=False), + nn.Linear(1280, 6, bias=True)) + + def forward(self, image): + z = self.mobilenet(image) + return z + + +def call_back(filename): + # prepare input file + filename = filename.data + input_image = Image.open(filename) + if input_image.size[0] < input_image.size[1]: + input_image = input_image.transpose(Image.ROTATE_90) + input_image = input_image.resize((512, 384)) + # print(input_image.size) + input_image = np.moveaxis(np.asarray(input_image), 2, 0).astype(np.float32) + input_tensor = torch.from_numpy(input_image) + input_tensor = torch.unsqueeze(input_tensor, dim=0) + # print(input_tensor.shape) + + # query model + predicted_logits = model(input_tensor).squeeze() + # print(predicted_logits.shape) + predicted_label = torch.argmax(predicted_logits).detach().numpy().tolist() + + type_dict = {0: 'cardboard', + 1: 'glass' , + 2: 'metal' , + 3: 'paper' , + 4: 'plastic' , + 5: 'trash' } + + print('type: ', type_dict[predicted_label]) + + # publish a message, name of this node is 'cv_model' + pub = rospy.Publisher('/cv_model', String, queue_size=10) + # rospy.init_node('talker', anonymous=True) + rate = rospy.Rate(10) # 10hz + + garbage_type = type_dict[predicted_label] + rospy.loginfo(filename + ':' + garbage_type) + pub.publish(filename + ':' + garbage_type) + # rate.sleep() + + +def listener(): + # rospy.init_node('listener', anonymous=True) + rospy.Subscriber('/current_image', String, call_back) + # spin() simply keeps python from exiting until this node is stopped + rospy.spin() + + +if __name__ == '__main__': + rospy.init_node('cv_node') + + # prepare pretrained model + model = Model_mobilenet() + model.load_state_dict(torch.load('pytorch_pretrain_model.pt', map_location='cpu')) + model = model.to('cpu') + model.eval() + + # listen to another node + listener() diff --git a/src/rrrobot_ws/src/rrrobot/src/depth_camera_node.cpp b/src/rrrobot_ws/src/rrrobot/src/depth_camera_node.cpp new file mode 100644 index 0000000..e78ce26 --- /dev/null +++ b/src/rrrobot_ws/src/rrrobot/src/depth_camera_node.cpp @@ -0,0 +1,272 @@ +// depth_camera_node.cpp + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "topic_names.h" + +ros::Publisher pub; + +void depth_camera_callback(const sensor_msgs::PointCloud::ConstPtr &cloud_msg) +{ + // define camera pose + float cam_x = 1.0; + float cam_y = 1.2; + float cam_z = 1.4; + // rpy = 0 1.21 0 + + // convert from PointCloud to PointCloud2 + sensor_msgs::PointCloud2 cloud2; + sensor_msgs::convertPointCloudToPointCloud2(*cloud_msg, cloud2); + + // transform to world frame + sensor_msgs::PointCloud2 worldCloud; + + tf::Transform xform; + xform.setOrigin(tf::Vector3(cam_x, cam_y, cam_z)); + xform.setRotation(tf::Quaternion(0, 0.5697, 0, 0.82185)); + + pcl_ros::transformPointCloud("world", xform, cloud2, worldCloud); + + // Container for original & filtered data + pcl::PCLPointCloud2 *cloud = new pcl::PCLPointCloud2; + pcl::PCLPointCloud2ConstPtr cloudPtr(cloud); + pcl::PCLPointCloud2 cloud_filtered; + + // Convert to PCL data type + pcl_conversions::toPCL(worldCloud, *cloud); + + // Perform the actual filtering + pcl::VoxelGrid sor; + sor.setInputCloud(cloudPtr); + sor.setLeafSize(0.001, 0.001, 0.001); + sor.filter(cloud_filtered); + + pcl::PointCloud point_cloud; + pcl::PointCloud::Ptr point_cloudPtr(new pcl::PointCloud); + pcl::fromPCLPointCloud2(cloud_filtered, point_cloud); + pcl::copyPointCloud(point_cloud, *point_cloudPtr); + + // Filter out points on surface of belt + for (std::size_t i = 0; i < point_cloudPtr->points.size(); i++) + { + //std::cout << point_cloudPtr->points[i].x << ", " << point_cloudPtr->points[i].y << ", " << point_cloudPtr->points[i].z << std::endl; + if (point_cloudPtr->points[i].z < 0.93) + { + point_cloudPtr->points[i].x = 0; + point_cloudPtr->points[i].y = 0; + point_cloudPtr->points[i].z = 0; + } + } + + // Create the KdTree object for the search method of the extraction + pcl::search::KdTree::Ptr tree(new pcl::search::KdTree); + tree->setInputCloud(point_cloudPtr); + + std::vector cluster_indices; + pcl::EuclideanClusterExtraction ec; + ec.setClusterTolerance(0.05); // 5cm + ec.setMinClusterSize(10); //10 + ec.setMaxClusterSize(99000000); + ec.setSearchMethod(tree); + ec.setInputCloud(point_cloudPtr); + ec.extract(cluster_indices); + + pcl::PointCloud::Ptr point_cloud_segmented(new pcl::PointCloud); + + int j = 0; + + // store index of object cluster + int obj_idx = -1; + + for (std::vector::const_iterator it = cluster_indices.begin(); it != cluster_indices.end(); ++it) + { + // average all points + int s = 0; + float x = 0; + float y = 0; + float z = 0; + for (std::vector::const_iterator pit = it->indices.begin(); pit != it->indices.end(); ++pit) + { + // convert + pcl::PointXYZRGB point; + point.x = point_cloudPtr->points[*pit].x; + point.y = point_cloudPtr->points[*pit].y; + point.z = point_cloudPtr->points[*pit].z; + + // add to running totals + s++; + x += point.x; + y += point.y; + z += point.z; + + if (j == 0) //Red #FF0000 (255,0,0) + { + point.r = 0; + point.g = 0; + point.b = 255; + } + else if (j == 1) //Lime #00FF00 (0,255,0) + { + point.r = 0; + point.g = 255; + point.b = 0; + } + else if (j == 2) // Blue #0000FF (0,0,255) + { + point.r = 255; + point.g = 0; + point.b = 0; + } + else + { + if (j % 2 == 0) + { + point.r = 255 * j / (cluster_indices.size()); + point.g = 128; + point.b = 50; + } + else + { + point.r = 0; + point.g = 255 * j / (cluster_indices.size()); + point.b = 128; + } + } + point_cloud_segmented->push_back(point); + } + // calculate center of cluster + x /= s; + y /= s; + z /= s; + + // print cluster center + std::cout << "cluster at: " << x << ", " << y << ", " << z << std::endl; + + // check if center is within box + if (x < 1.25 && x > 1.15 && y < cam_y + .05 && y > cam_y - .05) + { + // object detected + std::cout << "object in position" << std::endl; + obj_idx = j; + } + + j++; + } + + // identify surfaces of object cluster + if (obj_idx != -1) + { + // create new cloud containing only object cluster + pcl::PointCloud obj_cloud; + std::vector::const_iterator it = cluster_indices.begin() + obj_idx; + for (std::vector::const_iterator pit = it->indices.begin(); pit != it->indices.end(); ++pit) + { + pcl::PointXYZ point; + point.x = point_cloudPtr->points[*pit].x; + point.y = point_cloudPtr->points[*pit].y; + point.z = point_cloudPtr->points[*pit].z; + obj_cloud.push_back(point); + } + + std::cout << "object cluster size: " << obj_cloud.points.size() << std::endl; + + // create 3D bounding box. + float xmin = 10.0; + float ymin = 10.0; + float zmin = 0.92; + float xmax = 0; + float ymax = 0; + float zmax = 0; + + for (int i = 0; i < obj_cloud.points.size(); ++i) + { + xmin = xmin < obj_cloud.points[i].x ? xmin : obj_cloud.points[i].x; + ymin = ymin < obj_cloud.points[i].y ? ymin : obj_cloud.points[i].y; + //zmin = zmin < obj_cloud.points[i].z ? zmin : obj_cloud.points[i].z; + xmax = xmax > obj_cloud.points[i].x ? xmax : obj_cloud.points[i].x; + ymax = ymax > obj_cloud.points[i].y ? ymax : obj_cloud.points[i].y; + zmax = zmax > obj_cloud.points[i].z ? zmax : obj_cloud.points[i].z; + } + + // determine target pose + float area_top = (ymax - ymin) * (xmax - xmin); + float area_side = (zmax - zmin) * (ymax - ymin); + + std::cout << "object top area: " << area_top << std::endl; + std::cout << "object side area: " << area_side << std::endl; + + geometry_msgs::Pose pose; + geometry_msgs::Point p; + geometry_msgs::Quaternion q; + + // pick up from top (-z direction) + if (area_top > .002) + { + std::cout << "picking up object from top" << std::endl; + p.x = (xmin + xmax) / 2; + p.y = (ymin + ymax) / 2; + p.z = zmax; + + // rpy = 0 0 0 + q.x = 0; + q.y = 0.707; + q.z = 0; + q.w = 0.707; + } + else + { + // pick up from front (+x direction) + std::cout << "picking up object from front" << std::endl; + p.x = xmin; + p.y = (ymin + ymax) / 2; + p.z = (zmax + zmin) / 2; + + // rpy = -pi/2 0 pi/2 + q.x = 0.707; + q.y = 0.0; + q.z = 0.0; + q.w = 0.707; + } + + pose.position = p; + pose.orientation = q; + + // publish pose + pub.publish(pose); + } +} + +int main(int argc, char **argv) +{ + // Last argument is the default name of the node. + ros::init(argc, argv, "depth_camera_node"); + + ros::NodeHandle node; + + // Subscribe to depth camera topic + ros::Subscriber sub = node.subscribe("/ariac/depth_camera_1", 1, depth_camera_callback); + + // Publish object's current location to topic for RRRobot node to listen to + pub = node.advertise(DESIRED_GRASP_POSE_CHANNEL, 1); + + ros::spin(); +} diff --git a/src/rrrobot_ws/src/rrrobot/src/image_display.py b/src/rrrobot_ws/src/rrrobot/src/image_display.py new file mode 100644 index 0000000..e417400 --- /dev/null +++ b/src/rrrobot_ws/src/rrrobot/src/image_display.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python +# image_display.py + +import rospy +from std_msgs.msg import String +import matplotlib.pyplot as plt +import matplotlib.image as mpimg + +def callback(data): + print("IMAGE DISPLAY CALLBACK") + file = data.data + + img = mpimg.imread(file) + imgplot = plt.imshow(img) + plt.show() + +def listener(): + rospy.init_node('image_display', anonymous=False) + rospy.Subscriber("/current_image", String, callback) + rospy.spin() + +if __name__ == '__main__': + listener() diff --git a/src/rrrobot_ws/src/rrrobot/src/model_insertion_plugin.cpp b/src/rrrobot_ws/src/rrrobot/src/model_insertion_plugin.cpp new file mode 100644 index 0000000..2a695ba --- /dev/null +++ b/src/rrrobot_ws/src/rrrobot/src/model_insertion_plugin.cpp @@ -0,0 +1,76 @@ +// model_insertion_plugin.cpp + +#include +#include "gazebo/physics/physics.hh" +#include "gazebo/common/common.hh" +#include "gazebo/gazebo.hh" + +#include "ros/ros.h" +#include +#include "rrrobot/model_insertion.h" + +#include +#include +#include + +namespace gazebo +{ +class ModelInsertion : public WorldPlugin +{ +public: + void Load(physics::WorldPtr _parent, sdf::ElementPtr /*_sdf*/) + { + std::cout << "Loading model insertion plugin" << std::endl; + + parent = _parent; + + if (!ros::isInitialized()) + { + int argc = 0; + char **argv = NULL; + ros::init(argc, argv, "arm"); + } + + nh.reset(new ros::NodeHandle()); + subscriber = nh->subscribe("object_to_load", 1000, &ModelInsertion::insertModel, this); + } + + void insertModel(const rrrobot::model_insertion &msg) + { + std::cout << "Received message to load model: " << msg.model_name << std::endl; + + // Create a new transport node + transport::NodePtr node(new transport::Node()); + + // Initialize the node with the world name + node->Init(parent->Name()); + + // Create a publisher on the ~/factory topic + transport::PublisherPtr factoryPub = + node->Advertise("~/factory"); + + // Create the message + msgs::Factory to_pub; + + // Model file to load + to_pub.set_sdf_filename(std::string("model://") + msg.model_name); + + // Pose to initialize the model to + msgs::Set(to_pub.mutable_pose(), + ignition::math::Pose3d( + ignition::math::Vector3d(msg.pose.position.x, msg.pose.position.y, msg.pose.position.z), + ignition::math::Quaterniond(msg.pose.orientation.x, msg.pose.orientation.y, msg.pose.orientation.z, msg.pose.orientation.w))); + + // Send the message + factoryPub->Publish(to_pub); + } + +private: + physics::WorldPtr parent; + std::unique_ptr nh; + ros::Subscriber subscriber; +}; + +// Register this plugin with the simulator +GZ_REGISTER_WORLD_PLUGIN(ModelInsertion) +} // namespace gazebo diff --git a/src/rrrobot_ws/src/rrrobot/src/object_spawner_node.cpp b/src/rrrobot_ws/src/rrrobot/src/object_spawner_node.cpp new file mode 100644 index 0000000..88aac11 --- /dev/null +++ b/src/rrrobot_ws/src/rrrobot/src/object_spawner_node.cpp @@ -0,0 +1,127 @@ +// object_spawner_node.cpp + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include "rrrobot/model_insertion.h" +#include + +#include +using namespace std; + +class ObjectSpawner +{ +public: + ObjectSpawner(const std::string &model_file = "/app/rrrobot_ws/src/gazebo_models/model_mappings.txt") + : DEFAULT_SPAWN_POINT(1.21825, 4.0, 0.937978), + CONVEYOR_WIDTH(0.391404) + { + // DEFAULT_SPAWN_POINT.x = 0.2516105; + // DEFAULT_SPAWN_POINT.y = 5.474367; + // DEFAULT_SPAWN_POINT.z = 0.935669; + model_pub = nh.advertise("/object_to_load", 1000); + image_pub = nh.advertise("/current_image", 1000); + sub = nh.subscribe("/ariac/arm1/gripper/state", 1000, &ObjectSpawner::objectPlacedCallback, this); + srand(time(NULL)); + read_in_items(model_file); + } + + void objectPlacedCallback(const osrf_gear::VacuumGripperState &state) + { + static bool prev_state = false; + static bool placed = false; + + if (!placed) + { + spawn_item(); + placed = true; + } + + //cout << "State received: " << (state.enabled ? "true" : "false") << endl; + // gripper is released + if (!state.enabled && prev_state) + spawn_item(); + + prev_state = state.enabled; + } + +private: + struct ObjectMapping + { + std::string model_name; + std::string image_file; + std::string correct_classification; + }; + + const KDL::Vector DEFAULT_SPAWN_POINT; + const float CONVEYOR_WIDTH; + ros::NodeHandle nh; + ros::Publisher model_pub; + ros::Publisher image_pub; + ros::Subscriber sub; + std::vector models; // TODO: just string? or do we need + //to store the correct classification too? + + void read_in_items(const std::string &model_file) + { + std::ifstream file(model_file); + std::string cur; + while (std::getline(file, cur)) + { + // cout << "cur: " << cur << " cur.find(,): " << cur.find(",") << endl; + // line format: model_name, image_file, model_classification + ObjectMapping cur_model; + cur_model.model_name = cur.substr(0, cur.find(",")); + cur.erase(0, cur.find(",") + 1); + cur_model.image_file = cur.substr(0, cur.find(",")); + cur.erase(0, cur.find(",") + 1); + cur_model.correct_classification = cur; + models.push_back(cur_model); + } + } + + void spawn_item() + { + if (ros::ok()) + { + rrrobot::model_insertion msg; + std_msgs::String image_file_msg; + + int rand_idx = rand() % models.size(); + msg.model_name = models[rand_idx].model_name; + image_file_msg.data = models[rand_idx].image_file; + cout << "Spawning " << msg.model_name << endl; + + // Determine position to spawn items + // can place objects on conveyor belt just upstream from the arms + // at roughly (0.2516105, 5.474367, 0.935669) + // x range: 1.022548-1.413952 + // y range: anything (essentially) + // z + msg.pose.position.x = DEFAULT_SPAWN_POINT.x() /* + some random error */; + msg.pose.position.y = DEFAULT_SPAWN_POINT.y(); + msg.pose.position.z = DEFAULT_SPAWN_POINT.z() + 1.0; + + model_pub.publish(msg); + image_pub.publish(image_file_msg); + ros::spinOnce(); + } + } +}; + +int main(int argc, char **argv) +{ + ros::init(argc, argv, "object_spawner"); + + ObjectSpawner spawner; + + ros::spin(); +} diff --git a/src/rrrobot_ws/src/rrrobot/src/pytorch_pretrain_model.pt b/src/rrrobot_ws/src/rrrobot/src/pytorch_pretrain_model.pt new file mode 100644 index 0000000..1c45fe8 Binary files /dev/null and b/src/rrrobot_ws/src/rrrobot/src/pytorch_pretrain_model.pt differ diff --git a/src/rrrobot_ws/src/rrrobot/src/rrrobot_node.cpp b/src/rrrobot_ws/src/rrrobot/src/rrrobot_node.cpp new file mode 100644 index 0000000..39990e6 --- /dev/null +++ b/src/rrrobot_ws/src/rrrobot/src/rrrobot_node.cpp @@ -0,0 +1,227 @@ +// rrrobot_node.cpp + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "topic_names.h" +#include "rrrobot/arm_command.h" + +using namespace std; + +class Position +{ +public: + float x, y, z; + + Position(float x, float y, float z) : x(x), y(y), z(z){}; + Position() : x(0), y(0), z(0) {} +}; + +class RRRobot +{ +public: + RRRobot(ros::NodeHandle &node) + : current_robot_state(RobotState::WAITING_FOR_CLASSIFICATION | RobotState::WAITING_FOR_GRAB_LOCATION), + nh(node) + { + cv_classification_sub = nh.subscribe(CV_CLASSIFICATION_CHANNEL, 1000, &RRRobot::cv_classification_callback, this); + gripper_state_sub = nh.subscribe(GRIPPER_STATE_CHANNEL, 1000, &RRRobot::gripper_state_callback, this); + depth_camera_sub = nh.subscribe(DESIRED_GRASP_POSE_CHANNEL, 1000, &RRRobot::grasp_pose_callback, this); + + conveyor_pub = nh.serviceClient(CONVEYOR_POWER_CHANNEL); + arm_destination_pub = nh.advertise(ARM_DESTINATION_CHANNEL, 1000); + + // start competition + ros::ServiceClient comp_start = nh.serviceClient(START_COMPETITION_CHANNEL); + std_srvs::Trigger trg; + comp_start.call(trg); + } + + void cv_classification_callback(const std_msgs::String &classification) + { + std::string type = classification.data.substr(classification.data.find(":") + 1); + + Position drop_point = destination(type); + desired_drop_pose.position.x = drop_point.x; + desired_drop_pose.position.y = drop_point.y; + desired_drop_pose.position.z = drop_point.z; + + // update state + if (current_robot_state & RobotState::WAITING_FOR_GRAB_LOCATION) + { + current_robot_state &= ~RobotState::WAITING_FOR_CLASSIFICATION; + } + else if ((current_robot_state & RobotState::MOVING_ARM) == 0x0) + { + current_robot_state = RobotState::MOVING_ARM; + + // tell the arm to move to grab the object + publish_arm_command(); + } + + // print_state(); + } + + void gripper_state_callback(const osrf_gear::VacuumGripperState &state) + { + if (state.attached) + { + current_robot_state = RobotState::MOVING_ARM; + + if (!gripper_state.attached) + { + // start the conveyor belt again + set_conveyor(100); + } + } + // just dropped the object + else if (gripper_state.attached /* && !state.attached */) + { + current_robot_state = RobotState::WAITING_FOR_CLASSIFICATION | RobotState::WAITING_FOR_GRAB_LOCATION; + } + + // store current state + gripper_state = state; + + // print_state(); + } + + void grasp_pose_callback(const geometry_msgs::Pose &grasp_pose) + { + // stop conveyor belt + set_conveyor(0); + + desired_grasp_pose = grasp_pose; + // Add z offset so end effector doesn't hit object + desired_grasp_pose.position.z += 0.01; + + if (current_robot_state & RobotState::WAITING_FOR_CLASSIFICATION) + { + current_robot_state &= ~RobotState::WAITING_FOR_GRAB_LOCATION; + } + else if ((current_robot_state & RobotState::MOVING_ARM) == 0x0) + { + current_robot_state = RobotState::MOVING_ARM; + + publish_arm_command(); + } + + // print_state(); + } + +private: + enum RobotState + { + WAITING_FOR_CLASSIFICATION = 0x1, + WAITING_FOR_GRAB_LOCATION = 0x1 << 1, + MOVING_ARM = 0x1 << 2 + }; + + int current_robot_state; + osrf_gear::VacuumGripperState gripper_state; + geometry_msgs::Pose desired_grasp_pose; + geometry_msgs::Pose desired_drop_pose; + + ros::NodeHandle nh; + + ros::Subscriber cv_classification_sub; + ros::Subscriber gripper_state_sub; // know when item has been grabbed, so conveyor can be started + ros::Subscriber depth_camera_sub; // get desired grab location + + ros::ServiceClient conveyor_pub; + ros::Publisher arm_destination_pub; + + Position trash_bin = Position(-0.3, 0.383, 1); + Position recycle_bin = Position(-0.3, 1.15, 1); + + // Determine item destination bin based on classification + Position destination(const std::string &type) const + { + Position pos; + + if (type == "trash") + { + pos = trash_bin; + } + else + { + pos = recycle_bin; + } + + return pos; + } + + // Publish message including grab and drop off location for arm controller + void publish_arm_command() + { + rrrobot::arm_command cmd; + cmd.grab_location = desired_grasp_pose; + cmd.drop_location = desired_drop_pose; + + arm_destination_pub.publish(cmd); + ros::spinOnce(); + } + + // Set conveyor power (0 or 50-100) + void set_conveyor(int power) + { + if (power != 0 && (power < 50 || power > 100)) + { + return; + } + + osrf_gear::ConveyorBeltControl cmd; + cmd.request.power = power; + conveyor_pub.call(cmd); + } + + // Print current state for debugging + void print_state() + { + if (current_robot_state & RobotState::WAITING_FOR_CLASSIFICATION) + { + cout << "Waiting for classification\t"; + } + if (current_robot_state & RobotState::WAITING_FOR_GRAB_LOCATION) + { + cout << "Waiting for grab location\t"; + } + if (current_robot_state & RobotState::MOVING_ARM) + { + cout << "Moving Arm\t"; + } + cout << endl; + } +}; + +int main(int argc, char **argv) +{ + ros::init(argc, argv, "rrrobot"); + + ros::NodeHandle node; + + RRRobot robot(node); + ros::spin(); // This executes callbacks on new data until ctrl-c. + + return 0; +} diff --git a/src/rrrobot_ws/src/rrrobot/test/test_arm.cpp b/src/rrrobot_ws/src/rrrobot/test/test_arm.cpp new file mode 100644 index 0000000..02f0425 --- /dev/null +++ b/src/rrrobot_ws/src/rrrobot/test/test_arm.cpp @@ -0,0 +1,109 @@ +// test_arm.cpp + +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include +#include + +#include "topic_names.h" +#include "rrrobot/arm_command.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "arm_representation.h" + +using namespace std; + + +int main(int argc, char **argv) +{ + ArmRepresentation arm; + + KDL::JntArray pos(arm.getChain()->getNrOfJoints()); + KDL::SetToZero(pos); + + int joint; + + // std::cout << "Enter joint to exercise: "; + // std::cin >> joint; + + KDL::Frame end_effector_pose; + std::ofstream f("arm_test.debug"); + int error_code; + for (joint = 0; joint < arm.getChain()->getNrOfJoints(); ++joint) + { + for (double pos_val = 0.0; pos_val <= 2 * M_PI; pos_val += 0.1) + { + pos(joint) = pos_val; + error_code = arm.calculateForwardKinematics(pos, end_effector_pose); + + if (error_code != 0) + { + ROS_ERROR("Forward Kinematics Failure: %i", error_code); + } + + f << end_effector_pose.p.x() << "," << end_effector_pose.p.y() << "," << end_effector_pose.p.z() << '\n'; + + error_code = arm.calculateInverseKinematics(vector(arm.getChain()->getNrOfJoints(), 0.0), end_effector_pose, pos); + + if (error_code != 0) + { + ROS_ERROR("Inverse Kinematics Failure: %i", error_code); + } + } + } + + double linear_arm_actuator_joint, shoulder_pan_joint, shoulder_lift_joint, elbow_joint, wrist_1_joint, wrist_2_joint, wrist_3_joint; + + while (true) + { + cout << "linear_arm_actuator_joint: "; + cin >> pos(0); //linear_arm_actuator_joint; + cout << "shoulder_pan_joint: "; + cin >> pos(1); //shoulder_pan_joint; + cout << "shoulder_lift_joint: "; + cin >> pos(2); //shoulder_lift_joint; + cout << "elbow_joint: "; + cin >> pos(3); //elbow_joint; + cout << "wrist_1_joint: "; + cin >> pos(4); //wrist_1_joint; + cout << "wrist_2_joint: "; + cin >> pos(5); //wrist_2_joint; + cout << "wrist_3_joint: "; + cin >> pos(6); //wrist_3_joint; + + error_code = arm.calculateForwardKinematics(pos, end_effector_pose); + + if (error_code != 0) + { + ROS_ERROR("Forward kinematics failure: %i", error_code); + } + + cout << "x,y,z: " << end_effector_pose.p.x() << ", " << end_effector_pose.p.y() << ", " << end_effector_pose.p.z() << endl; + cout << end_effector_pose.M << endl; + } +} diff --git a/src/rrrobot_ws/src/rrrobot/test/test_insert_object.cpp b/src/rrrobot_ws/src/rrrobot/test/test_insert_object.cpp new file mode 100644 index 0000000..598d095 --- /dev/null +++ b/src/rrrobot_ws/src/rrrobot/test/test_insert_object.cpp @@ -0,0 +1,41 @@ +// test_insert_object.cpp + +#include "rrrobot/model_insertion.h" +#include "ros/ros.h" + +#include + +using std::cin; +using std::cout; +using std::endl; + +int main(int argc, char **argv) +{ + ros::init(argc, argv, "insert_models"); + + ros::NodeHandle nh; + + ros::Publisher pub = nh.advertise("/object_to_load", 1000); + + while (ros::ok()) + { + rrrobot::model_insertion msg; + cout << "Enter the model name (or 'q' to quit): "; + cin >> msg.model_name; + + if (msg.model_name == "q") { + return 0; + } + + cout << "Enter the pose: " << endl; + cout << "x: "; + cin >> msg.pose.position.x; + cout << "y: "; + cin >> msg.pose.position.y; + cout << "z: "; + cin >> msg.pose.position.z; + + pub.publish(msg); + ros::spinOnce(); + } +} diff --git a/src/rrrobot_ws/world/gear.py b/src/rrrobot_ws/world/gear.py new file mode 100644 index 0000000..29a73ce --- /dev/null +++ b/src/rrrobot_ws/world/gear.py @@ -0,0 +1,675 @@ +#!/usr/bin/env python + +# Software License Agreement (Apache License) +# +# Copyright 2016 Open Source Robotics Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import print_function + +import argparse +import math +import os +import random +import subprocess +import sys + +import em +import rospkg +import yaml + +rospack = rospkg.RosPack() +#world_dir = '/home/rrrobot/rrrobot_ws/world' +world_dir = os.path.join(rospack.get_path('osrf_gear'), 'worlds') +launch_dir = os.path.join(rospack.get_path('osrf_gear'), 'launch') +template_files = [ + #os.path.join(world_dir, 'gear.world.template'), + '/app/rrrobot_ws/world/gear.world.template', + os.path.join(launch_dir, 'gear.launch.template'), + os.path.join(launch_dir, 'gear.urdf.xacro.template'), +] +arm_template_file = os.path.join(launch_dir, 'arm.urdf.xacro.template') +arm_configs = { + 'arm1': { + 'arm_type': 'ur10', + 'pose': { + 'xyz': [0.3, 0.92, 0.9], + 'rpy': [0.0, 0.0, 0.0] + }, + 'default_initial_joint_states': { + 'elbow_joint': 2.14, + 'linear_arm_actuator_joint': 0, + 'shoulder_lift_joint': -2.0, + 'shoulder_pan_joint': 3.14, + 'wrist_1_joint': 3.27, + 'wrist_2_joint': -1.51, + 'wrist_3_joint': 0, + } + }, + # 'arm2': { + # 'arm_type': 'ur10', + # 'pose': { + # 'xyz': [0.3, -0.92, 0.9], + # 'rpy': [0.0, 0.0, 0.0] + # }, + # 'default_initial_joint_states': { + # 'elbow_joint': 2.14, + # 'linear_arm_actuator_joint': 0, + # 'shoulder_lift_joint': -2.0, + # 'shoulder_pan_joint': 3.14, + # 'wrist_1_joint': 3.27, + # 'wrist_2_joint': -1.51, + # 'wrist_3_joint': 0, + # } + # }, +} +possible_products = [ + 'disk_part', + 'gasket_part', + 'gear_part', + 'piston_rod_part', + 'pulley_part', +] +sensor_configs = { + 'break_beam': None, + 'camera': None, + 'proximity_sensor': None, + 'logical_camera': None, + 'laser_profiler': None, + 'depth_camera': None, + 'quality_control': None, +} +default_sensors = { + # 'quality_control_sensor_1': { + # 'type': 'quality_control', + # 'pose': { + # 'xyz': [0.3, 3.5, 1.5], + # 'rpy': [0, 1.574, -1.574] + # } + # }, + # 'quality_control_sensor_2': { + # 'type': 'quality_control', + # 'pose': { + # 'xyz': [0.3, -3.5, 1.5], + # 'rpy': [0, 1.574, 1.574] + # } + # }, +} +default_belt_models = { +} +bin_width = 0.6 +bin_depth = 0.6 +bin_height = 0.72 +bin_angle = 0.0 +default_bin_origins = { + # 'bin1': [-0.3, -1.916, 0], + # 'bin2': [-0.3, -1.15, 0], + # 'bin3': [-0.3, -0.383, 0], + 'bin4': [-0.3, 0.383, 0], + 'bin5': [-0.3, 1.15, 0], + # 'bin6': [-0.3, 1.916, 0], +} + +configurable_options = { + 'insert_models_over_bins': False, + 'disable_shadows': False, + 'belt_population_cycles': 5, + 'gazebo_state_logging': False, + 'spawn_extra_models': False, + 'unthrottled_physics_update': False, + 'model_type_aliases': { + 'belt_model_type1': 'part1', + 'belt_model_type2': 'part2', + }, + 'visualize_sensor_views': False, + 'visualize_drop_regions': False, +} +default_time_limit = 600 # seconds +max_count_per_model = 30 # limit on the number of instances of each model type + +def initialize_model_id_mappings(random_seed=None): + global global_model_count, model_id_mappings + global_model_count = {} # global count of how many times a model type has been created + + randomize = False + if random_seed is not None: + randomize = True + random.seed(random_seed) + + # Initialize the mapping between model index and ID that will exist for each model type + model_id_mappings = {} + + # Initialize the list of random IDs that will be used in the mappings + # The IDs will be unique across different model types + max_model_id = max_count_per_model * len(possible_products) # can be larger for more spread + random_ids = random.sample(range(0, max_model_id), max_model_id) + for model_type in possible_products: + if not randomize: + # Just use ordinary mapping + model_id_mappings[model_type] = list(range(1, max_count_per_model + 1)) + else: + # Use random IDs for the mapping + model_id_mappings[model_type] = random_ids[:max_count_per_model] + del random_ids[:max_count_per_model] + + + +# Helper for converting strings to booleans; copied from https://stackoverflow.com/a/43357954 +def str2bool(v): + if v.lower() in ('yes', 'true', 't', 'y', '1'): + return True + elif v.lower() in ('no', 'false', 'f', 'n', '0'): + return False + else: + raise argparse.ArgumentTypeError('Boolean value expected.') + + +def prepare_arguments(parser): + add = parser.add_argument + add('-n', '--dry-run', action='store_true', default=False, + help='print generated files to stdout, but do not write them to disk') + add('-v', '--verbose', action='store_true', default=False, + help='output additional logging to console') + add('-o', '--output', default='/tmp/ariac/', + help='directory in which to output the generated files') + add('--development-mode', '-d', action='store_true', default=False, + help='if true the competition mode environment variable will not be set (default false)') + add('--no-gui', action='store_true', default=False, + help="don't run the gazebo client gui") + add('-l', '--state-logging', action='store', type=str2bool, nargs='?', + help='generate gazebo state logs (will override config file option)') + add('--log-to-file', action='store_true', default=False, + help='direct the output of the gazebo ros node to log file instead of the console') + add('--visualize-sensor-views', action='store_true', default=False, + help='visualize the views of sensors in gazebo') + mex_group = parser.add_mutually_exclusive_group(required=False) + add = mex_group.add_argument + add('config', nargs='?', metavar='CONFIG', + help='yaml string that is the configuration') + add('-f', '--file', nargs='+', help='list of paths to yaml files that contain the ' + 'configuration (contents will be concatenated)') + + +eval_local_vars = {n: getattr(math, n) for n in dir(math) if not n.startswith('__')} + + +def expand_to_float(val): + if isinstance(val, str): + return float(eval(val, {}, eval_local_vars)) + return float(val) + + +def expand_yaml_substitutions(yaml_dict): + for k, v in yaml_dict.items(): + if isinstance(v, dict): + yaml_dict[k] = expand_yaml_substitutions(v) + if k in ['xyz', 'rpy']: + yaml_dict[k] = [expand_to_float(x) for x in v] + if k in ['initial_joint_states']: + yaml_dict[k] = {kp: expand_to_float(vp) for kp, vp in v.items()} + return yaml_dict + + +class ArmInfo: + def __init__(self, name, arm_type, initial_joint_states, pose): + self.name = name + self.type = arm_type + self.initial_joint_states = initial_joint_states + self.pose = pose + + +class ModelInfo: + def __init__(self, model_type, pose, reference_frame): + self.type = model_type + self.pose = pose + self.reference_frame = reference_frame + + +class SensorInfo: + def __init__(self, name, sensor_type, pose): + self.name = name + self.type = sensor_type + self.pose = pose + + +class PoseInfo: + def __init__(self, xyz, rpy): + self.xyz = [str(f) for f in xyz] + self.rpy = [str(f) for f in rpy] + + +class DropRegionInfo: + def __init__(self, name, drop_region_min, drop_region_max, destination, frame, model_type): + self.name = name + self.min = [str(f) for f in drop_region_min] + self.max = [str(f) for f in drop_region_max] + self.destination = destination + self.frame = frame + self.type = model_type + + +def get_field_with_default(data_dict, entry, default_value): + if entry in data_dict: + return data_dict[entry] + else: + return default_value + + +def get_required_field(entry_name, data_dict, required_entry): + if required_entry not in data_dict: + print("Error: '{0}' entry does not contain a required '{1}' entry" + .format(entry_name, required_entry), + file=sys.stderr) + sys.exit(1) + return data_dict[required_entry] + + +def replace_type_aliases(model_type): + if model_type in configurable_options['model_type_aliases']: + model_type = configurable_options['model_type_aliases'][model_type] + return model_type + + +def model_count_post_increment(model_type): + global global_model_count + try: + count = global_model_count[model_type] + except KeyError: + count = 0 + global_model_count[model_type] = count + 1 + return count + + +def get_next_model_id(model_type): + return model_id_mappings[model_type][model_count_post_increment(model_type)] + + +def create_pose_info(pose_dict, offset=None): + xyz = get_field_with_default(pose_dict, 'xyz', [0, 0, 0]) + rpy = get_field_with_default(pose_dict, 'rpy', [0, 0, 0]) + for key in pose_dict: + if key not in ['xyz', 'rpy']: + print("Warning: ignoring unknown entry in 'pose': " + key, file=sys.stderr) + if offset is not None: + xyz = [sum(i) for i in zip(xyz, offset)] + return PoseInfo(xyz, rpy) + + +def create_arm_info(name, arm_dict): + arm_type = arm_dict['arm_type'] + initial_joint_states = arm_dict['default_initial_joint_states'] + pose = create_pose_info(arm_dict['pose']) + return ArmInfo(name, arm_type, initial_joint_states, pose) + + +def create_sensor_info(name, sensor_data, allow_protected_sensors=False, offset=None): + sensor_type = get_required_field(name, sensor_data, 'type') + pose_dict = get_required_field(name, sensor_data, 'pose') + for key in sensor_data: + if key not in ['type', 'pose']: + print("Warning: ignoring unknown entry in '{0}': {1}" + .format(name, key), file=sys.stderr) + if sensor_type not in sensor_configs: + if not allow_protected_sensors: + print("Error: given sensor type '{0}' is not one of the known sensor types: {1}" + .format(sensor_type, sensor_configs.keys()), file=sys.stderr) + sys.exit(1) + pose_info = create_pose_info(pose_dict, offset=offset) + return SensorInfo(name, sensor_type, pose_info) + + +def create_sensor_infos(sensors_dict, allow_protected_sensors=False, offset=None): + sensor_infos = {} + for name, sensor_data in sensors_dict.items(): + sensor_infos[name] = create_sensor_info( + name, sensor_data, + allow_protected_sensors=allow_protected_sensors, offset=offset) + return sensor_infos + + +def create_model_info(model_name, model_data): + model_type = get_required_field(model_name, model_data, 'type') + model_type = replace_type_aliases(model_type) + pose_dict = get_required_field(model_name, model_data, 'pose') + reference_frame = get_field_with_default(model_data, 'reference_frame', '') + for key in model_data: + if key not in ['type', 'pose', 'reference_frame']: + print("Warning: ignoring unknown entry in '{0}': {1}" + .format(model_name, key), file=sys.stderr) + pose_info = create_pose_info(pose_dict) + return ModelInfo(model_type, pose_info, reference_frame) + + +def create_models_to_spawn_infos(models_to_spawn_dict): + models_to_spawn_infos = {} + for reference_frame, reference_frame_data in models_to_spawn_dict.items(): + models = get_required_field(reference_frame, reference_frame_data, 'models') + for model_name, model_to_spawn_data in models.items(): + model_to_spawn_data['reference_frame'] = reference_frame + model_info = create_model_info(model_name, model_to_spawn_data) + # assign each model a unique name because gazebo can't do this + # if the models all spawn at the same time + scoped_model_name = reference_frame.replace('::', '|') + '|' + \ + model_info.type + '_' + str(get_next_model_id(model_info.type)) + models_to_spawn_infos[scoped_model_name] = model_info + return models_to_spawn_infos + + +def create_models_over_bins_infos(models_over_bins_dict): + models_to_spawn_infos = {} + for bin_name, bin_dict in models_over_bins_dict.items(): + if bin_name in default_bin_origins: + offset_xyz = [ + default_bin_origins[bin_name][0] - bin_depth / 2, + default_bin_origins[bin_name][1] - bin_width / 2, + bin_height + 0.08] + # Allow the origin of the bin to be over-written + if 'xyz' in bin_dict: + offset_xyz = bin_dict['xyz'] + else: + offset_xyz = get_required_field(bin_name, bin_dict, 'xyz') + + models = get_required_field(bin_name, bin_dict, 'models') or {} + for model_type, model_to_spawn_dict in models.items(): + model_to_spawn_data = {} + model_to_spawn_data['type'] = model_type + model_to_spawn_data['reference_frame'] = 'world' + xyz_start = get_required_field( + model_type, model_to_spawn_dict, 'xyz_start') + xyz_end = get_required_field( + model_type, model_to_spawn_dict, 'xyz_end') + rpy = get_required_field(model_type, model_to_spawn_dict, 'rpy') + rpy[1] = -bin_angle + num_models_x = get_required_field( + model_type, model_to_spawn_dict, 'num_models_x') + num_models_y = get_required_field( + model_type, model_to_spawn_dict, 'num_models_y') + step_size = [ + (xyz_end[0] - xyz_start[0]) / max(1, num_models_x - 1), + (xyz_end[1] - xyz_start[1]) / max(1, num_models_y - 1)] + + # Create a grid of models + for idx_x in range(num_models_x): + for idx_y in range(num_models_y): + model_x_offset = xyz_start[0] + idx_x * step_size[0] + xyz = [ + offset_xyz[0] + model_x_offset, + offset_xyz[1] + xyz_start[1] + idx_y * step_size[1], + offset_xyz[2] + xyz_start[2] + model_x_offset * math.tan(bin_angle)] + model_to_spawn_data['pose'] = {'xyz': xyz, 'rpy': rpy} + model_info = create_model_info(model_type, model_to_spawn_data) + # assign each model a unique name because gazebo can't do this + # if the models all spawn at the same time + scoped_model_name = bin_name + '|' + \ + model_info.type + '_' + str(get_next_model_id(model_type)) + model_info.bin = bin_name + models_to_spawn_infos[scoped_model_name] = model_info + return models_to_spawn_infos + + +def create_belt_model_infos(belt_models_dict): + belt_model_infos = {} + for obj_type, spawn_times in belt_models_dict.items(): + for spawn_time, belt_model_dict in spawn_times.items(): + obj_type = replace_type_aliases(obj_type) + if obj_type not in belt_model_infos: + belt_model_infos[obj_type] = {} + belt_model_dict['type'] = obj_type + belt_model_infos[obj_type][spawn_time] = create_model_info('belt_model', belt_model_dict) + return belt_model_infos + + +def create_drops_info(drops_dict): + drops_info = {} + drop_region_infos = [] + drop_regions_dict = get_required_field('drops', drops_dict, 'drop_regions') + for drop_name, drop_region_dict in drop_regions_dict.items(): + frame = get_field_with_default(drop_region_dict, 'frame', 'world') + drop_region_min = get_required_field('drop_region', drop_region_dict, 'min') + drop_region_min_xyz = get_required_field('min', drop_region_min, 'xyz') + drop_region_max = get_required_field('drop_region', drop_region_dict, 'max') + drop_region_max_xyz = get_required_field('max', drop_region_max, 'xyz') + destination_info = get_required_field('drop_region', drop_region_dict, 'destination') + destination = create_pose_info(destination_info) + product_type = get_required_field('drop_region', drop_region_dict, 'product_type_to_drop') + product_type = replace_type_aliases(product_type) + drop_region_infos.append( + DropRegionInfo( + drop_name, drop_region_min_xyz, drop_region_max_xyz, + destination, frame, product_type)) + drops_info['drop_regions'] = drop_region_infos + return drops_info + + +def create_order_info(name, order_dict): + shipment_count = get_field_with_default(order_dict, 'shipment_count', 1) + destinations = get_field_with_default(order_dict, 'destinations', ["any"] * shipment_count) + announcement_condition = get_required_field(name, order_dict, 'announcement_condition') + announcement_condition_value = get_required_field( + name, order_dict, 'announcement_condition_value') + products_dict = get_required_field(name, order_dict, 'products') + products = [] + for product_name, product_dict in products_dict.items(): + products.append(create_model_info(product_name, product_dict)) + return { + 'announcement_condition': announcement_condition, + 'announcement_condition_value': announcement_condition_value, + 'products': products, + 'shipment_count': shipment_count, + 'destinations': destinations + } + + +def create_order_infos(orders_dict): + order_infos = {} + for order_name, order_dict in orders_dict.items(): + order_infos[order_name] = create_order_info(order_name, order_dict) + return order_infos + + +def create_faulty_products_info(faulty_products_dict): + faulty_product_infos = {} + for product_name in faulty_products_dict: + faulty_product_infos[product_name] = product_name # no other info for now + return faulty_product_infos + + +def create_bin_infos(): + bin_infos = {} + for bin_name, xyz in default_bin_origins.items(): + bin_infos[bin_name] = PoseInfo(xyz, [0, bin_angle, 3.14159]) + return bin_infos + + +def create_material_location_info(belt_models, models_over_bins): + material_locations = {} + + # Specify that belt products can be found on the conveyor belt + for _, spawn_times in belt_models.items(): + for spawn_time, product in spawn_times.items(): + if product.type in material_locations: + material_locations[product.type].update(['belt']) + else: + material_locations[product.type] = {'belt'} + + # Specify in which bin the different bin products can be found + for product_name, product in models_over_bins.items(): + if product.type in material_locations: + material_locations[product.type].update([product.bin]) + else: + material_locations[product.type] = {product.bin} + + return material_locations + + +def create_options_info(options_dict): + options = configurable_options + for option, val in options_dict.items(): + options[option] = val + return options + + +def prepare_template_data(config_dict, args): + template_data = { + 'arms': [create_arm_info(name, conf) for name, conf in arm_configs.items()], + 'sensors': create_sensor_infos(default_sensors, allow_protected_sensors=True), + 'models_to_insert': {}, + 'models_to_spawn': {}, + 'belt_models': create_belt_model_infos(default_belt_models), + 'faulty_products': {}, + 'drops': {}, + 'orders': {}, + # 'options': {'insert_agvs': True}, + 'options': {'insert_agvs': False}, + 'time_limit': default_time_limit, + 'bin_height': bin_height, + 'world_dir': world_dir, + 'joint_limited_ur10': config_dict.pop('joint_limited_ur10', False), + 'sensor_blackout': {}, + } + # Process the options first as they may affect the processing of the rest + options_dict = get_field_with_default(config_dict, 'options', {}) + template_data['options'].update(create_options_info(options_dict)) + if args.state_logging is not None: + template_data['options']['gazebo_state_logging'] = args.state_logging + if args.visualize_sensor_views: + template_data['options']['visualize_sensor_views'] = True + + models_over_bins = {} + for key, value in config_dict.items(): + if key == 'sensors': + template_data['sensors'].update( + create_sensor_infos(value)) + elif key == 'models_over_bins': + models_over_bins = create_models_over_bins_infos(value) + template_data['models_to_insert'].update(models_over_bins) + elif key == 'belt_models': + template_data['belt_models'].update(create_belt_model_infos(value)) + elif key == 'drops': + template_data['drops'].update(create_drops_info(value)) + elif key == 'faulty_products': + template_data['faulty_products'].update(create_faulty_products_info(value)) + elif key == 'orders': + template_data['orders'].update(create_order_infos(value)) + elif key == 'sensor_blackout': + template_data['sensor_blackout'].update(value) + elif key == 'options': + pass + elif key == 'models_to_spawn': + template_data['models_to_spawn'].update( + create_models_to_spawn_infos(value)) + elif key == 'time_limit': + template_data['time_limit'] = value + else: + print("Error: unknown top level entry '{0}'".format(key), file=sys.stderr) + sys.exit(1) + template_data['bins'] = create_bin_infos() + template_data['material_locations'] = create_material_location_info( + template_data['belt_models'] or {}, + models_over_bins, + ) + template_data['possible_products'] = possible_products + return template_data + + +def generate_files(template_data): + files = {} + for template_file in template_files: + with open(template_file, 'r') as f: + data = f.read() + files[template_file] = em.expand(data, template_data) + # Generate files for each arm + for arm_info in template_data['arms']: + template_data['arm'] = arm_info + with open(arm_template_file, 'r') as f: + data = f.read() + files[arm_info.name + '.urdf.xacro'] = em.expand(data, template_data) + return files + + +def main(sysargv=None): + parser = argparse.ArgumentParser( + description='Prepares and then executes a gazebo simulation based on configurations.') + prepare_arguments(parser) + args = parser.parse_args(sysargv) + config_data = args.config or '' + if args.file is not None: + for file in args.file: + with open(file, 'r') as f: + comp_config_data = f.read() + config_data += comp_config_data + dict_config = yaml.load(config_data) or {} + expanded_dict_config = expand_yaml_substitutions(dict_config) + if args.verbose: + print(yaml.dump({'Using configuration': expanded_dict_config})) + + random_seed = expanded_dict_config.pop('random_seed', None) + initialize_model_id_mappings(random_seed) + + template_data = prepare_template_data(expanded_dict_config, args) + files = generate_files(template_data) + if not args.dry_run and not os.path.isdir(args.output): + if os.path.exists(args.output) and not os.path.isdir(args.output): + print('Error, given output directory exists but is not a directory.', file=sys.stderr) + sys.exit(1) + print('creating directory: ' + args.output) + os.makedirs(args.output) + for name, content in files.items(): + if name.endswith('.template'): + name = name[:-len('.template')] + name = os.path.basename(name) + if args.dry_run: + print('# file: ' + name) + print(content) + else: + file_path = os.path.join(args.output, name) + print('writing file ' + file_path) + with open(file_path, 'w+') as f: + f.write(content) + cmd = [ + 'roslaunch', + os.path.join(args.output, 'gear.launch'), + 'world_path:=' + os.path.join(args.output, 'gear.world'), + 'gear_urdf_xacro:=' + os.path.join(args.output, 'gear.urdf.xacro'), + 'arm_urdf_dir:=' + args.output, + ] + if args.log_to_file: + cmd.append('gazebo_ros_output:=log') + if args.verbose: + cmd += ['verbose:=true'] + if args.no_gui: + cmd += ['gui:=false'] + + if not args.development_mode: + os.environ['ARIAC_COMPETITION'] = '1' + + print('Running command: ' + ' '.join(cmd)) + if not args.dry_run: + try: + p = subprocess.Popen(cmd) + p.wait() + except KeyboardInterrupt: + pass + finally: + p.wait() + return p.returncode + + +if __name__ == '__main__': + # Filter out any special ROS remapping arguments. + # This is necessary if the script is being run from a ROS launch file. + import rospy + filtered_argv = rospy.myargv(sys.argv) + + sys.exit(main(filtered_argv[1:])) diff --git a/src/rrrobot_ws/world/gear.world.template b/src/rrrobot_ws/world/gear.world.template new file mode 100644 index 0000000..c7bef21 --- /dev/null +++ b/src/rrrobot_ws/world/gear.world.template @@ -0,0 +1,490 @@ +@{ +import em, StringIO, os +def expand_snippet(filename, data=locals()): + output = StringIO.StringIO() + interpreter = em.Interpreter(output=output) + interpreter.include(os.path.join(world_dir, 'snippet', filename), data) + print output.getvalue() +}@ + + + + + + + + -7.56272 4.06148 6.60308 0 0.636 -0.467992 + + + + + + + + orbit + perspective + + + +@[if options['unthrottled_physics_update']]@ + + 0 + +@[end if]@ + +@[if not options['disable_shadows']]@ + + + false + +@[end if]@ + +@[if drops and options['visualize_drop_regions']]@ +@[ for drop_region in drops['drop_regions']]@ +@[ if drop_region.frame == "world"]@ + + @(' '.join([str((float(drop_region.min[i]) + float(drop_region.max[i])) * 0.5) for i in range(3)])) 0 0 0 + true + + + + + @(' '.join([str(float(drop_region.max[i]) - float(drop_region.min[i])) for i in range(3)])) + + + + + +@[ end if]@ +@[ end for]@ +@[end if]@ + + + + + true + 0 0 10 0 0 0 + 0.8 0.8 0.8 1 + 0.2 0.2 0.2 1 + + 1000 + 0.9 + 0.01 + 0.001 + + -0.5 0.1 -0.9 + + + + + 14 -3.0 3.0 -1.55 0.0 -1.62 + 0.5 0.5 0.5 1 + 0.1 0.1 0.1 1 + 0 0 -1 + + 50 + 0.5 + 0.01 + 0.001 + + 0 + + 0.6 + 1 + 1 + + + + + + model://workcell + 0 0 0 0 0 1.57 + + +@[for bin_name, bin_pose in bins.items()]@ + + @(bin_name) + model://workcell_bin + @(' '.join(bin_pose.xyz)) @(' '.join(bin_pose.rpy)) + +@[end for]@ + +@[for name, sensor in sensors.items()]@ +@[if sensor.type == "quality_control"]@ + +@{ +expand_snippet('quality_control_sensor.sdf.template') +}@ +@[end if]@ + +@[if sensor.type == "break_beam"]@ + +@{ +expand_snippet('break_beam.sdf.template') +}@ +@[end if]@ + +@[if sensor.type == "proximity_sensor"]@ + +@{ +expand_snippet('proximity_sensor.sdf.template') +}@ + +@[end if]@ +@[if sensor.type == "logical_camera"]@ + +@{ +expand_snippet('logical_camera.sdf.template') +}@ + +@[end if]@ +@[if sensor.type == "depth_camera"]@ + +@{ +expand_snippet('depth_camera.sdf.template') +}@ +@[end if]@ +@[if sensor.type == "laser_profiler"]@ + +@{ +expand_snippet('laser_profiler.sdf.template') +}@ +@[end if]@ +@[end for]@ + + + + model://deletion_wall + 1.2 -4.1 1.41 0 0 1.5708 + + +@{belt_models_loop = True}@ +@{belt_population_cycles = options['belt_population_cycles'] if belt_models_loop else 1} + +@{obj_type_index = 0}@ +@[for obj_type, spawn_times in belt_models.items()]@ + +@[ for index in range(belt_population_cycles * len(spawn_times))]@ + + model://@(obj_type)_ariac + @(obj_type)_@(index) + @(7.5 + 0.25 * obj_type_index) @(-9.8 + 0.25 * index) -5.0 0 0 0 + +@[ end for]@ +@{obj_type_index += 1}@ +@[end for]@ + + + + conveyor_belt + 0.07 0.8 0.464 0 0 0 + model://conveyor_belt_tall_ariac + + +@[if options['insert_models_over_bins']]@ + +@[for model_name, model in models_to_insert.items()]@ + + @(model_name) + model://@(model.type)_ariac + @(' '.join(model.pose.xyz)) @(' '.join(model.pose.rpy)) + +@[end for]@ +@[end if]@ +@[if belt_models]@ + + + + /ariac/populate_belt + /ariac/population/rate_modifier + /ariac/population/control + /ariac/population/state + 0 + false + @("true" if belt_models_loop else "false") + conveyor_belt::conveyor_belt_fixed + +@[for product_name, spawn_times in belt_models.items()]@ + @[for spawn_time, product in spawn_times.items()]@ + + + @(product.type) + @(' '.join(product.pose.xyz)) @(' '.join(product.pose.rpy)) + + @[end for]@ +@[end for]@ + + 10 + +@[end if]@ + +@[if options['insert_agvs']]@ +@[for agv_id in [1,2]]@ + + + 0.3 @(3.3 if agv_id == 1 else -3.3) 0 0 0 @(3.14159 if agv_id == 1 else 0) + + agv@(str(agv_id)) + model://warehouse_robot_ariac + + + /ariac/agv@(str(agv_id))/animate + /ariac/kit_tray_@(str(agv_id))/clear_tray + /ariac/kit_tray_@(str(agv_id))/lock_models + @(str(agv_id)) + + + + + + 0.0 0.15 0.75 0 0 0 + + kit_tray_@(str(agv_id)) + model://kit_tray_ariac + + + kit_tray_contact + kit_tray_@(str(agv_id)) + /ariac/kit_tray_@(str(agv_id))/clear_tray + /ariac/kit_tray_@(str(agv_id))/lock_models + /ariac/kit_tray_@(str(agv_id))/get_content + 20 + +@[for part_name, part_info in faulty_products.items()]@ + @(part_name) +@[end for]@ + + + + + + + agv@(str(agv_id))::link + kit_tray_@(str(agv_id))::kit_tray_@(str(agv_id))::tray + + + + + 0.3 @(3.5 if agv_id == 1 else -3.5) 1.5 0 1.574 @(-1.574 if agv_id == 1 else 1.574) + + ariac + + + gaussian + 0.0 + 0.001 + + + + + gaussian + 0.0 + 0.01 + + + +@[for part_name, part_info in faulty_products.items()]@ + @(part_name) +@[end for]@ + + + + false + + 0.1 + + 0.000166667 + 0.000166667 + 0.000166667 + + + + + 0 0.02 0 0 0 -1.5708 + + + model://logical_camera/meshes/camera.dae + + + + + + 0 0.02 0 0 0 -1.5708 + + + model://logical_camera/meshes/camera.dae + + + + + + + 0.73 + 0.78 + 0.7 + 0.35 + + + false + true + 10 + + + + +@[end for]@ +@[end if]@ + + + + + ariac + @(time_limit) + /ariac/start_competition + /ariac/end_competition + /ariac/populate_belt + /ariac/conveyor/control + /ariac/submit_shipment + /ariac/material_locations + /ariac/trays + /ariac/orders +@[for agv_id in [1,2]]@ + + /ariac/agv@(agv_id) + /ariac/agv@(agv_id)/animate + /ariac/kit_tray_@(agv_id)/get_content + +@[end for]@ +@[for order_name, order in orders.items()]@ + + @(order_name) +@[if order['announcement_condition'] == 'time']@ + @(order['announcement_condition_value']) +@[end if]@ +@[if order['announcement_condition'] == 'wanted_products']@ + @(order['announcement_condition_value']) +@[end if]@ +@[if order['announcement_condition'] == 'unwanted_products']@ + @(order['announcement_condition_value']) +@[end if]@ +@[for shipment_index in range(order['shipment_count'])] +@{ +if '_update' in order_name: + order_name = order_name.split('_update')[0] +destination = order['destinations'][shipment_index] +}@ + + @(order_name)_shipment_@(shipment_index) + @(destination) +@[for product in order['products']]@ + + @(product.type) + @(' '.join(product.pose.xyz)) @(' '.join(product.pose.rpy)) + +@[end for]@ + +@[end for]@ + +@[end for]@ + +@[for material_name, locations in material_locations.items()]@ + + @(material_name) +@[for location in locations]@ + + @(location) + +@[end for]@ + +@[end for]@ + +@[if sensor_blackout]@ + + @(sensor_blackout['duration']) + @(sensor_blackout['product_count']) + /ariac/sensor_enable + +@[end if]@ + 10 + + + + + + 0 0 -5.1 0 0 0 + true + + + + + 0 0 1 + 25 25 + + + + + + 100 + 50 + + + + + + + + + + true + -50 50 -0.01 0 0 0 + + + false + + + 0 0 1 + 150 150 + + + + + + + + + + + + 0.3 0 0.9 0 0 0 + true + + + + + 0.2 4.6 0.1 + + + + + + + + + + + 0.2 4.6 0.1 + + + + + + + + + diff --git a/src/rrrobot_ws/world/rrrobot_setpoint.world b/src/rrrobot_ws/world/rrrobot_setpoint.world new file mode 100644 index 0000000..feacd48 --- /dev/null +++ b/src/rrrobot_ws/world/rrrobot_setpoint.world @@ -0,0 +1,68 @@ + + + + 1 + + + + + 0 0 1 + 100 100 + + + + + 65535 + + + + + 100 + 50 + + + + + + + + 10 + + + 0 + + + 0 0 1 + 100 100 + + + + + + + 0 + 0 + 0 + + + + 1 + 0 0 10 0 -0 0 + 0.8 0.8 0.8 1 + 0.2 0.2 0.2 1 + + 1000 + 0.9 + 0.01 + 0.001 + + -0.5 0.1 -0.9 + + + model://fanuc_robotic_arm_with_gripper + + +