diff --git a/Flight_control/src/.vscode/c_cpp_properties.json b/Flight_control/src/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..f8920a0 --- /dev/null +++ b/Flight_control/src/.vscode/c_cpp_properties.json @@ -0,0 +1,31 @@ +{ + "configurations": [ + { + "browse": { + "databaseFilename": "", + "limitSymbolsToIncludedHeaders": true + }, + "includePath": [ + "/home/zhangshuai/Flight_control/devel/include", + "/opt/ros/kinetic/include", + "/home/zhangshuai/Flight_control/src/hector_quadrotor/hector_quadrotor_controller/include", + "/home/zhangshuai/Flight_control/src/hector_quadrotor/hector_quadrotor_controller_gazebo/include", + "/home/zhangshuai/Flight_control/src/hector_quadrotor/hector_quadrotor_gazebo_plugins/include", + "/home/zhangshuai/Flight_control/src/hector_quadrotor/hector_quadrotor_model/include", + "/home/zhangshuai/Flight_control/src/hector_quadrotor/hector_quadrotor_pose_estimation/include", + "/home/zhangshuai/Flight_control/src/hector_quadrotor/hector_uav_msgs/include", + "/home/zhangshuai/Flight_control/src/rosflight_ws/rosflight/rosflight/include", + "/home/zhangshuai/Flight_control/src/rosflight_ws/rosflight/rosflight_firmware/include", + "/home/zhangshuai/Flight_control/src/rosflight_ws/rosflight_plugins/include", + "/home/zhangshuai/Flight_control/src/rosflight_ws/rosflight/rosflight_sim/include", + "/home/zhangshuai/Flight_control/src/rosflight_ws/rosflight/rosflight_utils/include", + "/home/zhangshuai/Flight_control/src/rosflight_ws/rosplane/rosplane/include", + "/home/zhangshuai/Flight_control/src/rosflight_ws/rosplane/rosplane_sim/include", + "/usr/include" + ], + "name": "Linux", + "intelliSenseMode": "gcc-x64" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/Flight_control/src/.vscode/settings.json b/Flight_control/src/.vscode/settings.json new file mode 100644 index 0000000..6f26cb4 --- /dev/null +++ b/Flight_control/src/.vscode/settings.json @@ -0,0 +1,31 @@ +{ + "python.autoComplete.extraPaths": [ + "/home/zhangshuai/Flight_control/devel/lib/python2.7/dist-packages", + "/opt/ros/kinetic/lib/python2.7/dist-packages" + ], + "files.associations": { + "cctype": "cpp", + "cmath": "cpp", + "csignal": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "atomic": "cpp", + "strstream": "cpp", + "chrono": "cpp", + "cstdint": "cpp", + "initializer_list": "cpp", + "iosfwd": "cpp", + "mutex": "cpp", + "ratio": "cpp", + "system_error": "cpp", + "thread": "cpp", + "cinttypes": "cpp", + "typeindex": "cpp" + } +} \ No newline at end of file diff --git a/Flight_control/src/CMakeLists.txt b/Flight_control/src/CMakeLists.txt new file mode 120000 index 0000000..581e61d --- /dev/null +++ b/Flight_control/src/CMakeLists.txt @@ -0,0 +1 @@ +/opt/ros/kinetic/share/catkin/cmake/toplevel.cmake \ No newline at end of file diff --git a/Flight_control/src/enemy_suv/enemy_suv_description/CMakeLists.txt b/Flight_control/src/enemy_suv/enemy_suv_description/CMakeLists.txt new file mode 100644 index 0000000..da6521f --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_description/CMakeLists.txt @@ -0,0 +1,47 @@ +################################################################################ +# CMake +################################################################################ +cmake_minimum_required(VERSION 2.8.3) +project(enemy_suv_description) + +################################################################################ +# Packages +################################################################################ +find_package(catkin REQUIRED COMPONENTS + urdf + xacro +) + +################################################################################ +# Declare ROS messages, services and actions +################################################################################ + +################################################################################ +# Declare ROS dynamic reconfigure parameters +################################################################################ + +################################################################################ +# Catkin specific configuration +################################################################################ +catkin_package( + CATKIN_DEPENDS urdf xacro +) + +################################################################################ +# Build +################################################################################ +include_directories( + ${catkin_INCLUDE_DIRS} +) + +################################################################################ +# Install +################################################################################ +install(DIRECTORY meshes materials urdf launch + DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} +) + +################################################################################ +# Test +################################################################################ + diff --git a/Flight_control/src/enemy_suv/enemy_suv_description/launch/spawn_enemy_suv.launch b/Flight_control/src/enemy_suv/enemy_suv_description/launch/spawn_enemy_suv.launch new file mode 100644 index 0000000..e8cb626 --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_description/launch/spawn_enemy_suv.launch @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Flight_control/src/enemy_suv/enemy_suv_description/launch/xacro_gazebo_display_enemy_suv.launch b/Flight_control/src/enemy_suv/enemy_suv_description/launch/xacro_gazebo_display_enemy_suv.launch new file mode 100644 index 0000000..0a2e8d8 --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_description/launch/xacro_gazebo_display_enemy_suv.launch @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Flight_control/src/enemy_suv/enemy_suv_description/materials/textures/suv.png b/Flight_control/src/enemy_suv/enemy_suv_description/materials/textures/suv.png new file mode 100644 index 0000000..c5bb1cb Binary files /dev/null and b/Flight_control/src/enemy_suv/enemy_suv_description/materials/textures/suv.png differ diff --git a/Flight_control/src/enemy_suv/enemy_suv_description/materials/textures/wheels_01.png b/Flight_control/src/enemy_suv/enemy_suv_description/materials/textures/wheels_01.png new file mode 100644 index 0000000..278b4c8 Binary files /dev/null and b/Flight_control/src/enemy_suv/enemy_suv_description/materials/textures/wheels_01.png differ diff --git a/Flight_control/src/enemy_suv/enemy_suv_description/meshes/suv.mtl b/Flight_control/src/enemy_suv/enemy_suv_description/meshes/suv.mtl new file mode 100644 index 0000000..4f57f8e --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_description/meshes/suv.mtl @@ -0,0 +1,30 @@ +# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware +# File Created: 02.10.2016 09:23:07 + +newmtl SUV_Body + Ns 10.0000 + Ni 1.5000 + d 1.0000 + Tr 0.0000 + Tf 1.0000 1.0000 1.0000 + illum 2 + Ka 0.5882 0.5882 0.5882 + Kd 0.5882 0.5882 0.5882 + Ks 0.0000 0.0000 0.0000 + Ke 0.0000 0.0000 0.0000 + map_Ka suv.png + map_Kd suv.png + +newmtl SUV_Wheels + Ns 10.0000 + Ni 1.5000 + d 1.0000 + Tr 0.0000 + Tf 1.0000 1.0000 1.0000 + illum 2 + Ka 0.5882 0.5882 0.5882 + Kd 0.5882 0.5882 0.5882 + Ks 0.0000 0.0000 0.0000 + Ke 0.0000 0.0000 0.0000 + map_Ka wheels_01.png + map_Kd wheels_01.png diff --git a/Flight_control/src/enemy_suv/enemy_suv_description/meshes/suv.obj b/Flight_control/src/enemy_suv/enemy_suv_description/meshes/suv.obj new file mode 100644 index 0000000..0d6a765 --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_description/meshes/suv.obj @@ -0,0 +1,4971 @@ +# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware +# File Created: 02.10.2016 09:23:07 + +mtllib suv.mtl + +# +# object SUV +# + +v -0.5647 -38.4480 26.0847 +v -0.5647 -38.8466 16.4593 +v 16.4686 -37.8340 16.4593 +v 16.4686 -37.4353 26.0847 +v 15.5807 -35.1803 35.4801 +v 16.4051 -34.2848 35.4639 +v 16.4049 -20.1960 35.4661 +v -0.5647 -20.1960 35.8027 +v -0.5647 -36.1929 35.8003 +v -0.5647 41.1921 21.9091 +v 8.7877 41.1921 21.9091 +v 8.7877 41.8707 17.5788 +v 9.1861 41.8707 17.5788 +v -0.5647 41.8707 17.5788 +v 17.2932 -10.4931 11.1012 +v 17.2932 0.3206 10.6839 +v 17.2932 0.3206 25.3594 +v 17.2932 -11.1915 25.3594 +v -0.5647 -10.4209 9.6278 +v -0.5647 0.3206 9.2104 +v 17.9687 0.3206 9.2104 +v 17.9687 -10.4209 9.6278 +v -0.5647 15.2933 34.8173 +v -0.5647 0.3206 35.3769 +v 16.4388 0.3206 35.0424 +v 16.4833 15.0422 34.3221 +v 17.2932 10.5789 10.5579 +v 17.2932 19.8798 10.4530 +v 17.2932 20.8372 21.7844 +v 17.2932 10.5789 23.5719 +v -0.5647 20.3039 9.0495 +v 12.1393 20.3039 9.0495 +v -0.5647 10.5789 9.1299 +v -0.5647 -9.9377 35.5927 +v 16.4216 -9.9377 35.2572 +v -0.5647 -37.3140 34.8140 +v 15.6590 -36.3014 34.4984 +v -0.5647 37.6108 14.3277 +v -0.5647 41.2559 14.1869 +v 9.1861 41.2397 14.1638 +v 9.1861 37.6108 14.3277 +v 16.7309 16.7956 25.3144 +v 16.1399 14.0974 32.0044 +v 16.1128 1.9413 32.3968 +v 16.1372 1.5951 32.0519 +v 16.7563 1.5470 26.2168 +v 16.7348 1.7983 25.8051 +v 17.2932 -22.4998 26.0216 +v 17.2932 -36.5398 26.0809 +v 16.5259 -35.4555 34.0358 +v 17.2932 -15.8137 12.5315 +v 17.2932 -18.8789 18.7039 +v 12.1393 -16.5591 11.9019 +v -0.5647 -16.5591 11.9019 +v 16.5328 16.0953 33.7466 +v 13.0763 20.5691 26.4538 +v 12.1320 20.5691 26.4538 +v -0.5647 20.5691 26.4538 +v -0.5647 16.3039 34.1945 +v 17.9687 10.5789 9.1299 +v 16.1596 14.8136 31.6472 +v 16.7466 17.1433 25.6940 +v 17.2932 -21.9353 20.1206 +v 17.2932 -20.3856 19.7212 +v 17.2932 -26.0592 20.3415 +v 17.2932 -36.9385 16.4548 +v 17.2932 -33.9862 16.4403 +v 17.2932 -31.8333 19.3933 +v 12.1393 -32.7896 16.4517 +v 17.9687 -16.5591 11.9019 +v 17.9687 -19.6528 17.9391 +v 12.1393 -19.6529 17.9391 +v 17.9687 -21.8036 19.2226 +v 12.1394 -21.8036 19.2226 +v 17.9687 -20.8721 18.6667 +v 17.9687 -30.1719 19.2824 +v 12.1394 -30.1719 19.2824 +v 17.9687 -26.0256 19.2528 +v 17.9687 -31.1855 18.7133 +v 12.1393 -31.1855 18.7133 +v 17.9687 -32.7896 16.4517 +v -0.5647 31.4127 24.9233 +v 5.4890 31.4484 24.9248 +v 5.4890 38.2460 23.0732 +v -0.5647 38.2607 23.0429 +v 17.2932 40.1891 17.4591 +v 17.2932 39.5922 21.2309 +v 17.2932 37.3891 19.1351 +v 17.2932 38.4064 17.2727 +v 17.2932 24.2933 19.0483 +v 17.2932 25.7663 20.1532 +v 16.6233 24.0817 24.3543 +v 16.2132 26.1301 25.7904 +v 17.2932 20.1168 25.8647 +v 17.2932 20.7075 25.0279 +v 17.2932 36.3063 19.8221 +v 17.2932 35.9167 22.5656 +v 17.9687 36.8485 18.5965 +v 12.1393 36.8485 18.5965 +v 12.1393 37.6108 17.2030 +v 17.9687 37.6108 17.2030 +v 17.9687 35.7608 19.2180 +v 12.1393 35.7608 19.2180 +v 17.9687 30.3442 19.6799 +v 12.1393 30.3442 19.6799 +v 17.9687 25.9767 19.3648 +v 12.1393 25.9767 19.3648 +v 17.9687 20.3039 9.0495 +v 12.1393 24.9275 18.5462 +v 17.9687 24.9275 18.5462 +v -0.5647 37.6108 17.2030 +v 17.2932 30.3345 20.4129 +v 17.2932 -30.6780 20.2576 +v 16.8297 22.8690 21.6214 +v 16.6233 24.0779 21.5758 +v 17.2932 20.8746 23.3065 +v 17.2932 24.0817 24.3543 +v 17.2932 30.0838 23.7154 +v 16.4211 30.2916 24.0399 +v 15.3684 36.0281 23.0908 +v 14.3566 40.0988 21.6601 +v 14.3566 40.8031 17.5234 +v 15.8536 30.6105 25.0621 +v 15.0965 36.3302 23.6742 +v 14.1796 40.8789 21.9091 +v 14.1796 41.5576 17.5788 +v 17.2932 22.8690 21.6214 +v 17.2932 24.0779 21.5758 +v 12.5338 26.1267 25.7936 +v -0.5647 26.1176 25.8025 +v 16.0654 25.6756 26.4433 +v 12.8751 25.6731 26.4461 +v 12.4079 20.9986 27.0175 +v 16.8910 20.2699 27.0179 +v 17.3224 16.9421 25.0473 +v 16.6694 14.1853 32.4239 +v 16.7053 15.0876 31.9750 +v 17.3225 17.5436 25.6989 +v 16.6376 1.8047 32.8229 +v 17.3224 1.6042 25.5485 +v 17.3224 1.2032 26.2001 +v 16.6814 1.2534 32.2743 +v 16.6038 -14.1968 33.2192 +v 16.6278 -1.7661 32.9200 +v 16.6677 -1.1646 32.4212 +v 17.3245 -1.3150 26.2979 +v 17.3245 -2.5681 25.6463 +v 17.3245 -15.0489 25.7466 +v 17.3245 -15.9010 26.7490 +v 16.6357 -14.8484 32.8202 +v 16.7376 -15.5366 26.7630 +v 16.7269 -14.8921 26.0020 +v 16.0755 -14.1048 32.7904 +v 16.0818 -14.5380 32.5237 +v 16.1267 -1.5145 32.1805 +v 16.1047 -1.8959 32.4973 +v 16.7357 -2.6520 25.9050 +v 16.7480 -1.6558 26.4249 +v 9.2815 40.6112 20.9203 +v 9.6803 40.6112 21.3534 +v 12.7910 40.2980 21.3534 +v 13.1898 40.2980 20.9203 +v 13.1898 40.2980 18.3942 +v 12.7910 40.2980 17.9611 +v 9.6803 40.6112 17.9611 +v 9.2815 40.6112 18.3942 +v 13.4082 41.4415 18.3475 +v 13.4082 40.9950 21.1404 +v 13.0094 40.9304 21.5686 +v 9.4619 41.2435 21.5686 +v 8.8016 41.1947 21.8919 +v 9.0631 41.3082 21.1404 +v 9.0631 41.7547 18.3475 +v 9.4619 41.8193 17.9193 +v 13.0094 41.5062 17.9193 +v 9.1861 37.6108 17.2030 +v 6.5809 38.2407 23.0842 +v 6.5809 31.4613 24.9253 +v 6.5809 33.9384 25.0849 +v 5.4890 33.9437 25.0740 +v 5.4890 32.6778 25.3042 +v 6.5809 32.6907 25.3047 +v 10.6729 38.7942 8.9582 +v -0.5647 39.2491 8.9582 +v -0.5647 42.5831 11.4013 +v 11.4823 42.1276 11.4013 +v 12.9697 40.4454 13.9252 +v -0.5647 40.9094 13.9252 +v -0.5647 41.0793 13.3751 +v 12.7237 40.6153 13.3751 +v 12.9697 42.1287 17.0100 +v 7.3194 42.3139 17.0100 +v 7.3194 40.6999 17.6550 +v 12.9697 40.5147 17.6550 +v 12.1804 42.4906 13.3751 +v -0.5647 42.9465 13.3751 +v -0.5647 42.5359 13.9905 +v 8.6590 42.2121 13.9905 +v 12.4264 42.0799 13.9905 +v 17.1097 40.3205 17.4321 +v 17.1097 40.1869 14.9163 +v 15.9283 41.3900 15.2146 +v 15.9283 41.4466 17.0572 +v -0.5647 37.8507 8.5625 +v 10.5471 37.3960 8.5625 +v 11.2710 37.7437 9.0946 +v 12.4916 42.0857 14.3529 +v 7.3194 42.2689 14.2099 +v 13.4989 41.9848 14.2614 +v 11.4128 38.4641 9.5190 +v 12.2058 41.7308 11.9110 +v 12.7237 41.8033 13.3751 +v 12.9697 41.3934 13.9601 +v -0.5647 42.5427 14.2099 +v 7.3194 40.9984 14.2099 +v 18.0831 -32.9215 16.4555 +v 18.0831 -39.4857 16.4555 +v 18.0831 -39.4857 13.5608 +v 18.0831 -35.7965 11.9470 +v 18.0831 -34.5155 11.9470 +v -0.5647 -35.7965 10.2055 +v -0.5647 -34.8479 10.2055 +v 12.2030 -34.8479 10.2055 +v 12.2030 -35.7965 10.2055 +v -0.5647 -40.7226 13.5608 +v 12.2030 -40.4446 13.5608 +v 12.2030 -34.7366 10.8172 +v -0.5647 -40.7226 16.4555 +v 12.2030 -40.4446 16.4555 +v 12.2030 -35.7965 10.8172 +v 12.2030 -32.9215 16.4555 +v 16.0401 -32.9215 16.4555 +v -0.5647 -32.9215 16.4555 +v 15.3609 -37.2917 16.4555 +v 12.2030 -37.4841 16.4555 +v -0.5647 -38.2618 16.4555 +v -17.5980 -37.4353 26.0847 +v -17.5980 -37.8340 16.4593 +v -17.5344 -20.1960 35.4661 +v -17.5345 -34.2848 35.4639 +v -16.7101 -35.1803 35.4801 +v -10.3156 41.8707 17.5788 +v -9.9171 41.8707 17.5788 +v -9.9171 41.1921 21.9091 +v -18.4226 -10.4931 11.1012 +v -18.4226 -11.1915 25.3594 +v -18.4226 0.3206 25.3594 +v -18.4226 0.3206 10.6839 +v -19.0981 -10.4209 9.6278 +v -19.0981 0.3206 9.2104 +v -17.6127 15.0422 34.3221 +v -17.5682 0.3206 35.0424 +v -18.4226 10.5789 10.5579 +v -18.4226 10.5789 23.5719 +v -18.4226 20.8372 21.7844 +v -18.4226 19.8798 10.4530 +v -13.2688 20.3039 9.0495 +v -17.5511 -9.9377 35.2572 +v -16.7885 -36.3014 34.4984 +v -10.3156 37.6108 14.3277 +v -10.3156 41.2397 14.1638 +v -17.8857 1.5470 26.2168 +v -17.2667 1.5951 32.0519 +v -17.2423 1.9413 32.3968 +v -17.2693 14.0974 32.0044 +v -17.8604 16.7956 25.3144 +v -17.8642 1.7983 25.8051 +v -18.4226 -36.5398 26.0809 +v -17.6554 -35.4555 34.0358 +v -18.4226 -22.4998 26.0216 +v -18.4226 -15.8137 12.5315 +v -18.4226 -18.8789 18.7039 +v -13.2687 -16.5591 11.9019 +v -13.2614 20.5691 26.4538 +v -14.2058 20.5691 26.4538 +v -17.6622 16.0953 33.7466 +v -19.0981 10.5789 9.1299 +v -17.2890 14.8136 31.6472 +v -17.8760 17.1433 25.6940 +v -18.4227 -21.9353 20.1206 +v -18.4226 -20.3856 19.7212 +v -18.4227 -26.0592 20.3415 +v -18.4226 -36.9385 16.4548 +v -18.4226 -31.8333 19.3933 +v -18.4226 -33.9862 16.4403 +v -13.2687 -32.7896 16.4517 +v -19.0981 -16.5591 11.9019 +v -19.0981 -19.6528 17.9391 +v -13.2687 -19.6529 17.9391 +v -19.0981 -20.8721 18.6667 +v -19.0982 -21.8036 19.2226 +v -13.2688 -21.8036 19.2226 +v -19.0982 -26.0256 19.2528 +v -19.0981 -30.1719 19.2824 +v -13.2688 -30.1719 19.2824 +v -19.0981 -31.1855 18.7133 +v -13.2688 -31.1855 18.7133 +v -19.0981 -32.7896 16.4517 +v -6.6184 38.2460 23.0732 +v -6.6184 31.4484 24.9248 +v -18.4226 40.1891 17.4591 +v -18.4226 38.4064 17.2727 +v -18.4226 37.3891 19.1351 +v -18.4226 39.5922 21.2309 +v -18.4226 24.2933 19.0483 +v -18.4226 25.7663 20.1532 +v -17.7527 24.0817 24.3543 +v -18.4226 20.7075 25.0279 +v -18.4226 20.1168 25.8647 +v -17.3426 26.1301 25.7904 +v -18.4226 36.3063 19.8221 +v -18.4226 35.9167 22.5656 +v -19.0981 36.8485 18.5965 +v -19.0981 37.6108 17.2030 +v -13.2688 37.6108 17.2030 +v -13.2688 36.8485 18.5965 +v -19.0981 35.7608 19.2180 +v -13.2688 35.7608 19.2180 +v -19.0981 30.3442 19.6799 +v -13.2688 30.3442 19.6799 +v -19.0981 25.9767 19.3648 +v -13.2688 25.9767 19.3648 +v -19.0981 20.3039 9.0495 +v -19.0981 24.9275 18.5462 +v -13.2688 24.9275 18.5462 +v -18.4226 30.3345 20.4129 +v -18.4226 -30.6780 20.2576 +v -17.9591 22.8690 21.6214 +v -18.4226 20.8746 23.3065 +v -17.7527 24.0779 21.5758 +v -18.4226 24.0817 24.3543 +v -17.5505 30.2916 24.0399 +v -18.4226 30.0838 23.7154 +v -16.4978 36.0281 23.0908 +v -15.4860 40.0988 21.6601 +v -15.4860 40.8031 17.5234 +v -16.9830 30.6105 25.0621 +v -16.2259 36.3302 23.6742 +v -15.3090 40.8789 21.9091 +v -15.3090 41.5576 17.5788 +v -18.4226 24.0779 21.5758 +v -18.4226 22.8690 21.6214 +v -13.6632 26.1267 25.7936 +v -17.1948 25.6756 26.4433 +v -18.0204 20.2699 27.0179 +v -13.5373 20.9986 27.0175 +v -14.0046 25.6731 26.4461 +v -17.8347 15.0876 31.9750 +v -17.7989 14.1853 32.4239 +v -18.4519 17.5436 25.6989 +v -18.4519 16.9421 25.0473 +v -18.4518 1.2032 26.2001 +v -18.4518 1.6042 25.5485 +v -17.8108 1.2534 32.2743 +v -17.7670 1.8047 32.8229 +v -17.7572 -1.7661 32.9200 +v -17.7333 -14.1968 33.2192 +v -17.7971 -1.1646 32.4212 +v -18.4539 -1.3150 26.2979 +v -18.4539 -2.5681 25.6463 +v -17.7651 -14.8484 32.8202 +v -18.4539 -15.9010 26.7490 +v -18.4539 -15.0489 25.7466 +v -17.8671 -15.5366 26.7630 +v -17.2112 -14.5380 32.5237 +v -17.2049 -14.1048 32.7904 +v -17.8563 -14.8921 26.0020 +v -17.8651 -2.6520 25.9050 +v -17.2341 -1.8959 32.4973 +v -17.2561 -1.5145 32.1805 +v -17.8775 -1.6558 26.4249 +v -10.8097 40.6112 17.9611 +v -13.9205 40.2980 17.9611 +v -14.3192 40.2980 18.3942 +v -14.3192 40.2980 20.9203 +v -13.9205 40.2980 21.3534 +v -10.8097 40.6112 21.3534 +v -10.4109 40.6112 20.9203 +v -10.4109 40.6112 18.3942 +v -14.5376 40.9950 21.1404 +v -14.5376 41.4415 18.3475 +v -9.9310 41.1947 21.8919 +v -10.5913 41.2435 21.5686 +v -14.1389 40.9304 21.5686 +v -10.1925 41.7547 18.3475 +v -10.1925 41.3082 21.1404 +v -14.1389 41.5062 17.9193 +v -10.5913 41.8193 17.9193 +v -10.3156 37.6108 17.2030 +v -7.7104 38.2407 23.0842 +v -7.7104 31.4613 24.9253 +v -7.7104 33.9384 25.0849 +v -7.7104 32.6907 25.3047 +v -6.6184 32.6778 25.3042 +v -6.6184 33.9437 25.0740 +v -11.8023 38.7942 8.9582 +v -12.6117 42.1276 11.4013 +v -14.0991 40.4454 13.9252 +v -13.8531 40.6153 13.3751 +v -14.0991 42.1287 17.0100 +v -14.0991 40.5147 17.6550 +v -8.4488 40.6999 17.6550 +v -8.4488 42.3139 17.0100 +v -13.3099 42.4906 13.3751 +v -13.5558 42.0799 13.9905 +v -9.7884 42.2121 13.9905 +v -18.2391 40.3205 17.4321 +v -17.0577 41.4466 17.0572 +v -17.0577 41.3900 15.2146 +v -18.2391 40.1869 14.9163 +v -11.6766 37.3960 8.5625 +v -12.4004 37.7437 9.0946 +v -8.4488 42.2689 14.2099 +v -13.6210 42.0857 14.3529 +v -14.6283 41.9848 14.2614 +v -13.3353 41.7308 11.9110 +v -12.5423 38.4641 9.5190 +v -13.8531 41.8033 13.3751 +v -14.0991 41.3934 13.9601 +v -8.4488 40.9984 14.2099 +v -19.2125 -39.4857 13.5608 +v -19.2125 -39.4857 16.4555 +v -19.2125 -32.9215 16.4555 +v -19.2125 -35.7965 11.9470 +v -19.2125 -34.5155 11.9470 +v -13.3324 -35.7965 10.2055 +v -13.3324 -34.8479 10.2055 +v -13.3324 -40.4446 13.5608 +v -13.3324 -34.7366 10.8172 +v -13.3324 -40.4446 16.4555 +v -13.3324 -35.7965 10.8172 +v -17.1695 -32.9215 16.4555 +v -13.3324 -32.9215 16.4555 +v -16.4903 -37.2917 16.4555 +v -13.3324 -37.4841 16.4555 +v -2.6793 31.2559 6.3188 +v -2.0697 32.1525 6.5936 +v -1.4234 32.0961 5.9497 +v -1.7753 31.1771 5.4182 +v -3.0102 31.3635 7.5490 +v -2.3063 32.2294 7.4732 +v -2.6793 31.4712 8.7792 +v -2.0697 32.3064 8.3528 +v -1.7753 31.5499 9.6798 +v -1.4234 32.3627 8.9968 +v -0.5647 31.5782 10.0029 +v -0.5647 32.3828 9.2260 +v -1.7753 29.1587 5.5948 +v -2.6793 29.2375 6.4953 +v -3.0102 29.3451 7.7256 +v -2.6793 29.4528 8.9558 +v -1.7753 29.5316 9.8564 +v -0.5647 29.5598 10.1795 +v -1.2538 25.5646 7.6140 +v -0.9523 25.5383 7.3136 +v -1.3642 25.6005 8.0243 +v -1.2538 25.6364 8.4346 +v -0.9523 25.6627 8.7350 +v -0.5647 25.6717 8.8385 +v -0.5647 32.0761 5.7205 +v -0.5647 32.6013 7.4407 +v -0.5647 32.6028 7.4265 +v -0.5647 32.6052 7.4544 +v -0.5647 31.1488 5.0950 +v -0.5647 29.1304 5.2716 +v -0.5647 25.5293 7.2102 +v 1.5499 31.2559 6.3188 +v 0.6459 31.1771 5.4182 +v 0.2939 32.0961 5.9497 +v 0.9403 32.1525 6.5936 +v 1.8808 31.3635 7.5490 +v 1.1769 32.2294 7.4732 +v 1.5499 31.4712 8.7792 +v 0.9403 32.3064 8.3528 +v 0.6459 31.5499 9.6798 +v 0.2939 32.3627 8.9968 +v 1.5499 29.2375 6.4953 +v 0.6459 29.1587 5.5948 +v 1.8808 29.3451 7.7256 +v 1.5499 29.4528 8.9558 +v 0.6459 29.5316 9.8564 +v 0.1244 25.5646 7.6140 +v -0.1771 25.5383 7.3136 +v 0.2347 25.6005 8.0243 +v 0.1244 25.6364 8.4346 +v -0.1771 25.6627 8.7350 +v -0.9523 2.8571 9.2980 +v -1.2538 2.8833 9.5984 +v -1.3642 2.9192 10.0087 +v -1.2538 2.9551 10.4190 +v -0.9523 2.9814 10.7194 +v -0.5647 2.9905 10.8228 +v -0.5647 2.8480 9.1945 +v 0.1244 2.8833 9.5984 +v -0.1771 2.8571 9.2980 +v 0.2347 2.9192 10.0087 +v 0.1244 2.9551 10.4190 +v -0.1771 2.9814 10.7194 +v -2.6793 -26.6102 6.3188 +v -1.7753 -26.5314 5.4182 +v -1.4234 -27.4505 5.9497 +v -2.0698 -27.5068 6.5936 +v -3.0102 -26.7179 7.5490 +v -2.3063 -27.5838 7.4732 +v -2.6793 -26.8255 8.7792 +v -2.0698 -27.6607 8.3528 +v -1.7753 -26.9043 9.6798 +v -1.4234 -27.7170 8.9968 +v -0.5647 -27.7371 9.2260 +v -0.5647 -26.9325 10.0029 +v -2.6793 -24.5918 6.4954 +v -1.7753 -24.5130 5.5948 +v -3.0102 -24.6995 7.7256 +v -2.6793 -24.8071 8.9558 +v -1.7753 -24.8859 9.8564 +v -0.5647 -24.9142 10.1795 +v -1.2538 -20.9189 7.6140 +v -0.9523 -20.8926 7.3136 +v -1.3642 -20.9548 8.0243 +v -1.2538 -20.9907 8.4346 +v -0.9523 -21.0170 8.7350 +v -0.5647 -21.0260 8.8385 +v -0.5647 -27.4304 5.7205 +v -0.5647 -27.9556 7.4407 +v -0.5647 -27.9571 7.4265 +v -0.5647 -27.9596 7.4544 +v -0.5647 -26.5032 5.0950 +v -0.5647 -24.4848 5.2716 +v -0.5647 -20.8836 7.2102 +v 1.5499 -26.6102 6.3188 +v 0.9403 -27.5068 6.5936 +v 0.2939 -27.4505 5.9497 +v 0.6459 -26.5314 5.4182 +v 1.8808 -26.7179 7.5490 +v 1.1769 -27.5838 7.4732 +v 1.5499 -26.8255 8.7792 +v 0.9403 -27.6607 8.3528 +v 0.6459 -26.9043 9.6798 +v 0.2939 -27.7170 8.9968 +v 0.6459 -24.5130 5.5948 +v 1.5499 -24.5918 6.4954 +v 1.8808 -24.6995 7.7256 +v 1.5499 -24.8071 8.9558 +v 0.6459 -24.8859 9.8564 +v 0.1244 -20.9189 7.6140 +v -0.1771 -20.8926 7.3136 +v 0.2347 -20.9548 8.0243 +v 0.1244 -20.9907 8.4346 +v -0.1771 -21.0170 8.7350 +v -1.2538 1.7623 9.5984 +v -0.9523 1.7886 9.2980 +v -1.3642 1.7264 10.0087 +v -1.2538 1.6905 10.4190 +v -0.9523 1.6642 10.7194 +v -0.5647 1.6552 10.8228 +v -0.5647 1.7977 9.1945 +v -0.1771 1.7886 9.2980 +v 0.1244 1.7623 9.5984 +v 0.2347 1.7264 10.0087 +v 0.1244 1.6905 10.4190 +v -0.1771 1.6642 10.7194 +v 14.1802 -25.1593 8.5888 +v 14.1802 -24.6100 7.6373 +v 0.3311 -24.6100 7.6373 +v 0.3311 -25.1593 8.5888 +v 14.1802 -26.2580 8.5888 +v 0.3311 -26.2580 8.5888 +v 14.1802 -26.8073 7.6373 +v 0.3311 -26.8073 7.6373 +v 14.1802 -26.2580 6.6858 +v 0.3311 -26.2580 6.6858 +v 14.1802 -25.1593 6.6858 +v 0.3311 -25.1593 6.6858 +v -15.3096 -25.1593 8.5888 +v -1.4605 -25.1593 8.5888 +v -1.4605 -24.6100 7.6373 +v -15.3096 -24.6100 7.6373 +v -15.3096 -26.2580 8.5888 +v -1.4605 -26.2580 8.5888 +v -15.3096 -26.8073 7.6373 +v -1.4605 -26.8073 7.6373 +v -15.3096 -26.2580 6.6858 +v -1.4605 -26.2580 6.6858 +v -15.3096 -25.1593 6.6858 +v -1.4605 -25.1593 6.6858 +v 14.1802 29.8050 8.5888 +v 0.3311 29.8050 8.5888 +v 0.3311 29.2556 7.6373 +v 14.1802 29.2556 7.6373 +v 14.1802 30.9037 8.5888 +v 0.3311 30.9037 8.5888 +v 14.1802 31.4530 7.6373 +v 0.3311 31.4530 7.6373 +v 14.1802 30.9037 6.6858 +v 0.3311 30.9037 6.6858 +v 14.1802 29.8050 6.6858 +v 0.3311 29.8050 6.6858 +v -15.3096 29.8050 8.5888 +v -15.3096 29.2556 7.6373 +v -1.4605 29.2556 7.6373 +v -1.4605 29.8050 8.5888 +v -15.3096 30.9037 8.5888 +v -1.4605 30.9037 8.5888 +v -15.3096 31.4530 7.6373 +v -1.4605 31.4530 7.6373 +v -15.3096 30.9037 6.6858 +v -1.4605 30.9037 6.6858 +v -15.3096 29.8050 6.6858 +v -1.4605 29.8050 6.6858 +v -17.9912 16.5425 26.2842 +v -17.9912 16.5425 25.5266 +v -18.5045 16.5425 25.5266 +v -21.7461 16.1859 25.5266 +v -22.0282 16.1538 25.8557 +v -22.0282 16.1538 27.2202 +v -18.4374 16.5425 26.4950 +v -22.2626 15.8295 25.7784 +v -21.9804 15.8295 25.4494 +v -18.5045 15.8295 25.4494 +v -17.9912 15.8295 25.4494 +v -17.9912 15.8295 26.2842 +v -18.4374 15.8295 26.4950 +v -22.2626 15.8295 27.2967 +v -21.7461 16.1859 27.5144 +v -21.9804 15.8295 27.5909 +v -18.8211 15.8295 27.5909 +v -18.9324 16.4977 27.5144 +v -18.5513 16.5425 27.1307 +v -18.4374 15.8295 27.2072 +v -18.4249 16.5431 24.5838 +v -18.4249 15.8301 24.5066 +v -17.9912 16.5431 24.5838 +v -17.9912 15.8301 24.5066 +v 17.3080 16.5425 26.4950 +v 20.8988 16.1538 27.2202 +v 20.8988 16.1538 25.8557 +v 16.8618 16.5425 26.2842 +v 20.6166 16.1859 25.5266 +v 17.3750 16.5425 25.5266 +v 16.8618 16.5425 25.5266 +v 21.1331 15.8295 27.2967 +v 17.3080 15.8295 26.4950 +v 16.8618 15.8295 26.2842 +v 21.1331 15.8295 25.7784 +v 16.8618 15.8295 25.4494 +v 17.3750 15.8295 25.4494 +v 20.8510 15.8295 25.4494 +v 20.6166 16.1859 27.5144 +v 17.8030 16.4977 27.5144 +v 17.6917 15.8295 27.5909 +v 20.8510 15.8295 27.5909 +v 17.4219 16.5425 27.1307 +v 17.3080 15.8295 27.2072 +v 17.2955 15.8301 24.5066 +v 17.2955 16.5431 24.5838 +v 16.8618 16.5431 24.5838 +v 16.8618 15.8301 24.5066 +# 657 vertices + +vn -0.0000 -0.9964 0.0851 +vn 0.0000 -0.9991 0.0414 +vn 0.4045 -0.9138 0.0378 +vn 0.4123 -0.9057 0.0989 +vn 0.0183 -0.0002 0.9998 +vn 0.0182 0.0101 0.9998 +vn -0.0000 0.0102 0.9999 +vn 0.0000 -0.0001 1.0000 +vn -0.0000 0.9879 0.1548 +vn 0.0087 0.9855 0.1692 +vn 0.0071 0.7247 -0.6890 +vn -0.0000 -0.0843 -0.9964 +vn 0.0000 0.9879 0.1548 +vn 1.0000 0.0000 -0.0000 +vn 0.9997 -0.0047 0.0220 +vn 0.9989 -0.0004 -0.0475 +vn -0.0000 -0.1956 -0.9807 +vn 0.0000 -0.0233 -0.9997 +vn -0.0000 -0.0233 -0.9997 +vn 0.0000 0.2926 0.9562 +vn 0.0000 0.0292 0.9996 +vn 0.0207 0.0324 0.9993 +vn 0.0294 0.2728 0.9616 +vn 1.0000 0.0013 -0.0014 +vn 1.0000 -0.0011 -0.0061 +vn -0.0000 -0.0083 -1.0000 +vn -0.0000 -0.0081 -1.0000 +vn -0.0000 0.0207 0.9998 +vn 0.0182 0.0206 0.9996 +vn -0.0000 -0.8831 0.4692 +vn 0.3829 -0.8006 0.4609 +vn -0.0022 -0.0386 -0.9993 +vn -0.0000 -0.0451 -0.9990 +vn 0.9952 0.0032 0.0977 +vn 0.9954 0.0007 0.0958 +vn 0.9939 -0.0075 0.1099 +vn 0.9927 -0.0383 0.1147 +vn 0.9988 0.0037 0.0488 +vn 0.9983 -0.0016 -0.0576 +vn 0.9987 -0.0017 0.0506 +vn 0.9950 0.0014 0.1003 +vn 0.9355 -0.2224 0.2744 +vn 0.9191 -0.3857 0.0803 +vn 0.8808 -0.3899 0.2688 +vn -0.0000 -0.4906 -0.8714 +vn 0.0000 -0.2940 -0.9558 +vn 0.0421 0.7100 0.7029 +vn 0.0557 0.8636 0.5011 +vn -0.0000 0.8524 0.5229 +vn -0.0000 0.8696 0.4938 +vn -0.0000 0.7230 0.6908 +vn 0.9943 0.0223 0.1044 +vn 0.9915 -0.1152 0.0611 +vn 1.0000 0.0000 0.0000 +vn 1.0000 -0.0000 0.0000 +vn 0.9206 -0.3901 0.0162 +vn 1.0000 -0.0000 -0.0000 +vn 0.0380 0.2846 -0.9579 +vn 0.0000 -0.2003 -0.9797 +vn 0.0000 -0.6639 -0.7478 +vn 0.0000 -0.7295 -0.6839 +vn 0.0000 -0.2692 -0.9631 +vn 0.0000 -0.5125 -0.8587 +vn -0.0000 0.2495 -0.9684 +vn -0.0000 -0.0071 -1.0000 +vn -0.0000 0.6689 -0.7434 +vn -0.0000 0.8157 -0.5785 +vn -0.0000 0.2139 0.9769 +vn -0.0019 0.1978 0.9802 +vn -0.0038 0.3364 0.9417 +vn 0.0000 0.3143 0.9493 +vn 0.9789 0.2030 0.0215 +vn 0.9531 0.1923 0.2338 +vn 0.9880 0.0892 0.1263 +vn 0.9878 0.1391 0.0698 +vn 0.0000 -0.7136 -0.7005 +vn 0.0000 -0.8773 -0.4800 +vn -0.0000 -0.8773 -0.4800 +vn 0.0000 -0.2976 -0.9547 +vn -0.0000 -0.2976 -0.9547 +vn -0.0000 -0.0065 -1.0000 +vn -0.0000 0.3591 -0.9333 +vn -0.0000 0.8991 -0.4377 +vn -0.0000 0.7772 -0.6293 +vn -0.0000 0.4262 -0.9046 +vn 0.4021 -0.6193 0.6744 +vn 0.0000 -0.6605 0.7508 +vn 0.7063 0.6212 0.3395 +vn 0.7062 0.6214 0.3394 +vn 0.7207 0.5044 0.4755 +vn 0.7268 0.4983 0.4728 +vn 0.7122 0.2426 0.6587 +vn 0.7092 0.0095 0.7050 +vn 0.7046 0.0097 0.7095 +vn 0.7009 0.1776 0.6908 +vn 0.7448 -0.2252 0.6281 +vn 0.7394 -0.2487 0.6257 +vn 0.7406 -0.5148 0.4318 +vn 0.7410 -0.5133 0.4330 +vn 0.8018 -0.5370 0.2622 +vn 0.8051 -0.5333 0.2597 +vn 0.8861 0.0051 0.4635 +vn 0.8856 0.0052 0.4645 +vn 0.8893 0.0048 0.4573 +vn 0.8898 0.0046 0.4564 +vn 0.8949 0.0106 0.4462 +vn 0.8952 0.0103 0.4456 +vn 0.8827 0.1002 0.4591 +vn 0.8908 0.0801 0.4474 +vn 0.8081 0.3870 0.4441 +vn 0.7918 0.3572 0.4955 +vn 0.8323 0.4166 0.3658 +vn 0.8288 0.4185 0.3714 +vn 0.8202 0.2582 0.5105 +vn 0.7648 0.0894 0.6380 +vn 0.7967 0.1397 0.5881 +vn 0.8441 0.2748 0.4604 +vn 0.8222 0.0051 0.5692 +vn 0.8171 -0.1835 0.5465 +vn 0.8259 -0.1278 0.5491 +vn 0.8293 0.0040 0.5589 +vn 0.7894 -0.4377 0.4304 +vn 0.8009 -0.4177 0.4291 +vn 0.7946 -0.4905 0.3576 +vn 0.7925 -0.4937 0.3581 +vn 0.9784 0.2062 -0.0113 +vn 0.9832 0.1823 -0.0002 +vn 0.9962 0.0871 0.0012 +vn 0.3420 0.0995 0.9344 +vn 0.3478 0.1363 0.9276 +vn 0.3376 0.1519 0.9290 +vn 0.2329 0.2865 0.9293 +vn 0.2540 0.2684 0.9292 +vn 0.2008 0.3581 0.9118 +vn 0.1813 0.3693 0.9115 +vn 0.1898 0.9698 0.1535 +vn 0.1764 0.9704 0.1652 +vn 0.8628 0.1555 0.4811 +vn 0.8623 0.1559 0.4819 +vn 0.8652 0.1923 0.4631 +vn 0.8673 0.2024 0.4547 +vn 0.9105 0.2842 0.3005 +vn 0.9056 0.2696 0.3274 +vn 0.9713 0.2332 0.0465 +vn 0.9730 0.2281 0.0364 +vn 0.9689 0.2438 0.0415 +vn 0.9695 0.2418 0.0408 +vn 0.0000 -0.5741 0.8188 +vn 0.0000 -1.0000 0.0013 +vn 0.0000 0.0377 0.9993 +vn 0.0000 0.6454 0.7638 +vn 0.0000 0.1169 0.9931 +vn 0.0000 0.1180 0.9930 +vn 0.0005 0.1473 0.9891 +vn 0.0000 0.1398 0.9902 +vn 0.6193 0.1879 0.7623 +vn 0.0007 0.1212 0.9926 +vn 0.0105 0.1131 0.9935 +vn 0.6427 0.1833 0.7439 +vn 0.0000 -0.7954 0.6061 +vn -0.9153 0.1453 0.3758 +vn -0.8203 0.1305 0.5568 +vn -0.0001 0.8211 0.5708 +vn -0.0002 0.8207 0.5713 +vn 1.0000 0.0025 -0.0093 +vn 0.9941 0.0086 0.1085 +vn 0.9945 0.0028 0.1049 +vn 0.9946 0.0039 0.1042 +vn 0.9948 -0.0056 0.1021 +vn 0.9991 0.0094 0.0402 +vn 0.9954 -0.0020 0.0958 +vn 0.9952 0.0008 0.0980 +vn 0.9948 -0.0096 -0.1016 +vn 0.9928 -0.0994 0.0670 +vn 0.9954 -0.0051 0.0952 +vn 0.9954 0.0002 0.0962 +vn 0.9955 -0.0004 0.0947 +vn 0.9955 0.0019 0.0944 +vn 0.9938 -0.0245 0.1081 +vn 0.9986 0.0377 0.0379 +vn 0.9948 0.0016 -0.1017 +vn 0.9867 -0.0103 -0.1622 +vn 0.9984 -0.0113 0.0558 +vn 0.9951 -0.0034 0.0992 +vn 0.9885 0.1228 0.0888 +vn 0.9888 -0.0667 0.1338 +vn 0.9972 -0.0008 0.0742 +vn 0.9946 0.0000 0.1036 +vn 0.9945 0.0007 0.1047 +vn 0.9902 -0.0749 0.1179 +vn 0.4280 -0.6759 0.6000 +vn 0.4101 -0.6702 0.6186 +vn 0.3779 0.0304 0.9254 +vn 0.3807 0.0302 0.9242 +vn 0.4215 0.7844 0.4550 +vn 0.4403 0.7647 0.4706 +vn 0.4884 0.8712 0.0491 +vn 0.4863 0.8725 0.0485 +vn 0.5621 0.6049 -0.5640 +vn 0.5643 0.6063 -0.5604 +vn 0.5944 -0.0274 -0.8037 +vn 0.5918 -0.0276 -0.8056 +vn 0.5828 -0.3766 -0.7201 +vn 0.5764 -0.3838 -0.7214 +vn 0.5206 -0.8125 -0.2622 +vn 0.5217 -0.8119 -0.2620 +vn 0.5777 -0.5426 -0.6098 +vn 0.5749 -0.5464 -0.6090 +vn 0.4862 -0.8703 0.0784 +vn 0.4889 -0.8688 0.0783 +vn 0.3979 -0.4287 0.8111 +vn 0.3868 -0.4254 0.8181 +vn 0.3742 0.0071 0.9273 +vn 0.3678 0.0075 0.9299 +vn 0.4012 0.7021 0.5884 +vn 0.4103 0.6949 0.5906 +vn 0.4930 0.8655 -0.0891 +vn 0.4913 0.8664 -0.0897 +vn 0.5690 0.4376 -0.6963 +vn 0.5804 0.4475 -0.6804 +vn 0.5964 -0.0208 -0.8024 +vn 0.5998 -0.0205 -0.7999 +vn 0.0919 0.9915 -0.0919 +vn 0.0000 1.0000 0.0000 +vn 0.0805 0.9967 0.0118 +vn 0.0111 0.9826 0.1855 +vn 0.0047 0.9880 0.1544 +vn -0.0023 0.9883 0.1528 +vn 0.0097 0.9927 0.1199 +vn 0.0592 0.9957 -0.0707 +vn 0.0360 0.9756 0.2168 +vn 0.0045 0.9883 0.1526 +vn 0.0164 0.9877 0.1554 +vn -0.0095 0.9881 0.1533 +vn 0.0560 0.9980 0.0303 +vn 0.0376 0.9603 0.2764 +vn -0.9792 0.2031 0.0000 +vn -0.9502 0.3078 0.0492 +vn 0.0289 0.3123 -0.9495 +vn 0.0269 0.3311 -0.9432 +vn 0.9467 0.3221 -0.0000 +vn 0.9784 0.2043 0.0327 +vn 0.0033 0.0353 0.9994 +vn 0.0028 0.0341 0.9994 +vn -0.0000 -0.0000 1.0000 +vn 0.0043 0.0743 -0.9972 +vn -0.0001 0.1040 -0.9946 +vn 0.0133 0.1216 -0.9925 +vn -0.0000 0.0872 -0.9962 +vn -0.0001 0.0878 -0.9961 +vn -0.0000 0.0879 -0.9961 +vn 0.0000 -1.0000 0.0000 +vn 0.0011 0.9834 -0.1817 +vn -0.0000 0.9840 -0.1783 +vn -0.1476 -0.9862 0.0750 +vn -0.0007 -0.7958 0.6055 +vn 0.1458 0.8750 0.4617 +vn 0.0014 0.3366 0.9416 +vn 0.0031 0.1974 0.9803 +vn -0.0016 0.1980 0.9802 +vn -0.0026 0.2837 0.9589 +vn 0.0003 0.1608 0.9870 +vn 0.0124 0.3601 0.9328 +vn 0.0000 0.3607 0.9327 +vn 0.0166 0.3630 0.9316 +vn -0.0083 0.1789 0.9838 +vn -0.0023 0.1735 0.9848 +vn 0.0028 -0.2949 0.9555 +vn -1.0000 -0.0000 -0.0000 +vn -0.0065 0.4217 0.9067 +vn 1.0000 -0.0000 -0.0001 +vn -0.6979 0.1612 0.6979 +vn -0.6799 0.1702 0.7133 +vn -0.6414 0.4208 -0.6414 +vn -0.6604 0.4518 -0.5997 +vn 0.6310 0.4514 -0.6310 +vn 0.6688 0.4210 -0.6128 +vn 0.6965 0.1729 0.6965 +vn 0.6821 0.1586 0.7138 +vn 0.3159 0.3760 -0.8711 +vn 0.0000 0.4420 -0.8970 +vn -0.0000 0.8489 -0.5286 +vn 0.3283 0.7522 -0.5713 +vn -0.0301 -0.9550 -0.2949 +vn -0.0308 -0.9591 -0.2812 +vn 0.0112 0.3711 0.9285 +vn 0.4044 0.9127 0.0589 +vn -0.0000 0.9798 0.2002 +vn -0.0000 0.9610 0.2765 +vn 0.0312 0.9641 0.2638 +vn 0.3477 0.9376 0.0067 +vn 0.6709 0.7409 -0.0308 +vn 0.6066 0.6962 -0.3837 +vn 0.4396 0.8127 -0.3825 +vn 0.4649 0.8850 -0.0272 +vn -0.0313 -0.8300 0.5568 +vn -0.0265 -0.8248 0.5648 +vn -0.0129 -0.8282 0.5603 +vn 0.0322 0.9993 -0.0177 +vn 0.1193 0.9927 -0.0202 +vn 0.0605 0.9978 -0.0274 +vn 0.0325 0.9989 -0.0348 +vn 0.2165 0.2743 -0.9370 +vn 0.0000 0.2723 -0.9622 +vn 0.0650 0.3703 0.9266 +vn 0.0621 0.3783 0.9236 +vn -0.0422 -0.9989 0.0185 +vn -0.0689 -0.9962 0.0529 +vn 0.3072 0.7317 -0.6085 +vn 0.9216 0.0077 -0.3881 +vn 0.4950 0.3600 -0.7908 +vn 0.7976 0.1639 -0.5804 +vn 0.7899 0.4314 -0.4358 +vn 0.8831 0.4175 -0.2141 +vn 0.6190 0.2169 -0.7549 +vn 0.5842 0.0299 -0.8111 +vn 0.0000 0.9995 -0.0310 +vn -1.0000 0.0000 0.0000 +vn -0.0032 -0.0179 0.9998 +vn -0.0203 -0.6025 0.7979 +vn -0.0196 -0.6210 0.7836 +vn -0.0934 -0.9919 -0.0860 +vn -0.0302 -0.9994 0.0185 +vn -0.0000 -0.2945 -0.9556 +vn 0.0000 0.0000 -1.0000 +vn 0.7443 0.0000 -0.6678 +vn 0.6456 -0.2323 -0.7275 +vn 0.0000 -0.8869 -0.4620 +vn 0.0505 -0.8880 -0.4571 +vn -0.0000 0.9838 -0.1790 +vn 0.0000 -1.0000 -0.0000 +vn 0.0200 -0.9998 -0.0000 +vn 0.1742 -0.0000 -0.9847 +vn 0.1742 0.0000 -0.9847 +vn 0.0761 -0.5068 -0.8587 +vn 0.1600 -0.3956 -0.9044 +vn 0.0213 0.9517 -0.3064 +vn -0.0000 0.9428 -0.3333 +vn -0.0000 0.9428 -0.3334 +vn 0.1485 -0.9889 -0.0000 +vn 0.1485 -0.9889 0.0000 +vn 0.0059 0.9519 -0.3064 +vn -0.0000 0.9556 -0.2945 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -0.0000 1.0000 +vn -0.4123 -0.9057 0.0989 +vn -0.4045 -0.9138 0.0378 +vn -0.0182 0.0101 0.9998 +vn -0.0183 -0.0002 0.9998 +vn 0.0000 -0.0843 -0.9964 +vn -0.0071 0.7247 -0.6890 +vn -0.0087 0.9855 0.1692 +vn -1.0000 0.0000 -0.0000 +vn -0.9989 -0.0004 -0.0475 +vn -0.9997 -0.0047 0.0220 +vn 0.0000 -0.1956 -0.9807 +vn -0.0294 0.2728 0.9616 +vn -0.0207 0.0324 0.9993 +vn -1.0000 -0.0011 -0.0061 +vn -1.0000 0.0013 -0.0014 +vn 0.0000 -0.0083 -1.0000 +vn -0.0182 0.0206 0.9996 +vn -0.3829 -0.8006 0.4609 +vn 0.0000 -0.0451 -0.9990 +vn 0.0022 -0.0386 -0.9993 +vn -0.9988 0.0037 0.0488 +vn -0.9927 -0.0383 0.1147 +vn -0.9939 -0.0075 0.1099 +vn -0.9954 0.0007 0.0958 +vn -0.9952 0.0032 0.0977 +vn -0.9983 -0.0016 -0.0576 +vn -0.9191 -0.3857 0.0803 +vn -0.8808 -0.3899 0.2688 +vn -0.9355 -0.2224 0.2744 +vn -0.9950 0.0014 0.1003 +vn -0.9987 -0.0017 0.0506 +vn 0.0000 -0.4906 -0.8714 +vn 0.0000 0.8524 0.5229 +vn -0.0557 0.8636 0.5011 +vn -0.0421 0.7100 0.7029 +vn 0.0000 -0.0081 -1.0000 +vn -0.9915 -0.1152 0.0611 +vn -0.9943 0.0223 0.1044 +vn -1.0000 -0.0000 0.0000 +vn -0.9206 -0.3901 0.0162 +vn -0.0380 0.2846 -0.9579 +vn -0.0000 -0.6639 -0.7478 +vn -0.0000 -0.7295 -0.6839 +vn -0.0000 -0.5125 -0.8587 +vn -0.0000 -0.2692 -0.9631 +vn 0.0000 -0.0071 -1.0000 +vn 0.0000 0.2495 -0.9684 +vn 0.0000 0.6689 -0.7434 +vn 0.0000 0.8157 -0.5785 +vn 0.0038 0.3364 0.9417 +vn 0.0019 0.1978 0.9802 +vn -0.9789 0.2030 0.0215 +vn -0.9878 0.1391 0.0698 +vn -0.9880 0.0892 0.1263 +vn -0.9531 0.1923 0.2338 +vn -0.0000 -0.7136 -0.7005 +vn 0.0000 -0.0065 -1.0000 +vn 0.0000 0.3591 -0.9333 +vn 0.0000 0.8991 -0.4377 +vn 0.0000 0.7772 -0.6293 +vn 0.0000 0.4262 -0.9046 +vn -0.4021 -0.6193 0.6744 +vn -0.7063 0.6212 0.3395 +vn -0.7268 0.4983 0.4728 +vn -0.7207 0.5044 0.4755 +vn -0.7062 0.6214 0.3394 +vn -0.7122 0.2426 0.6587 +vn -0.7009 0.1776 0.6908 +vn -0.7046 0.0097 0.7095 +vn -0.7092 0.0095 0.7050 +vn -0.7394 -0.2487 0.6257 +vn -0.7448 -0.2252 0.6281 +vn -0.7410 -0.5133 0.4330 +vn -0.7406 -0.5148 0.4318 +vn -0.8051 -0.5333 0.2597 +vn -0.8018 -0.5370 0.2622 +vn -0.8861 0.0051 0.4635 +vn -0.8898 0.0046 0.4564 +vn -0.8893 0.0048 0.4573 +vn -0.8856 0.0052 0.4645 +vn -0.8952 0.0103 0.4456 +vn -0.8949 0.0106 0.4462 +vn -0.8908 0.0801 0.4474 +vn -0.8827 0.1002 0.4591 +vn -0.8081 0.3870 0.4441 +vn -0.8323 0.4166 0.3658 +vn -0.7918 0.3572 0.4955 +vn -0.8288 0.4185 0.3714 +vn -0.8202 0.2582 0.5105 +vn -0.8441 0.2748 0.4604 +vn -0.7967 0.1397 0.5881 +vn -0.7648 0.0894 0.6380 +vn -0.8222 0.0051 0.5692 +vn -0.8293 0.0040 0.5589 +vn -0.8259 -0.1278 0.5491 +vn -0.8171 -0.1835 0.5465 +vn -0.8009 -0.4177 0.4291 +vn -0.7894 -0.4377 0.4304 +vn -0.7925 -0.4937 0.3581 +vn -0.7946 -0.4905 0.3576 +vn -0.9784 0.2062 -0.0113 +vn -0.9962 0.0871 0.0012 +vn -0.9832 0.1823 -0.0002 +vn -0.3420 0.0995 0.9344 +vn -0.3376 0.1519 0.9290 +vn -0.3478 0.1363 0.9276 +vn -0.2329 0.2865 0.9293 +vn -0.1813 0.3693 0.9115 +vn -0.2008 0.3581 0.9118 +vn -0.2540 0.2684 0.9292 +vn -0.1764 0.9704 0.1652 +vn -0.1898 0.9698 0.1535 +vn -0.8628 0.1555 0.4811 +vn -0.8673 0.2024 0.4547 +vn -0.8652 0.1923 0.4631 +vn -0.8623 0.1559 0.4819 +vn -0.9105 0.2842 0.3005 +vn -0.9730 0.2281 0.0364 +vn -0.9713 0.2332 0.0465 +vn -0.9056 0.2696 0.3274 +vn -0.9695 0.2418 0.0408 +vn -0.9689 0.2438 0.0415 +vn -0.0000 -0.5741 0.8188 +vn -0.0000 -1.0000 0.0013 +vn -0.0005 0.1473 0.9891 +vn -0.0000 0.1180 0.9930 +vn -0.6193 0.1879 0.7623 +vn -0.6427 0.1833 0.7439 +vn -0.0105 0.1131 0.9935 +vn -0.0007 0.1212 0.9926 +vn -0.0000 -0.7954 0.6061 +vn 0.8203 0.1305 0.5568 +vn 0.9153 0.1453 0.3758 +vn 0.0002 0.8207 0.5713 +vn 0.0001 0.8211 0.5708 +vn -0.9948 -0.0056 0.1021 +vn -0.9946 0.0039 0.1042 +vn -0.9945 0.0028 0.1049 +vn -0.9991 0.0094 0.0402 +vn -0.9941 0.0086 0.1085 +vn -1.0000 0.0025 -0.0093 +vn -0.9928 -0.0994 0.0670 +vn -0.9948 -0.0096 -0.1016 +vn -0.9954 -0.0051 0.0952 +vn -0.9952 0.0008 0.0980 +vn -0.9954 -0.0020 0.0958 +vn -0.9955 0.0019 0.0944 +vn -0.9955 -0.0004 0.0947 +vn -0.9954 0.0002 0.0962 +vn -0.9938 -0.0245 0.1081 +vn -0.9986 0.0377 0.0379 +vn -0.9948 0.0016 -0.1017 +vn -0.9951 -0.0034 0.0992 +vn -0.9984 -0.0113 0.0558 +vn -0.9867 -0.0103 -0.1622 +vn -0.9888 -0.0667 0.1338 +vn -0.9885 0.1228 0.0888 +vn -0.9946 0.0000 0.1036 +vn -0.9972 -0.0008 0.0742 +vn -0.9945 0.0007 0.1047 +vn -0.9902 -0.0749 0.1179 +vn -0.4101 -0.6702 0.6186 +vn -0.4280 -0.6759 0.6000 +vn -0.3807 0.0302 0.9242 +vn -0.3779 0.0304 0.9254 +vn -0.4403 0.7647 0.4706 +vn -0.4215 0.7844 0.4550 +vn -0.4863 0.8725 0.0485 +vn -0.4884 0.8712 0.0491 +vn -0.5643 0.6063 -0.5604 +vn -0.5621 0.6049 -0.5640 +vn -0.5918 -0.0276 -0.8056 +vn -0.5944 -0.0274 -0.8037 +vn -0.5764 -0.3838 -0.7214 +vn -0.5828 -0.3766 -0.7201 +vn -0.5217 -0.8119 -0.2620 +vn -0.5206 -0.8125 -0.2622 +vn -0.5749 -0.5464 -0.6090 +vn -0.5777 -0.5426 -0.6098 +vn -0.4889 -0.8688 0.0783 +vn -0.4862 -0.8703 0.0784 +vn -0.3868 -0.4254 0.8181 +vn -0.3979 -0.4287 0.8111 +vn -0.3678 0.0075 0.9299 +vn -0.3742 0.0071 0.9273 +vn -0.4103 0.6949 0.5906 +vn -0.4012 0.7021 0.5884 +vn -0.4913 0.8664 -0.0897 +vn -0.4930 0.8655 -0.0891 +vn -0.5804 0.4475 -0.6804 +vn -0.5690 0.4376 -0.6963 +vn -0.5998 -0.0205 -0.7999 +vn -0.5964 -0.0208 -0.8024 +vn -0.0919 0.9915 -0.0919 +vn -0.0000 1.0000 0.0000 +vn -0.0805 0.9967 0.0118 +vn -0.0111 0.9826 0.1855 +vn -0.0097 0.9927 0.1199 +vn 0.0023 0.9883 0.1528 +vn -0.0047 0.9880 0.1544 +vn -0.0045 0.9883 0.1526 +vn -0.0360 0.9756 0.2168 +vn -0.0592 0.9957 -0.0707 +vn 0.0095 0.9881 0.1533 +vn -0.0164 0.9877 0.1554 +vn -0.0376 0.9603 0.2764 +vn -0.0560 0.9980 0.0303 +vn 0.9502 0.3078 0.0492 +vn 0.9792 0.2031 0.0000 +vn -0.0269 0.3311 -0.9432 +vn -0.0289 0.3123 -0.9495 +vn -0.9784 0.2043 0.0327 +vn -0.9467 0.3221 -0.0000 +vn -0.0028 0.0341 0.9994 +vn -0.0033 0.0353 0.9994 +vn 0.0000 0.0872 -0.9962 +vn 0.0001 0.1040 -0.9946 +vn -0.0043 0.0743 -0.9972 +vn -0.0133 0.1216 -0.9925 +vn 0.0001 0.0878 -0.9961 +vn 0.0000 0.0879 -0.9961 +vn -0.0000 -1.0000 0.0000 +vn 0.0000 0.9840 -0.1783 +vn -0.0011 0.9834 -0.1817 +vn 0.0007 -0.7958 0.6055 +vn 0.1476 -0.9862 0.0750 +vn -0.1458 0.8750 0.4617 +vn -0.0014 0.3366 0.9416 +vn 0.0026 0.2837 0.9589 +vn 0.0016 0.1980 0.9802 +vn -0.0031 0.1974 0.9803 +vn -0.0003 0.1608 0.9870 +vn -0.0124 0.3601 0.9328 +vn -0.0166 0.3630 0.9316 +vn 0.0023 0.1735 0.9848 +vn 0.0083 0.1789 0.9838 +vn -0.0028 -0.2949 0.9555 +vn 0.0065 0.4217 0.9067 +vn -1.0000 -0.0000 -0.0001 +vn 0.6799 0.1702 0.7133 +vn 0.6979 0.1612 0.6979 +vn 0.6604 0.4518 -0.5997 +vn 0.6414 0.4208 -0.6414 +vn -0.6688 0.4210 -0.6128 +vn -0.6310 0.4514 -0.6310 +vn -0.6821 0.1586 0.7138 +vn -0.6965 0.1729 0.6965 +vn -0.3159 0.3760 -0.8711 +vn -0.3283 0.7522 -0.5713 +vn 0.0308 -0.9591 -0.2812 +vn 0.0301 -0.9550 -0.2949 +vn -0.0112 0.3711 0.9285 +vn -0.4044 0.9127 0.0589 +vn -0.3477 0.9376 0.0067 +vn -0.0312 0.9641 0.2638 +vn -0.6709 0.7409 -0.0308 +vn -0.4649 0.8850 -0.0272 +vn -0.4396 0.8127 -0.3825 +vn -0.6066 0.6962 -0.3837 +vn 0.0313 -0.8300 0.5568 +vn 0.0265 -0.8248 0.5648 +vn 0.0129 -0.8282 0.5603 +vn -0.0322 0.9993 -0.0177 +vn -0.0325 0.9989 -0.0348 +vn -0.0605 0.9978 -0.0274 +vn -0.1193 0.9927 -0.0202 +vn -0.2165 0.2743 -0.9370 +vn -0.0621 0.3783 0.9236 +vn -0.0650 0.3703 0.9266 +vn 0.0689 -0.9962 0.0529 +vn 0.0422 -0.9989 0.0185 +vn -0.3072 0.7317 -0.6085 +vn -0.9216 0.0077 -0.3881 +vn -0.7899 0.4314 -0.4358 +vn -0.7976 0.1639 -0.5804 +vn -0.4950 0.3600 -0.7908 +vn -0.8831 0.4175 -0.2141 +vn -0.6190 0.2169 -0.7549 +vn -0.5842 0.0299 -0.8111 +vn 0.0032 -0.0179 0.9998 +vn 0.0302 -0.9994 0.0185 +vn 0.0203 -0.6025 0.7979 +vn 0.0196 -0.6210 0.7836 +vn 0.0934 -0.9919 -0.0860 +vn -0.6456 -0.2323 -0.7275 +vn -0.7443 0.0000 -0.6678 +vn -0.0505 -0.8880 -0.4571 +vn 0.0000 0.9838 -0.1790 +vn -0.0200 -0.9998 -0.0000 +vn -0.1742 0.0000 -0.9847 +vn -0.1742 -0.0000 -0.9847 +vn -0.1600 -0.3956 -0.9044 +vn -0.0761 -0.5068 -0.8587 +vn 0.0000 0.9428 -0.3334 +vn 0.0000 0.9428 -0.3333 +vn -0.0213 0.9517 -0.3064 +vn -0.1485 -0.9889 0.0000 +vn -0.1485 -0.9889 -0.0000 +vn 0.0000 0.9556 -0.2945 +vn -0.0059 0.9519 -0.3064 +vn -0.0000 0.0000 1.0000 +vn -0.8036 0.2856 -0.5221 +vn -0.4613 0.8100 -0.3620 +vn -0.2594 0.7870 -0.5597 +vn -0.4500 0.2487 -0.8577 +vn -0.9427 0.3325 -0.0291 +vn -0.5400 0.8385 -0.0732 +vn -0.8036 0.3719 0.4646 +vn -0.4616 0.8605 0.2155 +vn -0.4500 0.3939 0.8015 +vn -0.2593 0.8720 0.4152 +vn 0.0000 0.4002 0.9164 +vn -0.0000 0.8755 0.4832 +vn -0.4656 -0.2740 -0.8415 +vn -0.8327 -0.2513 -0.4934 +vn -0.9772 -0.2114 0.0190 +vn -0.8318 -0.1647 0.5301 +vn -0.4647 -0.1289 0.8761 +vn 0.0000 -0.1158 0.9933 +vn -0.7686 -0.4595 -0.4450 +vn -0.4289 -0.4717 -0.7704 +vn -0.9030 -0.4282 0.0362 +vn -0.7673 -0.3816 0.5153 +vn -0.4277 -0.3414 0.8370 +vn 0.0000 -0.3261 0.9453 +vn 0.0000 0.7783 -0.6279 +vn 0.0000 0.9944 -0.1061 +vn 0.8708 0.2730 -0.4089 +vn 0.8722 0.4822 0.0821 +vn 0.0000 0.2350 -0.9720 +vn -0.0000 -0.2808 -0.9598 +vn 0.0000 -0.4740 -0.8805 +vn 0.8036 0.2856 -0.5221 +vn 0.4500 0.2487 -0.8577 +vn 0.2594 0.7870 -0.5597 +vn 0.4613 0.8100 -0.3620 +vn 0.9427 0.3325 -0.0291 +vn 0.5400 0.8385 -0.0732 +vn 0.8036 0.3719 0.4646 +vn 0.4616 0.8605 0.2155 +vn 0.4500 0.3939 0.8015 +vn 0.2593 0.8720 0.4152 +vn 0.8327 -0.2513 -0.4934 +vn 0.4656 -0.2740 -0.8415 +vn 0.9772 -0.2114 0.0190 +vn 0.8318 -0.1647 0.5301 +vn 0.4647 -0.1289 0.8761 +vn 0.7686 -0.4595 -0.4450 +vn 0.4289 -0.4717 -0.7704 +vn 0.9030 -0.4282 0.0362 +vn 0.7673 -0.3816 0.5153 +vn 0.4277 -0.3414 0.8370 +vn -0.8708 0.2730 -0.4089 +vn -0.8722 0.4822 0.0821 +vn -0.8500 -0.0459 -0.5248 +vn -0.4733 -0.0768 -0.8775 +vn -0.8500 0.0459 0.5248 +vn -0.4733 0.0768 0.8775 +vn 0.0000 0.0872 0.9962 +vn -0.0000 0.0872 0.9962 +vn 0.0000 -0.0872 -0.9962 +vn -0.0000 -0.0872 -0.9962 +vn 0.4733 -0.0768 -0.8775 +vn 0.8500 -0.0459 -0.5248 +vn 0.8500 0.0459 0.5248 +vn 0.4733 0.0768 0.8775 +vn -0.8036 -0.2856 -0.5221 +vn -0.4500 -0.2487 -0.8577 +vn -0.2594 -0.7870 -0.5597 +vn -0.4613 -0.8100 -0.3620 +vn -0.9427 -0.3325 -0.0291 +vn -0.5400 -0.8385 -0.0732 +vn -0.8036 -0.3719 0.4646 +vn -0.4616 -0.8605 0.2155 +vn -0.4500 -0.3939 0.8015 +vn -0.2593 -0.8720 0.4152 +vn 0.0000 -0.8755 0.4832 +vn -0.0000 -0.4002 0.9164 +vn -0.8327 0.2513 -0.4934 +vn -0.4656 0.2740 -0.8415 +vn -0.9772 0.2114 0.0190 +vn -0.8318 0.1648 0.5301 +vn -0.4647 0.1289 0.8761 +vn -0.0000 0.1158 0.9933 +vn -0.7686 0.4595 -0.4450 +vn -0.4289 0.4717 -0.7704 +vn -0.9030 0.4282 0.0362 +vn -0.7673 0.3816 0.5153 +vn -0.4277 0.3414 0.8370 +vn 0.0000 0.3261 0.9453 +vn -0.0000 -0.7783 -0.6279 +vn 0.0000 -0.9943 -0.1062 +vn 0.8708 -0.2731 -0.4088 +vn 0.8721 -0.4825 0.0819 +vn 0.0000 -0.2350 -0.9720 +vn 0.0000 0.2808 -0.9598 +vn 0.0000 0.4740 -0.8805 +vn 0.8036 -0.2856 -0.5221 +vn 0.4613 -0.8100 -0.3620 +vn 0.2594 -0.7870 -0.5597 +vn 0.4500 -0.2487 -0.8577 +vn 0.9427 -0.3325 -0.0291 +vn 0.5400 -0.8385 -0.0732 +vn 0.8036 -0.3719 0.4646 +vn 0.4616 -0.8605 0.2155 +vn 0.4500 -0.3939 0.8015 +vn 0.2593 -0.8720 0.4152 +vn 0.4656 0.2740 -0.8415 +vn 0.8327 0.2513 -0.4934 +vn 0.9772 0.2114 0.0190 +vn 0.8318 0.1647 0.5301 +vn 0.4647 0.1289 0.8761 +vn 0.7686 0.4595 -0.4450 +vn 0.4289 0.4717 -0.7704 +vn 0.9030 0.4282 0.0362 +vn 0.7673 0.3816 0.5153 +vn 0.4277 0.3414 0.8370 +vn -0.8708 -0.2731 -0.4088 +vn -0.8721 -0.4825 0.0819 +vn -0.8500 0.0459 -0.5248 +vn -0.4733 0.0768 -0.8775 +vn -0.8500 -0.0459 0.5248 +vn -0.4733 -0.0768 0.8775 +vn -0.0000 -0.0872 0.9962 +vn 0.4733 0.0768 -0.8775 +vn 0.8500 0.0459 -0.5248 +vn 0.8500 -0.0459 0.5248 +vn 0.4733 -0.0768 0.8775 +vn 0.0000 0.5000 0.8660 +vn 0.0000 1.0000 -0.0000 +vn -0.0000 -0.5000 0.8660 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 -0.5000 -0.8660 +vn 0.0000 0.5000 -0.8660 +vn 0.0000 -0.5000 -0.8660 +vn 0.6497 0.6184 0.4421 +vn 0.7072 0.7070 0.0002 +vn -0.3191 0.9080 -0.2715 +vn -0.2252 0.7598 -0.6098 +vn -0.5093 0.8395 -0.1894 +vn -0.5083 0.8385 0.1961 +vn 0.3903 0.8882 0.2425 +vn -0.6957 0.0773 -0.7141 +vn -0.4429 0.4895 -0.7512 +vn -0.7230 0.6332 -0.2764 +vn -0.7262 0.6240 0.2887 +vn -0.2043 0.7517 0.6270 +vn -0.4117 0.4626 0.7852 +vn 0.3762 0.1729 0.9103 +vn 0.1900 0.7033 0.6850 +vn 0.5669 0.7512 0.3382 +vn 0.8363 -0.0000 0.5482 +vn 0.8851 0.1519 0.4400 +vn -0.7039 0.7074 -0.0640 +vn -0.9958 0.0099 -0.0912 +vn 0.7301 0.6834 0.0004 +vn 0.0000 -1.0000 -0.0006 +vn -0.3902 0.8882 0.2425 +vn 0.5083 0.8385 0.1961 +vn 0.5093 0.8395 -0.1894 +vn -0.6497 0.6184 0.4421 +vn 0.2252 0.7598 -0.6098 +vn 0.3191 0.9080 -0.2715 +vn -0.7072 0.7070 0.0002 +vn 0.4429 0.4895 -0.7512 +vn 0.6957 0.0773 -0.7141 +vn 0.7262 0.6240 0.2887 +vn 0.7230 0.6332 -0.2764 +vn 0.2043 0.7517 0.6270 +vn -0.1900 0.7033 0.6850 +vn -0.3762 0.1729 0.9103 +vn 0.4117 0.4626 0.7852 +vn -0.5669 0.7512 0.3382 +vn -0.8363 -0.0000 0.5482 +vn -0.8851 0.1519 0.4400 +vn 0.9958 0.0099 -0.0912 +vn 0.7039 0.7074 -0.0640 +vn -0.7301 0.6834 0.0004 +vn -0.0000 -1.0000 -0.0006 +# 824 vertex normals + +vt 0.6403 0.9703 0.0000 +vt 0.6403 0.8683 0.0000 +vt 0.8363 0.8674 0.0000 +vt 0.8365 0.9695 0.0000 +vt 0.0167 0.7528 0.0000 +vt 0.1869 0.7528 0.0000 +vt 0.1869 0.5577 0.0000 +vt 0.0377 0.5577 0.0000 +vt 0.0291 0.5674 0.0000 +vt 0.6461 0.3166 0.0000 +vt 0.6461 0.3647 0.0000 +vt 0.7540 0.3647 0.0000 +vt 0.7496 0.3647 0.0000 +vt 0.7496 0.3166 0.0000 +vt 0.2974 0.2615 0.0000 +vt 0.2898 0.1086 0.0000 +vt 0.4150 0.1086 0.0000 +vt 0.4150 0.2660 0.0000 +vt 0.4250 0.5248 0.0000 +vt 0.3111 0.5248 0.0000 +vt 0.3112 0.3118 0.0000 +vt 0.4250 0.3117 0.0000 +vt 0.4043 0.7528 0.0000 +vt 0.5630 0.7528 0.0000 +vt 0.5603 0.5568 0.0000 +vt 0.4043 0.5573 0.0000 +vt 0.5266 0.2673 0.0000 +vt 0.5266 0.1277 0.0000 +vt 0.6382 0.1469 0.0000 +vt 0.6278 0.2685 0.0000 +vt 0.6366 0.5248 0.0000 +vt 0.5336 0.5248 0.0000 +vt 0.6366 0.3787 0.0000 +vt 0.2956 0.7528 0.0000 +vt 0.2956 0.5574 0.0000 +vt 0.6403 0.7752 0.0000 +vt 0.8273 0.7775 0.0000 +vt 0.8988 0.0422 0.0000 +vt 0.8984 0.0808 0.0000 +vt 0.7856 0.0808 0.0000 +vt 0.7867 0.0422 0.0000 +vt 0.4365 0.1022 0.0000 +vt 0.4315 0.0972 0.0000 +vt 0.4312 0.0348 0.0000 +vt 0.4352 0.0302 0.0000 +vt 0.5641 0.0353 0.0000 +vt 0.5925 0.1071 0.0000 +vt 0.0141 0.1008 0.0000 +vt 0.0259 0.0155 0.0000 +vt 0.0386 0.0002 0.0000 +vt 0.1919 0.0002 0.0000 +vt 0.1668 0.1015 0.0000 +vt 0.2395 0.2462 0.0000 +vt 0.2062 0.1800 0.0000 +vt 0.2412 0.5248 0.0000 +vt 0.2420 0.3792 0.0000 +vt 0.5752 0.7528 0.0000 +vt 0.6683 0.7528 0.0000 +vt 0.6653 0.6057 0.0000 +vt 0.6650 0.5947 0.0000 +vt 0.5734 0.5565 0.0000 +vt 0.5336 0.3116 0.0000 +vt 0.5690 0.0405 0.0000 +vt 0.5947 0.1042 0.0000 +vt 0.1729 0.1648 0.0000 +vt 0.1898 0.1690 0.0000 +vt 0.1281 0.1624 0.0000 +vt 0.0419 0.2042 0.0000 +vt 0.0097 0.2041 0.0000 +vt 0.0653 0.1726 0.0000 +vt -0.0000 0.5248 0.0000 +vt 0.0642 0.3773 0.0000 +vt 0.2419 0.3118 0.0000 +vt 0.5534 0.8310 0.0000 +vt 0.5534 0.7592 0.0000 +vt 0.6204 0.7592 0.0000 +vt 0.6204 0.8310 0.0000 +vt 0.5534 0.8575 0.0000 +vt 0.5534 0.8460 0.0000 +vt 0.6204 0.8575 0.0000 +vt 0.5534 0.9461 0.0000 +vt 0.5534 0.9022 0.0000 +vt 0.6204 0.9461 0.0000 +vt 0.5534 0.9584 0.0000 +vt 0.6204 0.9584 0.0000 +vt 0.5534 0.9878 0.0000 +vt 0.6204 0.9878 0.0000 +vt 0.4178 0.9779 0.0000 +vt 0.4933 0.9779 0.0000 +vt 0.4933 0.9082 0.0000 +vt 0.4180 0.9081 0.0000 +vt 0.8487 0.1933 0.0000 +vt 0.8293 0.1953 0.0000 +vt 0.8182 0.1753 0.0000 +vt 0.8422 0.1529 0.0000 +vt 0.6382 0.1469 0.0000 +vt 0.6758 0.1763 0.0000 +vt 0.6918 0.1644 0.0000 +vt 0.6656 0.1186 0.0000 +vt 0.6368 0.1121 0.0000 +vt 0.6303 0.1031 0.0000 +vt 0.6958 0.1039 0.0000 +vt 0.8064 0.1680 0.0000 +vt 0.8022 0.1385 0.0000 +vt 0.0168 0.9756 0.0000 +vt -0.0000 0.9756 0.0000 +vt 0.0000 0.9086 0.0000 +vt 0.0168 0.9086 0.0000 +vt 0.0301 0.9756 0.0000 +vt 0.0301 0.9086 0.0000 +vt 0.0876 0.9756 0.0000 +vt 0.0876 0.9086 0.0000 +vt 0.1340 0.9756 0.0000 +vt 0.1340 0.9086 0.0000 +vt 0.2600 0.9756 0.0000 +vt 0.1481 0.9756 0.0000 +vt 0.1481 0.9086 0.0000 +vt 0.2600 0.9086 0.0000 +vt 0.6366 0.3116 0.0000 +vt 0.8391 0.3787 0.0000 +vt 0.8391 0.5248 0.0000 +vt 0.9901 0.5479 0.0000 +vt 0.9739 0.7338 0.0000 +vt 0.9894 0.7348 0.0000 +vt 0.9639 0.7268 0.0000 +vt 0.9222 0.6407 0.0000 +vt 0.9375 0.6807 0.0000 +vt 0.9251 0.6281 0.0000 +vt -0.0000 0.7528 0.0000 +vt 0.0143 0.5660 0.0000 +vt 0.8206 0.1961 0.0000 +vt 0.8123 0.1811 0.0000 +vt 0.8005 0.1744 0.0000 +vt 0.7416 0.1695 0.0000 +vt 0.7415 0.1616 0.0000 +vt 0.6941 0.1729 0.0000 +vt 0.6827 0.1817 0.0000 +vt 0.6324 0.2835 0.0000 +vt 0.5266 0.2827 0.0000 +vt 0.4150 0.2818 0.0000 +vt 0.2982 0.2773 0.0000 +vt 0.2314 0.2529 0.0000 +vt 0.1978 0.1882 0.0000 +vt 0.1845 0.1804 0.0000 +vt 0.1744 0.1744 0.0000 +vt 0.0778 0.1633 0.0000 +vt 0.1284 0.1741 0.0000 +vt 0.0833 0.1738 0.0000 +vt 0.0723 0.1799 0.0000 +vt 0.0549 0.2041 0.0000 +vt 0.6655 0.1477 0.0000 +vt 0.6570 0.1478 0.0000 +vt 0.6381 0.1321 0.0000 +vt 0.3667 0.7651 0.0000 +vt 0.4321 0.7775 0.0000 +vt 0.4306 0.7668 0.0000 +vt 0.4936 0.7664 0.0000 +vt 0.4938 0.7893 0.0000 +vt 0.5264 0.7977 0.0000 +vt 0.5238 0.7673 0.0000 +vt 0.8509 0.3241 0.0000 +vt 0.8184 0.3193 0.0000 +vt 0.8184 0.3653 0.0000 +vt 0.8509 0.3661 0.0000 +vt 0.6656 0.1186 0.0000 +vt 0.7445 0.1118 0.0000 +vt 0.7410 0.1227 0.0000 +vt 0.8034 0.1329 0.0000 +vt 0.8067 0.1266 0.0000 +vt 0.8562 0.1456 0.0000 +vt 0.8477 0.1482 0.0000 +vt 0.8093 0.3166 0.0000 +vt 0.8093 0.3647 0.0000 +vt 0.6570 0.1478 0.0000 +vt 0.6655 0.1477 0.0000 +vt 0.7388 0.1262 0.0000 +vt 0.6811 0.3050 0.0000 +vt 0.6736 0.2808 0.0000 +vt 0.6802 0.2818 0.0000 +vt 0.6771 0.2557 0.0000 +vt 0.6837 0.2566 0.0000 +vt 0.6786 0.2447 0.0000 +vt 0.6832 0.2454 0.0000 +vt 0.6820 0.2211 0.0000 +vt 0.3014 0.8302 0.0000 +vt 0.3014 0.9779 0.0000 +vt 0.3607 0.9779 0.0000 +vt 0.3609 0.8270 0.0000 +vt 0.3539 0.8212 0.0000 +vt 0.3538 0.7849 0.0000 +vt 0.2964 0.7750 0.0000 +vt 0.3050 0.8250 0.0000 +vt 0.6320 0.0908 0.0000 +vt 0.6908 0.0969 0.0000 +vt 0.2972 0.8193 0.0000 +vt 0.2978 0.8301 0.0000 +vt 0.3616 0.7842 0.0000 +vt 0.5958 0.1119 0.0000 +vt 0.6024 0.1049 0.0000 +vt 0.5749 0.0349 0.0000 +vt 0.5662 0.0303 0.0000 +vt 0.5751 0.0124 0.0000 +vt 0.5866 0.0186 0.0000 +vt 0.4337 0.0256 0.0000 +vt 0.4255 0.0315 0.0000 +vt 0.4250 0.1009 0.0000 +vt 0.4321 0.1069 0.0000 +vt 0.4150 0.0047 0.0000 +vt 0.3836 0.1055 0.0000 +vt 0.3972 0.0985 0.0000 +vt 0.3989 0.0328 0.0000 +vt 0.3917 0.0240 0.0000 +vt 0.2563 0.0223 0.0000 +vt 0.3034 0.0024 0.0000 +vt 0.2485 0.0283 0.0000 +vt 0.2386 0.0937 0.0000 +vt 0.2478 0.1044 0.0000 +vt 0.2511 0.0984 0.0000 +vt 0.2437 0.0908 0.0000 +vt 0.2534 0.0317 0.0000 +vt 0.2575 0.0277 0.0000 +vt 0.3873 0.0942 0.0000 +vt 0.3798 0.1015 0.0000 +vt 0.3868 0.0299 0.0000 +vt 0.3910 0.0356 0.0000 +vt 0.8595 0.4519 0.0000 +vt 0.8493 0.4597 0.0000 +vt 0.8493 0.5213 0.0000 +vt 0.8595 0.5292 0.0000 +vt 0.9190 0.5292 0.0000 +vt 0.9292 0.5213 0.0000 +vt 0.9292 0.4597 0.0000 +vt 0.9190 0.4519 0.0000 +vt 0.8008 0.3251 0.0000 +vt 0.8008 0.3562 0.0000 +vt 0.7498 0.3168 0.0000 +vt 0.7571 0.3204 0.0000 +vt 0.7963 0.3204 0.0000 +vt 0.7527 0.3562 0.0000 +vt 0.7527 0.3251 0.0000 +vt 0.7963 0.3609 0.0000 +vt 0.7571 0.3609 0.0000 +vt 0.8620 0.8530 0.0000 +vt 0.8620 0.8213 0.0000 +vt 0.8704 0.8213 0.0000 +vt 0.8704 0.8530 0.0000 +vt 0.8620 0.8140 0.0000 +vt 0.8620 0.7709 0.0000 +vt 0.8704 0.7709 0.0000 +vt 0.8704 0.8140 0.0000 +vt 0.8620 0.9537 0.0000 +vt 0.8620 0.9220 0.0000 +vt 0.8704 0.9220 0.0000 +vt 0.8704 0.9537 0.0000 +vt 0.8620 0.9034 0.0000 +vt 0.8620 0.8603 0.0000 +vt 0.8704 0.8603 0.0000 +vt 0.8704 0.9034 0.0000 +vt 0.7535 0.0801 0.0000 +vt 0.7187 0.0802 0.0000 +vt 0.6514 0.0802 0.0000 +vt 0.6592 0.0717 0.0000 +vt 0.6592 0.0526 0.0000 +vt 0.6931 0.0461 0.0000 +vt 0.6951 0.0380 0.0000 +vt 0.7574 0.0347 0.0000 +vt 0.7520 0.0347 0.0000 +vt 0.8982 0.1113 0.0000 +vt 0.7857 0.1113 0.0000 +vt 0.7865 0.0053 0.0000 +vt 0.8990 0.0053 0.0000 +vt 0.2838 0.7721 0.0000 +vt 0.6670 0.5456 0.0000 +vt 0.4932 0.8956 0.0000 +vt 0.4716 0.7977 0.0000 +vt 0.4093 0.7888 0.0000 +vt 0.4182 0.8955 0.0000 +vt 0.5268 0.9779 0.0000 +vt 0.5268 0.8701 0.0000 +vt 0.5233 0.8080 0.0000 +vt 0.4438 0.9081 0.0000 +vt 0.4437 0.8955 0.0000 +vt 0.4311 0.8955 0.0000 +vt 0.4309 0.9081 0.0000 +vt 0.8169 0.7587 0.0000 +vt 0.7426 0.7584 0.0000 +vt 0.7541 0.7511 0.0000 +vt 0.7675 0.7499 0.0000 +vt 0.7425 0.7586 0.0000 +vt 0.8170 0.7590 0.0000 +vt 0.7676 0.7502 0.0000 +vt 0.7540 0.7513 0.0000 +vt 0.9690 0.7317 0.0000 +vt 0.9596 0.7248 0.0000 +vt 0.9244 0.6481 0.0000 +vt 0.9267 0.6231 0.0000 +vt 0.9674 0.5696 0.0000 +vt 0.9960 0.7370 0.0000 +vt 0.0041 0.2040 0.0000 +vt 0.0084 0.1008 0.0000 +vt 0.0200 0.0123 0.0000 +vt 0.0310 0.0000 0.0000 +vt 0.8620 0.9610 0.0000 +vt 0.8704 0.9610 0.0000 +vt 0.8054 0.6614 0.0000 +vt 0.7622 0.6706 0.0000 +vt 0.7561 0.5318 0.0000 +vt 0.8001 0.5318 0.0000 +vt 0.1610 0.2862 0.0000 +vt 0.1580 0.2922 0.0000 +vt 0.0046 0.2900 0.0000 +vt 0.0046 0.2839 0.0000 +vt 0.7025 0.6901 0.0000 +vt 0.6843 0.6925 0.0000 +vt 0.6806 0.6267 0.0000 +vt 0.6992 0.6251 0.0000 +vt 0.7418 0.6787 0.0000 +vt 0.7349 0.6832 0.0000 +vt 0.7323 0.6389 0.0000 +vt 0.7273 0.5318 0.0000 +vt 0.7350 0.5318 0.0000 +vt 0.7253 0.7433 0.0000 +vt 0.6985 0.7430 0.0000 +vt 0.7021 0.7247 0.0000 +vt 0.7217 0.7247 0.0000 +vt 0.1415 0.3471 0.0000 +vt 0.1332 0.3539 0.0000 +vt 0.0048 0.3516 0.0000 +vt 0.7292 0.6236 0.0000 +vt 0.7306 0.6837 0.0000 +vt 0.8206 0.6607 0.0000 +vt 0.8157 0.5318 0.0000 +vt 0.6919 0.7403 0.0000 +vt 0.1616 0.2467 0.0000 +vt 0.2094 0.2497 0.0000 +vt 0.2090 0.2765 0.0000 +vt 0.7307 0.6956 0.0000 +vt 0.8083 0.7175 0.0000 +vt 0.8067 0.7350 0.0000 +vt 0.7689 0.7333 0.0000 +vt 0.7612 0.7321 0.0000 +vt 0.8165 0.7245 0.0000 +vt 0.8107 0.7122 0.0000 +vt 0.8175 0.7176 0.0000 +vt 0.7387 0.6928 0.0000 +vt 0.7479 0.6971 0.0000 +vt 0.7286 0.7421 0.0000 +vt 0.8056 0.6723 0.0000 +vt 0.7606 0.6808 0.0000 +vt 0.7438 0.6876 0.0000 +vt 0.8148 0.6702 0.0000 +vt 0.7250 0.5318 0.0000 +vt 0.8683 0.3506 0.0000 +vt 0.8679 0.3209 0.0000 +vt 0.8850 0.3141 0.0000 +vt 0.8818 0.3506 0.0000 +vt 0.8654 0.4412 0.0000 +vt 0.8789 0.4412 0.0000 +vt 0.0964 0.2458 0.0000 +vt 0.0046 0.2804 0.0000 +vt 0.0956 0.2817 0.0000 +vt 0.2528 0.8311 0.0000 +vt 0.2383 0.8309 0.0000 +vt 0.1965 0.8119 0.0000 +vt 0.1970 0.7789 0.0000 +vt 0.2718 0.7800 0.0000 +vt 0.0000 0.8873 0.0000 +vt -0.0000 0.8765 0.0000 +vt 0.1339 0.8761 0.0000 +vt 0.1339 0.8869 0.0000 +vt 0.0000 0.8088 0.0000 +vt 0.1337 0.8110 0.0000 +vt 0.8416 0.7404 0.0000 +vt 0.8415 0.6051 0.0000 +vt 0.8487 0.6051 0.0000 +vt 0.0001 0.7760 0.0000 +vt 0.1342 0.7780 0.0000 +vt 0.1421 0.8719 0.0000 +vt 0.2035 0.8572 0.0000 +vt 0.2068 0.8714 0.0000 +vt 0.1449 0.8836 0.0000 +vt 0.8618 0.5427 0.0000 +vt 0.9167 0.5427 0.0000 +vt 0.9167 0.5644 0.0000 +vt 0.9167 0.6051 0.0000 +vt 0.2620 0.8900 0.0000 +vt 0.2634 0.8846 0.0000 +vt 0.2728 0.8869 0.0000 +vt 0.2704 0.8921 0.0000 +vt 0.2281 0.8501 0.0000 +vt 0.9167 0.7404 0.0000 +vt 0.8604 0.2729 0.0000 +vt 0.8170 0.2791 0.0000 +vt 0.8170 0.2978 0.0000 +vt 0.8822 0.2978 0.0000 +vt 0.8917 0.2440 0.0000 +vt 0.8623 0.2440 0.0000 +vt 0.8944 0.1272 0.0000 +vt 0.8700 0.1272 0.0000 +vt 0.6403 0.9703 0.0000 +vt 0.8365 0.9695 0.0000 +vt 0.8363 0.8674 0.0000 +vt 0.6403 0.8683 0.0000 +vt 0.0167 0.7528 0.0000 +vt 0.0291 0.5674 0.0000 +vt 0.0377 0.5577 0.0000 +vt 0.1869 0.5577 0.0000 +vt 0.1869 0.7528 0.0000 +vt 0.6461 0.3166 0.0000 +vt 0.7496 0.3166 0.0000 +vt 0.7496 0.3647 0.0000 +vt 0.7540 0.3647 0.0000 +vt 0.6461 0.3647 0.0000 +vt 0.2974 0.2615 0.0000 +vt 0.4150 0.2660 0.0000 +vt 0.4150 0.1086 0.0000 +vt 0.2898 0.1086 0.0000 +vt 0.4250 0.5248 0.0000 +vt 0.4250 0.3117 0.0000 +vt 0.3112 0.3118 0.0000 +vt 0.3111 0.5248 0.0000 +vt 0.4043 0.7528 0.0000 +vt 0.4043 0.5573 0.0000 +vt 0.5603 0.5568 0.0000 +vt 0.5630 0.7528 0.0000 +vt 0.5266 0.2673 0.0000 +vt 0.6278 0.2685 0.0000 +vt 0.6382 0.1469 0.0000 +vt 0.5266 0.1277 0.0000 +vt 0.6366 0.5248 0.0000 +vt 0.6366 0.3787 0.0000 +vt 0.5336 0.5248 0.0000 +vt 0.2956 0.5574 0.0000 +vt 0.2956 0.7528 0.0000 +vt 0.8273 0.7775 0.0000 +vt 0.6403 0.7752 0.0000 +vt 0.8988 0.0422 0.0000 +vt 0.7867 0.0422 0.0000 +vt 0.7856 0.0808 0.0000 +vt 0.8984 0.0808 0.0000 +vt 0.4365 0.1022 0.0000 +vt 0.5925 0.1071 0.0000 +vt 0.5641 0.0353 0.0000 +vt 0.4352 0.0302 0.0000 +vt 0.4312 0.0348 0.0000 +vt 0.4315 0.0972 0.0000 +vt 0.0141 0.1008 0.0000 +vt 0.1668 0.1015 0.0000 +vt 0.1919 0.0002 0.0000 +vt 0.0386 0.0002 0.0000 +vt 0.0259 0.0155 0.0000 +vt 0.2395 0.2462 0.0000 +vt 0.2062 0.1800 0.0000 +vt 0.2420 0.3792 0.0000 +vt 0.2412 0.5248 0.0000 +vt 0.5752 0.7528 0.0000 +vt 0.5734 0.5565 0.0000 +vt 0.6650 0.5947 0.0000 +vt 0.6653 0.6057 0.0000 +vt 0.6683 0.7528 0.0000 +vt 0.5336 0.3116 0.0000 +vt 0.5690 0.0405 0.0000 +vt 0.5947 0.1042 0.0000 +vt 0.1729 0.1648 0.0000 +vt 0.1898 0.1690 0.0000 +vt 0.1281 0.1624 0.0000 +vt 0.0419 0.2042 0.0000 +vt 0.0653 0.1726 0.0000 +vt 0.0097 0.2041 0.0000 +vt 0.0642 0.3773 0.0000 +vt -0.0000 0.5248 0.0000 +vt 0.2419 0.3118 0.0000 +vt 0.5534 0.8310 0.0000 +vt 0.6204 0.8310 0.0000 +vt 0.6204 0.7592 0.0000 +vt 0.5534 0.7592 0.0000 +vt 0.5534 0.8575 0.0000 +vt 0.6204 0.8575 0.0000 +vt 0.5534 0.8460 0.0000 +vt 0.5534 0.9461 0.0000 +vt 0.6204 0.9461 0.0000 +vt 0.5534 0.9022 0.0000 +vt 0.5534 0.9584 0.0000 +vt 0.6204 0.9584 0.0000 +vt 0.5534 0.9878 0.0000 +vt 0.6204 0.9878 0.0000 +vt 0.4178 0.9779 0.0000 +vt 0.4180 0.9081 0.0000 +vt 0.4933 0.9082 0.0000 +vt 0.4933 0.9779 0.0000 +vt 0.8487 0.1933 0.0000 +vt 0.8422 0.1529 0.0000 +vt 0.8182 0.1753 0.0000 +vt 0.8293 0.1953 0.0000 +vt 0.6758 0.1763 0.0000 +vt 0.6382 0.1469 0.0000 +vt 0.6918 0.1644 0.0000 +vt 0.6656 0.1186 0.0000 +vt 0.6958 0.1039 0.0000 +vt 0.6303 0.1031 0.0000 +vt 0.6368 0.1121 0.0000 +vt 0.8064 0.1680 0.0000 +vt 0.8022 0.1385 0.0000 +vt 0.0168 0.9756 0.0000 +vt 0.0168 0.9086 0.0000 +vt 0.0000 0.9086 0.0000 +vt -0.0000 0.9756 0.0000 +vt 0.0301 0.9756 0.0000 +vt 0.0301 0.9086 0.0000 +vt 0.0876 0.9756 0.0000 +vt 0.0876 0.9086 0.0000 +vt 0.1340 0.9756 0.0000 +vt 0.1340 0.9086 0.0000 +vt 0.2600 0.9756 0.0000 +vt 0.2600 0.9086 0.0000 +vt 0.1481 0.9086 0.0000 +vt 0.1481 0.9756 0.0000 +vt 0.6366 0.3116 0.0000 +vt 0.8391 0.5248 0.0000 +vt 0.8391 0.3787 0.0000 +vt 0.9901 0.5479 0.0000 +vt 0.9894 0.7348 0.0000 +vt 0.9739 0.7338 0.0000 +vt 0.9639 0.7268 0.0000 +vt 0.9222 0.6407 0.0000 +vt 0.9375 0.6807 0.0000 +vt 0.9251 0.6281 0.0000 +vt -0.0000 0.7528 0.0000 +vt 0.0143 0.5660 0.0000 +vt 0.8123 0.1811 0.0000 +vt 0.8206 0.1961 0.0000 +vt 0.7415 0.1616 0.0000 +vt 0.7416 0.1695 0.0000 +vt 0.8005 0.1744 0.0000 +vt 0.6941 0.1729 0.0000 +vt 0.6827 0.1817 0.0000 +vt 0.6324 0.2835 0.0000 +vt 0.5266 0.2827 0.0000 +vt 0.4150 0.2818 0.0000 +vt 0.2982 0.2773 0.0000 +vt 0.2314 0.2529 0.0000 +vt 0.1978 0.1882 0.0000 +vt 0.1744 0.1744 0.0000 +vt 0.1845 0.1804 0.0000 +vt 0.0778 0.1633 0.0000 +vt 0.0833 0.1738 0.0000 +vt 0.1284 0.1741 0.0000 +vt 0.0723 0.1799 0.0000 +vt 0.0549 0.2041 0.0000 +vt 0.6655 0.1477 0.0000 +vt 0.6381 0.1321 0.0000 +vt 0.6570 0.1478 0.0000 +vt 0.3667 0.7651 0.0000 +vt 0.4306 0.7668 0.0000 +vt 0.4321 0.7775 0.0000 +vt 0.4936 0.7664 0.0000 +vt 0.5238 0.7673 0.0000 +vt 0.5264 0.7977 0.0000 +vt 0.4938 0.7893 0.0000 +vt 0.8509 0.3241 0.0000 +vt 0.8509 0.3661 0.0000 +vt 0.8184 0.3653 0.0000 +vt 0.8184 0.3193 0.0000 +vt 0.6656 0.1186 0.0000 +vt 0.7410 0.1227 0.0000 +vt 0.7445 0.1118 0.0000 +vt 0.8034 0.1329 0.0000 +vt 0.8477 0.1482 0.0000 +vt 0.8562 0.1456 0.0000 +vt 0.8067 0.1266 0.0000 +vt 0.8093 0.3647 0.0000 +vt 0.8093 0.3166 0.0000 +vt 0.6570 0.1478 0.0000 +vt 0.7388 0.1262 0.0000 +vt 0.6655 0.1477 0.0000 +vt 0.6811 0.3050 0.0000 +vt 0.6802 0.2818 0.0000 +vt 0.6736 0.2808 0.0000 +vt 0.6837 0.2566 0.0000 +vt 0.6771 0.2557 0.0000 +vt 0.6832 0.2454 0.0000 +vt 0.6786 0.2447 0.0000 +vt 0.6820 0.2211 0.0000 +vt 0.3014 0.8302 0.0000 +vt 0.3609 0.8270 0.0000 +vt 0.3607 0.9779 0.0000 +vt 0.3014 0.9779 0.0000 +vt 0.3539 0.8212 0.0000 +vt 0.3050 0.8250 0.0000 +vt 0.2964 0.7750 0.0000 +vt 0.3538 0.7849 0.0000 +vt 0.6908 0.0969 0.0000 +vt 0.6320 0.0908 0.0000 +vt 0.2972 0.8193 0.0000 +vt 0.2978 0.8301 0.0000 +vt 0.3616 0.7842 0.0000 +vt 0.5958 0.1119 0.0000 +vt 0.5866 0.0186 0.0000 +vt 0.5751 0.0124 0.0000 +vt 0.5662 0.0303 0.0000 +vt 0.5749 0.0349 0.0000 +vt 0.6024 0.1049 0.0000 +vt 0.4337 0.0256 0.0000 +vt 0.4150 0.0047 0.0000 +vt 0.4321 0.1069 0.0000 +vt 0.4250 0.1009 0.0000 +vt 0.4255 0.0315 0.0000 +vt 0.3836 0.1055 0.0000 +vt 0.3034 0.0024 0.0000 +vt 0.2563 0.0223 0.0000 +vt 0.3917 0.0240 0.0000 +vt 0.3989 0.0328 0.0000 +vt 0.3972 0.0985 0.0000 +vt 0.2478 0.1044 0.0000 +vt 0.2386 0.0937 0.0000 +vt 0.2485 0.0283 0.0000 +vt 0.2511 0.0984 0.0000 +vt 0.2575 0.0277 0.0000 +vt 0.2534 0.0317 0.0000 +vt 0.2437 0.0908 0.0000 +vt 0.3873 0.0942 0.0000 +vt 0.3910 0.0356 0.0000 +vt 0.3868 0.0299 0.0000 +vt 0.3798 0.1015 0.0000 +vt 0.8595 0.4519 0.0000 +vt 0.9190 0.4519 0.0000 +vt 0.9292 0.4597 0.0000 +vt 0.9292 0.5213 0.0000 +vt 0.9190 0.5292 0.0000 +vt 0.8595 0.5292 0.0000 +vt 0.8493 0.5213 0.0000 +vt 0.8493 0.4597 0.0000 +vt 0.8008 0.3562 0.0000 +vt 0.8008 0.3251 0.0000 +vt 0.7963 0.3204 0.0000 +vt 0.7571 0.3204 0.0000 +vt 0.7498 0.3168 0.0000 +vt 0.7527 0.3251 0.0000 +vt 0.7527 0.3562 0.0000 +vt 0.7571 0.3609 0.0000 +vt 0.7963 0.3609 0.0000 +vt 0.8620 0.8530 0.0000 +vt 0.8704 0.8530 0.0000 +vt 0.8704 0.8213 0.0000 +vt 0.8620 0.8213 0.0000 +vt 0.8620 0.8140 0.0000 +vt 0.8704 0.8140 0.0000 +vt 0.8704 0.7709 0.0000 +vt 0.8620 0.7709 0.0000 +vt 0.8620 0.9537 0.0000 +vt 0.8704 0.9537 0.0000 +vt 0.8704 0.9220 0.0000 +vt 0.8620 0.9220 0.0000 +vt 0.8620 0.9034 0.0000 +vt 0.8704 0.9034 0.0000 +vt 0.8704 0.8603 0.0000 +vt 0.8620 0.8603 0.0000 +vt 0.7535 0.0801 0.0000 +vt 0.7520 0.0347 0.0000 +vt 0.7574 0.0347 0.0000 +vt 0.6951 0.0380 0.0000 +vt 0.6931 0.0461 0.0000 +vt 0.6592 0.0526 0.0000 +vt 0.6592 0.0717 0.0000 +vt 0.6514 0.0802 0.0000 +vt 0.7187 0.0802 0.0000 +vt 0.8982 0.1113 0.0000 +vt 0.7857 0.1113 0.0000 +vt 0.7865 0.0053 0.0000 +vt 0.8990 0.0053 0.0000 +vt 0.2838 0.7721 0.0000 +vt 0.6670 0.5456 0.0000 +vt 0.4932 0.8956 0.0000 +vt 0.4182 0.8955 0.0000 +vt 0.4093 0.7888 0.0000 +vt 0.4716 0.7977 0.0000 +vt 0.5268 0.8701 0.0000 +vt 0.5268 0.9779 0.0000 +vt 0.5233 0.8080 0.0000 +vt 0.4438 0.9081 0.0000 +vt 0.4309 0.9081 0.0000 +vt 0.4311 0.8955 0.0000 +vt 0.4437 0.8955 0.0000 +vt 0.8169 0.7587 0.0000 +vt 0.7675 0.7499 0.0000 +vt 0.7541 0.7511 0.0000 +vt 0.7426 0.7584 0.0000 +vt 0.7425 0.7586 0.0000 +vt 0.7540 0.7513 0.0000 +vt 0.7676 0.7502 0.0000 +vt 0.8170 0.7590 0.0000 +vt 0.9690 0.7317 0.0000 +vt 0.9267 0.6231 0.0000 +vt 0.9244 0.6481 0.0000 +vt 0.9596 0.7248 0.0000 +vt 0.9960 0.7370 0.0000 +vt 0.9674 0.5696 0.0000 +vt 0.0084 0.1008 0.0000 +vt 0.0041 0.2040 0.0000 +vt 0.0200 0.0123 0.0000 +vt 0.0310 0.0000 0.0000 +vt 0.8620 0.9610 0.0000 +vt 0.8704 0.9610 0.0000 +vt 0.8054 0.6614 0.0000 +vt 0.8001 0.5318 0.0000 +vt 0.7561 0.5318 0.0000 +vt 0.7622 0.6706 0.0000 +vt 0.1610 0.2862 0.0000 +vt 0.0046 0.2839 0.0000 +vt 0.0046 0.2900 0.0000 +vt 0.1580 0.2922 0.0000 +vt 0.7025 0.6901 0.0000 +vt 0.6992 0.6251 0.0000 +vt 0.6806 0.6267 0.0000 +vt 0.6843 0.6925 0.0000 +vt 0.7418 0.6787 0.0000 +vt 0.7350 0.5318 0.0000 +vt 0.7273 0.5318 0.0000 +vt 0.7323 0.6389 0.0000 +vt 0.7349 0.6832 0.0000 +vt 0.7253 0.7433 0.0000 +vt 0.7217 0.7247 0.0000 +vt 0.7021 0.7247 0.0000 +vt 0.6985 0.7430 0.0000 +vt 0.1415 0.3471 0.0000 +vt 0.0048 0.3516 0.0000 +vt 0.1332 0.3539 0.0000 +vt 0.7306 0.6837 0.0000 +vt 0.7292 0.6236 0.0000 +vt 0.8206 0.6607 0.0000 +vt 0.8157 0.5318 0.0000 +vt 0.6919 0.7403 0.0000 +vt 0.1616 0.2467 0.0000 +vt 0.2090 0.2765 0.0000 +vt 0.2094 0.2497 0.0000 +vt 0.7307 0.6956 0.0000 +vt 0.8083 0.7175 0.0000 +vt 0.7612 0.7321 0.0000 +vt 0.7689 0.7333 0.0000 +vt 0.8067 0.7350 0.0000 +vt 0.8165 0.7245 0.0000 +vt 0.8107 0.7122 0.0000 +vt 0.8175 0.7176 0.0000 +vt 0.7286 0.7421 0.0000 +vt 0.7479 0.6971 0.0000 +vt 0.7387 0.6928 0.0000 +vt 0.7606 0.6808 0.0000 +vt 0.8056 0.6723 0.0000 +vt 0.7438 0.6876 0.0000 +vt 0.8148 0.6702 0.0000 +vt 0.7250 0.5318 0.0000 +vt 0.8683 0.3506 0.0000 +vt 0.8818 0.3506 0.0000 +vt 0.8850 0.3141 0.0000 +vt 0.8679 0.3209 0.0000 +vt 0.8654 0.4412 0.0000 +vt 0.8789 0.4412 0.0000 +vt 0.0964 0.2458 0.0000 +vt 0.0956 0.2817 0.0000 +vt 0.0046 0.2804 0.0000 +vt 0.2528 0.8311 0.0000 +vt 0.2718 0.7800 0.0000 +vt 0.1970 0.7789 0.0000 +vt 0.1965 0.8119 0.0000 +vt 0.2383 0.8309 0.0000 +vt 0.0000 0.8873 0.0000 +vt 0.1339 0.8869 0.0000 +vt 0.1339 0.8761 0.0000 +vt -0.0000 0.8765 0.0000 +vt 0.1337 0.8110 0.0000 +vt 0.0000 0.8088 0.0000 +vt 0.8416 0.7404 0.0000 +vt 0.8487 0.6051 0.0000 +vt 0.8415 0.6051 0.0000 +vt 0.1342 0.7780 0.0000 +vt 0.0001 0.7760 0.0000 +vt 0.1421 0.8719 0.0000 +vt 0.1449 0.8836 0.0000 +vt 0.2068 0.8714 0.0000 +vt 0.2035 0.8572 0.0000 +vt 0.8618 0.5427 0.0000 +vt 0.9167 0.6051 0.0000 +vt 0.9167 0.5644 0.0000 +vt 0.9167 0.5427 0.0000 +vt 0.2620 0.8900 0.0000 +vt 0.2704 0.8921 0.0000 +vt 0.2728 0.8869 0.0000 +vt 0.2634 0.8846 0.0000 +vt 0.2281 0.8501 0.0000 +vt 0.9167 0.7404 0.0000 +vt 0.8604 0.2729 0.0000 +vt 0.8623 0.2440 0.0000 +vt 0.8917 0.2440 0.0000 +vt 0.8822 0.2978 0.0000 +vt 0.8170 0.2978 0.0000 +vt 0.8170 0.2791 0.0000 +vt 0.8700 0.1272 0.0000 +vt 0.8944 0.1272 0.0000 +vt 0.7265 0.2110 0.0000 +vt 0.7118 0.2256 0.0000 +vt 0.7065 0.2456 0.0000 +vt 0.7118 0.2656 0.0000 +vt 0.7265 0.2803 0.0000 +vt 0.7185 0.1972 0.0000 +vt 0.6980 0.2176 0.0000 +vt 0.6905 0.2456 0.0000 +vt 0.6980 0.2736 0.0000 +vt 0.7185 0.2941 0.0000 +vt 0.9862 0.9646 0.0000 +vt 0.9862 0.9458 0.0000 +vt 0.9862 0.9271 0.0000 +vt 0.9862 0.9083 0.0000 +vt 0.9862 0.8895 0.0000 +vt 0.9572 0.9646 0.0000 +vt 0.9572 0.9458 0.0000 +vt 0.9572 0.9271 0.0000 +vt 0.9572 0.9083 0.0000 +vt 0.9572 0.8895 0.0000 +vt 0.8850 0.9646 0.0000 +vt 0.8850 0.9458 0.0000 +vt 0.8850 0.9271 0.0000 +vt 0.8850 0.9083 0.0000 +vt 0.8850 0.8895 0.0000 +vt 0.7459 0.2058 0.0000 +vt 0.7459 0.2447 0.0000 +vt 0.7459 0.2453 0.0000 +vt 0.7459 0.2456 0.0000 +vt 0.7459 0.2460 0.0000 +vt 0.7459 0.2466 0.0000 +vt 0.7459 0.2855 0.0000 +vt 0.7459 0.1898 0.0000 +vt 0.9862 0.9830 0.0000 +vt 0.7459 0.3015 0.0000 +vt 0.9862 0.8711 0.0000 +vt 0.9572 0.9830 0.0000 +vt 0.9572 0.8711 0.0000 +vt 0.8850 0.9823 0.0000 +vt 0.8850 0.8719 0.0000 +vt 0.7265 0.2110 0.0000 +vt 0.7185 0.1972 0.0000 +vt 0.6980 0.2176 0.0000 +vt 0.7118 0.2256 0.0000 +vt 0.6905 0.2456 0.0000 +vt 0.7065 0.2456 0.0000 +vt 0.6980 0.2736 0.0000 +vt 0.7118 0.2656 0.0000 +vt 0.7185 0.2941 0.0000 +vt 0.7265 0.2803 0.0000 +vt 0.7459 0.3015 0.0000 +vt 0.7459 0.2855 0.0000 +vt 0.9862 0.9646 0.0000 +vt 0.9572 0.9646 0.0000 +vt 0.9572 0.9458 0.0000 +vt 0.9862 0.9458 0.0000 +vt 0.9572 0.9271 0.0000 +vt 0.9862 0.9271 0.0000 +vt 0.9572 0.9083 0.0000 +vt 0.9862 0.9083 0.0000 +vt 0.9572 0.8895 0.0000 +vt 0.9862 0.8895 0.0000 +vt 0.9572 0.8711 0.0000 +vt 0.9862 0.8711 0.0000 +vt 0.8850 0.9646 0.0000 +vt 0.8850 0.9458 0.0000 +vt 0.8850 0.9271 0.0000 +vt 0.8850 0.9083 0.0000 +vt 0.8850 0.8895 0.0000 +vt 0.8850 0.8719 0.0000 +vt 0.7459 0.2058 0.0000 +vt 0.7459 0.2447 0.0000 +vt 0.7459 0.2453 0.0000 +vt 0.7459 0.2456 0.0000 +vt 0.7459 0.2460 0.0000 +vt 0.7459 0.2466 0.0000 +vt 0.7459 0.1898 0.0000 +vt 0.9572 0.9830 0.0000 +vt 0.9862 0.9830 0.0000 +vt 0.8850 0.9823 0.0000 +vt 0.9376 0.0058 0.0000 +vt 0.9448 0.0058 0.0000 +vt 0.9448 0.3534 0.0000 +vt 0.9376 0.3534 0.0000 +vt 0.9302 0.0058 0.0000 +vt 0.9302 0.3534 0.0000 +vt 0.9228 0.0058 0.0000 +vt 0.9228 0.3534 0.0000 +vt 0.9156 0.0058 0.0000 +vt 0.9156 0.3534 0.0000 +vt 0.9090 0.0058 0.0000 +vt 0.9090 0.3534 0.0000 +vt 0.9513 0.0058 0.0000 +vt 0.9513 0.3534 0.0000 +vt 0.9579 0.0058 0.0000 +vt 0.9652 0.0058 0.0000 +vt 0.9652 0.3534 0.0000 +vt 0.9579 0.3534 0.0000 +vt 0.9726 0.0058 0.0000 +vt 0.9726 0.3534 0.0000 +vt 0.9800 0.0058 0.0000 +vt 0.9800 0.3534 0.0000 +vt 0.9871 0.0058 0.0000 +vt 0.9871 0.3534 0.0000 +vt 0.9937 0.0058 0.0000 +vt 0.9937 0.3534 0.0000 +vt 0.7265 0.2110 0.0000 +vt 0.7118 0.2256 0.0000 +vt 0.7065 0.2456 0.0000 +vt 0.7118 0.2656 0.0000 +vt 0.7265 0.2803 0.0000 +vt 0.7185 0.1972 0.0000 +vt 0.6980 0.2176 0.0000 +vt 0.6905 0.2456 0.0000 +vt 0.6980 0.2736 0.0000 +vt 0.7185 0.2941 0.0000 +vt 0.9862 0.9646 0.0000 +vt 0.9862 0.9458 0.0000 +vt 0.9862 0.9271 0.0000 +vt 0.9862 0.9083 0.0000 +vt 0.9862 0.8895 0.0000 +vt 0.9572 0.9646 0.0000 +vt 0.9572 0.9458 0.0000 +vt 0.9572 0.9271 0.0000 +vt 0.9572 0.9083 0.0000 +vt 0.9572 0.8895 0.0000 +vt 0.8850 0.9646 0.0000 +vt 0.8850 0.9458 0.0000 +vt 0.8850 0.9271 0.0000 +vt 0.8850 0.9083 0.0000 +vt 0.8850 0.8895 0.0000 +vt 0.7459 0.2058 0.0000 +vt 0.7459 0.2447 0.0000 +vt 0.7459 0.2453 0.0000 +vt 0.7459 0.2456 0.0000 +vt 0.7459 0.2460 0.0000 +vt 0.7459 0.2466 0.0000 +vt 0.7459 0.2855 0.0000 +vt 0.7459 0.1898 0.0000 +vt 0.9862 0.9830 0.0000 +vt 0.7459 0.3015 0.0000 +vt 0.9862 0.8711 0.0000 +vt 0.9572 0.9830 0.0000 +vt 0.9572 0.8711 0.0000 +vt 0.8850 0.9823 0.0000 +vt 0.8850 0.8719 0.0000 +vt 0.7265 0.2110 0.0000 +vt 0.7185 0.1972 0.0000 +vt 0.6980 0.2176 0.0000 +vt 0.7118 0.2256 0.0000 +vt 0.6905 0.2456 0.0000 +vt 0.7065 0.2456 0.0000 +vt 0.6980 0.2736 0.0000 +vt 0.7118 0.2656 0.0000 +vt 0.7185 0.2941 0.0000 +vt 0.7265 0.2803 0.0000 +vt 0.7459 0.3015 0.0000 +vt 0.7459 0.2855 0.0000 +vt 0.9862 0.9646 0.0000 +vt 0.9572 0.9646 0.0000 +vt 0.9572 0.9458 0.0000 +vt 0.9862 0.9458 0.0000 +vt 0.9572 0.9271 0.0000 +vt 0.9862 0.9271 0.0000 +vt 0.9572 0.9083 0.0000 +vt 0.9862 0.9083 0.0000 +vt 0.9572 0.8895 0.0000 +vt 0.9862 0.8895 0.0000 +vt 0.9572 0.8711 0.0000 +vt 0.9862 0.8711 0.0000 +vt 0.8850 0.9646 0.0000 +vt 0.8850 0.9458 0.0000 +vt 0.8850 0.9271 0.0000 +vt 0.8850 0.9083 0.0000 +vt 0.8850 0.8895 0.0000 +vt 0.8850 0.8719 0.0000 +vt 0.7459 0.2058 0.0000 +vt 0.7459 0.2447 0.0000 +vt 0.7459 0.2453 0.0000 +vt 0.7459 0.2456 0.0000 +vt 0.7459 0.2460 0.0000 +vt 0.7459 0.2466 0.0000 +vt 0.7459 0.1898 0.0000 +vt 0.9572 0.9830 0.0000 +vt 0.9862 0.9830 0.0000 +vt 0.8850 0.9823 0.0000 +vt 0.9376 0.0058 0.0000 +vt 0.9448 0.0058 0.0000 +vt 0.9448 0.3534 0.0000 +vt 0.9376 0.3534 0.0000 +vt 0.9302 0.0058 0.0000 +vt 0.9302 0.3534 0.0000 +vt 0.9228 0.0058 0.0000 +vt 0.9228 0.3534 0.0000 +vt 0.9156 0.0058 0.0000 +vt 0.9156 0.3534 0.0000 +vt 0.9090 0.0058 0.0000 +vt 0.9090 0.3534 0.0000 +vt 0.9513 0.0058 0.0000 +vt 0.9513 0.3534 0.0000 +vt 0.9579 0.0058 0.0000 +vt 0.9652 0.0058 0.0000 +vt 0.9652 0.3534 0.0000 +vt 0.9579 0.3534 0.0000 +vt 0.9726 0.0058 0.0000 +vt 0.9726 0.3534 0.0000 +vt 0.9800 0.0058 0.0000 +vt 0.9800 0.3534 0.0000 +vt 0.9871 0.0058 0.0000 +vt 0.9871 0.3534 0.0000 +vt 0.9937 0.0058 0.0000 +vt 0.9937 0.3534 0.0000 +vt 0.9664 0.0045 1.0000 +vt 0.9814 0.0045 1.0000 +vt 0.9061 0.0045 1.0000 +vt 0.9211 0.0045 1.0000 +vt 0.9362 0.0045 1.0000 +vt 0.9513 0.0045 1.0000 +vt 0.9965 0.0045 1.0000 +vt 0.9814 0.4448 1.0000 +vt 0.9664 0.4448 1.0000 +vt 0.9965 0.4448 1.0000 +vt 0.9061 0.4448 1.0000 +vt 0.9211 0.4448 1.0000 +vt 0.9362 0.4448 1.0000 +vt 0.9513 0.4448 1.0000 +vt 0.9664 0.0045 1.0000 +vt 0.9814 0.0045 1.0000 +vt 0.9814 0.4448 1.0000 +vt 0.9664 0.4448 1.0000 +vt 0.9965 0.0045 1.0000 +vt 0.9965 0.4448 1.0000 +vt 0.9061 0.0045 1.0000 +vt 0.9211 0.0045 1.0000 +vt 0.9211 0.4448 1.0000 +vt 0.9061 0.4448 1.0000 +vt 0.9362 0.0045 1.0000 +vt 0.9362 0.4448 1.0000 +vt 0.9513 0.0045 1.0000 +vt 0.9513 0.4448 1.0000 +vt 0.9664 0.0045 0.0000 +vt 0.9814 0.0045 0.0000 +vt 0.9061 0.0045 0.0000 +vt 0.9211 0.0045 0.0000 +vt 0.9362 0.0045 0.0000 +vt 0.9513 0.0045 0.0000 +vt 0.9965 0.0045 0.0000 +vt 0.9814 0.4448 0.0000 +vt 0.9664 0.4448 0.0000 +vt 0.9965 0.4448 0.0000 +vt 0.9061 0.4448 0.0000 +vt 0.9211 0.4448 0.0000 +vt 0.9362 0.4448 0.0000 +vt 0.9513 0.4448 0.0000 +vt 0.9664 0.0045 0.0000 +vt 0.9814 0.0045 0.0000 +vt 0.9814 0.4448 0.0000 +vt 0.9664 0.4448 0.0000 +vt 0.9965 0.0045 0.0000 +vt 0.9965 0.4448 0.0000 +vt 0.9061 0.0045 0.0000 +vt 0.9211 0.0045 0.0000 +vt 0.9211 0.4448 0.0000 +vt 0.9061 0.4448 0.0000 +vt 0.9362 0.0045 0.0000 +vt 0.9362 0.4448 0.0000 +vt 0.9513 0.0045 0.0000 +vt 0.9513 0.4448 0.0000 +vt 0.9040 0.7735 0.0000 +vt 0.9149 0.7705 0.0000 +vt 0.9162 0.7788 0.0000 +vt 0.9240 0.8323 0.0000 +vt 0.9558 0.7624 0.0000 +vt 0.9496 0.7683 0.0000 +vt 0.9531 0.8361 0.0000 +vt 0.9536 0.8461 0.0000 +vt 0.9196 0.8373 0.0000 +vt 0.8978 0.8407 0.0000 +vt 0.9003 0.7794 0.0000 +vt 0.9280 0.7786 0.0000 +vt 0.9285 0.8368 0.0000 +vt 0.9227 0.8430 0.0000 +vt 0.8963 0.8469 0.0000 +vt 0.8931 0.8366 0.0000 +vt 0.8896 0.8420 0.0000 +vt 0.8774 0.7890 0.0000 +vt 0.8876 0.7908 0.0000 +vt 0.8919 0.7844 0.0000 +vt 0.8986 0.7641 0.0000 +vt 0.9127 0.7589 0.0000 +vt 0.8917 0.7699 0.0000 +vt 0.8820 0.7786 0.0000 +vt 0.9313 0.7749 0.0000 +vt 0.9355 0.7861 0.0000 +vt 0.9299 0.7675 0.0000 +vt 0.9283 0.7555 0.0000 +vt 0.9202 0.7900 0.0000 +vt 0.9699 0.8453 0.0000 +vt 0.9735 0.8364 0.0000 +vt 0.9854 0.7609 0.0000 +vt 0.9874 0.8357 0.0000 +vt 0.9946 0.8278 0.0000 +vt 0.9914 0.7661 0.0000 +vt 0.9347 0.8386 0.0000 +vt 0.9352 0.8471 0.0000 +vt 0.9040 0.7735 0.0000 +vt 0.9149 0.7705 0.0000 +vt 0.9162 0.7788 0.0000 +vt 0.9240 0.8323 0.0000 +vt 0.9196 0.8373 0.0000 +vt 0.8978 0.8407 0.0000 +vt 0.9003 0.7794 0.0000 +vt 0.9558 0.7624 0.0000 +vt 0.9496 0.7683 0.0000 +vt 0.9531 0.8361 0.0000 +vt 0.9536 0.8461 0.0000 +vt 0.9699 0.8453 0.0000 +vt 0.9735 0.8364 0.0000 +vt 0.9854 0.7609 0.0000 +vt 0.9280 0.7786 0.0000 +vt 0.9285 0.8368 0.0000 +vt 0.9227 0.8430 0.0000 +vt 0.8963 0.8469 0.0000 +vt 0.8931 0.8366 0.0000 +vt 0.8896 0.8420 0.0000 +vt 0.8774 0.7890 0.0000 +vt 0.8876 0.7908 0.0000 +vt 0.8919 0.7844 0.0000 +vt 0.9874 0.8357 0.0000 +vt 0.9946 0.8278 0.0000 +vt 0.9914 0.7661 0.0000 +vt 0.8986 0.7641 0.0000 +vt 0.9127 0.7589 0.0000 +vt 0.8917 0.7699 0.0000 +vt 0.8820 0.7786 0.0000 +vt 0.9202 0.7900 0.0000 +vt 0.9313 0.7749 0.0000 +vt 0.9355 0.7861 0.0000 +vt 0.9299 0.7675 0.0000 +vt 0.9283 0.7555 0.0000 +vt 0.9347 0.8386 0.0000 +vt 0.9352 0.8471 0.0000 +# 1140 texture coords + +g SUV +usemtl SUV_Body +s 128 +f 1/2/1 2/1/2 3/4/3 +f 3/4/3 4/3/4 1/2/1 +s 256 +f 5/9/5 6/8/5 7/7/6 +f 5/9/5 7/7/6 8/6/7 +f 9/5/8 5/9/5 8/6/7 +s 8 +f 10/10/9 11/14/10 12/13/11 +f 12/13/11 13/12/12 14/11/13 +f 10/10/9 12/13/11 14/11/13 +s 128 +f 15/15/14 16/18/14 17/17/15 +f 17/17/15 18/16/16 15/15/14 +s 16777216 +f 19/20/17 20/19/18 21/22/19 +f 21/22/19 22/21/17 19/20/17 +s 256 +f 23/24/20 24/23/21 25/26/22 +f 25/26/22 26/25/23 23/24/20 +s 128 +f 27/27/14 28/30/14 29/29/24 +f 29/29/24 30/28/25 27/27/14 +s 16777216 +f 31/31/26 32/33/26 33/32/27 +s 256 +f 34/34/28 8/6/7 7/7/6 +f 7/7/6 35/35/29 34/34/28 +s 128 +f 36/36/30 1/2/1 4/3/4 +f 4/3/4 37/37/31 36/36/30 +s off +f 38/39/32 39/38/32 40/41/32 +f 40/41/33 41/40/33 38/39/33 +s 2 +f 42/47/34 43/46/35 44/45/36 +f 44/45/36 45/44/37 46/43/38 +f 42/47/34 44/45/36 46/43/38 +f 47/42/39 42/47/34 46/43/38 +s 128 +f 48/52/40 7/51/41 6/50/42 +f 49/48/43 48/52/40 6/50/42 +f 49/48/43 6/50/42 50/49/44 +f 51/53/14 15/15/14 52/54/14 +s 16777216 +f 19/20/17 53/56/45 54/55/46 +s 256 +f 24/23/21 34/34/28 35/35/29 +f 35/35/29 25/26/22 24/23/21 +f 55/61/47 56/60/48 57/59/49 +f 55/61/47 57/59/49 58/58/50 +f 59/57/51 55/61/47 58/58/50 +s 128 +f 16/18/14 27/27/14 30/28/25 +f 30/28/25 17/17/15 16/18/14 +s 16777216 +f 20/19/18 33/32/27 60/62/27 +f 60/62/27 21/22/19 20/19/18 +s off +f 61/63/52 43/46/52 42/47/52 +f 42/47/53 62/64/53 61/63/53 +s 128 +f 63/65/54 64/66/54 48/52/40 +f 48/52/40 49/48/43 65/67/55 +f 65/67/55 63/65/54 48/52/40 +f 66/69/56 67/68/57 68/70/57 +f 68/70/57 49/48/43 66/69/56 +s 16777216 +f 54/55/46 53/56/45 69/72/58 +f 69/72/58 2/71/59 54/55/46 +f 53/56/45 19/20/17 22/21/17 +f 22/21/17 70/73/60 53/56/45 +f 71/74/61 72/77/61 53/76/45 +f 53/76/45 70/75/60 71/74/61 +f 73/78/62 74/80/62 72/77/61 +f 72/77/61 71/74/61 75/79/63 +f 73/78/62 72/77/61 75/79/63 +f 76/81/64 77/83/64 74/80/62 +f 74/80/62 73/78/62 78/82/65 +f 76/81/64 74/80/62 78/82/65 +f 79/84/66 80/85/66 77/83/64 +f 77/83/64 76/81/64 79/84/66 +f 81/86/67 69/87/58 80/85/66 +f 80/85/66 79/84/66 81/86/67 +s 16 +f 82/88/68 83/91/69 84/90/70 +f 84/90/70 85/89/71 82/88/68 +s 128 +f 86/92/14 87/95/14 88/94/14 +f 88/94/14 89/93/54 86/92/14 +f 29/96/54 29/29/24 28/30/14 +f 28/30/14 90/97/54 29/96/54 +f 90/97/54 91/98/57 29/96/54 +f 92/99/72 93/102/73 94/101/74 +f 94/101/74 95/100/75 92/99/72 +f 96/103/14 88/94/14 87/95/14 +f 87/95/14 97/104/14 96/103/14 +s 67108864 +f 98/105/76 99/108/76 100/107/77 +f 100/107/77 101/106/78 98/105/76 +f 102/109/79 103/110/80 99/108/76 +f 99/108/76 98/105/76 102/109/79 +f 104/111/81 105/112/81 103/110/80 +f 103/110/80 102/109/79 104/111/81 +f 106/113/82 107/114/82 105/112/81 +f 105/112/81 104/111/81 106/113/82 +f 108/115/83 32/118/83 109/117/84 +f 109/117/84 110/116/84 108/115/83 +f 110/116/84 109/117/84 107/114/82 +f 107/114/82 106/113/82 110/116/84 +s 16777216 +f 33/32/27 32/33/26 108/119/26 +f 108/119/26 60/62/27 33/32/27 +s off +f 32/33/85 31/31/85 111/121/85 +f 111/121/85 100/120/85 32/33/85 +f 32/122/14 100/124/14 99/123/14 +f 103/125/54 32/122/54 99/123/54 +f 107/126/54 103/125/54 105/127/54 +f 107/126/14 109/128/14 103/125/14 +f 109/128/14 32/122/14 103/125/14 +s 128 +f 36/129/30 37/130/31 5/9/86 +f 5/9/86 9/5/87 36/129/30 +s 65536 +f 101/131/88 89/93/89 88/94/90 +f 88/94/90 98/132/91 101/131/88 +f 96/103/92 112/135/93 104/134/94 +f 104/134/94 102/133/95 96/103/92 +f 112/135/93 91/98/96 106/136/97 +f 106/136/97 104/134/94 112/135/93 +f 91/98/96 90/97/98 110/137/99 +f 110/137/99 106/136/97 91/98/96 +f 110/137/99 90/97/98 28/30/100 +f 28/30/100 108/138/101 110/137/99 +s 131072 +f 108/138/102 28/30/103 27/27/104 +f 27/27/104 60/139/105 108/138/102 +f 60/139/105 27/27/104 16/18/106 +f 16/18/106 21/140/107 60/139/105 +f 16/18/106 15/15/108 22/141/109 +f 22/141/109 21/140/107 16/18/106 +f 70/142/110 51/53/111 71/143/112 +f 15/15/108 51/53/111 70/142/110 +f 70/142/110 22/141/109 15/15/108 +f 51/53/111 52/54/113 71/143/112 +s 128 +f 52/54/14 15/15/14 18/16/16 +f 52/54/14 18/16/16 48/52/40 +f 64/66/54 52/54/14 48/52/40 +s 131072 +f 52/54/113 64/66/114 71/143/112 +f 64/66/114 63/65/115 73/145/116 +f 73/145/116 75/144/117 64/66/114 +s 128 +f 113/146/55 65/67/55 49/48/43 +f 49/48/43 68/70/57 113/146/55 +s 131072 +f 65/67/118 113/146/119 76/148/120 +f 76/148/120 78/147/121 65/67/118 +f 113/146/119 68/70/122 79/149/123 +f 79/149/123 76/148/120 113/146/119 +f 68/70/122 67/68/124 81/150/125 +f 81/150/125 79/149/123 68/70/122 +s 65536 +f 96/103/92 102/133/95 98/132/91 +f 98/132/91 88/94/90 96/103/92 +s 131072 +f 65/67/118 78/147/121 73/145/116 +f 73/145/116 63/65/115 65/67/118 +f 64/66/114 75/144/117 71/143/112 +s 128 +f 114/152/126 115/151/127 92/99/72 +f 92/99/72 116/153/128 114/152/126 +s 1 +f 117/154/129 118/156/130 119/155/131 +f 120/158/132 97/157/133 87/160/134 +f 87/160/134 121/159/135 120/158/132 +s off +f 87/161/136 86/164/136 122/163/136 +f 122/163/137 121/162/137 87/161/137 +s 2 +f 93/102/138 117/165/139 119/167/140 +f 119/167/140 123/166/141 93/102/138 +f 124/169/142 120/168/143 121/171/144 +f 121/171/144 125/170/145 124/169/142 +f 121/162/144 122/163/146 126/173/147 +f 126/173/147 125/172/145 121/162/144 +s 128 +f 127/174/54 116/153/128 29/29/24 +f 127/174/54 29/29/24 29/96/54 +f 127/174/54 29/96/54 91/98/57 +f 112/135/54 118/176/54 117/165/57 +f 112/135/54 117/165/57 128/175/57 +f 91/98/57 112/135/54 128/175/57 +f 127/174/54 91/98/57 128/175/57 +s off +f 93/177/148 92/179/148 117/178/148 +f 117/178/149 92/179/149 115/181/149 +f 115/181/149 128/180/149 117/178/149 +f 128/180/150 115/181/150 114/183/150 +f 114/183/150 127/182/150 128/180/150 +f 127/182/151 114/183/151 116/184/151 +s 16 +f 58/186/152 57/185/153 129/188/154 +f 129/188/154 130/187/155 58/186/152 +s 128 +f 131/190/156 132/189/157 133/192/158 +f 133/192/158 134/191/159 131/190/156 +f 93/102/73 131/194/156 134/193/159 +f 134/193/159 94/101/74 93/102/73 +s off +f 56/195/160 133/192/160 57/196/160 +f 57/185/161 133/192/161 132/189/161 +f 132/189/162 129/188/162 57/185/162 +f 129/188/163 132/189/163 131/190/163 +f 131/190/164 93/197/164 129/188/164 +s 256 +f 23/24/20 26/25/23 55/61/47 +f 55/61/47 59/57/51 23/24/20 +s 128 +f 135/198/165 95/100/75 94/101/74 +f 94/101/74 55/203/166 26/202/167 +f 26/202/167 136/201/168 137/200/169 +f 26/202/167 137/200/169 138/199/170 +f 94/101/74 26/202/167 138/199/170 +f 135/198/165 94/101/74 138/199/170 +f 139/204/171 136/201/168 26/202/167 +f 139/204/171 26/202/167 25/208/172 +f 17/17/15 140/207/173 141/206/174 +f 17/17/15 141/206/174 142/205/175 +f 25/208/172 17/17/15 142/205/175 +f 139/204/171 25/208/172 142/205/175 +f 35/214/176 143/213/177 144/212/178 +f 25/208/172 35/214/176 144/212/178 +f 25/208/172 144/212/178 145/211/179 +f 25/208/172 145/211/179 146/210/180 +f 17/17/15 25/208/172 146/210/180 +f 147/209/181 17/17/15 146/210/180 +f 48/52/40 148/217/182 149/216/183 +f 48/52/40 149/216/183 150/215/184 +f 143/213/177 35/214/176 7/51/41 +f 150/215/184 143/213/177 7/51/41 +f 48/52/40 150/215/184 7/51/41 +s off +f 151/219/185 152/218/185 153/221/185 +f 153/221/186 154/220/186 151/219/186 +f 155/225/187 156/224/187 153/221/187 +f 153/221/188 152/218/188 157/223/188 +f 155/225/189 153/221/189 157/223/189 +f 158/222/190 155/225/190 157/223/190 +s 128 +f 92/99/72 95/100/75 116/153/128 +f 135/198/165 30/28/25 29/29/24 +f 135/198/165 29/29/24 116/153/128 +f 95/100/75 135/198/165 116/153/128 +f 135/198/165 140/207/173 17/17/15 +f 17/17/15 30/28/25 135/198/165 +f 18/16/16 17/17/15 147/209/181 +f 147/209/181 148/217/182 18/16/16 +f 148/217/182 48/52/40 18/16/16 +s off +f 138/199/191 62/64/191 42/47/191 +f 42/47/192 135/198/192 138/199/192 +f 135/198/193 42/47/193 47/42/193 +f 47/42/194 140/207/194 135/198/194 +f 140/207/195 47/42/195 46/43/195 +f 46/43/196 141/206/196 140/207/196 +f 141/206/197 46/43/197 45/44/197 +f 45/44/198 142/205/198 141/206/198 +f 142/205/199 45/44/199 44/45/199 +f 44/45/200 139/204/200 142/205/200 +f 139/204/201 44/45/201 43/46/201 +f 43/46/202 136/201/202 139/204/202 +f 136/201/203 43/46/203 61/63/203 +f 61/63/204 137/200/204 136/201/204 +f 137/200/205 61/63/205 62/64/205 +f 62/64/206 138/199/206 137/200/206 +f 144/212/207 156/224/207 155/225/207 +f 155/225/208 145/211/208 144/212/208 +f 145/211/209 155/225/209 158/222/209 +f 158/222/210 146/210/210 145/211/210 +f 146/210/211 158/222/211 157/223/211 +f 157/223/212 147/209/212 146/210/212 +f 147/209/213 157/223/213 152/218/213 +f 152/218/214 148/217/214 147/209/214 +f 148/217/215 152/218/215 151/219/215 +f 151/219/216 149/216/216 148/217/216 +f 149/216/217 151/219/217 154/220/217 +f 154/220/218 150/215/218 149/216/218 +f 150/215/219 154/220/219 153/221/219 +f 153/221/220 143/213/220 150/215/220 +f 143/213/221 153/221/221 156/224/221 +f 156/224/222 144/212/222 143/213/222 +f 159/233/223 160/232/223 161/231/223 +f 161/231/224 162/230/224 163/229/224 +f 159/233/225 161/231/225 163/229/225 +f 163/229/223 164/228/223 165/227/223 +f 159/233/225 163/229/225 165/227/225 +f 166/226/224 159/233/224 165/227/224 +s 8 +f 126/173/226 167/235/227 168/234/228 +f 168/234/228 125/172/229 126/173/226 +f 125/172/229 169/238/230 170/237/231 +f 170/237/231 171/236/232 11/14/10 +f 125/172/229 170/237/231 11/14/10 +f 171/236/232 172/240/233 173/239/234 +f 11/14/10 171/236/232 173/239/234 +f 11/14/10 173/239/234 12/13/11 +f 12/13/11 174/242/235 175/241/236 +f 175/241/236 126/173/226 12/13/11 +s off +f 167/243/237 163/246/237 162/245/237 +f 162/245/238 168/244/238 167/243/238 +f 169/247/239 161/250/239 160/249/239 +f 160/249/240 170/248/240 169/247/240 +f 172/251/241 159/254/241 166/253/241 +f 166/253/242 173/252/242 172/251/242 +f 174/255/243 165/258/243 164/257/243 +f 164/257/244 175/256/244 174/255/244 +f 13/267/245 12/266/245 126/265/245 +f 13/267/246 126/265/246 122/264/246 +f 122/264/247 86/263/247 89/262/247 +f 13/267/248 122/264/248 89/262/248 +f 89/262/249 101/261/249 100/260/249 +f 13/267/250 89/262/250 100/260/250 +f 176/259/251 13/267/251 100/260/251 +f 111/268/252 38/39/252 41/40/252 +f 41/40/252 176/269/252 111/268/252 +f 176/259/54 41/40/54 40/41/54 +f 40/41/14 13/267/14 176/259/14 +f 13/270/253 40/41/253 39/38/253 +f 39/38/254 14/271/254 13/270/254 +f 94/272/255 134/191/255 133/192/255 +f 133/192/256 56/195/256 94/272/256 +s 256 +f 56/60/48 55/61/47 94/273/257 +s 16 +f 177/274/258 178/277/259 123/276/260 +f 123/276/260 124/275/261 177/274/258 +f 178/277/259 129/188/154 93/197/262 +f 93/197/262 123/276/260 178/277/259 +f 83/91/69 82/88/68 130/187/155 +f 178/277/259 83/91/69 130/187/155 +f 178/277/259 130/187/155 129/188/154 +f 11/279/263 10/278/264 85/89/71 +f 11/279/263 85/89/71 84/90/70 +f 177/274/258 11/279/263 84/90/70 +f 177/274/258 124/275/261 125/280/265 +f 125/280/265 11/279/263 177/274/258 +s 128 +f 96/103/14 97/104/14 118/176/54 +f 118/176/54 112/135/54 96/103/14 +s 2 +f 123/166/141 119/167/140 120/168/143 +f 120/168/143 124/169/142 123/166/141 +s 1 +f 119/155/131 118/156/130 97/157/133 +f 97/157/133 120/158/132 119/155/131 +s off +f 179/282/266 180/281/266 181/284/266 +f 181/284/267 182/283/267 179/282/267 +f 177/285/54 179/288/54 182/287/54 +f 182/287/14 178/286/14 177/285/14 +f 178/277/268 182/283/268 181/284/268 +f 181/284/268 83/91/268 178/277/268 +f 83/289/269 181/292/269 180/291/269 +f 180/291/269 84/290/269 83/289/269 +f 84/90/270 180/281/270 179/282/270 +f 179/282/270 177/274/270 84/90/270 +f 80/293/271 72/296/271 74/295/271 +f 74/295/57 77/294/57 80/293/57 +f 72/296/14 80/293/14 69/298/14 +f 69/298/14 53/297/14 72/296/14 +s 128 +f 66/69/56 49/48/43 4/300/4 +f 4/300/4 3/299/3 66/69/56 +f 49/48/43 50/49/44 37/301/31 +f 37/301/31 4/300/4 49/48/43 +f 5/302/86 37/301/31 50/49/44 +f 50/49/44 6/50/42 5/302/86 +s 8 +f 126/173/226 175/241/236 167/235/227 +f 125/172/229 168/234/228 169/238/230 +f 171/236/232 170/237/231 172/240/233 +f 12/13/11 173/239/234 174/242/235 +s off +f 175/256/272 164/257/272 163/246/272 +f 163/246/273 167/243/273 175/256/273 +f 168/244/274 162/245/274 161/250/274 +f 161/250/275 169/247/275 168/244/275 +f 170/303/276 160/304/276 159/254/276 +f 159/254/277 172/251/277 170/303/277 +f 173/252/278 166/253/278 165/258/278 +f 165/258/279 174/255/279 173/252/279 +s 1 +f 183/305/280 184/308/281 185/307/282 +f 185/307/282 186/306/283 183/305/280 +s off +f 187/309/284 188/312/284 189/311/284 +f 189/311/285 190/310/285 187/309/285 +f 191/313/286 192/316/286 193/315/286 +f 193/315/286 194/314/286 191/313/286 +s 1 +f 195/317/287 196/321/288 197/320/289 +f 195/317/287 197/320/289 198/319/290 +f 195/317/287 198/319/290 199/318/291 +f 200/323/292 201/322/293 202/325/294 +f 202/325/294 203/324/295 200/323/292 +s off +f 189/311/296 204/328/296 205/327/296 +f 190/310/297 189/311/297 205/327/297 +f 206/326/298 190/310/298 205/327/298 +s 1 +f 195/317/287 186/306/283 185/307/282 +f 185/307/282 196/321/288 195/317/287 +f 192/316/299 191/313/300 207/330/301 +f 207/330/301 208/329/302 192/316/299 +f 205/331/303 204/332/304 184/308/281 +f 184/308/281 183/305/280 205/331/303 +s off +f 203/324/305 191/313/305 194/314/305 +f 194/314/306 200/333/306 203/324/306 +f 200/335/307 194/334/307 187/309/307 +f 187/309/308 201/336/308 200/335/308 +s 1 +f 191/313/300 203/324/295 202/325/294 +f 191/313/300 202/325/294 209/337/309 +f 207/330/301 191/313/300 209/337/309 +f 199/318/291 207/330/301 209/337/309 +f 190/338/310 206/341/311 210/340/312 +f 210/340/312 211/339/313 190/338/310 +f 212/342/314 190/338/310 211/339/313 +f 213/344/315 187/343/316 190/338/310 +f 190/338/310 212/342/314 213/344/315 +f 201/347/293 187/346/316 213/345/315 +f 202/325/294 201/347/293 213/345/315 +f 202/325/294 213/345/315 209/337/309 +f 183/305/280 186/306/283 211/349/313 +f 211/349/313 210/348/312 183/305/280 +f 195/317/287 199/318/291 213/345/315 +f 213/345/315 212/350/314 195/317/287 +f 186/306/283 195/317/287 212/350/314 +f 212/350/314 211/349/313 186/306/283 +f 205/331/303 183/305/280 210/348/312 +f 210/348/312 206/351/311 205/331/303 +f 209/337/309 213/345/315 199/318/291 +f 208/329/302 207/330/301 199/318/291 +f 199/318/291 198/319/290 208/329/302 +f 197/320/289 214/352/317 208/329/302 +f 208/329/302 198/319/290 197/320/289 +s off +f 208/353/318 215/356/318 193/355/318 +f 193/355/318 192/354/318 208/353/318 +f 214/357/319 39/358/319 215/356/319 +f 215/356/245 208/353/245 214/357/245 +f 215/361/320 39/360/320 188/312/320 +f 215/361/321 188/312/321 187/309/321 +f 193/359/322 215/361/322 187/309/322 +f 193/359/323 187/309/323 194/334/323 +f 216/366/54 217/365/54 218/364/54 +f 216/366/54 218/364/54 219/363/54 +f 220/362/54 216/366/54 219/363/54 +s 2 +f 221/368/324 222/367/325 223/370/326 +f 223/370/326 224/369/327 221/368/324 +f 225/371/328 221/368/324 224/369/327 +f 224/369/327 226/372/329 225/371/328 +s off +f 222/373/330 227/375/330 223/374/330 +s 2 +f 228/376/331 225/371/328 226/372/329 +f 226/372/329 229/377/332 228/376/331 +s off +f 219/379/333 230/378/333 227/381/333 +f 227/381/334 220/380/334 219/379/334 +f 218/364/335 226/372/335 230/378/335 +f 230/378/336 219/379/336 218/364/336 +f 220/382/337 227/375/337 231/385/337 +f 220/382/338 231/385/338 232/384/338 +f 220/382/339 232/384/339 216/383/339 +f 217/365/340 229/377/340 226/372/340 +f 226/372/341 218/364/341 217/365/341 +s 2 +f 224/386/327 223/389/326 227/388/14 +f 227/388/14 230/387/54 224/386/327 +f 226/390/329 224/386/327 230/387/54 +s off +f 231/385/342 227/375/342 222/373/342 +f 222/373/343 233/391/343 231/385/343 +f 234/392/344 235/397/344 229/396/344 +f 234/392/345 229/396/345 217/395/345 +f 234/392/344 217/395/344 216/394/344 +f 234/392/344 216/394/344 232/393/344 +f 229/396/344 235/397/344 236/399/344 +f 236/399/344 228/398/344 229/396/344 +s 128 +f 1/403/1 237/402/346 238/401/347 +f 238/401/347 2/400/2 1/403/1 +s 256 +f 239/407/348 240/406/349 241/405/349 +f 8/408/7 239/407/348 241/405/349 +f 9/404/8 8/408/7 241/405/349 +s 8 +f 14/413/13 242/412/350 243/411/351 +f 10/409/9 14/413/13 243/411/351 +f 10/409/9 243/411/351 244/410/352 +s 128 +f 245/414/353 246/417/354 247/416/355 +f 247/416/355 248/415/353 245/414/353 +s 16777216 +f 19/421/17 249/420/356 250/419/18 +f 250/419/18 20/418/18 19/421/17 +s 256 +f 23/425/20 251/424/357 252/423/358 +f 252/423/358 24/422/21 23/425/20 +s 128 +f 253/426/353 254/429/359 255/428/360 +f 255/428/360 256/427/353 253/426/353 +s 16777216 +f 31/430/26 33/432/27 257/431/361 +s 256 +f 34/434/28 258/433/362 239/407/348 +f 239/407/348 8/408/7 34/434/28 +s 128 +f 36/436/30 259/435/363 237/402/346 +f 237/402/346 1/403/1 36/436/30 +s off +f 38/440/364 260/439/364 261/438/364 +f 261/438/365 39/437/365 38/440/365 +s 2 +f 262/446/366 263/445/367 264/444/368 +f 264/444/368 265/443/369 266/442/370 +f 262/446/366 264/444/368 266/442/370 +f 267/441/371 262/446/366 266/442/370 +s 128 +f 268/447/372 269/451/373 240/450/374 +f 240/450/374 239/449/375 270/448/376 +f 268/447/372 240/450/374 270/448/376 +f 271/452/353 272/453/353 245/414/353 +s 16777216 +f 19/421/17 54/455/46 273/454/377 +s 256 +f 24/422/21 252/423/358 258/433/362 +f 258/433/362 34/434/28 24/422/21 +f 274/459/378 275/458/379 276/457/380 +f 58/460/50 274/459/378 276/457/380 +f 59/456/51 58/460/50 276/457/380 +s 128 +f 248/415/353 247/416/355 254/429/359 +f 254/429/359 253/426/353 248/415/353 +s 16777216 +f 20/418/18 250/419/18 277/461/381 +f 277/461/381 33/432/27 20/418/18 +s off +f 278/462/382 279/463/382 266/442/382 +f 266/442/383 265/443/383 278/462/383 +s 128 +f 280/464/318 270/448/376 281/465/318 +f 270/448/376 280/464/318 282/466/384 +f 282/466/384 268/447/372 270/448/376 +f 283/469/385 268/447/372 284/468/269 +f 284/468/269 285/467/269 283/469/385 +s 16777216 +f 54/455/46 2/471/59 286/470/386 +f 286/470/386 273/454/377 54/455/46 +f 273/454/377 287/472/387 249/420/356 +f 249/420/356 19/421/17 273/454/377 +f 288/473/388 287/476/387 273/475/377 +f 273/475/377 289/474/388 288/473/388 +f 290/479/389 288/473/388 289/474/388 +f 291/477/390 290/479/389 289/474/388 +f 291/477/390 289/474/388 292/478/390 +f 293/482/391 291/477/390 292/478/390 +f 294/480/392 293/482/391 292/478/390 +f 294/480/392 292/478/390 295/481/392 +f 296/483/393 294/480/392 295/481/392 +f 295/481/392 297/484/393 296/483/393 +f 298/485/394 296/483/393 297/484/393 +f 297/484/393 286/486/386 298/485/394 +s 16 +f 82/487/68 85/490/71 299/489/395 +f 299/489/395 300/488/396 82/487/68 +s 128 +f 301/491/353 302/494/318 303/493/353 +f 303/493/353 304/492/353 301/491/353 +f 255/496/318 305/495/318 256/427/353 +f 256/427/353 255/428/360 255/496/318 +f 305/495/318 255/496/318 306/497/269 +f 307/498/397 308/501/398 309/500/399 +f 309/500/399 310/499/400 307/498/397 +f 311/502/353 312/503/353 304/492/353 +f 304/492/353 303/493/353 311/502/353 +s 67108864 +f 313/504/401 314/507/77 315/506/78 +f 315/506/78 316/505/401 313/504/401 +f 317/508/80 313/504/401 316/505/401 +f 316/505/401 318/509/79 317/508/80 +f 319/510/402 317/508/80 318/509/79 +f 318/509/79 320/511/402 319/510/402 +f 321/512/403 319/510/402 320/511/402 +f 320/511/402 322/513/403 321/512/403 +f 323/514/404 324/517/405 325/516/405 +f 325/516/405 257/515/404 323/514/404 +f 324/517/405 321/512/403 322/513/403 +f 322/513/403 325/516/405 324/517/405 +s 16777216 +f 33/432/27 277/461/381 323/518/361 +f 323/518/361 257/431/361 33/432/27 +s off +f 257/431/406 315/520/406 111/519/406 +f 111/519/406 31/430/406 257/431/406 +f 257/521/353 316/523/353 315/522/353 +f 318/524/318 316/523/318 257/521/318 +f 322/525/318 320/526/318 318/524/318 +f 322/525/353 318/524/353 325/527/353 +f 325/527/353 318/524/353 257/521/353 +s 128 +f 36/528/30 9/404/87 241/405/407 +f 241/405/407 259/529/363 36/528/30 +s 65536 +f 314/531/408 313/530/409 303/493/410 +f 303/493/410 302/494/411 314/531/408 +f 311/502/412 317/534/413 319/533/414 +f 319/533/414 326/532/415 311/502/412 +f 326/532/415 319/533/414 321/535/416 +f 321/535/416 306/497/417 326/532/415 +f 306/497/417 321/535/416 324/536/418 +f 324/536/418 305/495/419 306/497/417 +f 324/536/418 323/537/420 256/427/421 +f 256/427/421 305/495/419 324/536/418 +s 131072 +f 323/537/422 277/538/423 253/426/424 +f 253/426/424 256/427/425 323/537/422 +f 277/538/423 250/539/426 248/415/427 +f 248/415/427 253/426/424 277/538/423 +f 248/415/427 250/539/426 249/540/428 +f 249/540/428 245/414/429 248/415/427 +f 287/541/430 288/542/431 271/452/432 +f 245/414/429 249/540/428 287/541/430 +f 287/541/430 271/452/432 245/414/429 +f 271/452/432 288/542/431 272/453/433 +s 128 +f 246/417/354 245/414/353 272/453/353 +f 270/448/376 246/417/354 272/453/353 +f 281/465/318 270/448/376 272/453/353 +s 131072 +f 272/453/433 288/542/431 281/465/434 +f 281/465/434 290/544/435 291/543/436 +f 291/543/436 280/464/437 281/465/434 +s 128 +f 327/545/384 284/468/269 268/447/372 +f 268/447/372 282/466/384 327/545/384 +s 131072 +f 282/466/438 293/547/439 294/546/440 +f 294/546/440 327/545/441 282/466/438 +f 327/545/441 294/546/440 296/548/442 +f 296/548/442 284/468/443 327/545/441 +f 284/468/443 296/548/442 298/549/444 +f 298/549/444 285/467/445 284/468/443 +s 65536 +f 311/502/412 303/493/410 313/530/409 +f 313/530/409 317/534/413 311/502/412 +s 131072 +f 282/466/438 280/464/437 291/543/436 +f 291/543/436 293/547/439 282/466/438 +f 281/465/434 288/542/431 290/544/435 +s 128 +f 328/552/446 329/551/447 307/498/397 +f 307/498/397 330/550/448 328/552/446 +s 1 +f 331/553/449 332/555/450 333/554/451 +f 334/559/452 335/558/453 304/557/454 +f 304/557/454 312/556/455 334/559/452 +s off +f 304/560/456 335/563/456 336/562/456 +f 336/562/457 301/561/457 304/560/457 +s 2 +f 310/499/458 337/566/459 332/565/460 +f 332/565/460 331/564/461 310/499/458 +f 338/570/462 339/569/463 335/568/464 +f 335/568/464 334/567/465 338/570/462 +f 335/563/464 339/572/463 340/571/466 +f 340/571/466 336/562/467 335/563/464 +s 128 +f 331/564/269 333/574/318 326/532/318 +f 341/575/269 331/564/269 326/532/318 +f 341/575/269 326/532/318 306/497/269 +f 342/573/318 341/575/269 306/497/269 +f 342/573/318 306/497/269 255/496/318 +f 342/573/318 255/496/318 255/428/360 +f 342/573/318 255/428/360 329/551/447 +s off +f 310/576/468 331/578/468 307/577/468 +f 331/578/149 341/580/149 330/579/149 +f 330/579/469 307/577/469 331/578/469 +f 341/580/150 342/582/150 328/581/150 +f 328/581/150 330/579/150 341/580/150 +f 342/582/151 329/583/151 328/581/151 +s 16 +f 58/587/152 130/586/155 343/585/470 +f 343/585/470 274/584/471 58/587/152 +s 128 +f 344/591/472 345/590/473 346/589/474 +f 346/589/474 347/588/475 344/591/472 +f 310/499/400 309/500/399 345/593/473 +f 345/593/473 344/592/472 310/499/400 +s off +f 275/594/476 274/595/476 346/589/476 +f 274/584/477 343/585/477 347/588/477 +f 347/588/478 346/589/478 274/584/478 +f 343/585/479 310/596/479 344/591/479 +f 344/591/480 347/588/480 343/585/480 +s 256 +f 23/425/20 59/456/51 276/457/380 +f 276/457/380 251/424/357 23/425/20 +s 128 +f 348/601/481 349/600/482 251/599/483 +f 350/602/484 348/601/481 251/599/483 +f 251/599/483 276/598/485 309/500/399 +f 350/602/484 251/599/483 309/500/399 +f 351/597/486 350/602/484 309/500/399 +f 351/597/486 309/500/399 308/501/398 +f 352/606/487 353/605/488 247/416/355 +f 354/607/489 352/606/487 247/416/355 +f 354/607/489 247/416/355 252/604/490 +f 355/603/491 354/607/489 252/604/490 +f 355/603/491 252/604/490 251/599/483 +f 355/603/491 251/599/483 349/600/482 +f 356/611/492 357/610/493 258/609/494 +f 356/611/492 258/609/494 252/604/490 +f 358/612/495 356/611/492 252/604/490 +f 359/613/496 358/612/495 252/604/490 +f 359/613/496 252/604/490 247/416/355 +f 360/608/497 359/613/496 247/416/355 +f 239/449/375 258/609/494 357/610/493 +f 239/449/375 357/610/493 361/616/498 +f 270/448/376 239/449/375 361/616/498 +f 270/448/376 361/616/498 362/615/499 +f 270/448/376 362/615/499 363/614/500 +s off +f 364/620/501 365/619/501 366/618/501 +f 366/618/502 367/617/502 364/620/502 +f 368/624/503 367/617/503 366/618/503 +f 366/618/504 369/623/504 370/622/504 +f 368/624/505 366/618/505 370/622/505 +f 371/621/506 368/624/506 370/622/506 +s 128 +f 307/498/397 329/551/447 308/501/398 +f 255/428/360 254/429/359 351/597/486 +f 329/551/447 255/428/360 351/597/486 +f 308/501/398 329/551/447 351/597/486 +f 351/597/486 254/429/359 247/416/355 +f 247/416/355 353/605/488 351/597/486 +f 246/417/354 363/614/500 360/608/497 +f 360/608/497 247/416/355 246/417/354 +f 363/614/500 246/417/354 270/448/376 +s off +f 350/602/507 351/597/507 266/442/507 +f 266/442/508 279/463/508 350/602/508 +f 351/597/509 353/605/509 267/441/509 +f 267/441/510 266/442/510 351/597/510 +f 353/605/511 352/606/511 262/446/511 +f 262/446/512 267/441/512 353/605/512 +f 352/606/513 354/607/513 263/445/513 +f 263/445/514 262/446/514 352/606/514 +f 354/607/515 355/603/515 264/444/515 +f 264/444/516 263/445/516 354/607/516 +f 355/603/517 349/600/517 265/443/517 +f 265/443/518 264/444/518 355/603/518 +f 349/600/519 348/601/519 278/462/519 +f 278/462/520 265/443/520 349/600/520 +f 348/601/521 350/602/521 279/463/521 +f 279/463/522 278/462/522 348/601/522 +f 356/611/523 358/612/523 370/622/523 +f 370/622/524 369/623/524 356/611/524 +f 358/612/525 359/613/525 371/621/525 +f 371/621/526 370/622/526 358/612/526 +f 359/613/527 360/608/527 368/624/527 +f 368/624/528 371/621/528 359/613/528 +f 360/608/529 363/614/529 367/617/529 +f 367/617/530 368/624/530 360/608/530 +f 363/614/531 362/615/531 364/620/531 +f 364/620/532 367/617/532 363/614/532 +f 362/615/533 361/616/533 365/619/533 +f 365/619/534 364/620/534 362/615/534 +f 361/616/535 357/610/535 366/618/535 +f 366/618/536 365/619/536 361/616/536 +f 357/610/537 356/611/537 369/623/537 +f 369/623/538 366/618/538 357/610/538 +f 372/632/539 373/631/539 374/630/539 +f 374/630/540 375/629/540 376/628/540 +f 376/628/539 377/627/539 378/626/539 +f 374/630/541 376/628/541 378/626/541 +f 372/632/541 374/630/541 378/626/541 +f 379/625/540 372/632/540 378/626/540 +s 8 +f 340/571/542 339/572/543 380/634/544 +f 380/634/544 381/633/545 340/571/542 +f 244/410/352 382/637/546 383/636/547 +f 339/572/543 244/410/352 383/636/547 +f 339/572/543 383/636/547 384/635/548 +f 244/410/352 243/411/351 385/639/549 +f 385/639/549 386/638/550 382/637/546 +f 244/410/352 385/639/549 382/637/546 +f 243/411/351 340/571/542 387/641/551 +f 387/641/551 388/640/552 243/411/351 +s off +f 381/642/553 380/645/553 375/644/553 +f 375/644/554 374/643/554 381/642/554 +f 384/646/555 383/649/555 377/648/555 +f 377/648/556 376/647/556 384/646/556 +f 386/650/557 385/653/557 379/652/557 +f 379/652/558 378/651/558 386/650/558 +f 388/654/559 387/657/559 373/656/559 +f 373/656/560 372/655/560 388/654/560 +f 315/666/561 314/665/561 302/664/561 +f 302/664/562 301/663/562 336/662/562 +f 340/661/345 243/660/345 242/659/345 +f 336/662/563 340/661/563 242/659/563 +f 302/664/564 336/662/564 242/659/564 +f 315/666/565 302/664/565 242/659/565 +f 389/658/566 315/666/566 242/659/566 +f 111/667/567 389/668/567 260/439/567 +f 260/439/567 38/440/567 111/667/567 +f 389/658/353 242/659/353 261/438/353 +f 261/438/318 260/439/318 389/658/318 +f 242/669/568 14/670/568 39/437/568 +f 39/437/569 261/438/569 242/669/569 +f 309/671/570 275/594/570 346/589/570 +f 346/589/571 345/590/571 309/671/571 +s 256 +f 275/458/379 309/672/572 276/457/380 +s 16 +f 390/673/573 338/676/574 337/675/575 +f 337/675/575 391/674/576 390/673/573 +f 391/674/576 337/675/575 310/596/577 +f 310/596/577 343/585/470 391/674/576 +f 391/674/576 343/585/470 130/586/155 +f 130/586/155 82/487/68 300/488/396 +f 391/674/576 130/586/155 300/488/396 +f 85/490/71 10/678/264 244/677/578 +f 299/489/395 85/490/71 244/677/578 +f 390/673/573 299/489/395 244/677/578 +f 390/673/573 244/677/578 339/679/579 +f 339/679/579 338/676/574 390/673/573 +s 128 +f 311/502/353 326/532/318 333/574/318 +f 333/574/318 312/503/353 311/502/353 +s 2 +f 337/566/459 338/570/462 334/567/465 +f 334/567/465 332/565/460 337/566/459 +s 1 +f 332/555/450 334/559/452 312/556/455 +f 312/556/455 333/554/451 332/555/450 +s off +f 392/683/580 393/682/580 394/681/580 +f 394/681/581 395/680/581 392/683/581 +f 390/684/353 391/687/353 393/686/353 +f 393/686/318 392/685/318 390/684/318 +f 391/674/582 300/488/582 394/681/582 +f 394/681/582 393/682/582 391/674/582 +f 300/688/57 299/691/57 395/690/57 +f 395/690/57 394/689/57 300/688/57 +f 299/489/583 390/673/583 392/683/583 +f 392/683/583 395/680/583 299/489/583 +f 297/692/269 295/695/269 292/694/269 +f 292/694/584 289/693/584 297/692/584 +f 289/693/353 273/697/353 286/696/353 +f 286/696/353 297/692/353 289/693/353 +s 128 +f 283/469/385 238/699/347 237/698/346 +f 237/698/346 268/447/372 283/469/385 +f 268/447/372 237/698/346 259/700/363 +f 259/700/363 269/451/373 268/447/372 +f 241/701/407 240/450/374 269/451/373 +f 269/451/373 259/700/363 241/701/407 +s 8 +f 340/571/542 381/633/545 387/641/551 +f 339/572/543 384/635/548 380/634/544 +f 382/637/546 386/638/550 383/636/547 +f 243/411/351 388/640/552 385/639/549 +s off +f 387/657/585 381/642/585 374/643/585 +f 374/643/586 373/656/586 387/657/586 +f 380/645/587 384/646/587 376/647/587 +f 376/647/588 375/644/588 380/645/588 +f 383/702/589 386/650/589 378/651/589 +f 378/651/590 377/703/590 383/702/590 +f 385/653/591 388/654/591 372/655/591 +f 372/655/592 379/652/592 385/653/592 +s 1 +f 396/704/593 397/707/594 185/706/282 +f 185/706/282 184/705/281 396/704/593 +s off +f 398/708/595 399/711/595 189/710/595 +f 189/710/596 188/709/596 398/708/596 +f 400/712/597 401/715/597 402/714/597 +f 402/714/597 403/713/597 400/712/597 +s 1 +f 404/716/598 405/720/599 406/719/600 +f 404/716/598 406/719/600 197/718/289 +f 404/716/598 197/718/289 196/717/288 +f 407/724/601 408/723/602 409/722/603 +f 409/722/603 410/721/604 407/724/601 +s off +f 411/727/605 204/726/605 189/710/605 +f 411/727/606 189/710/606 399/711/606 +f 412/725/607 411/727/607 399/711/607 +s 1 +f 404/716/598 196/717/288 185/706/282 +f 185/706/282 397/707/594 404/716/598 +f 403/713/608 413/729/609 414/728/610 +f 414/728/610 400/712/611 403/713/608 +f 411/730/612 396/704/593 184/705/281 +f 184/705/281 204/731/304 411/730/612 +s off +f 408/723/613 407/732/613 401/715/613 +f 401/715/614 400/712/614 408/723/614 +f 407/735/615 410/734/615 398/708/615 +f 398/708/616 401/733/616 407/735/616 +s 1 +f 409/722/603 408/723/602 400/712/611 +f 415/736/617 409/722/603 400/712/611 +f 415/736/617 400/712/611 414/728/610 +f 405/720/599 415/736/617 414/728/610 +f 399/737/618 416/740/619 417/739/620 +f 417/739/620 412/738/621 399/737/618 +f 418/741/622 416/740/619 399/737/618 +f 419/743/623 418/741/622 399/737/618 +f 399/737/618 398/742/624 419/743/623 +f 409/722/603 415/736/617 419/746/623 +f 419/746/623 398/745/624 410/744/604 +f 409/722/603 419/746/623 410/744/604 +f 396/704/593 417/748/620 416/747/619 +f 416/747/619 397/707/594 396/704/593 +f 404/716/598 418/749/622 419/746/623 +f 419/746/623 405/720/599 404/716/598 +f 397/707/594 416/747/619 418/749/622 +f 418/749/622 404/716/598 397/707/594 +f 411/730/612 412/750/621 417/748/620 +f 417/748/620 396/704/593 411/730/612 +f 415/736/617 405/720/599 419/746/623 +f 413/729/609 406/719/600 405/720/599 +f 405/720/599 414/728/610 413/729/609 +f 197/718/289 406/719/600 413/729/609 +f 413/729/609 214/751/317 197/718/289 +s off +f 413/752/54 403/755/54 402/754/54 +f 402/754/54 420/753/54 413/752/54 +f 214/756/345 413/752/345 420/753/345 +f 420/753/625 39/757/625 214/756/625 +f 402/758/626 401/733/626 398/708/626 +f 188/709/627 39/760/627 420/759/627 +f 398/708/628 188/709/628 420/759/628 +f 402/758/629 398/708/629 420/759/629 +f 421/764/318 422/763/318 423/762/318 +f 424/765/318 421/764/318 423/762/318 +f 425/761/318 424/765/318 423/762/318 +s 2 +f 221/769/324 426/768/630 427/767/631 +f 427/767/631 222/766/325 221/769/324 +f 225/771/328 428/770/632 426/768/630 +f 426/768/630 221/769/324 225/771/328 +s off +f 222/772/633 427/774/633 429/773/633 +s 2 +f 228/776/331 430/775/634 428/770/632 +f 428/770/632 225/771/328 228/776/331 +s off +f 424/780/635 425/779/635 429/778/635 +f 429/778/636 431/777/636 424/780/636 +f 421/764/637 424/780/637 431/777/637 +f 431/777/638 428/770/638 421/764/638 +f 425/781/639 423/784/639 432/783/639 +f 425/781/640 432/783/640 433/782/640 +f 425/781/641 433/782/641 429/773/641 +f 422/763/642 421/764/642 428/770/642 +f 428/770/643 430/775/643 422/763/643 +s 2 +f 426/785/630 431/788/318 429/787/353 +f 429/787/353 427/786/631 426/785/630 +f 428/789/632 431/788/318 426/785/630 +s off +f 433/782/644 233/790/644 222/772/644 +f 222/772/645 429/773/645 433/782/645 +f 434/791/646 432/796/646 423/795/646 +f 434/791/646 423/795/646 422/794/646 +f 434/791/245 422/794/245 430/793/245 +f 434/791/344 430/793/344 435/792/344 +f 430/793/646 228/798/646 236/797/646 +f 236/797/646 435/792/646 430/793/646 +s 1 +f 436/805/647 437/800/648 438/799/649 +f 438/799/649 439/804/650 436/805/647 +f 440/806/651 441/801/652 437/800/648 +f 437/800/648 436/805/647 440/806/651 +f 442/807/653 443/802/654 441/801/652 +f 441/801/652 440/806/651 442/807/653 +f 444/808/655 445/803/656 443/802/654 +f 443/802/654 442/807/653 444/808/655 +f 445/803/656 444/808/655 446/833/657 +f 446/833/657 447/830/658 445/803/656 +f 439/809/650 448/814/659 449/815/660 +f 449/815/660 436/810/647 439/809/650 +f 436/810/647 449/815/660 450/816/661 +f 450/816/661 440/811/651 436/810/647 +f 440/811/651 450/816/661 451/817/662 +f 451/817/662 442/812/653 440/811/651 +f 442/812/653 451/817/662 452/818/663 +f 452/818/663 444/813/655 442/812/653 +f 452/818/663 453/836/664 446/834/657 +f 446/834/657 444/813/655 452/818/663 +f 454/820/665 449/815/660 448/814/659 +f 448/814/659 455/819/666 454/820/665 +f 456/821/667 450/816/661 449/815/660 +f 449/815/660 454/820/665 456/821/667 +f 457/822/668 451/817/662 450/816/661 +f 450/816/661 456/821/667 457/822/668 +f 458/823/669 452/818/663 451/817/662 +f 451/817/662 457/822/668 458/823/669 +f 458/823/669 459/838/670 453/836/664 +f 453/836/664 452/818/663 458/823/669 +f 460/824/671 438/799/649 461/825/672 +f 461/825/672 438/799/649 437/800/648 +f 437/800/648 462/826/673 461/825/672 +f 462/826/673 437/800/648 441/801/652 +f 441/801/652 461/827/672 462/826/673 +f 461/827/672 441/801/652 443/802/654 +f 443/802/654 463/828/674 461/827/672 +f 463/828/674 443/802/654 445/803/656 +f 445/803/656 461/829/672 463/828/674 +f 461/829/672 445/803/656 447/830/658 +f 464/831/675 439/804/650 438/799/649 +f 438/799/649 460/824/671 464/831/675 +f 448/814/659 439/809/650 464/832/675 +f 464/832/675 465/835/676 448/814/659 +f 455/819/666 448/814/659 465/835/676 +f 465/835/676 466/837/677 455/819/666 +f 467/841/678 468/840/679 469/839/680 +f 469/839/680 470/842/681 467/841/678 +f 471/843/682 467/841/678 470/842/681 +f 470/842/681 472/844/683 471/843/682 +f 473/845/684 471/843/682 472/844/683 +f 472/844/683 474/846/685 473/845/684 +f 475/847/686 473/845/684 474/846/685 +f 474/846/685 476/848/687 475/847/686 +f 476/848/687 447/850/658 446/849/657 +f 446/849/657 475/847/686 476/848/687 +f 468/851/679 467/854/678 477/853/688 +f 477/853/688 478/852/689 468/851/679 +f 467/854/678 471/856/682 479/855/690 +f 479/855/690 477/853/688 467/854/678 +f 471/856/682 473/858/684 480/857/691 +f 480/857/691 479/855/690 471/856/682 +f 473/858/684 475/860/686 481/859/692 +f 481/859/692 480/857/691 473/858/684 +f 481/859/692 475/860/686 446/862/657 +f 446/862/657 453/861/664 481/859/692 +f 482/864/693 483/863/694 478/852/689 +f 478/852/689 477/853/688 482/864/693 +f 484/865/695 482/864/693 477/853/688 +f 477/853/688 479/855/690 484/865/695 +f 485/866/696 484/865/695 479/855/690 +f 479/855/690 480/857/691 485/866/696 +f 486/867/697 485/866/696 480/857/691 +f 480/857/691 481/859/692 486/867/697 +f 486/867/697 481/859/692 453/861/664 +f 453/861/664 459/868/670 486/867/697 +f 460/869/671 461/870/672 469/839/680 +f 461/870/672 462/871/698 470/842/681 +f 470/842/681 469/839/680 461/870/672 +f 462/871/698 461/872/672 472/844/683 +f 472/844/683 470/842/681 462/871/698 +f 461/872/672 463/873/699 474/846/685 +f 474/846/685 472/844/683 461/872/672 +f 463/873/699 461/874/672 476/848/687 +f 476/848/687 474/846/685 463/873/699 +f 461/874/672 447/850/658 476/848/687 +f 464/875/675 460/869/671 469/839/680 +f 469/839/680 468/840/679 464/875/675 +f 478/852/689 465/876/676 464/877/675 +f 464/877/675 468/851/679 478/852/689 +f 483/863/694 466/878/677 465/876/676 +f 465/876/676 478/852/689 483/863/694 +s 2 +f 454/879/700 455/880/701 487/881/701 +f 487/881/701 488/882/700 454/879/700 +f 456/883/353 454/879/700 488/882/700 +f 488/882/700 489/884/353 456/883/353 +f 457/885/702 456/883/353 489/884/353 +f 489/884/353 490/886/702 457/885/702 +f 458/887/703 457/885/702 490/886/702 +f 490/886/702 491/888/703 458/887/703 +f 459/889/704 458/887/703 491/888/703 +f 491/888/703 492/890/705 459/889/704 +f 455/880/701 466/891/706 493/892/707 +f 493/892/707 487/881/701 455/880/701 +f 483/893/708 482/894/709 494/895/709 +f 494/895/709 495/896/708 483/893/708 +f 482/894/709 484/897/57 496/898/57 +f 496/898/57 494/895/709 482/894/709 +f 484/897/57 485/899/710 497/900/710 +f 497/900/710 496/898/57 484/897/57 +f 485/899/710 486/901/711 498/902/711 +f 498/902/711 497/900/710 485/899/710 +f 486/901/711 459/903/704 492/904/705 +f 492/904/705 498/902/711 486/901/711 +f 466/891/706 483/893/708 495/896/708 +f 495/896/708 493/892/707 466/891/706 +s 1 +f 499/911/712 500/910/713 501/905/714 +f 501/905/714 502/906/715 499/911/712 +f 503/912/716 499/911/712 502/906/715 +f 502/906/715 504/907/717 503/912/716 +f 505/913/718 503/912/716 504/907/717 +f 504/907/717 506/908/719 505/913/718 +f 507/914/720 505/913/718 506/908/719 +f 506/908/719 508/909/721 507/914/720 +f 508/909/721 509/936/722 510/939/723 +f 510/939/723 507/914/720 508/909/721 +f 500/915/713 499/916/712 511/921/724 +f 511/921/724 512/920/725 500/915/713 +f 499/916/712 503/917/716 513/922/726 +f 513/922/726 511/921/724 499/916/712 +f 503/917/716 505/918/718 514/923/727 +f 514/923/727 513/922/726 503/917/716 +f 505/918/718 507/919/720 515/924/728 +f 515/924/728 514/923/727 505/918/718 +f 515/924/728 507/919/720 510/940/723 +f 510/940/723 516/942/729 515/924/728 +f 517/926/730 518/925/731 512/920/725 +f 512/920/725 511/921/724 517/926/730 +f 519/927/732 517/926/730 511/921/724 +f 511/921/724 513/922/726 519/927/732 +f 520/928/733 519/927/732 513/922/726 +f 513/922/726 514/923/727 520/928/733 +f 521/929/734 520/928/733 514/923/727 +f 514/923/727 515/924/728 521/929/734 +f 521/929/734 515/924/728 516/942/729 +f 516/942/729 522/944/735 521/929/734 +f 523/930/736 524/931/737 501/905/714 +f 524/931/737 525/932/738 502/906/715 +f 502/906/715 501/905/714 524/931/737 +f 525/932/738 524/933/737 504/907/717 +f 504/907/717 502/906/715 525/932/738 +f 524/933/737 526/934/739 506/908/719 +f 506/908/719 504/907/717 524/933/737 +f 526/934/739 524/935/737 508/909/721 +f 508/909/721 506/908/719 526/934/739 +f 524/935/737 509/936/722 508/909/721 +f 527/937/740 523/930/736 501/905/714 +f 501/905/714 500/910/713 527/937/740 +f 512/920/725 528/941/741 527/938/740 +f 527/938/740 500/915/713 512/920/725 +f 518/925/731 529/943/742 528/941/741 +f 528/941/741 512/920/725 518/925/731 +f 530/947/743 531/948/744 532/945/745 +f 532/945/745 533/946/746 530/947/743 +f 534/949/747 535/950/748 531/948/744 +f 531/948/744 530/947/743 534/949/747 +f 536/951/749 537/952/750 535/950/748 +f 535/950/748 534/949/747 536/951/749 +f 538/953/751 539/954/752 537/952/750 +f 537/952/750 536/951/749 538/953/751 +f 539/954/752 538/953/751 510/955/723 +f 510/955/723 509/956/722 539/954/752 +f 533/957/746 540/958/753 541/959/754 +f 541/959/754 530/960/743 533/957/746 +f 530/960/743 541/959/754 542/961/755 +f 542/961/755 534/962/747 530/960/743 +f 534/962/747 542/961/755 543/963/756 +f 543/963/756 536/964/749 534/962/747 +f 536/964/749 543/963/756 544/965/757 +f 544/965/757 538/966/751 536/964/749 +f 544/965/757 516/967/729 510/968/723 +f 510/968/723 538/966/751 544/965/757 +f 545/970/758 541/959/754 540/958/753 +f 540/958/753 546/969/759 545/970/758 +f 547/971/760 542/961/755 541/959/754 +f 541/959/754 545/970/758 547/971/760 +f 548/972/761 543/963/756 542/961/755 +f 542/961/755 547/971/760 548/972/761 +f 549/973/762 544/965/757 543/963/756 +f 543/963/756 548/972/761 549/973/762 +f 549/973/762 522/974/735 516/967/729 +f 516/967/729 544/965/757 549/973/762 +f 523/975/736 532/945/745 524/976/737 +f 524/976/737 532/945/745 531/948/744 +f 531/948/744 525/977/763 524/976/737 +f 525/977/763 531/948/744 535/950/748 +f 535/950/748 524/978/737 525/977/763 +f 524/978/737 535/950/748 537/952/750 +f 537/952/750 526/979/764 524/978/737 +f 526/979/764 537/952/750 539/954/752 +f 539/954/752 524/980/737 526/979/764 +f 524/980/737 539/954/752 509/956/722 +f 527/981/740 533/946/746 532/945/745 +f 532/945/745 523/975/736 527/981/740 +f 540/958/753 533/957/746 527/983/740 +f 527/983/740 528/982/741 540/958/753 +f 546/969/759 540/958/753 528/982/741 +f 528/982/741 529/984/742 546/969/759 +s 2 +f 517/985/765 550/988/765 551/987/766 +f 551/987/766 518/986/766 517/985/765 +f 519/989/353 552/990/353 550/988/765 +f 550/988/765 517/985/765 519/989/353 +f 520/991/767 553/992/767 552/990/353 +f 552/990/353 519/989/353 520/991/767 +f 521/993/768 554/994/768 553/992/767 +f 553/992/767 520/991/767 521/993/768 +f 522/995/769 555/996/769 554/994/768 +f 554/994/768 521/993/768 522/995/769 +f 518/986/766 551/987/766 556/998/249 +f 556/998/249 529/997/561 518/986/766 +f 546/999/770 557/1002/770 558/1001/771 +f 558/1001/771 545/1000/771 546/999/770 +f 545/1000/771 558/1001/771 559/1004/14 +f 559/1004/14 547/1003/14 545/1000/771 +f 547/1003/14 559/1004/14 560/1006/772 +f 560/1006/772 548/1005/772 547/1003/14 +f 548/1005/772 560/1006/772 561/1008/773 +f 561/1008/773 549/1007/773 548/1005/772 +f 549/1007/773 561/1008/773 555/1010/769 +f 555/1010/769 522/1009/769 549/1007/773 +f 529/997/561 556/998/249 557/1002/770 +f 557/1002/770 546/999/770 529/997/561 +s 8 +f 562/1012/774 563/1011/775 564/1019/775 +f 564/1019/775 565/1018/774 562/1012/774 +f 566/1017/776 562/1012/774 565/1018/774 +f 565/1018/774 567/1020/776 566/1017/776 +f 568/1014/567 566/1013/776 567/1021/776 +f 567/1021/776 569/1022/777 568/1014/567 +f 570/1015/778 568/1014/567 569/1022/777 +f 569/1022/777 571/1023/778 570/1015/778 +f 572/1016/779 570/1015/778 571/1023/778 +f 571/1023/778 573/1024/779 572/1016/779 +f 563/1011/775 572/1016/779 573/1024/779 +f 573/1024/779 564/1019/775 563/1011/775 +f 574/1026/774 575/1027/774 576/1028/224 +f 576/1028/224 577/1025/224 574/1026/774 +f 578/1029/776 579/1030/776 575/1027/774 +f 575/1027/774 574/1026/774 578/1029/776 +f 580/1032/567 581/1033/567 579/1034/776 +f 579/1034/776 578/1031/776 580/1032/567 +f 582/1035/778 583/1036/778 581/1033/567 +f 581/1033/567 580/1032/567 582/1035/778 +f 584/1037/779 585/1038/779 583/1036/778 +f 583/1036/778 582/1035/778 584/1037/779 +f 577/1025/224 576/1028/224 585/1038/779 +f 585/1038/779 584/1037/779 577/1025/224 +f 586/1040/776 587/1046/776 588/1047/777 +f 588/1047/777 589/1039/777 586/1040/776 +f 590/1045/774 591/1048/774 587/1046/776 +f 587/1046/776 586/1040/776 590/1045/774 +f 592/1042/224 593/1050/224 591/1049/774 +f 591/1049/774 590/1041/774 592/1042/224 +f 594/1043/779 595/1051/779 593/1050/224 +f 593/1050/224 592/1042/224 594/1043/779 +f 596/1044/778 597/1052/778 595/1051/779 +f 595/1051/779 594/1043/779 596/1044/778 +f 589/1039/777 588/1047/777 597/1052/778 +f 597/1052/778 596/1044/778 589/1039/777 +f 598/1054/776 599/1053/777 600/1056/777 +f 600/1056/777 601/1055/776 598/1054/776 +f 602/1057/774 598/1054/776 601/1055/776 +f 601/1055/776 603/1058/774 602/1057/774 +f 604/1060/775 602/1059/774 603/1062/774 +f 603/1062/774 605/1061/224 604/1060/775 +f 606/1063/779 604/1060/775 605/1061/224 +f 605/1061/224 607/1064/779 606/1063/779 +f 608/1065/780 606/1063/779 607/1064/779 +f 607/1064/779 609/1066/778 608/1065/780 +f 599/1053/777 608/1065/780 609/1066/778 +f 609/1066/778 600/1056/777 599/1053/777 +s 1 +f 610/1067/781 611/1068/782 612/1069/783 +f 610/1067/781 612/1069/783 613/1070/784 +f 610/1067/781 613/1070/784 614/1075/785 +f 614/1075/785 615/1076/786 616/1077/787 +f 610/1067/781 614/1075/785 616/1077/787 +s off +f 617/1071/252 618/1072/252 619/1073/252 +f 619/1073/252 620/1074/252 621/1096/252 +f 617/1071/252 619/1073/252 621/1096/252 +f 621/1096/777 622/1097/777 623/1098/777 +f 617/1071/331 621/1096/331 623/1098/331 +s 1 +f 612/1069/783 619/1078/788 618/1079/789 +f 618/1079/789 613/1070/784 612/1069/783 +f 615/1076/786 614/1075/785 617/1080/790 +f 617/1080/790 623/1081/791 615/1076/786 +f 624/1082/792 625/1083/793 626/1084/794 +f 626/1084/794 627/1085/795 624/1082/792 +f 624/1082/792 627/1085/795 628/1086/796 +f 615/1076/786 624/1082/792 628/1086/796 +f 616/1077/787 615/1076/786 628/1086/796 +s off +f 622/1097/252 629/1099/252 626/1100/252 +f 622/1097/252 626/1100/252 625/1101/252 +f 623/1098/252 622/1097/252 625/1101/252 +s 1 +f 624/1082/792 615/1076/786 623/1081/791 +f 623/1081/791 625/1083/793 624/1082/792 +f 618/1079/789 617/1080/790 614/1075/785 +f 614/1075/785 613/1070/784 618/1079/789 +f 611/1068/782 610/1067/781 621/1087/797 +f 621/1087/797 620/1088/54 611/1068/782 +f 629/1090/798 622/1089/797 616/1077/787 +f 616/1077/787 628/1086/796 629/1090/798 +f 622/1089/797 621/1087/797 610/1067/781 +f 610/1067/781 616/1077/787 622/1089/797 +f 619/1095/788 612/1069/783 630/1091/799 +f 630/1091/799 631/1092/800 619/1095/788 +f 612/1069/783 611/1068/782 632/1093/801 +f 632/1093/801 630/1091/799 612/1069/783 +f 611/1068/782 620/1088/54 633/1094/54 +f 633/1094/54 632/1093/801 611/1068/782 +s off +f 620/1074/802 619/1073/802 631/1102/802 +f 631/1102/802 633/1103/802 620/1074/802 +s 1 +f 626/1084/794 629/1090/798 628/1086/796 +f 628/1086/796 627/1085/795 626/1084/794 +f 634/1110/803 635/1109/804 636/1108/805 +f 637/1104/806 634/1110/803 636/1108/805 +f 637/1104/806 636/1108/805 638/1107/807 +f 637/1104/806 638/1107/807 639/1106/808 +f 637/1104/806 639/1106/808 640/1105/809 +s off +f 641/1117/331 642/1116/331 643/1115/331 +f 644/1111/777 641/1117/777 643/1115/777 +f 643/1115/252 645/1114/252 646/1113/252 +f 644/1111/252 643/1115/252 646/1113/252 +f 644/1111/252 646/1113/252 647/1112/252 +s 1 +f 639/1106/808 638/1107/807 647/1119/810 +f 647/1119/810 646/1118/811 639/1106/808 +f 635/1109/804 641/1121/812 644/1120/813 +f 644/1120/813 636/1108/805 635/1109/804 +f 648/1122/814 649/1125/815 650/1124/816 +f 650/1124/816 651/1123/817 648/1122/814 +f 652/1126/818 649/1125/815 648/1122/814 +f 652/1126/818 648/1122/814 635/1109/804 +f 634/1110/803 652/1126/818 635/1109/804 +s off +f 650/1128/252 653/1127/252 642/1116/252 +f 651/1129/252 650/1128/252 642/1116/252 +f 641/1117/252 651/1129/252 642/1116/252 +s 1 +f 648/1122/814 651/1123/817 641/1121/812 +f 641/1121/812 635/1109/804 648/1122/814 +f 647/1119/810 638/1107/807 636/1108/805 +f 636/1108/805 644/1120/813 647/1119/810 +f 640/1105/809 645/1131/318 643/1130/819 +f 643/1130/819 637/1104/806 640/1105/809 +f 653/1133/820 652/1126/818 634/1110/803 +f 634/1110/803 642/1132/819 653/1133/820 +f 642/1132/819 634/1110/803 637/1104/806 +f 637/1104/806 643/1130/819 642/1132/819 +f 646/1134/811 654/1136/821 655/1135/822 +f 655/1135/822 639/1106/808 646/1134/811 +f 639/1106/808 655/1135/822 656/1137/823 +f 656/1137/823 640/1105/809 639/1106/808 +f 640/1105/809 656/1137/823 657/1138/318 +f 657/1138/318 645/1131/318 640/1105/809 +s off +f 645/1114/824 657/1140/824 654/1139/824 +f 654/1139/802 646/1113/802 645/1114/802 +s 1 +f 650/1124/816 649/1125/815 652/1126/818 +f 652/1126/818 653/1133/820 650/1124/816 +# 1210 faces + +# +# object Wheel_Front_Left +# + +v -13.8516 22.5774 7.6373 +v -13.8516 22.9580 10.0405 +v -19.5269 22.9580 10.0405 +v -19.5269 22.5774 7.6373 +v -13.8516 24.0627 12.2084 +v -19.5269 24.0627 12.2084 +v -13.8516 25.7832 13.9289 +v -19.5269 25.7832 13.9289 +v -13.8516 27.9511 15.0336 +v -19.5269 27.9511 15.0336 +v -13.8516 30.3543 15.4142 +v -19.5269 30.3543 15.4142 +v -13.8516 32.7575 15.0336 +v -19.5269 32.7575 15.0336 +v -13.8516 34.9255 13.9289 +v -19.5269 34.9255 13.9289 +v -13.8516 36.6460 12.2084 +v -19.5269 36.6460 12.2084 +v -13.8516 37.7506 10.0405 +v -19.5269 37.7506 10.0405 +v -13.8516 38.1312 7.6373 +v -19.5269 38.1312 7.6373 +v -13.8516 37.7506 5.2341 +v -19.5269 37.7506 5.2341 +v -13.8516 36.6460 3.0661 +v -19.5269 36.6460 3.0661 +v -13.8516 34.9255 1.3456 +v -19.5269 34.9255 1.3456 +v -13.8516 32.7575 0.2410 +v -19.5269 32.7575 0.2410 +v -13.8516 30.3543 -0.1396 +v -19.5269 30.3543 -0.1396 +v -13.8516 27.9511 0.2410 +v -19.5269 27.9511 0.2410 +v -13.8516 25.7832 1.3456 +v -19.5269 25.7832 1.3456 +v -13.8516 24.0627 3.0661 +v -19.5269 24.0627 3.0661 +v -13.8516 22.9580 5.2341 +v -19.5269 22.9580 5.2341 +# 40 vertices + +vn -0.0000 -1.0000 0.0000 +vn 0.0000 -0.9511 0.3090 +vn -0.0000 -0.9511 0.3090 +vn -0.0000 -0.8090 0.5878 +vn -0.0000 -0.5878 0.8090 +vn -0.0000 -0.3090 0.9511 +vn -0.0000 0.0000 1.0000 +vn -0.0000 0.3090 0.9511 +vn -0.0000 0.5878 0.8090 +vn 0.0000 0.5878 0.8090 +vn 0.0000 0.8090 0.5878 +vn 0.0000 0.9511 0.3090 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 0.9511 -0.3090 +vn 0.0000 0.8090 -0.5878 +vn 0.0000 0.5878 -0.8090 +vn 0.0000 0.3090 -0.9511 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 -0.3090 -0.9511 +vn -0.0000 -0.5878 -0.8090 +vn -0.0000 -0.8090 -0.5878 +vn -0.0000 -0.9511 -0.3090 +vn 1.0000 -0.0000 -0.0000 +vn 1.0000 0.0000 0.0000 +vn 1.0000 -0.0000 0.0000 +vn -1.0000 0.0000 -0.0000 +vn -1.0000 0.0000 0.0000 +# 27 vertex normals + +vt 0.4381 0.4951 0.5000 +vt 0.4381 0.3966 0.5000 +vt 0.4381 0.4951 0.5000 +vt 0.4381 0.3966 0.5000 +vt 0.0634 0.3966 0.5000 +vt 0.0634 0.4951 0.5000 +vt 0.4381 0.2980 0.5000 +vt 0.0634 0.2980 0.5000 +vt 0.4381 0.1994 0.5000 +vt 0.0634 0.1994 0.5000 +vt 0.4381 0.1008 0.5000 +vt 0.0634 0.1008 0.5000 +vt 0.4381 0.3966 0.5000 +vt 0.0634 0.3966 0.5000 +vt 0.4381 0.2980 0.5000 +vt 0.0634 0.2980 0.5000 +vt 0.4381 0.1994 0.5000 +vt 0.0634 0.1994 0.5000 +vt 0.4381 0.1008 0.5000 +vt 0.0634 0.1008 0.5000 +vt 0.0634 0.3966 0.5000 +vt 0.0634 0.4951 0.5000 +vt 0.4381 0.2980 0.5000 +vt 0.0634 0.2980 0.5000 +vt 0.4381 0.1994 0.5000 +vt 0.0634 0.1994 0.5000 +vt 0.4381 0.1008 0.5000 +vt 0.0634 0.1008 0.5000 +vt 0.4381 0.0022 0.5000 +vt 0.0634 0.0022 0.5000 +vt 0.9878 0.1722 0.0000 +vt 0.9524 0.1027 0.0000 +vt 0.8973 0.0476 0.0000 +vt 0.8278 0.0122 0.0000 +vt 0.7508 0.0000 0.0000 +vt 0.6738 0.0122 0.0000 +vt 0.6044 0.0476 0.0000 +vt 0.5493 0.1027 0.0000 +vt 0.5139 0.1722 0.0000 +vt 0.5017 0.2492 0.0000 +vt 0.5139 0.3262 0.0000 +vt 0.5493 0.3956 0.0000 +vt 0.6044 0.4507 0.0000 +vt 0.6738 0.4861 0.0000 +vt 0.7508 0.4983 0.0000 +vt 0.8278 0.4861 0.0000 +vt 0.8973 0.4507 0.0000 +vt 0.9524 0.3956 0.0000 +vt 0.9878 0.3262 0.0000 +vt 1.0000 0.2492 0.0000 +vt 0.9878 0.1722 0.0000 +vt 1.0000 0.2492 0.0000 +vt 0.9878 0.3262 0.0000 +vt 0.9524 0.3956 0.0000 +vt 0.8973 0.4507 0.0000 +vt 0.8278 0.4861 0.0000 +vt 0.7508 0.4983 0.0000 +vt 0.6738 0.4861 0.0000 +vt 0.6044 0.4507 0.0000 +vt 0.5493 0.3956 0.0000 +vt 0.5139 0.3262 0.0000 +vt 0.5017 0.2492 0.0000 +vt 0.5139 0.1722 0.0000 +vt 0.5493 0.1027 0.0000 +vt 0.6044 0.0476 0.0000 +vt 0.6738 0.0122 0.0000 +vt 0.7508 0.0000 0.0000 +vt 0.8278 0.0122 0.0000 +vt 0.8973 0.0476 0.0000 +vt 0.9524 0.1027 0.0000 +vt 0.4381 0.4951 0.5000 +vt 0.0634 0.4951 0.5000 +vt 0.4381 0.0022 0.5000 +vt 0.0634 0.0022 0.5000 +vt 0.4381 0.4951 0.5000 +vt 0.4381 0.3966 0.5000 +vt 0.0634 0.3966 0.5000 +vt 0.0634 0.4951 0.5000 +vt 0.4381 0.2980 0.5000 +vt 0.0634 0.2980 0.5000 +vt 0.4381 0.1994 0.5000 +vt 0.0634 0.1994 0.5000 +vt 0.4381 0.1008 0.5000 +vt 0.0634 0.1008 0.5000 +vt 0.4381 0.0022 0.5000 +vt 0.0634 0.0022 0.5000 +vt 0.4381 0.0022 0.5000 +vt 0.0634 0.0022 0.5000 +# 88 texture coords + +g Wheel_Front_Left +usemtl SUV_Wheels +s 1 +f 658/1215/825 659/1216/826 660/1217/827 +f 660/1217/827 661/1218/825 658/1215/825 +f 662/1219/828 663/1220/828 660/1217/827 +f 660/1217/827 659/1216/826 662/1219/828 +f 664/1221/829 665/1222/829 663/1220/828 +f 663/1220/828 662/1219/828 664/1221/829 +f 666/1223/830 667/1224/830 665/1222/829 +f 665/1222/829 664/1221/829 666/1223/830 +f 668/1225/831 669/1226/831 667/1224/830 +f 667/1224/830 666/1223/830 668/1225/831 +f 670/1153/832 671/1154/832 669/1212/831 +f 669/1212/831 668/1211/831 670/1153/832 +f 672/1155/833 673/1156/834 671/1154/832 +f 671/1154/832 670/1153/832 672/1155/833 +f 674/1157/835 675/1158/835 673/1156/834 +f 673/1156/834 672/1155/833 674/1157/835 +f 676/1159/836 677/1160/836 675/1158/835 +f 675/1158/835 674/1157/835 676/1159/836 +f 678/1213/837 679/1214/837 677/1160/836 +f 677/1160/836 676/1159/836 678/1213/837 +f 680/1144/838 681/1145/838 679/1146/837 +f 679/1146/837 678/1143/837 680/1144/838 +f 682/1147/839 683/1148/839 681/1145/838 +f 681/1145/838 680/1144/838 682/1147/839 +f 684/1149/840 685/1150/840 683/1148/839 +f 683/1148/839 682/1147/839 684/1149/840 +f 686/1151/841 687/1152/841 685/1150/840 +f 685/1150/840 684/1149/840 686/1151/841 +f 688/1227/842 689/1228/842 687/1152/841 +f 687/1152/841 686/1151/841 688/1227/842 +f 690/1142/843 691/1161/843 689/1162/842 +f 689/1162/842 688/1141/842 690/1142/843 +f 692/1163/844 693/1164/844 691/1161/843 +f 691/1161/843 690/1142/843 692/1163/844 +f 694/1165/845 695/1166/845 693/1164/844 +f 693/1164/844 692/1163/844 694/1165/845 +f 696/1167/846 697/1168/846 695/1166/845 +f 695/1166/845 694/1165/845 696/1167/846 +f 658/1169/825 661/1170/825 697/1168/846 +f 697/1168/846 696/1167/846 658/1169/825 +s 2 +f 694/1172/847 692/1173/848 690/1174/849 +f 690/1174/849 688/1175/847 686/1176/849 +f 686/1176/849 684/1177/848 682/1178/849 +f 690/1174/849 686/1176/849 682/1178/849 +f 682/1178/849 680/1179/848 678/1180/848 +f 678/1180/848 676/1181/848 674/1182/849 +f 682/1178/849 678/1180/848 674/1182/849 +f 674/1182/849 672/1183/848 670/1184/849 +f 670/1184/849 668/1185/847 666/1186/849 +f 674/1182/849 670/1184/849 666/1186/849 +f 666/1186/849 664/1187/848 662/1188/848 +f 662/1188/848 659/1189/848 658/1190/849 +f 666/1186/849 662/1188/848 658/1190/849 +f 674/1182/849 666/1186/849 658/1190/849 +f 682/1178/849 674/1182/849 658/1190/849 +f 690/1174/849 682/1178/849 658/1190/849 +f 694/1172/847 690/1174/849 658/1190/849 +f 696/1171/848 694/1172/847 658/1190/849 +f 697/1191/850 661/1192/851 660/1193/851 +f 697/1191/850 660/1193/851 663/1194/851 +f 697/1191/850 663/1194/851 665/1195/851 +f 697/1191/850 665/1195/851 667/1196/851 +f 697/1191/850 667/1196/851 669/1197/850 +f 697/1191/850 669/1197/850 671/1198/850 +f 697/1191/850 671/1198/850 673/1199/851 +f 697/1191/850 673/1199/851 675/1200/851 +f 697/1191/850 675/1200/851 677/1201/851 +f 697/1191/850 677/1201/851 679/1202/851 +f 697/1191/850 679/1202/851 681/1203/850 +f 697/1191/850 681/1203/850 683/1204/850 +f 697/1191/850 683/1204/850 685/1205/850 +f 697/1191/850 685/1205/850 687/1206/850 +f 697/1191/850 687/1206/850 689/1207/850 +f 697/1191/850 689/1207/850 691/1208/850 +f 697/1191/850 691/1208/850 693/1209/851 +f 697/1191/850 693/1209/851 695/1210/851 +# 76 faces + +# +# object Wheel_Front_Right +# + +v 12.7222 22.5774 7.6373 +v 18.3974 22.5774 7.6373 +v 18.3974 22.9580 10.0405 +v 12.7222 22.9580 10.0405 +v 12.7222 24.0627 12.2084 +v 18.3974 24.0627 12.2084 +v 12.7222 25.7832 13.9289 +v 18.3974 25.7832 13.9289 +v 12.7222 27.9511 15.0336 +v 18.3974 27.9511 15.0336 +v 12.7222 30.3543 15.4142 +v 18.3974 30.3543 15.4142 +v 12.7222 32.7575 15.0336 +v 18.3974 32.7575 15.0336 +v 12.7222 34.9255 13.9289 +v 18.3974 34.9255 13.9289 +v 12.7222 36.6460 12.2084 +v 18.3974 36.6460 12.2084 +v 12.7222 37.7506 10.0405 +v 18.3974 37.7506 10.0405 +v 12.7222 38.1312 7.6373 +v 18.3974 38.1312 7.6373 +v 12.7222 37.7506 5.2341 +v 18.3974 37.7506 5.2341 +v 12.7222 36.6460 3.0661 +v 18.3974 36.6460 3.0661 +v 12.7222 34.9255 1.3456 +v 18.3974 34.9255 1.3456 +v 12.7222 32.7575 0.2410 +v 18.3974 32.7575 0.2410 +v 12.7222 30.3543 -0.1396 +v 18.3974 30.3543 -0.1396 +v 12.7222 27.9511 0.2410 +v 18.3974 27.9511 0.2410 +v 12.7222 25.7832 1.3456 +v 18.3974 25.7832 1.3456 +v 12.7222 24.0627 3.0661 +v 18.3974 24.0627 3.0661 +v 12.7222 22.9580 5.2341 +v 18.3974 22.9580 5.2341 +# 40 vertices + +vn -0.0000 -1.0000 0.0000 +vn -0.0000 -0.9511 0.3090 +vn -0.0000 -0.8090 0.5878 +vn -0.0000 -0.5878 0.8090 +vn -0.0000 -0.3090 0.9511 +vn 0.0000 0.0000 1.0000 +vn -0.0000 0.0000 1.0000 +vn 0.0000 0.3090 0.9511 +vn 0.0000 0.5878 0.8090 +vn 0.0000 0.8090 0.5878 +vn -0.0000 0.8090 0.5878 +vn -0.0000 0.9511 0.3090 +vn 0.0000 0.9511 0.3090 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 0.9511 -0.3090 +vn 0.0000 0.8090 -0.5878 +vn 0.0000 0.5878 -0.8090 +vn 0.0000 0.3090 -0.9511 +vn 0.0000 -0.0000 -1.0000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 -0.3090 -0.9511 +vn -0.0000 -0.5878 -0.8090 +vn -0.0000 -0.8090 -0.5878 +vn -0.0000 -0.9511 -0.3090 +vn -1.0000 0.0000 -0.0000 +vn -1.0000 0.0000 0.0000 +vn -1.0000 -0.0000 -0.0000 +vn 1.0000 0.0000 0.0000 +# 28 vertex normals + +vt 0.4381 0.4951 0.5000 +vt 0.4381 0.3966 0.5000 +vt 0.0634 0.3966 0.5000 +vt 0.0634 0.4951 0.5000 +vt 0.4381 0.2980 0.5000 +vt 0.0634 0.2980 0.5000 +vt 0.4381 0.1994 0.5000 +vt 0.0634 0.1994 0.5000 +vt 0.4381 0.1008 0.5000 +vt 0.0634 0.1008 0.5000 +vt 0.4381 0.0022 0.5000 +vt 0.0634 0.0022 0.5000 +vt 0.4381 0.4951 0.5000 +vt 0.4381 0.3966 0.5000 +vt 0.0634 0.3966 0.5000 +vt 0.0634 0.4951 0.5000 +vt 0.4381 0.2980 0.5000 +vt 0.0634 0.2980 0.5000 +vt 0.4381 0.1994 0.5000 +vt 0.0634 0.1994 0.5000 +vt 0.4381 0.1008 0.5000 +vt 0.0634 0.1008 0.5000 +vt 0.4381 0.0022 0.5000 +vt 0.0634 0.0022 0.5000 +vt 0.4381 0.4951 0.5000 +vt 0.4381 0.3966 0.5000 +vt 0.0634 0.3966 0.5000 +vt 0.0634 0.4951 0.5000 +vt 0.4381 0.2980 0.5000 +vt 0.0634 0.2980 0.5000 +vt 0.4381 0.1994 0.5000 +vt 0.0634 0.1994 0.5000 +vt 0.4381 0.1008 0.5000 +vt 0.0634 0.1008 0.5000 +vt 0.4381 0.0022 0.5000 +vt 0.0634 0.0022 0.5000 +vt 0.4381 0.4951 0.5000 +vt 0.4381 0.3966 0.5000 +vt 0.0634 0.3966 0.5000 +vt 0.0634 0.4951 0.5000 +vt 0.4381 0.2980 0.5000 +vt 0.0634 0.2980 0.5000 +vt 0.4381 0.1994 0.5000 +vt 0.0634 0.1994 0.5000 +vt 0.4381 0.1008 0.5000 +vt 0.0634 0.1008 0.5000 +vt 0.4381 0.0022 0.5000 +vt 0.0634 0.0022 0.5000 +vt 0.9878 0.1722 0.0000 +vt 0.9524 0.1027 0.0000 +vt 0.8973 0.0476 0.0000 +vt 0.8278 0.0122 0.0000 +vt 0.7508 0.0000 0.0000 +vt 0.6738 0.0122 0.0000 +vt 0.6044 0.0476 0.0000 +vt 0.5493 0.1027 0.0000 +vt 0.5139 0.1722 0.0000 +vt 0.5017 0.2492 0.0000 +vt 0.5139 0.3262 0.0000 +vt 0.5493 0.3956 0.0000 +vt 0.6044 0.4507 0.0000 +vt 0.6738 0.4861 0.0000 +vt 0.7508 0.4983 0.0000 +vt 0.8278 0.4861 0.0000 +vt 0.8973 0.4507 0.0000 +vt 0.9524 0.3956 0.0000 +vt 0.9878 0.3262 0.0000 +vt 1.0000 0.2492 0.0000 +vt 0.9878 0.1722 0.0000 +vt 1.0000 0.2492 0.0000 +vt 0.9878 0.3262 0.0000 +vt 0.9524 0.3956 0.0000 +vt 0.8973 0.4507 0.0000 +vt 0.8278 0.4861 0.0000 +vt 0.7508 0.4983 0.0000 +vt 0.6738 0.4861 0.0000 +vt 0.6044 0.4507 0.0000 +vt 0.5493 0.3956 0.0000 +vt 0.5139 0.3262 0.0000 +vt 0.5017 0.2492 0.0000 +vt 0.5139 0.1722 0.0000 +vt 0.5493 0.1027 0.0000 +vt 0.6044 0.0476 0.0000 +vt 0.6738 0.0122 0.0000 +vt 0.7508 0.0000 0.0000 +vt 0.8278 0.0122 0.0000 +vt 0.8973 0.0476 0.0000 +vt 0.9524 0.1027 0.0000 +# 88 texture coords + +g Wheel_Front_Right +usemtl SUV_Wheels +s 1 +f 698/1229/852 699/1232/852 700/1231/853 +f 700/1231/853 701/1230/853 698/1229/852 +f 702/1233/854 701/1230/853 700/1231/853 +f 700/1231/853 703/1234/854 702/1233/854 +f 704/1235/855 702/1233/854 703/1234/854 +f 703/1234/854 705/1236/855 704/1235/855 +f 706/1237/856 704/1235/855 705/1236/855 +f 705/1236/855 707/1238/856 706/1237/856 +f 708/1239/857 706/1237/856 707/1238/856 +f 707/1238/856 709/1240/858 708/1239/857 +f 710/1242/859 708/1241/857 709/1244/858 +f 709/1244/858 711/1243/859 710/1242/859 +f 712/1245/860 710/1242/859 711/1243/859 +f 711/1243/859 713/1246/860 712/1245/860 +f 714/1247/861 712/1245/860 713/1246/860 +f 713/1246/860 715/1248/862 714/1247/861 +f 716/1249/863 714/1247/861 715/1248/862 +f 715/1248/862 717/1250/864 716/1249/863 +f 718/1251/865 716/1249/863 717/1250/864 +f 717/1250/864 719/1252/865 718/1251/865 +f 720/1254/866 718/1253/865 719/1256/865 +f 719/1256/865 721/1255/866 720/1254/866 +f 722/1257/867 720/1254/866 721/1255/866 +f 721/1255/866 723/1258/867 722/1257/867 +f 724/1259/868 722/1257/867 723/1258/867 +f 723/1258/867 725/1260/868 724/1259/868 +f 726/1261/869 724/1259/868 725/1260/868 +f 725/1260/868 727/1262/869 726/1261/869 +f 728/1263/870 726/1261/869 727/1262/869 +f 727/1262/869 729/1264/871 728/1263/870 +f 730/1266/872 728/1265/870 729/1268/871 +f 729/1268/871 731/1267/872 730/1266/872 +f 732/1269/873 730/1266/872 731/1267/872 +f 731/1267/872 733/1270/873 732/1269/873 +f 734/1271/874 732/1269/873 733/1270/873 +f 733/1270/873 735/1272/874 734/1271/874 +f 736/1273/875 734/1271/874 735/1272/874 +f 735/1272/874 737/1274/875 736/1273/875 +f 698/1275/852 736/1273/875 737/1274/875 +f 737/1274/875 699/1276/852 698/1275/852 +s 2 +f 698/1296/876 701/1295/877 702/1294/876 +f 702/1294/876 704/1293/876 706/1292/877 +f 698/1296/876 702/1294/876 706/1292/877 +f 706/1292/877 708/1291/877 710/1290/877 +f 710/1290/877 712/1289/877 714/1288/876 +f 706/1292/877 710/1290/877 714/1288/876 +f 698/1296/876 706/1292/877 714/1288/876 +f 714/1288/876 716/1287/877 718/1286/876 +f 718/1286/876 720/1285/877 722/1284/876 +f 714/1288/876 718/1286/876 722/1284/876 +f 698/1296/876 714/1288/876 722/1284/876 +f 722/1284/876 724/1283/876 726/1282/877 +f 726/1282/877 728/1281/877 730/1280/876 +f 722/1284/876 726/1282/877 730/1280/876 +f 698/1296/876 722/1284/876 730/1280/876 +f 730/1280/876 732/1279/877 734/1278/878 +f 698/1296/876 730/1280/876 734/1278/878 +f 736/1277/877 698/1296/876 734/1278/878 +f 737/1297/879 735/1316/879 733/1315/879 +f 737/1297/879 733/1315/879 731/1314/879 +f 737/1297/879 731/1314/879 729/1313/879 +f 737/1297/879 729/1313/879 727/1312/879 +f 737/1297/879 727/1312/879 725/1311/879 +f 737/1297/879 725/1311/879 723/1310/879 +f 737/1297/879 723/1310/879 721/1309/879 +f 737/1297/879 721/1309/879 719/1308/879 +f 737/1297/879 719/1308/879 717/1307/879 +f 737/1297/879 717/1307/879 715/1306/879 +f 737/1297/879 715/1306/879 713/1305/879 +f 737/1297/879 713/1305/879 711/1304/879 +f 737/1297/879 711/1304/879 709/1303/879 +f 737/1297/879 709/1303/879 707/1302/879 +f 737/1297/879 707/1302/879 705/1301/879 +f 737/1297/879 705/1301/879 703/1300/879 +f 737/1297/879 703/1300/879 700/1299/879 +f 737/1297/879 700/1299/879 699/1298/879 +# 76 faces + +# +# object Wheel_Rear +# + +v -13.8516 -33.4856 7.6373 +v -13.8516 -33.1049 10.0405 +v -19.5269 -33.1049 10.0405 +v -19.5269 -33.4856 7.6373 +v -13.8516 -32.0003 12.2084 +v -19.5269 -32.0003 12.2084 +v -13.8516 -30.2798 13.9289 +v -19.5269 -30.2798 13.9289 +v -13.8516 -28.1119 15.0336 +v -19.5269 -28.1119 15.0336 +v -13.8516 -25.7087 15.4142 +v -19.5269 -25.7087 15.4142 +v -13.8516 -23.3055 15.0336 +v -19.5269 -23.3055 15.0336 +v -13.8516 -21.1375 13.9289 +v -19.5269 -21.1375 13.9289 +v -13.8516 -19.4170 12.2084 +v -19.5269 -19.4170 12.2084 +v -13.8516 -18.3124 10.0405 +v -19.5269 -18.3124 10.0405 +v -13.8516 -17.9317 7.6373 +v -19.5269 -17.9317 7.6373 +v -13.8516 -18.3124 5.2341 +v -19.5269 -18.3124 5.2341 +v -13.8516 -19.4170 3.0661 +v -19.5269 -19.4170 3.0661 +v -13.8516 -21.1375 1.3456 +v -19.5269 -21.1375 1.3456 +v -13.8516 -23.3055 0.2410 +v -19.5269 -23.3055 0.2410 +v -13.8516 -25.7087 -0.1396 +v -19.5269 -25.7087 -0.1396 +v -13.8516 -28.1119 0.2410 +v -19.5269 -28.1119 0.2410 +v -13.8516 -30.2798 1.3456 +v -19.5269 -30.2798 1.3456 +v -13.8516 -32.0003 3.0661 +v -19.5269 -32.0003 3.0661 +v -13.8516 -33.1049 5.2341 +v -19.5269 -33.1049 5.2341 +v 12.7222 -33.4856 7.6373 +v 18.3974 -33.4856 7.6373 +v 18.3974 -33.1049 10.0405 +v 12.7222 -33.1049 10.0405 +v 12.7222 -32.0003 12.2084 +v 18.3974 -32.0003 12.2084 +v 12.7222 -30.2798 13.9289 +v 18.3974 -30.2798 13.9289 +v 12.7222 -28.1119 15.0336 +v 18.3974 -28.1119 15.0336 +v 12.7222 -25.7087 15.4142 +v 18.3974 -25.7087 15.4142 +v 12.7222 -23.3055 15.0336 +v 18.3974 -23.3055 15.0336 +v 12.7222 -21.1375 13.9289 +v 18.3974 -21.1375 13.9289 +v 12.7222 -19.4170 12.2084 +v 18.3974 -19.4170 12.2084 +v 12.7222 -18.3124 10.0405 +v 18.3974 -18.3124 10.0405 +v 12.7222 -17.9318 7.6373 +v 18.3974 -17.9318 7.6373 +v 12.7222 -18.3124 5.2341 +v 18.3974 -18.3124 5.2341 +v 12.7222 -19.4170 3.0661 +v 18.3974 -19.4170 3.0661 +v 12.7222 -21.1375 1.3456 +v 18.3974 -21.1375 1.3456 +v 12.7222 -23.3055 0.2410 +v 18.3974 -23.3055 0.2410 +v 12.7222 -25.7087 -0.1396 +v 18.3974 -25.7087 -0.1396 +v 12.7222 -28.1119 0.2410 +v 18.3974 -28.1119 0.2410 +v 12.7222 -30.2798 1.3456 +v 18.3974 -30.2798 1.3456 +v 12.7222 -32.0003 3.0661 +v 18.3974 -32.0003 3.0661 +v 12.7222 -33.1049 5.2341 +v 18.3974 -33.1050 5.2341 +# 80 vertices + +vn 0.0000 -1.0000 0.0000 +vn 0.0000 -0.9511 0.3090 +vn -0.0000 -0.9511 0.3090 +vn -0.0000 -0.8090 0.5878 +vn -0.0000 -0.5878 0.8090 +vn -0.0000 -0.3090 0.9511 +vn -0.0000 0.0000 1.0000 +vn 0.0000 0.3090 0.9511 +vn 0.0000 0.5878 0.8090 +vn 0.0000 0.8090 0.5878 +vn -0.0000 0.8090 0.5878 +vn -0.0000 0.9511 0.3090 +vn 0.0000 0.9511 0.3090 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 0.9511 -0.3090 +vn 0.0000 0.8090 -0.5878 +vn 0.0000 0.5878 -0.8090 +vn 0.0000 0.3090 -0.9511 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 -0.3090 -0.9511 +vn -0.0000 -0.5878 -0.8090 +vn -0.0000 -0.8090 -0.5878 +vn 0.0000 -0.8090 -0.5878 +vn 0.0000 -0.9511 -0.3090 +vn 1.0000 -0.0000 -0.0000 +vn 1.0000 0.0000 0.0000 +vn 1.0000 -0.0000 0.0000 +vn -1.0000 0.0000 -0.0000 +vn -1.0000 0.0000 0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 -1.0000 0.0000 +vn 0.0000 -0.8090 0.5878 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -0.0000 -1.0000 +vn -0.0000 -0.9511 -0.3090 +vn -1.0000 -0.0000 -0.0000 +# 36 vertex normals + +vt 0.4381 0.4951 0.5000 +vt 0.4381 0.3966 0.5000 +vt 0.4381 0.4951 0.5000 +vt 0.4381 0.3966 0.5000 +vt 0.0634 0.3966 0.5000 +vt 0.0634 0.4951 0.5000 +vt 0.4381 0.2980 0.5000 +vt 0.0634 0.2980 0.5000 +vt 0.4381 0.1994 0.5000 +vt 0.0634 0.1994 0.5000 +vt 0.4381 0.1008 0.5000 +vt 0.0634 0.1008 0.5000 +vt 0.4381 0.3966 0.5000 +vt 0.0634 0.3966 0.5000 +vt 0.4381 0.2980 0.5000 +vt 0.0634 0.2980 0.5000 +vt 0.4381 0.1994 0.5000 +vt 0.0634 0.1994 0.5000 +vt 0.4381 0.1008 0.5000 +vt 0.0634 0.1008 0.5000 +vt 0.0634 0.3966 0.5000 +vt 0.0634 0.4951 0.5000 +vt 0.4381 0.2980 0.5000 +vt 0.0634 0.2980 0.5000 +vt 0.4381 0.1994 0.5000 +vt 0.0634 0.1994 0.5000 +vt 0.4381 0.1008 0.5000 +vt 0.0634 0.1008 0.5000 +vt 0.4381 0.0022 0.5000 +vt 0.0634 0.0022 0.5000 +vt 0.9878 0.1722 0.0000 +vt 0.9524 0.1027 0.0000 +vt 0.8973 0.0476 0.0000 +vt 0.8278 0.0122 0.0000 +vt 0.7508 0.0000 0.0000 +vt 0.6738 0.0122 0.0000 +vt 0.6044 0.0476 0.0000 +vt 0.5493 0.1027 0.0000 +vt 0.5139 0.1722 0.0000 +vt 0.5017 0.2492 0.0000 +vt 0.5139 0.3262 0.0000 +vt 0.5493 0.3956 0.0000 +vt 0.6044 0.4507 0.0000 +vt 0.6738 0.4861 0.0000 +vt 0.7508 0.4983 0.0000 +vt 0.8278 0.4861 0.0000 +vt 0.8973 0.4507 0.0000 +vt 0.9524 0.3956 0.0000 +vt 0.9878 0.3262 0.0000 +vt 1.0000 0.2492 0.0000 +vt 0.9878 0.1722 0.0000 +vt 1.0000 0.2492 0.0000 +vt 0.9878 0.3262 0.0000 +vt 0.9524 0.3956 0.0000 +vt 0.8973 0.4507 0.0000 +vt 0.8278 0.4861 0.0000 +vt 0.7508 0.4983 0.0000 +vt 0.6738 0.4861 0.0000 +vt 0.6044 0.4507 0.0000 +vt 0.5493 0.3956 0.0000 +vt 0.5139 0.3262 0.0000 +vt 0.5017 0.2492 0.0000 +vt 0.5139 0.1722 0.0000 +vt 0.5493 0.1027 0.0000 +vt 0.6044 0.0476 0.0000 +vt 0.6738 0.0122 0.0000 +vt 0.7508 0.0000 0.0000 +vt 0.8278 0.0122 0.0000 +vt 0.8973 0.0476 0.0000 +vt 0.9524 0.1027 0.0000 +vt 0.4381 0.4951 0.5000 +vt 0.0634 0.4951 0.5000 +vt 0.4381 0.0022 0.5000 +vt 0.0634 0.0022 0.5000 +vt 0.4381 0.4951 0.5000 +vt 0.4381 0.3966 0.5000 +vt 0.0634 0.3966 0.5000 +vt 0.0634 0.4951 0.5000 +vt 0.4381 0.2980 0.5000 +vt 0.0634 0.2980 0.5000 +vt 0.4381 0.1994 0.5000 +vt 0.0634 0.1994 0.5000 +vt 0.4381 0.1008 0.5000 +vt 0.0634 0.1008 0.5000 +vt 0.4381 0.0022 0.5000 +vt 0.0634 0.0022 0.5000 +vt 0.4381 0.0022 0.5000 +vt 0.0634 0.0022 0.5000 +vt 0.4381 0.4951 0.5000 +vt 0.4381 0.3966 0.5000 +vt 0.0634 0.3966 0.5000 +vt 0.0634 0.4951 0.5000 +vt 0.4381 0.2980 0.5000 +vt 0.0634 0.2980 0.5000 +vt 0.4381 0.1994 0.5000 +vt 0.0634 0.1994 0.5000 +vt 0.4381 0.1008 0.5000 +vt 0.0634 0.1008 0.5000 +vt 0.4381 0.0022 0.5000 +vt 0.0634 0.0022 0.5000 +vt 0.4381 0.4951 0.5000 +vt 0.4381 0.3966 0.5000 +vt 0.0634 0.3966 0.5000 +vt 0.0634 0.4951 0.5000 +vt 0.4381 0.2980 0.5000 +vt 0.0634 0.2980 0.5000 +vt 0.4381 0.1994 0.5000 +vt 0.0634 0.1994 0.5000 +vt 0.4381 0.1008 0.5000 +vt 0.0634 0.1008 0.5000 +vt 0.4381 0.0022 0.5000 +vt 0.0634 0.0022 0.5000 +vt 0.4381 0.4951 0.5000 +vt 0.4381 0.3966 0.5000 +vt 0.0634 0.3966 0.5000 +vt 0.0634 0.4951 0.5000 +vt 0.4381 0.2980 0.5000 +vt 0.0634 0.2980 0.5000 +vt 0.4381 0.1994 0.5000 +vt 0.0634 0.1994 0.5000 +vt 0.4381 0.1008 0.5000 +vt 0.0634 0.1008 0.5000 +vt 0.4381 0.0022 0.5000 +vt 0.0634 0.0022 0.5000 +vt 0.4381 0.4951 0.5000 +vt 0.4381 0.3966 0.5000 +vt 0.0634 0.3966 0.5000 +vt 0.0634 0.4951 0.5000 +vt 0.4381 0.2980 0.5000 +vt 0.0634 0.2980 0.5000 +vt 0.4381 0.1994 0.5000 +vt 0.0634 0.1994 0.5000 +vt 0.4381 0.1008 0.5000 +vt 0.0634 0.1008 0.5000 +vt 0.4381 0.0022 0.5000 +vt 0.0634 0.0022 0.5000 +vt 0.9878 0.1722 0.0000 +vt 0.9524 0.1027 0.0000 +vt 0.8973 0.0476 0.0000 +vt 0.8278 0.0122 0.0000 +vt 0.7508 0.0000 0.0000 +vt 0.6738 0.0122 0.0000 +vt 0.6044 0.0476 0.0000 +vt 0.5493 0.1027 0.0000 +vt 0.5139 0.1722 0.0000 +vt 0.5017 0.2492 0.0000 +vt 0.5139 0.3262 0.0000 +vt 0.5493 0.3956 0.0000 +vt 0.6044 0.4507 0.0000 +vt 0.6738 0.4861 0.0000 +vt 0.7508 0.4983 0.0000 +vt 0.8278 0.4861 0.0000 +vt 0.8973 0.4507 0.0000 +vt 0.9524 0.3956 0.0000 +vt 0.9878 0.3262 0.0000 +vt 1.0000 0.2492 0.0000 +vt 0.9878 0.1722 0.0000 +vt 1.0000 0.2492 0.0000 +vt 0.9878 0.3262 0.0000 +vt 0.9524 0.3956 0.0000 +vt 0.8973 0.4507 0.0000 +vt 0.8278 0.4861 0.0000 +vt 0.7508 0.4983 0.0000 +vt 0.6738 0.4861 0.0000 +vt 0.6044 0.4507 0.0000 +vt 0.5493 0.3956 0.0000 +vt 0.5139 0.3262 0.0000 +vt 0.5017 0.2492 0.0000 +vt 0.5139 0.1722 0.0000 +vt 0.5493 0.1027 0.0000 +vt 0.6044 0.0476 0.0000 +vt 0.6738 0.0122 0.0000 +vt 0.7508 0.0000 0.0000 +vt 0.8278 0.0122 0.0000 +vt 0.8973 0.0476 0.0000 +vt 0.9524 0.1027 0.0000 +# 176 texture coords + +g Wheel_Rear +usemtl SUV_Wheels +s 1 +f 738/1391/880 739/1392/881 740/1393/882 +f 740/1393/882 741/1394/880 738/1391/880 +f 742/1395/883 743/1396/883 740/1393/882 +f 740/1393/882 739/1392/881 742/1395/883 +f 744/1397/884 745/1398/884 743/1396/883 +f 743/1396/883 742/1395/883 744/1397/884 +f 746/1399/885 747/1400/885 745/1398/884 +f 745/1398/884 744/1397/884 746/1399/885 +f 748/1401/886 749/1402/886 747/1400/885 +f 747/1400/885 746/1399/885 748/1401/886 +f 750/1329/887 751/1330/887 749/1388/886 +f 749/1388/886 748/1387/886 750/1329/887 +f 752/1331/888 753/1332/888 751/1330/887 +f 751/1330/887 750/1329/887 752/1331/888 +f 754/1333/889 755/1334/890 753/1332/888 +f 753/1332/888 752/1331/888 754/1333/889 +f 756/1335/891 757/1336/892 755/1334/890 +f 755/1334/890 754/1333/889 756/1335/891 +f 758/1389/893 759/1390/893 757/1336/892 +f 757/1336/892 756/1335/891 758/1389/893 +f 760/1320/894 761/1321/894 759/1322/893 +f 759/1322/893 758/1319/893 760/1320/894 +f 762/1323/895 763/1324/895 761/1321/894 +f 761/1321/894 760/1320/894 762/1323/895 +f 764/1325/896 765/1326/896 763/1324/895 +f 763/1324/895 762/1323/895 764/1325/896 +f 766/1327/897 767/1328/897 765/1326/896 +f 765/1326/896 764/1325/896 766/1327/897 +f 768/1403/898 769/1404/898 767/1328/897 +f 767/1328/897 766/1327/897 768/1403/898 +f 770/1318/899 771/1337/899 769/1338/898 +f 769/1338/898 768/1317/898 770/1318/899 +f 772/1339/900 773/1340/900 771/1337/899 +f 771/1337/899 770/1318/899 772/1339/900 +f 774/1341/901 775/1342/902 773/1340/900 +f 773/1340/900 772/1339/900 774/1341/901 +f 776/1343/903 777/1344/903 775/1342/902 +f 775/1342/902 774/1341/901 776/1343/903 +f 738/1345/880 741/1346/880 777/1344/903 +f 777/1344/903 776/1343/903 738/1345/880 +s 2 +f 774/1348/904 772/1349/905 770/1350/906 +f 770/1350/906 768/1351/904 766/1352/906 +f 766/1352/906 764/1353/905 762/1354/906 +f 770/1350/906 766/1352/906 762/1354/906 +f 762/1354/906 760/1355/905 758/1356/905 +f 758/1356/905 756/1357/905 754/1358/906 +f 762/1354/906 758/1356/905 754/1358/906 +f 754/1358/906 752/1359/905 750/1360/906 +f 750/1360/906 748/1361/904 746/1362/906 +f 754/1358/906 750/1360/906 746/1362/906 +f 746/1362/906 744/1363/905 742/1364/905 +f 742/1364/905 739/1365/905 738/1366/906 +f 746/1362/906 742/1364/905 738/1366/906 +f 754/1358/906 746/1362/906 738/1366/906 +f 762/1354/906 754/1358/906 738/1366/906 +f 770/1350/906 762/1354/906 738/1366/906 +f 774/1348/904 770/1350/906 738/1366/906 +f 776/1347/905 774/1348/904 738/1366/906 +f 777/1367/907 741/1368/908 740/1369/908 +f 777/1367/907 740/1369/908 743/1370/908 +f 777/1367/907 743/1370/908 745/1371/908 +f 777/1367/907 745/1371/908 747/1372/908 +f 777/1367/907 747/1372/908 749/1373/907 +f 777/1367/907 749/1373/907 751/1374/907 +f 777/1367/907 751/1374/907 753/1375/908 +f 777/1367/907 753/1375/908 755/1376/908 +f 777/1367/907 755/1376/908 757/1377/908 +f 777/1367/907 757/1377/908 759/1378/908 +f 777/1367/907 759/1378/908 761/1379/907 +f 777/1367/907 761/1379/907 763/1380/907 +f 777/1367/907 763/1380/907 765/1381/907 +f 777/1367/907 765/1381/907 767/1382/907 +f 777/1367/907 767/1382/907 769/1383/907 +f 777/1367/907 769/1383/907 771/1384/907 +f 777/1367/907 771/1384/907 773/1385/908 +f 777/1367/907 773/1385/908 775/1386/908 +s 1 +f 778/1405/909 779/1408/910 780/1407/882 +f 780/1407/882 781/1406/881 778/1405/909 +f 782/1409/911 781/1406/881 780/1407/882 +f 780/1407/882 783/1410/883 782/1409/911 +f 784/1411/884 782/1409/911 783/1410/883 +f 783/1410/883 785/1412/884 784/1411/884 +f 786/1413/885 784/1411/884 785/1412/884 +f 785/1412/884 787/1414/885 786/1413/885 +f 788/1415/912 786/1413/885 787/1414/885 +f 787/1414/885 789/1416/912 788/1415/912 +f 790/1418/887 788/1417/912 789/1420/912 +f 789/1420/912 791/1419/887 790/1418/887 +f 792/1421/888 790/1418/887 791/1419/887 +f 791/1419/887 793/1422/888 792/1421/888 +f 794/1423/889 792/1421/888 793/1422/888 +f 793/1422/888 795/1424/890 794/1423/889 +f 796/1425/891 794/1423/889 795/1424/890 +f 795/1424/890 797/1426/892 796/1425/891 +f 798/1427/893 796/1425/891 797/1426/892 +f 797/1426/892 799/1428/893 798/1427/893 +f 800/1430/894 798/1429/893 799/1432/893 +f 799/1432/893 801/1431/894 800/1430/894 +f 802/1433/895 800/1430/894 801/1431/894 +f 801/1431/894 803/1434/895 802/1433/895 +f 804/1435/896 802/1433/895 803/1434/895 +f 803/1434/895 805/1436/896 804/1435/896 +f 806/1437/897 804/1435/896 805/1436/896 +f 805/1436/896 807/1438/897 806/1437/897 +f 808/1439/913 806/1437/897 807/1438/897 +f 807/1438/897 809/1440/898 808/1439/913 +f 810/1442/899 808/1441/913 809/1444/898 +f 809/1444/898 811/1443/899 810/1442/899 +f 812/1445/900 810/1442/899 811/1443/899 +f 811/1443/899 813/1446/900 812/1445/900 +f 814/1447/901 812/1445/900 813/1446/900 +f 813/1446/900 815/1448/901 814/1447/901 +f 816/1449/914 814/1447/901 815/1448/901 +f 815/1448/901 817/1450/914 816/1449/914 +f 778/1451/909 816/1449/914 817/1450/914 +f 817/1450/914 779/1452/910 778/1451/909 +s 2 +f 778/1472/907 781/1471/908 782/1470/907 +f 782/1470/907 784/1469/907 786/1468/908 +f 778/1472/907 782/1470/907 786/1468/908 +f 786/1468/908 788/1467/908 790/1466/908 +f 790/1466/908 792/1465/908 794/1464/907 +f 786/1468/908 790/1466/908 794/1464/907 +f 778/1472/907 786/1468/908 794/1464/907 +f 794/1464/907 796/1463/908 798/1462/907 +f 798/1462/907 800/1461/908 802/1460/907 +f 794/1464/907 798/1462/907 802/1460/907 +f 778/1472/907 794/1464/907 802/1460/907 +f 802/1460/907 804/1459/907 806/1458/908 +f 806/1458/908 808/1457/908 810/1456/907 +f 802/1460/907 806/1458/908 810/1456/907 +f 778/1472/907 802/1460/907 810/1456/907 +f 810/1456/907 812/1455/908 814/1454/915 +f 778/1472/907 810/1456/907 814/1454/915 +f 816/1453/908 778/1472/907 814/1454/915 +f 817/1473/905 815/1492/905 813/1491/905 +f 817/1473/905 813/1491/905 811/1490/905 +f 817/1473/905 811/1490/905 809/1489/905 +f 817/1473/905 809/1489/905 807/1488/905 +f 817/1473/905 807/1488/905 805/1487/905 +f 817/1473/905 805/1487/905 803/1486/905 +f 817/1473/905 803/1486/905 801/1485/905 +f 817/1473/905 801/1485/905 799/1484/905 +f 817/1473/905 799/1484/905 797/1483/905 +f 817/1473/905 797/1483/905 795/1482/905 +f 817/1473/905 795/1482/905 793/1481/905 +f 817/1473/905 793/1481/905 791/1480/905 +f 817/1473/905 791/1480/905 789/1479/905 +f 817/1473/905 789/1479/905 787/1478/905 +f 817/1473/905 787/1478/905 785/1477/905 +f 817/1473/905 785/1477/905 783/1476/905 +f 817/1473/905 783/1476/905 780/1475/905 +f 817/1473/905 780/1475/905 779/1474/905 +# 152 faces + diff --git a/Flight_control/src/enemy_suv/enemy_suv_description/package.xml b/Flight_control/src/enemy_suv/enemy_suv_description/package.xml new file mode 100644 index 0000000..538d09f --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_description/package.xml @@ -0,0 +1,14 @@ + + + enemy_suv_description + 0.2.1 + + 3D models of the enemy_suv for simulation and visualization + + Johannes Meyer + Apache 2.0 + catkin + urdf + xacro + launch + diff --git a/Flight_control/src/enemy_suv/enemy_suv_description/urdf/enemy_suv.gazebo.xacro b/Flight_control/src/enemy_suv/enemy_suv_description/urdf/enemy_suv.gazebo.xacro new file mode 100644 index 0000000..ac01db1 --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_description/urdf/enemy_suv.gazebo.xacro @@ -0,0 +1,138 @@ + + + + + + + + cmd_vel + odom + odom + base_link + false + true + false + 100 + wheel_left_joint + wheel_right_joint + 2.160 + 0.66 + 10 + 100 + + + + + + 100.0 + base_link + ground_truth/state + 0.0 + world + + + + + 100 + 100 + 500000.0 + 10.0 + 0.001 + 0.1 + 1 0 0 + Gazebo/DarkGrey + + + + 100 + 100 + 500000.0 + 10.0 + 0.001 + 0.1 + 1 0 0 + Gazebo/DarkGrey + + + + + diff --git a/Flight_control/src/enemy_suv/enemy_suv_description/urdf/enemy_suv.urdf.xacro b/Flight_control/src/enemy_suv/enemy_suv_description/urdf/enemy_suv.urdf.xacro new file mode 100644 index 0000000..f06f424 --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_description/urdf/enemy_suv.urdf.xacro @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Flight_control/src/enemy_suv/enemy_suv_description/worlds/kunming.world b/Flight_control/src/enemy_suv/enemy_suv_description/worlds/kunming.world new file mode 100644 index 0000000..56ed8e3 --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_description/worlds/kunming.world @@ -0,0 +1,71 @@ + + + + + + model://sun + + + + model://kunming + 0 0 0 0 0 0 + + + 0.68 0.68 0.68 1.0 + + + + 0 + + + + + + + + + 1000 + 0.001 + 1.0 + + + + + diff --git a/Flight_control/src/enemy_suv/enemy_suv_description/worlds/kunming/km.jpg b/Flight_control/src/enemy_suv/enemy_suv_description/worlds/kunming/km.jpg new file mode 100644 index 0000000..3ae9c15 Binary files /dev/null and b/Flight_control/src/enemy_suv/enemy_suv_description/worlds/kunming/km.jpg differ diff --git a/Flight_control/src/enemy_suv/enemy_suv_description/worlds/kunming/kunming.material b/Flight_control/src/enemy_suv/enemy_suv_description/worlds/kunming/kunming.material new file mode 100644 index 0000000..4cd181b --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_description/worlds/kunming/kunming.material @@ -0,0 +1,20 @@ +material kunming/Image +{ + technique + { + pass + { + ambient .8 .8 .8 1.000000 + diffuse .5 .5 .5 1.000000 + specular 1 1 1 5.00000 + emissive 0.01 0.01 0.01 1.000000 + + texture_unit + { + texture km.jpg + filtering trilinear + scale 1 1 + } + } + } +} diff --git a/Flight_control/src/enemy_suv/enemy_suv_description/worlds/kunming/kunming.world b/Flight_control/src/enemy_suv/enemy_suv_description/worlds/kunming/kunming.world new file mode 100644 index 0000000..f1f5e8a --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_description/worlds/kunming/kunming.world @@ -0,0 +1,84 @@ + + + + + + model://sun + + + + + + 0.68 0.68 0.68 1.0 + + + + 0 + + + + + + true + + + + + file:///home/zhangshuai/micros_back/src/micros/tools/simulator/turtlebot_simulator/turtlebot_gazebo/worlds/kunmingjichang.dem + + + + 0 0 -1900 + + + + + + + + file:///home/zhangshuai/micros_back/src/micros/tools/simulator/turtlebot_simulator/turtlebot_gazebo/worlds/kunmingjichang.dem + + + + 0 0 -1900 + + + + + + + + + + + + + + + + + diff --git a/Flight_control/src/enemy_suv/enemy_suv_description/worlds/kunming/kunmingjichang.dem b/Flight_control/src/enemy_suv/enemy_suv_description/worlds/kunming/kunmingjichang.dem new file mode 100644 index 0000000..698dbce --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_description/worlds/kunming/kunmingjichang.dem @@ -0,0 +1 @@ +kunmingjichang 0 1 1 0 0 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 0.000000000000000 3 2 4 370327.650382543157320 90151.573536386393243 370327.650382543157320 90610.573536386393243 370825.650382543157320 90610.573536386393243 370825.650382543157320 90151.573536386393243 1950.000000000000000 2620.000000000000000 0.000000000000000 0 3.000000 3.000000 0.100000 1 167 00 00 0 0 0 0 0 3 0 0 0 0 0 00.00 1 1 154 1 370327.650382543157320 90151.573536386393243 0.000000000000000 1951.411254882812500 2228.078125000000000 19514 19515 19516 19531 19558 19581 19593 19606 19594 19572 19549 19545 19551 19554 19576 19599 19601 19608 19626 19644 19673 19696 19691 19680 19700 19729 19737 19740 19750 19762 19772 19770 19791 19829 19869 19894 19905 19916 19934 19973 20030 20090 20150 20225 20376 20553 20656 20610 20553 20545 20532 20550 20733 20951 21060 20945 20697 20478 20492 20595 20606 20681 20812 20948 21088 21219 21307 21344 21242 20958 20725 20658 20662 20673 20673 20741 20896 21088 21306 21349 21089 20737 20664 20859 21020 21104 21188 21206 21168 21114 20976 20826 20719 20671 20701 20718 20659 20600 20561 20569 20629 20693 20725 20763 20850 20943 20991 20969 20932 20973 21035 21014 21026 21025 21027 21179 21441 21580 21709 21894 21979 21905 21786 21669 21772 22012 22145 22120 22088 22122 22254 22281 22099 21888 21658 21452 21366 21379 21451 21519 21552 21580 21626 21684 21733 21748 21792 21866 21907 21921 21904 21832 21712 21602 1 2 154 1 370330.650382543157320 90151.573536386393243 0.000000000000000 1951.116333007812500 2235.085205078125000 19520 19511 19519 19557 19597 19605 19607 19642 19658 19638 19591 19567 19560 19560 19571 19580 19589 19606 19618 19624 19637 19655 19667 19670 19677 19692 19706 19718 19731 19735 19755 19762 19791 19830 19855 19875 19890 19906 19937 19977 20014 20048 20106 20222 20397 20521 20548 20486 20452 20453 20410 20460 20660 20876 20970 20830 20590 20453 20486 20552 20576 20662 20790 20953 21107 21189 21212 21288 21315 21125 20904 20731 20628 20597 20599 20665 20803 21020 21282 21388 21165 20774 20632 20790 20946 21060 21119 21074 21049 21087 21000 20832 20722 20681 20642 20584 20514 20488 20505 20548 20607 20664 20765 20900 20945 20964 21022 21027 21010 21099 21184 21163 21155 21096 21056 21166 21341 21452 21561 21730 21796 21700 21619 21578 21711 21888 21944 21895 21925 22078 22292 22351 22176 21965 21706 21505 21403 21368 21386 21438 21494 21525 21566 21619 21652 21657 21694 21744 21759 21779 21796 21763 21711 21678 1 3 154 1 370333.650382543157320 90151.573536386393243 0.000000000000000 1950.816894531250000 2240.774414062500000 19520 19508 19520 19567 19606 19607 19632 19696 19742 19721 19666 19619 19584 19578 19583 19578 19583 19597 19612 19623 19636 19651 19670 19673 19673 19686 19706 19721 19731 19739 19766 19786 19813 19840 19857 19882 19901 19919 19951 20007 20080 20129 20180 20259 20376 20441 20432 20384 20341 20338 20339 20432 20620 20826 20900 20750 20516 20427 20514 20535 20528 20605 20740 20894 21019 21055 21050 21165 21275 21231 21124 20945 20774 20683 20598 20580 20660 20878 21174 21367 21255 20879 20620 20700 20870 20991 21007 20933 20937 21048 21056 20939 20841 20824 20770 20659 20543 20505 20541 20596 20682 20783 20965 21175 21241 21191 21174 21137 21093 21198 21318 21299 21254 21212 21215 21249 21235 21260 21382 21532 21578 21502 21463 21493 21625 21718 21718 21715 21858 22100 22329 22408 22245 21995 21721 21539 21445 21391 21381 21419 21468 21479 21496 21541 21568 21570 21588 21612 21625 21652 21658 21611 21596 21651 1 4 154 1 370336.650382543157320 90151.573536386393243 0.000000000000000 1951.835205078125000 2239.978271484375000 19526 19518 19521 19544 19565 19578 19629 19704 19770 19761 19714 19666 19617 19593 19589 19577 19578 19586 19600 19623 19638 19646 19667 19679 19684 19701 19719 19736 19749 19760 19789 19821 19853 19885 19898 19909 19925 19946 19984 20039 20121 20197 20253 20300 20347 20348 20313 20280 20244 20278 20368 20504 20679 20847 20851 20645 20447 20411 20558 20568 20493 20532 20675 20829 20921 20888 20872 21010 21157 21213 21233 21156 21040 20968 20825 20677 20597 20692 20984 21265 21279 20966 20631 20628 20786 20861 20845 20804 20885 21058 21137 21086 21013 21019 20964 20833 20670 20579 20625 20722 20804 20917 21133 21341 21429 21408 21350 21268 21213 21284 21406 21375 21293 21303 21416 21466 21351 21235 21252 21348 21366 21333 21316 21363 21458 21523 21567 21645 21832 22077 22295 22400 22243 21972 21732 21589 21509 21435 21405 21445 21484 21479 21470 21485 21510 21515 21518 21532 21552 21583 21573 21486 21437 21521 1 5 154 1 370339.650382543157320 90151.573536386393243 0.000000000000000 1951.797973632812500 2241.331542968750000 19518 19521 19526 19532 19541 19562 19606 19665 19725 19725 19709 19690 19649 19606 19579 19570 19579 19594 19617 19647 19663 19665 19675 19690 19711 19735 19753 19768 19793 19813 19834 19853 19886 19914 19926 19942 19956 19957 19977 20029 20123 20226 20287 20307 20289 20236 20180 20173 20219 20325 20420 20547 20733 20867 20806 20561 20363 20396 20576 20599 20486 20509 20648 20788 20842 20754 20728 20858 20968 21051 21178 21266 21253 21192 21056 20846 20639 20579 20756 21063 21210 21011 20682 20578 20657 20707 20700 20706 20859 21071 21199 21204 21157 21167 21127 20998 20795 20646 20691 20863 20946 21010 21172 21374 21502 21553 21515 21419 21363 21379 21455 21414 21329 21374 21546 21642 21523 21320 21211 21223 21256 21265 21276 21330 21397 21463 21563 21724 21940 22127 22292 22413 22254 21988 21797 21669 21584 21484 21431 21459 21511 21517 21494 21480 21496 21506 21498 21503 21520 21543 21526 21432 21335 21361 1 6 154 1 370342.650382543157320 90151.573536386393243 0.000000000000000 1952.307495117187500 2248.957763671875000 19523 19524 19526 19526 19530 19557 19588 19623 19651 19642 19648 19659 19635 19601 19576 19578 19604 19636 19670 19701 19711 19707 19701 19710 19753 19785 19802 19819 19847 19879 19912 19921 19919 19905 19887 19908 19926 19921 19933 19990 20089 20184 20232 20236 20178 20105 20068 20108 20228 20380 20491 20595 20731 20804 20706 20483 20324 20414 20602 20613 20483 20486 20601 20718 20762 20661 20614 20696 20740 20837 21052 21243 21252 21146 21055 20936 20772 20610 20571 20770 20995 20983 20745 20547 20526 20581 20628 20711 20873 21070 21231 21281 21250 21245 21210 21092 20867 20665 20693 20953 21086 21115 21194 21387 21549 21623 21618 21565 21527 21493 21540 21499 21409 21421 21595 21725 21645 21474 21318 21214 21253 21306 21345 21426 21495 21530 21600 21785 22068 22297 22429 22490 22314 22076 21901 21756 21637 21524 21453 21468 21523 21560 21560 21539 21530 21540 21525 21521 21528 21519 21453 21370 21307 21273 1 7 154 1 370345.650382543157320 90151.573536386393243 0.000000000000000 1953.524780273437500 2258.189697265625000 19535 19537 19539 19535 19538 19563 19580 19594 19604 19589 19588 19588 19579 19573 19567 19581 19605 19635 19680 19717 19725 19733 19741 19750 19802 19838 19860 19886 19916 19952 19990 19975 19933 19870 19824 19847 19861 19858 19870 19921 19993 20045 20071 20079 20048 20015 20016 20085 20191 20307 20438 20576 20689 20725 20613 20405 20299 20436 20629 20634 20462 20432 20543 20643 20699 20606 20525 20567 20641 20798 21027 21173 21122 20978 20902 20902 20881 20723 20516 20543 20723 20804 20678 20542 20537 20585 20633 20744 20905 21065 21220 21302 21297 21263 21201 21095 20905 20677 20656 20950 21171 21219 21261 21408 21532 21588 21631 21667 21649 21580 21613 21595 21500 21459 21602 21757 21732 21615 21478 21286 21237 21319 21401 21523 21615 21655 21715 21867 22098 22348 22532 22582 22416 22194 22008 21829 21679 21564 21494 21499 21535 21585 21616 21604 21579 21578 21573 21567 21567 21548 21453 21305 21215 21168 1 8 154 1 370348.650382543157320 90151.573536386393243 0.000000000000000 1953.875244140625000 2264.639892578125000 19549 19546 19545 19539 19543 19564 19579 19597 19599 19583 19566 19553 19547 19557 19558 19563 19576 19598 19636 19676 19690 19710 19738 19767 19815 19838 19850 19878 19916 19954 19972 19954 19907 19831 19786 19802 19812 19815 19823 19852 19887 19906 19923 19937 19946 19959 19985 20041 20100 20162 20275 20428 20549 20594 20510 20337 20289 20449 20619 20634 20454 20435 20582 20684 20699 20572 20503 20591 20701 20873 21048 21096 20970 20799 20716 20783 20899 20826 20592 20462 20483 20536 20510 20516 20598 20672 20698 20740 20859 21007 21169 21290 21329 21300 21217 21092 20948 20744 20647 20866 21169 21255 21288 21361 21413 21476 21607 21742 21731 21628 21664 21692 21608 21521 21612 21764 21783 21716 21607 21390 21230 21279 21409 21554 21669 21760 21884 22086 22279 22412 22549 22646 22525 22314 22122 21918 21738 21606 21549 21570 21577 21589 21636 21654 21643 21635 21631 21622 21605 21568 21454 21255 21134 21081 1 9 154 1 370351.650382543157320 90151.573536386393243 0.000000000000000 1953.703735351562500 2263.820068359375000 19552 19551 19546 19537 19550 19571 19585 19600 19600 19588 19570 19555 19542 19547 19553 19549 19556 19565 19584 19617 19645 19672 19703 19733 19754 19762 19772 19784 19830 19880 19894 19872 19829 19781 19765 19778 19791 19801 19814 19830 19846 19853 19866 19885 19909 19924 19945 19980 20015 20055 20123 20222 20312 20362 20333 20263 20333 20509 20644 20651 20462 20419 20589 20706 20684 20544 20524 20689 20811 20911 21004 21028 20912 20699 20583 20686 20853 20825 20658 20489 20397 20428 20497 20535 20591 20690 20767 20782 20806 20924 21106 21249 21318 21332 21258 21106 20976 20837 20712 20781 21077 21203 21231 21252 21275 21407 21644 21806 21795 21703 21730 21778 21696 21575 21608 21749 21799 21769 21690 21491 21285 21251 21384 21531 21646 21778 21987 22296 22505 22527 22566 22638 22569 22409 22244 22048 21832 21668 21628 21688 21690 21634 21647 21699 21709 21695 21663 21611 21544 21472 21379 21255 21209 21192 1 10 154 1 370354.650382543157320 90151.573536386393243 0.000000000000000 1953.617919921875000 2254.472167968750000 19554 19560 19562 19553 19551 19567 19579 19595 19598 19594 19570 19549 19541 19536 19545 19551 19557 19560 19565 19584 19623 19660 19698 19713 19701 19681 19681 19698 19739 19786 19805 19787 19761 19744 19748 19771 19797 19813 19822 19839 19864 19884 19908 19943 19953 19937 19945 19969 19990 20017 20047 20088 20134 20173 20196 20235 20372 20517 20623 20629 20448 20367 20502 20607 20580 20489 20566 20761 20837 20838 20875 20917 20823 20623 20531 20661 20789 20689 20544 20450 20397 20483 20640 20668 20625 20650 20753 20846 20873 20933 21066 21175 21239 21294 21276 21131 20983 20864 20751 20705 20929 21088 21105 21123 21192 21430 21698 21846 21858 21803 21779 21802 21740 21623 21616 21719 21772 21762 21718 21569 21368 21250 21324 21454 21547 21691 21937 22284 22488 22448 22440 22517 22545 22470 22332 22169 21966 21786 21725 21798 21829 21730 21678 21725 21761 21771 21717 21619 21539 21499 21461 21395 21395 21433 1 11 154 1 370357.650382543157320 90151.573536386393243 0.000000000000000 1954.049682617187500 2257.104003906250000 19556 19558 19562 19555 19547 19559 19574 19592 19601 19606 19581 19559 19556 19540 19543 19552 19556 19558 19556 19571 19611 19658 19704 19728 19700 19639 19633 19655 19678 19696 19718 19732 19738 19745 19763 19792 19824 19845 19846 19858 19901 19940 19974 20021 20039 20006 20000 20037 20071 20092 20103 20114 20139 20177 20200 20229 20327 20413 20500 20542 20414 20308 20390 20458 20431 20424 20577 20727 20746 20728 20780 20796 20668 20507 20502 20638 20661 20501 20385 20384 20430 20559 20726 20808 20775 20709 20743 20882 20978 21025 21079 21102 21100 21163 21217 21106 20941 20801 20689 20626 20809 20968 20948 20979 21106 21405 21668 21806 21831 21807 21763 21795 21778 21691 21666 21709 21742 21738 21738 21634 21424 21252 21279 21391 21484 21635 21862 22115 22245 22244 22317 22496 22571 22521 22368 22219 22078 21915 21800 21854 21912 21829 21768 21784 21819 21843 21823 21750 21715 21724 21681 21580 21596 21671 1 12 154 1 370360.650382543157320 90151.573536386393243 0.000000000000000 1954.963256835937500 2258.213867187500000 19565 19564 19563 19555 19550 19563 19581 19591 19605 19614 19603 19580 19572 19560 19551 19551 19554 19556 19552 19567 19606 19651 19690 19716 19689 19626 19624 19648 19664 19673 19691 19714 19733 19756 19792 19832 19866 19886 19881 19890 19932 19978 20011 20039 20078 20076 20087 20136 20179 20219 20243 20238 20228 20242 20229 20206 20234 20280 20363 20440 20382 20284 20323 20350 20341 20391 20524 20590 20608 20682 20751 20684 20511 20406 20468 20534 20485 20388 20357 20406 20503 20657 20804 20935 20987 20897 20854 20941 21017 21021 21069 21037 20942 20979 21099 21065 20925 20734 20576 20539 20706 20823 20779 20829 21022 21314 21537 21655 21668 21674 21691 21806 21829 21769 21716 21714 21740 21754 21780 21697 21469 21263 21270 21396 21482 21574 21725 21869 21958 22083 22322 22549 22582 22514 22355 22192 22060 21932 21845 21876 21926 21935 21935 21935 21942 21938 21958 21943 21916 21894 21822 21738 21813 21910 1 13 154 1 370363.650382543157320 90151.573536386393243 0.000000000000000 1955.597045898437500 2244.333007812500000 19579 19575 19574 19571 19574 19585 19589 19587 19600 19614 19616 19595 19582 19572 19561 19556 19556 19561 19569 19576 19602 19633 19646 19652 19647 19631 19637 19650 19659 19671 19688 19710 19739 19774 19822 19856 19889 19914 19911 19917 19942 19964 20005 20048 20095 20129 20170 20213 20233 20242 20261 20254 20220 20226 20212 20182 20199 20249 20326 20394 20355 20259 20272 20275 20288 20356 20427 20459 20544 20683 20697 20542 20376 20329 20389 20409 20383 20366 20409 20476 20546 20687 20887 21077 21207 21153 21045 21037 21014 20898 20909 20902 20787 20782 20922 20988 20969 20778 20527 20449 20574 20652 20642 20689 20848 21052 21250 21385 21408 21476 21599 21767 21817 21792 21746 21723 21721 21745 21781 21741 21555 21332 21268 21387 21512 21575 21636 21733 21846 22053 22307 22443 22434 22383 22285 22164 22047 21972 21956 21989 22013 22074 22141 22122 22073 22038 22101 22157 22139 22054 21943 21924 22016 22092 1 14 154 1 370366.650382543157320 90151.573536386393243 0.000000000000000 1956.285156250000000 2233.410644531250000 19584 19583 19583 19589 19599 19606 19598 19594 19605 19614 19619 19608 19596 19584 19571 19565 19563 19566 19579 19581 19591 19609 19612 19608 19619 19629 19638 19650 19665 19677 19690 19717 19760 19809 19852 19867 19886 19912 19918 19912 19922 19925 19963 20042 20103 20137 20190 20222 20213 20185 20164 20144 20119 20143 20162 20160 20194 20268 20348 20394 20340 20244 20241 20248 20271 20310 20352 20416 20527 20623 20571 20390 20273 20268 20308 20351 20397 20426 20477 20570 20634 20680 20846 21065 21242 21259 21181 21078 20945 20775 20691 20675 20605 20593 20724 20861 20949 20809 20513 20387 20526 20693 20760 20781 20826 20862 20936 21056 21142 21254 21411 21598 21698 21728 21719 21701 21669 21684 21743 21756 21651 21459 21306 21337 21485 21590 21678 21784 21872 22037 22188 22213 22177 22130 22082 22065 22093 22122 22171 22195 22164 22195 22275 22222 22176 22193 22247 22331 22334 22215 22124 22111 22129 22158 1 15 154 1 370369.650382543157320 90151.573536386393243 0.000000000000000 1956.959960937500000 2247.749023437500000 19584 19585 19582 19588 19597 19604 19606 19603 19606 19611 19613 19607 19595 19585 19578 19570 19571 19577 19580 19572 19574 19589 19601 19603 19606 19617 19631 19650 19676 19694 19710 19731 19778 19832 19863 19870 19877 19889 19891 19884 19884 19903 19943 20027 20106 20126 20132 20151 20133 20097 20064 20038 20027 20054 20089 20122 20172 20245 20330 20371 20305 20227 20225 20234 20246 20270 20297 20358 20468 20527 20445 20288 20273 20330 20361 20418 20488 20550 20576 20665 20761 20800 20855 20962 21083 21135 21158 21059 20890 20718 20605 20566 20499 20436 20511 20668 20806 20724 20473 20365 20543 20779 20905 20955 20984 20975 20935 20897 20915 21057 21294 21515 21608 21633 21641 21634 21624 21650 21701 21732 21707 21584 21404 21309 21400 21532 21643 21747 21798 21887 21960 21941 21918 21901 21918 21987 22087 22192 22317 22377 22304 22286 22328 22292 22341 22385 22394 22477 22460 22329 22319 22315 22289 22265 1 16 154 1 370372.650382543157320 90151.573536386393243 0.000000000000000 1956.234863281250000 2261.865234375000000 19592 19593 19594 19591 19597 19598 19602 19603 19599 19604 19602 19598 19594 19585 19578 19573 19578 19583 19580 19566 19562 19574 19594 19599 19604 19614 19630 19651 19680 19714 19737 19743 19769 19809 19830 19848 19862 19854 19845 19854 19880 19922 19961 20004 20067 20094 20058 20056 20047 20024 20007 19990 19982 20003 20033 20081 20136 20195 20268 20292 20240 20191 20189 20200 20209 20233 20248 20266 20336 20390 20341 20280 20396 20523 20549 20587 20627 20681 20702 20793 20922 20992 20975 20936 20925 20951 21045 21039 20951 20778 20626 20530 20421 20339 20357 20430 20513 20498 20384 20347 20512 20732 20877 20971 21043 21080 21067 20996 20908 20947 21196 21449 21553 21575 21555 21526 21547 21629 21669 21686 21713 21667 21526 21347 21318 21412 21509 21593 21640 21675 21712 21720 21778 21891 22018 22124 22209 22247 22291 22355 22348 22363 22409 22457 22574 22580 22564 22619 22554 22438 22457 22469 22470 22435 1 17 154 1 370375.650382543157320 90151.573536386393243 0.000000000000000 1956.986572265625000 2277.207031250000000 19609 19612 19618 19609 19611 19609 19609 19608 19596 19603 19603 19603 19602 19588 19585 19586 19588 19582 19574 19570 19570 19576 19596 19604 19608 19615 19627 19645 19675 19714 19743 19756 19771 19784 19797 19814 19826 19817 19817 19842 19885 19923 19944 19947 19985 20021 19993 19978 19994 19994 19978 19975 19995 20018 20032 20061 20123 20183 20243 20249 20195 20162 20155 20165 20180 20199 20210 20211 20228 20254 20258 20313 20495 20638 20674 20699 20743 20773 20778 20862 20980 21064 21082 21023 20887 20797 20878 20953 20966 20784 20531 20381 20319 20304 20321 20325 20336 20340 20323 20335 20447 20589 20721 20832 20918 20988 21067 21129 21097 21006 21046 21219 21333 21399 21396 21336 21358 21482 21542 21580 21664 21691 21622 21451 21325 21334 21394 21452 21502 21541 21591 21661 21807 22036 22229 22345 22420 22402 22328 22328 22339 22377 22501 22633 22772 22764 22726 22705 22618 22531 22534 22576 22619 22577 1 18 154 1 370378.650382543157320 90151.573536386393243 0.000000000000000 1956.893310546875000 2287.461425781250000 19622 19624 19629 19619 19621 19621 19617 19611 19598 19604 19611 19614 19609 19601 19602 19590 19579 19569 19570 19579 19581 19582 19596 19602 19600 19605 19626 19644 19667 19695 19731 19751 19762 19767 19778 19791 19793 19788 19802 19837 19876 19893 19900 19904 19922 19946 19940 19946 19983 19994 19980 19985 20045 20094 20093 20089 20130 20200 20245 20210 20163 20146 20136 20141 20155 20173 20181 20190 20191 20195 20226 20321 20460 20549 20592 20634 20703 20738 20738 20801 20891 20975 21046 21047 20913 20735 20728 20833 20892 20690 20381 20251 20266 20338 20394 20374 20337 20359 20417 20449 20493 20523 20634 20792 20890 20956 21044 21169 21244 21158 21027 21014 21063 21102 21131 21100 21108 21213 21313 21407 21540 21638 21645 21535 21405 21361 21387 21426 21478 21541 21624 21720 21862 22085 22329 22498 22572 22572 22499 22453 22396 22392 22584 22767 22875 22858 22796 22727 22645 22578 22593 22696 22725 22599 1 19 154 1 370381.650382543157320 90151.573536386393243 0.000000000000000 1957.380859375000000 2288.134765625000000 19637 19632 19630 19623 19622 19624 19625 19619 19612 19618 19631 19638 19634 19638 19634 19612 19584 19574 19578 19585 19587 19594 19600 19603 19599 19603 19622 19646 19678 19695 19723 19740 19747 19751 19767 19790 19788 19781 19795 19829 19868 19876 19867 19874 19878 19891 19921 19974 20023 20039 20007 19998 20060 20142 20164 20137 20150 20221 20249 20184 20149 20143 20137 20132 20140 20158 20185 20220 20225 20219 20239 20287 20342 20395 20466 20543 20624 20648 20640 20693 20769 20853 20926 20955 20891 20741 20647 20683 20754 20574 20284 20211 20278 20414 20525 20510 20435 20455 20573 20644 20658 20606 20614 20744 20895 21010 21098 21200 21304 21270 21116 21015 21021 20998 20991 20987 20977 21025 21121 21243 21393 21524 21581 21576 21543 21514 21516 21518 21568 21627 21719 21831 21931 22112 22367 22598 22681 22690 22653 22552 22419 22414 22639 22816 22881 22841 22777 22741 22712 22684 22725 22818 22751 22540 1 20 154 1 370384.650382543157320 90151.573536386393243 0.000000000000000 1958.994262695312500 2285.390625000000000 19687 19659 19651 19643 19633 19626 19621 19614 19627 19646 19657 19671 19679 19690 19679 19661 19636 19605 19590 19598 19603 19606 19601 19604 19606 19611 19625 19657 19697 19711 19730 19743 19745 19742 19770 19800 19790 19788 19800 19824 19847 19861 19857 19860 19863 19867 19916 20006 20072 20082 20043 20012 20040 20108 20143 20135 20151 20216 20255 20199 20148 20145 20163 20174 20174 20184 20231 20273 20267 20256 20271 20283 20289 20323 20398 20487 20557 20565 20549 20568 20616 20669 20713 20770 20756 20672 20583 20544 20578 20452 20248 20256 20370 20518 20641 20632 20519 20503 20657 20821 20884 20789 20641 20646 20791 20942 21080 21209 21310 21326 21215 21076 21045 21070 21060 21021 21046 21084 21091 21126 21247 21384 21473 21566 21623 21648 21641 21633 21693 21745 21830 21971 22069 22258 22501 22743 22825 22807 22755 22591 22425 22447 22652 22787 22826 22767 22723 22780 22843 22831 22847 22854 22677 22505 1 21 154 1 370387.650382543157320 90151.573536386393243 0.000000000000000 1960.924438476562500 2297.371826171875000 19734 19686 19671 19657 19633 19620 19615 19620 19650 19679 19686 19701 19725 19731 19725 19721 19700 19661 19631 19623 19624 19620 19609 19613 19613 19616 19638 19686 19734 19741 19746 19751 19747 19749 19777 19793 19787 19795 19812 19833 19840 19852 19861 19865 19863 19857 19888 19972 20048 20076 20066 20022 20004 20021 20045 20063 20109 20196 20250 20207 20151 20156 20194 20222 20227 20240 20266 20271 20254 20267 20293 20291 20280 20290 20342 20405 20448 20459 20455 20445 20435 20440 20453 20499 20502 20448 20413 20397 20385 20320 20249 20363 20537 20704 20812 20756 20572 20519 20656 20869 21005 20982 20805 20655 20662 20807 20991 21144 21250 21326 21322 21189 21086 21153 21193 21119 21161 21262 21236 21166 21172 21258 21365 21472 21566 21637 21697 21770 21851 21890 21948 22118 22269 22510 22739 22916 22974 22937 22832 22634 22503 22494 22565 22676 22733 22715 22716 22820 22904 22880 22827 22748 22589 22551 1 22 154 1 370390.650382543157320 90151.573536386393243 0.000000000000000 1961.875854492187500 2309.429199218750000 19743 19706 19690 19666 19637 19625 19622 19638 19683 19717 19726 19743 19766 19766 19760 19758 19742 19725 19708 19681 19652 19634 19629 19627 19619 19619 19640 19680 19722 19727 19727 19732 19740 19754 19765 19772 19786 19807 19828 19843 19851 19871 19896 19899 19888 19876 19875 19915 19992 20061 20081 20034 19973 19932 19942 19993 20082 20194 20254 20227 20165 20156 20192 20231 20257 20278 20275 20270 20265 20275 20285 20281 20271 20258 20280 20321 20340 20343 20363 20344 20270 20217 20218 20230 20232 20220 20229 20246 20245 20266 20323 20489 20703 20889 21000 20908 20700 20604 20647 20816 21003 21103 21018 20797 20687 20744 20859 20998 21131 21284 21400 21330 21166 21201 21311 21237 21198 21344 21425 21349 21223 21172 21230 21308 21426 21548 21680 21841 22003 22053 22091 22293 22488 22765 22987 23077 23094 23013 22842 22683 22633 22555 22487 22550 22633 22692 22735 22814 22878 22851 22764 22662 22606 22692 1 23 154 1 370393.650382543157320 90151.573536386393243 0.000000000000000 1963.364990234375000 2319.482666015625000 19738 19706 19697 19684 19656 19640 19634 19644 19697 19743 19763 19784 19797 19800 19791 19782 19773 19780 19784 19752 19698 19664 19656 19652 19640 19634 19641 19652 19669 19666 19667 19675 19711 19750 19763 19759 19765 19784 19806 19832 19869 19903 19926 19908 19908 19920 19902 19883 19933 20023 20056 20012 19943 19888 19887 19956 20066 20196 20266 20265 20194 20151 20176 20230 20278 20291 20266 20261 20277 20270 20253 20238 20227 20214 20226 20251 20246 20241 20284 20275 20185 20127 20122 20122 20132 20147 20172 20213 20282 20364 20443 20555 20721 20892 21034 21050 20937 20814 20726 20801 21022 21200 21177 20967 20879 20866 20833 20948 21166 21347 21451 21416 21232 21213 21353 21328 21229 21337 21518 21498 21318 21202 21201 21237 21342 21459 21628 21856 22083 22207 22297 22535 22741 22969 23167 23195 23159 23006 22822 22758 22739 22586 22459 22466 22561 22664 22727 22787 22841 22836 22772 22714 22751 22865 1 24 154 1 370396.650382543157320 90151.573536386393243 0.000000000000000 1963.365722656250000 2323.325439453125000 19735 19683 19691 19701 19671 19648 19646 19666 19726 19769 19792 19811 19814 19816 19806 19794 19796 19816 19820 19791 19742 19701 19691 19690 19674 19662 19654 19641 19643 19640 19634 19635 19678 19729 19753 19753 19743 19764 19799 19830 19879 19924 19934 19896 19891 19922 19925 19893 19900 19968 19995 19936 19881 19856 19856 19904 20017 20162 20233 20233 20170 20144 20166 20211 20259 20267 20238 20228 20268 20275 20244 20192 20150 20142 20152 20160 20153 20157 20188 20184 20133 20116 20125 20161 20225 20262 20261 20289 20380 20463 20525 20601 20727 20910 21111 21246 21248 21102 20879 20895 21119 21287 21255 21119 21145 21115 20965 20976 21194 21408 21493 21485 21315 21250 21404 21469 21350 21338 21511 21564 21448 21400 21358 21335 21396 21458 21582 21805 22076 22327 22529 22790 22975 23107 23233 23230 23162 23002 22867 22829 22741 22564 22463 22455 22521 22603 22682 22764 22824 22846 22840 22858 22963 23073 1 25 154 1 370399.650382543157320 90151.573536386393243 0.000000000000000 1963.363037109375000 2330.095214843750000 19773 19683 19679 19697 19677 19649 19648 19681 19756 19793 19814 19837 19834 19828 19822 19821 19835 19852 19840 19814 19776 19744 19744 19752 19725 19702 19676 19643 19637 19634 19634 19638 19655 19685 19708 19715 19704 19729 19785 19842 19893 19934 19942 19905 19888 19917 19930 19905 19886 19905 19917 19857 19832 19847 19863 19889 19977 20114 20176 20184 20167 20169 20188 20204 20212 20227 20207 20195 20228 20247 20222 20154 20100 20094 20095 20089 20085 20094 20105 20112 20133 20176 20191 20220 20292 20341 20350 20375 20455 20530 20602 20685 20811 20995 21217 21423 21508 21332 21041 21038 21264 21420 21385 21332 21405 21344 21127 20997 21091 21317 21478 21537 21381 21316 21499 21651 21532 21392 21499 21637 21651 21676 21587 21479 21539 21587 21592 21786 22142 22471 22725 22946 23089 23164 23199 23176 23138 23053 22928 22809 22650 22522 22498 22519 22567 22611 22665 22727 22779 22827 22882 22991 23167 23301 1 26 154 1 370402.650382543157320 90151.573536386393243 0.000000000000000 1965.077636718750000 2348.641845703125000 19859 19722 19670 19675 19669 19652 19651 19688 19770 19810 19829 19852 19854 19846 19839 19858 19881 19890 19870 19846 19812 19799 19798 19796 19763 19739 19717 19687 19670 19667 19676 19672 19658 19661 19669 19675 19672 19688 19738 19824 19902 19937 19954 19950 19935 19945 19927 19874 19835 19823 19832 19813 19845 19910 19944 19945 19990 20089 20145 20183 20222 20216 20193 20186 20189 20190 20173 20149 20147 20166 20151 20108 20081 20078 20077 20068 20072 20090 20099 20113 20166 20249 20281 20266 20286 20334 20373 20439 20534 20634 20730 20821 20938 21094 21286 21508 21634 21490 21265 21297 21488 21629 21623 21643 21664 21506 21212 21015 20994 21169 21412 21539 21422 21369 21535 21685 21563 21427 21572 21796 21897 21901 21721 21552 21650 21757 21712 21781 22148 22536 22842 23022 23096 23132 23106 23073 23072 23011 22874 22712 22580 22536 22552 22598 22663 22667 22651 22666 22709 22770 22874 23079 23317 23486 1 27 154 1 370405.650382543157320 90151.573536386393243 0.000000000000000 1965.703002929687500 2354.892822265625000 19966 19792 19678 19668 19664 19657 19666 19702 19774 19817 19839 19859 19871 19855 19851 19879 19902 19910 19909 19894 19856 19836 19831 19823 19812 19795 19773 19751 19736 19735 19739 19730 19710 19693 19677 19683 19688 19687 19705 19795 19886 19920 19949 19987 19996 19973 19920 19842 19788 19784 19802 19842 19932 20027 20060 20024 20029 20088 20146 20214 20283 20269 20207 20170 20170 20162 20134 20089 20072 20083 20086 20075 20075 20074 20077 20103 20149 20191 20199 20188 20214 20273 20307 20297 20304 20348 20405 20501 20631 20773 20901 21003 21072 21155 21313 21522 21669 21662 21613 21704 21861 21971 21992 22023 21939 21638 21280 21082 21041 21113 21293 21487 21495 21445 21520 21637 21527 21445 21652 21958 22119 22070 21807 21640 21787 21917 21831 21797 22122 22531 22806 22982 23059 23049 22985 22950 22951 22869 22747 22649 22609 22609 22623 22682 22762 22719 22637 22602 22609 22666 22811 23051 23335 23549 1 28 154 1 370408.650382543157320 90151.573536386393243 0.000000000000000 1966.456298828125000 2346.349853515625000 19999 19827 19706 19673 19665 19670 19679 19709 19784 19828 19853 19871 19876 19860 19867 19895 19910 19917 19933 19919 19877 19855 19855 19859 19863 19851 19835 19819 19801 19784 19770 19769 19770 19753 19722 19724 19727 19709 19696 19756 19831 19872 19905 19952 19978 19952 19901 19827 19768 19774 19812 19883 19992 20080 20089 20043 20053 20102 20148 20214 20297 20303 20235 20166 20133 20109 20079 20052 20044 20048 20054 20058 20066 20081 20111 20181 20277 20336 20330 20282 20267 20290 20315 20327 20344 20384 20461 20588 20746 20913 21054 21157 21173 21185 21311 21496 21661 21793 21886 22002 22120 22181 22200 22217 22102 21779 21413 21211 21193 21174 21216 21433 21538 21510 21583 21745 21669 21519 21656 22026 22282 22210 21919 21772 21889 22045 21955 21824 22006 22355 22618 22840 22966 22946 22871 22837 22843 22796 22772 22774 22747 22717 22707 22760 22838 22770 22677 22668 22629 22581 22670 22889 23193 23463 1 29 154 1 370411.650382543157320 90151.573536386393243 0.000000000000000 1967.172485351562500 2334.906738281250000 19979 19828 19721 19686 19672 19683 19689 19708 19772 19825 19862 19877 19874 19866 19881 19903 19923 19934 19944 19928 19893 19878 19881 19895 19919 19931 19925 19888 19841 19808 19790 19800 19824 19816 19783 19760 19734 19703 19682 19703 19753 19800 19837 19861 19865 19846 19821 19783 19754 19771 19815 19878 19962 20019 20022 20015 20057 20111 20151 20205 20284 20305 20244 20160 20102 20072 20052 20047 20052 20051 20060 20082 20102 20126 20154 20220 20308 20367 20366 20331 20323 20326 20345 20380 20396 20424 20496 20631 20817 20995 21154 21276 21306 21303 21379 21527 21687 21835 21948 22027 22093 22130 22146 22156 22078 21829 21488 21325 21331 21247 21226 21469 21629 21605 21700 21935 21913 21676 21656 21993 22302 22275 22024 21910 21981 22172 22121 21939 21991 22207 22446 22682 22850 22861 22780 22767 22826 22858 22944 23016 22964 22861 22799 22829 22893 22826 22757 22778 22696 22539 22528 22728 23038 23349 1 30 154 1 370414.650382543157320 90151.573536386393243 0.000000000000000 1967.770385742187500 2321.736328125000000 19953 19823 19726 19687 19678 19682 19681 19695 19751 19809 19858 19882 19883 19882 19890 19910 19948 19972 19963 19936 19909 19904 19910 19922 19948 19992 20011 19946 19865 19833 19817 19827 19851 19858 19830 19785 19737 19705 19685 19682 19701 19733 19767 19769 19751 19744 19739 19730 19734 19758 19796 19854 19903 19933 19961 20012 20086 20136 20175 20226 20298 20322 20267 20169 20088 20071 20066 20068 20069 20075 20099 20163 20206 20222 20207 20202 20254 20318 20349 20364 20389 20386 20386 20428 20455 20491 20555 20687 20895 21075 21233 21382 21472 21507 21548 21641 21768 21845 21871 21874 21915 21955 21990 22007 21947 21754 21527 21468 21448 21297 21281 21562 21809 21788 21798 22043 22126 21882 21755 21991 22296 22361 22176 22068 22156 22317 22219 22100 22179 22302 22477 22592 22739 22764 22728 22785 22869 22953 23092 23188 23148 23015 22907 22911 22969 22924 22889 22881 22755 22524 22431 22577 22871 23217 1 31 154 1 370417.650382543157320 90151.573536386393243 0.000000000000000 1967.602783203125000 2324.274658203125000 19908 19808 19728 19689 19685 19682 19676 19693 19752 19805 19854 19883 19894 19902 19898 19911 19942 19970 19973 19958 19948 19946 19944 19940 19954 19999 20029 19974 19894 19861 19849 19859 19865 19871 19852 19804 19761 19740 19718 19695 19695 19702 19712 19711 19704 19705 19700 19697 19713 19738 19770 19818 19852 19898 19956 20034 20116 20161 20186 20238 20307 20326 20283 20199 20125 20096 20081 20100 20112 20127 20177 20272 20337 20346 20289 20214 20234 20297 20358 20410 20446 20449 20451 20490 20547 20630 20707 20831 21027 21206 21357 21523 21663 21714 21714 21752 21836 21864 21821 21786 21829 21872 21899 21925 21861 21706 21638 21673 21595 21384 21360 21586 21878 21989 21934 22043 22240 22116 21945 22101 22453 22596 22434 22319 22407 22432 22275 22285 22407 22431 22568 22614 22669 22702 22736 22823 22908 23018 23159 23243 23218 23097 22976 22981 23047 23044 23046 23005 22868 22623 22446 22461 22746 23126 1 32 154 1 370420.650382543157320 90151.573536386393243 0.000000000000000 1969.416992187500000 2320.076171875000000 19888 19818 19745 19704 19697 19694 19695 19703 19752 19803 19847 19890 19924 19934 19921 19923 19938 19955 19958 19957 19970 19980 19970 19949 19950 19982 20013 19986 19927 19899 19889 19881 19873 19878 19867 19830 19790 19751 19719 19713 19716 19711 19706 19715 19727 19721 19706 19697 19699 19711 19729 19771 19821 19886 19951 20040 20140 20185 20180 20220 20277 20293 20300 20295 20266 20192 20095 20118 20162 20186 20245 20363 20464 20478 20388 20276 20279 20338 20408 20470 20506 20517 20541 20604 20698 20807 20904 21035 21200 21356 21503 21658 21786 21823 21789 21773 21804 21821 21801 21837 21943 21986 21946 21976 21952 21842 21866 21876 21686 21480 21506 21647 21886 22125 22118 22140 22410 22423 22229 22319 22662 22829 22701 22620 22655 22533 22373 22468 22567 22494 22619 22710 22719 22722 22728 22811 22933 23049 23157 23201 23176 23098 23007 23001 23062 23095 23131 23126 23019 22784 22523 22405 22633 23003 1 33 154 1 370423.650382543157320 90151.573536386393243 0.000000000000000 1970.596923828125000 2313.469238281250000 19935 19880 19797 19722 19709 19706 19711 19718 19748 19789 19834 19901 19970 19975 19954 19942 19935 19938 19946 19947 19955 19977 19987 19971 19958 19977 20005 19984 19949 19934 19922 19900 19884 19881 19877 19850 19795 19746 19733 19746 19756 19748 19733 19753 19776 19766 19746 19730 19718 19713 19716 19751 19814 19888 19953 20042 20144 20182 20170 20193 20244 20267 20298 20350 20340 20248 20115 20100 20157 20185 20232 20353 20480 20527 20450 20342 20334 20385 20453 20518 20563 20604 20665 20754 20866 20989 21111 21261 21410 21531 21631 21717 21778 21784 21731 21672 21686 21730 21780 21926 22102 22146 22044 22069 22142 22144 22215 22116 21799 21623 21711 21791 21939 22234 22340 22364 22660 22771 22602 22633 22870 22958 22882 22853 22802 22595 22486 22592 22600 22526 22642 22743 22732 22701 22710 22816 22944 23023 23093 23118 23098 23067 23000 22933 22919 22972 23059 23135 23113 22919 22598 22395 22511 22861 1 34 154 1 370426.650382543157320 90151.573536386393243 0.000000000000000 1971.013793945312500 2310.710449218750000 19996 19941 19846 19749 19715 19710 19715 19724 19736 19759 19811 19905 20004 20008 19981 19969 19957 19939 19941 19958 19963 19970 19988 19995 19974 19990 20028 20006 19965 19962 19963 19941 19913 19890 19883 19874 19834 19789 19785 19807 19817 19806 19783 19793 19825 19832 19818 19805 19781 19749 19736 19757 19840 19932 19980 20044 20128 20180 20176 20172 20196 20215 20258 20320 20307 20217 20107 20066 20118 20160 20205 20319 20449 20501 20435 20351 20366 20422 20486 20564 20645 20726 20827 20940 21046 21159 21263 21387 21523 21643 21703 21710 21705 21669 21600 21559 21617 21701 21814 22024 22256 22321 22180 22165 22345 22503 22584 22370 21952 21787 21913 21964 22039 22327 22585 22694 22913 23044 22966 22950 23080 23107 23004 22895 22772 22632 22629 22692 22638 22587 22645 22690 22678 22677 22732 22829 22930 22984 23016 23013 23008 23019 22951 22823 22743 22804 22918 23003 23084 22997 22717 22472 22426 22663 1 35 154 1 370429.650382543157320 90151.573536386393243 0.000000000000000 1971.359130859375000 2317.688964843750000 20024 19964 19882 19793 19719 19714 19721 19730 19734 19739 19778 19865 19959 19975 19967 19974 19976 19976 19983 19999 20001 19988 19999 20007 19993 20006 20029 20006 19974 19981 19988 19973 19944 19903 19880 19893 19896 19868 19850 19878 19896 19869 19830 19818 19863 19907 19904 19880 19852 19819 19782 19775 19851 19942 19980 20000 20056 20131 20164 20145 20128 20143 20173 20226 20229 20163 20085 20057 20110 20173 20227 20316 20406 20446 20405 20342 20367 20433 20515 20615 20720 20830 20964 21107 21207 21260 21302 21362 21456 21588 21673 21667 21623 21548 21493 21521 21630 21746 21876 22083 22360 22489 22354 22287 22539 22802 22864 22580 22133 22003 22196 22274 22295 22541 22834 22962 23088 23177 23107 23040 23092 23123 23096 22962 22793 22689 22689 22693 22649 22599 22585 22582 22583 22624 22713 22811 22904 22950 22939 22916 22941 22956 22853 22689 22588 22623 22737 22889 23053 23036 22842 22604 22400 22446 1 36 154 1 370432.650382543157320 90151.573536386393243 0.000000000000000 1971.508300781250000 2315.927734375000000 20051 19958 19865 19794 19726 19715 19735 19746 19741 19740 19765 19830 19900 19932 19959 19981 19997 20019 20039 20060 20052 20022 20015 20015 20013 20009 20010 19994 19984 19989 19991 19982 19957 19914 19890 19912 19940 19939 19919 19936 19950 19925 19876 19846 19892 19937 19943 19931 19916 19893 19857 19840 19861 19892 19919 19943 19999 20076 20127 20116 20080 20092 20106 20134 20143 20101 20060 20063 20129 20218 20268 20296 20335 20376 20393 20374 20392 20466 20562 20689 20813 20950 21108 21253 21323 21308 21298 21320 21367 21476 21594 21615 21561 21493 21481 21554 21706 21875 22026 22185 22393 22536 22467 22425 22685 22931 22966 22734 22353 22312 22586 22686 22661 22797 22983 23045 23125 23159 23046 22929 22914 22989 23056 22939 22768 22656 22634 22633 22599 22542 22489 22458 22481 22565 22678 22782 22869 22896 22866 22844 22885 22904 22793 22598 22440 22427 22592 22863 23081 23078 22930 22705 22423 22319 1 37 154 1 370435.650382543157320 90151.573536386393243 0.000000000000000 1971.898071289062500 2311.139160156250000 20101 19978 19856 19783 19736 19719 19736 19755 19764 19766 19795 19844 19888 19922 19961 19993 20026 20044 20058 20076 20068 20047 20047 20048 20047 20038 20026 20009 20008 20011 20013 20000 19975 19955 19946 19952 19955 19951 19950 19957 19961 19946 19908 19886 19919 19950 19971 19985 19983 19956 19937 19942 19948 19933 19921 19939 20001 20074 20119 20102 20057 20061 20063 20066 20068 20054 20055 20088 20157 20232 20274 20298 20322 20358 20410 20455 20487 20546 20625 20769 20917 21071 21228 21355 21402 21363 21314 21311 21338 21412 21504 21532 21504 21475 21502 21596 21765 21984 22209 22389 22504 22574 22559 22570 22759 22919 22966 22881 22663 22682 22920 23024 22976 22957 23003 23046 23094 23049 22927 22811 22784 22882 22921 22787 22666 22594 22578 22559 22491 22445 22392 22364 22416 22531 22671 22784 22867 22872 22818 22775 22819 22872 22764 22542 22339 22295 22512 22850 23092 23111 22990 22762 22487 22303 1 38 154 1 370438.650382543157320 90151.573536386393243 0.000000000000000 1973.535278320312500 2313.744873046875000 20120 19984 19851 19777 19747 19735 19744 19759 19779 19800 19835 19873 19911 19938 19971 20014 20052 20065 20067 20077 20077 20074 20085 20082 20080 20067 20058 20057 20052 20047 20041 20023 19997 19984 19974 19959 19956 19947 19949 19960 19967 19956 19932 19936 19966 19987 20006 20025 20038 20024 20022 20040 20041 20003 19971 19988 20044 20093 20127 20095 20048 20048 20053 20055 20055 20062 20092 20136 20189 20249 20306 20342 20359 20378 20431 20524 20608 20666 20732 20864 21014 21168 21303 21407 21451 21436 21392 21357 21348 21377 21415 21424 21430 21463 21531 21622 21772 22019 22290 22501 22634 22692 22671 22639 22719 22825 22945 23026 22993 23013 23084 23125 23101 22995 22964 23015 23006 22922 22818 22711 22708 22779 22739 22640 22608 22542 22497 22449 22370 22386 22396 22387 22443 22558 22705 22818 22876 22832 22736 22703 22770 22846 22735 22502 22297 22223 22411 22785 23082 23137 23038 22846 22646 22443 1 39 154 1 370441.650382543157320 90151.573536386393243 0.000000000000000 1974.906738281250000 2323.654296875000000 20069 19954 19845 19770 19750 19749 19753 19759 19784 19825 19862 19891 19928 19956 19980 20031 20075 20086 20088 20091 20094 20101 20111 20098 20097 20092 20079 20087 20086 20083 20068 20025 19997 19986 19981 19973 19981 19973 19967 19975 19988 19988 19972 19971 20005 20038 20058 20078 20085 20072 20072 20079 20081 20062 20054 20086 20128 20147 20159 20128 20092 20090 20090 20082 20110 20146 20178 20218 20252 20273 20323 20372 20397 20406 20431 20519 20628 20709 20788 20909 21040 21170 21304 21433 21501 21501 21446 21367 21318 21305 21309 21311 21361 21473 21625 21753 21858 22060 22325 22527 22687 22761 22712 22598 22605 22741 22920 23055 23153 23237 23182 23097 23058 22945 22909 22960 22861 22753 22682 22601 22611 22629 22566 22542 22541 22440 22358 22327 22318 22424 22496 22493 22523 22614 22737 22843 22860 22759 22627 22610 22741 22831 22718 22490 22277 22152 22271 22654 22994 23100 23047 22900 22719 22536 1 40 154 1 370444.650382543157320 90151.573536386393243 0.000000000000000 1975.338378906250000 2327.113525390625000 20073 19966 19881 19802 19762 19758 19753 19764 19805 19857 19894 19927 19947 19974 19995 20050 20104 20118 20117 20120 20127 20138 20150 20144 20133 20132 20120 20117 20111 20110 20097 20042 20010 19998 19997 20004 20017 20017 20016 20021 20019 20026 20019 20007 20028 20074 20112 20130 20100 20057 20044 20064 20097 20113 20121 20154 20197 20206 20200 20181 20160 20161 20151 20134 20185 20246 20280 20310 20321 20305 20332 20393 20428 20432 20440 20478 20551 20636 20732 20848 20987 21128 21296 21445 21491 21452 21373 21287 21231 21202 21221 21255 21326 21467 21688 21898 22025 22158 22391 22576 22685 22715 22658 22537 22528 22717 22888 22997 23136 23271 23220 23069 22955 22870 22844 22858 22698 22542 22493 22501 22526 22466 22404 22438 22446 22326 22233 22244 22349 22509 22587 22582 22601 22690 22775 22823 22806 22694 22545 22537 22718 22807 22703 22475 22255 22080 22113 22448 22791 22959 22995 22881 22653 22437 1 41 154 1 370447.650382543157320 90151.573536386393243 0.000000000000000 1976.117309570312500 2313.890625000000000 20162 20028 19965 19905 19822 19767 19761 19779 19821 19873 19917 19956 19984 20026 20073 20128 20169 20177 20182 20177 20167 20172 20205 20217 20196 20181 20170 20156 20155 20146 20126 20092 20063 20041 20040 20056 20053 20055 20048 20051 20053 20057 20061 20052 20052 20081 20124 20135 20112 20097 20086 20101 20151 20177 20179 20202 20248 20260 20271 20277 20256 20262 20250 20223 20244 20320 20390 20407 20383 20346 20356 20411 20445 20462 20483 20503 20529 20587 20682 20792 20935 21104 21288 21401 21392 21331 21259 21184 21143 21143 21180 21245 21353 21513 21729 21973 22183 22337 22511 22600 22594 22581 22528 22441 22476 22689 22825 22881 23018 23139 23120 22978 22834 22776 22768 22728 22544 22408 22406 22494 22492 22337 22259 22310 22307 22182 22111 22206 22380 22545 22611 22591 22608 22714 22763 22723 22667 22594 22457 22473 22677 22768 22693 22462 22217 22007 21964 22187 22493 22751 22894 22798 22543 22271 1 42 154 1 370450.650382543157320 90151.573536386393243 0.000000000000000 1977.409790039062500 2300.642578125000000 20273 20168 20122 20040 19890 19781 19774 19792 19820 19865 19919 19976 20021 20063 20122 20187 20231 20244 20247 20232 20205 20200 20236 20262 20246 20217 20206 20191 20203 20189 20156 20145 20124 20093 20082 20085 20076 20080 20076 20079 20081 20082 20091 20081 20077 20093 20133 20150 20154 20168 20164 20177 20223 20247 20254 20264 20291 20305 20322 20346 20360 20398 20405 20367 20335 20359 20436 20477 20467 20413 20405 20437 20460 20487 20528 20554 20557 20590 20666 20773 20923 21103 21283 21357 21312 21239 21171 21105 21077 21093 21156 21239 21362 21546 21751 21968 22191 22385 22534 22535 22463 22437 22395 22332 22435 22638 22749 22740 22842 22975 23006 22881 22725 22676 22681 22603 22433 22319 22341 22486 22484 22321 22201 22161 22126 22018 22000 22176 22364 22477 22505 22476 22515 22643 22690 22614 22507 22434 22346 22419 22625 22750 22694 22455 22187 21953 21827 21913 22205 22535 22756 22720 22533 22292 1 43 154 1 370453.650382543157320 90151.573536386393243 0.000000000000000 1980.036010742187500 2291.229003906250000 20408 20348 20279 20152 19987 19852 19800 19802 19811 19856 19940 20012 20046 20071 20126 20187 20249 20293 20304 20279 20244 20225 20237 20260 20265 20242 20233 20230 20233 20214 20185 20175 20151 20129 20130 20135 20127 20120 20109 20115 20112 20101 20097 20087 20096 20120 20157 20180 20210 20251 20262 20261 20287 20315 20322 20327 20348 20371 20368 20376 20420 20475 20492 20469 20423 20404 20452 20507 20525 20482 20460 20465 20476 20510 20558 20582 20582 20600 20656 20761 20920 21111 21283 21338 21302 21216 21132 21078 21047 21056 21119 21205 21322 21487 21672 21862 22081 22309 22482 22474 22354 22297 22270 22282 22458 22611 22651 22606 22679 22842 22912 22799 22649 22571 22515 22415 22312 22216 22242 22417 22450 22372 22220 22060 21940 21866 21918 22128 22296 22349 22321 22301 22398 22573 22668 22629 22470 22310 22260 22391 22583 22709 22668 22460 22198 21949 21772 21735 21951 22271 22552 22685 22638 22459 1 44 154 1 370456.650382543157320 90151.573536386393243 0.000000000000000 1979.298828125000000 2280.622070312500000 20586 20514 20418 20289 20161 20011 19858 19793 19806 19854 19950 20026 20039 20051 20106 20165 20229 20296 20323 20308 20274 20243 20232 20232 20239 20239 20241 20242 20229 20222 20211 20199 20185 20174 20178 20192 20193 20183 20163 20155 20140 20122 20124 20124 20128 20160 20196 20221 20255 20308 20337 20330 20345 20377 20389 20391 20403 20417 20403 20387 20412 20445 20464 20462 20451 20459 20500 20538 20552 20536 20516 20499 20504 20537 20586 20612 20611 20607 20645 20743 20888 21075 21246 21289 21269 21202 21128 21091 21048 21029 21076 21172 21329 21528 21713 21878 22068 22263 22408 22396 22243 22132 22134 22220 22386 22510 22527 22497 22609 22760 22806 22702 22570 22475 22329 22195 22152 22127 22208 22351 22351 22314 22168 21984 21803 21750 21883 22089 22219 22209 22146 22155 22320 22520 22665 22690 22531 22282 22184 22342 22528 22609 22587 22451 22243 21999 21784 21650 21765 22040 22359 22643 22711 22569 1 45 154 1 370459.650382543157320 90151.573536386393243 0.000000000000000 1978.671752929687500 2269.093994140625000 20811 20704 20562 20421 20312 20123 19882 19787 19804 19848 19932 20004 20021 20041 20096 20144 20199 20273 20317 20326 20298 20260 20238 20227 20213 20211 20210 20206 20194 20201 20209 20220 20227 20213 20203 20219 20226 20220 20200 20193 20190 20176 20171 20171 20168 20192 20227 20263 20295 20346 20381 20379 20397 20428 20442 20441 20436 20437 20430 20417 20430 20446 20456 20474 20506 20528 20551 20583 20580 20568 20548 20532 20545 20576 20613 20636 20639 20635 20659 20731 20842 20983 21110 21141 21152 21129 21076 21046 21013 20987 21018 21103 21268 21507 21733 21919 22064 22204 22309 22269 22125 22042 22092 22201 22314 22429 22434 22412 22520 22636 22691 22626 22522 22439 22244 22061 22008 22074 22226 22271 22193 22127 21992 21867 21727 21685 21852 22047 22135 22072 21994 22069 22294 22493 22625 22655 22509 22236 22099 22238 22405 22481 22465 22388 22263 22030 21794 21605 21628 21855 22151 22461 22605 22519 1 46 154 1 370462.650382543157320 90151.573536386393243 0.000000000000000 1978.876831054687500 2264.809326171875000 20999 20888 20678 20473 20321 20086 19852 19789 19808 19841 19899 19957 19989 20034 20087 20129 20179 20246 20302 20323 20287 20249 20238 20235 20204 20190 20190 20186 20184 20186 20204 20235 20254 20252 20237 20240 20245 20244 20231 20227 20233 20233 20227 20225 20222 20234 20248 20275 20310 20365 20408 20425 20442 20465 20475 20474 20476 20477 20463 20450 20459 20482 20495 20520 20554 20565 20582 20608 20599 20584 20562 20550 20565 20593 20628 20642 20640 20643 20659 20713 20804 20896 20963 20999 21030 21023 20978 20957 20969 20998 21045 21096 21184 21384 21653 21872 21994 22128 22218 22134 21989 21998 22114 22255 22370 22450 22424 22385 22498 22614 22648 22575 22469 22402 22242 22064 21985 22045 22196 22184 22058 21930 21799 21712 21618 21590 21765 21965 22022 21915 21846 22017 22269 22447 22540 22548 22441 22198 22052 22172 22323 22382 22340 22274 22219 22044 21824 21604 21552 21718 21935 22156 22313 22336 1 47 154 1 370465.650382543157320 90151.573536386393243 0.000000000000000 1979.983398437500000 2270.005615234375000 20876 20834 20665 20402 20155 19936 19812 19800 19818 19841 19869 19913 19959 20016 20073 20119 20168 20227 20282 20286 20250 20220 20221 20230 20198 20179 20178 20184 20195 20195 20215 20262 20271 20268 20260 20242 20250 20267 20265 20255 20249 20240 20238 20236 20246 20262 20273 20290 20320 20364 20407 20443 20472 20482 20478 20483 20498 20513 20496 20477 20487 20519 20540 20558 20570 20571 20591 20602 20581 20563 20556 20568 20593 20605 20627 20643 20639 20635 20654 20711 20780 20836 20883 20926 20947 20930 20889 20893 20957 21056 21147 21198 21216 21322 21570 21791 21916 22059 22115 22024 21948 22090 22229 22337 22475 22527 22460 22417 22568 22691 22700 22609 22472 22344 22235 22077 21942 21957 22100 22080 21944 21779 21658 21580 21508 21508 21698 21893 21926 21782 21741 21952 22197 22337 22394 22415 22366 22172 22007 22086 22225 22275 22229 22154 22120 22022 21838 21611 21506 21614 21755 21842 21960 22067 1 48 154 1 370468.650382543157320 90151.573536386393243 0.000000000000000 1980.707153320312500 2274.049804687500000 20573 20586 20521 20295 20006 19839 19807 19825 19843 19843 19852 19898 19945 19993 20048 20102 20150 20200 20226 20216 20210 20195 20191 20202 20186 20167 20176 20191 20211 20217 20230 20266 20270 20271 20286 20267 20266 20274 20278 20270 20256 20236 20225 20228 20248 20269 20294 20317 20348 20371 20392 20433 20475 20487 20488 20494 20501 20535 20519 20478 20486 20516 20538 20568 20588 20580 20578 20575 20552 20532 20533 20568 20598 20597 20601 20624 20634 20642 20676 20730 20755 20782 20822 20856 20855 20825 20808 20855 20967 21105 21227 21301 21296 21308 21477 21692 21845 21962 21964 21906 21975 22229 22377 22441 22539 22554 22451 22410 22592 22730 22740 22682 22537 22341 22213 22081 21899 21864 21973 21949 21840 21683 21568 21477 21408 21438 21642 21834 21835 21675 21685 21894 22081 22177 22211 22268 22283 22157 21985 21958 22036 22108 22121 22045 21954 21883 21748 21558 21426 21461 21565 21617 21690 21783 1 49 154 1 370471.650382543157320 90151.573536386393243 0.000000000000000 1983.870483398437500 2269.479003906250000 20309 20333 20301 20136 19924 19839 19859 19905 19931 19903 19869 19895 19945 19989 20011 20044 20093 20138 20143 20149 20161 20177 20190 20201 20196 20181 20198 20221 20228 20225 20228 20255 20274 20276 20303 20300 20285 20274 20275 20267 20259 20239 20232 20245 20268 20292 20305 20335 20374 20390 20395 20418 20454 20484 20510 20521 20513 20545 20552 20502 20487 20491 20508 20547 20574 20574 20578 20579 20553 20527 20522 20539 20558 20569 20584 20612 20611 20626 20675 20721 20706 20716 20755 20781 20772 20735 20732 20817 20981 21158 21291 21370 21378 21351 21431 21617 21743 21797 21782 21827 22023 22254 22365 22426 22511 22496 22374 22334 22536 22684 22695 22653 22517 22333 22214 22110 21909 21810 21838 21800 21706 21615 21552 21488 21393 21383 21556 21722 21694 21565 21644 21852 22003 22046 22051 22121 22202 22198 22064 21909 21838 21857 21882 21832 21723 21646 21563 21468 21395 21365 21387 21419 21485 21555 1 50 154 1 370474.650382543157320 90151.573536386393243 0.000000000000000 1988.934204101562500 2255.167724609375000 20126 20111 20048 19956 19889 19914 19993 20065 20088 20032 19925 19897 19941 20000 20031 20041 20058 20074 20082 20112 20138 20174 20203 20200 20201 20208 20229 20245 20241 20245 20246 20256 20282 20291 20311 20312 20296 20275 20252 20228 20228 20225 20239 20256 20280 20304 20304 20330 20381 20419 20424 20432 20453 20485 20530 20557 20554 20566 20574 20531 20490 20484 20495 20513 20530 20551 20575 20589 20578 20553 20544 20540 20544 20552 20573 20595 20590 20605 20647 20661 20630 20659 20701 20728 20731 20714 20718 20791 20941 21128 21279 21373 21438 21428 21462 21606 21661 21661 21708 21850 22015 22149 22228 22330 22437 22417 22291 22237 22397 22541 22552 22502 22376 22276 22216 22136 21939 21765 21711 21680 21588 21556 21548 21548 21440 21355 21443 21573 21534 21489 21675 21903 21997 21949 21930 22024 22156 22233 22159 21979 21825 21747 21699 21659 21622 21599 21606 21611 21561 21455 21368 21295 21320 21370 1 51 154 1 370477.650382543157320 90151.573536386393243 0.000000000000000 1987.280517578125000 2231.888671875000000 19978 19939 19894 19873 19903 19992 20105 20214 20255 20199 20047 19938 19934 20015 20080 20090 20089 20081 20064 20090 20135 20183 20210 20196 20186 20212 20234 20245 20254 20266 20267 20264 20282 20305 20323 20325 20300 20265 20234 20208 20219 20237 20258 20267 20287 20308 20309 20344 20394 20426 20419 20423 20455 20487 20521 20558 20581 20596 20592 20556 20509 20498 20492 20490 20509 20522 20550 20583 20593 20573 20561 20570 20567 20556 20569 20585 20589 20604 20622 20630 20615 20646 20701 20744 20753 20764 20786 20825 20919 21044 21187 21350 21486 21493 21500 21601 21626 21591 21662 21813 21904 21981 22078 22222 22319 22281 22156 22107 22220 22291 22305 22310 22282 22228 22155 22072 21901 21703 21608 21585 21486 21451 21503 21577 21512 21351 21318 21402 21397 21474 21747 21966 21993 21878 21855 21993 22173 22307 22309 22169 22004 21861 21726 21708 21741 21776 21849 21858 21766 21642 21511 21359 21299 21263 1 52 154 1 370480.650382543157320 90151.573536386393243 0.000000000000000 1986.164550781250000 2251.529296875000000 19894 19872 19862 19887 19949 20078 20228 20349 20411 20368 20187 19996 19942 20029 20115 20149 20154 20136 20096 20103 20138 20172 20194 20193 20184 20208 20229 20239 20264 20286 20294 20291 20291 20306 20317 20336 20316 20269 20245 20234 20254 20290 20305 20293 20305 20329 20348 20379 20400 20419 20411 20406 20443 20472 20498 20539 20577 20598 20598 20567 20526 20513 20514 20510 20519 20524 20535 20570 20597 20592 20580 20588 20580 20560 20564 20571 20587 20615 20630 20642 20641 20663 20722 20774 20824 20873 20896 20915 20972 21070 21183 21346 21484 21529 21567 21643 21619 21526 21579 21704 21750 21820 21966 22118 22177 22124 22006 21983 22075 22088 22153 22237 22263 22164 22047 21954 21834 21673 21529 21458 21401 21358 21452 21566 21549 21371 21231 21263 21344 21521 21747 21881 21866 21788 21833 22016 22233 22436 22515 22412 22251 22052 21841 21861 21946 22005 22080 22047 21927 21815 21659 21518 21439 21292 1 53 154 1 370483.650382543157320 90151.573536386393243 0.000000000000000 1990.519653320312500 2266.479003906250000 19905 19930 19962 20000 20042 20158 20326 20452 20518 20451 20227 19998 19948 20044 20144 20198 20209 20195 20146 20126 20129 20144 20164 20173 20178 20207 20234 20243 20277 20306 20312 20300 20284 20297 20315 20339 20337 20305 20281 20285 20303 20326 20335 20323 20317 20332 20357 20382 20387 20408 20423 20424 20445 20461 20490 20536 20569 20588 20598 20579 20552 20542 20549 20553 20539 20525 20518 20548 20578 20575 20571 20577 20586 20591 20586 20581 20606 20648 20683 20693 20698 20716 20750 20798 20883 20964 20986 21016 21059 21138 21243 21370 21487 21577 21678 21715 21598 21457 21503 21606 21638 21726 21884 21978 21981 21958 21885 21860 21981 22071 22180 22258 22270 22138 21998 21889 21787 21636 21443 21331 21318 21304 21389 21501 21538 21417 21223 21204 21370 21566 21648 21673 21653 21668 21812 22049 22311 22551 22665 22595 22429 22173 21945 22016 22129 22185 22251 22218 22091 21956 21791 21674 21594 21413 1 54 154 1 370486.650382543157320 90151.573536386393243 0.000000000000000 1996.277343750000000 2267.906982421875000 20007 20054 20142 20185 20178 20210 20356 20507 20572 20466 20221 19992 19963 20061 20159 20230 20247 20228 20177 20137 20125 20129 20149 20173 20191 20210 20237 20260 20292 20310 20308 20298 20293 20297 20317 20335 20345 20337 20316 20326 20334 20338 20334 20328 20320 20324 20344 20374 20375 20391 20423 20452 20464 20465 20488 20535 20566 20579 20590 20584 20569 20559 20564 20580 20568 20535 20511 20527 20544 20548 20557 20560 20589 20622 20625 20621 20641 20671 20721 20745 20746 20750 20762 20816 20908 21007 21071 21117 21162 21212 21274 21369 21471 21611 21745 21725 21521 21359 21414 21493 21531 21648 21786 21831 21784 21752 21727 21739 21895 22054 22161 22229 22232 22085 21924 21786 21668 21513 21328 21224 21224 21241 21320 21424 21502 21454 21285 21229 21374 21499 21458 21431 21476 21589 21782 22029 22309 22546 22679 22637 22462 22211 22049 22164 22280 22337 22364 22314 22191 22068 21903 21737 21620 21468 1 55 154 1 370489.650382543157320 90151.573536386393243 0.000000000000000 1998.530273437500000 2261.636962890625000 20139 20152 20265 20344 20326 20309 20397 20536 20586 20460 20213 20007 19985 20067 20149 20219 20251 20246 20206 20172 20155 20142 20150 20183 20210 20226 20261 20281 20284 20296 20313 20317 20323 20305 20310 20331 20342 20343 20337 20345 20343 20335 20327 20327 20323 20318 20319 20360 20380 20390 20414 20451 20473 20482 20495 20528 20552 20566 20585 20590 20588 20583 20585 20598 20590 20564 20532 20528 20539 20555 20569 20577 20598 20636 20668 20681 20691 20708 20753 20795 20795 20788 20820 20907 20959 21007 21132 21219 21251 21282 21324 21384 21466 21617 21743 21692 21464 21281 21318 21382 21432 21554 21643 21651 21597 21583 21643 21737 21883 21994 22063 22155 22178 22053 21884 21692 21518 21382 21278 21190 21152 21171 21246 21343 21431 21451 21349 21257 21269 21294 21271 21282 21369 21518 21718 21961 22222 22454 22616 22604 22422 22221 22182 22316 22391 22409 22360 22248 22121 22051 21903 21651 21481 21358 1 56 154 1 370492.650382543157320 90151.573536386393243 0.000000000000000 2000.527099609375000 2254.903564453125000 20258 20233 20311 20443 20487 20477 20507 20585 20599 20455 20217 20031 20005 20096 20170 20210 20243 20252 20238 20224 20220 20191 20163 20177 20200 20234 20279 20289 20276 20289 20326 20344 20353 20318 20301 20332 20353 20355 20357 20357 20352 20340 20342 20342 20342 20348 20340 20352 20364 20374 20398 20434 20464 20495 20527 20549 20562 20578 20603 20612 20614 20599 20581 20595 20607 20600 20582 20569 20560 20565 20581 20599 20617 20656 20705 20728 20730 20756 20787 20833 20853 20854 20915 21024 21016 20984 21109 21252 21308 21318 21349 21381 21457 21585 21663 21593 21367 21203 21226 21279 21348 21429 21457 21452 21468 21547 21661 21746 21808 21853 21934 22048 22088 22018 21844 21625 21469 21418 21382 21291 21194 21139 21168 21257 21350 21413 21383 21281 21175 21172 21276 21362 21426 21523 21689 21900 22127 22355 22535 22549 22404 22295 22330 22366 22345 22333 22236 22067 21948 21936 21834 21558 21348 21231 1 57 154 1 370495.650382543157320 90151.573536386393243 0.000000000000000 2000.889038085937500 2248.353027343750000 20328 20327 20346 20460 20585 20621 20623 20645 20621 20459 20222 20051 20009 20096 20190 20233 20245 20255 20259 20252 20271 20267 20227 20206 20188 20214 20261 20276 20275 20299 20339 20369 20379 20351 20317 20331 20357 20364 20374 20383 20381 20368 20371 20364 20369 20386 20368 20342 20324 20332 20377 20437 20476 20507 20551 20585 20594 20596 20616 20632 20629 20607 20579 20589 20618 20611 20592 20586 20583 20579 20583 20609 20645 20688 20729 20758 20761 20781 20809 20859 20894 20909 20976 21072 21043 20985 21035 21157 21247 21280 21319 21355 21430 21530 21558 21446 21242 21140 21164 21207 21266 21301 21304 21335 21425 21522 21613 21668 21676 21712 21819 21904 21942 21917 21779 21627 21574 21606 21578 21478 21360 21234 21135 21187 21278 21323 21301 21208 21117 21198 21392 21536 21623 21681 21791 21967 22146 22316 22469 22484 22388 22364 22377 22274 22167 22141 22058 21888 21771 21779 21748 21588 21420 21267 1 58 154 1 370498.650382543157320 90151.573536386393243 0.000000000000000 2002.489624023437500 2239.625000000000000 20365 20424 20450 20483 20582 20674 20701 20693 20628 20444 20212 20065 20025 20074 20169 20247 20289 20301 20288 20267 20291 20320 20309 20269 20224 20222 20237 20247 20266 20295 20327 20365 20377 20359 20340 20340 20351 20368 20388 20399 20395 20380 20385 20387 20395 20404 20364 20317 20295 20306 20353 20431 20488 20520 20564 20612 20634 20623 20623 20644 20651 20631 20610 20618 20635 20620 20600 20596 20598 20606 20603 20618 20657 20711 20759 20787 20802 20827 20862 20904 20943 20957 20994 21062 21079 21053 21029 21064 21125 21176 21229 21293 21392 21481 21472 21324 21146 21101 21123 21141 21173 21193 21214 21276 21360 21418 21468 21509 21530 21581 21672 21739 21790 21810 21772 21741 21745 21800 21761 21653 21509 21328 21125 21111 21205 21224 21166 21103 21136 21334 21547 21694 21819 21872 21923 22055 22210 22329 22396 22360 22301 22351 22341 22171 21995 21908 21854 21740 21631 21649 21723 21723 21571 21324 1 59 154 1 370501.650382543157320 90151.573536386393243 0.000000000000000 2007.523193359375000 2226.450195312500000 20419 20519 20582 20583 20609 20679 20720 20690 20576 20378 20187 20092 20075 20081 20174 20278 20349 20360 20312 20287 20307 20356 20385 20356 20314 20284 20257 20248 20257 20276 20297 20330 20350 20348 20345 20347 20359 20396 20423 20425 20413 20400 20404 20419 20425 20412 20358 20321 20317 20334 20374 20437 20494 20527 20569 20622 20653 20645 20635 20655 20660 20639 20639 20655 20656 20638 20617 20619 20624 20633 20627 20634 20672 20731 20781 20802 20815 20861 20927 20963 21000 21030 21074 21132 21160 21135 21080 21066 21078 21086 21119 21206 21336 21413 21365 21211 21071 21056 21063 21079 21103 21131 21169 21219 21268 21310 21347 21396 21446 21495 21560 21624 21693 21772 21843 21880 21869 21880 21826 21710 21558 21349 21115 21062 21174 21188 21090 21059 21233 21491 21681 21797 21923 21988 22000 22078 22204 22265 22245 22196 22173 22241 22233 22087 21904 21747 21642 21574 21512 21566 21703 21761 21603 21313 1 60 154 1 370504.650382543157320 90151.573536386393243 0.000000000000000 2011.194091796875000 2210.197021484375000 20435 20567 20657 20679 20681 20703 20709 20629 20469 20286 20167 20148 20154 20112 20186 20315 20393 20412 20364 20324 20322 20375 20434 20446 20423 20392 20341 20289 20263 20270 20291 20314 20320 20314 20319 20327 20356 20406 20441 20453 20446 20432 20429 20452 20458 20424 20373 20345 20338 20360 20406 20453 20489 20518 20553 20601 20642 20654 20646 20655 20662 20663 20672 20692 20687 20667 20645 20650 20658 20660 20646 20647 20692 20752 20805 20814 20785 20839 20963 21022 21064 21123 21198 21268 21293 21232 21141 21121 21115 21076 21056 21110 21223 21272 21205 21072 20990 20993 21011 21048 21094 21145 21210 21277 21323 21355 21368 21426 21511 21573 21631 21667 21695 21759 21859 21923 21906 21838 21738 21606 21478 21291 21073 21035 21166 21179 21050 21051 21282 21514 21697 21846 21972 22031 22027 22048 22087 22085 22030 22013 22022 22100 22102 21983 21815 21624 21456 21393 21373 21438 21568 21618 21510 21259 1 61 154 1 370507.650382543157320 90151.573536386393243 0.000000000000000 2016.687377929687500 2198.421875000000000 20395 20523 20637 20705 20726 20727 20675 20522 20333 20205 20178 20209 20231 20167 20171 20305 20407 20454 20433 20381 20350 20380 20431 20482 20494 20470 20414 20338 20289 20298 20315 20329 20315 20286 20289 20310 20350 20389 20421 20452 20468 20463 20446 20457 20457 20429 20395 20369 20358 20380 20430 20463 20485 20511 20534 20573 20631 20663 20660 20658 20678 20695 20703 20718 20716 20692 20670 20673 20682 20692 20683 20674 20706 20761 20840 20877 20857 20892 21008 21086 21152 21221 21304 21390 21412 21324 21220 21219 21215 21145 21061 21017 21036 21066 21029 20965 20960 20992 21046 21110 21173 21229 21303 21392 21480 21522 21505 21536 21642 21719 21758 21749 21719 21719 21780 21846 21831 21719 21579 21430 21306 21155 20996 21024 21156 21128 21006 21076 21297 21499 21681 21841 21941 21959 21918 21914 21929 21903 21817 21792 21818 21929 21984 21903 21728 21537 21396 21306 21245 21277 21372 21426 21393 21228 1 62 154 1 370510.650382543157320 90151.573536386393243 0.000000000000000 2015.100708007812500 2189.696777343750000 20354 20487 20618 20700 20714 20692 20594 20414 20234 20190 20243 20276 20292 20218 20151 20244 20371 20466 20487 20436 20384 20388 20410 20473 20526 20516 20454 20375 20327 20338 20352 20366 20349 20307 20301 20317 20346 20382 20412 20451 20476 20474 20441 20448 20448 20430 20415 20406 20398 20412 20448 20469 20488 20510 20531 20567 20622 20660 20676 20680 20706 20718 20725 20731 20727 20711 20699 20704 20702 20709 20711 20706 20718 20765 20866 20952 21007 21034 21084 21172 21273 21339 21407 21476 21466 21393 21333 21372 21360 21256 21123 20990 20917 20925 20926 20923 20958 21024 21098 21167 21249 21327 21398 21476 21575 21631 21605 21620 21733 21806 21782 21711 21669 21649 21669 21745 21747 21621 21451 21295 21166 21038 20929 20983 21101 21060 20980 21119 21346 21536 21666 21750 21812 21793 21723 21740 21802 21770 21653 21579 21620 21764 21875 21897 21790 21624 21490 21330 21181 21133 21163 21226 21273 21189 1 63 154 1 370513.650382543157320 90151.573536386393243 0.000000000000000 2016.885009765625000 2196.230468750000000 20337 20450 20545 20624 20651 20623 20501 20339 20220 20257 20359 20368 20343 20270 20169 20217 20308 20388 20439 20438 20419 20421 20418 20470 20536 20534 20477 20397 20369 20387 20394 20406 20406 20377 20361 20358 20357 20372 20414 20457 20490 20488 20448 20446 20444 20436 20422 20422 20427 20431 20452 20472 20501 20532 20552 20583 20625 20667 20686 20698 20727 20732 20738 20746 20747 20746 20724 20725 20724 20726 20721 20722 20744 20793 20886 20999 21122 21165 21174 21259 21391 21464 21490 21494 21465 21451 21435 21499 21508 21400 21231 21021 20882 20884 20898 20911 20948 21012 21078 21155 21258 21356 21435 21509 21577 21625 21631 21662 21754 21804 21722 21600 21560 21556 21557 21660 21715 21633 21483 21337 21179 21019 20898 20918 21006 20992 20972 21144 21338 21486 21573 21610 21645 21603 21548 21600 21670 21639 21541 21438 21446 21616 21800 21962 21959 21769 21553 21369 21234 21152 21085 21077 21105 21072 1 64 154 1 370516.650382543157320 90151.573536386393243 0.000000000000000 2021.303466796875000 2206.395019531250000 20213 20288 20375 20486 20582 20594 20501 20367 20258 20309 20438 20458 20411 20331 20220 20233 20315 20371 20402 20414 20446 20475 20450 20482 20519 20479 20436 20390 20392 20427 20432 20446 20470 20454 20409 20382 20372 20362 20398 20447 20495 20515 20483 20464 20456 20453 20438 20436 20449 20449 20464 20491 20516 20546 20561 20595 20632 20672 20688 20702 20736 20749 20747 20749 20765 20778 20753 20742 20745 20749 20746 20755 20784 20831 20914 21035 21191 21278 21287 21338 21470 21533 21496 21422 21410 21486 21528 21592 21642 21562 21324 21032 20879 20912 20955 20974 20986 20996 21021 21084 21187 21296 21387 21450 21485 21533 21599 21681 21745 21738 21630 21495 21428 21419 21430 21554 21672 21691 21579 21408 21226 21062 20926 20863 20876 20907 20970 21122 21239 21328 21387 21421 21449 21413 21428 21525 21554 21491 21410 21337 21359 21570 21801 22011 22064 21875 21635 21499 21401 21279 21133 21018 20965 20980 1 65 154 1 370519.650382543157320 90151.573536386393243 0.000000000000000 2006.936523437500000 2210.029541015625000 20069 20110 20197 20337 20503 20570 20513 20379 20277 20336 20478 20559 20543 20440 20287 20245 20344 20436 20462 20438 20474 20539 20533 20533 20518 20421 20375 20384 20429 20476 20476 20488 20517 20502 20433 20395 20392 20376 20401 20446 20495 20521 20511 20493 20486 20480 20456 20448 20462 20461 20472 20495 20521 20536 20558 20599 20639 20678 20698 20696 20720 20756 20755 20751 20776 20791 20768 20761 20769 20771 20775 20792 20827 20874 20951 21075 21239 21363 21363 21378 21501 21566 21508 21366 21319 21442 21569 21673 21742 21662 21368 21026 20871 20942 21028 21074 21075 21053 21041 21047 21103 21192 21269 21311 21330 21389 21497 21630 21698 21643 21512 21381 21298 21283 21297 21432 21595 21685 21600 21404 21251 21160 21046 20879 20808 20847 20915 21014 21095 21146 21183 21216 21250 21274 21370 21471 21445 21336 21239 21210 21293 21501 21723 21953 22100 22028 21853 21736 21587 21397 21236 21079 20966 20953 1 66 154 1 370522.650382543157320 90151.573536386393243 0.000000000000000 2002.008056640625000 2217.815917968750000 20020 20036 20109 20268 20469 20574 20531 20383 20295 20373 20516 20642 20656 20537 20345 20255 20341 20473 20530 20503 20516 20599 20641 20609 20523 20397 20367 20403 20459 20518 20520 20515 20546 20540 20467 20433 20447 20449 20456 20472 20501 20508 20508 20506 20511 20504 20485 20469 20463 20458 20467 20487 20523 20549 20572 20609 20648 20681 20708 20708 20714 20747 20756 20766 20790 20794 20780 20795 20805 20797 20799 20826 20858 20911 20996 21104 21239 21377 21385 21398 21511 21597 21549 21366 21241 21318 21502 21667 21755 21652 21338 21009 20848 20927 21053 21140 21171 21157 21137 21119 21116 21127 21160 21196 21225 21270 21370 21527 21627 21571 21417 21282 21210 21198 21250 21419 21575 21646 21559 21404 21304 21250 21131 20903 20796 20869 20918 20939 20974 21013 21062 21097 21156 21245 21344 21387 21310 21190 21089 21108 21256 21452 21670 21912 22125 22178 22123 22023 21788 21550 21373 21196 21017 20942 1 67 154 1 370525.650382543157320 90151.573536386393243 0.000000000000000 2003.244018554687500 2224.886718750000000 20048 20032 20108 20294 20520 20615 20543 20390 20329 20407 20513 20653 20700 20599 20400 20271 20327 20486 20590 20587 20572 20642 20725 20703 20583 20460 20442 20452 20499 20572 20567 20547 20579 20588 20532 20488 20484 20490 20496 20490 20501 20495 20489 20492 20501 20505 20497 20486 20471 20464 20472 20489 20533 20574 20598 20627 20663 20701 20731 20734 20733 20753 20767 20776 20782 20777 20784 20823 20835 20822 20817 20844 20877 20947 21033 21109 21213 21319 21325 21357 21480 21583 21561 21400 21221 21202 21383 21589 21694 21592 21310 20994 20826 20892 21030 21157 21233 21250 21242 21221 21194 21159 21173 21227 21270 21285 21330 21453 21570 21540 21400 21271 21182 21184 21313 21485 21592 21619 21528 21393 21268 21177 21054 20878 20844 20966 21015 21000 20992 21025 21101 21148 21193 21283 21346 21317 21185 21052 21036 21181 21380 21540 21698 21873 22047 22153 22249 22224 21985 21745 21540 21304 21098 20972 1 68 154 1 370528.650382543157320 90151.573536386393243 0.000000000000000 2006.688964843750000 2232.450439453125000 20078 20067 20187 20406 20602 20651 20539 20396 20390 20464 20492 20572 20652 20624 20446 20300 20344 20519 20646 20674 20651 20675 20750 20772 20700 20596 20520 20482 20533 20609 20596 20578 20613 20627 20590 20535 20491 20475 20477 20464 20481 20493 20504 20501 20500 20510 20511 20506 20498 20492 20492 20517 20556 20589 20622 20647 20678 20712 20746 20767 20767 20786 20798 20801 20786 20767 20794 20849 20864 20845 20836 20862 20895 20956 21022 21087 21187 21245 21233 21295 21439 21552 21551 21398 21212 21142 21246 21426 21537 21456 21218 20934 20808 20899 21028 21147 21243 21290 21300 21278 21237 21198 21213 21292 21368 21382 21391 21471 21576 21553 21405 21265 21165 21180 21322 21459 21530 21567 21558 21459 21258 21073 20922 20833 20903 21060 21128 21127 21124 21156 21202 21255 21291 21342 21360 21268 21115 21006 21111 21338 21507 21573 21639 21754 21882 22017 22239 22325 22175 21950 21716 21475 21302 21112 1 69 154 1 370531.650382543157320 90151.573536386393243 0.000000000000000 2013.590820312500000 2230.808105468750000 20136 20188 20321 20508 20662 20670 20538 20427 20469 20541 20541 20552 20610 20635 20485 20331 20348 20516 20666 20725 20716 20706 20750 20808 20805 20702 20553 20495 20562 20632 20618 20603 20629 20629 20608 20573 20500 20470 20510 20522 20536 20539 20538 20529 20516 20506 20504 20509 20515 20517 20515 20536 20563 20594 20632 20658 20687 20718 20749 20784 20804 20816 20829 20830 20797 20783 20830 20874 20882 20856 20852 20869 20899 20932 20970 21032 21145 21189 21196 21267 21398 21508 21532 21408 21247 21134 21113 21220 21324 21276 21072 20852 20819 20938 21048 21143 21202 21236 21260 21245 21179 21130 21171 21292 21415 21471 21493 21536 21604 21556 21387 21241 21140 21133 21233 21329 21395 21481 21553 21497 21289 21045 20852 20804 20927 21093 21190 21233 21256 21297 21318 21353 21409 21435 21370 21183 21040 21017 21189 21381 21467 21455 21455 21534 21676 21889 22162 22308 22278 22141 21939 21727 21529 21278 1 70 154 1 370534.650382543157320 90151.573536386393243 0.000000000000000 2019.136352539062500 2221.282714843750000 20191 20255 20355 20497 20643 20656 20539 20465 20536 20617 20635 20631 20645 20662 20537 20371 20334 20450 20607 20708 20756 20756 20768 20826 20839 20708 20533 20488 20555 20631 20652 20666 20675 20657 20642 20627 20579 20569 20621 20654 20647 20598 20550 20551 20537 20512 20500 20517 20530 20524 20518 20542 20575 20616 20641 20656 20678 20716 20761 20813 20835 20836 20855 20859 20843 20833 20861 20878 20866 20852 20856 20861 20881 20901 20930 20997 21095 21129 21157 21239 21349 21464 21529 21448 21300 21186 21094 21068 21099 21076 20944 20820 20862 20951 21035 21111 21128 21132 21161 21154 21082 21023 21094 21241 21373 21463 21515 21555 21582 21514 21362 21224 21115 21089 21155 21220 21307 21413 21457 21383 21241 21032 20832 20814 20954 21102 21202 21270 21322 21380 21428 21470 21539 21538 21402 21154 20994 21005 21171 21282 21294 21258 21252 21357 21560 21818 22037 22172 22213 22173 22056 21884 21651 21358 1 71 154 1 370537.650382543157320 90151.573536386393243 0.000000000000000 2017.276245117187500 2205.924072265625000 20173 20185 20263 20391 20537 20611 20551 20475 20527 20630 20704 20740 20743 20729 20619 20433 20333 20373 20492 20621 20740 20791 20799 20835 20859 20733 20553 20493 20533 20607 20672 20716 20716 20706 20705 20686 20682 20694 20722 20753 20722 20620 20554 20575 20576 20546 20530 20554 20557 20538 20537 20566 20603 20634 20643 20660 20688 20722 20774 20822 20843 20860 20890 20902 20890 20883 20890 20871 20851 20859 20862 20839 20841 20873 20929 20992 21044 21067 21115 21207 21314 21440 21539 21500 21354 21201 21063 20989 20960 20912 20844 20801 20858 20915 20983 21043 21030 21036 21079 21051 20972 20952 21052 21176 21279 21366 21439 21497 21512 21439 21310 21178 21082 21094 21168 21220 21315 21386 21340 21205 21085 20960 20814 20821 20952 21059 21139 21222 21303 21399 21512 21606 21672 21645 21466 21179 20978 20989 21112 21114 21087 21123 21223 21368 21515 21706 21897 22012 22049 22059 22028 21920 21688 21367 1 72 154 1 370540.650382543157320 90151.573536386393243 0.000000000000000 2017.505737304687500 2191.176269531250000 20305 20175 20190 20316 20465 20596 20620 20540 20528 20609 20723 20802 20848 20829 20724 20516 20376 20388 20434 20505 20644 20767 20833 20868 20892 20797 20637 20564 20573 20619 20672 20721 20726 20723 20728 20700 20726 20754 20750 20764 20730 20645 20602 20617 20609 20579 20563 20589 20568 20538 20552 20587 20618 20636 20644 20669 20709 20737 20783 20822 20848 20868 20903 20928 20927 20930 20931 20894 20857 20849 20839 20810 20823 20875 20948 20979 20978 20985 21064 21178 21294 21446 21549 21520 21353 21179 21098 21054 20970 20884 20835 20783 20774 20822 20892 20944 20939 20948 20992 20945 20890 20926 21024 21113 21188 21265 21354 21424 21436 21366 21241 21120 21057 21105 21211 21295 21382 21419 21332 21169 21036 20923 20795 20776 20855 20932 21028 21145 21266 21409 21572 21709 21765 21700 21510 21218 20965 20909 20981 20982 21045 21175 21334 21504 21623 21720 21825 21849 21852 21886 21912 21881 21698 21392 1 73 154 1 370543.650382543157320 90151.573536386393243 0.000000000000000 2016.657348632812500 2182.723388671875000 20476 20219 20167 20276 20407 20568 20687 20667 20592 20594 20679 20774 20855 20883 20819 20612 20447 20457 20500 20485 20530 20659 20796 20883 20928 20892 20789 20707 20674 20666 20673 20721 20741 20735 20753 20735 20735 20726 20688 20673 20663 20661 20691 20697 20647 20598 20570 20592 20580 20548 20566 20593 20614 20636 20649 20677 20716 20747 20786 20824 20859 20882 20917 20955 20976 20989 20991 20951 20886 20825 20786 20784 20825 20892 20958 20969 20929 20918 21013 21150 21293 21475 21593 21554 21372 21237 21229 21160 21033 20965 20901 20806 20755 20734 20761 20822 20861 20870 20891 20855 20851 20921 20993 21061 21138 21231 21324 21373 21368 21306 21183 21072 21042 21120 21247 21355 21416 21402 21325 21233 21143 21003 20823 20744 20813 20918 21010 21123 21257 21415 21588 21741 21785 21674 21469 21190 20921 20844 20924 21012 21136 21304 21483 21660 21777 21827 21817 21718 21657 21669 21727 21783 21662 21400 1 74 154 1 370546.650382543157320 90151.573536386393243 0.000000000000000 2015.848876953125000 2192.496337890625000 20483 20234 20158 20228 20309 20469 20645 20725 20680 20623 20626 20695 20792 20878 20862 20674 20493 20502 20598 20574 20502 20549 20701 20850 20942 20966 20932 20864 20788 20726 20702 20749 20791 20787 20799 20798 20762 20699 20640 20617 20645 20688 20738 20738 20688 20631 20597 20596 20595 20586 20596 20603 20618 20635 20655 20685 20736 20782 20808 20834 20870 20897 20934 20991 21045 21079 21072 21035 20950 20844 20782 20781 20826 20897 20956 20960 20911 20906 20985 21122 21286 21467 21598 21578 21444 21382 21358 21210 21113 21112 21029 20939 20899 20798 20725 20716 20761 20797 20814 20793 20812 20885 20956 21031 21117 21203 21274 21307 21310 21281 21178 21061 21038 21140 21262 21370 21410 21364 21282 21228 21171 21019 20822 20741 20860 21002 21086 21175 21304 21452 21598 21720 21746 21593 21355 21093 20882 20883 20999 21115 21246 21406 21579 21748 21875 21925 21869 21698 21539 21474 21542 21655 21595 21362 1 75 154 1 370549.650382543157320 90151.573536386393243 0.000000000000000 2021.342773437500000 2192.162841796875000 20335 20213 20230 20271 20253 20355 20521 20656 20709 20699 20667 20695 20780 20876 20898 20757 20558 20519 20654 20693 20585 20531 20619 20784 20926 20999 21012 20958 20837 20727 20707 20764 20828 20838 20855 20864 20827 20778 20729 20679 20691 20720 20715 20712 20714 20697 20666 20633 20614 20613 20617 20612 20630 20643 20668 20708 20757 20805 20837 20864 20893 20924 20966 21034 21106 21149 21137 21069 20966 20865 20815 20805 20827 20887 20939 20954 20930 20928 20987 21096 21256 21422 21543 21562 21532 21536 21463 21296 21249 21282 21167 21086 21075 20936 20784 20673 20666 20708 20739 20744 20767 20838 20930 21013 21083 21134 21171 21204 21229 21224 21140 21035 21039 21153 21254 21347 21385 21335 21233 21133 21049 20909 20757 20748 20910 21053 21147 21230 21344 21472 21580 21653 21658 21513 21250 20987 20866 20979 21103 21181 21317 21481 21641 21780 21882 21922 21886 21730 21508 21368 21424 21577 21591 21398 1 76 154 1 370552.650382543157320 90151.573536386393243 0.000000000000000 2020.624633789062500 2179.628417968750000 20206 20228 20357 20404 20302 20307 20401 20523 20647 20727 20737 20743 20817 20898 20938 20839 20628 20537 20686 20800 20728 20602 20589 20709 20878 20988 21030 20953 20787 20698 20726 20790 20828 20828 20867 20915 20914 20905 20873 20793 20738 20707 20656 20660 20706 20731 20725 20681 20632 20623 20641 20631 20655 20677 20699 20735 20774 20815 20844 20868 20906 20949 21001 21082 21152 21182 21151 21050 20953 20882 20846 20827 20830 20878 20918 20933 20931 20946 21004 21099 21240 21371 21465 21497 21538 21604 21543 21405 21386 21403 21266 21201 21199 21058 20881 20708 20631 20641 20670 20701 20740 20812 20906 20988 21025 21033 21060 21106 21142 21145 21078 20992 21033 21157 21242 21302 21314 21280 21199 21089 20977 20830 20696 20713 20886 21029 21145 21249 21356 21444 21487 21508 21505 21388 21124 20885 20882 21092 21232 21280 21374 21537 21683 21770 21796 21787 21783 21694 21489 21312 21345 21529 21602 21476 1 77 154 1 370555.650382543157320 90151.573536386393243 0.000000000000000 2022.264038085937500 2171.311035156250000 20223 20289 20439 20489 20408 20388 20393 20428 20564 20713 20809 20822 20856 20915 20955 20891 20697 20567 20693 20853 20844 20718 20621 20654 20799 20939 21012 20941 20772 20711 20764 20801 20832 20839 20876 20950 20975 20983 20964 20888 20796 20718 20668 20661 20686 20726 20749 20719 20660 20642 20664 20658 20665 20685 20706 20738 20787 20833 20844 20859 20916 20987 21051 21126 21183 21189 21124 21024 20960 20910 20871 20840 20839 20898 20928 20931 20933 20952 21005 21103 21225 21308 21378 21434 21494 21568 21593 21544 21531 21521 21407 21322 21271 21139 20974 20784 20651 20620 20635 20670 20715 20779 20852 20917 20942 20948 20991 21031 21064 21086 21042 20954 20996 21130 21207 21219 21195 21179 21166 21126 21050 20915 20747 20670 20809 20963 21100 21223 21317 21358 21334 21317 21323 21217 20979 20820 20954 21192 21334 21383 21437 21566 21686 21713 21642 21579 21618 21610 21447 21270 21279 21459 21568 21509 1 78 154 1 370558.650382543157320 90151.573536386393243 0.000000000000000 2045.646972656250000 2167.057128906250000 20537 20546 20607 20595 20559 20565 20509 20456 20538 20704 20857 20914 20906 20905 20915 20874 20731 20593 20658 20822 20901 20852 20722 20660 20741 20901 21012 21000 20865 20801 20810 20783 20821 20862 20905 20984 21015 21008 20990 20941 20874 20800 20740 20703 20701 20744 20761 20719 20677 20681 20681 20676 20671 20683 20705 20751 20806 20852 20870 20891 20953 21033 21095 21154 21199 21184 21103 21016 20972 20929 20876 20837 20848 20927 20971 20968 20940 20941 20985 21066 21155 21223 21295 21371 21442 21511 21592 21610 21607 21563 21482 21401 21292 21167 21030 20866 20716 20636 20621 20649 20688 20730 20774 20817 20849 20885 20952 20982 20999 21031 21000 20917 20954 21077 21140 21122 21087 21101 21147 21170 21119 20984 20783 20644 20762 20929 21069 21189 21248 21226 21167 21170 21202 21080 20872 20819 21018 21212 21322 21365 21420 21536 21664 21671 21524 21395 21440 21507 21397 21221 21213 21382 21505 21479 1 79 154 1 370561.650382543157320 90151.573536386393243 0.000000000000000 2054.682128906250000 2165.070068359375000 20965 20928 20882 20819 20755 20766 20661 20547 20560 20703 20864 20970 20981 20923 20859 20800 20706 20603 20626 20768 20902 20940 20838 20708 20721 20903 21048 21075 21005 20946 20884 20788 20819 20909 20960 20995 21021 21033 21015 20975 20926 20876 20823 20761 20748 20780 20774 20699 20662 20694 20701 20700 20694 20697 20728 20783 20843 20878 20901 20946 21018 21094 21150 21195 21219 21176 21105 21032 20985 20930 20860 20822 20858 20946 21010 20993 20923 20907 20951 21013 21063 21116 21193 21280 21391 21493 21585 21620 21610 21514 21394 21331 21234 21106 20989 20861 20727 20629 20609 20638 20674 20700 20732 20773 20820 20875 20931 20941 20929 20948 20929 20882 20913 20998 21061 21048 21009 21036 21116 21146 21083 20940 20733 20638 20779 20929 21053 21153 21177 21097 21028 21097 21182 21040 20810 20796 20970 21096 21157 21202 21291 21444 21605 21651 21509 21316 21284 21372 21331 21171 21145 21309 21428 21427 1 80 154 1 370564.650382543157320 90151.573536386393243 0.000000000000000 2060.646240234375000 2162.892822265625000 21260 21291 21222 21111 20966 20892 20735 20631 20619 20730 20915 21050 21089 21007 20883 20806 20729 20636 20625 20721 20851 20951 20915 20772 20730 20894 21074 21143 21129 21073 20955 20821 20844 20956 20980 20953 20995 21048 21021 20984 20963 20933 20889 20811 20756 20769 20785 20715 20665 20695 20726 20741 20732 20718 20739 20795 20865 20909 20941 20993 21082 21158 21209 21245 21240 21174 21114 21059 21000 20924 20848 20815 20845 20929 21003 20990 20911 20885 20922 20972 20998 21028 21103 21192 21306 21428 21519 21566 21556 21436 21257 21140 21054 20956 20853 20745 20656 20606 20609 20642 20687 20716 20731 20756 20793 20841 20874 20871 20842 20846 20846 20844 20858 20910 20970 20974 20959 21001 21064 21049 20948 20785 20621 20633 20780 20895 21008 21113 21139 21049 20960 21040 21157 21015 20763 20753 20885 20992 21086 21185 21258 21357 21525 21629 21559 21359 21218 21240 21254 21131 21105 21264 21389 21396 1 81 154 1 370567.650382543157320 90151.573536386393243 0.000000000000000 2055.117919921875000 2159.108398437500000 21385 21525 21544 21430 21218 21008 20813 20729 20675 20741 20943 21103 21170 21103 20949 20836 20764 20687 20645 20712 20819 20920 20951 20843 20751 20852 21028 21111 21146 21133 21005 20870 20904 21016 20991 20915 20984 21045 21008 20995 21002 20969 20917 20856 20783 20765 20796 20750 20686 20691 20726 20759 20758 20744 20767 20823 20894 20944 20984 21043 21140 21222 21257 21276 21242 21173 21125 21078 21001 20922 20858 20833 20839 20885 20949 20950 20887 20863 20885 20925 20953 20983 21042 21117 21204 21313 21407 21480 21476 21369 21192 21041 20956 20870 20767 20664 20606 20598 20628 20671 20714 20748 20750 20750 20763 20786 20807 20809 20793 20800 20816 20823 20816 20843 20874 20899 20947 20999 21016 20953 20823 20670 20551 20605 20720 20808 20925 21054 21102 21017 20925 21014 21120 20962 20744 20801 20927 21022 21164 21294 21346 21373 21479 21591 21574 21420 21210 21126 21137 21073 21078 21229 21354 21377 1 82 154 1 370570.650382543157320 90151.573536386393243 0.000000000000000 2054.527099609375000 2169.779785156250000 21352 21560 21698 21662 21455 21191 20998 20867 20747 20726 20871 21050 21165 21153 21026 20885 20807 20756 20693 20727 20814 20881 20943 20894 20777 20799 20923 20992 21079 21143 21081 20991 21013 21082 21041 20948 20992 21033 21005 21019 21032 20983 20925 20896 20824 20776 20799 20769 20694 20681 20732 20770 20776 20785 20827 20878 20928 20980 21036 21106 21211 21300 21334 21319 21255 21183 21135 21080 20991 20919 20871 20843 20835 20852 20897 20903 20863 20838 20838 20862 20895 20934 20983 21051 21117 21202 21300 21391 21421 21380 21258 21129 21052 20985 20850 20724 20625 20591 20638 20689 20737 20781 20783 20765 20763 20766 20771 20779 20789 20801 20811 20817 20807 20813 20823 20858 20927 20977 20979 20925 20837 20713 20565 20545 20635 20722 20850 20996 21024 20937 20891 21021 21074 20883 20737 20896 21052 21135 21257 21384 21425 21426 21483 21558 21542 21418 21209 21051 21010 20993 21037 21187 21317 21357 1 83 154 1 370573.650382543157320 90151.573536386393243 0.000000000000000 2050.383789062500000 2169.114746093750000 21251 21437 21604 21691 21657 21479 21268 21042 20862 20748 20790 20978 21145 21193 21103 20943 20853 20820 20747 20739 20809 20890 20974 20957 20828 20782 20877 20939 21026 21148 21179 21140 21150 21159 21063 20933 20954 21030 21039 21060 21064 21010 20959 20944 20859 20770 20761 20742 20688 20692 20748 20782 20793 20823 20869 20927 20969 21002 21068 21155 21263 21374 21429 21363 21248 21158 21112 21051 20971 20924 20888 20856 20842 20839 20862 20869 20852 20837 20828 20827 20826 20864 20923 20988 21065 21146 21255 21360 21416 21438 21375 21264 21173 21099 20955 20799 20652 20586 20634 20679 20735 20799 20803 20760 20737 20740 20764 20802 20830 20838 20818 20817 20825 20812 20802 20839 20893 20943 20964 20944 20898 20790 20602 20504 20568 20662 20802 20911 20890 20824 20877 21018 20980 20783 20756 20967 21151 21247 21316 21424 21463 21449 21465 21506 21515 21433 21243 21035 20940 20959 21041 21177 21297 21342 1 84 154 1 370576.650382543157320 90151.573536386393243 0.000000000000000 2047.366943359375000 2177.160400390625000 21224 21347 21477 21612 21767 21772 21556 21225 20963 20809 20787 20921 21109 21213 21149 20997 20911 20875 20799 20764 20811 20907 20999 21030 20926 20829 20884 20987 21087 21197 21227 21176 21183 21190 21081 20939 20952 21040 21040 21070 21088 21044 20992 20953 20865 20766 20736 20716 20686 20700 20747 20790 20805 20838 20883 20956 21001 21028 21091 21171 21289 21424 21449 21341 21195 21099 21055 21001 20953 20932 20906 20879 20873 20845 20830 20834 20841 20854 20859 20834 20795 20822 20885 20953 21043 21140 21247 21353 21424 21451 21389 21256 21129 21023 20902 20753 20623 20571 20606 20655 20726 20786 20778 20725 20703 20729 20772 20836 20877 20868 20833 20828 20851 20837 20815 20833 20881 20915 20938 20936 20914 20818 20619 20474 20500 20571 20688 20747 20726 20748 20886 20962 20838 20720 20850 21075 21238 21322 21362 21416 21431 21398 21393 21426 21468 21445 21278 21052 20931 20971 21085 21204 21298 21327 1 85 154 1 370579.650382543157320 90151.573536386393243 0.000000000000000 2045.216796875000000 2183.723388671875000 21294 21424 21537 21636 21786 21837 21611 21257 20984 20888 20856 20924 21088 21222 21187 21064 20974 20922 20848 20808 20838 20896 20974 21063 21035 20900 20867 20975 21116 21234 21237 21150 21141 21184 21122 21012 21025 21068 21041 21050 21056 21029 20989 20941 20886 20818 20759 20716 20695 20700 20739 20785 20810 20865 20917 20982 21033 21067 21127 21201 21314 21425 21390 21266 21136 21042 20988 20943 20924 20916 20909 20920 20927 20878 20818 20804 20819 20853 20875 20852 20812 20818 20870 20948 21028 21111 21214 21328 21403 21415 21343 21195 21039 20922 20848 20739 20651 20608 20592 20631 20698 20730 20705 20677 20698 20741 20811 20907 20942 20883 20843 20844 20871 20881 20871 20879 20918 20932 20915 20881 20860 20789 20627 20474 20452 20466 20519 20566 20615 20739 20845 20825 20739 20777 20998 21207 21333 21383 21394 21402 21381 21316 21290 21323 21397 21429 21319 21100 20947 20973 21094 21219 21308 21319 1 86 154 1 370582.650382543157320 90151.573536386393243 0.000000000000000 2042.128540039062500 2177.612060546875000 21376 21522 21639 21705 21776 21750 21486 21222 21088 21051 20992 20980 21077 21221 21252 21168 21051 20958 20891 20876 20892 20905 20977 21097 21142 21014 20893 20945 21095 21225 21253 21178 21146 21203 21196 21125 21082 21037 20994 20983 20994 21009 20999 20965 20930 20881 20810 20748 20724 20726 20753 20796 20838 20915 20982 21044 21091 21130 21190 21264 21345 21374 21298 21178 21074 20990 20941 20919 20914 20913 20918 20952 20970 20911 20835 20805 20817 20848 20879 20879 20845 20829 20863 20937 20995 21063 21170 21263 21304 21340 21351 21269 21115 21013 20958 20847 20776 20687 20579 20583 20637 20653 20640 20683 20738 20765 20846 20957 20968 20863 20837 20853 20879 20903 20927 20956 20973 20961 20920 20842 20757 20688 20600 20517 20477 20440 20421 20445 20530 20652 20685 20670 20752 20921 21113 21268 21375 21411 21418 21427 21401 21338 21275 21252 21336 21410 21348 21151 20977 20982 21114 21232 21281 21265 1 87 154 1 370585.650382543157320 90151.573536386393243 0.000000000000000 2041.980468750000000 2181.604980468750000 21450 21591 21716 21796 21816 21703 21422 21272 21284 21227 21129 21046 21083 21205 21274 21238 21120 21004 20948 20965 20969 20948 21002 21126 21203 21095 20943 20945 21081 21218 21254 21215 21206 21261 21290 21228 21112 21014 20968 20954 20974 21007 21018 21017 21010 20961 20875 20804 20757 20755 20776 20814 20874 20969 21047 21118 21168 21199 21226 21259 21285 21272 21199 21096 21020 20963 20928 20926 20940 20954 20962 20989 20992 20926 20867 20839 20839 20852 20893 20920 20882 20836 20846 20910 20960 21024 21118 21188 21235 21295 21376 21378 21276 21187 21092 20960 20850 20695 20555 20543 20573 20595 20645 20745 20790 20791 20858 20951 20928 20822 20826 20852 20881 20906 20947 20995 21004 20966 20890 20800 20688 20610 20605 20625 20633 20587 20490 20420 20428 20503 20570 20627 20769 20960 21104 21222 21318 21375 21422 21462 21459 21412 21320 21239 21308 21388 21344 21179 21010 20996 21136 21242 21233 21185 1 88 154 1 370588.650382543157320 90151.573536386393243 0.000000000000000 2044.606811523437500 2194.469970703125000 21537 21674 21811 21921 21945 21805 21528 21433 21461 21328 21208 21111 21136 21223 21297 21317 21222 21085 21015 21060 21061 21011 21027 21132 21217 21141 20986 20950 21065 21216 21276 21270 21288 21330 21363 21318 21197 21101 21050 21027 21030 21053 21045 21070 21091 21046 20947 20849 20801 20807 20814 20845 20912 21001 21088 21164 21216 21218 21178 21159 21154 21136 21075 21000 20966 20942 20936 20953 20975 20983 20987 21003 20993 20925 20882 20865 20854 20855 20904 20953 20925 20866 20844 20867 20915 20995 21090 21182 21266 21327 21383 21398 21341 21281 21162 21018 20876 20708 20577 20547 20557 20594 20692 20814 20848 20833 20855 20889 20859 20794 20819 20851 20888 20919 20959 21010 21014 20959 20873 20789 20692 20639 20690 20779 20836 20796 20646 20503 20446 20503 20648 20705 20752 20864 20996 21106 21205 21312 21405 21461 21476 21432 21328 21256 21315 21361 21325 21207 21064 21005 21112 21214 21180 21127 1 89 154 1 370591.650382543157320 90151.573536386393243 0.000000000000000 2052.350097656250000 2206.700927734375000 21620 21765 21920 22049 22067 21905 21680 21664 21647 21419 21243 21193 21254 21297 21350 21412 21354 21191 21083 21133 21129 21077 21071 21137 21199 21179 21047 20962 21039 21198 21293 21334 21359 21387 21399 21381 21322 21256 21200 21157 21118 21098 21042 21069 21113 21082 20991 20883 20843 20854 20844 20874 20935 20999 21080 21165 21224 21204 21111 21040 21018 21005 20975 20955 20958 20953 20964 20998 21033 21026 21021 21026 21009 20943 20893 20875 20859 20863 20902 20948 20947 20916 20873 20854 20893 20973 21094 21205 21305 21383 21389 21328 21249 21199 21099 20977 20844 20706 20618 20613 20642 20665 20733 20849 20905 20890 20842 20793 20775 20770 20810 20847 20897 20937 20962 21016 21027 20973 20890 20812 20729 20699 20777 20894 20990 20969 20813 20646 20528 20524 20673 20794 20854 20902 20980 21045 21125 21254 21361 21419 21446 21419 21329 21274 21322 21328 21309 21242 21096 20982 21054 21152 21106 21061 1 90 154 1 370594.650382543157320 90151.573536386393243 0.000000000000000 2060.241699218750000 2214.008300781250000 21699 21850 22009 22137 22140 21959 21814 21856 21806 21534 21329 21304 21401 21411 21439 21520 21474 21277 21139 21187 21176 21131 21115 21152 21173 21200 21127 21011 21032 21165 21284 21357 21390 21420 21407 21401 21402 21361 21329 21275 21183 21100 21045 21056 21070 21040 20974 20888 20872 20889 20874 20888 20939 20986 21041 21119 21171 21150 21055 20991 20973 20965 20962 20969 20980 20979 21001 21045 21095 21098 21078 21069 21045 20977 20915 20879 20867 20872 20896 20938 20972 20964 20904 20858 20892 20966 21090 21210 21319 21432 21450 21333 21158 21049 20970 20887 20794 20701 20655 20691 20731 20709 20717 20822 20905 20882 20801 20737 20727 20752 20807 20850 20888 20911 20942 20999 21014 20973 20902 20830 20765 20742 20801 20929 21053 21077 20972 20830 20699 20611 20602 20762 20951 21059 21132 21132 21129 21208 21289 21342 21388 21398 21332 21268 21305 21292 21274 21228 21095 20968 20991 21057 21001 20964 1 91 154 1 370597.650382543157320 90151.573536386393243 0.000000000000000 2055.241699218750000 2222.716796875000000 21808 21935 22074 22198 22227 22123 22063 22054 21938 21657 21478 21486 21558 21525 21555 21619 21549 21322 21188 21217 21216 21189 21184 21237 21227 21231 21203 21083 21053 21158 21301 21386 21422 21435 21377 21375 21409 21360 21345 21341 21221 21077 21029 21043 21023 20995 20966 20914 20908 20909 20910 20926 20957 20971 20993 21049 21087 21065 20990 20969 20979 20983 20995 21003 21000 21006 21038 21085 21144 21180 21151 21124 21088 21013 20943 20898 20885 20882 20891 20930 20983 20985 20915 20871 20920 20974 21071 21194 21325 21457 21504 21392 21190 21060 20998 20916 20822 20734 20696 20713 20708 20649 20661 20762 20818 20781 20726 20684 20691 20733 20788 20821 20831 20831 20882 20937 20953 20936 20889 20843 20815 20804 20827 20941 21077 21158 21113 21008 20895 20728 20552 20652 20905 21121 21243 21240 21191 21187 21214 21256 21313 21352 21308 21224 21241 21241 21220 21165 21043 20929 20920 20957 20901 20855 1 92 154 1 370600.650382543157320 90151.573536386393243 0.000000000000000 2053.734619140625000 2237.334228515625000 21942 22062 22173 22284 22357 22373 22357 22295 22114 21807 21687 21740 21722 21647 21675 21665 21530 21330 21264 21271 21259 21237 21262 21340 21332 21300 21269 21175 21090 21154 21294 21391 21459 21464 21380 21362 21411 21383 21357 21337 21240 21142 21111 21105 21063 21038 21020 20966 20932 20916 20942 20971 20978 20958 20964 20998 21019 21010 20983 20986 20994 21012 21029 21033 21027 21036 21066 21104 21159 21213 21207 21173 21125 21047 20965 20925 20912 20898 20895 20914 20959 20955 20900 20897 20954 21000 21065 21180 21323 21452 21504 21433 21295 21204 21126 21008 20883 20789 20762 20752 20673 20597 20626 20680 20687 20665 20643 20636 20674 20748 20796 20796 20774 20776 20834 20882 20910 20896 20862 20849 20865 20866 20863 20945 21089 21203 21213 21151 21038 20820 20559 20537 20760 21057 21212 21255 21221 21179 21148 21164 21212 21254 21235 21153 21140 21156 21150 21094 20981 20869 20841 20863 20822 20749 1 93 154 1 370603.650382543157320 90151.573536386393243 0.000000000000000 2053.533447265625000 2253.484375000000000 22056 22199 22287 22325 22387 22488 22535 22478 22259 22023 21996 22004 21886 21801 21772 21671 21520 21404 21407 21394 21337 21294 21335 21419 21434 21408 21358 21266 21147 21147 21267 21381 21485 21517 21451 21438 21474 21464 21423 21346 21240 21183 21171 21186 21169 21173 21135 21040 20964 20934 20956 20994 20991 20959 20958 20976 20983 20990 21007 21025 21025 21035 21056 21066 21067 21067 21093 21126 21177 21244 21274 21242 21168 21072 20980 20945 20935 20928 20915 20906 20918 20909 20895 20933 20988 21029 21069 21157 21293 21413 21463 21434 21365 21319 21218 21062 20928 20831 20806 20795 20700 20627 20637 20609 20575 20578 20580 20605 20686 20781 20825 20805 20757 20755 20810 20853 20883 20869 20838 20835 20877 20919 20927 20958 21065 21196 21241 21201 21111 20945 20703 20535 20624 20914 21113 21224 21229 21188 21130 21113 21126 21137 21114 21036 21006 21033 21054 21014 20926 20823 20762 20755 20741 20673 1 94 154 1 370606.650382543157320 90151.573536386393243 0.000000000000000 2051.604736328125000 2261.884277343750000 22079 22218 22254 22222 22282 22469 22606 22619 22483 22366 22350 22243 22059 21983 21852 21705 21596 21559 21596 21545 21440 21374 21392 21469 21509 21522 21470 21342 21200 21154 21230 21351 21486 21552 21515 21492 21498 21479 21427 21349 21247 21168 21138 21153 21177 21258 21272 21176 21072 20997 20965 20987 20997 20978 20967 20974 20990 21005 21026 21053 21067 21069 21086 21104 21120 21124 21133 21170 21212 21275 21309 21281 21204 21094 20988 20950 20948 20962 20945 20915 20896 20887 20897 20942 21001 21050 21072 21129 21240 21334 21385 21371 21344 21348 21276 21132 20987 20860 20800 20793 20730 20672 20664 20580 20516 20534 20540 20584 20691 20799 20847 20822 20757 20737 20774 20815 20842 20843 20820 20803 20851 20939 20991 20999 21052 21164 21208 21160 21100 21022 20807 20526 20520 20794 21042 21179 21216 21196 21156 21143 21140 21147 21123 21024 20929 20909 20929 20921 20885 20832 20765 20717 20668 20602 1 95 154 1 370609.650382543157320 90151.573536386393243 0.000000000000000 2044.477783203125000 2276.152343750000000 21964 22007 22017 22096 22291 22527 22681 22762 22761 22731 22676 22506 22303 22145 21929 21793 21739 21791 21798 21694 21561 21491 21462 21502 21563 21597 21564 21435 21281 21201 21222 21321 21483 21560 21535 21490 21483 21433 21371 21335 21268 21188 21145 21143 21177 21293 21366 21314 21197 21064 20985 20993 21010 21016 21013 21000 21013 21030 21048 21081 21101 21107 21118 21132 21160 21178 21178 21205 21229 21273 21298 21280 21214 21118 21018 20973 20972 20991 20978 20940 20901 20881 20888 20931 21023 21094 21093 21097 21165 21231 21273 21258 21252 21299 21293 21186 21024 20882 20804 20820 20792 20735 20695 20578 20486 20482 20497 20568 20679 20774 20825 20817 20760 20718 20729 20759 20775 20788 20783 20774 20819 20912 21006 21060 21101 21149 21135 21044 20979 20948 20781 20487 20445 20719 20991 21132 21202 21223 21212 21214 21214 21198 21152 21056 20938 20873 20842 20828 20849 20879 20846 20757 20634 20539 1 96 154 1 370612.650382543157320 90151.573536386393243 0.000000000000000 2041.775146484375000 2300.094238281250000 21699 21746 21891 22147 22434 22651 22789 22895 22968 23001 22959 22782 22509 22245 22027 21892 21901 22040 22049 21906 21743 21632 21540 21531 21611 21666 21639 21512 21363 21286 21260 21296 21444 21564 21576 21531 21509 21439 21353 21301 21272 21251 21238 21235 21252 21309 21334 21323 21271 21137 21032 21014 21031 21066 21096 21060 21037 21056 21067 21094 21114 21131 21136 21139 21167 21193 21191 21195 21211 21248 21275 21270 21227 21147 21063 21022 21015 21026 21009 20965 20904 20863 20878 20934 21035 21106 21087 21053 21092 21158 21198 21196 21204 21246 21265 21199 21043 20890 20821 20878 20880 20785 20663 20508 20442 20440 20460 20544 20647 20723 20774 20795 20766 20714 20685 20701 20712 20727 20737 20744 20788 20879 20991 21094 21156 21166 21106 20984 20869 20776 20626 20418 20429 20689 20907 21028 21164 21243 21256 21261 21253 21203 21136 21078 21020 20952 20858 20794 20827 20923 20918 20821 20681 20602 1 97 154 1 370615.650382543157320 90151.573536386393243 0.000000000000000 2036.590454101562500 2315.683837890625000 21542 21778 22050 22312 22537 22724 22871 22996 23092 23157 23134 22940 22631 22367 22146 21974 22045 22221 22258 22106 21921 21743 21618 21598 21659 21725 21697 21558 21431 21398 21351 21303 21377 21535 21629 21610 21551 21478 21395 21332 21318 21320 21335 21350 21315 21260 21204 21202 21227 21166 21073 21040 21057 21109 21165 21133 21066 21075 21083 21102 21121 21144 21150 21149 21171 21195 21188 21175 21190 21207 21237 21247 21219 21166 21107 21059 21038 21028 21005 20970 20894 20832 20852 20901 20974 21033 21033 21006 21036 21095 21129 21149 21177 21206 21209 21191 21076 20929 20866 20907 20909 20776 20577 20419 20402 20413 20444 20514 20590 20662 20740 20787 20766 20706 20642 20627 20636 20655 20683 20715 20771 20853 20954 21065 21153 21177 21126 21027 20885 20710 20518 20366 20431 20641 20790 20950 21154 21258 21255 21230 21216 21176 21128 21119 21118 21055 20920 20794 20782 20890 20923 20879 20779 20702 1 98 154 1 370618.650382543157320 90151.573536386393243 0.000000000000000 2034.182128906250000 2318.782958984375000 21542 21887 22135 22301 22489 22697 22885 23036 23132 23188 23184 23042 22803 22564 22296 22129 22222 22383 22438 22264 22023 21824 21761 21745 21724 21761 21741 21600 21503 21512 21475 21380 21363 21493 21645 21663 21584 21510 21460 21416 21395 21373 21378 21402 21342 21248 21145 21116 21177 21192 21131 21067 21070 21125 21189 21186 21124 21117 21118 21121 21140 21161 21175 21178 21179 21187 21189 21188 21211 21213 21227 21212 21184 21151 21115 21080 21059 21021 20981 20961 20900 20839 20838 20853 20887 20935 20962 20948 20955 21001 21060 21093 21131 21162 21172 21194 21126 20979 20878 20856 20832 20681 20463 20348 20358 20378 20412 20458 20521 20605 20705 20763 20751 20689 20602 20550 20555 20586 20640 20700 20773 20848 20930 21018 21110 21149 21115 21074 20990 20820 20565 20342 20387 20577 20779 21013 21203 21264 21218 21146 21116 21122 21118 21145 21161 21102 20958 20776 20681 20764 20854 20891 20841 20724 1 99 154 1 370621.650382543157320 90151.573536386393243 0.000000000000000 2030.759765625000000 2309.530273437500000 21498 21820 21981 22108 22326 22561 22801 22984 23059 23076 23095 23079 22943 22732 22504 22405 22452 22569 22587 22381 22114 21974 21971 21930 21817 21797 21777 21664 21611 21634 21600 21502 21412 21444 21582 21643 21600 21546 21519 21506 21489 21455 21416 21406 21375 21312 21192 21118 21168 21223 21181 21080 21067 21128 21191 21213 21189 21156 21140 21153 21173 21190 21203 21212 21210 21212 21232 21244 21268 21287 21282 21216 21169 21142 21115 21099 21085 21043 20996 20974 20932 20869 20836 20816 20820 20851 20888 20892 20888 20922 21001 21041 21065 21103 21137 21178 21161 21025 20871 20767 20699 20560 20378 20308 20327 20347 20377 20412 20470 20552 20647 20702 20717 20673 20582 20514 20506 20539 20613 20682 20752 20849 20952 21025 21082 21077 21027 21042 21036 20908 20618 20343 20350 20547 20789 21012 21152 21201 21151 21060 20996 21034 21081 21100 21085 21046 20944 20765 20608 20605 20707 20817 20844 20735 1 100 154 1 370624.650382543157320 90151.573536386393243 0.000000000000000 2028.950561523437500 2297.261962890625000 21340 21589 21713 21917 22175 22409 22644 22802 22832 22827 22889 22973 22955 22872 22794 22736 22723 22789 22755 22523 22287 22256 22224 22080 21913 21879 21824 21755 21752 21748 21699 21621 21502 21439 21522 21620 21580 21526 21539 21536 21525 21512 21453 21435 21439 21396 21258 21137 21164 21236 21210 21104 21103 21180 21207 21220 21216 21181 21165 21173 21187 21210 21222 21227 21217 21223 21263 21290 21296 21310 21296 21225 21171 21150 21144 21134 21100 21047 21009 20999 20970 20903 20841 20797 20780 20793 20823 20840 20839 20853 20916 20958 20984 21039 21088 21140 21160 21061 20888 20715 20566 20439 20324 20290 20312 20336 20366 20393 20446 20517 20582 20633 20679 20670 20586 20511 20483 20498 20566 20633 20700 20816 20952 21049 21080 21019 20927 20929 20978 20903 20633 20350 20303 20469 20692 20881 21019 21068 21040 20966 20888 20908 20964 20970 20941 20934 20924 20834 20680 20576 20596 20704 20801 20773 1 101 154 1 370627.650382543157320 90151.573536386393243 0.000000000000000 2026.033691406250000 2301.045898437500000 21149 21332 21480 21729 21986 22234 22437 22569 22646 22724 22831 22897 22912 22928 22940 22955 22984 23010 22909 22648 22540 22577 22419 22160 22029 21995 21930 21914 21910 21865 21782 21697 21569 21464 21518 21631 21584 21529 21539 21496 21477 21514 21489 21490 21494 21442 21305 21179 21190 21245 21251 21199 21222 21282 21248 21235 21243 21222 21200 21194 21208 21228 21241 21244 21239 21266 21294 21306 21300 21290 21266 21220 21187 21181 21186 21147 21066 21016 20999 21010 20997 20935 20865 20812 20779 20769 20780 20805 20812 20808 20832 20875 20930 21001 21041 21083 21126 21089 20928 20722 20522 20369 20282 20270 20299 20327 20359 20375 20419 20492 20545 20594 20642 20651 20581 20498 20451 20439 20491 20573 20674 20812 20946 21029 21055 21004 20888 20822 20855 20850 20651 20369 20260 20397 20617 20787 20874 20894 20889 20854 20792 20775 20787 20792 20780 20789 20852 20889 20836 20688 20575 20612 20750 20797 1 102 154 1 370630.650382543157320 90151.573536386393243 0.000000000000000 2025.516235351562500 2316.772460937500000 21077 21243 21486 21748 22003 22213 22360 22480 22625 22785 22936 23022 23029 23038 23042 23076 23141 23168 23033 22829 22834 22773 22489 22267 22241 22203 22147 22122 22050 21936 21798 21674 21543 21471 21562 21680 21641 21595 21580 21521 21473 21512 21540 21555 21536 21447 21332 21282 21296 21291 21294 21313 21361 21389 21325 21279 21264 21241 21222 21215 21229 21239 21259 21269 21273 21309 21320 21321 21314 21295 21264 21229 21203 21198 21212 21153 21038 21004 20994 21005 21006 20955 20901 20859 20803 20755 20758 20786 20795 20783 20784 20832 20902 20959 20986 21030 21089 21094 20963 20754 20555 20375 20263 20255 20289 20319 20346 20360 20394 20466 20526 20573 20627 20643 20586 20495 20414 20393 20436 20527 20639 20776 20896 20964 20992 20975 20893 20780 20731 20754 20637 20399 20265 20383 20581 20701 20715 20710 20725 20705 20653 20636 20600 20588 20600 20607 20679 20800 20862 20778 20603 20559 20725 20804 1 103 154 1 370633.650382543157320 90151.573536386393243 0.000000000000000 2024.611938476562500 2326.218017578125000 21107 21204 21513 21807 22025 22160 22253 22379 22557 22764 22970 23144 23226 23230 23192 23208 23239 23262 23186 23091 23054 22828 22606 22567 22565 22469 22339 22188 22034 21883 21758 21656 21543 21499 21627 21737 21718 21681 21644 21593 21541 21544 21581 21591 21556 21466 21421 21436 21431 21369 21349 21393 21436 21445 21388 21338 21316 21267 21230 21229 21247 21259 21280 21295 21314 21350 21358 21353 21341 21323 21294 21266 21230 21199 21224 21165 21048 21007 21000 21034 21037 20961 20913 20891 20824 20775 20769 20781 20788 20789 20792 20820 20881 20922 20939 20981 21042 21082 21003 20820 20624 20422 20265 20246 20280 20316 20343 20363 20394 20458 20517 20560 20612 20624 20587 20510 20419 20378 20401 20482 20574 20695 20821 20879 20905 20901 20859 20759 20638 20620 20574 20389 20273 20383 20525 20571 20543 20537 20553 20527 20500 20497 20442 20394 20414 20432 20485 20602 20725 20720 20580 20524 20688 20757 1 104 154 1 370636.650382543157320 90151.573536386393243 0.000000000000000 2024.528930664062500 2338.554443359375000 21113 21151 21416 21687 21865 22006 22129 22312 22498 22703 22920 23130 23261 23299 23331 23386 23366 23348 23348 23295 23113 22853 22829 22932 22920 22731 22463 22205 22019 21889 21804 21722 21598 21538 21680 21778 21774 21768 21740 21693 21643 21616 21626 21621 21583 21528 21534 21560 21526 21439 21418 21456 21468 21462 21417 21377 21358 21284 21231 21236 21258 21285 21310 21332 21357 21385 21394 21383 21366 21360 21349 21329 21301 21248 21219 21163 21090 21049 21023 21055 21033 20941 20917 20919 20861 20818 20800 20786 20776 20779 20795 20811 20866 20920 20931 20944 20974 21041 21024 20896 20695 20475 20293 20245 20262 20298 20341 20376 20409 20464 20511 20546 20591 20606 20597 20543 20440 20357 20365 20433 20523 20643 20749 20787 20816 20816 20784 20703 20565 20476 20434 20311 20276 20399 20473 20442 20416 20432 20425 20401 20410 20392 20331 20275 20282 20293 20321 20400 20507 20549 20486 20471 20599 20637 1 105 154 1 370639.650382543157320 90151.573536386393243 0.000000000000000 2019.980957031250000 2352.274658203125000 21140 21157 21246 21457 21674 21888 22094 22259 22382 22571 22771 22970 23099 23181 23364 23523 23510 23468 23479 23416 23177 23058 23199 23299 23216 22908 22548 22290 22121 21982 21851 21719 21611 21605 21742 21835 21856 21881 21850 21792 21729 21697 21688 21659 21613 21575 21591 21607 21548 21468 21468 21520 21520 21489 21456 21417 21365 21288 21242 21241 21258 21300 21336 21364 21391 21416 21424 21411 21396 21403 21405 21396 21365 21284 21210 21180 21165 21133 21075 21069 21019 20963 20941 20922 20873 20841 20810 20783 20758 20756 20775 20788 20845 20934 20955 20928 20901 20936 20961 20920 20741 20523 20331 20234 20242 20282 20344 20400 20440 20478 20519 20552 20583 20589 20583 20549 20455 20358 20336 20383 20476 20594 20675 20704 20750 20749 20702 20619 20486 20358 20282 20233 20288 20403 20429 20371 20367 20402 20363 20343 20385 20379 20348 20286 20233 20200 20204 20240 20307 20350 20361 20413 20497 20530 1 106 154 1 370642.650382543157320 90151.573536386393243 0.000000000000000 2013.607421875000000 2361.393554687500000 21222 21255 21190 21274 21504 21777 22018 22137 22215 22382 22567 22746 22868 23010 23290 23509 23597 23614 23606 23535 23387 23433 23563 23528 23331 22971 22614 22398 22228 22034 21829 21656 21626 21704 21805 21871 21925 21973 21943 21873 21794 21752 21718 21659 21612 21604 21618 21624 21577 21512 21510 21565 21562 21528 21527 21511 21427 21335 21249 21229 21266 21321 21358 21395 21418 21437 21444 21439 21438 21449 21448 21438 21403 21324 21259 21237 21209 21201 21171 21133 21069 21041 20979 20917 20883 20844 20791 20763 20738 20732 20738 20750 20806 20920 20963 20922 20835 20815 20883 20902 20760 20553 20358 20236 20239 20282 20351 20415 20478 20517 20549 20570 20585 20573 20548 20523 20459 20367 20316 20350 20431 20534 20612 20658 20697 20680 20606 20515 20404 20280 20193 20189 20288 20390 20401 20338 20327 20354 20321 20322 20384 20407 20392 20351 20271 20180 20136 20146 20184 20221 20276 20359 20440 20507 1 107 154 1 370645.650382543157320 90151.573536386393243 0.000000000000000 2010.999755859375000 2373.653076171875000 21335 21443 21330 21242 21346 21619 21880 22005 22083 22185 22335 22503 22646 22883 23216 23496 23666 23737 23727 23702 23681 23723 23651 23427 23183 22925 22694 22499 22271 22020 21783 21652 21715 21827 21865 21893 21968 22012 21972 21903 21828 21762 21700 21636 21598 21594 21603 21616 21608 21575 21577 21616 21611 21580 21589 21602 21516 21421 21285 21225 21277 21339 21372 21423 21453 21468 21474 21473 21475 21479 21475 21466 21443 21387 21311 21213 21129 21141 21162 21147 21114 21089 21000 20927 20902 20849 20777 20748 20721 20706 20705 20721 20765 20869 20937 20925 20820 20733 20772 20812 20725 20562 20381 20256 20252 20295 20370 20438 20503 20551 20577 20580 20584 20580 20546 20506 20451 20371 20308 20319 20373 20457 20551 20625 20636 20582 20495 20408 20325 20233 20153 20155 20238 20310 20303 20261 20263 20282 20289 20323 20362 20351 20319 20297 20249 20176 20110 20110 20148 20191 20263 20374 20472 20554 1 108 154 1 370648.650382543157320 90151.573536386393243 0.000000000000000 2009.747680664062500 2387.936523437500000 21444 21667 21619 21391 21300 21441 21710 21925 22017 22047 22145 22298 22493 22816 23152 23428 23631 23768 23823 23871 23879 23743 23450 23129 22891 22755 22666 22508 22243 21967 21758 21737 21836 21888 21907 21931 21983 22001 21962 21912 21847 21765 21691 21627 21595 21610 21623 21627 21634 21625 21643 21677 21662 21622 21646 21696 21632 21537 21386 21275 21308 21369 21394 21438 21477 21503 21509 21507 21509 21509 21499 21483 21452 21379 21271 21159 21080 21087 21120 21110 21083 21076 21025 20960 20919 20869 20807 20750 20702 20673 20680 20703 20733 20809 20894 20913 20818 20690 20643 20653 20611 20520 20391 20274 20261 20311 20388 20460 20521 20574 20592 20573 20546 20544 20540 20521 20461 20374 20321 20313 20333 20396 20494 20571 20567 20483 20408 20377 20341 20267 20157 20124 20175 20227 20226 20224 20250 20282 20317 20352 20372 20323 20230 20175 20148 20126 20097 20109 20157 20207 20266 20374 20491 20571 1 109 154 1 370651.650382543157320 90151.573536386393243 0.000000000000000 2008.305908203125000 2394.240966796875000 21524 21817 21892 21652 21417 21366 21605 21877 21945 21923 21996 22170 22438 22784 23042 23271 23509 23699 23844 23942 23873 23547 23176 22873 22640 22533 22491 22376 22166 21910 21750 21817 21919 21925 21963 21988 22013 22010 21993 21950 21867 21796 21744 21683 21643 21661 21659 21658 21689 21702 21705 21726 21699 21658 21697 21758 21718 21645 21516 21398 21431 21502 21501 21499 21520 21541 21539 21531 21534 21538 21532 21511 21450 21338 21233 21183 21155 21144 21152 21105 21050 21061 21045 20995 20944 20896 20836 20759 20680 20640 20651 20675 20708 20760 20840 20884 20834 20740 20641 20590 20526 20448 20363 20279 20252 20291 20369 20457 20533 20583 20587 20560 20501 20470 20517 20557 20514 20429 20356 20322 20316 20346 20414 20486 20494 20406 20326 20342 20374 20321 20181 20105 20146 20222 20285 20318 20332 20351 20374 20368 20369 20331 20219 20108 20083 20098 20116 20153 20196 20236 20270 20343 20450 20512 1 110 154 1 370654.650382543157320 90151.573536386393243 0.000000000000000 2008.024536132812500 2396.721435546875000 21570 21907 22116 21951 21631 21393 21475 21714 21784 21776 21854 22021 22309 22613 22839 23058 23318 23585 23830 23967 23830 23485 23159 22863 22606 22399 22275 22179 22053 21880 21767 21882 22007 22015 22051 22063 22050 22036 22029 21988 21911 21861 21834 21778 21743 21758 21763 21765 21778 21773 21759 21763 21731 21690 21726 21743 21688 21673 21635 21555 21580 21650 21653 21615 21588 21590 21571 21557 21559 21563 21560 21538 21476 21365 21284 21252 21241 21251 21227 21117 21021 21047 21059 21041 21000 20932 20851 20764 20674 20623 20621 20652 20685 20713 20771 20833 20832 20796 20724 20652 20545 20436 20344 20277 20244 20257 20312 20399 20500 20563 20565 20531 20458 20420 20496 20568 20555 20488 20402 20341 20331 20336 20352 20396 20419 20350 20276 20294 20337 20293 20171 20106 20160 20276 20382 20432 20417 20398 20383 20353 20327 20296 20196 20084 20080 20118 20178 20241 20277 20306 20325 20364 20416 20432 1 111 154 1 370657.650382543157320 90151.573536386393243 0.000000000000000 2007.253784179687500 2398.676513671875000 21613 21996 22314 22208 21858 21545 21426 21482 21579 21663 21742 21876 22139 22387 22611 22863 23168 23510 23833 23987 23798 23452 23105 22850 22656 22393 22162 22038 21938 21846 21821 21961 22101 22146 22164 22155 22106 22062 22051 22012 21966 21947 21941 21909 21893 21904 21929 21939 21908 21856 21821 21803 21759 21733 21762 21741 21676 21696 21734 21713 21716 21731 21740 21724 21670 21633 21596 21592 21601 21572 21539 21515 21502 21437 21343 21283 21278 21305 21248 21105 20993 21004 21039 21042 21016 20964 20884 20799 20711 20630 20596 20628 20657 20670 20703 20766 20784 20778 20742 20680 20592 20477 20357 20295 20265 20248 20269 20348 20463 20536 20517 20464 20408 20395 20472 20532 20539 20496 20420 20350 20327 20312 20302 20325 20349 20301 20250 20269 20273 20198 20118 20123 20203 20334 20442 20498 20468 20399 20344 20324 20308 20271 20168 20073 20094 20146 20220 20317 20373 20383 20375 20387 20408 20395 1 112 154 1 370660.650382543157320 90151.573536386393243 0.000000000000000 2007.946777343750000 2392.489013671875000 21668 22052 22424 22382 22075 21748 21489 21415 21475 21554 21703 21942 22209 22423 22642 22909 23208 23542 23847 23925 23631 23274 22928 22686 22538 22337 22133 22004 21915 21864 21893 22047 22200 22272 22269 22226 22160 22106 22089 22062 22040 22035 22034 22024 22029 22042 22075 22100 22051 21962 21913 21871 21801 21791 21842 21816 21771 21788 21817 21798 21746 21691 21731 21802 21752 21670 21630 21649 21650 21572 21487 21483 21527 21478 21378 21325 21291 21258 21188 21079 20994 20982 21019 21002 20991 20987 20929 20852 20772 20672 20603 20608 20630 20638 20646 20681 20709 20726 20715 20651 20575 20489 20385 20338 20314 20275 20259 20297 20404 20469 20439 20378 20349 20375 20438 20462 20481 20483 20448 20382 20319 20277 20263 20275 20293 20255 20216 20263 20264 20171 20111 20174 20263 20371 20457 20500 20473 20388 20309 20297 20298 20264 20159 20079 20123 20191 20266 20377 20452 20444 20398 20388 20406 20390 1 113 154 1 370663.650382543157320 90151.573536386393243 0.000000000000000 2009.821899414062500 2384.854736328125000 21716 22085 22424 22389 22116 21810 21563 21550 21557 21538 21752 22035 22285 22500 22702 22922 23193 23518 23818 23849 23515 23161 22874 22622 22415 22243 22128 22074 22048 21969 21937 22113 22309 22391 22374 22307 22236 22182 22160 22139 22122 22127 22128 22131 22148 22165 22195 22219 22176 22097 22027 21946 21868 21883 21941 21915 21866 21831 21793 21772 21739 21664 21719 21834 21807 21701 21674 21700 21656 21547 21456 21473 21538 21518 21435 21381 21300 21234 21173 21116 21056 21006 21011 20986 20981 20997 20963 20904 20820 20728 20654 20618 20611 20610 20596 20604 20641 20665 20651 20586 20516 20476 20430 20394 20367 20333 20291 20263 20314 20372 20362 20313 20300 20338 20373 20388 20429 20475 20495 20443 20342 20262 20233 20218 20214 20189 20174 20229 20231 20155 20168 20253 20317 20394 20459 20468 20428 20365 20304 20299 20308 20283 20185 20098 20146 20257 20335 20419 20472 20432 20364 20344 20359 20350 1 114 154 1 370666.650382543157320 90151.573536386393243 0.000000000000000 2011.328857421875000 2375.482666015625000 21888 22247 22478 22382 22082 21751 21630 21740 21694 21576 21737 22001 22219 22443 22672 22919 23196 23484 23725 23755 23523 23205 22909 22657 22421 22279 22267 22308 22289 22128 21989 22150 22410 22500 22460 22393 22335 22290 22248 22209 22186 22202 22223 22222 22241 22273 22292 22296 22259 22194 22101 21996 21922 21958 22014 21961 21884 21804 21732 21748 21774 21714 21743 21843 21834 21725 21702 21695 21603 21504 21452 21468 21516 21540 21504 21457 21365 21292 21251 21221 21156 21046 20983 20970 20993 21026 21003 20956 20880 20796 20731 20669 20621 20594 20571 20561 20584 20608 20598 20548 20496 20499 20488 20444 20415 20376 20316 20263 20257 20287 20279 20247 20252 20293 20311 20320 20369 20450 20517 20510 20428 20332 20259 20197 20166 20133 20113 20142 20158 20171 20265 20346 20384 20426 20461 20439 20382 20327 20281 20274 20302 20301 20223 20119 20162 20287 20349 20383 20387 20320 20283 20297 20318 20310 1 115 154 1 370669.650382543157320 90151.573536386393243 0.000000000000000 2007.214477539062500 2356.854980468750000 22145 22505 22593 22356 22018 21732 21757 21953 21881 21654 21657 21892 22163 22419 22665 22930 23173 23391 23539 23569 23447 23144 22824 22603 22439 22422 22530 22602 22530 22294 22067 22152 22452 22599 22586 22547 22510 22470 22390 22306 22260 22268 22307 22334 22351 22374 22381 22359 22304 22224 22125 22035 21975 22025 22059 21981 21897 21823 21764 21789 21835 21801 21823 21891 21858 21754 21737 21708 21616 21558 21523 21508 21509 21506 21490 21496 21446 21380 21380 21370 21286 21115 20981 20953 21005 21054 21037 21008 20954 20866 20784 20720 20655 20611 20574 20549 20549 20573 20582 20559 20543 20548 20531 20477 20431 20397 20341 20290 20256 20246 20225 20201 20205 20245 20258 20273 20333 20415 20503 20549 20514 20422 20308 20220 20179 20120 20072 20085 20140 20229 20349 20421 20439 20446 20438 20390 20332 20288 20245 20239 20278 20293 20212 20114 20172 20286 20302 20278 20261 20227 20251 20309 20331 20301 1 116 154 1 370672.650382543157320 90151.573536386393243 0.000000000000000 2008.003906250000000 2339.032470703125000 22428 22754 22688 22315 21985 21802 21888 22168 22131 21848 21701 21787 22042 22318 22520 22748 23022 23241 23339 23390 23364 23072 22781 22609 22524 22639 22807 22838 22719 22447 22154 22137 22430 22662 22738 22756 22730 22655 22533 22423 22355 22344 22374 22423 22453 22470 22463 22422 22350 22252 22157 22075 22037 22091 22091 22000 21933 21890 21847 21851 21885 21897 21924 21943 21863 21791 21786 21750 21683 21644 21594 21558 21551 21516 21477 21494 21483 21444 21469 21456 21334 21136 20995 20972 21022 21043 21024 21014 20981 20895 20805 20765 20711 20650 20602 20571 20556 20544 20543 20542 20561 20572 20546 20490 20451 20439 20402 20349 20297 20272 20255 20237 20223 20220 20215 20238 20306 20371 20458 20527 20525 20459 20362 20283 20216 20137 20080 20097 20179 20285 20391 20454 20462 20440 20400 20341 20276 20227 20201 20218 20271 20263 20156 20102 20195 20295 20276 20222 20221 20257 20320 20375 20370 20313 1 117 154 1 370675.650382543157320 90151.573536386393243 0.000000000000000 2009.402221679687500 2336.654785156250000 22750 22972 22805 22408 22076 21892 21983 22344 22389 22140 21975 21868 21866 22046 22269 22587 22930 23119 23168 23279 23367 23180 22962 22786 22716 22861 23018 22996 22826 22534 22225 22135 22399 22715 22899 22968 22927 22815 22679 22563 22476 22433 22437 22488 22529 22551 22537 22482 22411 22304 22185 22114 22115 22175 22136 22039 21977 21945 21922 21903 21896 21930 21984 21953 21856 21840 21855 21805 21725 21659 21610 21593 21592 21544 21492 21482 21469 21439 21451 21433 21306 21132 21038 21040 21053 21013 20986 20990 20973 20904 20831 20803 20765 20705 20645 20604 20582 20546 20517 20528 20558 20572 20546 20504 20477 20480 20471 20417 20360 20342 20335 20321 20297 20259 20222 20226 20279 20330 20406 20474 20497 20488 20438 20375 20292 20190 20106 20111 20196 20287 20372 20427 20419 20383 20366 20344 20286 20221 20193 20205 20232 20194 20096 20094 20208 20295 20276 20244 20264 20312 20383 20430 20391 20293 1 118 154 1 370678.650382543157320 90151.573536386393243 0.000000000000000 2005.870483398437500 2346.361816406250000 23101 23166 22901 22562 22239 22006 22054 22433 22584 22440 22308 22117 21896 21912 22130 22521 22863 22974 23011 23232 23464 23435 23247 23023 22948 23060 23165 23113 22948 22679 22362 22164 22392 22771 23038 23131 23074 22958 22840 22729 22610 22530 22515 22558 22606 22627 22598 22530 22442 22311 22182 22144 22185 22233 22182 22093 22014 21959 21919 21904 21916 21941 21988 21932 21877 21905 21904 21821 21682 21572 21531 21552 21591 21554 21510 21490 21455 21379 21350 21363 21320 21213 21150 21155 21119 21044 21004 20994 20974 20910 20834 20807 20788 20757 20701 20648 20612 20578 20543 20534 20562 20578 20563 20553 20524 20522 20529 20473 20416 20424 20430 20405 20363 20293 20228 20222 20289 20325 20361 20423 20471 20506 20502 20452 20361 20236 20121 20106 20165 20232 20298 20331 20329 20325 20336 20345 20302 20229 20182 20167 20123 20079 20059 20121 20234 20283 20250 20254 20310 20370 20428 20432 20350 20252 1 119 154 1 370681.650382543157320 90151.573536386393243 0.000000000000000 2001.313476562500000 2367.874023437500000 23440 23363 23005 22656 22326 22099 22110 22447 22713 22700 22546 22357 22131 22032 22068 22359 22681 22800 22905 23205 23552 23679 23523 23297 23232 23273 23310 23236 23090 22853 22497 22208 22389 22789 23098 23212 23168 23081 22992 22881 22732 22623 22603 22642 22694 22712 22666 22576 22441 22291 22214 22233 22278 22284 22233 22140 22049 21968 21910 21929 21981 21981 21968 21926 21931 21943 21926 21850 21719 21603 21538 21563 21606 21583 21549 21515 21475 21394 21327 21320 21329 21301 21264 21240 21176 21115 21079 21038 20991 20916 20834 20793 20789 20798 20756 20688 20635 20604 20581 20547 20558 20599 20608 20620 20607 20595 20593 20520 20455 20473 20497 20480 20436 20347 20249 20229 20301 20339 20338 20373 20418 20465 20500 20484 20412 20295 20177 20126 20117 20148 20205 20250 20284 20310 20315 20305 20281 20224 20158 20102 20030 20013 20067 20160 20249 20250 20208 20248 20336 20419 20443 20383 20276 20216 1 120 154 1 370684.650382543157320 90151.573536386393243 0.000000000000000 1998.439453125000000 2381.085693359375000 23699 23452 23102 22800 22523 22251 22170 22449 22814 22933 22773 22559 22432 22318 22108 22155 22431 22631 22824 23165 23561 23807 23811 23665 23573 23506 23428 23323 23183 22954 22593 22279 22389 22770 23095 23244 23221 23144 23059 22942 22805 22712 22699 22728 22780 22798 22731 22581 22408 22326 22350 22377 22388 22357 22282 22174 22053 21981 21983 22029 22053 22005 21978 21983 21988 21961 21932 21886 21811 21724 21629 21613 21610 21597 21574 21539 21504 21443 21372 21327 21312 21305 21271 21223 21154 21131 21126 21099 21055 20974 20875 20822 20808 20811 20785 20721 20651 20600 20591 20571 20560 20608 20647 20670 20680 20668 20644 20565 20477 20464 20491 20505 20487 20392 20261 20232 20314 20357 20347 20353 20369 20401 20457 20480 20439 20344 20241 20158 20102 20107 20159 20217 20253 20277 20278 20240 20210 20169 20084 20011 19984 20013 20102 20187 20229 20206 20193 20254 20343 20419 20413 20323 20215 20188 1 121 154 1 370687.650382543157320 90151.573536386393243 0.000000000000000 1996.567138671875000 2385.198974609375000 23823 23577 23313 23059 22736 22391 22215 22417 22808 23063 23041 22822 22690 22578 22257 22099 22280 22494 22688 23048 23439 23722 23852 23844 23779 23652 23523 23379 23214 22963 22605 22301 22385 22734 23041 23234 23258 23162 23053 22950 22864 22838 22843 22843 22849 22835 22728 22541 22424 22444 22501 22511 22484 22426 22310 22164 22020 21978 22049 22106 22073 22025 22032 22045 22014 21947 21894 21848 21817 21796 21721 21622 21541 21524 21545 21543 21503 21454 21380 21324 21311 21295 21232 21150 21083 21074 21102 21145 21150 21060 20946 20890 20851 20810 20786 20737 20667 20598 20579 20579 20570 20617 20675 20702 20727 20725 20673 20593 20497 20439 20440 20463 20456 20372 20258 20226 20313 20377 20403 20412 20380 20351 20395 20454 20426 20352 20272 20183 20099 20079 20139 20211 20245 20251 20253 20221 20172 20108 20014 19966 19997 20051 20129 20201 20221 20191 20216 20279 20336 20377 20337 20244 20166 20144 1 122 154 1 370690.650382543157320 90151.573536386393243 0.000000000000000 1996.416259765625000 2382.552978515625000 23826 23792 23632 23328 22862 22474 22322 22440 22684 22976 23128 23044 22916 22777 22424 22125 22165 22331 22530 22876 23215 23457 23587 23674 23668 23603 23547 23401 23179 22881 22527 22286 22390 22695 22959 23153 23226 23156 23049 22980 22960 22992 23011 22966 22859 22768 22669 22559 22544 22588 22617 22607 22556 22459 22316 22166 22057 22024 22091 22128 22071 22064 22078 22048 21983 21890 21818 21750 21732 21797 21787 21671 21529 21449 21460 21489 21472 21437 21364 21292 21291 21295 21239 21129 21053 21031 21047 21119 21178 21102 20975 20908 20866 20813 20770 20735 20686 20611 20562 20570 20594 20637 20682 20702 20734 20742 20687 20607 20515 20434 20388 20375 20356 20300 20224 20200 20285 20378 20453 20492 20442 20352 20337 20378 20360 20315 20247 20169 20095 20057 20118 20204 20231 20226 20217 20216 20183 20094 19994 19964 20029 20094 20149 20205 20213 20184 20246 20321 20349 20338 20273 20194 20140 20108 1 123 154 1 370693.650382543157320 90151.573536386393243 0.000000000000000 1999.575927734375000 2381.764648437500000 23714 23818 23733 23474 23025 22709 22643 22648 22699 22882 23074 23175 23143 22942 22565 22279 22296 22363 22463 22658 22891 23088 23229 23368 23413 23456 23520 23370 23052 22730 22438 22302 22442 22718 22939 23095 23176 23165 23108 23082 23107 23163 23164 23057 22870 22706 22622 22620 22664 22681 22682 22649 22570 22434 22288 22196 22171 22138 22124 22110 22090 22091 22068 22025 21945 21842 21774 21716 21712 21791 21813 21728 21573 21440 21405 21412 21409 21390 21315 21234 21238 21287 21303 21226 21127 21071 21045 21081 21142 21098 20967 20881 20847 20802 20756 20727 20700 20641 20574 20564 20607 20650 20675 20681 20705 20725 20678 20594 20512 20428 20357 20305 20261 20230 20195 20171 20219 20306 20391 20442 20425 20342 20283 20291 20276 20244 20185 20114 20062 20048 20095 20164 20167 20151 20143 20165 20167 20106 20024 19996 20055 20126 20159 20171 20185 20194 20254 20342 20376 20332 20240 20153 20105 20076 1 124 154 1 370696.650382543157320 90151.573536386393243 0.000000000000000 2000.614135742187500 2355.107177734375000 23518 23551 23491 23443 23267 23153 23135 23052 23059 23163 23232 23300 23288 23010 22668 22576 22668 22669 22698 22770 22820 22921 23000 23091 23166 23269 23387 23257 22920 22674 22463 22341 22462 22739 22990 23157 23244 23269 23239 23231 23262 23284 23210 23044 22871 22725 22666 22709 22746 22718 22674 22607 22510 22377 22270 22252 22288 22253 22164 22125 22125 22116 22074 22028 21953 21844 21768 21752 21780 21823 21806 21706 21568 21458 21401 21386 21377 21334 21237 21178 21196 21273 21355 21333 21210 21104 21048 21062 21089 21063 20970 20902 20867 20816 20755 20713 20687 20652 20605 20572 20593 20638 20669 20671 20667 20665 20624 20556 20497 20408 20315 20256 20224 20212 20199 20190 20202 20228 20264 20284 20294 20270 20247 20257 20246 20200 20121 20061 20043 20043 20059 20083 20080 20072 20072 20098 20125 20104 20048 20006 20044 20106 20132 20136 20174 20206 20238 20316 20350 20292 20180 20096 20059 20041 1 125 154 1 370699.650382543157320 90151.573536386393243 0.000000000000000 2000.644409179687500 2362.220703125000000 23221 23177 23143 23271 23406 23512 23522 23486 23555 23622 23556 23456 23350 23039 22829 22918 23055 23007 23047 23160 23183 23174 23087 23074 23143 23182 23254 23215 22999 22823 22596 22414 22464 22712 22979 23204 23373 23447 23420 23396 23369 23300 23153 22982 22844 22745 22736 22801 22826 22772 22683 22587 22477 22368 22297 22302 22339 22283 22174 22145 22145 22125 22069 22009 21923 21811 21724 21730 21785 21831 21796 21672 21538 21469 21451 21450 21427 21350 21229 21181 21202 21280 21364 21350 21214 21093 21022 21044 21065 21023 20958 20932 20919 20866 20788 20732 20695 20659 20624 20586 20582 20609 20629 20640 20643 20621 20590 20540 20481 20396 20303 20264 20272 20263 20243 20248 20263 20256 20239 20212 20181 20170 20199 20236 20233 20165 20064 20046 20066 20089 20065 20045 20044 20043 20045 20055 20072 20079 20054 20006 20028 20089 20108 20120 20176 20211 20225 20265 20283 20239 20155 20088 20033 20022 1 126 154 1 370702.650382543157320 90151.573536386393243 0.000000000000000 1997.136962890625000 2397.913085937500000 22903 22828 22821 23044 23307 23463 23556 23718 23927 23979 23842 23667 23470 23162 23088 23227 23357 23335 23394 23566 23610 23491 23310 23323 23334 23264 23262 23319 23233 23042 22753 22514 22481 22674 22924 23179 23447 23602 23573 23489 23367 23243 23127 22995 22865 22815 22863 22904 22898 22832 22725 22620 22512 22414 22343 22320 22307 22254 22197 22183 22171 22119 22045 21972 21876 21771 21707 21717 21784 21847 21828 21709 21567 21513 21525 21519 21493 21407 21280 21235 21259 21308 21334 21302 21183 21103 21069 21081 21084 21018 20948 20941 20947 20907 20847 20775 20709 20669 20647 20630 20602 20599 20599 20598 20596 20574 20552 20525 20480 20400 20317 20289 20313 20313 20304 20323 20367 20375 20319 20244 20164 20111 20130 20172 20179 20124 20047 20074 20147 20192 20146 20080 20052 20067 20059 20036 20026 20023 20021 19971 19982 20059 20094 20106 20187 20235 20220 20200 20196 20191 20159 20115 20048 20015 1 127 154 1 370705.650382543157320 90151.573536386393243 0.000000000000000 1994.265991210937500 2409.618896484375000 22571 22511 22592 22884 23106 23227 23392 23664 23951 24096 24068 23905 23640 23398 23398 23513 23608 23667 23766 23929 23945 23725 23541 23647 23646 23472 23413 23487 23424 23196 22911 22632 22513 22668 22906 23145 23442 23667 23636 23498 23373 23283 23200 23064 22925 22913 22978 22993 22965 22897 22790 22685 22584 22487 22394 22324 22280 22265 22253 22245 22212 22134 22043 21963 21887 21799 21749 21749 21802 21874 21873 21744 21586 21544 21559 21539 21512 21424 21301 21279 21291 21298 21292 21277 21212 21174 21170 21158 21098 20992 20929 20930 20938 20921 20901 20833 20750 20707 20682 20673 20649 20605 20571 20548 20534 20511 20494 20482 20461 20411 20347 20313 20339 20371 20383 20406 20478 20510 20443 20340 20232 20141 20105 20095 20087 20070 20060 20124 20223 20279 20229 20123 20074 20108 20109 20084 20055 20005 19977 19943 19946 20019 20075 20103 20189 20242 20214 20164 20143 20134 20122 20104 20053 20022 1 128 154 1 370708.650382543157320 90151.573536386393243 0.000000000000000 1998.839965820312500 2424.139404296875000 22234 22242 22426 22733 22895 23031 23238 23503 23809 24093 24241 24144 23902 23732 23686 23786 23868 23951 24078 24203 24197 23957 23787 23915 23891 23653 23575 23628 23495 23247 23004 22706 22524 22644 22895 23134 23404 23659 23689 23552 23465 23420 23300 23104 22994 23027 23086 23076 23032 22963 22861 22752 22641 22528 22419 22331 22306 22336 22324 22288 22237 22169 22068 21977 21911 21857 21815 21795 21818 21867 21864 21740 21610 21579 21589 21560 21504 21410 21309 21305 21308 21295 21303 21299 21280 21267 21254 21214 21112 20988 20930 20930 20932 20925 20917 20858 20788 20744 20702 20684 20672 20620 20557 20507 20477 20457 20439 20434 20426 20393 20350 20335 20372 20420 20459 20486 20551 20590 20530 20430 20325 20211 20125 20070 20040 20052 20108 20178 20248 20297 20255 20144 20120 20177 20199 20201 20191 20138 20080 20041 20000 19988 20023 20088 20161 20201 20197 20147 20107 20079 20060 20046 20029 20027 1 129 154 1 370711.650382543157320 90151.573536386393243 0.000000000000000 1997.753784179687500 2438.034179687500000 22123 22148 22270 22482 22643 22857 23135 23376 23665 23990 24204 24215 24167 24062 23950 24063 24178 24230 24300 24380 24368 24203 24086 24101 23973 23785 23736 23690 23437 23179 22960 22718 22540 22609 22828 23111 23419 23704 23824 23727 23639 23574 23385 23157 23073 23131 23186 23174 23127 23041 22933 22819 22687 22546 22424 22354 22372 22412 22372 22313 22247 22172 22076 22000 21958 21933 21874 21835 21849 21881 21876 21784 21676 21624 21617 21575 21496 21415 21350 21347 21335 21315 21342 21345 21314 21290 21274 21234 21137 21021 20968 20957 20949 20937 20913 20849 20799 20763 20716 20684 20672 20636 20585 20538 20497 20447 20409 20398 20387 20366 20348 20354 20392 20440 20511 20549 20580 20583 20537 20470 20373 20250 20153 20113 20087 20104 20186 20246 20268 20278 20227 20146 20180 20262 20286 20289 20304 20301 20270 20229 20142 20025 19988 20076 20138 20157 20170 20114 20054 20009 19978 19978 19982 20007 1 130 154 1 370714.650382543157320 90151.573536386393243 0.000000000000000 1991.240600585937500 2457.850341796875000 22319 22358 22323 22307 22438 22739 23058 23275 23526 23799 23941 24072 24278 24316 24273 24407 24524 24535 24536 24579 24562 24465 24360 24249 24121 24024 23945 23785 23478 23133 22851 22707 22661 22693 22838 23171 23537 23835 24001 23958 23870 23767 23546 23283 23153 23212 23276 23263 23218 23124 23009 22877 22720 22555 22416 22383 22441 22466 22415 22340 22247 22162 22088 22034 22010 21988 21926 21881 21908 21952 21938 21879 21785 21701 21669 21603 21495 21393 21371 21385 21361 21336 21370 21356 21292 21274 21282 21257 21166 21048 21004 21009 20996 20970 20910 20824 20771 20737 20701 20681 20664 20639 20601 20562 20529 20471 20427 20399 20373 20362 20366 20384 20419 20466 20540 20587 20597 20552 20494 20449 20369 20274 20198 20192 20183 20185 20251 20294 20283 20255 20193 20156 20228 20300 20309 20316 20360 20393 20418 20406 20294 20091 20001 20098 20142 20142 20145 20081 20004 19948 19912 19935 19947 19975 1 131 154 1 370717.650382543157320 90151.573536386393243 0.000000000000000 1986.925415039062500 2473.351318359375000 22592 22678 22617 22423 22391 22641 22944 23136 23353 23533 23610 23892 24247 24416 24520 24665 24729 24727 24721 24734 24722 24712 24658 24532 24388 24178 23940 23689 23414 23098 22852 22879 23021 22972 22901 23136 23511 23843 24108 24192 24129 23996 23723 23403 23255 23333 23394 23362 23303 23202 23076 22925 22749 22567 22438 22449 22508 22510 22443 22357 22255 22190 22144 22119 22107 22059 21978 21924 21948 21992 21973 21938 21866 21771 21690 21572 21450 21370 21377 21398 21375 21360 21402 21369 21291 21264 21273 21256 21170 21064 21036 21055 21035 20976 20899 20817 20766 20717 20672 20653 20634 20611 20569 20532 20506 20470 20445 20424 20406 20394 20394 20410 20447 20484 20524 20561 20578 20521 20439 20404 20369 20317 20274 20276 20262 20232 20286 20316 20276 20230 20180 20177 20260 20316 20330 20366 20407 20424 20483 20512 20408 20191 20053 20084 20134 20128 20102 20033 19935 19875 19869 19899 19915 19943 1 132 154 1 370720.650382543157320 90151.573536386393243 0.000000000000000 1983.440063476562500 2484.618652343750000 22906 23038 22927 22570 22357 22490 22757 22935 23144 23257 23390 23772 24133 24305 24450 24573 24609 24636 24664 24666 24690 24812 24846 24704 24426 24079 23730 23446 23227 23045 22953 23145 23395 23273 22994 23010 23321 23716 24119 24346 24351 24187 23831 23484 23385 23502 23543 23493 23402 23299 23193 23038 22807 22584 22490 22538 22574 22537 22456 22386 22312 22250 22202 22192 22194 22132 22027 21966 21981 22004 21969 21938 21863 21747 21631 21517 21430 21391 21424 21457 21440 21413 21418 21373 21307 21278 21267 21238 21170 21109 21097 21090 21029 20946 20886 20823 20772 20709 20660 20638 20616 20591 20551 20526 20506 20476 20449 20430 20435 20439 20435 20436 20459 20493 20520 20546 20547 20491 20423 20395 20394 20375 20362 20360 20310 20256 20303 20325 20267 20210 20178 20212 20306 20357 20372 20415 20453 20467 20519 20545 20465 20289 20128 20061 20103 20107 20055 19967 19874 19838 19834 19857 19895 19928 1 133 154 1 370723.650382543157320 90151.573536386393243 0.000000000000000 1984.284301757812500 2478.040527343750000 23281 23361 23125 22666 22367 22366 22494 22670 22892 23036 23289 23639 23919 24036 24127 24227 24291 24362 24425 24466 24557 24723 24780 24607 24239 23895 23614 23448 23332 23159 23089 23381 23617 23417 23088 23036 23283 23630 24047 24392 24499 24305 23888 23562 23514 23686 23754 23665 23511 23394 23297 23127 22836 22593 22558 22631 22645 22563 22474 22439 22392 22328 22265 22233 22233 22167 22062 22005 22006 22017 21969 21918 21828 21708 21610 21539 21472 21460 21511 21546 21514 21466 21449 21400 21341 21301 21265 21224 21193 21158 21128 21089 21016 20929 20867 20817 20766 20712 20662 20638 20619 20596 20568 20556 20530 20490 20461 20448 20451 20469 20478 20469 20463 20488 20530 20552 20540 20486 20441 20430 20415 20405 20417 20385 20328 20312 20339 20331 20264 20202 20182 20240 20327 20373 20402 20454 20493 20500 20521 20533 20473 20306 20118 20027 20046 20008 19945 19881 19843 19871 19868 19855 19882 19906 1 134 154 1 370726.650382543157320 90151.573536386393243 0.000000000000000 1985.906494140625000 2459.107421875000000 23599 23576 23201 22796 22631 22543 22393 22446 22643 22900 23244 23583 23813 23852 23856 23899 23983 24103 24207 24290 24410 24535 24591 24480 24235 24027 23870 23788 23629 23344 23282 23610 23794 23561 23216 23115 23363 23725 24118 24448 24568 24337 23911 23653 23697 23901 23957 23775 23581 23457 23326 23100 22797 22622 22689 22777 22731 22607 22525 22507 22460 22379 22307 22265 22249 22191 22108 22077 22069 22039 21969 21888 21795 21698 21631 21579 21543 21564 21605 21601 21540 21506 21476 21404 21348 21302 21260 21226 21215 21189 21138 21076 21013 20923 20848 20799 20761 20727 20690 20663 20640 20623 20593 20572 20548 20520 20496 20493 20493 20497 20515 20504 20469 20467 20493 20512 20512 20476 20452 20460 20451 20454 20465 20418 20363 20366 20363 20331 20278 20226 20202 20243 20305 20344 20383 20442 20482 20491 20482 20475 20424 20254 20057 19980 19973 19919 19886 19861 19875 19930 19942 19898 19863 19859 1 135 154 1 370729.650382543157320 90151.573536386393243 0.000000000000000 1982.610595703125000 2458.882324218750000 23742 23692 23306 23056 22977 22742 22429 22412 22618 23001 23360 23667 23819 23783 23742 23717 23799 23954 24097 24197 24272 24379 24447 24446 24399 24345 24277 24139 23825 23546 23591 23894 23984 23685 23320 23220 23426 23730 24117 24469 24589 24314 23915 23793 23919 24079 24078 23834 23646 23526 23379 23122 22801 22707 22885 22964 22848 22699 22612 22576 22521 22417 22332 22279 22255 22224 22179 22174 22171 22096 21973 21853 21751 21687 21644 21617 21615 21639 21651 21603 21538 21510 21468 21399 21356 21319 21294 21256 21225 21188 21140 21099 21050 20965 20876 20823 20798 20769 20734 20698 20673 20652 20618 20584 20556 20535 20523 20535 20532 20513 20523 20530 20509 20472 20455 20460 20469 20458 20451 20456 20463 20489 20502 20465 20415 20401 20377 20342 20305 20270 20237 20240 20280 20308 20337 20379 20436 20467 20446 20421 20383 20240 20040 19923 19909 19912 19949 19954 19968 20010 20017 19947 19859 19826 1 136 154 1 370732.650382543157320 90151.573536386393243 0.000000000000000 1989.933715820312500 2460.115478515625000 23817 23804 23555 23386 23167 22766 22517 22515 22673 23092 23426 23647 23697 23640 23595 23542 23610 23815 24031 24108 24147 24240 24307 24372 24433 24472 24476 24337 24048 23881 23967 24183 24100 23707 23409 23446 23644 23850 24144 24498 24601 24312 24024 24038 24147 24221 24124 23883 23711 23619 23493 23220 22862 22817 23071 23131 22969 22830 22729 22665 22589 22467 22362 22300 22285 22266 22233 22252 22265 22161 21991 21847 21757 21707 21673 21661 21676 21665 21631 21587 21553 21519 21467 21407 21375 21347 21326 21281 21220 21167 21130 21107 21071 21006 20921 20873 20842 20795 20758 20730 20695 20661 20632 20594 20566 20547 20553 20570 20555 20527 20535 20551 20558 20523 20470 20442 20437 20433 20435 20440 20454 20481 20488 20473 20450 20445 20415 20374 20335 20305 20268 20256 20276 20273 20280 20319 20386 20430 20424 20397 20361 20249 20086 19968 19935 19969 20045 20058 20053 20068 20065 20005 19929 19899 1 137 154 1 370735.650382543157320 90151.573536386393243 0.000000000000000 2003.897216796875000 2464.773681640625000 23835 23899 23745 23481 23110 22747 22669 22630 22621 22968 23261 23422 23435 23405 23362 23322 23443 23727 23920 23917 23975 24070 24152 24250 24348 24402 24427 24386 24277 24250 24349 24438 24204 23798 23617 23790 24015 24193 24332 24557 24648 24416 24274 24334 24334 24277 24060 23855 23753 23716 23614 23331 22940 22911 23205 23241 23083 22955 22826 22730 22639 22524 22420 22361 22346 22333 22306 22321 22342 22227 22015 21856 21769 21728 21716 21722 21732 21701 21649 21600 21564 21528 21486 21431 21399 21367 21340 21285 21198 21136 21101 21077 21045 21000 20949 20904 20858 20809 20779 20755 20718 20672 20638 20606 20583 20561 20576 20600 20588 20564 20566 20582 20603 20575 20504 20458 20436 20432 20431 20426 20444 20462 20465 20459 20462 20469 20447 20409 20367 20327 20280 20260 20256 20236 20238 20281 20353 20376 20370 20360 20324 20251 20168 20106 20069 20081 20128 20125 20101 20092 20086 20062 20043 20039 1 138 154 1 370738.650382543157320 90151.573536386393243 0.000000000000000 2010.377685546875000 2476.423095703125000 23824 23877 23684 23296 22962 22855 22948 22784 22558 22692 22861 23033 23126 23131 23085 23133 23415 23683 23711 23677 23770 23888 23999 24138 24256 24290 24279 24257 24250 24370 24578 24659 24398 24041 23944 24171 24419 24565 24591 24687 24764 24616 24559 24549 24416 24192 23906 23731 23722 23766 23677 23347 22962 22998 23294 23308 23181 23061 22929 22808 22700 22591 22490 22413 22365 22360 22373 22373 22357 22237 22036 21902 21829 21788 21772 21788 21788 21746 21680 21615 21576 21536 21490 21441 21394 21347 21316 21275 21212 21156 21102 21056 21025 20984 20926 20881 20851 20827 20798 20762 20735 20696 20649 20613 20589 20570 20579 20610 20610 20587 20596 20615 20621 20602 20558 20514 20479 20471 20447 20434 20436 20434 20442 20442 20443 20439 20429 20416 20395 20350 20284 20238 20219 20208 20228 20285 20341 20335 20339 20361 20337 20290 20257 20233 20205 20189 20163 20139 20125 20110 20111 20104 20105 20104 1 139 154 1 370741.650382543157320 90151.573536386393243 0.000000000000000 2013.096557617187500 2493.104492187500000 23858 23827 23591 23176 22939 23085 23284 23097 22818 22748 22665 22710 22858 22885 22906 23124 23417 23524 23441 23446 23562 23707 23876 24066 24166 24144 24097 24126 24237 24362 24519 24672 24596 24393 24320 24519 24765 24862 24831 24861 24931 24857 24755 24612 24444 24175 23863 23635 23589 23668 23603 23255 22949 23057 23309 23324 23264 23187 23068 22907 22777 22668 22563 22465 22384 22376 22420 22427 22391 22266 22078 21971 21905 21856 21833 21833 21799 21750 21690 21633 21592 21539 21485 21441 21396 21337 21295 21249 21203 21165 21121 21071 21039 20992 20926 20881 20860 20845 20813 20781 20772 20735 20671 20624 20587 20572 20583 20615 20630 20619 20625 20636 20625 20621 20619 20572 20528 20511 20485 20478 20471 20441 20416 20409 20403 20407 20420 20423 20402 20352 20273 20205 20178 20185 20216 20282 20323 20304 20305 20350 20365 20354 20344 20323 20288 20237 20173 20169 20161 20134 20135 20139 20142 20131 1 140 154 1 370744.650382543157320 90151.573536386393243 0.000000000000000 2014.673828125000000 2504.863525390625000 23837 23712 23486 23129 23026 23353 23609 23516 23314 23122 22806 22597 22636 22723 22805 22999 23206 23240 23188 23251 23400 23592 23793 23979 24024 23962 23974 24155 24365 24428 24478 24582 24624 24645 24703 24862 25016 25049 24954 24910 24943 24887 24701 24501 24409 24245 23954 23637 23433 23407 23346 23100 22969 23140 23323 23364 23372 23352 23249 23053 22884 22773 22668 22560 22465 22434 22470 22475 22433 22304 22135 22034 21963 21916 21892 21870 21812 21767 21704 21636 21582 21525 21472 21437 21402 21358 21315 21254 21189 21143 21109 21076 21051 21010 20955 20908 20882 20866 20841 20830 20824 20770 20696 20650 20594 20569 20587 20625 20661 20666 20652 20649 20656 20666 20675 20640 20597 20565 20546 20539 20532 20485 20427 20396 20384 20397 20423 20422 20382 20332 20257 20179 20147 20157 20184 20241 20272 20258 20263 20314 20358 20376 20383 20364 20304 20239 20199 20212 20199 20161 20151 20164 20181 20175 1 141 154 1 370747.650382543157320 90151.573536386393243 0.000000000000000 2015.446411132812500 2518.481445312500000 23717 23529 23313 23141 23266 23648 23928 23947 23770 23463 22980 22648 22693 22892 22931 22917 22986 22998 23001 23116 23308 23487 23650 23775 23808 23835 24026 24331 24547 24584 24633 24706 24694 24780 24941 25103 25185 25121 24940 24788 24705 24634 24447 24279 24271 24231 24024 23683 23334 23155 23077 23026 23118 23323 23440 23471 23509 23518 23411 23207 23022 22915 22828 22704 22585 22532 22534 22515 22447 22321 22167 22065 21995 21946 21915 21875 21818 21769 21696 21618 21571 21531 21484 21439 21399 21382 21353 21290 21215 21158 21115 21077 21040 21002 20968 20931 20909 20897 20900 20909 20877 20793 20710 20661 20604 20579 20609 20646 20673 20680 20659 20657 20692 20720 20714 20700 20683 20640 20617 20612 20600 20548 20474 20414 20381 20382 20399 20401 20365 20322 20264 20200 20171 20154 20157 20203 20234 20223 20228 20282 20323 20345 20361 20364 20311 20253 20249 20267 20239 20197 20182 20206 20220 20211 1 142 154 1 370750.650382543157320 90151.573536386393243 0.000000000000000 2014.553100585937500 2524.984863281250000 23573 23373 23224 23279 23557 23906 24110 24107 23933 23533 22975 22706 22931 23281 23327 23178 23133 23051 22998 23071 23220 23364 23478 23568 23661 23858 24211 24561 24742 24755 24804 24913 24871 24960 25058 25153 25250 25207 25018 24754 24499 24311 24139 24018 24022 24035 23883 23599 23249 23038 23026 23154 23367 23512 23554 23560 23592 23593 23483 23298 23156 23079 22995 22838 22704 22647 22620 22565 22448 22308 22172 22075 22008 21943 21894 21857 21801 21741 21680 21617 21580 21553 21504 21447 21396 21380 21360 21310 21244 21189 21141 21096 21053 21013 20987 20955 20925 20914 20933 20956 20900 20805 20723 20661 20612 20601 20640 20675 20686 20684 20673 20687 20742 20780 20755 20748 20753 20710 20671 20667 20644 20591 20532 20468 20410 20391 20383 20381 20355 20322 20289 20237 20187 20146 20146 20207 20241 20223 20216 20251 20276 20305 20333 20336 20303 20267 20278 20300 20263 20227 20224 20252 20247 20222 1 143 154 1 370753.650382543157320 90151.573536386393243 0.000000000000000 2013.241088867187500 2534.653564453125000 23552 23375 23344 23506 23761 24020 24084 23955 23733 23290 22826 22798 23202 23616 23724 23614 23530 23360 23250 23317 23376 23500 23617 23657 23691 23951 24340 24677 24864 24880 24917 25067 25061 25179 25242 25253 25313 25347 25177 24884 24568 24227 23935 23769 23707 23700 23586 23412 23194 23059 23135 23378 23605 23666 23630 23610 23619 23588 23489 23358 23255 23178 23076 22909 22780 22735 22692 22589 22414 22257 22150 22072 22018 21958 21907 21869 21806 21733 21676 21624 21584 21565 21523 21460 21397 21358 21317 21278 21234 21191 21143 21097 21057 21034 21012 20978 20937 20912 20928 20947 20890 20805 20740 20675 20623 20617 20664 20699 20697 20693 20707 20744 20796 20826 20795 20785 20795 20752 20688 20696 20694 20645 20596 20532 20457 20415 20387 20372 20342 20316 20297 20259 20191 20132 20141 20206 20232 20223 20226 20235 20243 20273 20309 20320 20302 20281 20291 20306 20278 20250 20233 20249 20237 20213 1 144 154 1 370756.650382543157320 90151.573536386393243 0.000000000000000 2013.596435546875000 2543.705810546875000 23556 23490 23568 23731 23935 24078 23971 23692 23421 23064 22804 22884 23242 23638 23889 23990 23940 23792 23795 23931 23956 23985 24023 23908 23843 24124 24451 24738 24969 25024 25045 25222 25236 25334 25415 25418 25437 25437 25190 24894 24649 24321 23960 23683 23503 23441 23420 23358 23277 23222 23278 23546 23762 23780 23707 23666 23625 23551 23467 23376 23295 23214 23116 22958 22834 22777 22669 22484 22304 22212 22161 22125 22088 22031 21969 21899 21807 21730 21671 21627 21610 21598 21541 21454 21381 21328 21289 21254 21214 21170 21125 21082 21048 21020 20992 20969 20935 20907 20909 20907 20864 20803 20753 20680 20613 20617 20669 20702 20685 20693 20738 20781 20815 20843 20838 20831 20838 20783 20692 20694 20728 20704 20649 20578 20492 20437 20398 20368 20332 20307 20283 20253 20210 20182 20201 20238 20244 20250 20262 20255 20241 20249 20264 20283 20294 20278 20279 20270 20249 20224 20188 20182 20162 20136 1 145 154 1 370759.650382543157320 90151.573536386393243 0.000000000000000 2005.030639648437500 2556.463867187500000 23661 23670 23793 23948 24062 24071 23865 23530 23312 23112 22951 22940 23068 23426 23799 24057 24137 24164 24300 24457 24512 24510 24338 24031 24003 24353 24668 24907 25113 25169 25203 25421 25479 25534 25565 25549 25515 25346 24990 24666 24469 24250 23951 23646 23477 23495 23557 23547 23524 23491 23424 23642 23854 23847 23759 23713 23635 23532 23439 23361 23283 23167 23035 22912 22800 22688 22538 22408 22338 22293 22262 22227 22175 22105 22020 21917 21819 21760 21715 21665 21642 21609 21532 21436 21353 21295 21254 21223 21192 21160 21116 21075 21039 20998 20968 20952 20933 20912 20896 20878 20836 20787 20737 20668 20610 20608 20649 20675 20667 20702 20755 20788 20821 20853 20861 20863 20874 20820 20719 20697 20740 20742 20691 20618 20537 20465 20418 20380 20343 20306 20269 20249 20231 20228 20244 20265 20271 20282 20280 20266 20248 20239 20217 20218 20242 20227 20220 20196 20162 20146 20124 20106 20077 20050 1 146 154 1 370762.650382543157320 90151.573536386393243 0.000000000000000 2003.365600585937500 2570.556884765625000 23850 23848 23924 24056 24116 24044 23845 23587 23428 23286 23190 23125 23010 23190 23561 23854 24014 24189 24476 24757 24926 24868 24480 24137 24221 24538 24859 25138 25316 25341 25371 25584 25684 25706 25677 25610 25449 25115 24766 24452 24247 24049 23806 23641 23628 23728 23865 23848 23807 23756 23555 23665 23875 23848 23749 23697 23608 23486 23390 23322 23206 22992 22802 22731 22648 22548 22494 22502 22497 22442 22381 22323 22253 22169 22059 21935 21852 21803 21763 21701 21638 21579 21515 21447 21381 21329 21273 21222 21179 21146 21111 21075 21042 20994 20966 20944 20926 20920 20911 20884 20833 20775 20717 20666 20624 20608 20625 20644 20658 20707 20769 20799 20833 20855 20856 20875 20886 20851 20760 20711 20719 20745 20739 20686 20616 20534 20462 20403 20358 20314 20274 20250 20233 20226 20236 20258 20270 20272 20260 20248 20235 20217 20184 20169 20170 20148 20142 20128 20111 20098 20081 20073 20057 20034 1 147 154 1 370765.650382543157320 90151.573536386393243 0.000000000000000 2009.304321289062500 2578.800048828125000 24052 24028 24019 24082 24109 24042 23876 23676 23507 23386 23443 23449 23209 23119 23316 23558 23743 24026 24406 24800 25098 25033 24638 24468 24599 24752 24960 25250 25468 25542 25536 25683 25788 25737 25666 25624 25424 25048 24769 24581 24355 24037 23780 23773 23853 23928 24114 24143 24046 23920 23650 23698 23886 23850 23732 23647 23533 23402 23324 23251 23082 22856 22781 22751 22681 22639 22645 22672 22661 22588 22488 22392 22305 22210 22086 21957 21894 21861 21822 21753 21633 21535 21509 21486 21460 21425 21351 21268 21205 21161 21111 21060 21035 20999 20972 20947 20916 20913 20919 20908 20858 20781 20716 20671 20627 20597 20602 20632 20668 20729 20797 20819 20838 20852 20847 20869 20896 20882 20811 20747 20718 20715 20730 20715 20665 20589 20505 20427 20363 20315 20287 20262 20256 20257 20275 20292 20280 20259 20239 20219 20196 20185 20172 20160 20146 20122 20118 20123 20119 20107 20095 20093 20099 20095 1 148 154 1 370768.650382543157320 90151.573536386393243 0.000000000000000 2012.522094726562500 2583.371582031250000 24058 24035 24015 24036 24024 23936 23804 23619 23475 23453 23618 23693 23500 23209 23131 23288 23543 23863 24230 24664 25047 25134 24952 24890 24929 24981 25151 25403 25597 25667 25652 25767 25834 25701 25584 25612 25506 25208 24989 24813 24485 24098 23899 23988 24084 24130 24285 24395 24258 24015 23779 23848 23971 23926 23784 23671 23527 23367 23249 23132 22976 22912 23029 23050 22979 22907 22858 22824 22777 22689 22568 22451 22350 22239 22112 21999 21944 21914 21874 21805 21659 21531 21511 21516 21529 21513 21430 21332 21283 21244 21163 21073 21032 21001 20971 20945 20919 20916 20913 20901 20850 20773 20710 20667 20624 20583 20586 20639 20678 20723 20781 20810 20816 20829 20839 20856 20881 20892 20867 20803 20752 20697 20693 20723 20698 20618 20536 20454 20377 20316 20291 20285 20283 20282 20311 20320 20281 20240 20218 20193 20163 20159 20178 20172 20148 20125 20145 20194 20203 20186 20162 20140 20141 20163 1 149 154 1 370771.650382543157320 90151.573536386393243 0.000000000000000 2012.597167968750000 2584.535156250000000 23894 23882 23886 23913 23895 23780 23706 23583 23512 23601 23815 23905 23800 23467 23191 23289 23664 23996 24289 24627 24971 25229 25302 25253 25205 25272 25471 25634 25698 25665 25722 25845 25788 25567 25423 25503 25544 25394 25217 24929 24522 24198 24129 24273 24382 24410 24499 24614 24398 24080 23978 24126 24180 24100 23920 23750 23584 23404 23212 23023 22975 23135 23336 23380 23300 23183 23069 22966 22877 22770 22624 22484 22357 22232 22117 22034 21967 21912 21870 21801 21673 21562 21520 21530 21565 21552 21480 21411 21388 21347 21252 21139 21067 21004 20960 20937 20926 20930 20917 20883 20826 20766 20716 20671 20621 20586 20594 20655 20691 20701 20730 20771 20781 20799 20825 20833 20865 20909 20908 20855 20801 20736 20716 20740 20710 20619 20530 20457 20392 20332 20303 20303 20302 20302 20321 20328 20283 20227 20212 20208 20183 20173 20189 20174 20141 20126 20179 20262 20302 20291 20249 20192 20183 20224 1 150 154 1 370774.650382543157320 90151.573536386393243 0.000000000000000 2014.599975585937500 2588.528808593750000 23667 23679 23743 23857 23911 23799 23721 23634 23609 23776 24031 24103 23960 23599 23272 23400 23897 24308 24591 24856 25117 25420 25625 25590 25537 25647 25808 25819 25680 25616 25790 25885 25709 25410 25233 25292 25407 25417 25336 24973 24560 24359 24441 24624 24740 24736 24763 24787 24502 24214 24211 24356 24357 24209 23994 23792 23624 23455 23244 23039 23117 23405 23587 23607 23514 23400 23247 23083 22938 22796 22623 22469 22336 22228 22144 22068 21973 21899 21846 21783 21679 21570 21525 21543 21593 21593 21550 21522 21513 21458 21347 21224 21118 21015 20961 20933 20922 20926 20906 20866 20810 20764 20724 20678 20632 20608 20605 20641 20690 20713 20720 20746 20761 20790 20829 20833 20867 20921 20933 20899 20869 20818 20775 20747 20698 20623 20544 20478 20430 20372 20334 20335 20331 20319 20324 20327 20293 20250 20257 20267 20244 20227 20218 20183 20152 20146 20196 20280 20337 20349 20308 20231 20227 20264 1 151 154 1 370777.650382543157320 90151.573536386393243 0.000000000000000 2017.958496093750000 2598.848388671875000 23479 23502 23607 23819 23969 23908 23765 23669 23729 23940 24178 24204 23939 23534 23333 23604 24103 24488 24753 25006 25272 25558 25781 25861 25913 25988 25976 25819 25600 25595 25824 25873 25654 25317 25073 25036 25195 25336 25313 24936 24588 24515 24712 24945 25057 25005 24968 24893 24638 24429 24377 24377 24310 24121 23884 23704 23584 23463 23281 23133 23291 23578 23746 23749 23628 23516 23343 23137 22947 22774 22613 22482 22381 22288 22198 22101 21994 21909 21830 21762 21683 21592 21554 21572 21625 21665 21671 21667 21649 21568 21431 21296 21167 21058 21003 20959 20932 20926 20911 20873 20811 20745 20696 20666 20647 20639 20631 20644 20686 20724 20741 20758 20767 20797 20845 20857 20865 20896 20927 20938 20931 20897 20833 20762 20701 20641 20576 20535 20503 20443 20390 20370 20352 20336 20323 20309 20290 20274 20307 20326 20306 20295 20279 20229 20189 20180 20210 20280 20338 20370 20346 20270 20263 20300 1 152 154 1 370780.650382543157320 90151.573536386393243 0.000000000000000 2021.556884765625000 2615.150390625000000 23386 23406 23540 23755 23933 23946 23822 23701 23810 24051 24252 24209 23833 23432 23381 23727 24116 24424 24692 24948 25211 25483 25701 25887 26080 26152 25974 25663 25489 25609 25781 25766 25569 25236 24902 24763 24973 25240 25252 24931 24692 24680 24848 25099 25201 25107 25000 24823 24578 24399 24290 24206 24122 23954 23698 23539 23455 23381 23270 23273 23486 23665 23796 23790 23642 23516 23321 23094 22910 22772 22671 22573 22474 22365 22251 22147 22041 21936 21839 21759 21680 21616 21603 21628 21698 21785 21819 21817 21787 21669 21499 21355 21219 21112 21054 20994 20961 20945 20928 20884 20816 20739 20686 20665 20660 20674 20676 20677 20690 20723 20766 20801 20827 20851 20877 20888 20876 20864 20891 20944 20958 20923 20865 20801 20744 20697 20663 20635 20595 20534 20468 20413 20379 20363 20352 20318 20283 20283 20335 20362 20354 20347 20339 20296 20249 20216 20227 20291 20345 20390 20386 20337 20332 20353 1 153 154 1 370783.650382543157320 90151.573536386393243 0.000000000000000 2023.514526367187500 2619.091796875000000 23354 23374 23528 23685 23831 23944 23921 23814 23888 24072 24214 24159 23766 23375 23368 23639 23930 24227 24498 24757 25031 25326 25595 25868 26124 26191 25932 25545 25360 25512 25638 25618 25435 25114 24774 24597 24846 25160 25248 25085 24979 24970 25037 25216 25306 25246 25129 24860 24582 24410 24208 24003 23885 23791 23584 23399 23315 23268 23276 23412 23591 23684 23760 23735 23575 23416 23229 23056 22933 22845 22763 22662 22550 22438 22324 22202 22082 21967 21866 21782 21696 21648 21653 21698 21781 21889 21947 21946 21879 21737 21563 21404 21263 21163 21092 21021 20988 20969 20945 20901 20844 20776 20708 20685 20669 20686 20705 20711 20705 20717 20766 20827 20869 20886 20895 20908 20927 20920 20912 20939 20960 20923 20870 20829 20813 20800 20798 20765 20691 20603 20520 20454 20414 20393 20391 20343 20296 20298 20347 20371 20364 20370 20368 20328 20287 20244 20235 20282 20335 20392 20421 20420 20421 20410 1 154 154 1 370786.650382543157320 90151.573536386393243 0.000000000000000 2025.312255859375000 2613.691650390625000 23388 23473 23561 23628 23770 23931 23971 23964 24019 24059 24072 24032 23716 23408 23491 23735 23962 24203 24433 24696 24968 25265 25582 25875 26119 26137 25829 25472 25268 25300 25385 25431 25282 24934 24611 24509 24768 25083 25283 25314 25308 25290 25303 25405 25480 25425 25253 25004 24778 24563 24246 23919 23713 23612 23491 23332 23254 23278 23395 23539 23644 23687 23691 23635 23492 23339 23199 23107 23039 22953 22847 22736 22619 22510 22396 22252 22115 21997 21908 21821 21724 21684 21693 21747 21848 21951 22030 22028 21934 21778 21605 21435 21295 21192 21121 21042 20997 20980 20966 20930 20882 20820 20748 20721 20691 20694 20734 20769 20765 20744 20758 20817 20855 20879 20893 20910 20949 20981 20954 20938 20941 20902 20855 20863 20908 20938 20946 20902 20793 20668 20576 20529 20478 20429 20407 20357 20317 20312 20343 20362 20359 20367 20359 20323 20294 20267 20253 20271 20303 20367 20440 20486 20486 20431 1 155 154 1 370789.650382543157320 90151.573536386393243 0.000000000000000 2025.297607421875000 2607.512695312500000 23437 23567 23573 23582 23726 23835 23877 23982 24064 24006 23909 23854 23665 23499 23684 23963 24193 24393 24551 24772 25053 25333 25607 25859 26075 26066 25813 25590 25364 25160 25117 25186 25118 24796 24441 24390 24685 25062 25351 25433 25447 25482 25539 25608 25625 25533 25381 25200 24922 24546 24181 23937 23821 23720 23598 23427 23312 23411 23597 23705 23747 23740 23693 23621 23501 23376 23279 23218 23160 23057 22941 22822 22706 22595 22458 22300 22153 22032 21933 21847 21770 21731 21734 21794 21890 21988 22059 22032 21949 21807 21634 21473 21345 21231 21158 21083 21028 20995 20985 20947 20903 20862 20803 20756 20722 20719 20763 20813 20819 20789 20774 20798 20822 20851 20885 20916 20951 20971 20943 20921 20915 20889 20870 20914 20998 21062 21071 21014 20875 20727 20637 20611 20562 20488 20424 20366 20335 20335 20349 20376 20359 20344 20335 20319 20301 20288 20270 20253 20266 20330 20426 20505 20519 20450 1 156 154 1 370792.650382543157320 90151.573536386393243 0.000000000000000 2024.446289062500000 2600.025146484375000 23344 23454 23490 23534 23636 23666 23732 23886 23974 23929 23815 23700 23605 23598 23835 24112 24385 24627 24781 24914 25099 25310 25547 25785 25973 26000 25925 25850 25587 25227 25004 24922 24859 24657 24364 24351 24721 25111 25325 25320 25350 25471 25611 25701 25658 25511 25435 25313 24940 24474 24229 24178 24137 23986 23765 23532 23406 23552 23755 23857 23885 23860 23800 23727 23612 23493 23393 23336 23289 23177 23055 22936 22804 22683 22545 22377 22218 22087 21983 21905 21836 21788 21781 21837 21909 21977 22025 21995 21922 21810 21656 21515 21392 21265 21183 21118 21079 21048 21023 20992 20953 20902 20846 20793 20756 20742 20782 20827 20852 20837 20808 20791 20797 20823 20871 20925 20957 20937 20912 20907 20888 20893 20915 20976 21073 21157 21167 21090 20933 20781 20708 20689 20638 20560 20469 20396 20364 20380 20398 20409 20370 20328 20323 20323 20304 20290 20265 20244 20262 20317 20423 20513 20533 20465 1 157 154 1 370795.650382543157320 90151.573536386393243 0.000000000000000 2026.785522460937500 2598.214111328125000 23276 23268 23325 23409 23482 23514 23628 23737 23795 23837 23809 23685 23604 23693 23979 24222 24472 24739 24937 25075 25230 25400 25580 25738 25837 25863 25936 25982 25777 25403 25047 24748 24542 24359 24252 24414 24807 25110 25152 25073 25175 25356 25528 25647 25535 25288 25234 25213 24926 24573 24488 24430 24215 23956 23727 23562 23539 23709 23896 24007 24053 24035 23974 23878 23752 23626 23512 23450 23397 23290 23165 23033 22892 22774 22629 22455 22286 22159 22063 21977 21896 21842 21828 21859 21922 21986 22012 21990 21934 21837 21706 21571 21427 21293 21212 21151 21109 21095 21092 21078 21032 20955 20884 20834 20779 20758 20799 20839 20879 20882 20847 20808 20789 20801 20850 20915 20960 20936 20907 20892 20863 20885 20928 21005 21116 21217 21234 21139 20975 20837 20773 20762 20696 20606 20525 20455 20408 20418 20445 20448 20406 20358 20353 20349 20322 20298 20272 20268 20300 20348 20436 20509 20516 20453 1 158 154 1 370798.650382543157320 90151.573536386393243 0.000000000000000 2029.584594726562500 2593.769042968750000 23253 23228 23297 23382 23407 23409 23497 23594 23680 23763 23780 23683 23596 23701 23985 24235 24485 24741 24952 25119 25317 25507 25649 25737 25737 25681 25780 25938 25928 25659 25220 24831 24511 24210 24184 24525 24896 25017 24872 24784 24961 25160 25341 25445 25282 24971 24868 24956 24916 24783 24687 24428 24081 23874 23739 23671 23747 23903 24071 24184 24230 24191 24110 24005 23893 23756 23619 23545 23485 23374 23245 23107 22985 22855 22688 22507 22348 22242 22157 22057 21960 21900 21877 21902 21971 22038 22068 22052 22000 21926 21805 21635 21461 21337 21255 21183 21141 21126 21149 21166 21118 21008 20919 20860 20805 20790 20829 20873 20902 20900 20879 20834 20795 20798 20845 20904 20956 20954 20911 20873 20845 20874 20924 20992 21100 21218 21255 21167 21017 20897 20852 20842 20769 20667 20582 20515 20453 20439 20466 20479 20445 20404 20389 20371 20344 20314 20296 20318 20370 20410 20443 20486 20483 20408 1 159 154 1 370801.650382543157320 90151.573536386393243 0.000000000000000 2032.582031250000000 2595.079833984375000 23238 23312 23424 23529 23541 23526 23536 23539 23581 23644 23691 23650 23559 23620 23835 24078 24352 24605 24803 25000 25235 25434 25561 25663 25633 25514 25613 25826 25951 25811 25418 25030 24645 24241 24185 24555 24792 24722 24529 24509 24761 24964 25092 25200 25073 24732 24515 24656 24892 24975 24809 24452 24177 24055 23916 23924 24054 24181 24307 24375 24361 24287 24193 24110 24019 23883 23729 23632 23555 23438 23304 23180 23058 22907 22739 22569 22431 22340 22252 22143 22027 21949 21932 21968 22042 22125 22167 22155 22097 22019 21902 21717 21528 21394 21293 21207 21167 21155 21185 21215 21173 21060 20957 20889 20841 20824 20855 20897 20917 20921 20919 20878 20826 20815 20843 20901 20950 20961 20921 20876 20868 20903 20949 20992 21059 21147 21200 21160 21051 20952 20944 20939 20851 20742 20642 20558 20496 20465 20470 20482 20460 20431 20422 20408 20393 20371 20360 20381 20440 20486 20472 20448 20401 20326 1 160 154 1 370804.650382543157320 90151.573536386393243 0.000000000000000 2026.396362304687500 2580.056396484375000 23241 23338 23491 23653 23734 23762 23714 23642 23633 23631 23634 23612 23538 23599 23759 23941 24164 24396 24605 24806 25036 25235 25384 25520 25494 25373 25460 25669 25801 25743 25435 25035 24635 24223 24133 24463 24585 24420 24272 24393 24675 24776 24821 24968 24933 24620 24303 24432 24823 25006 24870 24572 24382 24257 24127 24186 24310 24375 24429 24463 24419 24319 24244 24199 24111 23963 23821 23716 23618 23503 23378 23263 23131 22978 22816 22662 22537 22441 22339 22222 22103 22019 22004 22036 22121 22226 22287 22271 22185 22074 21949 21780 21591 21443 21320 21232 21192 21184 21217 21250 21224 21110 20984 20898 20863 20855 20874 20915 20943 20949 20944 20912 20856 20833 20844 20877 20914 20926 20889 20864 20894 20938 20973 20998 21010 21043 21090 21110 21073 21038 21068 21046 20932 20809 20699 20603 20532 20490 20481 20480 20462 20447 20444 20438 20449 20462 20454 20440 20465 20508 20499 20453 20359 20264 1 161 154 1 370807.650382543157320 90151.573536386393243 0.000000000000000 2025.874633789062500 2558.760986328125000 23333 23410 23494 23639 23817 23908 23877 23837 23836 23784 23703 23653 23624 23691 23820 23945 24136 24404 24645 24821 24970 25108 25228 25304 25258 25199 25338 25524 25588 25535 25300 24908 24524 24136 23980 24189 24297 24191 24134 24369 24589 24548 24543 24667 24673 24423 24123 24273 24662 24854 24797 24562 24366 24226 24169 24229 24302 24292 24321 24414 24374 24256 24211 24211 24149 24008 23882 23811 23718 23584 23452 23336 23215 23071 22914 22773 22654 22536 22423 22307 22200 22131 22089 22089 22161 22268 22347 22329 22220 22090 21964 21834 21657 21489 21356 21262 21204 21181 21203 21252 21251 21132 20997 20915 20884 20878 20888 20926 20964 20966 20947 20924 20876 20849 20839 20843 20857 20870 20852 20836 20865 20924 20953 20956 20953 20969 21013 21072 21102 21126 21181 21143 21008 20866 20751 20658 20571 20509 20503 20500 20484 20466 20453 20461 20506 20534 20511 20473 20475 20500 20504 20476 20381 20259 1 162 154 1 370810.650382543157320 90151.573536386393243 0.000000000000000 2028.289428710937500 2533.943847656250000 23430 23549 23585 23645 23828 23962 23974 24003 24052 24011 23875 23751 23759 23851 23993 24102 24228 24475 24713 24889 24975 25042 25128 25103 25016 25014 25187 25322 25339 25288 25116 24771 24433 24153 23970 23884 23912 23926 24015 24294 24429 24305 24273 24371 24360 24141 23913 24072 24392 24641 24705 24529 24294 24067 23966 24022 24091 24078 24170 24329 24228 24074 24051 24117 24122 24043 23973 23931 23848 23683 23531 23417 23305 23171 23023 22884 22763 22638 22520 22421 22333 22266 22180 22132 22171 22284 22369 22347 22221 22103 22003 21896 21726 21544 21385 21283 21220 21188 21187 21223 21232 21134 21005 20931 20911 20905 20900 20926 20975 20991 20981 20958 20920 20891 20860 20828 20816 20815 20814 20799 20802 20856 20881 20885 20902 20936 20989 21053 21102 21157 21223 21203 21089 20948 20823 20714 20614 20531 20518 20513 20491 20469 20457 20485 20543 20580 20573 20532 20500 20487 20468 20441 20379 20283 1 163 154 1 370813.650382543157320 90151.573536386393243 0.000000000000000 2028.548217773437500 2510.137939453125000 23463 23579 23693 23767 23870 24010 24077 24141 24225 24206 24056 23875 23885 23992 24144 24286 24394 24544 24687 24806 24905 24936 24952 24907 24811 24866 25001 25076 25101 25088 25002 24769 24552 24398 24212 23990 23838 23738 23798 24062 24198 24097 24043 24142 24112 23887 23679 23840 24174 24519 24628 24466 24214 23925 23718 23732 23811 23872 24068 24193 23996 23817 23829 23964 24017 24006 24016 24018 23948 23792 23634 23517 23386 23251 23126 22998 22868 22736 22618 22540 22475 22385 22270 22192 22184 22278 22353 22309 22187 22122 22083 21986 21807 21606 21425 21301 21247 21221 21190 21196 21205 21135 21031 20964 20930 20917 20902 20923 20962 20997 21019 21008 20967 20934 20878 20822 20799 20782 20779 20778 20781 20807 20818 20846 20893 20939 20989 21039 21083 21132 21200 21224 21158 21033 20895 20763 20656 20567 20539 20543 20523 20492 20480 20497 20534 20585 20602 20574 20540 20486 20421 20371 20331 20285 1 164 154 1 370816.650382543157320 90151.573536386393243 0.000000000000000 2029.829345703125000 2488.768554687500000 23554 23607 23771 23908 23981 24076 24154 24215 24321 24340 24240 24075 24022 24108 24269 24401 24530 24631 24628 24628 24734 24800 24775 24719 24656 24666 24698 24759 24811 24851 24888 24866 24856 24785 24627 24423 24169 23852 23657 23739 23883 23889 23828 23916 23895 23671 23521 23775 24169 24476 24517 24345 24084 23757 23507 23460 23556 23696 23975 24092 23857 23615 23627 23798 23876 23923 24009 24079 24042 23909 23746 23614 23472 23336 23220 23100 22972 22845 22725 22643 22582 22458 22329 22249 22210 22244 22271 22217 22150 22153 22162 22067 21880 21671 21481 21345 21286 21250 21218 21212 21205 21149 21068 21004 20959 20937 20921 20925 20946 20995 21048 21060 21036 20990 20906 20821 20792 20780 20771 20762 20767 20793 20803 20836 20885 20944 20987 21030 21080 21115 21155 21195 21173 21071 20938 20798 20682 20591 20556 20567 20560 20524 20504 20490 20498 20543 20579 20597 20578 20495 20395 20336 20311 20298 1 165 154 1 370819.650382543157320 90151.573536386393243 0.000000000000000 2033.114501953125000 2510.991455078125000 23752 23765 23870 24046 24157 24223 24276 24302 24397 24445 24423 24317 24215 24225 24372 24500 24591 24658 24605 24490 24514 24633 24684 24619 24497 24442 24387 24423 24461 24555 24675 24815 25002 25110 25062 24889 24564 24105 23750 23600 23513 23499 23498 23609 23607 23461 23540 23926 24237 24356 24298 24141 23931 23612 23299 23189 23327 23571 23864 23977 23783 23507 23450 23622 23722 23826 23979 24120 24148 24029 23849 23702 23561 23425 23310 23191 23077 22947 22816 22725 22655 22518 22385 22300 22220 22168 22151 22115 22124 22178 22197 22092 21904 21703 21517 21382 21325 21295 21279 21269 21251 21194 21118 21036 20973 20934 20921 20925 20936 20972 21034 21082 21084 21021 20922 20843 20812 20806 20793 20770 20780 20813 20827 20846 20871 20933 20997 21046 21085 21096 21091 21111 21120 21055 20949 20823 20703 20609 20587 20587 20591 20554 20524 20506 20505 20534 20566 20600 20560 20451 20355 20335 20337 20331 1 166 154 1 370822.650382543157320 90151.573536386393243 0.000000000000000 2032.244506835937500 2528.250244140625000 23992 24005 24010 24169 24314 24361 24398 24393 24397 24431 24486 24487 24410 24370 24460 24553 24587 24599 24570 24459 24370 24442 24562 24531 24344 24240 24166 24169 24197 24318 24468 24620 24866 25150 25283 25193 24839 24362 24060 23848 23583 23392 23220 23211 23265 23338 23626 23967 24130 24129 23994 23832 23701 23497 23146 22977 23156 23452 23711 23761 23596 23383 23272 23429 23576 23738 23937 24131 24221 24118 23928 23773 23642 23515 23395 23272 23158 23032 22897 22781 22678 22561 22453 22349 22230 22130 22081 22052 22086 22155 22163 22056 21873 21682 21513 21408 21365 21327 21307 21305 21298 21256 21170 21062 20985 20941 20918 20941 20967 20979 21017 21077 21096 21040 20950 20882 20853 20842 20823 20804 20819 20848 20857 20865 20886 20937 20990 21052 21101 21106 21060 21023 21036 21020 20937 20824 20714 20625 20606 20608 20609 20579 20551 20531 20530 20547 20561 20579 20516 20389 20322 20362 20389 20378 1 167 154 1 370825.650382543157320 90151.573536386393243 0.000000000000000 2035.987060546875000 2523.798339843750000 24299 24319 24244 24300 24382 24332 24332 24339 24309 24327 24439 24510 24495 24504 24562 24555 24496 24473 24485 24428 24299 24271 24338 24329 24170 24051 23998 23955 23965 24098 24259 24413 24669 24985 25181 25238 25015 24645 24459 24300 24004 23681 23285 23043 23093 23372 23674 23831 23892 23867 23707 23536 23411 23335 23033 22854 23068 23356 23517 23461 23332 23233 23104 23249 23449 23660 23877 24089 24222 24166 23992 23844 23721 23594 23467 23348 23231 23102 22971 22855 22730 22627 22533 22425 22294 22172 22087 22033 22033 22063 22068 21989 21816 21633 21508 21455 21418 21349 21317 21326 21338 21310 21216 21099 21021 20970 20952 20979 21018 21019 21017 21052 21081 21046 20970 20916 20910 20892 20855 20820 20821 20850 20875 20889 20911 20940 20973 21044 21114 21134 21079 20984 20943 20943 20894 20811 20735 20663 20636 20647 20641 20620 20593 20561 20544 20532 20525 20529 20470 20380 20360 20423 20451 20437 \ No newline at end of file diff --git a/Flight_control/src/enemy_suv/enemy_suv_description/worlds/kunming_airport.world b/Flight_control/src/enemy_suv/enemy_suv_description/worlds/kunming_airport.world new file mode 100644 index 0000000..e8b7f89 --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_description/worlds/kunming_airport.world @@ -0,0 +1,78 @@ + + + + + + model://sun + + + + model://kunming_airport + 0 0 0 0 0 0 + + + + model://suv + 602.050000 -729.260000 0 0 0 0.9 + + + + + 0.68 0.68 0.68 1.0 + + + + 0 + + + + + + + + + 1000 + 0.001 + 1.0 + + + + + diff --git a/Flight_control/src/enemy_suv/enemy_suv_teleop/CHANGELOG.rst b/Flight_control/src/enemy_suv/enemy_suv_teleop/CHANGELOG.rst new file mode 100644 index 0000000..404258e --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_teleop/CHANGELOG.rst @@ -0,0 +1,29 @@ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Changelog for package hector_quadrotor_teleop +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +0.3.5 (2015-03-28) +------------------ + +0.3.4 (2015-02-22) +------------------ +* Add optional parameter to set the joystick device +* Contributors: whoenig + +0.3.3 (2014-09-01) +------------------ +* added run dependency to joy package (joystick drivers) +* Contributors: Johannes Meyer + +0.3.2 (2014-03-30) +------------------ + +0.3.1 (2013-12-26) +------------------ +* added slow button (btn 6 on Logitech Gamepad) +* Contributors: Johannes Meyer + +0.3.0 (2013-09-11) +------------------ +* Catkinized stack hector_quadrotor and integrated hector_quadrotor_demo package from former hector_quadrotor_apps stack +* decreased z_velocity_max to 2.0 m/s in logitech_gamepad.launch diff --git a/Flight_control/src/enemy_suv/enemy_suv_teleop/CMakeLists.txt b/Flight_control/src/enemy_suv/enemy_suv_teleop/CMakeLists.txt new file mode 100644 index 0000000..7c567ca --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_teleop/CMakeLists.txt @@ -0,0 +1,89 @@ +cmake_minimum_required(VERSION 2.8.3) +project(enemy_suv_teleop) + +## Find catkin macros and libraries +## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) +## is used, also find other catkin packages +find_package(catkin REQUIRED COMPONENTS roscpp sensor_msgs geometry_msgs hector_uav_msgs) +include_directories(include ${catkin_INCLUDE_DIRS}) + +## System dependencies are found with CMake's conventions +# find_package(Boost REQUIRED COMPONENTS system) + +## 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() + + +################################### +## catkin specific configuration ## +################################### +## The catkin_package macro generates cmake config files for your package +## Declare things to be passed to dependent projects +## INCLUDE_DIRS: uncomment this if you package contains header files +## LIBRARIES: libraries you create in this project that dependent projects also need +## CATKIN_DEPENDS: catkin_packages dependent projects also need +## DEPENDS: system dependencies of this project that dependent projects also need +catkin_package( + INCLUDE_DIRS + LIBRARIES + CATKIN_DEPENDS roscpp sensor_msgs geometry_msgs hector_uav_msgs + DEPENDS +) + +########### +## Build ## +########### + +## Declare a cpp library +# add_library(@{name} +# src/${PROJECT_NAME}/@name.cpp +# ) + +## Declare a cpp executable +add_executable(enemy_suv_teleop src/quadrotor_teleop.cpp) +target_link_libraries(enemy_suv_teleop ${catkin_LIBRARIES}) + +## Add cmake target dependencies of the executable/library +## as an example, message headers may need to be generated before nodes +add_dependencies(enemy_suv_teleop ${catkin_EXPORTED_TARGETS}) + +############# +## 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 +## in contrast to setup.py, you can choose the destination +# install(PROGRAMS +# scripts/my_python_script +# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +# ) + +## Mark executables and/or libraries for installation +install(TARGETS enemy_suv_teleop + 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 +# # myfile1 +# # myfile2 +# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} +# ) + +install(DIRECTORY launch + DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} +) diff --git a/Flight_control/src/enemy_suv/enemy_suv_teleop/launch/logitech_gamepad.launch b/Flight_control/src/enemy_suv/enemy_suv_teleop/launch/logitech_gamepad.launch new file mode 100644 index 0000000..83884da --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_teleop/launch/logitech_gamepad.launch @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Flight_control/src/enemy_suv/enemy_suv_teleop/launch/xbox_controller.launch b/Flight_control/src/enemy_suv/enemy_suv_teleop/launch/xbox_controller.launch new file mode 100644 index 0000000..c6e9348 --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_teleop/launch/xbox_controller.launch @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Flight_control/src/enemy_suv/enemy_suv_teleop/package.xml b/Flight_control/src/enemy_suv/enemy_suv_teleop/package.xml new file mode 100644 index 0000000..4d89caf --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_teleop/package.xml @@ -0,0 +1,33 @@ + + enemy_suv_teleop + 0.3.5 + hector_quadrotor_teleop enables quadrotor flying with a joystick by + processing joy/Joy messages and translating them to geometry_msgs/Twist. + Johannes Meyer + + BSD + + http://ros.org/wiki/hector_quadrotor_teleop + https://github.com/tu-darmstadt-ros-pkg/hector_quadrotor/issues + + Johannes Meyer + + + catkin + + + roscpp + sensor_msgs + geometry_msgs + hector_uav_msgs + + + roscpp + sensor_msgs + geometry_msgs + hector_uav_msgs + joy + + + + diff --git a/Flight_control/src/enemy_suv/enemy_suv_teleop/src/quadrotor_teleop.cpp b/Flight_control/src/enemy_suv/enemy_suv_teleop/src/quadrotor_teleop.cpp new file mode 100644 index 0000000..7d6e02e --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_teleop/src/quadrotor_teleop.cpp @@ -0,0 +1,215 @@ +//================================================================================================= +// Copyright (c) 2012, Johannes Meyer, TU Darmstadt +// All rights reserved. + +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of the Flight Systems and Automatic Control group, +// TU Darmstadt, nor the names of its contributors may be used to +// endorse or promote products derived from this software without +// specific prior written permission. + +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//================================================================================================= + + +#include +#include +#include +#include +#include +#include + +namespace hector_quadrotor +{ + +class Teleop +{ +private: + ros::NodeHandle node_handle_; + ros::Subscriber joy_subscriber_; + + ros::Publisher velocity_publisher_, attitude_publisher_, yawrate_publisher_, thrust_publisher_; + geometry_msgs::Twist velocity_; + hector_uav_msgs::AttitudeCommand attitude_; + hector_uav_msgs::ThrustCommand thrust_; + hector_uav_msgs::YawrateCommand yawrate_; + + struct Axis + { + int axis; + double max; + }; + + struct Button + { + int button; + }; + + struct + { + Axis x; + Axis y; + Axis z; + Axis yaw; + } axes_; + + struct + { + Button slow; + } buttons_; + + double slow_factor_; + +public: + Teleop() + { + ros::NodeHandle params("~"); + + params.param("x_axis", axes_.x.axis, 4); + params.param("y_axis", axes_.y.axis, 3); + params.param("z_axis", axes_.z.axis, 2); + params.param("yaw_axis", axes_.yaw.axis, 1); + + params.param("yaw_velocity_max", axes_.yaw.max, 90.0 * M_PI / 180.0); + params.param("slow_button", buttons_.slow.button, 1); + params.param("slow_factor", slow_factor_, 0.2); + + std::string control_mode_str; + params.param("control_mode", control_mode_str, "twist"); + + if (control_mode_str == "twist") + { + params.param("x_velocity_max", axes_.x.max, 2.0); + params.param("y_velocity_max", axes_.y.max, 2.0); + params.param("z_velocity_max", axes_.z.max, 2.0); + + joy_subscriber_ = node_handle_.subscribe("joy", 1, boost::bind(&Teleop::joyTwistCallback, this, _1)); + velocity_publisher_ = node_handle_.advertise("cmd_vel", 10); + } + else if (control_mode_str == "attitude") + { + params.param("x_roll_max", axes_.x.max, 0.35); + params.param("y_pitch_max", axes_.y.max, 0.35); + params.param("z_thrust_max", axes_.z.max, 25.0); + joy_subscriber_ = node_handle_.subscribe("joy", 1, boost::bind(&Teleop::joyAttitudeCallback, this, _1)); + attitude_publisher_ = node_handle_.advertise("command/attitude", 10); + yawrate_publisher_ = node_handle_.advertise("command/yawrate", 10); + thrust_publisher_ = node_handle_.advertise("command/thrust", 10); + } + + } + + ~Teleop() + { + stop(); + } + + void joyTwistCallback(const sensor_msgs::JoyConstPtr &joy) + { + velocity_.linear.x = getAxis(joy, axes_.x); + velocity_.linear.y = getAxis(joy, axes_.y); + velocity_.linear.z = getAxis(joy, axes_.z); + velocity_.angular.z = getAxis(joy, axes_.yaw); + if (getButton(joy, buttons_.slow.button)) + { + velocity_.linear.x *= slow_factor_; + velocity_.linear.y *= slow_factor_; + velocity_.linear.z *= slow_factor_; + velocity_.angular.z *= slow_factor_; + } + velocity_publisher_.publish(velocity_); + } + + void joyAttitudeCallback(const sensor_msgs::JoyConstPtr &joy) + { + attitude_.roll = getAxis(joy, axes_.x); + attitude_.pitch = getAxis(joy, axes_.y); + attitude_publisher_.publish(attitude_); + + thrust_.thrust = getAxis(joy, axes_.z); + thrust_publisher_.publish(thrust_); + + yawrate_.turnrate = getAxis(joy, axes_.yaw); + if (getButton(joy, buttons_.slow.button)) + { + yawrate_.turnrate *= slow_factor_; + } + yawrate_publisher_.publish(yawrate_); + } + + sensor_msgs::Joy::_axes_type::value_type getAxis(const sensor_msgs::JoyConstPtr &joy, Axis axis) + { + if (axis.axis == 0) + {return 0;} + sensor_msgs::Joy::_axes_type::value_type sign = 1.0; + if (axis.axis < 0) + { + sign = -1.0; + axis.axis = -axis.axis; + } + if ((size_t) axis.axis > joy->axes.size()) + {return 0;} + return sign * joy->axes[axis.axis - 1] * axis.max; + } + + sensor_msgs::Joy::_buttons_type::value_type getButton(const sensor_msgs::JoyConstPtr &joy, int button) + { + if (button <= 0) + {return 0;} + if ((size_t) button > joy->buttons.size()) + {return 0;} + return joy->buttons[button - 1]; + } + + void stop() + { + if(velocity_publisher_.getNumSubscribers() > 0) + { + velocity_ = geometry_msgs::Twist(); + velocity_publisher_.publish(velocity_); + } + if(attitude_publisher_.getNumSubscribers() > 0) + { + attitude_ = hector_uav_msgs::AttitudeCommand(); + attitude_publisher_.publish(attitude_); + } + if(thrust_publisher_.getNumSubscribers() > 0) + { + thrust_ = hector_uav_msgs::ThrustCommand(); + thrust_publisher_.publish(thrust_); + } + if(yawrate_publisher_.getNumSubscribers() > 0) + { + yawrate_ = hector_uav_msgs::YawrateCommand(); + yawrate_publisher_.publish(yawrate_); + } + + } +}; + +} // namespace hector_quadrotor + +int main(int argc, char **argv) +{ + ros::init(argc, argv, "quadrotor_teleop"); + + hector_quadrotor::Teleop teleop; + ros::spin(); + + return 0; +} diff --git a/Flight_control/src/enemy_suv/enemy_suv_teleop_key/CMakeLists.txt b/Flight_control/src/enemy_suv/enemy_suv_teleop_key/CMakeLists.txt new file mode 100644 index 0000000..39cdf18 --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_teleop_key/CMakeLists.txt @@ -0,0 +1,89 @@ +cmake_minimum_required(VERSION 2.8.3) +project(enemy_suv_teleop_key) + +## Find catkin macros and libraries +## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) +## is used, also find other catkin packages +find_package(catkin REQUIRED COMPONENTS roscpp geometry_msgs) +include_directories(include ${catkin_INCLUDE_DIRS}) + +## System dependencies are found with CMake's conventions +# find_package(Boost REQUIRED COMPONENTS system) + +## 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() + + +################################### +## catkin specific configuration ## +################################### +## The catkin_package macro generates cmake config files for your package +## Declare things to be passed to dependent projects +## INCLUDE_DIRS: uncomment this if you package contains header files +## LIBRARIES: libraries you create in this project that dependent projects also need +## CATKIN_DEPENDS: catkin_packages dependent projects also need +## DEPENDS: system dependencies of this project that dependent projects also need +catkin_package( + INCLUDE_DIRS + LIBRARIES + CATKIN_DEPENDS roscpp geometry_msgs + DEPENDS +) + +########### +## Build ## +########### + +## Declare a cpp library +# add_library(@{name} +# src/${PROJECT_NAME}/@name.cpp +# ) + +## Declare a cpp executable +add_executable(enemy_suv_teleop_key src/enemy_suv_teleop_key.cpp) +target_link_libraries(enemy_suv_teleop_key ${catkin_LIBRARIES}) + +## Add cmake target dependencies of the executable/library +## as an example, message headers may need to be generated before nodes +add_dependencies(enemy_suv_teleop_key ${catkin_EXPORTED_TARGETS}) + +############# +## 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 +## in contrast to setup.py, you can choose the destination +# install(PROGRAMS +# scripts/my_python_script +# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +# ) + +## Mark executables and/or libraries for installation +install(TARGETS enemy_suv_teleop_key + 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 +# # myfile1 +# # myfile2 +# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} +# ) + +install(DIRECTORY launch + DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} +) diff --git a/Flight_control/src/enemy_suv/enemy_suv_teleop_key/launch/key.launch b/Flight_control/src/enemy_suv/enemy_suv_teleop_key/launch/key.launch new file mode 100644 index 0000000..d36d9d5 --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_teleop_key/launch/key.launch @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/Flight_control/src/enemy_suv/enemy_suv_teleop_key/launch/key1.launch b/Flight_control/src/enemy_suv/enemy_suv_teleop_key/launch/key1.launch new file mode 100644 index 0000000..aedd747 --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_teleop_key/launch/key1.launch @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Flight_control/src/enemy_suv/enemy_suv_teleop_key/launch/key_0.launch b/Flight_control/src/enemy_suv/enemy_suv_teleop_key/launch/key_0.launch new file mode 100644 index 0000000..b663c5e --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_teleop_key/launch/key_0.launch @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/Flight_control/src/enemy_suv/enemy_suv_teleop_key/launch/key_2.launch b/Flight_control/src/enemy_suv/enemy_suv_teleop_key/launch/key_2.launch new file mode 100644 index 0000000..fbdcd24 --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_teleop_key/launch/key_2.launch @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/Flight_control/src/enemy_suv/enemy_suv_teleop_key/launch/key_3.launch b/Flight_control/src/enemy_suv/enemy_suv_teleop_key/launch/key_3.launch new file mode 100644 index 0000000..53ae927 --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_teleop_key/launch/key_3.launch @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/Flight_control/src/enemy_suv/enemy_suv_teleop_key/launch/key_4.launch b/Flight_control/src/enemy_suv/enemy_suv_teleop_key/launch/key_4.launch new file mode 100644 index 0000000..4637f2f --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_teleop_key/launch/key_4.launch @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/Flight_control/src/enemy_suv/enemy_suv_teleop_key/launch/key_5.launch b/Flight_control/src/enemy_suv/enemy_suv_teleop_key/launch/key_5.launch new file mode 100644 index 0000000..f6948a0 --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_teleop_key/launch/key_5.launch @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/Flight_control/src/enemy_suv/enemy_suv_teleop_key/package.xml b/Flight_control/src/enemy_suv/enemy_suv_teleop_key/package.xml new file mode 100644 index 0000000..3ce853e --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_teleop_key/package.xml @@ -0,0 +1,27 @@ + + enemy_suv_teleop_key + 0.3.5 + hector_quadrotor_teleop enables quadrotor flying with key translating them to geometry_msgs/Twist. + Johannes Meyer + + BSD + + http://ros.org/wiki/hector_quadrotor_teleop + https://github.com/tu-darmstadt-ros-pkg/hector_quadrotor/issues + + Johannes Meyer + + + catkin + + + roscpp + geometry_msgs + + + roscpp + geometry_msgs + + + + diff --git a/Flight_control/src/enemy_suv/enemy_suv_teleop_key/src/enemy_suv_teleop_key.cpp b/Flight_control/src/enemy_suv/enemy_suv_teleop_key/src/enemy_suv_teleop_key.cpp new file mode 100644 index 0000000..7a36bd2 --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_teleop_key/src/enemy_suv_teleop_key.cpp @@ -0,0 +1,382 @@ +//================================================================================================= +// Copyright (c) 2012, Johannes Meyer, TU Darmstadt +// All rights reserved. + +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of the Flight Systems and Automatic Control group, +// TU Darmstadt, nor the names of its contributors may be used to +// endorse or promote products derived from this software without +// specific prior written permission. + +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//================================================================================================= + +#include +// #include +#include +// #include +// #include +// #include +#include +#include +#include + +#define KEYCODE_W 0x77 +#define KEYCODE_A 0x61 +#define KEYCODE_S 0x73 +#define KEYCODE_D 0x64 + +#define KEYCODE_R 0x43 +#define KEYCODE_L 0x44 +#define KEYCODE_F 0x41 +#define KEYCODE_B 0x42 +#define KEYCODE_Q 0x71 + +int kfd = 0; +struct termios cooked, raw; + +void quit(int sig) +{ + (void)sig; + tcsetattr(kfd, TCSANOW, &cooked); + ros::shutdown(); + exit(0); +} + +namespace hector_quadrotor +{ + +class Teleop +{ +private: + ros::NodeHandle node_handle_; + // ros::Subscriber joy_subscriber_; + + ros::Publisher velocity_publisher_; //, attitude_publisher_, yawrate_publisher_, thrust_publisher_; + geometry_msgs::Twist velocity_; + // hector_uav_msgs::AttitudeCommand attitude_; + // hector_uav_msgs::ThrustCommand thrust_; + // hector_uav_msgs::YawrateCommand yawrate_; + + struct Axis + { + int axis; + double max; + }; + + // struct Button + // { + // int button; + // }; + + struct + { + Axis x; + Axis y; + Axis z; + Axis yaw; + } axes_; + + // struct + // { + // Button slow; + // } buttons_; + + // double slow_factor_; + +public: + Teleop() + { + ros::NodeHandle params("~"); + + // double cmd_vel_robot; + // ros::param::get("~cmd_vel_robot",cmd_vel_robot); + + params.param("x_axis", axes_.x.axis, 4); + params.param("y_axis", axes_.y.axis, 3); + params.param("z_axis", axes_.z.axis, 2); + params.param("yaw_axis", axes_.yaw.axis, 1); + + params.param("yaw_velocity_max", axes_.yaw.max, 0.0); // 90.0 * M_PI / 180.0 + // params.param("slow_button", buttons_.slow.button, 1); + // params.param("slow_factor", slow_factor_, 0.2); + + std::string control_mode_str; + params.param("control_mode", control_mode_str, "twist"); + + if (control_mode_str == "twist") + { + params.param("x_velocity_max", axes_.x.max, 0.0); //2.0 + params.param("y_velocity_max", axes_.y.max, 0.0); //2.0 + params.param("z_velocity_max", axes_.z.max, 0.0); //2.0 + + // joy_subscriber_ = node_handle_.subscribe("joy", 1, boost::bind(&Teleop::joyTwistCallback, this, _1)); + velocity_publisher_ = node_handle_.advertise("cmd_vel", 1); + } + else if (control_mode_str == "attitude") + { + params.param("x_roll_max", axes_.x.max, 0.35); + params.param("y_pitch_max", axes_.y.max, 0.35); + params.param("z_thrust_max", axes_.z.max, 25.0); + // joy_subscriber_ = node_handle_.subscribe("joy", 1, boost::bind(&Teleop::joyAttitudeCallback, this, _1)); + // attitude_publisher_ = node_handle_.advertise("command/attitude", 10); + // yawrate_publisher_ = node_handle_.advertise("command/yawrate", 10); + // thrust_publisher_ = node_handle_.advertise("command/thrust", 10); + } + } + + ~Teleop() + { + stop(); + } + + void keyLoop() + { + char c; + bool dirty = false; + + // get the console in raw mode + tcgetattr(kfd, &cooked); + memcpy(&raw, &cooked, sizeof(struct termios)); + raw.c_lflag &= ~(ICANON | ECHO); + // Setting a new line, then end of file + raw.c_cc[VEOL] = 1; + raw.c_cc[VEOF] = 2; + tcsetattr(kfd, TCSANOW, &raw); + + puts("Reading from keyboard"); + puts("---------------------------"); + puts("Use arrow keys and w a s d to move the quadrotor."); + + for (;;) + { + // get the next event from the keyboard + if (read(kfd, &c, 1) < 0) + { + perror("read():"); + exit(-1); + } + + // linear_ = angular_ = 0; + ROS_DEBUG("value: 0x%02X\n", c); + + switch (c) + { + case KEYCODE_W: + ROS_DEBUG("UP"); + axes_.x.max = 0.0; + axes_.y.max = 0.0; + axes_.z.max = 2.0; + axes_.yaw.max = 0.0; + dirty = true; + break; + case KEYCODE_S: + ROS_DEBUG("DOWN"); + axes_.x.max = 0.0; + axes_.y.max = 0.0; + axes_.z.max = -2.0; + axes_.yaw.max = 0.0; + dirty = true; + break; + case KEYCODE_A: + ROS_DEBUG("TURN_LEFT"); + axes_.x.max = 0.0; + axes_.y.max = 0.0; + axes_.z.max = 0.0; + axes_.yaw.max = 90.0 * M_PI / 180.0; + dirty = true; + break; + case KEYCODE_D: + ROS_DEBUG("TURN_RIGHT"); + axes_.x.max = 0.0; + axes_.y.max = 0.0; + axes_.z.max = 0.0; + axes_.yaw.max = -90.0 * M_PI / 180.0; + dirty = true; + break; + case KEYCODE_L: + ROS_DEBUG("LEFT"); + axes_.x.max = 20.0; + axes_.y.max = 0.0; + axes_.z.max = 0.0; + axes_.yaw.max = 1.0;//90.0 * M_PI / 180.0; + dirty = true; + break; + case KEYCODE_R: + ROS_DEBUG("RIGHT"); + axes_.x.max = 20.0; + axes_.y.max = 0.0; + axes_.z.max = 0.0; + axes_.yaw.max = -1.0;//-90.0 * M_PI / 180.0; + dirty = true; + break; + case KEYCODE_F: + ROS_DEBUG("FORWARD"); + axes_.x.max = 20.0; + axes_.y.max = 0.0; + axes_.z.max = 0.0; + axes_.yaw.max = 0.0; + dirty = true; + break; + case KEYCODE_B: + ROS_DEBUG("BACKWARD"); + axes_.x.max = -20.0; + axes_.y.max = 0.0; + axes_.z.max = 0.0; + axes_.yaw.max = 0.0; + dirty = true; + break; + case KEYCODE_Q: + ROS_DEBUG("STOP"); + axes_.x.max = 0.0; + axes_.y.max = 0.0; + axes_.z.max = 0.0; + axes_.yaw.max = 0.0; + dirty = true; + break; + default: + // max_tv = walk_vel_; + // max_rv = yaw_rate_; + axes_.z.max = 0.0; + axes_.yaw.max = 0.0; + axes_.x.max = 0.0; + axes_.y.max = 0.0; + dirty = false; + } + + // geometry_msgs::Twist twist; + velocity_.linear.x = axes_.x.max; + // velocity_.linear.y = axes_.y.max; + // velocity_.linear.z = axes_.z.max; + velocity_.angular.z = axes_.yaw.max; + // twist.angular.z = a_scale_ * angular_; + // twist.linear.x = l_scale_ * linear_; + if (dirty == true) + { + velocity_publisher_.publish(velocity_); + dirty = false; + } + } + + return; + } + + // void joyTwistCallback(const sensor_msgs::JoyConstPtr &joy) + // { + // velocity_.linear.x = getAxis(joy, axes_.x); + // velocity_.linear.y = getAxis(joy, axes_.y); + // velocity_.linear.z = getAxis(joy, axes_.z); + // velocity_.angular.z = getAxis(joy, axes_.yaw); + // if (getButton(joy, buttons_.slow.button)) + // { + // velocity_.linear.x *= slow_factor_; + // velocity_.linear.y *= slow_factor_; + // velocity_.linear.z *= slow_factor_; + // velocity_.angular.z *= slow_factor_; + // } + // velocity_publisher_.publish(velocity_); + // } + + // void joyAttitudeCallback(const sensor_msgs::JoyConstPtr &joy) + // { + // attitude_.roll = getAxis(joy, axes_.x); + // attitude_.pitch = getAxis(joy, axes_.y); + // attitude_publisher_.publish(attitude_); + + // thrust_.thrust = getAxis(joy, axes_.z); + // thrust_publisher_.publish(thrust_); + + // yawrate_.turnrate = getAxis(joy, axes_.yaw); + // if (getButton(joy, buttons_.slow.button)) + // { + // yawrate_.turnrate *= slow_factor_; + // } + // yawrate_publisher_.publish(yawrate_); + // } + + // sensor_msgs::Joy::_axes_type::value_type getAxis(const sensor_msgs::JoyConstPtr &joy, Axis axis) + // { + // if (axis.axis == 0) + // { + // return 0; + // } + // sensor_msgs::Joy::_axes_type::value_type sign = 1.0; + // if (axis.axis < 0) + // { + // sign = -1.0; + // axis.axis = -axis.axis; + // } + // if ((size_t)axis.axis > joy->axes.size()) + // { + // return 0; + // } + // return sign * joy->axes[axis.axis - 1] * axis.max; + // } + + // sensor_msgs::Joy::_buttons_type::value_type getButton(const sensor_msgs::JoyConstPtr &joy, int button) + // { + // if (button <= 0) + // { + // return 0; + // } + // if ((size_t)button > joy->buttons.size()) + // { + // return 0; + // } + // return joy->buttons[button - 1]; + // } + + void stop() + { + if (velocity_publisher_.getNumSubscribers() > 0) + { + velocity_ = geometry_msgs::Twist(); + velocity_publisher_.publish(velocity_); + } + // if (attitude_publisher_.getNumSubscribers() > 0) + // { + // attitude_ = hector_uav_msgs::AttitudeCommand(); + // attitude_publisher_.publish(attitude_); + // } + // if (thrust_publisher_.getNumSubscribers() > 0) + // { + // thrust_ = hector_uav_msgs::ThrustCommand(); + // thrust_publisher_.publish(thrust_); + // } + // if (yawrate_publisher_.getNumSubscribers() > 0) + // { + // yawrate_ = hector_uav_msgs::YawrateCommand(); + // yawrate_publisher_.publish(yawrate_); + // } + } +}; + +} // namespace hector_quadrotor + +int main(int argc, char **argv) +{ + ros::init(argc, argv, "quadrotor_teleop_key"); + + hector_quadrotor::Teleop teleop; + // ros::spin(); + signal(SIGINT, quit); + + teleop.keyLoop(); + + return 0; +} diff --git a/Flight_control/src/enemy_suv/enemy_suv_teleop_key/src/quadrotor_teleop_key_modify.cpp b/Flight_control/src/enemy_suv/enemy_suv_teleop_key/src/quadrotor_teleop_key_modify.cpp new file mode 100644 index 0000000..ac4ca8d --- /dev/null +++ b/Flight_control/src/enemy_suv/enemy_suv_teleop_key/src/quadrotor_teleop_key_modify.cpp @@ -0,0 +1,417 @@ +//================================================================================================= +// Copyright (c) 2012, Johannes Meyer, TU Darmstadt +// All rights reserved. + +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of the Flight Systems and Automatic Control group, +// TU Darmstadt, nor the names of its contributors may be used to +// endorse or promote products derived from this software without +// specific prior written permission. + +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//================================================================================================= + +#include +// #include +#include +// #include +// #include +// #include +#include +#include +#include +#include +#include + +#define KEYCODE_W 0x77 +#define KEYCODE_A 0x61 +#define KEYCODE_S 0x73 +#define KEYCODE_D 0x64 + +#define KEYCODE_R 0x43 +#define KEYCODE_L 0x44 +#define KEYCODE_F 0x41 +#define KEYCODE_B 0x42 +#define KEYCODE_Q 0x71 + +int kfd = 0; +struct termios cooked, raw; + +void quit(int sig) +{ + (void)sig; + tcsetattr(kfd, TCSANOW, &cooked); + ros::shutdown(); + exit(0); +} + +namespace hector_quadrotor +{ + +class Teleop +{ +private: + ros::NodeHandle node_handle_; + // ros::Subscriber joy_subscriber_; + + ros::Publisher velocity_publisher_; //, attitude_publisher_, yawrate_publisher_, thrust_publisher_; + geometry_msgs::Twist velocity_; + // hector_uav_msgs::AttitudeCommand attitude_; + // hector_uav_msgs::ThrustCommand thrust_; + // hector_uav_msgs::YawrateCommand yawrate_; + + struct Axis + { + int axis; + double max; + }; + + // struct Button + // { + // int button; + // }; + + struct + { + Axis x; + Axis y; + Axis z; + Axis yaw; + } axes_; + + // struct + // { + // Button slow; + // } buttons_; + + // double slow_factor_; + +public: + Teleop() + { + ros::NodeHandle params("~"); + + params.param("x_axis", axes_.x.axis, 4); + params.param("y_axis", axes_.y.axis, 3); + params.param("z_axis", axes_.z.axis, 2); + params.param("yaw_axis", axes_.yaw.axis, 1); + + params.param("yaw_velocity_max", axes_.yaw.max, 0.0); // 90.0 * M_PI / 180.0 + // params.param("slow_button", buttons_.slow.button, 1); + // params.param("slow_factor", slow_factor_, 0.2); + + std::string control_mode_str; + params.param("control_mode", control_mode_str, "twist"); + + if (control_mode_str == "twist") + { + params.param("x_velocity_max", axes_.x.max, 0.0); //2.0 + params.param("y_velocity_max", axes_.y.max, 0.0); //2.0 + params.param("z_velocity_max", axes_.z.max, 0.0); //2.0 + + // joy_subscriber_ = node_handle_.subscribe("joy", 1, boost::bind(&Teleop::joyTwistCallback, this, _1)); + velocity_publisher_ = node_handle_.advertise("cmd_vel", 1); + } + else if (control_mode_str == "attitude") + { + params.param("x_roll_max", axes_.x.max, 0.35); + params.param("y_pitch_max", axes_.y.max, 0.35); + params.param("z_thrust_max", axes_.z.max, 25.0); + // joy_subscriber_ = node_handle_.subscribe("joy", 1, boost::bind(&Teleop::joyAttitudeCallback, this, _1)); + // attitude_publisher_ = node_handle_.advertise("command/attitude", 10); + // yawrate_publisher_ = node_handle_.advertise("command/yawrate", 10); + // thrust_publisher_ = node_handle_.advertise("command/thrust", 10); + } + } + + ~Teleop() + { + stop(); + } + + void keyLoop() + { + char c; + bool dirty = false; + + // get the console in raw mode + tcgetattr(kfd, &cooked); + memcpy(&raw, &cooked, sizeof(struct termios)); + raw.c_lflag &= ~(ICANON | ECHO); + // Setting a new line, then end of file + raw.c_cc[VEOL] = 1; + raw.c_cc[VEOF] = 2; + tcsetattr(kfd, TCSANOW, &raw); + + puts("Reading from keyboard"); + puts("---------------------------"); + puts("Use arrow keys and w a s d to move the quadrotor."); + + struct pollfd ufd; + ufd.fd = kfd; + ufd.events = POLLIN; + + for (;;) + { + boost::this_thread::interruption_point(); + + // get the next event from the keyboard + int num; + + if ((num = poll(&ufd, 1, 250)) < 0) + { + perror("poll():"); + return; + } + else if (num > 0) + { + if (read(kfd, &c, 1) < 0) + { + perror("read():"); + return; + } + } + else + { + if (dirty == true) + { + stopRobot(); + dirty = false; + } + + continue; + } + + for (;;) + { + // get the next event from the keyboard + if (read(kfd, &c, 1) < 0) + { + perror("read():"); + exit(-1); + } + + // linear_ = angular_ = 0; + ROS_DEBUG("value: 0x%02X\n", c); + + switch (c) + { + case KEYCODE_W: + ROS_DEBUG("UP"); + axes_.x.max = 0.0; + axes_.y.max = 0.0; + axes_.z.max = 2.0; + axes_.yaw.max = 0.0; + dirty = true; + break; + case KEYCODE_S: + ROS_DEBUG("DOWN"); + axes_.x.max = 0.0; + axes_.y.max = 0.0; + axes_.z.max = -2.0; + axes_.yaw.max = 0.0; + dirty = true; + break; + case KEYCODE_A: + ROS_DEBUG("TURN_LEFT"); + axes_.x.max = 0.0; + axes_.y.max = 0.0; + axes_.z.max = 0.0; + axes_.yaw.max = 90.0 * M_PI / 180.0; + dirty = true; + break; + case KEYCODE_D: + ROS_DEBUG("TURN_RIGHT"); + axes_.x.max = 0.0; + axes_.y.max = 0.0; + axes_.z.max = 0.0; + axes_.yaw.max = -90.0 * M_PI / 180.0; + dirty = true; + break; + case KEYCODE_L: + ROS_DEBUG("LEFT"); + axes_.x.max = 2.0; + axes_.y.max = 0.0; + axes_.z.max = 0.0; + axes_.yaw.max = 0.0; + dirty = true; + break; + case KEYCODE_R: + ROS_DEBUG("RIGHT"); + axes_.x.max = -2.0; + axes_.y.max = 0.0; + axes_.z.max = 0.0; + axes_.yaw.max = 0.0; + dirty = true; + break; + case KEYCODE_F: + ROS_DEBUG("FORWARD"); + axes_.x.max = 0.0; + axes_.y.max = 2.0; + axes_.z.max = 0.0; + axes_.yaw.max = 0.0; + dirty = true; + break; + case KEYCODE_B: + ROS_DEBUG("BACKWARD"); + axes_.x.max = 0.0; + axes_.y.max = -2.0; + axes_.z.max = 0.0; + axes_.yaw.max = 0.0; + dirty = true; + break; + case KEYCODE_Q: + ROS_DEBUG("BACKWARD"); + axes_.x.max = 0.0; + axes_.y.max = 0.0; + axes_.z.max = 0.0; + axes_.yaw.max = 0.0; + dirty = true; + break; + default: + // max_tv = walk_vel_; + // max_rv = yaw_rate_; + axes_.z.max = 0.0; + axes_.yaw.max = 0.0; + axes_.x.max = 0.0; + axes_.y.max = 0.0; + dirty = false; + } + + // geometry_msgs::Twist twist; + velocity_.linear.x = axes_.x.max; + velocity_.linear.y = axes_.y.max; + velocity_.linear.z = axes_.z.max; + velocity_.angular.z = axes_.yaw.max; + // twist.angular.z = a_scale_ * angular_; + // twist.linear.x = l_scale_ * linear_; + if (dirty == true) + { + velocity_publisher_.publish(velocity_); + dirty = false; + } + } + + return; + } + + // void joyTwistCallback(const sensor_msgs::JoyConstPtr &joy) + // { + // velocity_.linear.x = getAxis(joy, axes_.x); + // velocity_.linear.y = getAxis(joy, axes_.y); + // velocity_.linear.z = getAxis(joy, axes_.z); + // velocity_.angular.z = getAxis(joy, axes_.yaw); + // if (getButton(joy, buttons_.slow.button)) + // { + // velocity_.linear.x *= slow_factor_; + // velocity_.linear.y *= slow_factor_; + // velocity_.linear.z *= slow_factor_; + // velocity_.angular.z *= slow_factor_; + // } + // velocity_publisher_.publish(velocity_); + // } + + // void joyAttitudeCallback(const sensor_msgs::JoyConstPtr &joy) + // { + // attitude_.roll = getAxis(joy, axes_.x); + // attitude_.pitch = getAxis(joy, axes_.y); + // attitude_publisher_.publish(attitude_); + + // thrust_.thrust = getAxis(joy, axes_.z); + // thrust_publisher_.publish(thrust_); + + // yawrate_.turnrate = getAxis(joy, axes_.yaw); + // if (getButton(joy, buttons_.slow.button)) + // { + // yawrate_.turnrate *= slow_factor_; + // } + // yawrate_publisher_.publish(yawrate_); + // } + + // sensor_msgs::Joy::_axes_type::value_type getAxis(const sensor_msgs::JoyConstPtr &joy, Axis axis) + // { + // if (axis.axis == 0) + // { + // return 0; + // } + // sensor_msgs::Joy::_axes_type::value_type sign = 1.0; + // if (axis.axis < 0) + // { + // sign = -1.0; + // axis.axis = -axis.axis; + // } + // if ((size_t)axis.axis > joy->axes.size()) + // { + // return 0; + // } + // return sign * joy->axes[axis.axis - 1] * axis.max; + // } + + // sensor_msgs::Joy::_buttons_type::value_type getButton(const sensor_msgs::JoyConstPtr &joy, int button) + // { + // if (button <= 0) + // { + // return 0; + // } + // if ((size_t)button > joy->buttons.size()) + // { + // return 0; + // } + // return joy->buttons[button - 1]; + // } + + void stop() + { + if (velocity_publisher_.getNumSubscribers() > 0) + { + velocity_ = geometry_msgs::Twist(); + velocity_publisher_.publish(velocity_); + } + // if (attitude_publisher_.getNumSubscribers() > 0) + // { + // attitude_ = hector_uav_msgs::AttitudeCommand(); + // attitude_publisher_.publish(attitude_); + // } + // if (thrust_publisher_.getNumSubscribers() > 0) + // { + // thrust_ = hector_uav_msgs::ThrustCommand(); + // thrust_publisher_.publish(thrust_); + // } + // if (yawrate_publisher_.getNumSubscribers() > 0) + // { + // yawrate_ = hector_uav_msgs::YawrateCommand(); + // yawrate_publisher_.publish(yawrate_); + // } + } + }; + +} // namespace hector_quadrotor + +int +main(int argc, char **argv) +{ + ros::init(argc, argv, "quadrotor_teleop_key"); + + hector_quadrotor::Teleop teleop; + // ros::spin(); + signal(SIGINT, quit); + + teleop.keyLoop(); + + return 0; +} diff --git a/Flight_control/src/enemy_suv/suv_move/CMakeLists.txt b/Flight_control/src/enemy_suv/suv_move/CMakeLists.txt new file mode 100644 index 0000000..f3b4225 --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/CMakeLists.txt @@ -0,0 +1,123 @@ +cmake_minimum_required(VERSION 2.8.3) +project(suv_move) + +set(CMAKE_CXX_STANDARD 11) +if (NOT CMAKE_BUILD_TYPE) + # Options: Debug, Release, MinSizeRel, RelWithDebInfo + message(STATUS "No build type selected, default to Release") + set(CMAKE_BUILD_TYPE "Release") +endif() + +set(CMAKE_CXX_FLAGS "-fopenmp") + +find_package(catkin REQUIRED COMPONENTS + roscpp + rospy + rosflight_msgs + rosplane_msgs + dynamic_reconfigure + sensor_msgs + tf +) +find_package(Eigen3 REQUIRED) + +################################################ +## Declare ROS dynamic reconfigure parameters ## +################################################ + +## To declare and build dynamic reconfigure parameters within this +## package, follow these steps: +## * In the file package.xml: +## * add a build_depend and a run_depend tag for "dynamic_reconfigure" +## * In this file (CMakeLists.txt): +## * add "dynamic_reconfigure" to +## find_package(catkin REQUIRED COMPONENTS ...) +## * uncomment the "generate_dynamic_reconfigure_options" section below +## and list every .cfg file to be processed + +# Generate dynamic reconfigure parameters in the 'cfg' folder +#generate_dynamic_reconfigure_options( +# cfg/Follower.cfg +# cfg/Controller.cfg +#) + +catkin_package( + INCLUDE_DIRS include +# LIBRARIES + CATKIN_DEPENDS roscpp rospy rosflight_msgs rosplane_msgs +# DEPENDS system_lib +) + +include_directories(include ${catkin_INCLUDE_DIRS} ${EIGEN3_INCLUDE_DIRS}) + +## Declare a C++ executable +#add_executable(rosplane_controller +# src/controller_base.cpp +# src/controller_example.cpp) +#add_dependencies(rosplane_controller ${catkin_EXPORTED_TARGETS} ${PROJECT_NAME}_gencfg) +#target_link_libraries(rosplane_controller ${catkin_LIBRARIES}) + +#add_executable(rosplane_controller99 +# src/controller_base99.cpp +# src/controller_example99.cpp) +#add_dependencies(rosplane_controller99 ${catkin_EXPORTED_TARGETS} ${PROJECT_NAME}_gencfg) +#target_link_libraries(rosplane_controller99 ${catkin_LIBRARIES}) + +add_executable(suv_pseudo_controller + # src/controller_base.cpp + # src/controller_example.cpp) + src/pseudo_controller_base.cpp + src/pseudo_controller_example.cpp) +add_dependencies(suv_pseudo_controller ${catkin_EXPORTED_TARGETS} ${PROJECT_NAME}_gencfg) +target_link_libraries(suv_pseudo_controller ${catkin_LIBRARIES}) + +## Declare a C++ executable +#add_executable(rosplane_estimator +# src/estimator_base.cpp +# src/estimator_example.cpp) +#add_dependencies(rosplane_estimator ${catkin_EXPORTED_TARGETS}) +#target_link_libraries(rosplane_estimator ${catkin_LIBRARIES}) + +## Declare a C++ executable +add_executable(suv_estimator_statesub + src/estimator_base_statesub.cpp + ) +add_dependencies(suv_estimator_statesub ${catkin_EXPORTED_TARGETS}) +target_link_libraries(suv_estimator_statesub ${catkin_LIBRARIES}) + +## Declare a C++ executable +#add_executable(rosplane_estimator_updata_statesub +# src/estimator_base_updata_statesub.cpp +# ) +#add_dependencies(rosplane_estimator_updata_statesub ${catkin_EXPORTED_TARGETS}) +#target_link_libraries(rosplane_estimator_updata_statesub ${catkin_LIBRARIES}) + +## Declare a C++ executable +add_executable(suv_estimator_99pub + src/estimator_base_99pub.cpp + ) +add_dependencies(suv_estimator_99pub ${catkin_EXPORTED_TARGETS}) +target_link_libraries(suv_estimator_99pub ${catkin_LIBRARIES}) + +## Declare a C++ executable +add_executable(suv_path_follower + src/path_follower_example.cpp + src/path_follower_base.cpp) +add_dependencies(suv_path_follower ${catkin_EXPORTED_TARGETS} ${PROJECT_NAME}_gencfg) +target_link_libraries(suv_path_follower ${catkin_LIBRARIES}) + + +## Declare a C++ executable +add_executable(suv_path_manager + src/path_manager_base.cpp + src/path_manager_example.cpp) +add_dependencies(suv_path_manager ${catkin_EXPORTED_TARGETS}) +target_link_libraries(suv_path_manager ${catkin_LIBRARIES}) + + +## Declare a C++ executable +add_executable(suv_path_planner + src/path_planner.cpp) +add_dependencies(suv_path_planner ${catkin_EXPORTED_TARGETS}) +target_link_libraries(suv_path_planner ${catkin_LIBRARIES}) + diff --git a/Flight_control/src/enemy_suv/suv_move/cfg/Controller.cfg b/Flight_control/src/enemy_suv/suv_move/cfg/Controller.cfg new file mode 100644 index 0000000..4ac9d5e --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/cfg/Controller.cfg @@ -0,0 +1,58 @@ +#!/usr/bin/env python +PACKAGE = "rosplane" + +from dynamic_reconfigure.parameter_generator_catkin import * + +gen = ParameterGenerator() + +# trim +trim = gen.add_group("Trim") +trim.add("TRIM_E", double_t, 0, "Elevator trim", 0, -1, 1) +trim.add("TRIM_A", double_t, 0, "Aileron trim", 0, -1, 1) +trim.add("TRIM_R", double_t, 0, "Rudder trim", 0, -1, 1) +trim.add("TRIM_T", double_t, 0, "Throttle trim", 0.6, 0, 1) + +# course hold +course = gen.add_group("Course") +course.add("COURSE_KP", double_t, 0, "Course proportional gain", 0.7329, 0, 2) +course.add("COURSE_KD", double_t, 0, "Course derivative gain", 0, -1, 0) +course.add("COURSE_KI", double_t, 0, "Course integral gain", 0.0, 0, 0.2) + +# roll hold +roll = gen.add_group("Roll") +roll.add("ROLL_KP", double_t, 0, "Roll proportional gain", 1.17, 0, 3) +roll.add("ROLL_KD", double_t, 0, "Roll derivative gain", -0.13, -1, 0) +roll.add("ROLL_KI", double_t, 0, "Roll integral gain", 0, 0, 0.2) + +# pitch hold +pitch = gen.add_group("Pitch") +pitch.add("PITCH_KP", double_t, 0, "Pitch proportional gain", 1.0, 0, 3) +pitch.add("PITCH_KD", double_t, 0, "Pitch derivative gain", -0.17, -0.4, 0) +pitch.add("PITCH_KI", double_t, 0, "Pitch integral gain", 0, 0, 0.2) +pitch.add("PITCH_FF", double_t, 0, "Pitch feed forward value", 0, -1, 1) + +# airspeed with pitch hold +as_pitch = gen.add_group("Airspeed with Pitch") +as_pitch.add("AS_PITCH_KP", double_t, 0, "Airspeed with pitch proportional gain", -0.0713, 0, 0.2) +as_pitch.add("AS_PITCH_KD", double_t, 0, "Airspeed with pitch derivative gain", -0.0635, -0.2, 0) +as_pitch.add("AS_PITCH_KI", double_t, 0, "Airspeed with pitch integral gain", 0, 0, 0.2) + +# airspeed with throttle hold +as_thr = gen.add_group("Airspeed with Throttle") +as_thr.add("AS_THR_KP", double_t, 0, "Airspeed with throttle proportional gain", 3.2, 0, 10) +as_thr.add("AS_THR_KD", double_t, 0, "Airspeed with throttle derivative gain", 0, -5, 0) +as_thr.add("AS_THR_KI", double_t, 0, "Airspeed with throttle integral gain", 1.0, 0, 10) + +# altitude hold +alt = gen.add_group("Altitude") +alt.add("ALT_KP", double_t, 0, "Altitude proportional gain", 0.045, 0, 0.1) +alt.add("ALT_KD", double_t, 0, "Altitude derivative gain", 0, -0.05, 0) +alt.add("ALT_KI", double_t, 0, "Altitude integral gain", 0.01, 0, 0.05) + +# side-slip hold +sideslip = gen.add_group("Side Slip") +sideslip.add("BETA_KP", double_t, 0, "Side slip proportional gain", -0.1164, 0, 0.3) +sideslip.add("BETA_KD", double_t, 0, "Side slip derivative gain", 0, -0.15, 0) +sideslip.add("BETA_KI", double_t, 0, "Side slip integral gain", -0.0037111, 0, 0.05) + +exit(gen.generate(PACKAGE, "rosplane", "Controller")) diff --git a/Flight_control/src/enemy_suv/suv_move/cfg/Follower.cfg b/Flight_control/src/enemy_suv/suv_move/cfg/Follower.cfg new file mode 100644 index 0000000..fb68338 --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/cfg/Follower.cfg @@ -0,0 +1,17 @@ +#!/usr/bin/env python +PACKAGE = "rosplane" + +from dynamic_reconfigure.parameter_generator_catkin import * + +gen = ParameterGenerator() + +# Chi Infinity +gen.add("CHI_INFTY", double_t, 0, "Chi Infinity", 1.0472, 0 , 1.5708) + +# K Path +gen.add("K_PATH", double_t, 0, "K Path", 0.025, 0, 1) + +# K Orbit +gen.add("K_ORBIT", double_t, 0, "K Orbit", 4.0, 0, 15) + +exit(gen.generate(PACKAGE, "rosplane", "Follower")) diff --git a/Flight_control/src/enemy_suv/suv_move/include/controller_base.h b/Flight_control/src/enemy_suv/suv_move/include/controller_base.h new file mode 100644 index 0000000..465202a --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/include/controller_base.h @@ -0,0 +1,145 @@ +/** + * @file controller_base.h + * + * Base class definition for autopilot controller in chapter 6 of UAVbook, see http://uavbook.byu.edu/doku.php + * + * @author Gary Ellingson + */ + +#ifndef CONTROLLER_BASE_H +#define CONTROLLER_BASE_H + +#include +#include +#include +#include +#include + +#include +#include + +namespace rosplane +{ + +enum class alt_zones +{ + TAKE_OFF, + CLIMB, + DESCEND, + ALTITUDE_HOLD +}; + +class controller_base +{ +public: + controller_base(); + float spin(); + +protected: + + struct input_s + { + float Ts; /** time step */ + float h; /** altitude */ + float va; /** airspeed */ + float phi; /** roll angle */ + float psi; // + float theta; /** pitch angle */ + float chi; /** course angle */ + float p; /** body frame roll rate */ + float q; /** body frame pitch rate */ + float r; /** body frame yaw rate */ + float Va_c; /** commanded airspeed (m/s) */ + float h_c; /** commanded altitude (m) */ + float chi_c; /** commanded course (rad) */ + float phi_ff; /** feed forward term for orbits (rad) */ + }; + + struct output_s + { + float theta_c; //俯仰角--即平行于机身轴线并指向飞行器前方的向量与地面的夹角 + float phi_c; //滚转角--机体坐标系OZb轴与通过机体OXb轴的铅垂面间的夹角,机体向右滚为正,反之为负 + float delta_a; //副翼偏移量-转弯用-副翼跳变造成油门和升降舵数值的波动 + float delta_e; //升降舵偏移量-拉高降低 + float delta_r; //方向舵偏移量-保持稳定,消除测滑 + float delta_t; //油门偏移量 + alt_zones current_zone; + }; + + struct params_s + { + double alt_hz; /**< altitude hold zone */ + double alt_toz; /**< altitude takeoff zone */ + double tau; + double c_kp; + double c_kd; + double c_ki; + double r_kp; + double r_kd; + double r_ki; + double p_kp; + double p_kd; + double p_ki; + double p_ff; + double a_p_kp; + double a_p_kd; + double a_p_ki; + double a_t_kp; + double a_t_kd; + double a_t_ki; + double a_kp; + double a_kd; + double a_ki; + double b_kp; + double b_kd; + double b_ki; + double trim_e; + double trim_a; + double trim_r; + double trim_t; + double max_e; + double max_a; + double max_r; + double max_t; + double pwm_rad_e; + double pwm_rad_a; + double pwm_rad_r; + }; + + virtual void control(const struct params_s ¶ms, const struct input_s &input, struct output_s &output) = 0; + +private: + ros::NodeHandle nh_; + ros::NodeHandle nh_private_; + ros::Subscriber vehicle_state_sub_; + ros::Subscriber controller_commands_sub_; + ros::Publisher actuators_pub_; + ros::Publisher internals_pub_; + ros::Timer act_pub_timer_; + + struct params_s params_; /**< params */ + rosplane_msgs::Controller_Commands controller_commands_; + rosplane_msgs::State vehicle_state_; + + void vehicle_state_callback(const rosplane_msgs::StateConstPtr &msg); + void controller_commands_callback(const rosplane_msgs::Controller_CommandsConstPtr &msg); + bool command_recieved_; + + dynamic_reconfigure::Server server_; + dynamic_reconfigure::Server::CallbackType func_; + + void reconfigure_callback(rosplane::ControllerConfig &config, uint32_t level); + + /** + * Convert from deflection angle to pwm + */ + void convert_to_pwm(struct output_s &output); + + /** + * Publish the outputs + */ + void actuator_controls_publish(const ros::TimerEvent &); +}; +} //end namespace + +#endif // CONTROLLER_BASE_H diff --git a/Flight_control/src/enemy_suv/suv_move/include/controller_base99.h b/Flight_control/src/enemy_suv/suv_move/include/controller_base99.h new file mode 100644 index 0000000..379010b --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/include/controller_base99.h @@ -0,0 +1,145 @@ +/** + * @file controller_base99.h + * + * Base class definition for autopilot controller in chapter 6 of UAVbook, see http://uavbook.byu.edu/doku.php + * + * @author Gary Ellingson + */ + +#ifndef CONTROLLER_BASE99_H +#define CONTROLLER_BASE99_H + +#include +#include +#include +#include +#include + +#include +#include + +namespace rosplane +{ + +enum class alt_zones +{ + TAKE_OFF, + CLIMB, + DESCEND, + ALTITUDE_HOLD +}; + +class controller_base99 +{ +public: + controller_base99(); + float spin(); + +protected: + + struct input_s + { + float Ts; /** time step */ + float h; /** altitude */ + float va; /** airspeed */ + float phi; /** roll angle */ + float psi; // + float theta; /** pitch angle */ + float chi; /** course angle */ + float p; /** body frame roll rate */ + float q; /** body frame pitch rate */ + float r; /** body frame yaw rate */ + float Va_c; /** commanded airspeed (m/s) */ + float h_c; /** commanded altitude (m) */ + float chi_c; /** commanded course (rad) */ + float phi_ff; /** feed forward term for orbits (rad) */ + }; + + struct output_s + { + float theta_c; //俯仰角--即平行于机身轴线并指向飞行器前方的向量与地面的夹角 + float phi_c; //滚转角--机体坐标系OZb轴与通过机体OXb轴的铅垂面间的夹角,机体向右滚为正,反之为负 + float delta_a; //副翼偏移量-转弯用-副翼跳变造成油门和升降舵数值的波动 + float delta_e; //升降舵偏移量-拉高降低 + float delta_r; //方向舵偏移量-保持稳定,消除测滑 + float delta_t; //油门偏移量 + alt_zones current_zone; + }; + + struct params_s + { + double alt_hz; /**< altitude hold zone */ + double alt_toz; /**< altitude takeoff zone */ + double tau; + double c_kp; + double c_kd; + double c_ki; + double r_kp; + double r_kd; + double r_ki; + double p_kp; + double p_kd; + double p_ki; + double p_ff; + double a_p_kp; + double a_p_kd; + double a_p_ki; + double a_t_kp; + double a_t_kd; + double a_t_ki; + double a_kp; + double a_kd; + double a_ki; + double b_kp; + double b_kd; + double b_ki; + double trim_e; + double trim_a; + double trim_r; + double trim_t; + double max_e; + double max_a; + double max_r; + double max_t; + double pwm_rad_e; + double pwm_rad_a; + double pwm_rad_r; + }; + + virtual void control(const struct params_s ¶ms, const struct input_s &input, struct output_s &output) = 0; + +private: + ros::NodeHandle nh_; + ros::NodeHandle nh_private_; + ros::Subscriber vehicle_state_sub_; + ros::Subscriber controller_commands_sub_; + ros::Publisher actuators_pub_; + ros::Publisher internals_pub_; + ros::Timer act_pub_timer_; + + struct params_s params_; /**< params */ + rosplane_msgs::Controller_Commands controller_commands_; + rosplane_msgs::State vehicle_state_; + + void vehicle_state_callback(const rosplane_msgs::StateConstPtr &msg); + void controller_commands_callback(const rosplane_msgs::Controller_CommandsConstPtr &msg); + bool command_recieved_; + + dynamic_reconfigure::Server server_; + dynamic_reconfigure::Server::CallbackType func_; + + void reconfigure_callback(rosplane::ControllerConfig &config, uint32_t level); + + /** + * Convert from deflection angle to pwm + */ + void convert_to_pwm(struct output_s &output); + + /** + * Publish the outputs + */ + void actuator_controls_publish(const ros::TimerEvent &); +}; +} //end namespace + +#endif // CONTROLLER_BASE99_H diff --git a/Flight_control/src/enemy_suv/suv_move/include/controller_example.h b/Flight_control/src/enemy_suv/suv_move/include/controller_example.h new file mode 100644 index 0000000..4022a33 --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/include/controller_example.h @@ -0,0 +1,53 @@ +#ifndef CONTROLLER_EXAMPLE_H +#define CONTROLLER_EXAMPLE_H + +#include "controller_base.h" + +namespace rosplane +{ + +class controller_example : public controller_base +{ +public: + controller_example(); +private: + virtual void control(const struct params_s ¶ms, const struct input_s &input, struct output_s &output); + alt_zones current_zone; + + float course_hold(float chi_c, float chi, float phi_ff, float r, const struct params_s ¶ms, float Ts); + float c_error_; + float c_integrator_; + + float roll_hold(float phi_c, float phi, float p, const struct params_s ¶ms, float Ts); + float r_error_; + float r_integrator; + + float pitch_hold(float theta_c, float theta, float q, const struct params_s ¶ms, float Ts); + float p_error_; + float p_integrator_; + + float airspeed_with_pitch_hold(float Va_c, float Va, const struct params_s ¶ms, float Ts); + float ap_error_; + float ap_integrator_; + float ap_differentiator_; + + float airspeed_with_throttle_hold(float Va_c, float Va, const struct params_s ¶ms, float Ts); + float at_error_; + float at_integrator_; + float at_differentiator_; + + float altitiude_hold(float h_c, float h, const struct params_s ¶ms, float Ts); + float a_error_; + float a_integrator_; + float a_differentiator_; + +// float cooridinated_turn_hold(float v, const struct params_s ¶ms, float Ts); +// float ct_error_; +// float ct_integrator_; +// float ct_differentiator_; + + float sat(float value, float up_limit, float low_limit); +}; +} //end namespace + +#endif // CONTROLLER_EXAMPLE_H diff --git a/Flight_control/src/enemy_suv/suv_move/include/controller_example99.h b/Flight_control/src/enemy_suv/suv_move/include/controller_example99.h new file mode 100644 index 0000000..ed2afe0 --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/include/controller_example99.h @@ -0,0 +1,56 @@ +#ifndef CONTROLLER_EXAMPLE99_H +#define CONTROLLER_EXAMPLE99_H + +#include "controller_base99.h" + +namespace rosplane +{ + +class controller_example99 : public controller_base99 +{ +public: + controller_example99(); +private: + virtual void control(const struct params_s ¶ms, const struct input_s &input, struct output_s &output); + alt_zones current_zone; + + float course_hold(float chi_c, float chi, float phi_ff, float r, const struct params_s ¶ms, float Ts); + float c_error_; + float c_integrator_; + + float roll_hold(float phi_c, float phi, float p, const struct params_s ¶ms, float Ts); + float r_error_; + float r_integrator; + + float pitch_hold(float theta_c, float theta, float q, const struct params_s ¶ms, float Ts); + float p_error_; + float p_integrator_; + + float airspeed_with_pitch_hold(float Va_c, float Va, const struct params_s ¶ms, float Ts); + float ap_error_; + float ap_integrator_; + float ap_differentiator_; + + float decend_airspeed_with_pitch_hold(float h_c, float h, const struct params_s ¶ms, float Ts); + float decend_airspeed_oil(float h_c, float h, const params_s ¶ms, float Ts); + + float airspeed_with_throttle_hold(float Va_c, float Va, const struct params_s ¶ms, float Ts); + float at_error_; + float at_integrator_; + float at_differentiator_; + + float altitiude_hold(float h_c, float h, const struct params_s ¶ms, float Ts); + float a_error_; + float a_integrator_; + float a_differentiator_; + +// float cooridinated_turn_hold(float v, const struct params_s ¶ms, float Ts); +// float ct_error_; +// float ct_integrator_; +// float ct_differentiator_; + + float sat(float value, float up_limit, float low_limit); +}; +} //end namespace + +#endif // CONTROLLER_EXAMPLE99_H diff --git a/Flight_control/src/enemy_suv/suv_move/include/estimator_base.h b/Flight_control/src/enemy_suv/suv_move/include/estimator_base.h new file mode 100644 index 0000000..39aeb4d --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/include/estimator_base.h @@ -0,0 +1,131 @@ +/** + * @file estimator_base.h + * + * Base class definition for autopilot estimator in chapter 8 of UAVbook, see http://uavbook.byu.edu/doku.php + * + * @author Gary Ellingson + */ + +#ifndef ESTIMATOR_BASE_H +#define ESTIMATOR_BASE_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define EARTH_RADIUS 6378145.0f + +namespace rosplane +{ + + +class estimator_base +{ +public: + estimator_base(); + +protected: + + struct input_s + { + float gyro_x; + float gyro_y; + float gyro_z; + float accel_x; + float accel_y; + float accel_z; + float static_pres; + float diff_pres; + bool gps_new; + float gps_n; + float gps_e; + float gps_h; + float gps_Vg; + float gps_course; + bool status_armed; + bool armed_init; + }; + + struct output_s + { + float pn; + float pe; + float h; + float Va; + float alpha; + float beta; + float phi; + float theta; + float psi; + float chi; + float p; + float q; + float r; + float Vg; + float wn; + float we; + }; + + struct params_s + { + double gravity; + double rho; + double sigma_accel; + double sigma_n_gps; + double sigma_e_gps; + double sigma_Vg_gps; + double sigma_course_gps; + double Ts; + }; + + virtual void estimate(const struct params_s ¶ms, const struct input_s &input, struct output_s &output) = 0; + +private: + ros::NodeHandle nh_; + ros::NodeHandle nh_private_; + ros::Publisher vehicle_state_pub_; + ros::Subscriber gps_sub_; + ros::Subscriber imu_sub_; + ros::Subscriber baro_sub_; + ros::Subscriber airspeed_sub_; + ros::Subscriber status_sub_; + + void update(const ros::TimerEvent &); + void gpsCallback(const rosflight_msgs::GPS &msg); + void imuCallback(const sensor_msgs::Imu &msg); + void baroAltCallback(const rosflight_msgs::Barometer &msg); + void airspeedCallback(const rosflight_msgs::Airspeed &msg); + void statusCallback(const rosflight_msgs::Status &msg); + + double update_rate_; + ros::Timer update_timer_; + std::string gps_topic_; + std::string imu_topic_; + std::string baro_topic_; + std::string airspeed_topic_; + std::string status_topic_; + + bool gps_new_; + bool gps_init_; + double init_lat_; /**< Initial latitude in degrees */ + double init_lon_; /**< Initial longitude in degrees */ + float init_alt_; /**< Initial altitude in meters above MSL */ + bool armed_first_time_; /**< Arm before starting estimation */ + bool baro_init_; /**< Initial barometric pressure */ + float init_static_; /**< Initial static pressure (mbar) */ + int baro_count_; /**< Used to grab the first set of baro measurements */ + std::vector init_static_vector_; /**< Used to grab the first set of baro measurements */ + + struct params_s params_; + struct input_s input_; +}; + +} //end namespace + +#endif // ESTIMATOR_BASE_H diff --git a/Flight_control/src/enemy_suv/suv_move/include/estimator_base_99pub.h b/Flight_control/src/enemy_suv/suv_move/include/estimator_base_99pub.h new file mode 100644 index 0000000..2e5102e --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/include/estimator_base_99pub.h @@ -0,0 +1,45 @@ + +// modified by kobe and zhangshuai + +#ifndef ESTIMATOR_BASE_PUB_H +#define ESTIMATOR_BASE_PUB_H + +#include +#include +#include +#include +#include + +#define EARTH_RADIUS 6378145.0f + +namespace rosplane +{ +class estimator_base_99pub +{ +public: + estimator_base_99pub(); + +protected: + +private: + ros::NodeHandle nh_; + ros::NodeHandle nh_private_; + ros::Publisher vehicle_state99_pub_; + ros::Subscriber true_state_sub_; + + void update(const ros::TimerEvent &); + void truestateCallback(const rosplane_msgs::StateConstPtr &msg); + + double update_rate_; + ros::Timer update_timer_; + + std::string truth_topic_; + + bool state_init_; + rosplane_msgs::State true_state_; + +}; + +} //end namespace + +#endif // diff --git a/Flight_control/src/enemy_suv/suv_move/include/estimator_base_statesub.h b/Flight_control/src/enemy_suv/suv_move/include/estimator_base_statesub.h new file mode 100644 index 0000000..cfcc631 --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/include/estimator_base_statesub.h @@ -0,0 +1,46 @@ +// modified by kobe and zhangshuai + +#ifndef ESTIMATOR_BASE_SUB_H +#define ESTIMATOR_BASE_SUB_H + +#include +#include +#include //采用新的消息头文件 + +#include +#include + +#define EARTH_RADIUS 6378145.0f + +namespace rosplane +{ +class estimator_base_statesub +{ +public: + estimator_base_statesub(); + +protected: + +private: + ros::NodeHandle nh_; + ros::NodeHandle nh_private_; + ros::Publisher vehicle_state_pub_; + ros::Subscriber state29_sub_; + void update(const ros::TimerEvent &); + void state99Callback(const rosplane_msgs::State29ConstPtr &msg); + + double update_rate_; + ros::Timer update_timer_; + std::string state29_topic_; + + double init_lat_; /**< Initial latitude in degrees */ + double init_lon_; /**< Initial longitude in degrees */ + float init_alt_; /**< Initial altitude in meters above MSL */ + + bool state_init_; + rosplane_msgs::State29 state29_; +}; + +} //end namespace + +#endif // diff --git a/Flight_control/src/enemy_suv/suv_move/include/estimator_base_updata_statesub.h b/Flight_control/src/enemy_suv/suv_move/include/estimator_base_updata_statesub.h new file mode 100644 index 0000000..0d26f5d --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/include/estimator_base_updata_statesub.h @@ -0,0 +1,46 @@ +// modified by kobe + +#ifndef ESTIMATOR_BASE_UPDATA_SUB_H +#define ESTIMATOR_BASE_UPDATA_SUB_H + +#include +#include +#include + +#include +#include + +#define EARTH_RADIUS 6378145.0f + +namespace rosplane +{ +class estimator_base_updata_statesub +{ +public: + estimator_base_updata_statesub(); + +protected: + +private: + ros::NodeHandle nh_; + ros::NodeHandle nh_private_; + ros::Publisher vehicle_state_pub_; + ros::Subscriber state29_sub_; + void update(const ros::TimerEvent &); + void state99Callback(const rosplane_msgs::Up_Data_NewConstPtr &msg); + + double update_rate_; + ros::Timer update_timer_; + std::string state29_topic_; + + double init_lat_; /**< Initial latitude in degrees */ + double init_lon_; /**< Initial longitude in degrees */ + float init_alt_; /**< Initial altitude in meters above MSL */ + + bool state_init_; + rosplane_msgs::Up_Data_New state29_; +}; + +} //end namespace + +#endif // diff --git a/Flight_control/src/enemy_suv/suv_move/include/estimator_example.h b/Flight_control/src/enemy_suv/suv_move/include/estimator_example.h new file mode 100644 index 0000000..1df030a --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/include/estimator_example.h @@ -0,0 +1,73 @@ +#ifndef ESTIMATOR_EXAMPLE_H +#define ESTIMATOR_EXAMPLE_H + +#include "estimator_base.h" + +#include +#include + +namespace rosplane +{ + +class estimator_example : public estimator_base +{ +public: + estimator_example(); + +private: + virtual void estimate(const params_s ¶ms, const input_s &input, output_s &output); + +// float gps_n_old_; +// float gps_e_old_; +// float gps_Vg_old_; +// float gps_course_old_; + + double lpf_a_; + float alpha_; + float alpha1_; + int N_; + + float lpf_gyro_x_; + float lpf_gyro_y_; + float lpf_gyro_z_; + float lpf_static_; + float lpf_diff_; + float lpf_accel_x_; + float lpf_accel_y_; + float lpf_accel_z_; + + float phat_; + float qhat_; + float rhat_; + float Vwhat_; + float phihat_; + float thetahat_; + float psihat_; + Eigen::Vector2f xhat_a_; // 2 + Eigen::Matrix2f P_a_; // 2x2 + + Eigen::VectorXf xhat_p_; // 7 + Eigen::MatrixXf P_p_; // 7x7 + + Eigen::Matrix2f Q_a_; // 2x2 + float R_accel_; + Eigen::Vector2f f_a_; // 2 + Eigen::Matrix2f A_a_; // 2x2 + float h_a_; + Eigen::Vector2f C_a_; // 2 + Eigen::Vector2f L_a_; // 2 + + Eigen::MatrixXf Q_p_; // 7x7 + Eigen::MatrixXf R_p_; // 6x6 + Eigen::VectorXf f_p_; // 7 + Eigen::MatrixXf A_p_; // 7x7 + float h_p_; + Eigen::VectorXf C_p_; // 7 + Eigen::VectorXf L_p_; // 7 + + void check_xhat_a(); + +}; +} //end namespace + +#endif // ESTIMATOR_EXAMPLE_H diff --git a/Flight_control/src/enemy_suv/suv_move/include/path_follower_base.h b/Flight_control/src/enemy_suv/suv_move/include/path_follower_base.h new file mode 100644 index 0000000..9f7296d --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/include/path_follower_base.h @@ -0,0 +1,103 @@ +//* @author AIRC-DA group,questions contack kobe. + +#ifndef PATH_FOLLOWER_BASE_H +#define PATH_FOLLOWER_BASE_H + +#include +#include +#include +#include +#include +#include +#include +#define EARTH_RADIUS 6378145.0f +namespace rosplane +{ + +enum class path_type +{ + Orbit, + Line, + Star //add by kobe +}; + +class path_follower_base +{ +public: + path_follower_base(); + float spin(); + +protected: + + struct input_s + { + enum path_type p_type; + float Va_d; + float r_path[3]; + float q_path[3]; + float c_orbit[3]; + float rho_orbit; + int lam_orbit; + float pn; /** position north */ + float pe; /** position east */ + float h; /** altitude */ + float Va; /** airspeed */ + float chi; /** course angle */ + float h_c_path; /** goal attitude */ + float Va_c_path; /** goal attitude */ + bool landing; + bool takeoff; + }; + + struct output_s + { + double Va_c; /** commanded airspeed (m/s) */ + double h_c; /** commanded altitude (m) */ + double chi_c; /** commanded course (rad) */ + double phi_ff; /** feed forward term for orbits (rad) */ + }; + + struct params_s + { + double chi_infty; + double k_path; + double k_orbit; + }; + + virtual void follow(const struct params_s ¶ms, const struct input_s &input, struct output_s &output) = 0; + +private: + ros::NodeHandle nh_; + ros::NodeHandle nh_private_; + ros::Subscriber vehicle_state_sub_; + ros::Subscriber bebop1_state_sub_; + ros::Subscriber current_path_sub_; + + ros::Publisher controller_commands_pub_; + + double update_rate_ = 100.0; + ros::Timer update_timer_; + + rosplane_msgs::Controller_Commands controller_commands_; + struct params_s params_; /**< params */ + struct input_s input_; + + void vehicle_state_callback(const rosplane_msgs::StateConstPtr &msg); + bool state_init_; + + void bebop1_state_callback(const nav_msgs::Odometry::ConstPtr &msg); + float Quaternion_to_Euler(float,float,float,float); + + void current_path_callback(const rosplane_msgs::Current_PathConstPtr &msg); + bool current_path_init_; + + dynamic_reconfigure::Server server_; + dynamic_reconfigure::Server::CallbackType func_; + void reconfigure_callback(rosplane::FollowerConfig &config, uint32_t level); + + void update(const ros::TimerEvent &); +}; + +} // end namespace + +#endif // PATH_FOLLOWER_BASE_H diff --git a/Flight_control/src/enemy_suv/suv_move/include/path_follower_example.h b/Flight_control/src/enemy_suv/suv_move/include/path_follower_example.h new file mode 100644 index 0000000..1df47ae --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/include/path_follower_example.h @@ -0,0 +1,18 @@ +#ifndef PATH_FOLLOWER_EXAMPLE_H +#define PATH_FOLLOWER_EXAMPLE_H + +#include "path_follower_base.h" + +namespace rosplane +{ + +class path_follower_example : public path_follower_base +{ +public: + path_follower_example(); +private: + virtual void follow(const struct params_s ¶ms, const struct input_s &input, struct output_s &output); +}; + +} //end namespace +#endif // PATH_FOLLOWER_EXAMPLE_H diff --git a/Flight_control/src/enemy_suv/suv_move/include/path_manager_base.h b/Flight_control/src/enemy_suv/suv_move/include/path_manager_base.h new file mode 100644 index 0000000..0e9b547 --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/include/path_manager_base.h @@ -0,0 +1,122 @@ +//* @author AIRC-DA group,questions contack kobe. + +#ifndef PATH_MANAGER_BASE_H +#define PATH_MANAGER_BASE_H + +#include +#include +#include +#include +#include +// #include +#include +#include +#include +#include +#include +#include +#include +// #include +#include +#define EARTH_RADIUS 6378145.0f +namespace rosplane +{ +class path_manager_base +{ +public: + path_manager_base(); + +protected: + //modified by kobe + + struct waypoint_s + { + float w[3]; + float lat; + float lon; + float chi_d; + bool chi_valid; + float Va_d; + bool landing; + bool takeoff; + }; + + std::vector waypoints_; + + waypoint_s waypoint_start_; + waypoint_s waypoint_end_; + bool waypoint_received_; + + int num_waypoints_; + int idx_a_; /** index to the waypoint that was most recently achieved */ + + float min_distance_; + double min_distance_titude; + bool show; //add by kobe + bool show2; + struct input_s + { + float pn; /** position north */ + float pe; /** position east */ + float lat; //latitude + float lon; //lontitude + float h; /** altitude */ + float chi; /** course angle */ + float va; //add by kobe + }; + + struct output_s + { + float Va_c; + int flag; /** Inicates strait line or orbital path (1 is line, 0 is orbit, 2 is star) modified by kobe*/ + float Va_d; /** Desired airspeed (m/s) */ + float r[3]; /** Vector to origin of straight line path (m) */ + float q[3]; /** Unit vector, desired direction of travel for line path */ + float c[3]; /** Center of orbital path (m) */ + float gxy[2]; /** x-y-coordinate (m) */ + float gll[2]; /** latitude-longtitude */ + float rho; /** Radius of orbital path (m) */ + float h_c; + bool landing; + bool takeoff; + int8_t lambda; /** Direction of orbital path (cw is 1, ccw is -1) */ +}; + + struct params_s + { + double R_min; + }; + + virtual void manage(const struct params_s ¶ms, const struct input_s &input, struct output_s &output) = 0; + +private: + + ros::NodeHandle nh_; + ros::NodeHandle nh_private_; + ros::Subscriber vehicle_state_sub_; /**< vehicle state subscription */ + ros::Subscriber bebop1_state_sub_; + + ros::Subscriber new_waypoint_sub_; /**< new waypoint subscription */ + ros::Publisher current_path_pub_; /**< controller commands publication */ + ros::Publisher goal_info_pub_; /**< goal info publication */ + ros::Publisher down_data_pub_; + ros::Subscriber waypoint_received_sub_; + struct params_s params_; + + rosplane_msgs::State vehicle_state_; /**< vehicle state */ + nav_msgs::Odometry bebop1_state_; + + double update_rate_; + ros::Timer update_timer_; + + void vehicle_state_callback(const rosplane_msgs::StateConstPtr &msg); + void bebop1_state_callback(const nav_msgs::Odometry::ConstPtr &msg); + float Quaternion_to_Euler(float,float,float,float); + + bool state_init_; + void new_waypoint_callback(const rosplane_msgs::Waypoint &msg); + void current_path_publish(const ros::TimerEvent &); + void waypoint_received_callback(const rosplane_msgs::Waypoint &msg); +}; +} //end namespace +#endif // PATH_MANAGER_BASE_H diff --git a/Flight_control/src/enemy_suv/suv_move/include/path_manager_example.h b/Flight_control/src/enemy_suv/suv_move/include/path_manager_example.h new file mode 100644 index 0000000..90dc1af --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/include/path_manager_example.h @@ -0,0 +1,78 @@ +#ifndef PATH_MANAGER_EXAMPLE_H +#define PATH_MANAGER_EXAMPLE_H + +#include "path_manager_base.h" +#include +//#include + + +#define M_PI_F 3.14159265358979323846f +#define M_PI_2_F 1.57079632679489661923f +namespace rosplane +{ +enum class fillet_state +{ + STRAIGHT, + ORBIT +}; + +enum class dubin_state +{ + FIRST, + BEFORE_H1, + BEFORE_H1_WRONG_SIDE, + STRAIGHT, + BEFORE_H3, + BEFORE_H3_WRONG_SIDE +}; + +class path_manager_example : public path_manager_base +{ +public: + path_manager_example(); +private: + virtual void manage(const struct params_s ¶ms, const struct input_s &input, struct output_s &output); + + void manage_line(const struct params_s ¶ms, const struct input_s &input, struct output_s &output); + void manage_star(const struct params_s ¶ms, const struct input_s &input, struct output_s &output);//add by kobe + void manage_fillet(const struct params_s ¶ms, const struct input_s &input, struct output_s &output); + fillet_state fil_state_; + void manage_dubins(const struct params_s ¶ms, const struct input_s &input, struct output_s &output); + dubin_state dub_state_; + double earth_distance(double, double, double, double); + + bool judge_condition1; + bool judge_condition2; + bool judge_condition3; + bool judge_condition4; + bool judge_condition5; + struct dubinspath_s + { + + Eigen::Vector3f ps; /** the start position */ + float chis; /** the start course angle */ + Eigen::Vector3f pe; /** the end position */ + float chie; /** the end course angle */ + float R; /** turn radius */ + float L; /** length of the path */ + Eigen::Vector3f cs; /** center of the start circle */ + int lams; /** direction of the start circle */ + Eigen::Vector3f ce; /** center of the endcircle */ + int lame; /** direction of the end circle */ + Eigen::Vector3f w1; /** vector defining half plane H1 */ + Eigen::Vector3f q1; /** unit vector along striaght line path */ + Eigen::Vector3f w2; /** vector defining half plane H2 */ + Eigen::Vector3f w3; /** vector defining half plane H3 */ + Eigen::Vector3f q3; /** unit vector defining direction of half plane H3 */ + }; + + + + struct dubinspath_s dubinspath_; + void dubinsParameters(const struct waypoint_s start_node, const struct waypoint_s end_node, float R); + + Eigen::Matrix3f rotz(float theta); + float mo(float in); +}; +} //end namespace +#endif // PATH_MANAGER_EXAMPLE_H diff --git a/Flight_control/src/enemy_suv/suv_move/include/pseudo_controller_base.h b/Flight_control/src/enemy_suv/suv_move/include/pseudo_controller_base.h new file mode 100644 index 0000000..b716c5b --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/include/pseudo_controller_base.h @@ -0,0 +1,137 @@ +/** + * + * Refer autopilot controller in chapter 6 of UAVbook, see http://uavbook.byu.edu/doku.php + *pseudo fix-wing 四旋翼模拟固定翼飞行,订阅当前实际及命令的速度、高度和角度,发布向前,向上下速度和角度 + * @author AIRC-DA group,questions contack kobe. + */ + +#ifndef PSEUDO_CONTROLLER_BASE_H +#define PSEUDO_CONTROLLER_BASE_H + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace rosplane +{ + +enum class alt_zones +{ + PREPARE, + TAKE_OFF, + CLIMB, + DESCEND, + ALTITUDE_HOLD, + LANDING +}; + +class pseudo_controller_base +{ +public: + pseudo_controller_base(); + float spin(); + +protected: + + struct input_s + { + float Ts; /** time step */ + float va; /** airspeed */ + float h; /** altitude */ + float chi; /** course angle */ + float Va_c; /** commanded airspeed (m/s) */ + float h_c; /** commanded altitude (m) */ + float chi_c; /** commanded course (north)(-pi to pi,clockwise:-) */ + bool takeoff; + bool landing; + }; + + struct output_s + { + //float theta_c; //俯仰角--即平行于机身轴线并指向飞行器前方的向量与地面的夹角 + //float phi_c; //滚转角--机体坐标系OZb轴与通过机体OXb轴的铅垂面间的夹角,机体向右滚为正,反之为负 + //float delta_a; //副翼偏移量-转弯用-副翼跳变造成油门和升降舵数值的波动 + //float delta_e; //升降舵偏移量-拉高降低 + //float delta_r; //方向舵偏移量-保持稳定,消除测滑 + //float delta_t; //油门偏移量 + float forward_trans; //前进力度 + float up_down_trans; //向上、向下力度,上正下负 + float left_right_trans; //向左右力度,左正右负 + float roll_trans; //左右滚转,x轴,逆时针为正,顺时针为负,[-pi/2,pi/2] + float rotate_trans; //z旋转,逆时针为正,顺时针为负,[-pi/2,pi/2] + float rotate_value; + alt_zones current_zone; + }; + + struct params_s + { + double alt_hz; /**< altitude hold zone */ + double alt_toz; /**< altitude takeoff zone */ + double tau; + double c_kp; + //double c_kd; + double c_ki; + + double a_p_kp; + double a_p_kd; + double a_p_ki; + + double a_t_ki; + double a_t_kp; + double a_t_kd; + + double a_kp; + double a_kd; + double a_ki; + + double trim_t; + //double max_a;y + double max_t; + }; + bool reached; + virtual void control(const struct params_s ¶ms, const struct input_s &input, struct output_s &output) = 0; + +private: + ros::NodeHandle nh_; + ros::NodeHandle nh_private_; + ros::Subscriber vehicle_state_sub_; + ros::Subscriber bebop1_state_sub_; + + ros::Subscriber controller_commands_sub_; + ros::Publisher pesudors_pub_;//actuators + ros::Publisher internals_pub_; + ros::Timer act_pub_timer_; + + struct params_s params_; /**< params */ + rosplane_msgs::Controller_Commands controller_commands_; + rosplane_msgs::State vehicle_state_; + nav_msgs::Odometry bebop1_state_; + + void vehicle_state_callback(const rosplane_msgs::StateConstPtr &msg); + void bebop1_state_callback(const nav_msgs::Odometry::ConstPtr &msg); + float Quaternion_to_Euler(float,float,float,float); + + void controller_commands_callback(const rosplane_msgs::Controller_CommandsConstPtr &msg); + bool command_recieved_; + + dynamic_reconfigure::Server server_; + dynamic_reconfigure::Server::CallbackType func_; + + void reconfigure_callback(rosplane::ControllerConfig &config, uint32_t level); + + /*Convert from deflection angle to pwm*/ + //void convert_to_pwm(struct output_s &output); + + /* Publish the outputs */ + void actuator_controls_publish(const ros::TimerEvent &); +}; +} //end namespace + +#endif // PSEUDO_CONTROLLER_BASE_H diff --git a/Flight_control/src/enemy_suv/suv_move/include/pseudo_controller_example.h b/Flight_control/src/enemy_suv/suv_move/include/pseudo_controller_example.h new file mode 100644 index 0000000..1bd751e --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/include/pseudo_controller_example.h @@ -0,0 +1,66 @@ +#ifndef PSEUDO_CONTROLLER_EXAMPLE_H +#define PSEUDO_CONTROLLER_EXAMPLE_H + +#include "pseudo_controller_base.h" + +namespace rosplane +{ + +class pseudo_controller_example : public pseudo_controller_base +{ +public: + pseudo_controller_example(); +private: + virtual void control(const struct params_s ¶ms, const struct input_s &input, struct output_s &output); + alt_zones current_zone; + + float pseudo_course_hold(float chi,float chi_c, const params_s ¶ms, float Ts); + //float course_hold(float chi_c, float chi, float phi_ff, float r, const struct params_s ¶ms, float Ts); + float c_error_; + float c_integrator_; + + + float r_error_; + float r_integrator_; + + + //float roll_hold(float phi_c, float phi, float p, const struct params_s ¶ms, float Ts); + //float r_error_; + //float r_integrator_; + + //float pitch_hold(float theta_c, float theta, float q, const struct params_s ¶ms, float Ts); + //float p_error_; + //float p_integrator_; + + + float pseudo_course(float chi, float chi_c); + float pseudo_left_right(float chi, float chi_c, float forward_trans); + + //float airspeed_with_pitch_hold(float Va_c, float Va, const struct params_s ¶ms, float Ts); + float pseudo_pitch_hold(float h_c, float h, const struct params_s ¶ms, float Ts); + float ap_error_; + float ap_integrator_; + float ap_differentiator_; + + //float airspeed_with_throttle_hold(float Va_c, float Va, const struct params_s ¶ms, float Ts); + float pseudo_throttle_hold(float Va_c, float Va, const params_s ¶ms, float Ts); + float at_error_; + float at_integrator_; + float at_differentiator_; + + //float altitiude_hold(float h_c, float h, const struct params_s ¶ms, float Ts); + float pseudo_altitiude_hold(float h_c, float h, const params_s ¶ms, float Ts); + float a_error_; + float a_integrator_; + float a_differentiator_; + +// float cooridinated_turn_hold(float v, const struct params_s ¶ms, float Ts); +// float ct_error_; +// float ct_integrator_; +// float ct_differentiator_; + + float sat(float value, float up_limit, float low_limit); +}; +} //end namespace + +#endif // PSEUDO_CONTROLLER_EXAMPLE_H diff --git a/Flight_control/src/enemy_suv/suv_move/package.xml b/Flight_control/src/enemy_suv/suv_move/package.xml new file mode 100644 index 0000000..8387ad5 --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/package.xml @@ -0,0 +1,33 @@ + + + suv_move + 0.0.0 + The suv_move package + + Gary Ellingson + + Gary Ellingson + + BSD + + catkin + cmake_modules + dynamic_reconfigure + rosflight_msgs + rosplane_msgs + roscpp + rospy + sensor_msgs + geometry_msgs + dynamic_reconfigure + rosflight_msgs + rosplane_msgs + roscpp + rospy + sensor_msgs + geometry_msgs + + + + + diff --git a/Flight_control/src/enemy_suv/suv_move/param/aerosonde.yaml b/Flight_control/src/enemy_suv/suv_move/param/aerosonde.yaml new file mode 100644 index 0000000..7339e54 --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/param/aerosonde.yaml @@ -0,0 +1,33 @@ +TRIM_E: 0 +TRIM_A: 0 +TRIM_R: 0 +TRIM_T: 0.6 + +COURSE_KP: 0.7329 +COURSE_KD: 0 +COURSE_KI: 0.07 + +ROLL_KP: 1.17 +ROLL_KD: -0.13 +ROLL_KI: 0 + +PITCH_KP: 0.1 +PITCH_KD: -0.017 +PITCH_KI: 0 +PITCH_FF: 0 + +AS_PITCH_KP: -0.0713 +AS_PITCH_KD: -0.0635 +AS_PITCH_KI: 0 + +AS_THR_KP: 3.2 +AS_THR_KD: 0 +AS_THR_KI: 1.0 + +ALT_KP: 0.045 +ALT_KD: 0 +ALT_KI: 0.01 + +BETA_KP: -0.1164 +BETA_KD: 0 +BETA_KI: -0.0037111 diff --git a/Flight_control/src/enemy_suv/suv_move/param/bixler.yaml b/Flight_control/src/enemy_suv/suv_move/param/bixler.yaml new file mode 100644 index 0000000..b1ab278 --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/param/bixler.yaml @@ -0,0 +1,41 @@ +TRIM_E: 0 +TRIM_A: 0 +TRIM_R: 0 +TRIM_T: 0.6 + +COURSE_KP: 0.7329 +COURSE_KD: 0 +COURSE_KI: 0.0 + +ROLL_KP: 1.2855 +ROLL_KD: -0.1 +ROLL_KI: 0 + +PITCH_KP: 1.0 +PITCH_KD: -0.17 +PITCH_KI: 0 +PITCH_FF: 0 + +AS_PITCH_KP: -0.0713 +AS_PITCH_KD: -0.0635 +AS_PITCH_KI: 0 + + +AS_THR_KP: 3.2 +AS_THR_KD: 0 +AS_THR_KI: 1.0 + + +ALT_KP: 0.045 +ALT_KD: 0 +ALT_KI: 0.01 + + +BETA_KP: -0.1164 +BETA_KD: 0 +BETA_KI: -0.0037111 + + +CHI_INFTY: 1.0472 +K_PATH: 0.025 +K_ORBIT: 2.00 diff --git a/Flight_control/src/enemy_suv/suv_move/src/controller_base.cpp b/Flight_control/src/enemy_suv/suv_move/src/controller_base.cpp new file mode 100644 index 0000000..e5ca807 --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/src/controller_base.cpp @@ -0,0 +1,203 @@ +#include "controller_base.h" +#include "controller_example.h" + +namespace rosplane +{ + +controller_base::controller_base(): + nh_(ros::NodeHandle()), + nh_private_(ros::NodeHandle()) +{ + vehicle_state_sub_ = nh_.subscribe("state", 10, &controller_base::vehicle_state_callback, this); + controller_commands_sub_ = nh_.subscribe("controller_commands", 10, &controller_base::controller_commands_callback, + this); + + memset(&vehicle_state_, 0, sizeof(vehicle_state_)); + memset(&controller_commands_, 0, sizeof(controller_commands_)); + + nh_private_.param("TRIM_E", params_.trim_e, 0.0); + nh_private_.param("TRIM_A", params_.trim_a, 0.0); + nh_private_.param("TRIM_R", params_.trim_r, 0.0); + nh_private_.param("TRIM_T", params_.trim_t, 0.6); + nh_private_.param("PWM_RAD_E", params_.pwm_rad_e, 1.0); + nh_private_.param("PWM_RAD_A", params_.pwm_rad_a, 1.0); + nh_private_.param("PWM_RAD_R", params_.pwm_rad_r, 1.0); + nh_private_.param("ALT_TOZ", params_.alt_toz, 20.0); /**< altitude takeoff zone */ + nh_private_.param("ALT_HZ", params_.alt_hz, 10.0); /**< altitude hold zone */ + nh_private_.param("TAU", params_.tau, 5.0); + nh_private_.param("COURSE_KP", params_.c_kp, 0.7329); + nh_private_.param("COURSE_KD", params_.c_kd, 0.0); + nh_private_.param("COURSE_KI", params_.c_ki, 0.0); + nh_private_.param("ROLL_KP", params_.r_kp, 1.2855); + nh_private_.param("ROLL_KD", params_.r_kd, -0.325); + nh_private_.param("ROLL_KI", params_.r_ki, 0.0);//0.10f); + nh_private_.param("PITCH_KP", params_.p_kp, 1.0); + nh_private_.param("PITCH_KD", params_.p_kd, -0.17); + nh_private_.param("PITCH_KI", params_.p_ki, 0.0); + nh_private_.param("PITCH_FF", params_.p_ff, 0.0); + nh_private_.param("AS_PITCH_KP", params_.a_p_kp, -0.0713); + nh_private_.param("AS_PITCH_KD", params_.a_p_kd, -0.0635); + nh_private_.param("AS_PITCH_KI", params_.a_p_ki, 0.0); + nh_private_.param("AS_THR_KP", params_.a_t_kp, 3.2); + nh_private_.param("AS_THR_KD", params_.a_t_kd, 0.0); + nh_private_.param("AS_THR_KI", params_.a_t_ki, 0.0); + nh_private_.param("ALT_KP", params_.a_kp, 0.045); + nh_private_.param("ALT_KD", params_.a_kd, 0.0); + nh_private_.param("ALT_KI", params_.a_ki, 0.01); + nh_private_.param("BETA_KP", params_.b_kp, -0.1164); + nh_private_.param("BETA_KD", params_.b_kd, 0.0); + nh_private_.param("BETA_KI", params_.b_ki, -0.0037111); + nh_private_.param("MAX_E", params_.max_e, 0.610); + nh_private_.param("MAX_A", params_.max_a, 0.523); + nh_private_.param("MAX_R", params_.max_r, 0.523); + nh_private_.param("MAX_T", params_.max_t, 1.0); + + func_ = boost::bind(&controller_base::reconfigure_callback, this, _1, _2); + server_.setCallback(func_); + + actuators_pub_ = nh_.advertise("command", 10); + internals_pub_ = nh_.advertise("controller_inners", 10); + act_pub_timer_ = nh_.createTimer(ros::Duration(1.0/100.0), &controller_base::actuator_controls_publish, this); + + command_recieved_ = false; +} + +void controller_base::vehicle_state_callback(const rosplane_msgs::StateConstPtr &msg) +{ + vehicle_state_ = *msg; +} + +void controller_base::controller_commands_callback(const rosplane_msgs::Controller_CommandsConstPtr &msg) +{ + command_recieved_ = true; + controller_commands_ = *msg; +} + +void controller_base::reconfigure_callback(rosplane::ControllerConfig &config, uint32_t level) +{ + params_.trim_e = config.TRIM_E; + params_.trim_a = config.TRIM_A; + params_.trim_r = config.TRIM_R; + params_.trim_t = config.TRIM_T; + + params_.c_kp = config.COURSE_KP; + params_.c_kd = config.COURSE_KD; + params_.c_ki = config.COURSE_KI; + + params_.r_kp = config.ROLL_KP; + params_.r_kd = config.ROLL_KD; + params_.r_ki = config.ROLL_KI; + + params_.p_kp = config.PITCH_KP; + params_.p_kd = config.PITCH_KD; + params_.p_ki = config.PITCH_KI; + params_.p_ff = config.PITCH_FF; + + params_.a_p_kp = config.AS_PITCH_KP; + params_.a_p_kd = config.AS_PITCH_KD; + params_.a_p_ki = config.AS_PITCH_KI; + + params_.a_t_kp = config.AS_THR_KP; + params_.a_t_kd = config.AS_THR_KD; + params_.a_t_ki = config.AS_THR_KI; + + params_.a_kp = config.ALT_KP; + params_.a_kd = config.ALT_KD; + params_.a_ki = config.ALT_KI; + + params_.b_kp = config.BETA_KP; + params_.b_kd = config.BETA_KD; + params_.b_ki = config.BETA_KI; +} + +void controller_base::convert_to_pwm(controller_base::output_s &output) +{ + output.delta_e = output.delta_e*params_.pwm_rad_e; + output.delta_a = output.delta_a*params_.pwm_rad_a; + output.delta_r = output.delta_r*params_.pwm_rad_r; +} + +void controller_base::actuator_controls_publish(const ros::TimerEvent &) +{ + struct input_s input; + input.h = -vehicle_state_.position[2]; + input.va = vehicle_state_.Va; + input.phi = vehicle_state_.phi; + input.theta = vehicle_state_.theta; + input.chi = vehicle_state_.chi; + input.psi = vehicle_state_.psi; + input.p = vehicle_state_.p; + input.q = vehicle_state_.q; + input.r = vehicle_state_.r; + input.Va_c = controller_commands_.Va_c; + input.h_c = controller_commands_.h_c; + input.chi_c = controller_commands_.chi_c; + input.phi_ff = controller_commands_.phi_ff; + input.Ts = 0.01f; + + struct output_s output; + //ROS_INFO("%g",input.va); + //std::cout<<"command_recieved_"< 0) + { + rosplane_msgs::Controller_Internals inners; + inners.phi_c = output.phi_c; + inners.theta_c = output.theta_c; + switch (output.current_zone) + { + case alt_zones::TAKE_OFF: + inners.alt_zone = inners.ZONE_TAKE_OFF; + break; + case alt_zones::CLIMB: + inners.alt_zone = inners.ZONE_CLIMB; + break; + case alt_zones::DESCEND: + inners.alt_zone = inners.ZONE_DESEND; + break; + case alt_zones::ALTITUDE_HOLD: + inners.alt_zone = inners.ZONE_ALTITUDE_HOLD; + break; + default: + break; + } + inners.aux_valid = false; + internals_pub_.publish(inners); + } + } +} + +} //end namespace + +int main(int argc, char **argv) +{ + ros::init(argc, argv, "rosplane_controller"); + rosplane::controller_base *cont = new rosplane::controller_example(); + + ros::spin(); + + return 0; +} diff --git a/Flight_control/src/enemy_suv/suv_move/src/controller_base99.cpp b/Flight_control/src/enemy_suv/suv_move/src/controller_base99.cpp new file mode 100644 index 0000000..496a217 --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/src/controller_base99.cpp @@ -0,0 +1,203 @@ +#include "controller_base99.h" +#include "controller_example99.h" + +namespace rosplane +{ + +controller_base99::controller_base99(): + nh_(ros::NodeHandle()), + nh_private_(ros::NodeHandle()) +{ + vehicle_state_sub_ = nh_.subscribe("state", 10, &controller_base99::vehicle_state_callback, this); + controller_commands_sub_ = nh_.subscribe("controller_commands", 10, &controller_base99::controller_commands_callback, + this); + + memset(&vehicle_state_, 0, sizeof(vehicle_state_)); + memset(&controller_commands_, 0, sizeof(controller_commands_)); + + nh_private_.param("TRIM_E", params_.trim_e, 0.0); + nh_private_.param("TRIM_A", params_.trim_a, 0.0); + nh_private_.param("TRIM_R", params_.trim_r, 0.0); + nh_private_.param("TRIM_T", params_.trim_t, 0.6); + nh_private_.param("PWM_RAD_E", params_.pwm_rad_e, 1.0); + nh_private_.param("PWM_RAD_A", params_.pwm_rad_a, 1.0); + nh_private_.param("PWM_RAD_R", params_.pwm_rad_r, 1.0); + nh_private_.param("ALT_TOZ", params_.alt_toz, 20.0); /**< altitude takeoff zone */ + nh_private_.param("ALT_HZ", params_.alt_hz, 10.0); /**< altitude hold zone */ + nh_private_.param("TAU", params_.tau, 5.0); + nh_private_.param("COURSE_KP", params_.c_kp, 0.7329); + nh_private_.param("COURSE_KD", params_.c_kd, 0.0); + nh_private_.param("COURSE_KI", params_.c_ki, 0.0); + nh_private_.param("ROLL_KP", params_.r_kp, 1.2855); + nh_private_.param("ROLL_KD", params_.r_kd, -0.325); + nh_private_.param("ROLL_KI", params_.r_ki, 0.0);//0.10f); + nh_private_.param("PITCH_KP", params_.p_kp, 1.0); + nh_private_.param("PITCH_KD", params_.p_kd, -0.17); + nh_private_.param("PITCH_KI", params_.p_ki, 0.0); + nh_private_.param("PITCH_FF", params_.p_ff, 0.0); + nh_private_.param("AS_PITCH_KP", params_.a_p_kp, -0.0713); + nh_private_.param("AS_PITCH_KD", params_.a_p_kd, -0.0635); + nh_private_.param("AS_PITCH_KI", params_.a_p_ki, 0.0); + nh_private_.param("AS_THR_KP", params_.a_t_kp, 3.2); + nh_private_.param("AS_THR_KD", params_.a_t_kd, 0.0); + nh_private_.param("AS_THR_KI", params_.a_t_ki, 0.0); + nh_private_.param("ALT_KP", params_.a_kp, 0.045); + nh_private_.param("ALT_KD", params_.a_kd, 0.0); + nh_private_.param("ALT_KI", params_.a_ki, 0.01); + nh_private_.param("BETA_KP", params_.b_kp, -0.1164); + nh_private_.param("BETA_KD", params_.b_kd, 0.0); + nh_private_.param("BETA_KI", params_.b_ki, -0.0037111); + nh_private_.param("MAX_E", params_.max_e, 0.610); + nh_private_.param("MAX_A", params_.max_a, 0.523); + nh_private_.param("MAX_R", params_.max_r, 0.523); + nh_private_.param("MAX_T", params_.max_t, 1.0); + + func_ = boost::bind(&controller_base99::reconfigure_callback, this, _1, _2); + server_.setCallback(func_); + + actuators_pub_ = nh_.advertise("command", 10); + internals_pub_ = nh_.advertise("controller_inners", 10); + act_pub_timer_ = nh_.createTimer(ros::Duration(1.0/100.0), &controller_base99::actuator_controls_publish, this); + + command_recieved_ = false; +} + +void controller_base99::vehicle_state_callback(const rosplane_msgs::StateConstPtr &msg) +{ + vehicle_state_ = *msg; +} + +void controller_base99::controller_commands_callback(const rosplane_msgs::Controller_CommandsConstPtr &msg) +{ + command_recieved_ = true; + controller_commands_ = *msg; +} + +void controller_base99::reconfigure_callback(rosplane::ControllerConfig &config, uint32_t level) +{ + params_.trim_e = config.TRIM_E; + params_.trim_a = config.TRIM_A; + params_.trim_r = config.TRIM_R; + params_.trim_t = config.TRIM_T; + + params_.c_kp = config.COURSE_KP; + params_.c_kd = config.COURSE_KD; + params_.c_ki = config.COURSE_KI; + + params_.r_kp = config.ROLL_KP; + params_.r_kd = config.ROLL_KD; + params_.r_ki = config.ROLL_KI; + + params_.p_kp = config.PITCH_KP; + params_.p_kd = config.PITCH_KD; + params_.p_ki = config.PITCH_KI; + params_.p_ff = config.PITCH_FF; + + params_.a_p_kp = config.AS_PITCH_KP; + params_.a_p_kd = config.AS_PITCH_KD; + params_.a_p_ki = config.AS_PITCH_KI; + + params_.a_t_kp = config.AS_THR_KP; + params_.a_t_kd = config.AS_THR_KD; + params_.a_t_ki = config.AS_THR_KI; + + params_.a_kp = config.ALT_KP; + params_.a_kd = config.ALT_KD; + params_.a_ki = config.ALT_KI; + + params_.b_kp = config.BETA_KP; + params_.b_kd = config.BETA_KD; + params_.b_ki = config.BETA_KI; +} + +void controller_base99::convert_to_pwm(controller_base99::output_s &output) +{ + output.delta_e = output.delta_e*params_.pwm_rad_e; + output.delta_a = output.delta_a*params_.pwm_rad_a; + output.delta_r = output.delta_r*params_.pwm_rad_r; +} + +void controller_base99::actuator_controls_publish(const ros::TimerEvent &) +{ + struct input_s input; + input.h = -vehicle_state_.position[2];//>0 + input.va = vehicle_state_.Va; + input.phi = vehicle_state_.phi; + input.theta = vehicle_state_.theta; + input.chi = vehicle_state_.chi; + input.psi = vehicle_state_.psi; + input.p = vehicle_state_.p; + input.q = vehicle_state_.q; + input.r = vehicle_state_.r; + input.Va_c = controller_commands_.Va_c; + input.h_c = controller_commands_.h_c; + input.chi_c = controller_commands_.chi_c; + input.phi_ff = controller_commands_.phi_ff; + input.Ts = 0.01f; + + struct output_s output; + //ROS_INFO("%g",input.va); + //std::cout<<"command_recieved_"< 0) + { + rosplane_msgs::Controller_Internals inners; + inners.phi_c = output.phi_c; + inners.theta_c = output.theta_c; + switch (output.current_zone) + { + case alt_zones::TAKE_OFF: + inners.alt_zone = inners.ZONE_TAKE_OFF; + break; + case alt_zones::CLIMB: + inners.alt_zone = inners.ZONE_CLIMB; + break; + case alt_zones::DESCEND: + inners.alt_zone = inners.ZONE_DESEND; + break; + case alt_zones::ALTITUDE_HOLD: + inners.alt_zone = inners.ZONE_ALTITUDE_HOLD; + break; + default: + break; + } + inners.aux_valid = false; + internals_pub_.publish(inners); + } + } +} + +} //end namespace + +int main(int argc, char **argv) +{ + ros::init(argc, argv, "rosplane_controller99"); + rosplane::controller_base99 *cont = new rosplane::controller_example99(); + + ros::spin(); + + return 0; +} diff --git a/Flight_control/src/enemy_suv/suv_move/src/controller_example.cpp b/Flight_control/src/enemy_suv/suv_move/src/controller_example.cpp new file mode 100644 index 0000000..09008a5 --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/src/controller_example.cpp @@ -0,0 +1,265 @@ +#include "controller_example.h" + +namespace rosplane +{ + +controller_example::controller_example() : controller_base() +{ + current_zone = alt_zones::TAKE_OFF; + + c_error_ = 0; + c_integrator_ = 0; + r_error_ = 0; + r_integrator = 0; + p_error_ = 0; + p_integrator_ = 0; + +} + +void controller_example::control(const params_s ¶ms, const input_s &input, output_s &output) +{ + output.delta_r = 0; //cooridinated_turn_hold(input.beta, params, input.Ts) + output.phi_c = course_hold(input.chi_c, input.chi, input.phi_ff, input.r, params, input.Ts); + output.delta_a = roll_hold(output.phi_c, input.phi, input.p, params, input.Ts); + switch (current_zone) + { + case alt_zones::TAKE_OFF: + output.phi_c = 0; + output.delta_a = roll_hold(0.0, input.phi, input.p, params, input.Ts); + output.delta_t = params.max_t; + output.theta_c = 15.0*3.14/180.0; + if (input.h >= params.alt_toz) + { + ROS_WARN("climb"); + current_zone = alt_zones::CLIMB; + ap_error_ = 0; + ap_integrator_ = 0; + ap_differentiator_ = 0; + } + break; + case alt_zones::CLIMB: + output.delta_t = params.max_t; + + //modified by kobe + if (input.Va_c < input.va) + { + output.theta_c = airspeed_with_pitch_hold(input.Va_c, input.va, params, input.Ts); + } + else + { + output.theta_c = altitiude_hold(input.h_c, input.h, params, input.Ts); + } + // + + if (input.h >= input.h_c - params.alt_hz) + { + ROS_WARN("hold"); + current_zone = alt_zones::ALTITUDE_HOLD; + at_error_ = 0; + at_integrator_ = 0; + at_differentiator_ = 0; + a_error_ = 0; + a_integrator_ = 0; + a_differentiator_ = 0; + } + else if (input.h <= params.alt_toz) + { + ROS_WARN("takeoff"); + current_zone = alt_zones::TAKE_OFF; + } + break; + case alt_zones::DESCEND: + output.delta_t = 0; + output.theta_c = airspeed_with_pitch_hold(input.Va_c, input.va, params, input.Ts); + if (input.h <= input.h_c + params.alt_hz) + { + ROS_WARN("hold"); + current_zone = alt_zones::ALTITUDE_HOLD; + at_error_ = 0; + at_integrator_ = 0; + at_differentiator_ = 0; + a_error_ = 0; + a_integrator_ = 0; + a_differentiator_ = 0; + } + break; + case alt_zones::ALTITUDE_HOLD: + output.delta_t = airspeed_with_throttle_hold(input.Va_c, input.va, params, input.Ts); + output.theta_c = altitiude_hold(input.h_c, input.h, params, input.Ts); + if (input.h >= input.h_c + params.alt_hz) + { + ROS_WARN("desend"); + current_zone = alt_zones::DESCEND; + ap_error_ = 0; + ap_integrator_ = 0; + ap_differentiator_ = 0; + } + else if (input.h <= input.h_c - params.alt_hz) + { + ROS_WARN("climb"); + current_zone = alt_zones::CLIMB; + ap_error_ = 0; + ap_integrator_ = 0; + ap_differentiator_ = 0; + } + break; + default: + break; + } + + output.current_zone = current_zone; + output.delta_e = pitch_hold(output.theta_c, input.theta, input.q, params, input.Ts); +} + +float controller_example::course_hold(float chi_c, float chi, float phi_ff, float r, const params_s ¶ms, float Ts) +{ + float error = chi_c - chi; + + c_integrator_ = c_integrator_ + (Ts/2.0)*(error + c_error_); + + float up = params.c_kp*error; + float ui = params.c_ki*c_integrator_; + float ud = params.c_kd*r; + + float phi_c = sat(up + ui + ud + phi_ff, 40.0*3.14/180.0, -40.0*3.14/180.0); + if (fabs(params.c_ki) >= 0.00001) + { + float phi_c_unsat = up + ui + ud + phi_ff; + c_integrator_ = c_integrator_ + (Ts/params.c_ki)*(phi_c - phi_c_unsat); + } + + c_error_ = error; + return phi_c; +} + +float controller_example::roll_hold(float phi_c, float phi, float p, const params_s ¶ms, float Ts) +{ + float error = phi_c - phi; + + r_integrator = r_integrator + (Ts/2.0)*(error + r_error_); + + float up = params.r_kp*error; + float ui = params.r_ki*r_integrator; + float ud = params.r_kd*p; + + float delta_a = sat(up + ui + ud, params.max_a, -params.max_a); + if (fabs(params.r_ki) >= 0.00001) + { + float delta_a_unsat = up + ui + ud; + r_integrator = r_integrator + (Ts/params.r_ki)*(delta_a - delta_a_unsat); + } + + r_error_ = error; + return delta_a; +} + +float controller_example::pitch_hold(float theta_c, float theta, float q, const params_s ¶ms, float Ts) +{ + float error = theta_c - theta; + + p_integrator_ = p_integrator_ + (Ts/2.0)*(error + p_error_); + + float up = params.p_kp*error; + float ui = params.p_ki*p_integrator_; + float ud = params.p_kd*q; + + float delta_e = sat(params.trim_e/params.pwm_rad_e + up + ui + ud, params.max_e, -params.max_e); + if (fabs(params.p_ki) >= 0.00001) + { + float delta_e_unsat = params.trim_e/params.pwm_rad_e + up + ui + ud; + p_integrator_ = p_integrator_ + (Ts/params.p_ki)*(delta_e - delta_e_unsat); + } + + p_error_ = error; + return delta_e; +} + +float controller_example::airspeed_with_pitch_hold(float Va_c, float Va, const params_s ¶ms, float Ts) +{ + float error = Va_c - Va; + + ap_integrator_ = ap_integrator_ + (Ts/2.0)*(error + ap_error_); + ap_differentiator_ = (2.0*params.tau - Ts)/(2.0*params.tau + Ts)*ap_differentiator_ + (2.0 / + (2.0*params.tau + Ts))*(error - ap_error_); + + float up = params.a_p_kp*error; + float ui = params.a_p_ki*ap_integrator_; + float ud = params.a_p_kd*ap_differentiator_; + + float theta_c = sat(up + ui + ud, 20.0*3.14/180.0, -25.0*3.14/180.0); + if (fabs(params.a_p_ki) >= 0.00001) + { + float theta_c_unsat = up + ui + ud; + ap_integrator_ = ap_integrator_ + (Ts/params.a_p_ki)*(theta_c - theta_c_unsat); + } + + ap_error_ = error; + return theta_c; +} + +float controller_example::airspeed_with_throttle_hold(float Va_c, float Va, const params_s ¶ms, float Ts) +{ + float error = Va_c - Va; + + at_integrator_ = at_integrator_ + (Ts/2.0)*(error + at_error_); + at_differentiator_ = (2.0*params.tau - Ts)/(2.0*params.tau + Ts)*at_differentiator_ + (2.0 / + (2.0*params.tau + Ts))*(error - at_error_); + + float up = params.a_t_kp*error; + float ui = params.a_t_ki*at_integrator_; + float ud = params.a_t_kd*at_differentiator_; + + float delta_t = sat(params.trim_t + up + ui + ud, params.max_t, 0); + if (fabs(params.a_t_ki) >= 0.00001) + { + float delta_t_unsat = params.trim_t + up + ui + ud; + at_integrator_ = at_integrator_ + (Ts/params.a_t_ki)*(delta_t - delta_t_unsat); + } + + at_error_ = error; + return delta_t; +} + +float controller_example::altitiude_hold(float h_c, float h, const params_s ¶ms, float Ts) +{ + float error = h_c - h; + + a_integrator_ = a_integrator_ + (Ts/2.0)*(error + a_error_); + a_differentiator_ = (2.0*params.tau - Ts)/(2.0*params.tau + Ts)*a_differentiator_ + (2.0 / + (2.0*params.tau + Ts))*(error - a_error_); + + float up = params.a_kp*error; + float ui = params.a_ki*a_integrator_; + float ud = params.a_kd*a_differentiator_; + + float theta_c = sat(up + ui + ud, 35.0*3.14/180.0, -35.0*3.14/180.0); + if (fabs(params.a_ki) >= 0.00001) + { + float theta_c_unsat = up + ui + ud; + a_integrator_ = a_integrator_ + (Ts/params.a_ki)*(theta_c - theta_c_unsat); + } + + at_error_ = error; + return theta_c; +} + +//float controller_example::cooridinated_turn_hold(float v, const params_s ¶ms, float Ts) +//{ +// //todo finish this if you want... +// return 0; +//} + +float controller_example::sat(float value, float up_limit, float low_limit) +{ + float rVal; + if (value > up_limit) + rVal = up_limit; + else if (value < low_limit) + rVal = low_limit; + else + rVal = value; + + return rVal; +} + +} //end namespace diff --git a/Flight_control/src/enemy_suv/suv_move/src/controller_example99.cpp b/Flight_control/src/enemy_suv/suv_move/src/controller_example99.cpp new file mode 100644 index 0000000..95474a1 --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/src/controller_example99.cpp @@ -0,0 +1,293 @@ +#include "controller_example99.h" + +namespace rosplane +{ + +controller_example99::controller_example99() : controller_base99() +{ + current_zone = alt_zones::TAKE_OFF; + + c_error_ = 0; + c_integrator_ = 0; + r_error_ = 0; + r_integrator = 0; + p_error_ = 0; + p_integrator_ = 0; + +} + +void controller_example99::control(const params_s ¶ms, const input_s &input, output_s &output) +{ + output.delta_r = 0; //cooridinated_turn_hold(input.beta, params, input.Ts) + output.phi_c = course_hold(input.chi_c, input.chi, input.phi_ff, input.r, params, input.Ts); + output.delta_a = roll_hold(output.phi_c, input.phi, input.p, params, input.Ts); + switch (current_zone) + { + case alt_zones::TAKE_OFF: + output.phi_c = 0; + output.delta_a = roll_hold(0.0, input.phi, input.p, params, input.Ts); + output.delta_t = params.max_t;//modified by kobe + output.theta_c = 1.0*3.14/180.0; + //output.theta_c = 15.0*3.14/180.0; + //ROS_WARN("TAKE_OFF"); + if (input.h >= params.alt_toz) + { + ROS_WARN("climb"); + current_zone = alt_zones::CLIMB; + ap_error_ = 0; + ap_integrator_ = 0; + ap_differentiator_ = 0; + } + break; + case alt_zones::CLIMB: + output.delta_t = params.max_t; + + //modified by kobe + if (input.Va_c < input.va) + { + output.theta_c = airspeed_with_pitch_hold(input.Va_c, input.va, params, input.Ts);//original + } + else + { + output.theta_c = altitiude_hold(input.h_c, input.h, params, input.Ts); + } + // + + if (input.h >= input.h_c - params.alt_hz) + { + ROS_WARN("hold"); + current_zone = alt_zones::ALTITUDE_HOLD; + at_error_ = 0; + at_integrator_ = 0; + at_differentiator_ = 0; + a_error_ = 0; + a_integrator_ = 0; + a_differentiator_ = 0; + } + else if (input.h <= params.alt_toz) + { + //ROS_WARN("takeoff"); + current_zone = alt_zones::TAKE_OFF; + } + break; + case alt_zones::DESCEND: + output.delta_t = decend_airspeed_oil(input.h_c, input.h, params, input.Ts); + //output.theta_c =airspeed_with_pitch_hold(input.Va_c, input.va, params, input.Ts); + output.theta_c =decend_airspeed_with_pitch_hold(input.h_c, input.h, params, input.Ts); + //ROS_INFO("Look here %f %f",output.theta_c,pitch_hold(output.theta_c, input.theta, input.q, params, input.Ts)); + if (input.h <= input.h_c + params.alt_hz) + { + ROS_WARN("hold"); + current_zone = alt_zones::ALTITUDE_HOLD; + at_error_ = 0; + at_integrator_ = 0; + at_differentiator_ = 0; + a_error_ = 0; + a_integrator_ = 0; + a_differentiator_ = 0; + } + break; + case alt_zones::ALTITUDE_HOLD: + output.delta_t = airspeed_with_throttle_hold(input.Va_c, input.va, params, input.Ts); + output.theta_c = altitiude_hold(input.h_c, input.h, params, input.Ts); + //ROS_INFO("Look here %f %f %f",output.delta_t,output.theta_c,input.Va_c); + if (input.h >= input.h_c + 200)//add by kobe + //if (input.h >= input.h_c + params.alt_hz)//original + { + ROS_WARN("desend"); + current_zone = alt_zones::DESCEND; + ap_error_ = 0; + ap_integrator_ = 0; + ap_differentiator_ = 0; + } + else if (input.h <= input.h_c - 200) + //else if (input.h <= input.h_c - params.alt_hz) + { + ROS_WARN("climb"); + current_zone = alt_zones::CLIMB; + ap_error_ = 0; + ap_integrator_ = 0; + ap_differentiator_ = 0; + } + break; + default: + break; + } + + output.current_zone = current_zone; + output.delta_e = pitch_hold(output.theta_c, input.theta, input.q, params, input.Ts); + +} + +float controller_example99::course_hold(float chi_c, float chi, float phi_ff, float r, const params_s ¶ms, float Ts) +{ + float error = chi_c - chi; + + c_integrator_ = c_integrator_ + (Ts/2.0)*(error + c_error_); + + float up = params.c_kp*error; + float ui = params.c_ki*c_integrator_; + float ud = params.c_kd*r; + + float phi_c = sat(up + ui + ud + phi_ff, 40.0*3.14/180.0, -40.0*3.14/180.0); //add by kobe + //float phi_c = sat(up + ui + ud + phi_ff, 40.0*3.14/180.0, -40.0*3.14/180.0); + if (fabs(params.c_ki) >= 0.00001) + { + float phi_c_unsat = up + ui + ud + phi_ff; + c_integrator_ = c_integrator_ + (Ts/params.c_ki)*(phi_c - phi_c_unsat); + } + + c_error_ = error; + return phi_c; +} + +float controller_example99::roll_hold(float phi_c, float phi, float p, const params_s ¶ms, float Ts) +{ + float error = phi_c - phi; + + r_integrator = r_integrator + (Ts/2.0)*(error + r_error_); + + float up = params.r_kp*error; + float ui = params.r_ki*r_integrator; + float ud = params.r_kd*p; + + float delta_a = sat(up + ui + ud,params.max_a, -params.max_a);//add by kobe,0.1,-0.1 + //float delta_a = sat(up + ui + ud, params.max_a, -params.max_a); + + if (fabs(params.r_ki) >= 0.00001) + { + float delta_a_unsat = up + ui + ud; + r_integrator = r_integrator + (Ts/params.r_ki)*(delta_a - delta_a_unsat); + } + + r_error_ = error; + return delta_a; +} + +float controller_example99::pitch_hold(float theta_c, float theta, float q, const params_s ¶ms, float Ts) +{ + float error = theta_c - theta; + + p_integrator_ = p_integrator_ + (Ts/2.0)*(error + p_error_); + + float up = params.p_kp*error; + float ui = params.p_ki*p_integrator_; + float ud = params.p_kd*q; + + float delta_e = sat(params.trim_e/params.pwm_rad_e + up + ui + ud, 0.1, -0.1);// add by kobe + //float delta_e = sat(params.trim_e/params.pwm_rad_e + up + ui + ud, params.max_e, -params.max_e); + if (fabs(params.p_ki) >= 0.00001) + { + float delta_e_unsat = params.trim_e/params.pwm_rad_e + up + ui + ud; + p_integrator_ = p_integrator_ + (Ts/params.p_ki)*(delta_e - delta_e_unsat); + } + + p_error_ = error; + return delta_e; +} + +float controller_example99::airspeed_with_pitch_hold(float Va_c, float Va, const params_s ¶ms, float Ts) +{ + float error = Va_c - Va; + + ap_integrator_ = ap_integrator_ + (Ts/2.0)*(error + ap_error_); + ap_differentiator_ = (2.0*params.tau - Ts)/(2.0*params.tau + Ts)*ap_differentiator_ + (2.0 / + (2.0*params.tau + Ts))*(error - ap_error_); + + float up = params.a_p_kp*error; + float ui = params.a_p_ki*ap_integrator_; + float ud = params.a_p_kd*ap_differentiator_; + + float theta_c = sat(up + ui + ud, 2.0*3.14/180.0, -2.0*3.14/180.0);//add by kobe + //float theta_c = sat(up + ui + ud, 20.0*3.14/180.0, -25.0*3.14/180.0); + if (fabs(params.a_p_ki) >= 0.00001) + { + float theta_c_unsat = up + ui + ud; + ap_integrator_ = ap_integrator_ + (Ts/params.a_p_ki)*(theta_c - theta_c_unsat); + } + + ap_error_ = error; + return theta_c; +} + +float controller_example99::decend_airspeed_with_pitch_hold(float h_c, float h, const params_s ¶ms, float Ts) +{ + float error = 0.01*(h_c - h); + float theta_c = sat(error, 0, -90.0*3.14/180.0); + return theta_c; +} + +float controller_example99::decend_airspeed_oil(float h_c, float h, const params_s ¶ms, float Ts) +{ + float error = pow(2,(h_c - h)/50); + float theta_t = sat(error, 1, 0); + return theta_t; +} + +float controller_example99::airspeed_with_throttle_hold(float Va_c, float Va, const params_s ¶ms, float Ts) +{ + float error = Va_c - Va; + + at_integrator_ = at_integrator_ + (Ts/2.0)*(error + at_error_); + at_differentiator_ = (2.0*params.tau - Ts)/(2.0*params.tau + Ts)*at_differentiator_ + (2.0 / + (2.0*params.tau + Ts))*(error - at_error_); + + float up = params.a_t_kp*error; + float ui = params.a_t_ki*at_integrator_; + float ud = params.a_t_kd*at_differentiator_; + + float delta_t = sat(params.trim_t + up + ui + ud, params.max_t, 0); + if (fabs(params.a_t_ki) >= 0.00001) + { + float delta_t_unsat = params.trim_t + up + ui + ud; + at_integrator_ = at_integrator_ + (Ts/params.a_t_ki)*(delta_t - delta_t_unsat); + } + + at_error_ = error; + return delta_t; +} + +float controller_example99::altitiude_hold(float h_c, float h, const params_s ¶ms, float Ts) +{ + float error = h_c - h; + + a_integrator_ = a_integrator_ + (Ts/2.0)*(error + a_error_); + a_differentiator_ = (2.0*params.tau - Ts)/(2.0*params.tau + Ts)*a_differentiator_ + (2.0 / + (2.0*params.tau + Ts))*(error - a_error_); + + float up = params.a_kp*error; + float ui = params.a_ki*a_integrator_; + float ud = params.a_kd*a_differentiator_; + + float theta_c = sat(up + ui + ud, 5.0*3.14/180.0, -5.0*3.14/180.0);//add by kobe + //float theta_c = sat(up + ui + ud, 35.0*3.14/180.0, -35.0*3.14/180.0); + if (fabs(params.a_ki) >= 0.00001) + { + float theta_c_unsat = up + ui + ud; + a_integrator_ = a_integrator_ + (Ts/params.a_ki)*(theta_c - theta_c_unsat); + } + + at_error_ = error; + return theta_c; +} + +//float controller_example99::cooridinated_turn_hold(float v, const params_s ¶ms, float Ts) +//{ +// //todo finish this if you want... +// return 0; +//} + +float controller_example99::sat(float value, float up_limit, float low_limit) +{ + float rVal; + if (value > up_limit) + rVal = up_limit; + else if (value < low_limit) + rVal = low_limit; + else + rVal = value; + + return rVal; +} + +} //end namespace diff --git a/Flight_control/src/enemy_suv/suv_move/src/estimator_base.cpp b/Flight_control/src/enemy_suv/suv_move/src/estimator_base.cpp new file mode 100644 index 0000000..959a8a7 --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/src/estimator_base.cpp @@ -0,0 +1,228 @@ +#include "estimator_base.h" +#include "estimator_example.h" + +namespace rosplane +{ + +estimator_base::estimator_base(): + nh_(ros::NodeHandle()), + nh_private_(ros::NodeHandle("~")) +{ + nh_private_.param("gps_topic", gps_topic_, "gps"); + nh_private_.param("imu_topic", imu_topic_, "imu/data"); + nh_private_.param("baro_topic", baro_topic_, "baro"); + nh_private_.param("airspeed_topic", airspeed_topic_, "airspeed"); + nh_private_.param("status_topic", status_topic_, "status"); + nh_private_.param("update_rate", update_rate_, 100.0); + params_.Ts = 1.0f/update_rate_; + params_.gravity = 9.8; + nh_private_.param("rho", params_.rho, 1.225); + nh_private_.param("sigma_accel", params_.sigma_accel, 0.0245); + nh_private_.param("sigma_n_gps", params_.sigma_n_gps, 0.21); + nh_private_.param("sigma_e_gps", params_.sigma_e_gps, 0.21); + nh_private_.param("sigma_Vg_gps", params_.sigma_Vg_gps, 0.0500); + nh_private_.param("sigma_couse_gps", params_.sigma_course_gps, 0.0045); + + gps_sub_ = nh_.subscribe(gps_topic_, 10, &estimator_base::gpsCallback, this); + imu_sub_ = nh_.subscribe(imu_topic_, 10, &estimator_base::imuCallback, this); + baro_sub_ = nh_.subscribe(baro_topic_, 10, &estimator_base::baroAltCallback, this); + airspeed_sub_ = nh_.subscribe(airspeed_topic_, 10, &estimator_base::airspeedCallback, this); + status_sub_ = nh_.subscribe(status_topic_, 1, &estimator_base::statusCallback, this); + update_timer_ = nh_.createTimer(ros::Duration(1.0/update_rate_), &estimator_base::update, this); + vehicle_state_pub_ = nh_.advertise("state", 10); + init_static_ = 0; + baro_count_ = 0; + armed_first_time_ = false; +} + +void estimator_base::update(const ros::TimerEvent &) +{ + struct output_s output; + + if (armed_first_time_) + { + estimate(params_, input_, output); + } + else + { + output.pn = output.pe = output.h = 0; + output.phi = output.theta = output.psi = 0; + output.alpha = output.beta = output.chi = 0; + output.p = output.q = output.r = 0; + output.Va = 0; + } + + input_.gps_new = false; + + rosplane_msgs::State msg; + msg.header.stamp = ros::Time::now(); + msg.header.frame_id = 1; // Denotes global frame + + msg.position[0] = output.pn; + msg.position[1] = output.pe; + msg.position[2] = -output.h; + if (gps_init_) + { + msg.initial_lat = init_lat_; + msg.initial_lon = init_lon_; + msg.initial_alt = init_alt_; + } + msg.Va = output.Va; + msg.alpha = output.alpha; + msg.beta = output.beta; + msg.phi = output.phi; + msg.theta = output.theta; + msg.psi = output.psi; + msg.chi = output.chi; + msg.p = output.p; + msg.q = output.q; + msg.r = output.r; + msg.Vg = output.Vg; + msg.wn = output.wn; + msg.we = output.we; + msg.quat_valid = false; + + msg.psi_deg = fmod(output.psi, 2*M_PI)*180/M_PI; //-360 to 360 + msg.psi_deg += (msg.psi_deg < -180 ? 360 : 0); + msg.psi_deg -= (msg.psi_deg > 180 ? 360 : 0); + msg.chi_deg = fmod(output.chi, 2*M_PI)*180/M_PI; //-360 to 360 + msg.chi_deg += (msg.chi_deg < -180 ? 360 : 0); + msg.chi_deg -= (msg.chi_deg > 180 ? 360 : 0); + + vehicle_state_pub_.publish(msg); +} + +void estimator_base::gpsCallback(const rosflight_msgs::GPS &msg) +{ + if (msg.fix != true || msg.NumSat < 4 || !std::isfinite(msg.latitude)) + { + input_.gps_new = false; + return; + } + if (!gps_init_) + { + gps_init_ = true; + init_alt_ = msg.altitude; + init_lat_ = msg.latitude; + init_lon_ = msg.longitude; + } + else + { + input_.gps_n = EARTH_RADIUS*(msg.latitude - init_lat_)*M_PI/180.0; + input_.gps_e = EARTH_RADIUS*cos(init_lat_*M_PI/180.0)*(msg.longitude - init_lon_)*M_PI/180.0; + input_.gps_h = msg.altitude - init_alt_; + input_.gps_Vg = msg.speed; + if (msg.speed > 0.3) + input_.gps_course = msg.ground_course; + input_.gps_new = true; + //ROS_INFO("%g %g %g",input_.gps_n,input_.gps_e,input_.gps_h); + } +} + +void estimator_base::imuCallback(const sensor_msgs::Imu &msg) +{ + input_.accel_x = msg.linear_acceleration.x; + input_.accel_y = msg.linear_acceleration.y; + input_.accel_z = msg.linear_acceleration.z; + + input_.gyro_x = msg.angular_velocity.x; + input_.gyro_y = msg.angular_velocity.y; + input_.gyro_z = msg.angular_velocity.z; +} + +void estimator_base::baroAltCallback(const rosflight_msgs::Barometer &msg) +{ + + if (armed_first_time_ && !baro_init_) + { + if (baro_count_ < 100) + { + init_static_ += msg.pressure; + init_static_vector_.push_back(msg.pressure); + input_.static_pres = 0; + baro_count_ += 1; + } + else + { + init_static_ = std::accumulate(init_static_vector_.begin(), init_static_vector_.end(), + 0.0)/init_static_vector_.size(); + baro_init_ = true; + + //Check that it got a good calibration. + std::sort(init_static_vector_.begin(), init_static_vector_.end()); + float q1 = (init_static_vector_[24] + init_static_vector_[25])/2.0; + float q3 = (init_static_vector_[74] + init_static_vector_[75])/2.0; + float IQR = q3 - q1; + float upper_bound = q3 + 2.0*IQR; + float lower_bound = q1 - 2.0*IQR; + for (int i = 0; i < 100; i++) + { + if (init_static_vector_[i] > upper_bound) + { + baro_init_ = false; + baro_count_ = 0; + init_static_vector_.clear(); + ROS_WARN("Bad baro calibration. Recalibrating"); + break; + } + else if (init_static_vector_[i] < lower_bound) + { + baro_init_ = false; + baro_count_ = 0; + init_static_vector_.clear(); + ROS_WARN("Bad baro calibration. Recalibrating"); + break; + } + } + } + } + else + { + float static_pres_old = input_.static_pres; + input_.static_pres = -msg.pressure + init_static_; + + float gate_gain = 1.35*params_.rho*params_.gravity; + if (input_.static_pres < static_pres_old - gate_gain) + { + input_.static_pres = static_pres_old - gate_gain; + } + else if (input_.static_pres > static_pres_old + gate_gain) + { + input_.static_pres = static_pres_old + gate_gain; + } + } +} + +void estimator_base::airspeedCallback(const rosflight_msgs::Airspeed &msg) +{ + float diff_pres_old = input_.diff_pres; + input_.diff_pres = msg.differential_pressure; + + float gate_gain = pow(3, 2)*params_.rho/2.0; + if (input_.diff_pres < diff_pres_old - gate_gain) + { + input_.diff_pres = diff_pres_old - gate_gain; + } + else if (input_.diff_pres > diff_pres_old + gate_gain) + { + input_.diff_pres = diff_pres_old + gate_gain; + } +} + +void estimator_base::statusCallback(const rosflight_msgs::Status &msg) +{ + if (!armed_first_time_ && msg.armed) + armed_first_time_ = true; +} + +} //end namespace + +int main(int argc, char **argv) +{ + ros::init(argc, argv, "rosplane_estimator"); + rosplane::estimator_base *est = new rosplane::estimator_example(); + + ros::spin(); + + return 0; +} diff --git a/Flight_control/src/enemy_suv/suv_move/src/estimator_base_99pub.cpp b/Flight_control/src/enemy_suv/suv_move/src/estimator_base_99pub.cpp new file mode 100644 index 0000000..953355c --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/src/estimator_base_99pub.cpp @@ -0,0 +1,76 @@ +//* @author AIRC-DA group,questions contack kobe. + +#include "estimator_base_99pub.h" + +namespace rosplane +{ + +estimator_base_99pub::estimator_base_99pub(): + nh_(ros::NodeHandle()), + nh_private_(ros::NodeHandle("~")) +{ + + true_state_sub_ = nh_.subscribe("truth", 1, &estimator_base_99pub::truestateCallback, this); + nh_private_.param("update_rate", update_rate_, 100.0); + update_timer_ = nh_.createTimer(ros::Duration(1.0/update_rate_), &estimator_base_99pub::update, this); + vehicle_state99_pub_ = nh_.advertise("state29", 10); + state_init_ = false; +} + +void estimator_base_99pub::update(const ros::TimerEvent &) +{ + rosplane_msgs::State29 msg; + msg.header.stamp = ros::Time::now(); + msg.header.frame_id = 1; // Denotes global frame + if (state_init_) + { + msg.position_gps[0]=(true_state_.position[0]*180)/(EARTH_RADIUS*M_PI)+true_state_.initial_lat; + // pn = EARTH_RADIUS*(msg.latitude - init_lat_)*M_PI/180.0; + msg.position_gps[1]=(true_state_.position[1]*180)/(EARTH_RADIUS*cos(true_state_.initial_lat*M_PI/180.0)*M_PI)+true_state_.initial_lon; + // pe = EARTH_RADIUS*cos(init_lat_*M_PI/180.0)*(msg.longitude - init_lon_)*M_PI/180.0; + // input_.gps_h = msg.altitude - init_alt_; + msg.position_gps[2] =-true_state_.position[2]-true_state_.initial_alt; //>0 + msg.attitude_angle[0] = true_state_.phi; + msg.attitude_angle[1] = true_state_.theta; + msg.attitude_angle[2] = true_state_.psi; + msg.velocity[0] = true_state_.Vn; + msg.velocity[1] = true_state_.Ve; + msg.velocity[2] = true_state_.Vd; + msg.angular_velocity[0] = true_state_.p; + msg.angular_velocity[1] = true_state_.q; + msg.angular_velocity[2] = true_state_.r; + msg.acceleration[0] = -1; + msg.acceleration[1] = -1; + msg.acceleration[2] = -1; + msg.electric_quantity = -1; + msg.state_word = -1; + // ROS_INFO("GPS-position: %g %g %g",msg.position_gps[0],msg.position_gps[1],msg.position_gps[2]); + // ROS_INFO("xyz-position: %g %g %g",true_state_.position[0],true_state_.position[1],true_state_.position[2]); + } + else + { + // ROS_WARN("No plane truth data."); + } + + vehicle_state99_pub_.publish(msg); +} + + +void estimator_base_99pub::truestateCallback(const rosplane_msgs::StateConstPtr &msg) +{ + true_state_ = *msg; + state_init_ = true; +} + + +} //end namespace + +int main(int argc, char **argv) +{ + ros::init(argc, argv, "rosplane_estimator_29pub"); + rosplane::estimator_base_99pub *cont = new rosplane::estimator_base_99pub(); + + ros::spin(); + + return 0; +} diff --git a/Flight_control/src/enemy_suv/suv_move/src/estimator_base_statesub.cpp b/Flight_control/src/enemy_suv/suv_move/src/estimator_base_statesub.cpp new file mode 100644 index 0000000..9026890 --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/src/estimator_base_statesub.cpp @@ -0,0 +1,75 @@ +//* @author AIRC-DA group,questions contack kobe. + +#include "estimator_base_statesub.h" + +namespace rosplane +{ + +estimator_base_statesub::estimator_base_statesub() : nh_(ros::NodeHandle()), + nh_private_(ros::NodeHandle("~")) +{ + state29_sub_ = nh_.subscribe("state29", 10, &estimator_base_statesub::state99Callback, this); + nh_private_.param("update_rate", update_rate_, 100.0); + update_timer_ = nh_.createTimer(ros::Duration(1.0 / update_rate_), &estimator_base_statesub::update, this); + vehicle_state_pub_ = nh_.advertise("state", 10); + + state_init_ = false; + init_lat_=0; /**< Initial latitude in degrees */ + init_lon_=0; /**< Initial longitude in degrees */ + init_alt_=0; //>0 +} + +void estimator_base_statesub::update(const ros::TimerEvent &) +{ + + rosplane_msgs::State msg; + msg.header.stamp = ros::Time::now(); + msg.header.frame_id = 1; // Denotes global frame + if (state_init_) + { + msg.position[0] = EARTH_RADIUS*(state29_.position_gps[0] - init_lat_)*M_PI/180.0; + // pn = EARTH_RADIUS*(msg.latitude - init_lat_)*M_PI/180.0; + msg.position[1] = EARTH_RADIUS*cos(init_lat_*M_PI/180.0)*(state29_.position_gps[1] - init_lon_)*M_PI/180.0; + // pe = EARTH_RADIUS*cos(init_lat_*M_PI/180.0)*(msg.longitude - init_lon_)*M_PI/180.0; + msg.position[2] = -state29_.position_gps[2]- init_alt_; //<0 + //input_.gps_h = msg.altitude - init_alt_; + msg.Wd=state29_.position_gps[0]; + msg.Jd=state29_.position_gps[1]; + msg.Va=sqrt(pow(state29_.velocity[0], 2.0) + pow(state29_.velocity[1], 2.0) + pow(state29_.velocity[2], 2.0)); + msg.Vg=msg.Va; //true for rosflight + msg.phi=state29_.attitude_angle[0]; + msg.theta=state29_.attitude_angle[1]; + msg.psi=state29_.attitude_angle[2]; + //msg.chi=msg.psi;//watch here + msg.chi = atan2(msg.Va*sin(msg.psi), msg.Va*cos(msg.psi)); + msg.p=state29_.angular_velocity[0]; + msg.q=state29_.angular_velocity[1]; + msg.r=state29_.angular_velocity[2]; + + msg.initial_lat = init_lat_; + msg.initial_lon = init_lon_; + msg.initial_alt = init_alt_; + + } + else + { + // ROS_WARN("No State29 data."); + } + vehicle_state_pub_.publish(msg); +} + +void estimator_base_statesub::state99Callback(const rosplane_msgs::State29ConstPtr &msg) +{ + state29_ = *msg; + state_init_ = true; +} +} // namespace rosplane + +int main(int argc, char **argv) +{ + ros::init(argc, argv, "rosplane_estimator_statesub"); + rosplane::estimator_base_statesub *cont = new rosplane::estimator_base_statesub(); + ros::spin(); + + return 0; +} diff --git a/Flight_control/src/enemy_suv/suv_move/src/estimator_base_updata_statesub.cpp b/Flight_control/src/enemy_suv/suv_move/src/estimator_base_updata_statesub.cpp new file mode 100644 index 0000000..c96b078 --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/src/estimator_base_updata_statesub.cpp @@ -0,0 +1,76 @@ +//* @author AIRC-DA group,questions contack kobe. + +#include "estimator_base_updata_statesub.h" + +namespace rosplane +{ + +estimator_base_updata_statesub::estimator_base_updata_statesub() : nh_(ros::NodeHandle()), + nh_private_(ros::NodeHandle("~")) +{ + state29_sub_ = nh_.subscribe("/serial_commu_up", 10, &estimator_base_updata_statesub::state99Callback, this); + nh_private_.param("update_rate", update_rate_, 100.0); + update_timer_ = nh_.createTimer(ros::Duration(1.0 / update_rate_), &estimator_base_updata_statesub::update, this); + vehicle_state_pub_ = nh_.advertise("state", 10); + + state_init_ = false; + init_lat_=0; /**< Initial latitude in degrees */ + init_lon_=0; /**< Initial longitude in degrees */ + init_alt_=0; //>0 +} + +void estimator_base_updata_statesub::update(const ros::TimerEvent &) +{ + + rosplane_msgs::State msg; + msg.header.stamp = ros::Time::now(); + msg.header.frame_id = 1; // Denotes global frame + if (state_init_) + { + msg.position[0] = EARTH_RADIUS*(state29_.latitude - init_lat_)*M_PI/180.0; + // pn = EARTH_RADIUS*(msg.latitude - init_lat_)*M_PI/180.0; + msg.position[1] = EARTH_RADIUS*cos(init_lat_*M_PI/180.0)*(state29_.longitude - init_lon_)*M_PI/180.0; + // pe = EARTH_RADIUS*cos(init_lat_*M_PI/180.0)*(msg.longitude - init_lon_)*M_PI/180.0; + msg.position[2] = -state29_.altitude- init_alt_; //<0 + //input_.gps_h = msg.altitude - init_alt_; + msg.Wd=state29_.latitude; + msg.Jd=state29_.longitude; + msg.Va=sqrt(pow(state29_.north_direction_speed, 2.0) + pow(state29_.east_direction_speed, 2.0) + pow(state29_.ground_direction_speed, 2.0)); + msg.Vg=msg.Va; //true for rosflight + msg.phi=state29_.roll_angle; + msg.theta=state29_.pitch_angle; + msg.psi=state29_.yaw_angle; + //msg.chi=msg.psi;//watch here + msg.chi = atan2(msg.Va*sin(msg.psi), msg.Va*cos(msg.psi)); + msg.p=state29_.angular_rate_x; + msg.q=state29_.angular_rate_y; + msg.r=state29_.angular_rate_z; + + msg.initial_lat = init_lat_; + msg.initial_lon = init_lon_; + msg.initial_alt = init_alt_; + // ROS_WARN("Recieved up-data data."); + //ROS_INFO("Hello--- %f %f %f %f",state29_.latitude,state29_.longitude,msg.Vg,state29_.altitude); + } + else + { + // ROS_WARN("No up-data data."); + } + vehicle_state_pub_.publish(msg); +} + +void estimator_base_updata_statesub::state99Callback(const rosplane_msgs::Up_Data_NewConstPtr &msg) +{ + state29_ = *msg; + state_init_ = true; +} +} // namespace rosplane + +int main(int argc, char **argv) +{ + ros::init(argc, argv, "rosplane_estimator_updata_statesub"); + rosplane::estimator_base_updata_statesub *cont = new rosplane::estimator_base_updata_statesub(); + ros::spin(); + + return 0; +} diff --git a/Flight_control/src/enemy_suv/suv_move/src/estimator_example.cpp b/Flight_control/src/enemy_suv/suv_move/src/estimator_example.cpp new file mode 100644 index 0000000..6f73312 --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/src/estimator_example.cpp @@ -0,0 +1,416 @@ +#include "estimator_base.h" +#include "estimator_example.h" + +namespace rosplane +{ + +float radians(float degrees) +{ + return M_PI*degrees/180.0; +} + +estimator_example::estimator_example() : + estimator_base(), + xhat_a_(Eigen::Vector2f::Zero()), + P_a_(Eigen::Matrix2f::Identity()), + Q_a_(Eigen::Matrix2f::Identity()), + xhat_p_(Eigen::VectorXf::Zero(7)), + P_p_(Eigen::MatrixXf::Identity(7, 7)), + Q_p_(Eigen::MatrixXf::Identity(7, 7)), + R_p_(Eigen::MatrixXf::Zero(7, 7)), + f_p_(7), + A_p_(7, 7), + C_p_(7), + L_p_(7) +{ + P_a_ *= powf(radians(5.0f), 2); + + Q_a_(0, 0) = 0.00000001; + Q_a_(1, 1) = 0.00000001; + + P_p_ = Eigen::MatrixXf::Identity(7, 7); + P_p_(0, 0) = .03; + P_p_(1, 1) = .03; + P_p_(2, 2) = .01; + P_p_(3, 3) = radians(5.0f); + P_p_(4, 4) = .04; + P_p_(5, 5) = .04; + P_p_(6, 6) = radians(5.0f); + + Q_p_ *= 0.0001f; + Q_p_(3, 3) = 0.000001f; + + phat_ = 0; + qhat_ = 0; + rhat_ = 0; + phihat_ = 0; + thetahat_ = 0; + psihat_ = 0; + Vwhat_ = 0; + + lpf_static_ = 0; + lpf_diff_ = 0; + + N_ = 10; + + alpha_ = 0.0f; +} + +void estimator_example::estimate(const params_s ¶ms, const input_s &input, output_s &output) +{ + if (alpha_ == 0.0f) //initailze stuff that comes from params + { + R_accel_ = powf(params.sigma_accel, 2); + + R_p_(0, 0) = powf(params.sigma_n_gps, 2); + R_p_(1, 1) = powf(params.sigma_e_gps, 2); + R_p_(2, 2) = powf(params.sigma_Vg_gps, 2); + R_p_(3, 3) = powf(params.sigma_course_gps, 2); + R_p_(4, 4) = 0.001; + R_p_(5, 5) = 0.001; + + float lpf_a = 50.0; + float lpf_a1 = 8.0; + alpha_ = exp(-lpf_a*params.Ts); + alpha1_ = exp(-lpf_a1*params.Ts); + } + + // low pass filter gyros to estimate angular rates + lpf_gyro_x_ = alpha_*lpf_gyro_x_ + (1 - alpha_)*input.gyro_x; + lpf_gyro_y_ = alpha_*lpf_gyro_y_ + (1 - alpha_)*input.gyro_y; + lpf_gyro_z_ = alpha_*lpf_gyro_z_ + (1 - alpha_)*input.gyro_z; + + float phat = lpf_gyro_x_; + float qhat = lpf_gyro_y_; + float rhat = lpf_gyro_z_; + + // low pass filter static pressure sensor and invert to esimate altitude + lpf_static_ = alpha1_*lpf_static_ + (1 - alpha1_)*input.static_pres; + float hhat = lpf_static_/params.rho/params.gravity; + + // low pass filter diff pressure sensor and invert to extimate Va + lpf_diff_ = alpha1_*lpf_diff_ + (1 - alpha1_)*input.diff_pres; + + // when the plane isn't moving or moving slowly, the noise in the sensor + // will cause the differential pressure to go negative. This will catch + // those cases. + if (lpf_diff_ <= 0) + lpf_diff_ = 0.000001; + + float Vahat = sqrt(2/params.rho*lpf_diff_); + + // low pass filter accelerometers + lpf_accel_x_ = alpha_*lpf_accel_x_ + (1 - alpha_)*input.accel_x; + lpf_accel_y_ = alpha_*lpf_accel_y_ + (1 - alpha_)*input.accel_y; + lpf_accel_z_ = alpha_*lpf_accel_z_ + (1 - alpha_)*input.accel_z; + + // implement continuous-discrete EKF to estimate roll and pitch angles + // prediction step + float cp; // cos(phi) + float sp; // sin(phi) + float tt; // tan(thata) + float ct; // cos(thata) + float st; // sin(theta) + for (int i = 0; i < N_; i++) + { + cp = cosf(xhat_a_(0)); // cos(phi) + sp = sinf(xhat_a_(0)); // sin(phi) + tt = tanf(xhat_a_(1)); // tan(thata) + ct = cosf(xhat_a_(1)); // cos(thata) + + f_a_(0) = phat + (qhat*sp + rhat*cp)*tt; + f_a_(1) = qhat*cp - rhat*sp; + + A_a_ = Eigen::Matrix2f::Zero(); + A_a_(0, 0) = (qhat*cp - rhat*sp)*tt; + A_a_(0, 1) = (qhat*sp + rhat*cp)/ct/ct; + A_a_(1, 0) = -qhat*sp - rhat*cp; + + xhat_a_ += f_a_*(params.Ts/N_); + P_a_ += (A_a_*P_a_ + P_a_*A_a_.transpose() + Q_a_)*(params.Ts/N_); + } + // measurement updates + cp = cosf(xhat_a_(0)); + sp = sinf(xhat_a_(0)); + ct = cosf(xhat_a_(1)); + st = sinf(xhat_a_(1)); + Eigen::Matrix2f I; + I = Eigen::Matrix2f::Identity(); + + // x-axis accelerometer + h_a_ = qhat*Vahat*st + params.gravity*st; + C_a_ = Eigen::Vector2f::Zero(); + C_a_(1) = qhat*Vahat*ct + params.gravity*ct; + L_a_ = (P_a_*C_a_)/(R_accel_ + C_a_.transpose()*P_a_*C_a_); + P_a_ = (I - L_a_*C_a_.transpose())*P_a_; + xhat_a_ += L_a_*((hhat < 15 ? lpf_accel_x_/3 : lpf_accel_x_) - h_a_); + + // y-axis accelerometer + h_a_ = rhat*Vahat*ct - phat*Vahat*st - params.gravity*ct*sp; + C_a_ = Eigen::Vector2f::Zero(); + C_a_(0) = -params.gravity*cp*ct; + C_a_(1) = -rhat*Vahat*st - phat*Vahat*ct + params.gravity*st*sp; + L_a_ = (P_a_*C_a_)/(R_accel_ + C_a_.transpose()*P_a_*C_a_); + P_a_ = (I - L_a_*C_a_.transpose())*P_a_; + xhat_a_ += L_a_*(lpf_accel_y_ - h_a_); + + // z-axis accelerometer + h_a_ = -qhat*Vahat*ct - params.gravity*ct*cp; + C_a_ = Eigen::Vector2f::Zero(); + C_a_(0) = params.gravity*sp*ct; + C_a_(1) = (qhat*Vahat + params.gravity*cp)*st; + L_a_ = (P_a_*C_a_)/(R_accel_ + C_a_.transpose()*P_a_*C_a_); + P_a_ = (I - L_a_*C_a_.transpose())*P_a_; + xhat_a_ += L_a_*(lpf_accel_z_ - h_a_); + + check_xhat_a(); + + float phihat = xhat_a_(0); + float thetahat = xhat_a_(1); + + // implement continous-discrete EKF to estimate pn, pe, chi, Vg + // prediction step + float psidot, tmp, Vgdot; + if (fabsf(xhat_p_(2)) < 0.01f) + { + xhat_p_(2) = 0.01; // prevent devide by zero + } + + for (int i = 0; i < N_; i++) + { + psidot = (qhat*sinf(phihat) + rhat*cosf(phihat))/cosf(thetahat); + tmp = -psidot*Vahat*(xhat_p_(4)*cosf(xhat_p_(6)) + xhat_p_(5)*sinf(xhat_p_(6)))/xhat_p_(2); + Vgdot = ((Vahat*cosf(xhat_p_(6)) + xhat_p_(4))*(-psidot*Vahat*sinf(xhat_p_(6))) + (Vahat*sinf(xhat_p_( + 6)) + xhat_p_(5))*(psidot*Vahat*cosf(xhat_p_(6))))/xhat_p_(2); + + f_p_ = Eigen::VectorXf::Zero(7); + f_p_(0) = xhat_p_(2)*cosf(xhat_p_(3)); + f_p_(1) = xhat_p_(2)*sinf(xhat_p_(3)); + f_p_(2) = Vgdot; + f_p_(3) = params.gravity/xhat_p_(2)*tanf(phihat)*cosf(xhat_p_(3) - xhat_p_(6)); + f_p_(6) = psidot; + + A_p_ = Eigen::MatrixXf::Zero(7, 7); + A_p_(0, 2) = cos(xhat_p_(3)); + A_p_(0, 3) = -xhat_p_(2)*sinf(xhat_p_(3)); + A_p_(1, 2) = sin(xhat_p_(3)); + A_p_(1, 3) = xhat_p_(2)*cosf(xhat_p_(3)); + A_p_(2, 2) = -Vgdot/xhat_p_(2); + A_p_(2, 4) = -psidot*Vahat*sinf(xhat_p_(6))/xhat_p_(2); + A_p_(2, 5) = psidot*Vahat*cosf(xhat_p_(6))/xhat_p_(2); + A_p_(2, 6) = tmp; + A_p_(3, 2) = -params.gravity/powf(xhat_p_(2), 2)*tanf(phihat)*cosf(xhat_p_(3) - xhat_p_(6)); + A_p_(3, 3) = -params.gravity/xhat_p_(2)*tanf(phihat)*sinf(xhat_p_(3) - xhat_p_(6)); + A_p_(3, 6) = params.gravity/xhat_p_(2)*tanf(phihat)*sinf(xhat_p_(3) - xhat_p_(6)); + + xhat_p_ += f_p_*(params.Ts/N_); + P_p_ += (A_p_*P_p_ + P_p_*A_p_.transpose() + Q_p_)*(params.Ts/N_); + } + +// while(xhat_p(3) > radians(180.0f)) xhat_p(3) = xhat_p(3) - radians(360.0f); +// while(xhat_p(3) < radians(-180.0f)) xhat_p(3) = xhat_p(3) + radians(360.0f); +// if(xhat_p(3) > radians(180.0f) || xhat_p(3) < radians(-180.0f)) +// { +// ROS_WARN("Course estimate not wrapped from -pi to pi"); +// xhat_p(3) = 0; +// } + + // measurement updates + if (input.gps_new) + { + Eigen::MatrixXf I_p(7, 7); + I_p = Eigen::MatrixXf::Identity(7, 7); + + // gps North position + h_p_ = xhat_p_(0); + C_p_ = Eigen::VectorXf::Zero(7); + C_p_(0) = 1; + L_p_ = (P_p_*C_p_)/(R_p_(0, 0) + (C_p_.transpose()*P_p_*C_p_)); + P_p_ = (I_p - L_p_*C_p_.transpose())*P_p_; + xhat_p_ = xhat_p_ + L_p_*(input.gps_n - h_p_); + + // gps East position + h_p_ = xhat_p_(1); + C_p_ = Eigen::VectorXf::Zero(7); + C_p_(1) = 1; + L_p_ = (P_p_*C_p_)/(R_p_(1, 1) + (C_p_.transpose()*P_p_*C_p_)); + P_p_ = (I_p - L_p_*C_p_.transpose())*P_p_; + xhat_p_ = xhat_p_ + L_p_*(input.gps_e - h_p_); + + // gps ground speed + h_p_ = xhat_p_(2); + C_p_ = Eigen::VectorXf::Zero(7); + C_p_(2) = 1; + L_p_ = (P_p_*C_p_)/(R_p_(2, 2) + (C_p_.transpose()*P_p_*C_p_)); + P_p_ = (I_p - L_p_*C_p_.transpose())*P_p_; + xhat_p_ = xhat_p_ + L_p_*(input.gps_Vg - h_p_); + + // gps course + //wrap course measurement + float gps_course = fmodf(input.gps_course, radians(360.0f)); + + while (gps_course - xhat_p_(3) > radians(180.0f)) gps_course = gps_course - radians(360.0f); + while (gps_course - xhat_p_(3) < radians(-180.0f)) gps_course = gps_course + radians(360.0f); + h_p_ = xhat_p_(3); + C_p_ = Eigen::VectorXf::Zero(7); + C_p_(3) = 1; + L_p_ = (P_p_*C_p_)/(R_p_(3, 3) + (C_p_.transpose()*P_p_*C_p_)); + P_p_ = (I_p - L_p_*C_p_.transpose())*P_p_; + xhat_p_ = xhat_p_ + L_p_*(gps_course - h_p_); + +// // pseudo measurement #1 y_1 = Va*cos(psi)+wn-Vg*cos(chi) +// h_p = Vahat*cosf(xhat_p(6)) + xhat_p(4) - xhat_p(2)*cosf(xhat_p(3)); // pseudo measurement +// C_p = Eigen::VectorXf::Zero(7); +// C_p(2) = -cos(xhat_p(3)); +// C_p(3) = xhat_p(2)*sinf(xhat_p(3)); +// C_p(4) = 1; +// C_p(6) = -Vahat*sinf(xhat_p(6)); +// L_p = (P_p*C_p)/(R_p(4,4) + (C_p.transpose()*P_p*C_p)); +// P_p = (I_p - L_p*C_p.transpose())*P_p; +// xhat_p = xhat_p + L_p*(0 - h_p); + +// // pseudo measurement #2 y_2 = Va*sin(psi) + we - Vg*sin(chi) +// h_p = Vahat*sinf(xhat_p(6))+xhat_p(5)-xhat_p(2)*sinf(xhat_p(3)); // pseudo measurement +// C_p = Eigen::VectorXf::Zero(7); +// C_p(2) = -sin(xhat_p(3)); +// C_p(3) = -xhat_p(2)*cosf(xhat_p(3)); +// C_p(5) = 1; +// C_p(6) = Vahat*cosf(xhat_p(6)); +// L_p = (P_p*C_p)/(R_p(5,5) + (C_p.transpose()*P_p*C_p)); +// P_p = (I_p - L_p*C_p.transpose())*P_p; +// xhat_p = xhat_p + L_p*(0 - h_p); + + if (xhat_p_(0) > 10000 || xhat_p_(0) < -10000) + { + ROS_WARN("gps n limit reached"); + xhat_p_(0) = input.gps_n; + } + if (xhat_p_(1) > 10000 || xhat_p_(1) < -10000) + { + ROS_WARN("gps e limit reached"); + xhat_p_(1) = input.gps_e; + } + } + + bool problem = false; + int prob_index; + for (int i = 0; i < 7; i++) + { + if (!std::isfinite(xhat_p_(i))) + { + if (!problem) + { + problem = true; + prob_index = i; + } + switch (i) + { + case 0: + xhat_p_(i) = input.gps_n; + break; + case 1: + xhat_p_(i) = input.gps_e; + break; + case 2: + xhat_p_(i) = input.gps_Vg; + break; + case 3: + xhat_p_(i) = input.gps_course; + break; + case 6: + xhat_p_(i) = input.gps_course; + break; + default: + xhat_p_(i) = 0; + } + P_p_ = Eigen::MatrixXf::Identity(7, 7); + P_p_(0, 0) = .03; + P_p_(1, 1) = .03; + P_p_(2, 2) = .01; + P_p_(3, 3) = radians(5.0f); + P_p_(4, 4) = .04; + P_p_(5, 5) = .04; + P_p_(6, 6) = radians(5.0f); + } + } + if (problem) + { + ROS_WARN("position estimator reinitialized due to non-finite state %d", prob_index); + } + if (xhat_p_(6) - xhat_p_(3) > radians(360.0f) || xhat_p_(6) - xhat_p_(3) < radians(-360.0f)) + { + //xhat_p(3) = fmodf(xhat_p(3),2*M_PI); + xhat_p_(6) = fmodf(xhat_p_(6), 2*M_PI); + } + + float pnhat = xhat_p_(0); + float pehat = xhat_p_(1); + float Vghat = xhat_p_(2); + float chihat = xhat_p_(3); + float wnhat = xhat_p_(4); + float wehat = xhat_p_(5); + float psihat = xhat_p_(6); + + output.pn = pnhat; + output.pe = pehat; + output.h = hhat; + output.Va = Vahat; + output.alpha = 0; + output.beta = 0; + output.phi = phihat; + output.theta = thetahat; + output.chi = chihat; + output.p = phat; + output.q = qhat; + output.r = rhat; + output.Vg = Vghat; + output.wn = wnhat; + output.we = wehat; + output.psi = psihat; +} + +void estimator_example::check_xhat_a() +{ + if (xhat_a_(0) > radians(85.0) || xhat_a_(0) < radians(-85.0) || !std::isfinite(xhat_a_(0))) + { + if (!std::isfinite(xhat_a_(0))) + { + xhat_a_(0) = 0; + P_a_ = Eigen::Matrix2f::Identity(); + P_a_ *= powf(radians(20.0f), 2); + ROS_WARN("attiude estimator reinitialized due to non-finite roll"); + } + else if (xhat_a_(0) > radians(85.0)) + { + xhat_a_(0) = radians(82.0); + //ROS_WARN("max roll angle"); + } + else if (xhat_a_(0) < radians(-85.0)) + { + xhat_a_(0) = radians(-82.0); + //ROS_WARN("min roll angle"); + } + } + if (xhat_a_(1) > radians(80.0) || xhat_a_(1) < radians(-80.0) || !std::isfinite(xhat_a_(1))) + { + if (!std::isfinite(xhat_a_(1))) + { + xhat_a_(1) = 0; + P_a_ = Eigen::Matrix2f::Identity(); + P_a_ *= powf(radians(20.0f), 2); + ROS_WARN("attiude estimator reinitialized due to non-finite pitch"); + } + else if (xhat_a_(1) > radians(80.0)) + { + xhat_a_(1) = radians(77.0); + ROS_WARN("max pitch angle"); + } + else if (xhat_a_(1) < radians(-80.0)) + { + xhat_a_(1) = radians(-77.0); + ROS_WARN("min pitch angle"); + } + } +} + +} //end namespace diff --git a/Flight_control/src/enemy_suv/suv_move/src/path_follower_base.cpp b/Flight_control/src/enemy_suv/suv_move/src/path_follower_base.cpp new file mode 100644 index 0000000..c210ecd --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/src/path_follower_base.cpp @@ -0,0 +1,162 @@ +#include "path_follower_base.h" +#include "path_follower_example.h" + +namespace rosplane +{ + +path_follower_base::path_follower_base() : nh_(ros::NodeHandle()), + nh_private_(ros::NodeHandle("~")) +{ + vehicle_state_sub_ = nh_.subscribe("state", 1, &path_follower_base::vehicle_state_callback, this); + bebop1_state_sub_ = nh_.subscribe("ground_truth/state", 1, &path_follower_base::bebop1_state_callback, this); + //bebop1_state_sub_ = nh_.subscribe("/test/odom", 1, &path_follower_base::bebop1_state_callback, this); + + current_path_sub_ = nh_.subscribe("current_path", 1, + &path_follower_base::current_path_callback, this); + + nh_private_.param("CHI_INFTY", params_.chi_infty, 1.0472); + nh_private_.param("K_PATH", params_.k_path, 0.025); + nh_private_.param("K_ORBIT", params_.k_orbit, 4.0); + + func_ = boost::bind(&path_follower_base::reconfigure_callback, this, _1, _2); + server_.setCallback(func_); + + update_timer_ = nh_.createTimer(ros::Duration(1.0 / update_rate_), &path_follower_base::update, this); + controller_commands_pub_ = nh_.advertise("controller_commands", 1); + + state_init_ = false; + current_path_init_ = false; +} + +void path_follower_base::update(const ros::TimerEvent &) +{ + + struct output_s output; + + if (state_init_ == true && current_path_init_ == true) + { + follow(params_, input_, output); + rosplane_msgs::Controller_Commands msg; + msg.chi_c = output.chi_c; + msg.landing=input_.landing; + msg.takeoff=input_.takeoff; + if (input_.Va_c_path == 0) + { + // ROS_INFO("Hello1"); + msg.Va_c = 0; + } + else + { + // ROS_INFO("Hello2"); + msg.Va_c = input_.Va_d; + } + + // ROS_INFO("what %f",msg.Va_c); + + msg.h_c = output.h_c; + msg.phi_ff = output.phi_ff; + controller_commands_pub_.publish(msg); + } +} + +void path_follower_base::vehicle_state_callback(const rosplane_msgs::StateConstPtr &msg) +{ + // input_.pn = msg->position[0]; /** position north */ + // input_.pe = msg->position[1]; /** position east */ + // input_.h = -msg->position[2]; /** altitude */ + // input_.chi = msg->chi; + // input_.Va = msg->Va; + + // state_init_ = true; +} +void path_follower_base::bebop1_state_callback(const nav_msgs::Odometry::ConstPtr &msg) +{ + // ROS_INFO("%g", msg->pose.pose.position.x); /** position north */ + input_.pn = msg->pose.pose.position.x; /** position north */ + input_.pe = msg->pose.pose.position.y; /** position east */ + input_.h = msg->pose.pose.position.z; /** altitude */ + input_.Va = sqrt(pow(msg->twist.twist.linear.x, 2) + pow(msg->twist.twist.linear.y, 2)); + input_.chi = path_follower_base::Quaternion_to_Euler(msg->pose.pose.orientation.x, msg->pose.pose.orientation.y, msg->pose.pose.orientation.z, msg->pose.pose.orientation.w); + // ROS_INFO("%g %g %g %g %g",input_.pn,input_.pe,input_.h,input_.Va,input_.chi); + state_init_ = true; +} + +float path_follower_base::Quaternion_to_Euler(float q0, float q1, float q2, float q3) +{ + float Radx; + float sum; + sum = sqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3); + if (sum == 0) + { + sum = 0.0001; + } + q0 = q0 / sum; + q1 = q1 / sum; + q2 = q2 / sum; + q3 = q3 / sum; + if (fabs(q2) < fabs(q3)) + { + Radx = asin(2.0f * (q2 * q3 + q0 * q1)); + return Radx; + } + else + { + if (q2 * q3 > 0) + { + Radx = 3.14159 - asin(2.0f * (q2 * q3 + q0 * q1)); + return Radx; + } + else + { + Radx = -3.14159 - asin(2.0f * (q2 * q3 + q0 * q1)); + return Radx; + } + } + //Radx = asin(2.0f*(q2*q3 + q0*q1)); + //Rady = atan2(-2 * q1 * q3 + 2 * q0 * q2, q3*q3 - q2 * q2 - q1 * q1 + q0 * q0); + //Radz = atan2(2 * q1*q2 - 2 * q0*q3, q2*q2 - q3*q3 + q0*q0 - q1*q1); + //return Radx; +} +void path_follower_base::current_path_callback(const rosplane_msgs::Current_PathConstPtr &msg) +{ + if (msg->path_type == msg->LINE_PATH) + input_.p_type = path_type::Line; + else if (msg->path_type == msg->ORBIT_PATH) + input_.p_type = path_type::Orbit; + else if (msg->path_type == msg->STAR_PATH) // add by kobe + input_.p_type = path_type::Star; + + input_.Va_d = msg->Va_d; + // ROS_INFO("hello %f",input_.Va_d); + for (int i = 0; i < 3; i++) + { + input_.r_path[i] = msg->r[i]; + input_.q_path[i] = msg->q[i]; + input_.c_orbit[i] = msg->c[i]; + } + input_.rho_orbit = msg->rho; + input_.lam_orbit = msg->lambda; + input_.h_c_path = msg->h_c; //add by kobe + input_.Va_c_path = msg->Va_d; + input_.landing = msg->landing; + input_.takeoff = msg->takeoff; + current_path_init_ = true; +} + +void path_follower_base::reconfigure_callback(rosplane::FollowerConfig &config, uint32_t level) +{ + params_.chi_infty = config.CHI_INFTY; + params_.k_path = config.K_PATH; + params_.k_orbit = config.K_ORBIT; +} +} // namespace rosplane + +int main(int argc, char **argv) +{ + ros::init(argc, argv, "rosplane_path_follower"); + rosplane::path_follower_base *path = new rosplane::path_follower_example(); + + ros::spin(); + + return 0; +} diff --git a/Flight_control/src/enemy_suv/suv_move/src/path_follower_example.cpp b/Flight_control/src/enemy_suv/suv_move/src/path_follower_example.cpp new file mode 100644 index 0000000..f4c09af --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/src/path_follower_example.cpp @@ -0,0 +1,81 @@ +#include "path_follower_example.h" + + +namespace rosplane +{ + +path_follower_example::path_follower_example() +{ +} + +void path_follower_example::follow(const params_s ¶ms, const input_s &input, output_s &output) +{ + if (input.p_type == path_type::Line) // follow straight line path specified by r and q + { + // compute wrapped version of the path angle + float chi_q = atan2f(input.q_path[1], input.q_path[0]); + + // modified by kobe + float chi=input.chi; + while (chi < -M_PI) + chi += 2*M_PI; + while (chi > M_PI) + chi -= 2*M_PI; + + + while (chi_q - chi < -M_PI) + chi_q += 2*M_PI; + while (chi_q - chi > M_PI) + chi_q -= 2*M_PI; + + float path_error = -sinf(chi_q)*(input.pn - input.r_path[0]) + cosf(chi_q)*(input.pe - input.r_path[1]); + // heading command + output.chi_c = chi_q - params.chi_infty*2/M_PI*atanf(params.k_path*path_error); + //ROS_INFO("hello1: %g %g %g %g",chi_q,input.chi,chi,output.chi_c); + + // desired altitude + output.h_c = -input.h_c_path;//h_c_path is negative;h_c is positive. + //kobe modified end + + /* ////for truth not state + while (chi_q - input.chi < -M_PI) + chi_q += 2*M_PI; + while (chi_q - input.chi > M_PI) + chi_q -= 2*M_PI; + float path_error = -sinf(chi_q)*(input.pn - input.r_path[0]) + cosf(chi_q)*(input.pe - input.r_path[1]); + // heading command + output.chi_c = chi_q - params.chi_infty*2/M_PI*atanf(params.k_path*path_error); //desired altitude + float h_d = -input.r_path[2] - sqrtf(powf((input.r_path[0] - input.pn), 2) + powf((input.r_path[1] - input.pe), + 2))*(input.q_path[2])/sqrtf(powf(input.q_path[0], 2) + powf(input.q_path[1], 2)); + // commanded altitude is desired altitude + output.h_c = h_d;// -input.r_path[2] - x// important for hover// kobe denote + */ + output.phi_ff = 0.0; + } + else if(input.p_type == path_type::Orbit)// follow a orbit path specified by c_orbit, rho_orbit, and lam_orbit + { + float d = sqrtf(powf((input.pn - input.c_orbit[0]), 2) + powf((input.pe - input.c_orbit[1]), + 2)); // distance from orbit center + // compute wrapped version of angular position on orbit + float varphi = atan2f(input.pe - input.c_orbit[1], input.pn - input.c_orbit[0]); + while ((varphi - input.chi) < -M_PI) + varphi += 2*M_PI; + while ((varphi - input.chi) > M_PI) + varphi -= 2*M_PI; + //compute orbit error + float norm_orbit_error = (d - input.rho_orbit)/input.rho_orbit; + output.chi_c = varphi + input.lam_orbit*(M_PI/2 + atanf(params.k_orbit*norm_orbit_error)); + + // commanded altitude is the height of the orbit + float h_d = -input.c_orbit[2]; + output.h_c = h_d; + output.phi_ff = 0;//(norm_orbit_error < 0.5 ? input.lam_orbit*atanf(input.Va*input.Va/(9.8*input.rho_orbit)) : 0); + } + else if(input.p_type == path_type::Star)// towards to a point in any direction on platform,r is the center;add by kobe + { + + } + output.Va_c = input.Va_d; +} + +} //end namespace diff --git a/Flight_control/src/enemy_suv/suv_move/src/path_manager_base.cpp b/Flight_control/src/enemy_suv/suv_move/src/path_manager_base.cpp new file mode 100644 index 0000000..7bb65f5 --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/src/path_manager_base.cpp @@ -0,0 +1,238 @@ +#include "path_manager_base.h" +#include "path_manager_example.h" + +namespace rosplane +{ + +path_manager_base::path_manager_base() : nh_(ros::NodeHandle()), /** nh_ stuff added here */ + nh_private_(ros::NodeHandle("~")) +{ + nh_private_.param("R_min", params_.R_min, 25); //25 + nh_private_.param("update_rate", update_rate_, 10.0); + + vehicle_state_sub_ = nh_.subscribe("state", 10, &path_manager_base::vehicle_state_callback, this); + bebop1_state_sub_ = nh_.subscribe("ground_truth/state", 10, &path_manager_base::bebop1_state_callback, this); + //bebop1_state_sub_ = nh_.subscribe("/test/odom", 10, &path_manager_base::bebop1_state_callback, this); + + new_waypoint_sub_ = nh_.subscribe("waypoint_path", 10, &path_manager_base::new_waypoint_callback, this); + + current_path_pub_ = nh_.advertise("current_path", 10); + goal_info_pub_ = nh_.advertise("Goal_Info", 10); + down_data_pub_ = nh_.advertise("serial_commu_down", 10); + + waypoint_received_sub_ = nh_.subscribe("new_waypoint", 10, &path_manager_base::waypoint_received_callback, this); + + update_timer_ = nh_.createTimer(ros::Duration(1.0 / update_rate_), &path_manager_base::current_path_publish, this); + + num_waypoints_ = 0; + + state_init_ = false; + + waypoint_received_ = false; +} + +void path_manager_base::waypoint_received_callback(const rosplane_msgs::Waypoint &msg) +{ + float ell = sqrtf((waypoint_end_.w[0] - msg.w[0]) * (waypoint_end_.w[0] - msg.w[0]) + + (waypoint_end_.w[1] - msg.w[1]) * (waypoint_end_.w[1] - msg.w[1])); + if (ell < 2.0 * params_.R_min) + { + ROS_ERROR("The distance between nodes must be larger than 2R."); + return; + } + waypoint_start_ = waypoint_end_; + + waypoint_end_.w[0] = msg.w[0]; + waypoint_end_.w[1] = msg.w[1]; + waypoint_end_.w[2] = msg.w[2]; + waypoint_end_.chi_d = msg.chi_d; + waypoint_end_.chi_valid = msg.chi_valid; + waypoint_end_.Va_d = msg.Va_d; + + waypoint_received_ = true; +} + +void path_manager_base::vehicle_state_callback(const rosplane_msgs::StateConstPtr &msg) +{ + vehicle_state_ = *msg; + //state_init_ = true; +} + +void path_manager_base::bebop1_state_callback(const nav_msgs::Odometry::ConstPtr &msg) +{ + bebop1_state_ = *msg; + state_init_ = true; +} + +void path_manager_base::new_waypoint_callback(const rosplane_msgs::Waypoint &msg) +{ + if (msg.clear_wp_list == true) + { + waypoints_.clear(); + num_waypoints_ = 0; + idx_a_ = 0; + min_distance_ = 1000000000; //add by kobe, just need to be larger than the large-enter-ball's radius. + min_distance_titude = 10000000000; + //return; + } + if (msg.set_current || num_waypoints_ == 0)//mean to set the start point as the a goal-never use---kobe denote + { + waypoint_s currentwp; + currentwp.w[0] = bebop1_state_.pose.pose.position.x; + currentwp.w[1] = bebop1_state_.pose.pose.position.y; + currentwp.w[2] = (-bebop1_state_.pose.pose.position.z > -25 ? msg.w[2] : -bebop1_state_.pose.pose.position.z); + currentwp.chi_d= path_manager_base::Quaternion_to_Euler(bebop1_state_.pose.pose.orientation.x,bebop1_state_.pose.pose.orientation.y,bebop1_state_.pose.pose.orientation.z,bebop1_state_.pose.pose.orientation.w); + // currentwp.w[0] = vehicle_state_.position[0]; + // currentwp.w[1] = vehicle_state_.position[1]; + // currentwp.w[2] = (vehicle_state_.position[2] > -25 ? msg.w[2] : vehicle_state_.position[2]); + // currentwp.chi_d = vehicle_state_.chi; + // add by kobe + currentwp.lat = vehicle_state_.Wd; + currentwp.lon = vehicle_state_.Jd; + + currentwp.chi_valid = msg.chi_valid; + currentwp.Va_d = msg.Va_d; + currentwp.landing=msg.landing; + currentwp.takeoff=msg.takeoff; + waypoints_.clear(); + waypoints_.push_back(currentwp); + num_waypoints_ = 1; + idx_a_ = 0; + min_distance_ = 10000000000; //add by kobe, just need to be larger than the large-enter-ball's radius. + min_distance_titude = 10000000000; + show = 1; + show2=1; + } + waypoint_s nextwp; + nextwp.w[0] = msg.w[0]; + nextwp.w[1] = msg.w[1]; + nextwp.w[2] = msg.w[2]; + // add by kobe + nextwp.lat=msg.lat; + nextwp.lon=msg.lon; + + nextwp.chi_d = msg.chi_d; + nextwp.chi_valid = msg.chi_valid; + nextwp.Va_d = msg.Va_d; + nextwp.landing=msg.landing; + nextwp.takeoff=msg.takeoff; + waypoints_.push_back(nextwp); + num_waypoints_++; + // ROS_INFO("num_waypoints_: %d", num_waypoints_); +} + +void path_manager_base::current_path_publish(const ros::TimerEvent &) +{ + struct input_s input; + input.pn = bebop1_state_.pose.pose.position.x; /** position north */ + input.pe = bebop1_state_.pose.pose.position.y; /** position east */ + input.h = bebop1_state_.pose.pose.position.z; /** altitude */ + input.chi =path_manager_base::Quaternion_to_Euler(bebop1_state_.pose.pose.orientation.x,bebop1_state_.pose.pose.orientation.y,bebop1_state_.pose.pose.orientation.z,bebop1_state_.pose.pose.orientation.w); + input.va = sqrt(pow(bebop1_state_.twist.twist.linear.x,2)+pow(bebop1_state_.twist.twist.linear.y,2)); + // input.pn = vehicle_state_.position[0]; /** position north */ + // input.pe = vehicle_state_.position[1]; /** position east */ + // input.h = -vehicle_state_.position[2]; /** altitude */ + // input.chi = vehicle_state_.chi; + // input.va = vehicle_state_.Va; + + //add by kobe + input.lat=vehicle_state_.Wd; + input.lon=vehicle_state_.Jd; + + struct output_s output; + + if (state_init_ == true) + { + manage(params_, input, output); + } + + rosplane_msgs::Current_Path current_path; + + rosplane_msgs::Goal_Info goal_info; + rosplane_msgs::Down_Data_New down_data; + // modified by kobe + if (output.flag == 1) + current_path.path_type = current_path.LINE_PATH; + else if (output.flag == 0) + current_path.path_type = current_path.ORBIT_PATH; + else if (output.flag == 2) + current_path.path_type = current_path.STAR_PATH; + + for (int i = 0; i < 3; i++) + { + current_path.r[i] = output.r[i]; + current_path.q[i] = output.q[i]; + current_path.c[i] = output.c[i]; + } + current_path.rho = output.rho; + current_path.lambda = output.lambda; + current_path.h_c = output.h_c; + current_path.Va_d = output.Va_c; //new speed + current_path.takeoff=output.takeoff; + current_path.landing=output.landing; + current_path_pub_.publish(current_path); + + goal_info.altitude=-output.h_c; + goal_info.v_d=output.Va_d; + goal_info.action=1;//desired action move + for (int i = 0; i < 2; i++) + { + goal_info.xy[i] = output.gxy[i]; + goal_info.ll[i] = output.gll[i]; + } + goal_info_pub_.publish(goal_info); // add by kobe + + down_data.latitude = output.gll[0]; + down_data.longitude = output.gll[1]; + down_data.altitude = -output.h_c; + down_data.plane_speed= output.Va_d; + down_data.status_word= 1; + //ROS_INFO("Look here %f %f %f %f",down_data.latitude,down_data.longitude,down_data.altitude,output.Va_d); + down_data_pub_.publish(down_data); // add by kobe +} + +//add by kobe +float path_manager_base::Quaternion_to_Euler(float q0, float q1, float q2, float q3) +{ + float Radx; + float sum; + sum = sqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3); + if (sum == 0) + { + sum = 0.0001; + } + q0 = q0 / sum; + q1 = q1 / sum; + q2 = q2 / sum; + q3 = q3 / sum; + if (fabs(q2) < fabs(q3)) + { + Radx = asin(2.0f * (q2 * q3 + q0 * q1)); + return Radx; + } + else + { + if (q2 * q3 > 0) + { + Radx = 3.14159 - asin(2.0f * (q2 * q3 + q0 * q1)); + return Radx; + } + else + { + Radx = -3.14159 - asin(2.0f * (q2 * q3 + q0 * q1)); + return Radx; + } + } +} + +} // namespace rosplane + +int main(int argc, char **argv) +{ + ros::init(argc, argv, "rosplane_path_manager"); + rosplane::path_manager_base *est = new rosplane::path_manager_example(); + + ros::spin(); + + return 0; +} diff --git a/Flight_control/src/enemy_suv/suv_move/src/path_manager_example.cpp b/Flight_control/src/enemy_suv/suv_move/src/path_manager_example.cpp new file mode 100644 index 0000000..1c95ee4 --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/src/path_manager_example.cpp @@ -0,0 +1,717 @@ +#include "path_manager_example.h" +#include "ros/ros.h" +#include + +namespace rosplane +{ + +path_manager_example::path_manager_example() : path_manager_base() +{ + fil_state_ = fillet_state::STRAIGHT; + // use this ! + dub_state_ = dubin_state::FIRST; +} +// done +void path_manager_example::manage(const params_s ¶ms, const input_s &input, output_s &output) +{ + + //ROS_INFO("num_waypoints_: %d",num_waypoints_); + if (num_waypoints_ < 2) + { + ROS_WARN_THROTTLE(4, "No waypoints received! Loitering about origin at 50m"); + output.flag = 0; //modified by kobe + output.Va_d = 12; + output.c[0] = 0.0f; + output.c[1] = 0.0f; + output.c[2] = -50.0f; + // Radius of orbital path (m) + output.rho = params.R_min; + // Direction of orbital path (clockwise is 1, counterclockwise is -1) + output.lambda = 1; + } + else + { + // do this, idx_a_ is initialized zero + if (waypoints_[idx_a_].chi_valid) + { + manage_dubins(params, input, output); + } + else + { + /** Switch the following for flying directly to waypoints, or filleting corners */ + // manage_line(params, input, output); + //manage_fillet(params, input, output); + manage_star(params, input, output); //add by kobe + } + } +} + +// add by kobe +void path_manager_example::manage_star(const params_s ¶ms, const input_s &input, output_s &output) +{ + Eigen::Vector3f w_start; + w_start << input.pn, input.pe, -input.h; //aircraft's position + + int idx_b; + int idx_c; + float the_distance_; + double the_distance_titude; //for latitude and longtitude + idx_b = idx_a_ + 1; + + if (idx_a_ < num_waypoints_ - 2) + { + idx_c = idx_b + 1; + } + else + { + idx_c = idx_b; + } + Eigen::Vector3f w_ip1(waypoints_[idx_c].w); + + Eigen::Vector3f w_im1(waypoints_[idx_a_].w); + Eigen::Vector3f w_i(waypoints_[idx_b].w); //the goal + + the_distance_ = sqrt(pow(w_start(0) - w_i(0), 2) + pow(w_start(1) - w_i(1), 2)); + the_distance_titude = earth_distance(input.lat, input.lon, waypoints_[idx_b].lat, waypoints_[idx_b].lon); + + output.flag = 1; //modified by kobe + output.Va_d = waypoints_[idx_b].Va_d; //modified by kobe + + //ROS_INFO("position: %g %g %g",w_start(0),w_start(1),w_start(2)); + //ROS_INFO("Current info are: %f %f %f %f", input.va, -input.h,w_start(0),w_start(1)); + + output.r[0] = w_start(0); + output.r[1] = w_start(1); + output.r[2] = w_start(2); + Eigen::Vector3f q_im1 = (w_i - w_start).normalized(); + output.q[0] = q_im1(0); + output.q[1] = q_im1(1); + output.q[2] = q_im1(2); + + output.gxy[0] = w_i(0); + output.gxy[1] = w_i(1); + output.gll[0] = waypoints_[idx_b].lat; + output.gll[1] = waypoints_[idx_b].lon; + output.h_c = w_i(2); //altitude of the goal + + if (idx_a_ == 0&&show2 == 1) + { + ROS_INFO("First goal info are: %f %f", w_i(0), w_i(1)); + ROS_INFO("Desired fly speed and height are: %f %f", output.Va_d, -w_i(2)); + show2=0; + } + //enter the slow-down area,recompute the speed + if (sqrt(pow(w_start(0) - w_i(0), 2) + pow(w_start(1) - w_i(1), 2)) < output.Va_d * 2 && idx_a_ == num_waypoints_ - 2) //enter the slowdown-ball and the goal is the last goal + { + output.Va_c = sqrt(pow(w_start(0) - w_i(0), 2) + pow(w_start(1) - w_i(1), 2))/2; + if (sqrt(pow(w_start(0) - w_i(0), 2) + pow(w_start(1) - w_i(1), 2)) < 0.5 ) + { + output.Va_c = 0; + } + // ROS_INFO("Now the speed is: %f",output.Va_c); + } + else + { + output.Va_c = output.Va_d; + } + output.landing=waypoints_[idx_b].landing; + output.takeoff=waypoints_[idx_b].takeoff; + /* //1.enter a tiny ball and switch goal + if (sqrt(pow(w_start(0) - w_i(0), 2) + pow(w_start(1) - w_i(1), 2)) < 5) //enter a tiny ball and switch goal + { + //ROS_INFO("00000o- %g %g %g", w_start(2), w_i(2), sqrt(pow(w_start(0) - w_i(0), 2) + pow(w_start(1) - w_i(1), 2))); + //ROS_INFO("last goal is: %f %f", w_i(0), w_i(1)); + //ROS_INFO("Va- %f/n", input.va); + if (idx_a_ == num_waypoints_ - 2) + { + idx_a_ = idx_a_; //do not update goal + //ROS_INFO("idx_a_- %f/n", idx_a_); + } + else + { + idx_a_++; + } + } + */ + /* + //2.enter a half-plane and switch,ahead 5 m from the goal point + Eigen::Vector3f w_i_plane; + w_i_plane=w_i; + w_i_plane(0)=w_i_plane(0)-5*( ( w_i(0)-w_im1(0) ) / ( 0.001+fabs(w_i(0)-w_im1(0)) ) ); + w_i_plane(1)=w_i_plane(1)-5*( ( w_i(1)-w_im1(1) ) / ( 0.001+fabs(w_i(1)-w_im1(1)) ) ); + if ((w_i_plane - w_start).normalized().dot((w_i_plane - w_im1).normalized())<0)//plane-method + { + if (idx_a_ == num_waypoints_ - 2) + idx_a_ = idx_a_;//do not update goal + else + idx_a_++; + } + */ + //3.Enter a large ball(large-enter-ball) first. Anyway, when the distance from the aircraft to goal become larger,switch to the next goal. + if (the_distance_ < min_distance_) + { + min_distance_ = the_distance_; + } + if (the_distance_titude < min_distance_titude) + { + min_distance_titude = the_distance_titude; + } + + // ROS_INFO("distance is : %.20f %f", earth_distance(input.lat, input.lon, waypoints_[idx_b].lat, waypoints_[idx_b].lon), sqrt(pow(w_start(0) - w_i(0), 2) + pow(w_start(1) - w_i(1), 2))); + + //ROS_INFO("000distance- %f %f", the_distance_, min_distance_); + //1.进入大圈且最小距离开始增大时;2.进入一个小圈时�?分别针对北东坐标和经纬度坐标 + judge_condition1 = (sqrt(pow(w_start(0) - w_i(0), 2) + pow(w_start(1) - w_i(1), 2)) < 3 && the_distance_ > min_distance_ + 1); + judge_condition2 = (earth_distance(input.lat, input.lon, waypoints_[idx_b].lat, waypoints_[idx_b].lon) < 3 && the_distance_titude > min_distance_titude + 1); + judge_condition3 = (sqrt(pow(w_start(0) - w_i(0), 2) + pow(w_start(1) - w_i(1), 2)) < 0.5); + judge_condition4 = (earth_distance(input.lat, input.lon, waypoints_[idx_b].lat, waypoints_[idx_b].lon) < 0.5); + // height judge + judge_condition5 = (sqrt(pow(w_start(2) - w_i(2), 2)) < 10); + + //notice here + judge_condition2=0; + judge_condition4=0; + + if ((judge_condition1 || judge_condition2 || judge_condition3 || judge_condition4) && judge_condition5) //switch + { + //ROS_INFO("distance- %f %f", the_distance_, min_distance_); + if (idx_a_ == num_waypoints_ - 2) + { + if (show == 1) + { + ROS_INFO("This goal is reached: %f %f", w_i(0), w_i(1)); + ROS_INFO("Current position are: %f %f", input.pn, input.pe); + ROS_INFO("No more goal, just hover and wait for the next goal."); + ROS_INFO("Desired speed and height are: %f %f", output.Va_d, -w_i(2)); + ROS_INFO("Current speed and height are: %f %f\n\n", input.va, input.h); + show = 0; + } + idx_a_ = idx_a_; //do not update goal + } + else + { + ROS_INFO("This goal is reached: %f %f", w_i(0), w_i(1)); + ROS_INFO("Current position are: %f %f", input.pn, input.pe); + ROS_INFO("Desired speed and height are: %f %f", output.Va_d, -w_i(2)); + ROS_INFO("Current speed and height are: %f %f", input.va, input.h); + ROS_INFO("New goal info are: %f %f\n\n", w_ip1(0), w_ip1(1)); + min_distance_ = sqrt(pow(w_i(0) - w_ip1(0), 2) + pow(w_i(1) - w_ip1(1), 2)); + idx_a_++; + } + } + // +} + +double path_manager_example::earth_distance(double latitude1, double longitude1, double latitude2, double longitude2) +{ + double Lat1 = latitude1 * M_PI_F / 180.00; // 纬度 + double Lat2 = latitude2 * M_PI_F / 180.00; + double a = Lat1 - Lat2; //两点纬度之差 + double b = longitude1 * M_PI_F / 180.00 - longitude2 * M_PI_F / 180.00; //经度之差 + double s = 2 * asin(sqrt(pow(sin(a / 2), 2) + cos(Lat1) * cos(Lat2) * pow(sin(b / 2), 2))); //计算两点距离的公�?/better when value is very samll + //double s2 = acos(cos(Lat1)*cos(Lat2)*cos(b)+sin(Lat1)*sin(Lat2));//计算两点距离的公�? + s = s * EARTH_RADIUS; //弧长乘地球半径(半径为米�? + //s2 = s2 * EARTH_RADIUS;//弧长乘地球半径(半径为米�? + return s; +} + +void path_manager_example::manage_line(const params_s ¶ms, const input_s &input, output_s &output) +{ + Eigen::Vector3f p; + p << input.pn, input.pe, -input.h; + + int idx_b; + int idx_c; + if (idx_a_ == num_waypoints_ - 1) + { + idx_b = 0; + idx_c = 1; + } + else if (idx_a_ == num_waypoints_ - 2) + { + idx_b = num_waypoints_ - 1; + idx_c = 0; + } + else + { + idx_b = idx_a_ + 1; + idx_c = idx_b + 1; + } + + Eigen::Vector3f w_im1(waypoints_[idx_a_].w); + Eigen::Vector3f w_i(waypoints_[idx_b].w); + Eigen::Vector3f w_ip1(waypoints_[idx_c].w); + + output.flag = true; + output.Va_d = waypoints_[idx_a_].Va_d; + output.r[0] = w_im1(0); + output.r[1] = w_im1(1); + output.r[2] = w_im1(2); + Eigen::Vector3f q_im1 = (w_i - w_im1).normalized(); + Eigen::Vector3f q_i = (w_ip1 - w_i).normalized(); + output.q[0] = q_im1(0); + output.q[1] = q_im1(1); + output.q[2] = q_im1(2); + + Eigen::Vector3f n_i = (q_im1 + q_i).normalized(); + if ((p - w_i).dot(n_i) > 0.0f) + { + if (idx_a_ == num_waypoints_ - 1) + idx_a_ = 0; + else + idx_a_++; + } +} +void path_manager_example::manage_fillet(const params_s ¶ms, const input_s &input, output_s &output) +{ + if (num_waypoints_ < 3) //since it fillets don't make sense between just two points + { + manage_line(params, input, output); + return; + } + + Eigen::Vector3f p; + p << input.pn, input.pe, -input.h; + + int idx_b; + int idx_c; + if (idx_a_ == num_waypoints_ - 1) + { + idx_b = 0; + idx_c = 1; + } + else if (idx_a_ == num_waypoints_ - 2) + { + idx_b = num_waypoints_ - 1; + idx_c = 0; + } + else + { + idx_b = idx_a_ + 1; + idx_c = idx_b + 1; + } + + Eigen::Vector3f w_im1(waypoints_[idx_a_].w); + Eigen::Vector3f w_i(waypoints_[idx_b].w); + Eigen::Vector3f w_ip1(waypoints_[idx_c].w); + + float R_min = params.R_min; + + output.Va_d = waypoints_[idx_a_].Va_d; + output.r[0] = w_im1(0); + output.r[1] = w_im1(1); + output.r[2] = w_im1(2); + Eigen::Vector3f q_im1 = (w_i - w_im1).normalized(); + Eigen::Vector3f q_i = (w_ip1 - w_i).normalized(); + float beta = acosf(-q_im1.dot(q_i)); + + Eigen::Vector3f z; + switch (fil_state_) + { + case fillet_state::STRAIGHT: + output.flag = 1; //modified by kobe + output.q[0] = q_im1(0); + output.q[1] = q_im1(1); + output.q[2] = q_im1(2); + output.c[0] = 1; + output.c[1] = 1; + output.c[2] = 1; + output.rho = 1; + output.lambda = 1; + z = w_i - q_im1 * (R_min / tanf(beta / 2.0)); + if ((p - z).dot(q_im1) > 0) + fil_state_ = fillet_state::ORBIT; + break; + case fillet_state::ORBIT: + output.flag = 0; //modified by kobe + output.q[0] = q_i(0); + output.q[1] = q_i(1); + output.q[2] = q_i(2); + Eigen::Vector3f c = w_i - (q_im1 - q_i).normalized() * (R_min / sinf(beta / 2.0)); + output.c[0] = c(0); + output.c[1] = c(1); + output.c[2] = c(2); + output.rho = R_min; + output.lambda = ((q_im1(0) * q_i(1) - q_im1(1) * q_i(0)) > 0 ? 1 : -1); + z = w_i + q_i * (R_min / tanf(beta / 2.0)); + if ((p - z).dot(q_i) > 0) + { + if (idx_a_ == num_waypoints_ - 1) + idx_a_ = 0; + else + idx_a_++; + fil_state_ = fillet_state::STRAIGHT; + } + break; + } +} + +void path_manager_example::manage_dubins(const params_s ¶ms, const input_s &input, output_s &output) +{ + Eigen::Vector3f p; + //ROS_INFO("input.pn: %f, input.pe: %f, -input.h: %f",input.pn, input.pe, -input.h); + p << input.pn, input.pe, -input.h; + + /* uint8 path_type # Indicates strait line or orbital path + float32 Va_d # Desired airspeed (m/s) + float32[3] r # Vector to origin of straight line path (m) + float32[3] q # Unit vector, desired direction of travel for line path + float32[3] c # Center of orbital path (m) + float32 rho # Radius of orbital path (m) + int8 lambda # Direction of orbital path (clockwise is 1, counterclockwise is -1) + + uint8 ORBIT_PATH = 0 + uint8 LINE_PATH = 1 + + int8 CLOCKWISE = 1 + int8 COUNT_CLOCKWISE = -1 */ + + output.Va_d = waypoints_[idx_a_].Va_d; + output.r[0] = 0; + output.r[1] = 0; + output.r[2] = 0; + output.q[0] = 0; + output.q[1] = 0; + output.q[2] = 0; + output.c[0] = 0; + output.c[1] = 0; + output.c[2] = 0; + //ROS_INFO("dub_state_: %d",dub_state_); + switch (dub_state_) + { + case dubin_state::FIRST: + // path planning + // Algorithm11 P211 + dubinsParameters(waypoints_[0], waypoints_[1], params.R_min); + + waypoint_start_ = waypoints_[0]; + waypoint_end_ = waypoints_[1]; + + output.flag = 0; //modified by kobe + output.c[0] = dubinspath_.cs(0); + output.c[1] = dubinspath_.cs(1); + output.c[2] = dubinspath_.cs(2); + output.rho = dubinspath_.R; + output.lambda = dubinspath_.lams; + // p: current pos + // w1: waypoint 1 + // q1: unit vector of H1 + if ((p - dubinspath_.w1).dot(dubinspath_.q1) >= 0) // start in H1 + { + dub_state_ = dubin_state::BEFORE_H1_WRONG_SIDE; + } + else + { + dub_state_ = dubin_state::BEFORE_H1; + } + break; + case dubin_state::BEFORE_H1: + //waypoint_received_ = false; + output.flag = 0; //modified by kobe + output.c[0] = dubinspath_.cs(0); + output.c[1] = dubinspath_.cs(1); + output.c[2] = dubinspath_.cs(2); + output.rho = dubinspath_.R; + output.lambda = dubinspath_.lams; + if ((p - dubinspath_.w1).dot(dubinspath_.q1) >= 0) // entering H1 + { + dub_state_ = dubin_state::STRAIGHT; + } + break; + case dubin_state::BEFORE_H1_WRONG_SIDE: + //waypoint_received_ = false; + output.flag = 0; //modified by kobe + output.c[0] = dubinspath_.cs(0); + output.c[1] = dubinspath_.cs(1); + output.c[2] = dubinspath_.cs(2); + output.rho = dubinspath_.R; + output.lambda = dubinspath_.lams; + if ((p - dubinspath_.w1).dot(dubinspath_.q1) < 0) // exit H1 + { + dub_state_ = dubin_state::BEFORE_H1; + } + break; + case dubin_state::STRAIGHT: + output.flag = 1; //modified by kobe + output.r[0] = dubinspath_.w1(0); + output.r[1] = dubinspath_.w1(1); + output.r[2] = dubinspath_.w1(2); + // output.r[0] = dubinspath_.z1(0); + // output.r[1] = dubinspath_.z1(1); + // output.r[2] = dubinspath_.z1(2); + output.q[0] = dubinspath_.q1(0); + output.q[1] = dubinspath_.q1(1); + output.q[2] = dubinspath_.q1(2); + output.rho = 1; + output.lambda = 1; + //ROS_INFO("pos: [%f,%f,%f],w2: [%f,%f,%f],q1: [%f,%f,%f]",p[0],p[1],p[2],dubinspath_.w2[0],dubinspath_.w2[1],dubinspath_.w2[2],dubinspath_.q1[0],dubinspath_.q1[1],dubinspath_.q1[2]); + //ROS_INFO("w3: [%f,%f,%f]",dubinspath_.w3[0],dubinspath_.w3[1],dubinspath_.w3[2]); + //ROS_INFO("w1: [%f,%f,%f]",dubinspath_.w1[0],dubinspath_.w1[1],dubinspath_.w1[2]); + + if (waypoint_received_) + { + //start new path + // plan new Dubin's path to next waypoint configuration + waypoint_start_.w[0] = p[0]; + waypoint_start_.w[1] = p[1]; + waypoint_start_.w[2] = p[2]; + waypoint_start_.chi_d = 0; + waypoint_start_.chi_valid = true; + waypoint_start_.Va_d = 12; + dubinsParameters(waypoint_start_, waypoint_end_, params.R_min); + waypoint_received_ = false; + + if ((p - dubinspath_.w1).dot(dubinspath_.q1) >= 0) // start in H1 + { + dub_state_ = dubin_state::BEFORE_H1_WRONG_SIDE; + } + else + { + dub_state_ = dubin_state::BEFORE_H1; + } + } + else + { + if ((p - dubinspath_.w2).dot(dubinspath_.q1) >= 0) // entering H2 + { + if ((p - dubinspath_.w3).dot(dubinspath_.q3) >= 0) // start in H3 + { + dub_state_ = dubin_state::BEFORE_H3_WRONG_SIDE; + } + else + { + dub_state_ = dubin_state::BEFORE_H3; + } + } + } + break; + case dubin_state::BEFORE_H3: + output.flag = 0; //modified by kobe + output.c[0] = dubinspath_.ce(0); + output.c[1] = dubinspath_.ce(1); + output.c[2] = dubinspath_.ce(2); + output.rho = dubinspath_.R; + output.lambda = dubinspath_.lame; + if ((p - dubinspath_.w3).dot(dubinspath_.q3) >= 0) // entering H3 + { + if (!waypoint_received_) + { + if ((p - dubinspath_.w1).dot(dubinspath_.q1) >= 0) // start in H1 + { + //dub_state_ = dubin_state::BEFORE_H1_WRONG_SIDE; + dub_state_ = dubin_state::BEFORE_H3_WRONG_SIDE; + } + else + { + //dub_state_ = dubin_state::BEFORE_H1; + dub_state_ = dubin_state::BEFORE_H3; + } + } + else + { + //start new path + // plan new Dubin's path to next waypoint configuration + dubinsParameters(waypoint_start_, waypoint_end_, params.R_min); + waypoint_received_ = false; + + if ((p - dubinspath_.w1).dot(dubinspath_.q1) >= 0) // start in H1 + { + dub_state_ = dubin_state::BEFORE_H1_WRONG_SIDE; + } + else + { + dub_state_ = dubin_state::BEFORE_H1; + } + } + } + break; + case dubin_state::BEFORE_H3_WRONG_SIDE: + output.flag = 0; //modified by kobe + output.c[0] = dubinspath_.ce(0); + output.c[1] = dubinspath_.ce(1); + output.c[2] = dubinspath_.ce(2); + output.rho = dubinspath_.R; + output.lambda = dubinspath_.lame; + /* + if ((p - dubinspath_.w3).dot(dubinspath_.q3) < 0) // exit H3 + { + if(!waypoint_received_) + //dub_state_ = dubin_state::BEFORE_H1; + dub_state_ = dubin_state::BEFORE_H3; + else + dub_state_ = dubin_state::BEFORE_H1; + } +*/ + if ((p - dubinspath_.w3).dot(dubinspath_.q3) < 0) // exit H3 + dub_state_ = dubin_state::BEFORE_H3; + else + dub_state_ = dubin_state::BEFORE_H3_WRONG_SIDE; + + break; + } +} + +Eigen::Matrix3f path_manager_example::rotz(float theta) +{ + Eigen::Matrix3f R; + R << cosf(theta), -sinf(theta), 0, + sinf(theta), cosf(theta), 0, + 0, 0, 1; + + return R; +} +// done +float path_manager_example::mo(float in) +{ + float val; + if (in > 0) + val = fmod(in, 2.0 * M_PI_F); + else + { + float n = floorf(in / 2.0 / M_PI_F); + val = in - n * 2.0 * M_PI_F; + } + return val; +} + +void path_manager_example::dubinsParameters(const waypoint_s start_node, const waypoint_s end_node, float R) +{ + float ell = sqrtf((start_node.w[0] - end_node.w[0]) * (start_node.w[0] - end_node.w[0]) + + (start_node.w[1] - end_node.w[1]) * (start_node.w[1] - end_node.w[1])); + if (ell < 2.0 * R) + { + ROS_ERROR("SHOULD NOT HAPPEN: The distance between nodes must be larger than 2R."); + } + else + { + dubinspath_.ps(0) = start_node.w[0]; + dubinspath_.ps(1) = start_node.w[1]; + dubinspath_.ps(2) = start_node.w[2]; + dubinspath_.chis = start_node.chi_d; + dubinspath_.pe(0) = end_node.w[0]; + dubinspath_.pe(1) = end_node.w[1]; + dubinspath_.pe(2) = end_node.w[2]; + dubinspath_.chie = end_node.chi_d; + + Eigen::Vector3f crs = dubinspath_.ps; + crs(0) += R * (cosf(M_PI_2_F) * cosf(dubinspath_.chis) - sinf(M_PI_2_F) * sinf(dubinspath_.chis)); + crs(1) += R * (sinf(M_PI_2_F) * cosf(dubinspath_.chis) + cosf(M_PI_2_F) * sinf(dubinspath_.chis)); + Eigen::Vector3f cls = dubinspath_.ps; + cls(0) += R * (cosf(-M_PI_2_F) * cosf(dubinspath_.chis) - sinf(-M_PI_2_F) * sinf(dubinspath_.chis)); + cls(1) += R * (sinf(-M_PI_2_F) * cosf(dubinspath_.chis) + cosf(-M_PI_2_F) * sinf(dubinspath_.chis)); + Eigen::Vector3f cre = dubinspath_.pe; + cre(0) += R * (cosf(M_PI_2_F) * cosf(dubinspath_.chie) - sinf(M_PI_2_F) * sinf(dubinspath_.chie)); + cre(1) += R * (sinf(M_PI_2_F) * cosf(dubinspath_.chie) + cosf(M_PI_2_F) * sinf(dubinspath_.chie)); + Eigen::Vector3f cle = dubinspath_.pe; + cle(0) += R * (cosf(-M_PI_2_F) * cosf(dubinspath_.chie) - sinf(-M_PI_2_F) * sinf(dubinspath_.chie)); + cle(1) += R * (sinf(-M_PI_2_F) * cosf(dubinspath_.chie) + cosf(-M_PI_2_F) * sinf(dubinspath_.chie)); + + float theta, theta2; + // compute L1 + theta = atan2f(cre(1) - crs(1), cre(0) - crs(0)); + float L1 = (crs - cre).norm() + R * mo(2.0 * M_PI_F + mo(theta - M_PI_2_F) - mo(dubinspath_.chis - M_PI_2_F)) + R * mo(2.0 * M_PI_F + mo(dubinspath_.chie - M_PI_2_F) - mo(theta - M_PI_2_F)); + + // compute L2 + ell = (cle - crs).norm(); + theta = atan2f(cle(1) - crs(1), cle(0) - crs(0)); + float L2; + if (2.0 * R > ell) + L2 = 9999.0f; + else + { + theta2 = theta - M_PI_2_F + asinf(2.0 * R / ell); + L2 = sqrtf(ell * ell - 4.0 * R * R) + R * mo(2.0 * M_PI_F + mo(theta2) - mo(dubinspath_.chis - M_PI_2_F)) + R * mo(2.0 * M_PI_F + mo(theta2 + M_PI_F) - mo(dubinspath_.chie + M_PI_2_F)); + } + + // compute L3 + ell = (cre - cls).norm(); + theta = atan2f(cre(1) - cls(1), cre(0) - cls(0)); + float L3; + if (2.0 * R > ell) + L3 = 9999.0f; + else + { + theta2 = acosf(2.0 * R / ell); + L3 = sqrtf(ell * ell - 4 * R * R) + R * mo(2.0 * M_PI_F + mo(dubinspath_.chis + M_PI_2_F) - mo(theta + theta2)) + R * mo(2.0 * M_PI_F + mo(dubinspath_.chie - M_PI_2_F) - mo(theta + theta2 - M_PI_F)); + } + + // compute L4 + theta = atan2f(cle(1) - cls(1), cle(0) - cls(0)); + float L4 = (cls - cle).norm() + R * mo(2.0 * M_PI_F + mo(dubinspath_.chis + M_PI_2_F) - mo(theta + M_PI_2_F)) + R * mo(2.0 * M_PI_F + mo(theta + M_PI_2_F) - mo(dubinspath_.chie + M_PI_2_F)); + + // L is the minimum distance + int idx = 1; + dubinspath_.L = L1; + if (L2 < dubinspath_.L) + { + dubinspath_.L = L2; + idx = 2; + } + if (L3 < dubinspath_.L) + { + dubinspath_.L = L3; + idx = 3; + } + if (L4 < dubinspath_.L) + { + dubinspath_.L = L4; + idx = 4; + } + + Eigen::Vector3f e1; + // e1.zero(); + e1(0) = 1; + e1(1) = 0; + e1(2) = 0; + switch (idx) + { + case 1: + dubinspath_.cs = crs; + dubinspath_.lams = 1; + dubinspath_.ce = cre; + dubinspath_.lame = 1; + dubinspath_.q1 = (cre - crs).normalized(); + dubinspath_.w1 = dubinspath_.cs + (rotz(-M_PI_2_F) * dubinspath_.q1) * R; + dubinspath_.w2 = dubinspath_.ce + (rotz(-M_PI_2_F) * dubinspath_.q1) * R; + break; + case 2: + dubinspath_.cs = crs; + dubinspath_.lams = 1; + dubinspath_.ce = cle; + dubinspath_.lame = -1; + ell = (cle - crs).norm(); + theta = atan2f(cle(1) - crs(1), cle(0) - crs(0)); + theta2 = theta - M_PI_2_F + asinf(2.0 * R / ell); + dubinspath_.q1 = rotz(theta2 + M_PI_2_F) * e1; + dubinspath_.w1 = dubinspath_.cs + (rotz(theta2) * e1) * R; + dubinspath_.w2 = dubinspath_.ce + (rotz(theta2 + M_PI_F) * e1) * R; + break; + case 3: + dubinspath_.cs = cls; + dubinspath_.lams = -1; + dubinspath_.ce = cre; + dubinspath_.lame = 1; + ell = (cre - cls).norm(); + theta = atan2f(cre(1) - cls(1), cre(0) - cls(0)); + theta2 = acosf(2.0 * R / ell); + dubinspath_.q1 = rotz(theta + theta2 - M_PI_2_F) * e1; + dubinspath_.w1 = dubinspath_.cs + (rotz(theta + theta2) * e1) * R; + dubinspath_.w2 = dubinspath_.ce + (rotz(theta + theta2 - M_PI_F) * e1) * R; + break; + case 4: + dubinspath_.cs = cls; + dubinspath_.lams = -1; + dubinspath_.ce = cle; + dubinspath_.lame = -1; + dubinspath_.q1 = (cle - cls).normalized(); + dubinspath_.w1 = dubinspath_.cs + (rotz(M_PI_2_F) * dubinspath_.q1) * R; + dubinspath_.w2 = dubinspath_.ce + (rotz(M_PI_2_F) * dubinspath_.q1) * R; + break; + } + dubinspath_.w3 = dubinspath_.pe; + dubinspath_.q3 = rotz(dubinspath_.chie) * e1; + dubinspath_.R = R; + } +} + +} // namespace rosplane diff --git a/Flight_control/src/enemy_suv/suv_move/src/path_planner.cpp b/Flight_control/src/enemy_suv/suv_move/src/path_planner.cpp new file mode 100644 index 0000000..97e8c5e --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/src/path_planner.cpp @@ -0,0 +1,62 @@ +#include +#include +#define EARTH_RADIUS 6378145.0f +#define num_waypoints 3 +float pn2latitude(float pn,float init_lat_) +{ + return (pn*180)/(EARTH_RADIUS*M_PI)+init_lat_; +} + +float pe2longtitude(float pe,float init_lat_,float init_lon_) +{ + return (pe*180)/(EARTH_RADIUS*cos(init_lat_*M_PI/180.0)*M_PI)+init_lon_; +} + +int main(int argc, char **argv) +{ + ros::init(argc, argv, "rosplane_simple_path_planner"); + + ros::NodeHandle nh_; + ros::Publisher waypointPublisher = nh_.advertise("waypoint_path", 10); + + float Va = 3; + int tmp; + tmp = 7; //notice here + float wps[tmp * num_waypoints] = + { + // pn,pe,altitude,-,va,lat,lon + 200, 100, 0, 0, 10, pn2latitude(200,0), pe2longtitude(100,0,0), + 300, 200, 0, 0, 10, pn2latitude(300,0), pe2longtitude(200,0,0), + 0, 200, 0, 0, 10, pn2latitude(0,0), pe2longtitude(200,0,0), + }; + + for (int i(0); i < num_waypoints; i++) + { + ros::Duration(0.5).sleep(); + + rosplane_msgs::Waypoint new_waypoint; + + new_waypoint.w[0] = wps[i * tmp + 0]; + new_waypoint.w[1] = wps[i * tmp + 1]; + new_waypoint.w[2] = wps[i * tmp + 2]; + new_waypoint.chi_d = wps[i * tmp + 3]; + new_waypoint.Va_d = wps[i * tmp + 4]; + // add by kobe + new_waypoint.lat = wps[i * tmp + 5]; + new_waypoint.lon = wps[i * tmp + 6]; + + new_waypoint.chi_valid = false; //kobe + + if (i == 0) + new_waypoint.set_current = true; + else + new_waypoint.set_current = false; + + new_waypoint.clear_wp_list = false; + + waypointPublisher.publish(new_waypoint); + } + ros::Duration(1.5).sleep(); + + return 0; +} diff --git a/Flight_control/src/enemy_suv/suv_move/src/pseudo_controller_base.cpp b/Flight_control/src/enemy_suv/suv_move/src/pseudo_controller_base.cpp new file mode 100644 index 0000000..b052491 --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/src/pseudo_controller_base.cpp @@ -0,0 +1,214 @@ +#include "pseudo_controller_base.h" +#include "pseudo_controller_example.h" +// modified by kobe +namespace rosplane +{ + +pseudo_controller_base::pseudo_controller_base(): + nh_(ros::NodeHandle()), + nh_private_(ros::NodeHandle()) +{ + //ROS_INFO("hello"); + vehicle_state_sub_ = nh_.subscribe("state", 10, &pseudo_controller_base::vehicle_state_callback, this); + bebop1_state_sub_ = nh_.subscribe("ground_truth/state", 10, &pseudo_controller_base::bebop1_state_callback, this); + //bebop1_state_sub_ = nh_.subscribe("/test/odom", 10, &pseudo_controller_base::bebop1_state_callback, this); + + + + controller_commands_sub_ = nh_.subscribe("controller_commands", 10, &pseudo_controller_base::controller_commands_callback,this); + + memset(&vehicle_state_, 0, sizeof(vehicle_state_)); + memset(&bebop1_state_, 0, sizeof(bebop1_state_)); + + memset(&controller_commands_, 0, sizeof(controller_commands_)); + + nh_private_.param("TRIM_T", params_.trim_t, 0.3); + + nh_private_.param("ALT_TOZ", params_.alt_toz, 1.5); + nh_private_.param("ALT_HZ", params_.alt_hz, 0.2); + nh_private_.param("TAU", params_.tau, 5.0); + nh_private_.param("COURSE_KP", params_.c_kp, 0.7329); + //nh_private_.param("COURSE_KD", params_.c_kd, 0.0); + nh_private_.param("COURSE_KI", params_.c_ki, 0.0); + + nh_private_.param("AS_PITCH_KI", params_.a_p_ki, 0.0); + nh_private_.param("AS_THR_KP", params_.a_t_kp, 0.9); + nh_private_.param("AS_THR_KD", params_.a_t_kd, 0.0); + nh_private_.param("AS_THR_KI", params_.a_t_ki, 0.0); + nh_private_.param("ALT_KP", params_.a_kp, 0.045); + nh_private_.param("ALT_KD", params_.a_kd, 0.0); + nh_private_.param("ALT_KI", params_.a_ki, 0.0); + + //nh_private_.param("MAX_A", params_.max_a, 0.523);//rotate_trans + //nh_private_.param("MAX_T", params_.max_t, 1.0); + nh_private_.param("MAX_T", params_.max_t, 200.0); + + func_ = boost::bind(&pseudo_controller_base::reconfigure_callback, this, _1, _2); + server_.setCallback(func_); + + //pesudors_pub_ = nh_.advertise("command", 10); + pesudors_pub_ = nh_.advertise("cmd_vel", 10); + internals_pub_ = nh_.advertise("controller_inners", 10); + act_pub_timer_ = nh_.createTimer(ros::Duration(1.0/100.0), &pseudo_controller_base::actuator_controls_publish, this); + + command_recieved_ = false; +} + +void pseudo_controller_base::vehicle_state_callback(const rosplane_msgs::StateConstPtr &msg) +{ + vehicle_state_ = *msg; +} + +void pseudo_controller_base::bebop1_state_callback(const nav_msgs::Odometry::ConstPtr &msg) +{ + bebop1_state_ = *msg; +} + +void pseudo_controller_base::controller_commands_callback(const rosplane_msgs::Controller_CommandsConstPtr &msg) +{ + command_recieved_ = true; + controller_commands_ = *msg; +} + +void pseudo_controller_base::reconfigure_callback(rosplane::ControllerConfig &config, uint32_t level) +{ + params_.trim_t = config.TRIM_T; + + params_.c_kp = config.COURSE_KP; + //params_.c_kd = config.COURSE_KD; + params_.c_ki = config.COURSE_KI; + + params_.a_p_ki = config.AS_PITCH_KI; + + params_.a_t_kp = config.AS_THR_KP; + params_.a_t_kd = config.AS_THR_KD; + params_.a_t_ki = config.AS_THR_KI; + + params_.a_kp = config.ALT_KP; + params_.a_kd = config.ALT_KD; + params_.a_ki = config.ALT_KI; + +} + + +void pseudo_controller_base::actuator_controls_publish(const ros::TimerEvent &) +{ + struct input_s input; + //input.h = -vehicle_state_.position[2]; + //input.va = vehicle_state_.Va; + //input.chi = vehicle_state_.chi; + input.h = bebop1_state_.pose.pose.position.z; /** altitude */ + input.va = sqrt(pow(bebop1_state_.twist.twist.linear.x,2)+pow(bebop1_state_.twist.twist.linear.y,2)); + input.chi =pseudo_controller_base::Quaternion_to_Euler(bebop1_state_.pose.pose.orientation.x,bebop1_state_.pose.pose.orientation.y,bebop1_state_.pose.pose.orientation.z,bebop1_state_.pose.pose.orientation.w); + // ROS_INFO("LOOK chi: %f",input.chi); + input.Va_c = controller_commands_.Va_c; + // ROS_INFO("LOOK Va_c: %f",input.Va_c); + input.h_c = controller_commands_.h_c;//3>controller_commands_.h_c)?3:controller_commands_.h_c; + input.chi_c = controller_commands_.chi_c; + // ROS_INFO("LOOK chi_c: %f",input.chi_c); + input.takeoff = controller_commands_.takeoff; + input.landing = controller_commands_.landing; + input.Ts = 0.01f; + if (controller_commands_.Va_c==0) + { + reached=1; + } + struct output_s output; + + if (command_recieved_ == true) + { + control(params_, input, output); + + //convert_to_pwm(output); + geometry_msgs::Twist cmd_vel; + //rosflight_msgs::Command pseudors; + /* publish pseudors controls */ + cmd_vel.linear.x = output.forward_trans;//head vel + cmd_vel.linear.y = output.left_right_trans; + // cmd_vel.linear.z = output.up_down_trans; + cmd_vel.angular.x = 0; + cmd_vel.angular.y = 0;//output.roll_trans; +if (input.va > 0.1) + cmd_vel.angular.z = output.rotate_trans;//output.rotate_trans +else +cmd_vel.angular.z = 0; + + pesudors_pub_.publish(cmd_vel); + //ROS_INFO("hello %f",bebop1_state_.pose.pose.position.z); + // ROS_INFO("x-y-z-w: %f %f %f %f",cmd_vel.linear.x,cmd_vel.linear.y,cmd_vel.linear.z,cmd_vel.angular.z); + // ROS_INFO("six: %f %f %f %f %f %f\n",input.h,input.h_c,input.va,input.Va_c,input.chi,input.chi_c); + // ROS_INFO("position: %f %f %f",bebop1_state_.pose.pose.position.x,bebop1_state_.pose.pose.position.y,bebop1_state_.pose.pose.position.z); + if (internals_pub_.getNumSubscribers() > 0) + { + rosplane_msgs::Controller_Internals inners; + //sinners.phi_c = output.phi_c; + //inners.theta_c = output.theta_c; + switch (output.current_zone) + { + case alt_zones::TAKE_OFF: + inners.alt_zone = inners.ZONE_TAKE_OFF; + break; + case alt_zones::CLIMB: + inners.alt_zone = inners.ZONE_CLIMB; + break; + case alt_zones::DESCEND: + inners.alt_zone = inners.ZONE_DESEND; + break; + case alt_zones::ALTITUDE_HOLD: + inners.alt_zone = inners.ZONE_ALTITUDE_HOLD; + break; + default: + break; + } + inners.aux_valid = false; + internals_pub_.publish(inners); + } + } +} + +float pseudo_controller_base::Quaternion_to_Euler(float q0,float q1,float q2,float q3) +{ + float Radx; + float sum; + sum = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3); + if (sum==0) + { + sum=0.0001; + } + q0 = q0 / sum; + q1 = q1 / sum; + q2 = q2 / sum; + q3 = q3 / sum; + + // ROS_INFO("LOOK here2: %f",asin(2.0f*(q2*q3 + q0*q1))); + if (fabs(q2)0) + { + Radx = 3.14159-asin(2.0f*(q2*q3 + q0*q1)); + return Radx; + } + else + { + Radx = -3.14159-asin(2.0f*(q2*q3 + q0*q1)); + return Radx; + } + } +} + +} //end namespace + +int main(int argc, char **argv) +{ + ros::init(argc, argv, "rosplane_controller"); + rosplane::pseudo_controller_base *cont = new rosplane::pseudo_controller_example(); + + ros::spin(); + + return 0; +} diff --git a/Flight_control/src/enemy_suv/suv_move/src/pseudo_controller_example.cpp b/Flight_control/src/enemy_suv/suv_move/src/pseudo_controller_example.cpp new file mode 100644 index 0000000..9374e1a --- /dev/null +++ b/Flight_control/src/enemy_suv/suv_move/src/pseudo_controller_example.cpp @@ -0,0 +1,326 @@ +#include "pseudo_controller_example.h" +//modified by kobe +namespace rosplane +{ + +pseudo_controller_example::pseudo_controller_example() : pseudo_controller_base() +{ + current_zone = alt_zones::PREPARE; + //current_zone = alt_zones::TAKE_OFF; + c_error_ = 0; + c_integrator_ = 0; + r_error_ = 0; + r_integrator_ = 0; + a_error_ = 0; + a_integrator_ = 0; + at_error_ = 0; + at_integrator_ = 0; + ap_error_ = 0; + ap_integrator_ = 0; +} + +void pseudo_controller_example::control(const params_s ¶ms, const input_s &input, output_s &output) +{ + output.up_down_trans = 0; + output.forward_trans = input.Va_c; // ZS + output.rotate_trans = 0; + output.left_right_trans = 0; + + output.rotate_value=pseudo_course(input.chi, input.chi_c); + output.rotate_trans = output.rotate_value;//pseudo_course_hold(input.chi, input.chi_c, params, input.Ts); + + + // if (input.landing==true) // protect-landing first + // { + // current_zone = alt_zones::LANDING; + // } + // if (input.takeoff==true && current_zone==alt_zones::LANDING) + // { + // current_zone = alt_zones::PREPARE; + // } + + // switch (current_zone) + // { + // case alt_zones::PREPARE: + // output.up_down_trans = 0.5; + // output.forward_trans = 0; + // output.left_right_trans = 0; + // output.rotate_trans=0; + // if (input.h >= 1) // + // { + // ROS_DEBUG("TAKEOFF"); + // current_zone = alt_zones::TAKE_OFF; + // } + // break; + // case alt_zones::TAKE_OFF: + // //output.rotate_trans = 1.5*pseudo_course_hold(input.chi, input.chi_c, params, input.Ts);//recover + // //output.forward_trans = 0.7;//0.1 * pseudo_throttle_hold(input.Va_c, input.va, params, input.Ts); + // output.forward_trans = input.Va_c;//pseudo_throttle_hold(input.Va_c, input.va, params, input.Ts); + // output.up_down_trans = pow(1.1,input.h)*pseudo_pitch_hold(input.h_c, input.h, params, input.Ts); + // //output.up_down_trans = 0.01 * pseudo_pitch_hold(input.h_c, input.h, params, input.Ts); + // //if (input.h >= params.alt_toz) //alt_toz=1.5//recovery + // //output.left_right_trans = 1.5*pseudo_left_right(input.chi, input.chi_c, output.forward_trans); + // if (input.h >= 1.5) // + // { + // ROS_DEBUG("climb"); + // current_zone = alt_zones::CLIMB; + // ap_error_ = 0; + // ap_integrator_ = 0; + // ap_differentiator_ = 0; + // } + // break; + // case alt_zones::CLIMB: + // output.forward_trans = input.Va_c;//sat(input.Va_c*cos(output.rotate_trans),5,0.5);//pseudo_throttle_hold(input.Va_c, input.va, params, input.Ts); + // //output.forward_trans = 0.8;//0.1 * pseudo_throttle_hold(input.Va_c, input.va, params, input.Ts); + // output.left_right_trans = 0;//sat(input.Va_c*sin(output.rotate_trans),5,-5);//pseudo_left_right(input.chi, input.chi_c, output.forward_trans); + // output.up_down_trans = pseudo_pitch_hold(input.h_c, input.h, params, input.Ts); + // output.rotate_trans = output.rotate_value;//pseudo_course_hold(input.chi, input.chi_c, params, input.Ts); + + // //output.left_right_trans = 0.1 * pseudo_left_right(input.chi, input.chi_c, output.forward_trans); + // //output.up_down_trans = 0.01 * pseudo_pitch_hold(input.h_c, input.h, params, input.Ts); + // //output.rotate_trans = 0.3*pseudo_course_hold(input.chi, input.chi_c, params, input.Ts); + // ////if (input.h >= input.h_c - params.alt_hz) //alt_hz=0.2//recovery + // if (input.h >= input.h_c - 0.3) //alt_hz=0.2 + // { + // ROS_DEBUG("hold"); + // current_zone = alt_zones::ALTITUDE_HOLD; + // at_error_ = 0; + // at_integrator_ = 0; + // at_differentiator_ = 0; + // a_error_ = 0; + // a_integrator_ = 0; + // a_differentiator_ = 0; + // } + // //else if (input.h <= params.alt_toz) //1.5//recovery + // // else if (input.h <= 1) //1.5 + // // { + // // ROS_DEBUG("takeoff"); + // // current_zone = alt_zones::TAKE_OFF; // Is that necessary? + // // } + // break; + // case alt_zones::DESCEND: + // output.forward_trans = input.Va_c;//sat(input.Va_c*cos(output.rotate_trans),5,0.5);//pseudo_throttle_hold(input.Va_c, input.va, params, input.Ts); + // output.left_right_trans = 0;//sat(input.Va_c*sin(output.rotate_trans),5,-5);//pseudo_left_right(input.chi, input.chi_c, output.forward_trans); + // output.rotate_trans = output.rotate_value;//pseudo_course_hold(input.chi, input.chi_c, params, input.Ts); + // output.up_down_trans = pseudo_pitch_hold(input.h_c, input.h, params, input.Ts); + + // //output.forward_trans = 0.1 * pseudo_throttle_hold(input.Va_c, input.va, params, input.Ts); + // //output.left_right_trans = 0.1 * pseudo_left_right(input.chi, input.chi_c, output.forward_trans); + // //output.rotate_trans = pseudo_course_hold(input.chi, input.chi_c, params, input.Ts); + // //output.up_down_trans = 0.1 * pseudo_pitch_hold(input.h_c, input.h, params, input.Ts); + // //if (input.h <= input.h_c + params.alt_hz)//recovery + // if (input.h <= input.h_c + 0.3) + // { + // if (input.h < 0) //modify later + // { + // ROS_DEBUG("landing"); + // current_zone = alt_zones::LANDING; + // // output.forward_trans = sat(input.Va_c*cos(output.rotate_trans),1,0);//pseudo_throttle_hold(input.Va_c, input.va, params, input.Ts) * 0.5; + // // output.up_down_trans = pseudo_pitch_hold(input.h_c, input.h, params, input.Ts) / 2; + // // output.rotate_trans = output.rotate_value;//pseudo_course_hold(input.chi, input.chi_c, params, input.Ts); + // } + // else + // { + // ROS_DEBUG("hold"); + // current_zone = alt_zones::ALTITUDE_HOLD; + // at_error_ = 0; + // at_integrator_ = 0; + // at_differentiator_ = 0; + // a_error_ = 0; + // a_integrator_ = 0; + // a_differentiator_ = 0; + // } + // } + // break; + // case alt_zones::ALTITUDE_HOLD: + // output.forward_trans = input.Va_c;//sat(input.Va_c*cos(output.rotate_trans),5,0.5);//pseudo_throttle_hold(input.Va_c, input.va, params, input.Ts); + // output.left_right_trans = 0;//sat(input.Va_c*sin(output.rotate_trans),5,-5);//0.5*pseudo_left_right(input.chi, input.chi_c, output.forward_trans); + // output.up_down_trans = pseudo_altitiude_hold(input.h_c, input.h, params, input.Ts); + // output.rotate_trans = output.rotate_value;//pseudo_course_hold(input.chi, input.chi_c, params, input.Ts); + // //output.forward_trans = 1;//0.1 * pseudo_throttle_hold(input.Va_c, input.va, params, input.Ts); + // //output.left_right_trans = pseudo_left_right(input.chi, input.chi_c, output.forward_trans); + // //output.up_down_trans = 0.1 * pseudo_altitiude_hold(input.h_c, input.h, params, input.Ts); + // //output.rotate_trans = 0.7*pseudo_course_hold(input.chi, input.chi_c, params, input.Ts); + // //if (input.h >= input.h_c + params.alt_hz)//recovery + // if (input.h >= input.h_c + 0.3) + // { + // ROS_DEBUG("desend"); + // current_zone = alt_zones::DESCEND; + // ap_error_ = 0; + // ap_integrator_ = 0; + // ap_differentiator_ = 0; + // } + // //else if (input.h <= input.h_c - params.alt_hz)//recovery + // else if (input.h <= input.h_c - 0.3) + // { + // ROS_DEBUG("climb"); + // current_zone = alt_zones::CLIMB; + // ap_error_ = 0; + // ap_integrator_ = 0; + // ap_differentiator_ = 0; + // } + // break; + // case alt_zones::LANDING: + // ROS_DEBUG("landing"); + // current_zone = alt_zones::LANDING; + // ap_error_ = 0; + // ap_integrator_ = 0; + // ap_differentiator_ = 0; + // output.forward_trans = 0; + // if (input.h < 0.6) + // { + // output.up_down_trans = 0; + // } + // else + // { + // output.up_down_trans = -input.h/3; + // } + + // output.rotate_trans =0; + // output.left_right_trans = 0; + // break; + // default: + // break; + // } + + output.current_zone = current_zone; + //output.delta_e = pitch_hold(output.theta_c, input.theta, input.q, params, input.Ts); + //output.up_down_trans=pseudo_pitch_hold(output.theta_c, input.theta, input.q, params, input.Ts); +} + +float pseudo_controller_example::pseudo_course(float chi, float chi_c) +{ + chi_c=sat(chi_c,3.14159,-3.14159); + chi=sat(chi,3.14159,-3.14159); + float rotate = sat(chi_c-chi,2*3.14159,-2*3.14159);//-pi to pi + // float lr; + // if (rotate>3.14159) + // { + // lr=-1; + // } + // else if(rotate<-3.14159) + // { + // lr=1; + // } + //rotate=rotate+lr*2*3.14159;//more easier to rotate + + // rotate=sat(rotate,3.14159/4,-3.14159/4);//limit + return rotate; +} + +float pseudo_controller_example::pseudo_left_right(float chi, float chi_c, float forward_trans) +{ + float error= chi_c-chi; + float a = fabs(forward_trans); + float x = (3.14 / 4 > fabs(error)) ? fabs(error) : 3.14 / 4; + float b = tan(x); + float c = error / (fabs(error + 0.001)); + float left_right_trans = sat(a * b * c, forward_trans, -forward_trans); + + return left_right_trans; +} + +float pseudo_controller_example::pseudo_course_hold(float chi, float chi_c, const params_s ¶ms, float Ts) +{ + float error = chi_c-chi; + + //c_integrator_ = c_integrator_ + (Ts / 2.0) * (error + c_error_); + + //float up = params.c_kp * error; + //float ui = params.c_ki * c_integrator_; + + float rotate_trans = sat((error + c_error_) / 2, 45.0 * 3.14 / 180.0, -45.0 * 3.14 / 180.0); + //if (fabs(params.c_ki) >= 0.00001) + //{ + //float rotate_trans_unsat = up + ui; + //c_integrator_ = c_integrator_ + (Ts / params.c_ki) * (rotate_trans - rotate_trans_unsat); + //} + + c_error_ = error; + return rotate_trans; +} + +float pseudo_controller_example::pseudo_pitch_hold(float h_c, float h, const struct params_s ¶ms, float Ts) +{ + float error = h_c - h; + //ap_integrator_ = ap_integrator_ + (Ts / 2.0) * (error + ap_error_); + // float up = 0.5 * error; + //float ui = params.a_p_ki * ap_integrator_; + //float up_down_trans = sat(up + ui, 0.8, -0.8);//recovery + float up_down_trans = sat(0.5 * error, 2, -2); + //if (fabs(params.a_p_ki) >= 0.00001) + //{ + //float up_down_trans_unsat = up + ui; + //ap_integrator_ = ap_integrator_ + (Ts / params.a_p_ki) * (up_down_trans - up_down_trans_unsat); + //} + // ap_error_ = error; + return up_down_trans; +} + +float pseudo_controller_example::pseudo_throttle_hold(float Va_c, float Va, const params_s ¶ms, float Ts) +{ + float error = Va_c - Va; + + //at_integrator_ = at_integrator_ + (Ts / 2.0) * (error + at_error_); + //at_differentiator_ = (2.0 * params.tau - Ts) / (2.0 * params.tau + Ts) * at_differentiator_ + (2.0 /(2.0 * params.tau + Ts)) *(error - at_error_); + + float up = params.a_t_kp * error; + //float ui = params.a_t_ki * at_integrator_; + //float ud = params.a_t_kd * at_differentiator_; + + //float forward_trans = sat(Va + up + ui + ud, params.max_t, 0.1); + float forward_trans = sat(Va+error, params.max_t, 0.5); + //if (fabs(params.a_t_ki) >= 0.00001) + //{ + //float forward_trans_unsat = params.trim_t + up + ui + ud; + //at_integrator_ = at_integrator_ + (Ts / params.a_t_ki) * (forward_trans - forward_trans_unsat); + //} + + //at_error_ = error; + return forward_trans; +} + +float pseudo_controller_example::pseudo_altitiude_hold(float h_c, float h, const params_s ¶ms, float Ts) +{ + float error = h_c - h; + + //a_integrator_ = a_integrator_ + (Ts / 2.0) * (error + a_error_); + //a_differentiator_ = (2.0 * params.tau - Ts) / (2.0 * params.tau + Ts) * a_differentiator_ + (2.0 /(2.0 * params.tau + Ts)) * (error - a_error_); + float up = 0.7 * error; + //float up = params.a_kp * error; + //ROS_INFO("hello %f",params.a_kp); + //float ui = params.a_ki * a_integrator_; + //float ud = params.a_kd * a_differentiator_; + + //float up_down_trans = sat(up + ui + ud, 0.8, -0.8);//recovery + float up_down_trans = sat(up, 2, -2); + //if (fabs(params.a_ki) >= 0.00001) + //{ + //float up_down_trans_unsat = up + ui + ud; + //a_integrator_ = a_integrator_ + (Ts / params.a_ki) * (up_down_trans - up_down_trans_unsat); + //} + + // at_error_ = error; + return up_down_trans; +} + +//float pseudo_controller_example::cooridinated_turn_hold(float v, const params_s ¶ms, float Ts) +//{ +// //todo finish this if you want... +// return 0; +//} + +float pseudo_controller_example::sat(float value, float up_limit, float low_limit) +{ + float rVal; + if (value > up_limit) + rVal = up_limit; + else if (value < low_limit) + rVal = low_limit; + else + rVal = value; + + return rVal; +} + +} // namespace rosplane diff --git a/Flight_control/src/hector_quadrotor b/Flight_control/src/hector_quadrotor new file mode 160000 index 0000000..c5accd2 --- /dev/null +++ b/Flight_control/src/hector_quadrotor @@ -0,0 +1 @@ +Subproject commit c5accd2403622ddc275e576691b9831bd6e2694f diff --git a/Flight_control/src/rosflight_ws b/Flight_control/src/rosflight_ws new file mode 160000 index 0000000..9404d28 --- /dev/null +++ b/Flight_control/src/rosflight_ws @@ -0,0 +1 @@ +Subproject commit 9404d28c2d96f498a5d7f6f14a639f9318c30d64