├── readme_resource
├── dock_1.png
├── dock_2.png
├── docking_demo.gif
├── pattern_angle.png
└── pattern_parameters.png
├── autodock_gazebo
├── model
│ ├── dock1
│ │ ├── model.config
│ │ └── model.sdf
│ ├── dock2
│ │ ├── model.config
│ │ └── model.sdf
│ └── wall1
│ │ ├── model.config
│ │ └── model.sdf
├── package.xml
├── CMakeLists.txt
├── world
│ ├── dock.model
│ └── dock2.model
└── launch
│ └── neuronbot2_dock.launch
├── autodock_controller
├── include
│ ├── controller.h
│ ├── pattern.h
│ └── auto_dock.h
├── CMakeLists.txt
├── package.xml
├── launch
│ └── docking.launch
├── src
│ ├── pattern.cpp
│ └── controller.cpp
└── rviz
│ └── autodock_view.rviz
└── README.md
/readme_resource/dock_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Adlink-ROS/auto_docking/HEAD/readme_resource/dock_1.png
--------------------------------------------------------------------------------
/readme_resource/dock_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Adlink-ROS/auto_docking/HEAD/readme_resource/dock_2.png
--------------------------------------------------------------------------------
/readme_resource/docking_demo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Adlink-ROS/auto_docking/HEAD/readme_resource/docking_demo.gif
--------------------------------------------------------------------------------
/readme_resource/pattern_angle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Adlink-ROS/auto_docking/HEAD/readme_resource/pattern_angle.png
--------------------------------------------------------------------------------
/readme_resource/pattern_parameters.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Adlink-ROS/auto_docking/HEAD/readme_resource/pattern_parameters.png
--------------------------------------------------------------------------------
/autodock_gazebo/model/dock1/model.config:
--------------------------------------------------------------------------------
1 |
2 |
3 | dock1
4 | 1.0
5 | model.sdf
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/autodock_gazebo/model/dock2/model.config:
--------------------------------------------------------------------------------
1 |
2 |
3 | dock2
4 | 1.0
5 | model.sdf
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/autodock_gazebo/model/wall1/model.config:
--------------------------------------------------------------------------------
1 |
2 |
3 | wall1
4 | 1.0
5 | model.sdf
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/autodock_gazebo/package.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | autodock_gazebo
4 | 1.0.0
5 | The autodock_gazebo package
6 | Ting Chang
7 | Apache-2.0
8 |
9 | catkin
10 |
11 |
12 |
--------------------------------------------------------------------------------
/autodock_gazebo/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required(VERSION 2.8.3)
2 | project(autodock_gazebo)
3 |
4 | find_package(catkin REQUIRED COMPONENTS
5 | #roscpp
6 | )
7 |
8 | catkin_package(
9 | # INCLUDE_DIRS include
10 | # LIBRARIES pattern
11 | # CATKIN_DEPENDS roscpp geometry_msgs visualization_msgs
12 | # DEPENDS system_lib
13 | )
14 |
15 |
16 | include_directories(
17 | include ${catkin_INCLUDE_DIRS}
18 | include include/
19 | )
20 |
--------------------------------------------------------------------------------
/autodock_controller/include/controller.h:
--------------------------------------------------------------------------------
1 | #include "auto_dock.h"
2 | // ROS
3 | ros::Publisher vel_pub;
4 |
5 | //parameter setting
6 | std::string base_frame_id;
7 | double min_v, min_w, max_v, max_w;
8 | double dist_to_dock, dist_to_center;
9 | double threshold_v, threshold_w;
10 | float x_origin;
11 | int step1_count = 0 , step2_count = 0;
12 | bool reach_target_pos = false;
13 | bool reach_target_ang = false;
14 | bool target_alignment = false;
15 | bool left = false;
16 | bool left_check = false;
17 | bool pattern = false;
18 | int step = 0;
19 | int split_num = 2;
20 | boost::array odom , robot_point_temp;
21 | float tune_distense = 0.05;
22 | float tune_threshold = 0.6;
--------------------------------------------------------------------------------
/autodock_controller/include/pattern.h:
--------------------------------------------------------------------------------
1 | #include "auto_dock.h"
2 |
3 | // ROS
4 | visualization_msgs::Marker points_msg;
5 |
6 | // Parameters
7 | double pattern_angle1, pattern_angle2, pattern_angle3;
8 | double detect_angle_tolerance, group_dist_tolerance;
9 | std::string laser_frame_id;
10 |
11 | struct point_set{
12 | boost::array vector_a;
13 | boost::array vector_b;
14 | boost::array vector_c;
15 | boost::array vector_d;
16 | } ;
17 |
18 | struct point_set point_temp;
19 | struct point_set point_set;
20 | std::vector dock_vector(4);
21 | boost::array temp_point_1 , temp_point_2;
22 | bool check_angle = false;
23 |
24 |
--------------------------------------------------------------------------------
/autodock_controller/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required(VERSION 2.8.3)
2 | project(autodock_controller)
3 |
4 | find_package(catkin REQUIRED COMPONENTS
5 | roscpp
6 | std_msgs
7 | laser_line_extraction
8 | visualization_msgs
9 | geometry_msgs
10 | tf
11 | )
12 |
13 | catkin_package(
14 | # INCLUDE_DIRS include
15 | # LIBRARIES pattern
16 | # CATKIN_DEPENDS roscpp geometry_msgs visualization_msgs
17 | # DEPENDS system_lib
18 | )
19 |
20 |
21 | include_directories(
22 | include ${catkin_INCLUDE_DIRS}
23 | include include/
24 | )
25 |
26 | add_executable(pattern src/pattern.cpp)
27 | add_executable(controller src/controller.cpp)
28 |
29 | add_dependencies(pattern ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
30 | add_dependencies(controller ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
31 |
32 | target_link_libraries(pattern
33 | ${catkin_LIBRARIES}
34 | )
35 |
36 | target_link_libraries(controller
37 | ${catkin_LIBRARIES}
38 | )
--------------------------------------------------------------------------------
/autodock_controller/package.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | autodock_controller
4 | 1.0.0
5 | The autodock_controller package
6 | Ting Chang
7 | Apache-2.0
8 |
9 | catkin
10 | roscpp
11 | roscpp
12 | roscpp
13 | std_msgs
14 | laser_line_extraction
15 | laser_line_extraction
16 | laser_line_extraction
17 | visualization_msgs
18 | visualization_msgs
19 | visualization_msgs
20 | geometry_msgs
21 | geometry_msgs
22 | geometry_msgs
23 | tf
24 |
25 |
26 |
--------------------------------------------------------------------------------
/autodock_controller/include/auto_dock.h:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include
5 | #include
6 | #include
7 | #include
8 | #include
9 | #include
10 | #include
11 | #include
12 | #include
13 | #include
14 | #include
15 |
16 | #define _USE_MATH_DEFINES
17 |
18 |
19 |
20 | double dist( auto vector_i , auto vector_j){
21 | float dist = sqrt(pow(fabs(vector_i[0] - vector_j[0]),2)+pow(fabs(vector_i[1] - vector_j[1]),2));
22 |
23 | return dist;
24 | }
25 | auto mid_point(auto vector){
26 | boost::array mid ;
27 | mid[0] = (vector.start[0]+vector.end[0])/2 ;
28 | mid[1] = (vector.start[1]+vector.end[1])/2 ;
29 |
30 | return mid;
31 | }
32 |
33 | auto mid_two_point( auto array_a , auto array_b){
34 | boost::array mid ;
35 | mid[0] = (array_a[0] + array_b[0])/2 ;
36 | mid[1] = (array_a[1] + array_b[1])/2 ;
37 |
38 | return mid;
39 | }
40 | double mid_dist( auto vector_i , auto vector_j){
41 | boost::array mid_i = mid_point(vector_i);
42 | boost::array mid_j = mid_point(vector_j);
43 | double dist = sqrt(pow(fabs(mid_i[0] - mid_j[0]),2)+pow(fabs(mid_i[1] - mid_j[1]),2));
44 |
45 | return dist;
46 | }
--------------------------------------------------------------------------------
/autodock_gazebo/world/dock.model:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | model://ground_plane
7 |
8 |
9 |
10 | model://sun
11 |
12 |
13 |
14 | false
15 |
16 |
17 |
18 |
19 | 0.319654 -0.235002 9.29441 0 1.5138 0.009599
20 | orbit
21 | perspective
22 |
23 |
24 |
25 |
26 | 1000.0
27 | 0.001
28 | 1
29 |
30 |
31 | quick
32 | 150
33 | 0
34 | 1.400000
35 | 1
36 |
37 |
38 | 0.00001
39 | 0.2
40 | 2000.000000
41 | 0.01000
42 |
43 |
44 |
45 |
46 |
47 | 1
48 |
49 | model://dock1
50 |
51 |
52 |
53 |
54 |
55 |
--------------------------------------------------------------------------------
/autodock_gazebo/world/dock2.model:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | model://ground_plane
7 |
8 |
9 |
10 | model://sun
11 |
12 |
13 |
14 | false
15 |
16 |
17 |
18 |
19 | 0.319654 -0.235002 9.29441 0 1.5138 0.009599
20 | orbit
21 | perspective
22 |
23 |
24 |
25 |
26 | 1000.0
27 | 0.001
28 | 1
29 |
30 |
31 | quick
32 | 150
33 | 0
34 | 1.400000
35 | 1
36 |
37 |
38 | 0.00001
39 | 0.2
40 | 2000.000000
41 | 0.01000
42 |
43 |
44 |
45 |
46 |
47 | 1
48 |
49 | model://dock2
50 |
51 |
52 |
53 |
54 |
55 |
--------------------------------------------------------------------------------
/autodock_controller/launch/docking.launch:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/autodock_gazebo/model/wall1/model.sdf:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | -0.426959 -0.061428 0 0 -0 0
5 |
6 |
7 |
8 |
9 | 7.25 0.15 2.5
10 |
11 |
12 | 0 0 1.25 0 -0 0
13 |
14 |
15 | 0 0 1.25 0 -0 0
16 |
17 |
18 | 7.25 0.15 2.5
19 |
20 |
21 |
22 |
26 | 1 1 1 1
27 |
28 |
29 | 0
30 |
31 |
32 | -0.125 5.925 0 0 -0 3.14159
33 |
34 |
35 |
36 |
37 |
38 | 12 0.15 2.5
39 |
40 |
41 | 0 0 1.25 0 -0 0
42 |
43 |
44 | 0 0 1.25 0 -0 0
45 |
46 |
47 | 12 0.15 2.5
48 |
49 |
50 |
51 |
55 | 1 1 1 1
56 |
57 |
58 | 0
59 |
60 |
61 | -3.675 0 0 0 -0 -1.5708
62 |
63 |
64 |
65 |
66 |
67 | 7.5 0.15 2.5
68 |
69 |
70 | 0 0 1.25 0 -0 0
71 |
72 |
73 | 0 0 1.25 0 -0 0
74 |
75 |
76 | 7.5 0.15 2.5
77 |
78 |
79 |
80 |
84 | 1 1 1 1
85 |
86 |
87 | 0
88 |
89 |
90 | 0 -5.925 0 0 -0 0
91 |
92 | 1
93 |
94 |
95 |
--------------------------------------------------------------------------------
/autodock_gazebo/launch/neuronbot2_dock.launch:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Auto Docking
2 | This package can be divied into two parts, pattern recognition and moving to goal. In pattern recogintion, this package depends on laser_line extraction package to turn laser point clouds into line segments. Then, this package will go through these line segments to find the designed pattern and broadcast a frame, dock frame. After the frame being populated, the robot will move to the dock and the strategy is shown as the gif below.
3 |
4 |
5 |
6 | ## Dependency
7 | - [ADLINK NeuronBot2](https://github.com/Adlink-ROS/neuronbot2)
8 | - [Laser Line Extraction](https://github.com/Adlink-ROS/laser_line_extraction)
9 |
10 | ## Usage
11 | Download the packages and dependencies into NeuronBot2 workspace.
12 | ```bash
13 | cd ~/neuronbot2_ros1_ws/src
14 | git clone https://github.com/Adlink-ROS/laser_line_extraction.git
15 | git clone https://github.com/Adlink-ROS/auto_docking.git -b melodic-devel
16 | ```
17 |
18 | Build the NeuronBot2 workspace.
19 | ```bash
20 | cd ~/neuronbot2_ros1_ws/
21 | catkin_make
22 | ```
23 |
24 | Launch Gazebo including NeuronBot2 and Docking Station simulation.
25 | ```bash
26 | source ~/neuronbot2_ros1_ws/devel/setup.bash
27 | roslaunch autodock_gazebo neuronbot2_dock.launch
28 | ```
29 |
30 | Launch docking controller
31 | ```bash
32 | source ~/neuronbot2_ros1_ws/devel/setup.bash
33 | roslaunch autodock_controller docking.launch open_rviz:=true
34 | ```
35 |
36 | ## Topics
37 | ### Subscribed Topics
38 | - `/line_segments` (laser\_line\_extraction/LineSegmentList)
39 |
40 | ### Published Topics
41 | - `/cmd_vel` (geometry_msgs/Twist)
42 |
43 | ## Parameters
44 | ### Pattern Angle Definition
45 |
46 |
47 | ### Pattern Parameters Definition
48 |
49 |
50 | - `pattern_angle1` (default: 4.21)
51 | - Theta 1 as shown in pattern angle definition. Note that the unit is radian.
52 | - `pattern_angle2` (default: 1.57)
53 | - Theta 2 as shown in pattern angle definition. Note that the unit is radian.
54 | - `pattern_angle3` (default: 4.21)
55 | - Theta 3 as shown in pattern angle definition. Note that the unit is radian.
56 | - `detect_angle_tolerance` (default: 0.1)
57 | - The maximum difference between detected angle and pattern angle(pattern\_angle1, pattern\_angle2, pattern\_angle3)
58 | - `group_dist_tolerance` (default: 0.1)
59 | - The maximum distance between two line to be recognize as a part of pattern. Such as the distance between the end point of detected vector b and the start point of detected vector a should smaller than group\_dist\_tolerance to be consider as a part of pattern.
60 | - `laser_frame_id` (default: "laser_frame")
61 | - The laser frame of the robot.
62 | - `base_frame_id` (default: "base_link")
63 | - The base frame of the robot.
64 | - `min_v` (default: 0.1)
65 | - Minimum linear velocity of the robot.
66 | - `min_w` (default: 0.1)
67 | - Minimum angular velocity of the robot.
68 | - `max_v` (default: 0.3)
69 | - Maximum linear velocity of the robot.
70 | - `max_w` (default: 0.3)
71 | - Maximum angular velocity of the robot.
72 | - `threshold_v` (default: 0.3)
73 | - The threshold of changing between minimum and maximum linear velocity.
74 | - `threshold_w` (default: 0.4)
75 | - The threshold of changing between minimum and maximum angular velocity.
76 | - `dist_to_dock` (default: 0.2)
77 | - Distance to the dock frame.
78 | - `dist_to_center` (default: 0.03)
79 | - Distance to the center.
80 |
81 | ## Model
82 | There are models of dock for Gazebo simulation in "Model" file.
83 | ### Dock 1
84 | The size of dock 1 is shown as the picture below.
85 |
86 |
87 | ### Dock 2
88 | The size of dock 2 is shown as the picture below.
89 |
90 |
--------------------------------------------------------------------------------
/autodock_controller/src/pattern.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include
5 | #include
6 | #include
7 | #include
8 | #include
9 | #include
10 | #include "pattern.h"
11 |
12 | bool calAngle(double a, double b, double angle_ab, double detect_angle_tolerance){
13 | double angle;
14 | angle = fabs(a-b);
15 | if (angle < M_PI and angle > 1.7 ){
16 | angle = angle - M_PI_2 ;
17 | }
18 | else if (angle> (M_PI_2 + M_PI)){
19 | angle = angle - M_PI - M_PI_2;
20 | }
21 | else if (angle> M_PI and angle < (M_PI_2 + M_PI)){
22 | angle = angle - M_PI ;
23 | }
24 | //printf("angle:%f , ab:%f \n",angle,angle_ab);
25 | if (fabs(angle_ab-angle)<=detect_angle_tolerance){
26 | return true;}
27 | else return false;
28 | }
29 |
30 | void populateTF(double x, double y, double theta, std::string name){
31 | // publish dock_frame
32 | static tf::TransformBroadcaster br;
33 | tf::Transform transform;
34 | transform.setOrigin(tf::Vector3(x,y,0));
35 | tf::Quaternion q;
36 | q.setRPY(0,0,theta);
37 | transform.setRotation(q);
38 | br.sendTransform(tf::StampedTransform(transform,ros::Time::now(),laser_frame_id,name));
39 | }
40 |
41 | void updateVectors(){
42 | point_set = point_temp;
43 | // printf("Upate vectors!\n");
44 | }
45 |
46 | bool check_center(auto &dock_vector , auto &vectors){
47 | for(int i=0; i<3; i++){
48 | for(int j(i+1); j<=3 ; j++){
49 | if (calAngle(vectors[dock_vector[i]].angle,vectors[dock_vector[j]].angle, 3.14-pattern_angle2, detect_angle_tolerance)){
50 | return true;
51 | }
52 | }
53 | }
54 | return false;
55 | }
56 |
57 | void temp_vector(int i , int j , int angle_count, auto &vectors ){
58 |
59 | if (angle_count == 1){
60 | point_temp.vector_a = mid_point(vectors[i]);
61 | point_temp.vector_b = mid_point(vectors[j]);
62 | dock_vector[0] = i;
63 | dock_vector[1] = j;
64 |
65 | }
66 | else{
67 | dock_vector[2] = i;
68 | dock_vector[3] = j;
69 | point_temp.vector_d = mid_point(vectors[i]);
70 | point_temp.vector_c = mid_point(vectors[j]);
71 | temp_point_1 = mid_two_point(point_temp.vector_a , point_temp.vector_b);
72 | temp_point_2 = mid_two_point(point_temp.vector_c , point_temp.vector_d);
73 | if (dist(temp_point_1,temp_point_2) <= 0.3 and check_center(dock_vector , vectors)){
74 | //printf("%s\n", check_center(dock_vector , vectors ) ? "true" : "false");
75 | updateVectors();
76 | check_angle = true;
77 | }
78 | }
79 | }
80 |
81 |
82 |
83 | void patternCallback(const laser_line_extraction::LineSegmentList::ConstPtr& msg){
84 | std::vector>> vectors = msg->line_segments;
85 |
86 | // Number of the line
87 | int lineNum = vectors.size();
88 | int angle_count = 0;
89 | bool check_vec_size = true;
90 | check_angle = false;
91 |
92 | // Check whether topic line_segments is publishing
93 | if (lineNum < 4){
94 | ROS_WARN("There isn't enough line in the laser field!");
95 | check_vec_size = false;
96 | }
97 | if (check_vec_size){
98 | for(int i=0; i theta_point_1 = mid_two_point(point_set.vector_a , point_set.vector_b);
115 | boost::array theta_point_2 = mid_two_point(point_set.vector_c , point_set.vector_d);
116 | boost::array goal_point = mid_two_point(theta_point_1 , theta_point_2);
117 |
118 | double theta = atan2((theta_point_1[1]-theta_point_2[1]),(theta_point_1[0]-theta_point_2[0]));
119 | // printf("x:%f , y:%f , theta:%f\n",goal_point[0],goal_point[1],theta);
120 |
121 | // populate dock_frame
122 | populateTF(goal_point[0],goal_point[1],theta,"dock_frame");
123 | }
124 | }
125 |
126 | int main(int argc, char** argv){
127 | ros::init(argc, argv, "pattern_node");
128 | //ROS_INFO("Start Pattern Recognition");
129 | ros::NodeHandle nh_;
130 |
131 | // Load Parameters
132 | nh_.param("pattern_angle1",pattern_angle1, 3.9);
133 | nh_.param("pattern_angle2",pattern_angle2, 1.57);
134 | nh_.param("pattern_angle3",pattern_angle3, 3.9);
135 | nh_.param("detect_angle_tolerance",detect_angle_tolerance, 0.25);
136 | nh_.param("group_dist_tolerance",group_dist_tolerance, 0.20);
137 | nh_.param("laser_frame_id",laser_frame_id, "laser_frame");
138 | #if 0
139 | nh_.setParam("pattern_angle1",pattern_angle1);
140 | nh_.setParam("pattern_angle2",pattern_angle2);
141 | nh_.setParam("pattern_angle3",pattern_angle3);
142 | nh_.setParam("detect_angle_tolerance",detect_angle_tolerance);
143 | nh_.setParam("group_dist_tolerance",group_dist_tolerance);
144 | nh_.setParam("pattern_angle1",pattern_angle1);
145 | nh_.setParam("laser_frame_id",laser_frame_id);
146 | #endif
147 |
148 | ros::Subscriber line_sub_ = nh_.subscribe("line_segments", 10, patternCallback);
149 |
150 | ros::Rate rate(20.0);
151 |
152 | while(ros::ok()){
153 |
154 | ros::spinOnce();
155 | rate.sleep();
156 | }
157 |
158 | return 0;
159 | }
160 |
--------------------------------------------------------------------------------
/autodock_controller/rviz/autodock_view.rviz:
--------------------------------------------------------------------------------
1 | Panels:
2 | - Class: rviz/Displays
3 | Help Height: 78
4 | Name: Displays
5 | Property Tree Widget:
6 | Expanded:
7 | - /Global Options1
8 | - /Status1
9 | - /TF1
10 | - /TF1/Frames1
11 | - /Marker1/Status1
12 | Splitter Ratio: 0.6235294342041016
13 | Tree Height: 728
14 | - Class: rviz/Selection
15 | Name: Selection
16 | - Class: rviz/Tool Properties
17 | Expanded:
18 | - /2D Pose Estimate1
19 | - /2D Nav Goal1
20 | - /Publish Point1
21 | Name: Tool Properties
22 | Splitter Ratio: 0.5886790156364441
23 | - Class: rviz/Views
24 | Expanded:
25 | - /Current View1
26 | Name: Views
27 | Splitter Ratio: 0.5
28 | - Class: rviz/Time
29 | Experimental: false
30 | Name: Time
31 | SyncMode: 0
32 | SyncSource: LaserScan
33 | Preferences:
34 | PromptSaveOnExit: true
35 | Toolbars:
36 | toolButtonStyle: 2
37 | Visualization Manager:
38 | Class: ""
39 | Displays:
40 | - Alpha: 0.5
41 | Cell Size: 1
42 | Class: rviz/Grid
43 | Color: 160; 160; 164
44 | Enabled: true
45 | Line Style:
46 | Line Width: 0.029999999329447746
47 | Value: Lines
48 | Name: Grid
49 | Normal Cell Count: 0
50 | Offset:
51 | X: 0
52 | Y: 0
53 | Z: 0
54 | Plane: XY
55 | Plane Cell Count: 10
56 | Reference Frame:
57 | Value: true
58 | - Class: rviz/TF
59 | Enabled: true
60 | Frame Timeout: 15
61 | Frames:
62 | All Enabled: false
63 | base_footprint:
64 | Value: false
65 | base_link:
66 | Value: true
67 | camera_link:
68 | Value: false
69 | dock_frame:
70 | Value: true
71 | imu_link:
72 | Value: false
73 | laser_frame:
74 | Value: false
75 | odom:
76 | Value: false
77 | wheel_left_link:
78 | Value: false
79 | wheel_right_link:
80 | Value: false
81 | Marker Scale: 1
82 | Name: TF
83 | Show Arrows: true
84 | Show Axes: true
85 | Show Names: true
86 | Tree:
87 | odom:
88 | base_footprint:
89 | base_link:
90 | camera_link:
91 | {}
92 | imu_link:
93 | {}
94 | laser_frame:
95 | dock_frame:
96 | {}
97 | wheel_left_link:
98 | {}
99 | wheel_right_link:
100 | {}
101 | Update Interval: 0
102 | Value: true
103 | - Class: rviz/Marker
104 | Enabled: true
105 | Marker Topic: /line_markers
106 | Name: Marker
107 | Namespaces:
108 | line_extraction: true
109 | Queue Size: 100
110 | Value: true
111 | - Alpha: 1
112 | Autocompute Intensity Bounds: true
113 | Autocompute Value Bounds:
114 | Max Value: 10
115 | Min Value: -10
116 | Value: true
117 | Axis: Z
118 | Channel Name: intensity
119 | Class: rviz/LaserScan
120 | Color: 255; 255; 255
121 | Color Transformer: Intensity
122 | Decay Time: 0
123 | Enabled: true
124 | Invert Rainbow: false
125 | Max Color: 255; 255; 255
126 | Max Intensity: 0
127 | Min Color: 0; 0; 0
128 | Min Intensity: 0
129 | Name: LaserScan
130 | Position Transformer: XYZ
131 | Queue Size: 10
132 | Selectable: true
133 | Size (Pixels): 3
134 | Size (m): 0.009999999776482582
135 | Style: Flat Squares
136 | Topic: /scan
137 | Unreliable: false
138 | Use Fixed Frame: true
139 | Use rainbow: true
140 | Value: true
141 | Enabled: true
142 | Global Options:
143 | Background Color: 48; 48; 48
144 | Default Light: true
145 | Fixed Frame: odom
146 | Frame Rate: 30
147 | Name: root
148 | Tools:
149 | - Class: rviz/Interact
150 | Hide Inactive Objects: true
151 | - Class: rviz/MoveCamera
152 | - Class: rviz/Select
153 | - Class: rviz/FocusCamera
154 | - Class: rviz/Measure
155 | - Class: rviz/SetInitialPose
156 | Theta std deviation: 0.2617993950843811
157 | Topic: /initialpose
158 | X std deviation: 0.5
159 | Y std deviation: 0.5
160 | - Class: rviz/SetGoal
161 | Topic: /move_base_simple/goal
162 | - Class: rviz/PublishPoint
163 | Single click: true
164 | Topic: /clicked_point
165 | Value: true
166 | Views:
167 | Current:
168 | Class: rviz/Orbit
169 | Distance: 24.559240341186523
170 | Enable Stereo Rendering:
171 | Stereo Eye Separation: 0.05999999865889549
172 | Stereo Focal Distance: 1
173 | Swap Stereo Eyes: false
174 | Value: false
175 | Focal Point:
176 | X: -0.8183960914611816
177 | Y: -0.3371368646621704
178 | Z: -0.07607473433017731
179 | Focal Shape Fixed Size: true
180 | Focal Shape Size: 0.05000000074505806
181 | Invert Z Axis: false
182 | Name: Current View
183 | Near Clip Distance: 0.009999999776482582
184 | Pitch: 1.4653973579406738
185 | Target Frame:
186 | Value: Orbit (rviz)
187 | Yaw: 3.130399465560913
188 | Saved: ~
189 | Window Geometry:
190 | Displays:
191 | collapsed: false
192 | Height: 1025
193 | Hide Left Dock: false
194 | Hide Right Dock: true
195 | QMainWindow State: 000000ff00000000fd00000004000000000000015600000363fc0200000008fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003d00000363000000c900fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261000000010000010f00000363fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073000000003d00000363000000a400fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000003a50000003efc0100000002fb0000000800540069006d00650100000000000003a5000002eb00fffffffb0000000800540069006d00650100000000000004500000000000000000000002490000036300000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
196 | Selection:
197 | collapsed: false
198 | Time:
199 | collapsed: false
200 | Tool Properties:
201 | collapsed: false
202 | Views:
203 | collapsed: true
204 | Width: 933
205 | X: 987
206 | Y: 27
207 |
--------------------------------------------------------------------------------
/autodock_controller/src/controller.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include
5 | #include
6 | #include
7 | #include
8 | #include
9 | #include
10 | #include "controller.h"
11 |
12 | // Setting linear and angular velocity
13 | void setVel(float x, float y, float yaw, auto robot_point){
14 | static geometry_msgs::Twist vel_msg;
15 | double ideal_theta_1 = 0;
16 | double ideal_theta_2 = -1.57; //angle
17 | double angle_threshold = 0.01; //maximum error of angle
18 |
19 | if (step == 0){
20 | vel_msg.linear.x = 0;
21 | ROS_INFO("docking......, step_1_spin_%d",step1_count);
22 | if (((-(ideal_theta_1)-angle_threshold)<=yaw) && (yaw<=(-(ideal_theta_1)+angle_threshold))){
23 | vel_msg.angular.z = 0;
24 | vel_pub.publish(vel_msg);
25 | step = 1;
26 |
27 | if (step1_count==0){
28 | x_origin = x;
29 | robot_point_temp = robot_point ;
30 | }
31 | }
32 | else if (((-(ideal_theta_1)+angle_threshold)<=yaw) && (yaw<(-(ideal_theta_1)+threshold_w))){
33 | vel_msg.angular.z = min_w;
34 | }
35 | else if (((-(ideal_theta_1)+threshold_w)<=yaw) && (yaw< 3.14)){
36 | vel_msg.angular.z = max_w;
37 | }
38 | else if (((-(ideal_theta_1)-threshold_w)<=yaw) && (yaw<(-(ideal_theta_1)-angle_threshold))){
39 | vel_msg.angular.z = -min_w;
40 | }
41 | else {
42 | vel_msg.angular.z = -max_w;
43 | }
44 | }
45 |
46 | else if (step == 1){
47 | ROS_INFO("docking......, step_1_move_%d",step1_count);
48 |
49 | //printf("%f\n",dist(robot_point_temp,robot_point));
50 | if ((fabs(x) <= dist_to_center) or (dist(robot_point_temp,robot_point) >= fabs(x_origin/split_num))){
51 | vel_msg.linear.x = 0;
52 | vel_pub.publish(vel_msg);
53 | step1_count += 1;
54 | if (fabs(x) <= dist_to_center){
55 | step = 2;
56 | }
57 | else{
58 | robot_point_temp = robot_point;
59 | step = 0;
60 | }
61 |
62 |
63 | }
64 |
65 | else if (x<0){
66 |
67 | if ((dist_to_center0){
76 |
77 | if ((dist_to_center= fabs(x_origin/split_num)) or ((fabs(y) > tune_distense) and (fabs(x) <= tune_threshold) )){
114 | vel_msg.linear.x = 0;
115 | vel_pub.publish(vel_msg);
116 | step2_count += 1;
117 | if (fabs(x) dist_to_center) and (fabs(x) <= 0.6)){
121 | step = 0;
122 | robot_point_temp = robot_point;
123 | }
124 | else{
125 | robot_point_temp = robot_point;
126 | step = 2;
127 | }
128 |
129 | }
130 | else if (fabs(x)<=(dist_to_dock+threshold_v)){
131 | vel_msg.linear.x = -min_v;
132 | }
133 | else {
134 | vel_msg.linear.x = -max_v;
135 | }
136 | }
137 | else if (step == 4){
138 | vel_msg.linear.x = 0;
139 | vel_msg.angular.z = 0;
140 | vel_pub.publish(vel_msg);
141 | ROS_INFO("Finish Docking!");
142 | step = 5;
143 | }
144 | vel_pub.publish(vel_msg);
145 | }
146 |
147 |
148 | int main(int argc, char** argv){
149 | ros::init(argc, argv, "controller_node");
150 | ros::NodeHandle n_;
151 |
152 | // Load Parameters
153 | n_.param("base_frame_id",base_frame_id, "base_link");
154 | n_.param("min_v",min_v, 0.1);
155 | n_.param("min_w",min_w, 0.1);
156 | n_.param("max_v",max_v, 0.3);
157 | n_.param("max_w",max_w, 0.3);
158 | n_.param("dist_to_dock",dist_to_dock, 0.30);
159 | n_.param("dist_to_center",dist_to_center, 0.03);
160 | n_.param("threshold_v",threshold_v, 0.3);
161 | n_.param("threshold_w",threshold_w, 0.4);
162 |
163 | vel_pub = n_.advertise("cmd_vel", 20);
164 | tf::TransformListener listener_dock;
165 | ros::Rate rate(20.0);
166 | while(ros::ok()){
167 |
168 | if (step == 5) {
169 | break;
170 | }
171 |
172 | tf::StampedTransform tf_dock;
173 | tf::StampedTransform tf_odom;
174 | try {
175 | listener_dock.waitForTransform("base_link","dock_frame",ros::Time(0),ros::Duration(3.0));
176 | listener_dock.lookupTransform("base_link","dock_frame",ros::Time(0),tf_dock);
177 | }
178 | catch (tf::TransformException &ex) {
179 | // ROS_WARN("%s",ex.what());
180 | ROS_WARN("Can't recognize the docking station, please move the robot to be closer.");
181 | ros::Duration(1.0).sleep();
182 | continue;
183 | }
184 | listener_dock.waitForTransform("odom","base_link",ros::Time(0),ros::Duration(3.0));
185 | listener_dock.lookupTransform("odom","base_link",ros::Time(0),tf_odom);
186 | // Dock_frame's origin and yaw
187 | float dock_x = tf_dock.getOrigin().x();
188 | float dock_y = tf_dock.getOrigin().y();
189 | float dock_yaw = tf::getYaw(tf_dock.getRotation());
190 | odom[0] = tf_odom.getOrigin().x();
191 | odom[1] = tf_odom.getOrigin().y();
192 | ros::spinOnce();
193 | setVel(dock_x, dock_y, dock_yaw, odom);
194 | rate.sleep();
195 | }
196 | return 0;
197 | }
--------------------------------------------------------------------------------
/autodock_gazebo/model/dock2/model.sdf:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 1
7 |
8 | 0.166667
9 | 0
10 | 0
11 | 0.166667
12 | 0
13 | 0.166667
14 |
15 | 0 0 0 0 -0 0
16 |
17 | 0.014328 -0.052229 6e-06 0 -0 0
18 | 1
19 | 0
20 | 0
21 | 0
22 |
23 | 0 0 0 0 0 -0.9
24 |
25 |
26 | 0.05 0.15 0.5
27 |
28 |
29 |
30 | 1
31 |
35 |
36 | __default__
37 |
38 | 0.3 0.3 0.3 1
39 | 0.7 0.7 0.7 1
40 | 0.01 0.01 0.01 1
41 | 0 0 0 1
42 |
43 | 0
44 | 1
45 |
46 |
47 | 0
48 | 10
49 | 0 0 0 0 0 -0.9
50 |
51 |
52 | 0.05 0.15 0.5
53 |
54 |
55 |
56 |
57 |
58 | 1
59 | 1
60 | 0 0 0
61 | 0
62 | 0
63 |
64 |
65 | 1
66 | 0
67 | 0
68 | 1
69 |
70 | 0
71 |
72 |
73 |
74 |
75 | 0
76 | 1e+06
77 |
78 |
79 | 0
80 | 1
81 | 1
82 |
83 | 0
84 | 0.2
85 | 1e+13
86 | 1
87 | 0.01
88 | 0
89 |
90 |
91 | 1
92 | -0.01
93 | 0
94 | 0.2
95 | 1e+13
96 | 1
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 | 1
105 |
106 | 0.166667
107 | 0
108 | 0
109 | 0.166667
110 | 0
111 | 0.166667
112 |
113 | 0 0 0 0 -0 0
114 |
115 | 0.01467 0.078828 0.000101 0 -0 0
116 | 1
117 | 0
118 | 0
119 | 0
120 |
121 | 0 0 0 0 -0 0.9
122 |
123 |
124 | 0.05 0.15 0.5
125 |
126 |
127 |
128 | 1
129 |
133 |
134 | __default__
135 |
136 | 0.3 0.3 0.3 1
137 | 0.7 0.7 0.7 1
138 | 0.01 0.01 0.01 1
139 | 0 0 0 1
140 |
141 | 0
142 | 1
143 |
144 |
145 | 0
146 | 10
147 | 0 0 0 0 -0 0.9
148 |
149 |
150 | 0.05 0.15 0.5
151 |
152 |
153 |
154 |
155 |
156 | 1
157 | 1
158 | 0 0 0
159 | 0
160 | 0
161 |
162 |
163 | 1
164 | 0
165 | 0
166 | 1
167 |
168 | 0
169 |
170 |
171 |
172 |
173 | 0
174 | 1e+06
175 |
176 |
177 | 0
178 | 1
179 | 1
180 |
181 | 0
182 | 0.2
183 | 1e+13
184 | 1
185 | 0.01
186 | 0
187 |
188 |
189 | 1
190 | -0.01
191 | 0
192 | 0.2
193 | 1e+13
194 | 1
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 | 1
203 |
204 | 0.166667
205 | 0
206 | 0
207 | 0.166667
208 | 0
209 | 0.166667
210 |
211 | 0 0 0 0 -0 0
212 |
213 | -0.036041 -0.155445 3e-06 0 -0 0
214 | 1
215 | 0
216 | 0
217 | 0
218 |
219 | 0 0 0 0 -0 0
220 |
221 |
222 | 0.05 0.15 0.5
223 |
224 |
225 |
226 | 1
227 |
231 |
232 | __default__
233 |
234 | 0.3 0.3 0.3 1
235 | 0.7 0.7 0.7 1
236 | 0.01 0.01 0.01 1
237 | 0 0 0 1
238 |
239 | 0
240 | 1
241 |
242 |
243 | 0
244 | 10
245 | 0 0 0 0 -0 0
246 |
247 |
248 | 0.05 0.15 0.5
249 |
250 |
251 |
252 |
253 |
254 | 1
255 | 1
256 | 0 0 0
257 | 0
258 | 0
259 |
260 |
261 | 1
262 | 0
263 | 0
264 | 1
265 |
266 | 0
267 |
268 |
269 |
270 |
271 | 0
272 | 1e+06
273 |
274 |
275 | 0
276 | 1
277 | 1
278 |
279 | 0
280 | 0.2
281 | 1e+13
282 | 1
283 | 0.01
284 | 0
285 |
286 |
287 | 1
288 | -0.01
289 | 0
290 | 0.2
291 | 1e+13
292 | 1
293 |
294 |
295 |
296 |
297 |
298 |
299 |
300 | 1
301 |
302 | 0.166667
303 | 0
304 | 0
305 | 0.166667
306 | 0
307 | 0.166667
308 |
309 | 0 0 0 0 -0 0
310 |
311 | -0.034531 0.179165 -0.000858 0 -0 0
312 | 1
313 | 0
314 | 0
315 | 0
316 |
317 | 0 0 0 0 -0 0
318 |
319 |
320 | 0.05 0.15 0.5
321 |
322 |
323 |
324 | 1
325 |
329 |
330 | __default__
331 |
332 | 0.3 0.3 0.3 1
333 | 0.7 0.7 0.7 1
334 | 0.01 0.01 0.01 1
335 | 0 0 0 1
336 |
337 | 0
338 | 1
339 |
340 |
341 | 0
342 | 10
343 | 0 0 0 0 -0 0
344 |
345 |
346 | 0.05 0.15 0.5
347 |
348 |
349 |
350 |
351 |
352 | 1
353 | 1
354 | 0 0 0
355 | 0
356 | 0
357 |
358 |
359 | 1
360 | 0
361 | 0
362 | 1
363 |
364 | 0
365 |
366 |
367 |
368 |
369 | 0
370 | 1e+06
371 |
372 |
373 | 0
374 | 1
375 | 1
376 |
377 | 0
378 | 0.2
379 | 1e+13
380 | 1
381 | 0.01
382 | 0
383 |
384 |
385 | 1
386 | -0.01
387 | 0
388 | 0.2
389 | 1e+13
390 | 1
391 |
392 |
393 |
394 |
395 |
396 |
397 | -1.89804 -0.075673 0 0 -0 0
398 |
399 |
400 |
401 |
402 | 7.25 0.15 2.5
403 |
404 |
405 | 0 0 1.25 0 -0 0
406 | 10
407 |
408 |
409 |
410 |
411 |
412 |
413 |
414 |
415 |
416 |
417 |
418 |
419 |
420 |
421 | 0 0 1.25 0 -0 0
422 |
423 |
424 | 7.25 0.15 2.5
425 |
426 |
427 |
428 |
432 | 1 1 1 1
433 |
434 |
435 | 0
436 |
437 |
438 | -0.125 5.925 0 0 -0 3.14159
439 | 0
440 | 0
441 | 0
442 |
443 |
444 |
445 |
446 |
447 | 12 0.15 2.5
448 |
449 |
450 | 0 0 1.25 0 -0 0
451 | 10
452 |
453 |
454 |
455 |
456 |
457 |
458 |
459 |
460 |
461 |
462 |
463 |
464 |
465 |
466 | 0 0 1.25 0 -0 0
467 |
468 |
469 | 12 0.15 2.5
470 |
471 |
472 |
473 |
477 | 1 1 1 1
478 |
479 |
480 | 0
481 |
482 |
483 | -3.675 0 0 0 -0 -1.5708
484 | 0
485 | 0
486 | 0
487 |
488 |
489 |
490 |
491 |
492 | 7.5 0.15 2.5
493 |
494 |
495 | 0 0 1.25 0 -0 0
496 | 10
497 |
498 |
499 |
500 |
501 |
502 |
503 |
504 |
505 |
506 |
507 |
508 |
509 |
510 |
511 | 0 0 1.25 0 -0 0
512 |
513 |
514 | 7.5 0.15 2.5
515 |
516 |
517 |
518 |
522 | 1 1 1 1
523 |
524 |
525 | 0
526 |
527 |
528 | 0 -5.925 0 0 -0 0
529 | 0
530 | 0
531 | 0
532 |
533 | 1
534 |
535 | 0
536 | 1
537 |
538 |
539 |
--------------------------------------------------------------------------------
/autodock_gazebo/model/dock1/model.sdf:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 1
7 |
8 | 0.166667
9 | 0
10 | 0
11 | 0.166667
12 | 0
13 | 0.166667
14 |
15 | 0 0 0 0 -0 0
16 |
17 | 0.013094 -0.060872 6e-06 0 -0 0
18 | 1
19 | 0
20 | 0
21 | 0
22 |
23 | 0 0 0 0 0 -0.7854
24 |
25 |
26 | 0.05 0.15 0.5
27 |
28 |
29 |
30 | 1
31 |
35 |
36 | __default__
37 |
38 | 0.3 0.3 0.3 1
39 | 0.7 0.7 0.7 1
40 | 0.01 0.01 0.01 1
41 | 0 0 0 1
42 |
43 | 0
44 | 1
45 |
46 |
47 | 0
48 | 10
49 | 0 0 0 0 0 -0.7854
50 |
51 |
52 | 0.05 0.15 0.5
53 |
54 |
55 |
56 |
57 |
58 | 1
59 | 1
60 | 0 0 0
61 | 0
62 | 0
63 |
64 |
65 | 1
66 | 0
67 | 0
68 | 1
69 |
70 | 0
71 |
72 |
73 |
74 |
75 | 0
76 | 1e+06
77 |
78 |
79 | 0
80 | 1
81 | 1
82 |
83 | 0
84 | 0.2
85 | 1e+13
86 | 1
87 | 0.01
88 | 0
89 |
90 |
91 | 1
92 | -0.01
93 | 0
94 | 0.2
95 | 1e+13
96 | 1
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 | 1
105 |
106 | 0.166667
107 | 0
108 | 0
109 | 0.166667
110 | 0
111 | 0.166667
112 |
113 | 0 0 0 0 -0 0
114 |
115 | 0.01467 0.078828 0.000101 0 -0 0
116 | 1
117 | 0
118 | 0
119 | 0
120 |
121 | 0 0 0 0 -0 0.7854
122 |
123 |
124 | 0.05 0.15 0.5
125 |
126 |
127 |
128 | 1
129 |
133 |
134 | __default__
135 |
136 | 0.3 0.3 0.3 1
137 | 0.7 0.7 0.7 1
138 | 0.01 0.01 0.01 1
139 | 0 0 0 1
140 |
141 | 0
142 | 1
143 |
144 |
145 | 0
146 | 10
147 | 0 0 0 0 -0 0.7854
148 |
149 |
150 | 0.05 0.15 0.5
151 |
152 |
153 |
154 |
155 |
156 | 1
157 | 1
158 | 0 0 0
159 | 0
160 | 0
161 |
162 |
163 | 1
164 | 0
165 | 0
166 | 1
167 |
168 | 0
169 |
170 |
171 |
172 |
173 | 0
174 | 1e+06
175 |
176 |
177 | 0
178 | 1
179 | 1
180 |
181 | 0
182 | 0.2
183 | 1e+13
184 | 1
185 | 0.01
186 | 0
187 |
188 |
189 | 1
190 | -0.01
191 | 0
192 | 0.2
193 | 1e+13
194 | 1
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 | 1
203 |
204 | 0.166667
205 | 0
206 | 0
207 | 0.166667
208 | 0
209 | 0.166667
210 |
211 | 0 0 0 0 -0 0
212 |
213 | -0.032339 -0.171493 3e-06 0 -0 0
214 | 1
215 | 0
216 | 0
217 | 0
218 |
219 | 0 0 0 0 -0 0
220 |
221 |
222 | 0.05 0.15 0.5
223 |
224 |
225 |
226 | 1
227 |
231 |
232 | __default__
233 |
234 | 0.3 0.3 0.3 1
235 | 0.7 0.7 0.7 1
236 | 0.01 0.01 0.01 1
237 | 0 0 0 1
238 |
239 | 0
240 | 1
241 |
242 |
243 | 0
244 | 10
245 | 0 0 0 0 -0 0
246 |
247 |
248 | 0.05 0.15 0.5
249 |
250 |
251 |
252 |
253 |
254 | 1
255 | 1
256 | 0 0 0
257 | 0
258 | 0
259 |
260 |
261 | 1
262 | 0
263 | 0
264 | 1
265 |
266 | 0
267 |
268 |
269 |
270 |
271 | 0
272 | 1e+06
273 |
274 |
275 | 0
276 | 1
277 | 1
278 |
279 | 0
280 | 0.2
281 | 1e+13
282 | 1
283 | 0.01
284 | 0
285 |
286 |
287 | 1
288 | -0.01
289 | 0
290 | 0.2
291 | 1e+13
292 | 1
293 |
294 |
295 |
296 |
297 |
298 |
299 |
300 | 1
301 |
302 | 0.166667
303 | 0
304 | 0
305 | 0.166667
306 | 0
307 | 0.166667
308 |
309 | 0 0 0 0 -0 0
310 |
311 | -0.030824 0.187821 -0.000858 0 -0 0
312 | 1
313 | 0
314 | 0
315 | 0
316 |
317 | 0 0 0 0 -0 0
318 |
319 |
320 | 0.05 0.15 0.5
321 |
322 |
323 |
324 | 1
325 |
329 |
330 | __default__
331 |
332 | 0.3 0.3 0.3 1
333 | 0.7 0.7 0.7 1
334 | 0.01 0.01 0.01 1
335 | 0 0 0 1
336 |
337 | 0
338 | 1
339 |
340 |
341 | 0
342 | 10
343 | 0 0 0 0 -0 0
344 |
345 |
346 | 0.05 0.15 0.5
347 |
348 |
349 |
350 |
351 |
352 | 1
353 | 1
354 | 0 0 0
355 | 0
356 | 0
357 |
358 |
359 | 1
360 | 0
361 | 0
362 | 1
363 |
364 | 0
365 |
366 |
367 |
368 |
369 | 0
370 | 1e+06
371 |
372 |
373 | 0
374 | 1
375 | 1
376 |
377 | 0
378 | 0.2
379 | 1e+13
380 | 1
381 | 0.01
382 | 0
383 |
384 |
385 | 1
386 | -0.01
387 | 0
388 | 0.2
389 | 1e+13
390 | 1
391 |
392 |
393 |
394 |
395 |
396 |
397 | -1.89804 -0.075673 -0 0 -0 0
398 |
399 |
400 |
401 |
402 | 7.25 0.15 2.5
403 |
404 |
405 | 0 0 1.25 0 -0 0
406 | 10
407 |
408 |
409 |
410 |
411 |
412 |
413 |
414 |
415 |
416 |
417 |
418 |
419 |
420 |
421 | 0 0 1.25 0 -0 0
422 |
423 |
424 | 7.25 0.15 2.5
425 |
426 |
427 |
428 |
432 | 1 1 1 1
433 |
434 |
435 | 0
436 |
437 |
438 | -0.125 5.925 0 0 -0 3.14159
439 | 0
440 | 0
441 | 0
442 |
443 |
444 |
445 |
446 |
447 | 12 0.15 2.5
448 |
449 |
450 | 0 0 1.25 0 -0 0
451 | 10
452 |
453 |
454 |
455 |
456 |
457 |
458 |
459 |
460 |
461 |
462 |
463 |
464 |
465 |
466 | 0 0 1.25 0 -0 0
467 |
468 |
469 | 12 0.15 2.5
470 |
471 |
472 |
473 |
477 | 1 1 1 1
478 |
479 |
480 | 0
481 |
482 |
483 | -3.675 0 0 0 -0 -1.5708
484 | 0
485 | 0
486 | 0
487 |
488 |
489 |
490 |
491 |
492 | 7.5 0.15 2.5
493 |
494 |
495 | 0 0 1.25 0 -0 0
496 | 10
497 |
498 |
499 |
500 |
501 |
502 |
503 |
504 |
505 |
506 |
507 |
508 |
509 |
510 |
511 | 0 0 1.25 0 -0 0
512 |
513 |
514 | 7.5 0.15 2.5
515 |
516 |
517 |
518 |
522 | 1 1 1 1
523 |
524 |
525 | 0
526 |
527 |
528 | 0 -5.925 0 0 -0 0
529 | 0
530 | 0
531 | 0
532 |
533 | 1
534 |
535 | 0
536 | 1
537 |
538 |
539 |
--------------------------------------------------------------------------------