diff --git a/Doxyfile b/Doxyfile index c7054de..23dde2a 100644 --- a/Doxyfile +++ b/Doxyfile @@ -68,7 +68,7 @@ PROJECT_LOGO = # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. -OUTPUT_DIRECTORY = doxygen +OUTPUT_DIRECTORY = docs # If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 # sub-directories (in 2 levels) under the output directory of each output format diff --git a/Images/f710-gallery-1.png b/Images/f710-gallery-1.png new file mode 100644 index 0000000..00fb9ae Binary files /dev/null and b/Images/f710-gallery-1.png differ diff --git a/Images/img-bebop2.jpg b/Images/img-bebop2.jpg new file mode 100644 index 0000000..04e870a Binary files /dev/null and b/Images/img-bebop2.jpg differ diff --git a/Images/tag_36h11.png b/Images/tag_36h11.png new file mode 100644 index 0000000..e06f712 Binary files /dev/null and b/Images/tag_36h11.png differ diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..9ea5cf4 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 RedwanNewaz + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 06a853f..e098031 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,137 @@ -# Bebop2 Controller +@mainpage Parrot Bebop2 Drone with Joystick Controller README File + + +## Introduction + +The Parrot Bebop 2 is a small, lightweight manufactured by Parrot, a French company specializing in consumer electronics. It is compact and lightweight, making it easy to transport and use on the go which makes it a popular choice +It's camera has a most impressive electronic image stabilization and with a top speed of 40 mph, this drone can really move. The Bebop 2 has a battery life of up to 25 minutes.
+ +This README file explains how to control the drone using a joystick and ROS drivers, add visual servoing capabilities, and scan for April Tags to find the drone's relative position. + +----------------------------------------- + +Parrot Bebop2 Drone + + ## Quick Run -Connect your joystick to the computer. -Joystick buttons perform following operations: +**Hardware Setup**: +Connect your joystick to the computer.
+ + +Before starting the program, the drone should be turned on and the computer connected to the drone WiFi. + +> **Warning** +> It is strictly recommended to use protective equipments while testing the drone.
+If the drone needs to be shut down completely then we should flip the drone. + + +*Joystick buttons perform following operations*: + ```angular2html - IDLE = 0, // setpoint can be freely moved with joystick. Sphere color blue - TAKEOFF = 1, // drone will takeoff from the ground - LAND = 2, //drone will land - ENGAGE = 3, // set current location as a set point (for hover). Sphere color yellow - CONTROL = 4 // start PID controller for the current (ENGAGE) setpoint. Sphere color cyan + IDLE = 0, // Setpoint can be freely moved with joystick. Sphere color blue + + TAKEOFF = 1, // Drone will takeoff from the ground + + LAND = 2, // Drone will land + + ENGAGE = 3, // Set current location as a set point (for hover). Sphere color yellow + + CONTROL = 4 // Start PID controller for the current (ENGAGE) setpoint. Sphere color cyan ``` Once control mode is enabled, setpoint can also be controlled using joystick axes. -Note that, only position controller is implemented. +Note that, only position controller is implemented from the analog sticks. Orientation controller needs yaw angle which could be directly obtained from bebop odom. +------------------------------------------ + + +## Software Setup: + + +-- **Installation of bebop_autonomy** from fork manually is required to send relative move commands to the drone. Check out [install bebop_autonomy from fork and build visp](http://wiki.ros.org/visp_ros/Tutorials/How%20to%20do%20visual%20servoing%20with%20Parrot%20Bebop%202%20drone%20and%20visp_ros).

+Bebop_autonomy is a ROS driver for Parrot Bebop 2.0 drones (quadrocopters), based on Parrot’s official ARDroneSDK3. You can check out [this source code](https://github.com/AutonomyLab/bebop_autonomy) for the driver is for more understanding. + +--------------------------------------------- + + +Joystick Controller + +## Operating the drone + + +The Parrot Bebop 2 Drone can be controlled from a PID Joystick Controller. The drone can be manuvered with the joytsick analog sticks. + +The functions of the Four Action Buttons of the joystick is as follows: + +// To be written down. + +1. A ---> TAKE OFF (Green button) +2. B ---> LAND (Red Button) +3. X ---> IDLE (Blue Button) +4. Y ---> ENGAGE (Yellow Button) +5. L ---> CONTROL (Top Left Button) + +--------------------------------------------- + +AprilTag 36h11 + +## April Tags + + +AprilTag is a visual fiducial system, useful for a wide variety of tasks including augmented reality, robotics, and camera calibration. +Targets can be created from an ordinary printer, and the AprilTag detection software computes the precise 3D position, orientation, and identity of the tags relative to the camera.

+ +Using the built-in camera of the Parrot Bebop 2 Drone, it scans the tag and determines its relative postion from the tag.
+ + +An April Tag from 36h11 family that will serve as target for the visual servoing (see [this page](https://visp-doc.inria.fr/doxygen/visp-daily/tutorial-franka-pbvs.html#franka_prereq_target) to print one). + + + +--------------------------------------------- + +## Visualisation using Graphical Interface (RVIZ) + +The Parrot Bebop 2 drone can be monitored and visualised using a graphical interface like rviz.
+ +**For RVIZ installtion** :- +``` + sudo apt-get install ros-[ros-version]-rviz +``` + +For example:- +``` + sudo apt-get install ros-noetic-rviz +``` + +To run rviz +``` +rosrun rviz rviz + +``` + +Check out http://wiki.ros.org/rviz/UserGuide for more information. + +----------------------------------------------- + ## Parameter Tuning Refer to ``config/param.yaml`` file to read about tuning parameters. Apriltags are used for landmarks and then the drone position is estimated from those landmarks. A complementary filter is implemented to compute state by combining multiple landmarks. + +------------------------------------------------ + +## Steps to use the bebop2_controller Launch Files + +1. **To use Dummy Filter** : ``` roslaunch bebop_controller bebop_frames_dummy.launch ``` +2. **To use Complementary Filter** : ``` roslaunch bebop_controller bebop_complementary_filter.launch ``` +3. **To run the apriltag_ros_continuous_node** : ``` roslaunch bebop2_controller apriltag.launch ``` + +Step 1. Press the A button on the Joystick Controller to take-off.
+Step 2. Press the left-bottom (LB) button to engage Controller.
+Step 3. Use the joystick axis to control the set-point diff --git a/airlib/control/LQR/LQR.h b/airlib/control/LQR/LQR.h index d53070d..f6aa621 100644 --- a/airlib/control/LQR/LQR.h +++ b/airlib/control/LQR/LQR.h @@ -12,9 +12,16 @@ #define DEBUG(x) std::cout << x << std::endl namespace bebop2 { - + /** + * @brief The LQR is an optimal control regulator that better tracks a reference trajectory. + * + * It predicts future states of the drone at every time step in order to minimize a global criterion/cost function. By estimating future states + * based on past outputs, we are able to better regulate offset in tracking. + * The LQR algorithm is essentially an automated way of finding an appropriate state-feedback controller. + */ class LQR { public: + /// @brief A default constructor for LQR. LQR(); private: diff --git a/doxygen/html/functions_eval.html b/docs/html/ApriltagLandmarks_8cpp.html similarity index 71% rename from doxygen/html/functions_eval.html rename to docs/html/ApriltagLandmarks_8cpp.html index 1eed078..bca7908 100644 --- a/doxygen/html/functions_eval.html +++ b/docs/html/ApriltagLandmarks_8cpp.html @@ -3,9 +3,9 @@ - + -airlib: Class Members - Enumerator +airlib: airlib/localization/Sensors/ApriltagLandmarks.cpp File Reference @@ -29,7 +29,7 @@ - + -
+ + +
+
ApriltagLandmarks.cpp File Reference
+
+
#include "airlib/localization/Sensors/ApriltagLandmarks.h"
+
+

Go to the source code of this file.

diff --git a/docs/html/ApriltagLandmarks_8cpp_source.html b/docs/html/ApriltagLandmarks_8cpp_source.html new file mode 100644 index 0000000..5e490e4 --- /dev/null +++ b/docs/html/ApriltagLandmarks_8cpp_source.html @@ -0,0 +1,164 @@ + + + + + + + +airlib: airlib/localization/Sensors/ApriltagLandmarks.cpp Source File + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
ApriltagLandmarks.cpp
+
+
+Go to the documentation of this file.
1//
+
2// Created by redwan on 12/15/22.
+
3//
+
4
+ +
6
+
7ApriltagLandmarks::ApriltagLandmarks(ros::NodeHandle& nh): nh_(nh) {
+
8
+
9
+
10 std::vector<int>tagIds;
+
11 ros::param::get("~apriltags", tagIds);
+
12 for(auto tagId : tagIds)
+
13 {
+
14 std::string tag_name = "tag" + std::to_string(tagId);
+
15 std::vector<double> value;
+
16 ros::param::get("~" + tag_name, value);
+
17 tf::Transform tagTransform;
+
18 tagTransform.setOrigin(tf::Vector3(value[0], value[1], value[2]));
+
19 landmarks_[tag_name] = tagTransform;
+
20 }
+
21
+
22 apriltagSub_ = nh_.subscribe("/tag_detections", 1, &ApriltagLandmarks::apriltag_callback, this);
+
23 ROS_INFO_STREAM("[ApriltagLandmarks] initialized");
+
24}
+
25
+
26
+
27
+
28void
+
29ApriltagLandmarks::apriltag_callback(const apriltag_ros::AprilTagDetectionArray::ConstPtr &msg) {
+
30
+
31// ROS_INFO_STREAM(*msg);
+
32 for(auto detection: msg->detections)
+
33 {
+
34 std::string tagName = "tag" + std::to_string(detection.id[0]);
+
35 auto pose = detection.pose.pose.pose;
+
36 tf::Transform tagTransform;
+
37 tagTransform.setOrigin(tf::Vector3(pose.position.x, pose.position.y, pose.position.z));
+
38 tagTransform.setRotation(tf::Quaternion(pose.orientation.x, pose.orientation.y, pose.orientation.z, pose.orientation.w));
+
39 auto position = transformToGlobalFrame(tagTransform, tagName);
+
40 measurements_.push({position.x, position.y, position.z, 0});
+
41// ROS_INFO_STREAM("[ApriltagLandmarks] mes size" << measurements_.size());
+
42 }
+
43
+
44}
+
45
+
46FieldLocation ApriltagLandmarks::transformToGlobalFrame(const tf::Transform &tagTransform, const std::string &tagName) {
+
47 // https://visp-doc.inria.fr/doxygen/visp-daily/tutorial-bebop2-vs.html
+
48 // https://www.andre-gaschler.com/rotationconverter/
+
49
+
50 tf::Transform endEffector;
+
51 // convert camera to base_link which is a fixed coordinate and given as follows
+
52 endEffector.setOrigin(tf::Vector3(-0.09, 0, 0));
+
53 endEffector.setRotation(tf::Quaternion(0.5, -0.5, 0.5, -0.5));
+
54 tf::Transform baseLink = endEffector * tagTransform;
+
55 // convert base_link to map coordinate
+
56 auto loc = landmarks_[tagName].getOrigin() - baseLink.getOrigin();
+
57 FieldLocation tagStateObs = FieldLocation{tagName, loc.x(), loc.y(), loc.z()};
+
58
+
59 return tagStateObs;
+
60}
+
61
+
62
+
63void ApriltagLandmarks::operator()(std::vector<double>& result){
+
64 result = measurements_.front();
+
65 measurements_.pop();
+
66}
+
67
+ +
69 return measurements_.empty();
+
70}
+
71
+ +
void operator()(std::vector< double > &result)
This is an interface to access to the internal state vector so that other modules can do their comput...
+
ApriltagLandmarks(ros::NodeHandle &nh)
+
void apriltag_callback(const apriltag_ros::AprilTagDetectionArray::ConstPtr &msg)
Given an array of detected tags, here we calculate robot global coordinate with respect to each tag....
+
bool empty()
This is an interface to check whether internal state vector is empty or not so that we can safely rea...
+
FieldLocation transformToGlobalFrame(const tf::Transform &tagTransform, const std::string &tagName)
tag is detected with respect to camera frame which needs to be transformed to global frame through ca...
+
Field location structure.
Definition: robot_defs.h:56
+
double x
x-position (in meters)
Definition: robot_defs.h:59
+
+ + + + diff --git a/docs/html/ApriltagLandmarks_8h.html b/docs/html/ApriltagLandmarks_8h.html new file mode 100644 index 0000000..9d70a91 --- /dev/null +++ b/docs/html/ApriltagLandmarks_8h.html @@ -0,0 +1,106 @@ + + + + + + + +airlib: include/airlib/localization/Sensors/ApriltagLandmarks.h File Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Classes
+
ApriltagLandmarks.h File Reference
+
+
+
#include <memory>
+#include <unordered_map>
+#include <ros/ros.h>
+#include <tf/transform_listener.h>
+#include "airlib/robot_defs.h"
+#include <apriltag_ros/AprilTagDetectionArray.h>
+#include <geometry_msgs/PoseWithCovarianceStamped.h>
+#include <nav_msgs/Odometry.h>
+#include <queue>
+#include "SensorBase.h"
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  ApriltagLandmarks
 This class computes the robot coordinate from stationary tags. More...
 
+
+ + + + diff --git a/docs/html/ApriltagLandmarks_8h_source.html b/docs/html/ApriltagLandmarks_8h_source.html new file mode 100644 index 0000000..00db8ee --- /dev/null +++ b/docs/html/ApriltagLandmarks_8h_source.html @@ -0,0 +1,133 @@ + + + + + + + +airlib: include/airlib/localization/Sensors/ApriltagLandmarks.h Source File + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
ApriltagLandmarks.h
+
+
+Go to the documentation of this file.
1//
+
2// Created by redwan on 12/15/22.
+
3//
+
4
+
5#ifndef airlib_APRILTAGLANDMARKS_H
+
6#define airlib_APRILTAGLANDMARKS_H
+
7#include <memory>
+
8#include <unordered_map>
+
9#include <ros/ros.h>
+
10#include <tf/transform_listener.h>
+
11#include "airlib/robot_defs.h"
+
12#include <apriltag_ros/AprilTagDetectionArray.h>
+
13#include <geometry_msgs/PoseWithCovarianceStamped.h>
+
14#include <nav_msgs/Odometry.h>
+
15
+
16#include <queue>
+
17#include "SensorBase.h"
+ +
31
+
32public:
+
33 ApriltagLandmarks(ros::NodeHandle& nh);
+
34 void operator()(std::vector<double>& result);
+
35 bool empty();
+
36
+
37private:
+
39 std::unordered_map<std::string, tf::Transform> landmarks_;
+
41 ros::Subscriber apriltagSub_;
+
43 ros::NodeHandle nh_;
+
45 std::queue<std::vector<double>> measurements_;
+
46
+
47protected:
+
55 void apriltag_callback(const apriltag_ros::AprilTagDetectionArray::ConstPtr& msg);
+
61 FieldLocation transformToGlobalFrame(const tf::Transform& tagTransform, const std::string& tagName);
+
62
+
63
+
64};
+
65
+
66
+
67#endif //airlib_APRILTAGLANDMARKS_H
+ +
This class computes the robot coordinate from stationary tags.
+
void operator()(std::vector< double > &result)
This is an interface to access to the internal state vector so that other modules can do their comput...
+
void apriltag_callback(const apriltag_ros::AprilTagDetectionArray::ConstPtr &msg)
Given an array of detected tags, here we calculate robot global coordinate with respect to each tag....
+
bool empty()
This is an interface to check whether internal state vector is empty or not so that we can safely rea...
+
FieldLocation transformToGlobalFrame(const tf::Transform &tagTransform, const std::string &tagName)
tag is detected with respect to camera frame which needs to be transformed to global frame through ca...
+
This class provides a conection to acquire internal state vector.
Definition: SensorBase.h:23
+ +
Field location structure.
Definition: robot_defs.h:56
+
+ + + + diff --git a/docs/html/ComplementaryFilter_8h.html b/docs/html/ComplementaryFilter_8h.html new file mode 100644 index 0000000..a5c499b --- /dev/null +++ b/docs/html/ComplementaryFilter_8h.html @@ -0,0 +1,98 @@ + + + + + + + +airlib: include/airlib/localization/Filters/ComplementaryFilter.h File Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Classes
+
ComplementaryFilter.h File Reference
+
+
+
#include <vector>
+#include "FilterBase.h"
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  ComplementaryFilter
 The ComplementaryFilter.h class implements the complmentary filter where it initializes the state and updates it using the. More...
 
+
+ + + + diff --git a/docs/html/ComplementaryFilter_8h_source.html b/docs/html/ComplementaryFilter_8h_source.html new file mode 100644 index 0000000..e4e7428 --- /dev/null +++ b/docs/html/ComplementaryFilter_8h_source.html @@ -0,0 +1,130 @@ + + + + + + + +airlib: include/airlib/localization/Filters/ComplementaryFilter.h Source File + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
ComplementaryFilter.h
+
+
+Go to the documentation of this file.
1//
+
2// Created by redwan on 12/15/22.
+
3//
+
4
+
5#ifndef BEBOP2_CONTROLLER_COMPLEMENTARYFILTER_H
+
6#define BEBOP2_CONTROLLER_COMPLEMENTARYFILTER_H
+
7#include <vector>
+
8#include "FilterBase.h"
+
9
+ +
13public:
+
14 ComplementaryFilter(double alpha): m_alpha(alpha)
+
15 {
+
16
+
17 }
+
18
+
19 void init(const std::vector<double>& X0)
+
20 {
+
21 X_.clear();
+
22 std::copy(X0.begin(), X0.end(), std::back_inserter(X_));
+
23 }
+
24
+
25
+
26 void update(const std::vector<double>& obs, std::vector<double>& result)
+
27 {
+
28
+
29 for (int i = 0; i < obs.size(); ++i) {
+
30 X_[i] = m_alpha * X_[i] + (1 - m_alpha) * obs[i];
+
31 }
+
32 result.clear();
+
33 std::copy(X_.begin(), X_.end(),std::back_inserter(result));
+
34 }
+
35private:
+
36 double m_alpha;
+
37};
+
38
+
39
+
40#endif //BEBOP2_CONTROLLER_COMPLEMENTARYFILTER_H
+ +
The ComplementaryFilter.h class implements the complmentary filter where it initializes the state and...
+
ComplementaryFilter(double alpha)
filter's alpha paramater in update() method.
+
void update(const std::vector< double > &obs, std::vector< double > &result)
Updated state is calculated and stored.
+
void init(const std::vector< double > &X0)
Makes the current estimate of the state of the system start out being the same as the true state.
+
The FilterBase class enables various other classes to share the FilterPtr. This class allows other cl...
Definition: FilterBase.h:17
+
std::vector< double > X_
Estimated state of the system.
Definition: FilterBase.h:45
+
+ + + + diff --git a/docs/html/ControlViz_8cpp.html b/docs/html/ControlViz_8cpp.html new file mode 100644 index 0000000..fba22ea --- /dev/null +++ b/docs/html/ControlViz_8cpp.html @@ -0,0 +1,96 @@ + + + + + + + +airlib: airlib/control/ControlViz.cpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Namespaces
+
ControlViz.cpp File Reference
+
+
+
#include "airlib/control/ControlViz.h"
+
+

Go to the source code of this file.

+ + + + +

+Namespaces

namespace  bebop2
 
+
+ + + + diff --git a/docs/html/ControlViz_8cpp_source.html b/docs/html/ControlViz_8cpp_source.html new file mode 100644 index 0000000..12b8aae --- /dev/null +++ b/docs/html/ControlViz_8cpp_source.html @@ -0,0 +1,217 @@ + + + + + + + +airlib: airlib/control/ControlViz.cpp Source File + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
ControlViz.cpp
+
+
+Go to the documentation of this file.
1//
+
2// Created by redwan on 12/14/22.
+
3//
+
4
+ +
6
+
7namespace bebop2 {
+
8 ControlViz::ControlViz( ros::NodeHandle &nh) : nh_(nh) {
+
9 pub_marker_ = nh_.advertise<visualization_msgs::Marker>("/bebop2/goal", 10);
+
10 std::vector<std::string>header{"x", "y", "z", "yaw"};
+
11 logger_ = std::make_unique<LoggerCSV>(header, _FQ);
+
12 }
+
13
+
14
+
15
+
16 void ControlViz::set_marker_from_pose(const tf::Transform &pose, visualization_msgs::Marker &msg) {
+
17 msg.header.frame_id = "map";
+
18 msg.ns = "target";
+
19 msg.header.stamp = ros::Time::now();
+
20 msg.action = visualization_msgs::Marker::ADD;
+
21
+
22
+
23 msg.scale.x = 0.35;
+
24 msg.scale.y = 0.35;
+
25 msg.scale.z = 0.35;
+
26
+
27 // update position
+
28 double x, y, z, yaw;
+
29 msg.pose.position.x = x = pose.getOrigin().x();
+
30 msg.pose.position.y = y = pose.getOrigin().y();
+
31 msg.pose.position.z = z = pose.getOrigin().z();
+
32
+
33 // update orientation
+
34 msg.pose.orientation.x = pose.getRotation().x();
+
35 msg.pose.orientation.y = pose.getRotation().y();
+
36 msg.pose.orientation.z = pose.getRotation().z();
+
37 msg.pose.orientation.w = pose.getRotation().w();
+
38
+
39 yaw = tf::getYaw(pose.getRotation());
+
40 //TODO add logger enable flag
+
41 logger_->addRow(std::vector<double>{x, y, z, yaw});
+
42
+
43 }
+
44
+
45 void ControlViz::set_marker_color(const MARKER_COLOR &color, visualization_msgs::Marker &msg) {
+
46 switch (color) {
+
47 case RED:
+
48 {
+
49 msg.color.a = 0.5;
+
50 msg.color.r = 1;
+
51 break;
+
52 }
+
53 case GREEN:
+
54 {
+
55 msg.color.a = 0.5;
+
56 msg.color.g = 1;
+
57 break;
+
58 }
+
59 case BLUE:
+
60 {
+
61 msg.color.a = 0.5;
+
62 msg.color.b = 1;
+
63 break;
+
64 }
+
65 case YELLOW:
+
66 {
+
67 msg.color.a = 0.5;
+
68 msg.color.r = 1;
+
69 msg.color.g = 1;
+
70 break;
+
71 }
+
72 case CYAN:
+
73 {
+
74 msg.color.a = 0.5;
+
75 msg.color.b = 1;
+
76 msg.color.g = 1;
+
77 break;
+
78 }
+
79 case GRAY:
+
80 {
+
81 msg.color.a = 0.5;
+
82 msg.color.r = 0.67;
+
83 msg.color.b = 0.67;
+
84 msg.color.g = 0.67;
+
85 break;
+
86 }
+
87 }
+
88
+
89 }
+
90
+
91 void ControlViz::update(const tf::Transform &pose, const MARKER_COLOR& color) {
+
92 visualization_msgs::Marker msg;
+
93 set_marker_from_pose(pose, msg);
+
94 set_marker_color(color, msg);
+
95 msg.type = visualization_msgs::Marker::SPHERE;
+
96
+
97 pub_marker_.publish(msg);
+
98
+
99 }
+
100
+
101 void ControlViz::setDrone(const tf::Transform &pose) {
+
102
+
103 visualization_msgs::Marker msg;
+
104 set_marker_from_pose(pose, msg);
+
105 msg.ns = "drone";
+
106 msg.type = visualization_msgs::Marker::MESH_RESOURCE;
+
107 msg.mesh_resource = "package://airlib/config/bebop.dae";
+
108// msg.mesh_use_embedded_materials = true;
+
109 msg.scale.x = msg.scale.y = msg.scale.z = 0.001;
+
110
+ +
112 msg.color.a = 1.0;
+
113 msg.id = 101;
+
114
+
115 pub_marker_.publish(msg);
+
116
+
117 }
+
118} // bebop2
+ +
void set_marker_color(const MARKER_COLOR &color, visualization_msgs::Marker &msg)
sets different colors for different flights and paths of the drone for better understanding.
Definition: ControlViz.cpp:45
+
ControlViz(ros::NodeHandle &nh)
Publishes messages through /bebop2/goal topic.
Definition: ControlViz.cpp:8
+
void setDrone(const tf::Transform &pose)
This function starts and slightly lifts the drone. As a result sets the Marker from the pose paramete...
Definition: ControlViz.cpp:101
+
void set_marker_from_pose(const tf::Transform &pose, visualization_msgs::Marker &msg)
Receives the current position of the drone and uses that position to populate the point position and ...
Definition: ControlViz.cpp:16
+
void update(const tf::Transform &pose, const MARKER_COLOR &color)
This functions updates the path and the color of the path of the robot. It also publishes the message...
Definition: ControlViz.cpp:91
+ +
MARKER_COLOR
Definition: ControlViz.h:15
+
@ BLUE
Definition: ControlViz.h:18
+
@ GRAY
Definition: ControlViz.h:21
+
@ CYAN
Definition: ControlViz.h:19
+
@ YELLOW
Definition: ControlViz.h:20
+
@ GREEN
Definition: ControlViz.h:17
+ +
+ + + + diff --git a/docs/html/ControlViz_8h.html b/docs/html/ControlViz_8h.html new file mode 100644 index 0000000..0ba5350 --- /dev/null +++ b/docs/html/ControlViz_8h.html @@ -0,0 +1,122 @@ + + + + + + + +airlib: include/airlib/control/ControlViz.h File Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Classes | +Namespaces | +Enumerations
+
ControlViz.h File Reference
+
+
+
#include <ros/ros.h>
+#include <memory>
+#include <visualization_msgs/Marker.h>
+#include <tf/transform_broadcaster.h>
+#include "airlib/utility/LoggerCSV.h"
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  bebop2::ControlViz
 This class helps in the 3D visualization of data being rendered. It receives the updated position and orientation of the drone and sends points and lines to a graphical interface. Hence, visualizes the movement, position, orientation and behaviors of the drone. More...
 
+ + + +

+Namespaces

namespace  bebop2
 
+ + + +

+Enumerations

enum  bebop2::MARKER_COLOR {
+  bebop2::RED +, bebop2::GREEN +, bebop2::BLUE +, bebop2::CYAN +,
+  bebop2::YELLOW +, bebop2::GRAY +
+ }
 
+
+ + + + diff --git a/docs/html/ControlViz_8h_source.html b/docs/html/ControlViz_8h_source.html new file mode 100644 index 0000000..ec0ffd4 --- /dev/null +++ b/docs/html/ControlViz_8h_source.html @@ -0,0 +1,143 @@ + + + + + + + +airlib: include/airlib/control/ControlViz.h Source File + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
ControlViz.h
+
+
+Go to the documentation of this file.
1//
+
2// Created by redwan on 12/14/22.
+
3//
+
4
+
5#ifndef BEBOP2_CONTROLLER_CONTROLVIZ_H
+
6#define BEBOP2_CONTROLLER_CONTROLVIZ_H
+
7#include <ros/ros.h>
+
8#include <memory>
+
9#include <visualization_msgs/Marker.h>
+
10#include <tf/transform_broadcaster.h>
+ +
12
+
13namespace bebop2 {
+ +
15 {
+ + + + + +
21 GRAY
+
22 };
+
25 class ControlViz {
+
26 public:
+
32 explicit ControlViz( ros::NodeHandle &nh);
+
40 void setDrone(const tf::Transform& pose);
+
50 void update(const tf::Transform& pose, const MARKER_COLOR& color);
+
51
+
52 private:
+
54 ros::NodeHandle nh_;
+
56 ros::Publisher pub_marker_;
+
57 std::unique_ptr<LoggerCSV> logger_;
+
58 const int LOGGER_FQ = 10; // Hz
+
59
+
60 protected:
+
67 void set_marker_from_pose(const tf::Transform& pose, visualization_msgs::Marker& msg);
+
73 void set_marker_color(const MARKER_COLOR& color, visualization_msgs::Marker& msg);
+
74
+
75
+
76 };
+
77
+
78} // bebop2
+
79
+
80#endif //BEBOP2_CONTROLLER_CONTROLVIZ_H
+ +
This class helps in the 3D visualization of data being rendered. It receives the updated position and...
Definition: ControlViz.h:25
+
void set_marker_color(const MARKER_COLOR &color, visualization_msgs::Marker &msg)
sets different colors for different flights and paths of the drone for better understanding.
Definition: ControlViz.cpp:45
+
void setDrone(const tf::Transform &pose)
This function starts and slightly lifts the drone. As a result sets the Marker from the pose paramete...
Definition: ControlViz.cpp:101
+
void set_marker_from_pose(const tf::Transform &pose, visualization_msgs::Marker &msg)
Receives the current position of the drone and uses that position to populate the point position and ...
Definition: ControlViz.cpp:16
+
void update(const tf::Transform &pose, const MARKER_COLOR &color)
This functions updates the path and the color of the path of the robot. It also publishes the message...
Definition: ControlViz.cpp:91
+ +
MARKER_COLOR
Definition: ControlViz.h:15
+
@ BLUE
Definition: ControlViz.h:18
+
@ GRAY
Definition: ControlViz.h:21
+
@ CYAN
Definition: ControlViz.h:19
+
@ YELLOW
Definition: ControlViz.h:20
+
@ GREEN
Definition: ControlViz.h:17
+ +
+ + + + diff --git a/docs/html/ControllerBase_8cpp.html b/docs/html/ControllerBase_8cpp.html new file mode 100644 index 0000000..a8903be --- /dev/null +++ b/docs/html/ControllerBase_8cpp.html @@ -0,0 +1,98 @@ + + + + + + + +airlib: airlib/control/ControllerBase.cpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Namespaces
+
ControllerBase.cpp File Reference
+
+
+
#include <numeric>
+#include <utility>
+#include "airlib/control/ControllerBase.h"
+
+

Go to the source code of this file.

+ + + + +

+Namespaces

namespace  bebop2
 
+
+ + + + diff --git a/docs/html/ControllerBase_8cpp_source.html b/docs/html/ControllerBase_8cpp_source.html new file mode 100644 index 0000000..08827d7 --- /dev/null +++ b/docs/html/ControllerBase_8cpp_source.html @@ -0,0 +1,295 @@ + + + + + + + +airlib: airlib/control/ControllerBase.cpp Source File + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
ControllerBase.cpp
+
+
+Go to the documentation of this file.
1//
+
2// Created by redwan on 12/15/22.
+
3//
+
4
+
5#include <numeric>
+
6#include <utility>
+ +
8
+
9namespace bebop2
+
10{
+
11
+
12 ControllerBase::ControllerBase(StateObserverPtr mGetState, ros::NodeHandle& nh) :
+
13 m_get_state(mGetState), m_nh(nh) {
+
14
+
15 ros::param::get("~dt", dt_);
+
16 ros::param::get("~goal_thres", m_goal_thres);
+
17
+
18 joystick_sub_ = m_nh.subscribe("/joy", 10, &bebop2::ControllerBase::joystick_callback, this)
+
19 drone_takeoff_pub_ = m_nh.advertise<std_msgs::Empty>("takeoff", 1);
+
20 drone_land_pub_ = m_nh.advertise<std_msgs::Empty>("land", 1);
+
21 cmd_vel_pub_ = m_nh.advertise<geometry_msgs::Twist>("cmd_vel", 1);
+
22 joystick_timer_ = m_nh.createTimer(ros::Duration(0.05), &bebop2::ControllerBase::joystick_timer_callback, this);
+
23 controller_timer_ = m_nh.createTimer(ros::Duration(dt_), &bebop2::ControllerBase::control_loop, this);
+
24 viz_ = std::make_unique<ControlViz>(m_nh);
+ +
26
+
27 }
+
28
+
29
+
30 void ControllerBase::joystick_callback(const sensor_msgs::Joy_<std::allocator<void>>::ConstPtr &msg) {
+
31
+
32 std::lock_guard<std::mutex> lk(m_mu);
+
33 auto it = std::find(msg->buttons.begin(), msg->buttons.end(), 1);
+
34 if(it != msg->buttons.end())
+
35 {
+
36 int index = std::distance(msg->buttons.begin(), it);
+
37 m_buttonState = static_cast<ButtonState>(index);
+
38
+
39 std_msgs::Empty empty;
+
40
+ +
42 {
+
43 drone_takeoff_pub_.publish(empty);
+
44 ROS_INFO("[Button] pressed = %d -> TAKE OFF", m_buttonState);
+ +
46 }
+
47
+
48 if(m_buttonState == LAND)
+
49 {
+
50 drone_land_pub_.publish(empty);
+
51 ROS_INFO("[Button] pressed = %d -> LAND", m_buttonState);
+
52 }
+
53
+
54
+
55 if(!setPoints_.empty())
+
56 {
+
57 auto pose = getStateVecToTransform(setPoints_);
+
58 switch (m_buttonState) {
+
59 case TAKEOFF: viz_->update(pose, GREEN); break;
+
60 case IDLE: viz_->update(pose, BLUE); break;
+
61 case ENGAGE: viz_->update(pose, YELLOW); break;
+
62 case CONTROL: viz_->update(pose, CYAN); break;
+
63 case LAND: viz_->update(pose, RED); break;
+
64 }
+
65 }
+
66
+
67 }
+
68 axes_values_.clear();
+
69 std::copy(msg->axes.begin(), msg->axes.end(), std::back_inserter(axes_values_));
+
70
+
71 }
+
72
+
73
+
74 void ControllerBase::joystick_timer_callback(const ros::TimerEvent &event) {
+
75 if(axes_values_.empty() || std::accumulate(axes_values_.begin(), axes_values_.end(), 0.0) == 0.0)
+
76 return;
+
77
+
78 auto filter = [&](float val){
+
79 float sign = val >= 0 ? 1 : -1;
+
80 return abs(val) > DEAD_ZONE ? sign * STEP_INCR : 0;
+
81 };
+
82
+
83 float dz = filter(axes_values_[Z_AXIS_INDEX]);
+
84 float dx = filter(axes_values_[X_AXIS_INDEX]);
+
85 float dy = filter(axes_values_[Y_AXIS_INDEX]);
+
86
+
87 // update_setpoint with (dx, dy, dz);
+
88 if(!setPoints_.empty())
+
89 { setPoints_[0] += dx;
+
90 setPoints_[1] += dy;
+
91 setPoints_[2] += dz;
+
92
+
93 auto pose = getStateVecToTransform(setPoints_);
+
94 switch (m_buttonState) {
+
95 case TAKEOFF: viz_->update(pose, GREEN); break;
+
96 case IDLE: viz_->update(pose, BLUE); break;
+
97 case ENGAGE: viz_->update(pose, YELLOW); break;
+
98 case CONTROL: viz_->update(pose, CYAN); break;
+
99 case LAND: viz_->update(pose, RED); break;
+
100 }
+
101 }
+
102
+
103 }
+
104
+
105
+
106
+
107
+
108
+
109 void ControllerBase::control_loop(const ros::TimerEvent &event) {
+
110 std::vector<double> state;
+
111 m_get_state->operator()(state);
+
112// ROS_INFO_STREAM("[ControllerBase] state size" << state.size());
+
113 if(state.empty())
+
114 return;
+
115
+
116 if(m_buttonState == ENGAGE)
+
117 {
+
118 // set setpoint at current position
+
119 setPoints_.clear();
+
120 std::copy(state.begin(), state.end(), std::back_inserter(setPoints_));
+
121
+
122 }
+
123 else if(m_buttonState == CONTROL)
+
124 {
+
125 if(goal_distance(state, setPoints_) > m_goal_thres)
+
126 {
+
127 // actively control position
+
128 std::vector<double>U(NUM_CONTROLS);
+
129 compute_control(state, setPoints_, U);
+
130 ROS_INFO("[PositionController] vx = %lf, vy = %lf, vz = %lf", U[0], U[1], U[2]);
+ +
132 }
+
133
+
134 }
+
135
+
136 // show drone
+
137 auto transform = getStateVecToTransform(state);
+
138 viz_->setDrone(transform);
+
139
+
140 }
+
141
+
142
+
143
+
144 void ControllerBase::publish_cmd_vel(const std::vector<double> &U) {
+
145
+
146 std::lock_guard<std::mutex> lk(m_mu);
+
147 assert(U.size() == 4 && "4 commands must be sent");
+
148 geometry_msgs::Twist msg;
+
149
+
150 msg.linear.x = U[0];
+
151 msg.linear.y = U[1];
+
152 msg.linear.z = U[2];
+
153 msg.angular.z = U[3];
+
154 cmd_vel_pub_.publish(msg);
+
155
+
156 }
+
157
+
158
+
159 double ControllerBase::goal_distance(const std::vector<double> &X, const std::vector<double> &setPoints) {
+
160 double error = 0;
+
161 for (int i = 0; i < X.size(); ++i) {
+
162 double e = X[i] - setPoints[i];
+
163 error += e * e;
+
164 }
+
165 return sqrt(error);
+
166 }
+
167
+
168
+
169
+
170 tf::Transform ControllerBase::getStateVecToTransform(const std::vector<double> &state) {
+
171 tf::Transform pose;
+
172 tf::Quaternion q;
+
173 q.setRPY(0, 0, state[3]);
+
174 pose.setOrigin(tf::Vector3(state[0], state[1], state[2]));
+
175 pose.setRotation(q);
+
176 return pose;
+
177 }
+
178
+
179
+
180}
+ +
virtual void compute_control(const std::vector< double > &X, const std::vector< double > &setPoints, std::vector< double > &control)=0
+
double dt_
Sample Time.
+
double m_goal_thres
Goal region threshold.
+
std::mutex m_mu
Locks some functions for safe operations.
+
enum bebop2::ControllerBase::ButtonState m_buttonState
+
void publish_cmd_vel(const std::vector< double > &U)
This function sets the linear positon of the drone to all 3 linear axes and to angular z-axis and pub...
+
ButtonState
Applications applied to control the state of the robot using Joystick controller.
+
@ TAKEOFF
Drone will takeoff from the ground.
+
@ IDLE
Setpoint can be freely moved with joystick. Sphere color blue.
+
@ LAND
Drone will land.
+
@ CONTROL
Start PID controller for the current setpoint. Sphere color cyan.
+
@ ENGAGE
Set current location as a set point (for hover). Sphere color yellow.
+
double goal_distance(const std::vector< double > &X, const std::vector< double > &setPoints)
This function calculates the distance between the setpoint of the drone and the current state positio...
+
ros::NodeHandle m_nh
This ROS Handle attribute is used to create various publishers and subscribers which also deals with ...
+
ControllerBase(StateObserverPtr mGetState, ros::NodeHandle &nh)
Subscribes to sensor_msgs/joy which reports the state of a joystick's axes and buttons....
+
StateObserverPtr m_get_state
This attribute gives the state of the robot.
+ +
const int X_AXIS_INDEX
+
const float STEP_INCR
+
@ BLUE
Definition: ControlViz.h:18
+
@ CYAN
Definition: ControlViz.h:19
+
@ YELLOW
Definition: ControlViz.h:20
+
@ GREEN
Definition: ControlViz.h:17
+ +
const float DEAD_ZONE
+
const int Z_AXIS_INDEX
+
std::shared_ptr< StateObserver > StateObserverPtr
Definition: StateObserver.h:16
+
const int Y_AXIS_INDEX
+
const int NUM_CONTROLS
+
+ + + + diff --git a/docs/html/ControllerBase_8h.html b/docs/html/ControllerBase_8h.html new file mode 100644 index 0000000..6118c82 --- /dev/null +++ b/docs/html/ControllerBase_8h.html @@ -0,0 +1,129 @@ + + + + + + + +airlib: include/airlib/control/ControllerBase.h File Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Classes | +Namespaces | +Variables
+
ControllerBase.h File Reference
+
+
+
#include <ros/ros.h>
+#include "sensor_msgs/Joy.h"
+#include "std_msgs/Empty.h"
+#include <mutex>
+#include <memory>
+#include <geometry_msgs/Twist.h>
+#include <cassert>
+#include <functional>
+#include <algorithm>
+#include "airlib/control/ControlViz.h"
+#include "airlib/localization/StateObserver.h"
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  bebop2::ControllerBase
 Responsible to control the position, state and rotation of the drone and also provides the code to make the robot hover. It publishes the takeoff, landing commands along with the current position of the drone and the state of the axes and buttons of the joystick controller. It also updates the state of the robot in RVIZ which is used for visaulation. More...
 
+ + + +

+Namespaces

namespace  bebop2
 
+ + + + + + + + + + + + + +

+Variables

const float bebop2::STEP_INCR = 0.02
 
const float bebop2::DEAD_ZONE = 0.3
 
const int bebop2::X_AXIS_INDEX = 3
 
const int bebop2::Y_AXIS_INDEX = 2
 
const int bebop2::Z_AXIS_INDEX = 5
 
const int bebop2::NUM_CONTROLS = 4
 
+
+ + + + diff --git a/docs/html/ControllerBase_8h_source.html b/docs/html/ControllerBase_8h_source.html new file mode 100644 index 0000000..44b5079 --- /dev/null +++ b/docs/html/ControllerBase_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +airlib: include/airlib/control/ControllerBase.h Source File + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
ControllerBase.h
+
+
+Go to the documentation of this file.
1//
+
2// Created by redwan on 12/15/22.
+
3//
+
16#ifndef airlib_CONTROLLERBASE_H
+
17#define airlib_CONTROLLERBASE_H
+
18#include <ros/ros.h>
+
19#include "sensor_msgs/Joy.h"
+
20#include "std_msgs/Empty.h"
+
21#include <mutex>
+
22#include <memory>
+
23#include <geometry_msgs/Twist.h>
+
24#include <cassert>
+
25#include <functional>
+
26#include <algorithm>
+ +
28
+ +
30
+
31
+
32namespace bebop2
+
33{
+
34 const float STEP_INCR = 0.02;
+
35 const float DEAD_ZONE = 0.3;
+
36 const int X_AXIS_INDEX = 3;
+
37 const int Y_AXIS_INDEX = 2;
+
38 const int Z_AXIS_INDEX = 5;
+
39 const int NUM_CONTROLS = 4;
+
40
+
41
+
42
+ +
48 public:
+
56 explicit ControllerBase(StateObserverPtr mGetState, ros::NodeHandle& nh);
+
57
+
58
+
59 private:
+
61 std::vector<float>axes_values_;
+
64 ros::Timer joystick_timer_;
+
66 ros::Timer controller_timer_;
+
68 std::unique_ptr<ControlViz> viz_;
+
70 ros::Subscriber joystick_sub_;
+
72 ros::Publisher drone_takeoff_pub_, drone_land_pub_,cmd_vel_pub_;
+
73 std::vector<double> setPoints_;
+
74 protected:
+
76 ros::NodeHandle m_nh;
+
78 std::mutex m_mu;
+ +
82 IDLE = 0,
+ + + +
90 CONTROL
+ +
92
+ +
95
+
96 // controller parameters.
+
98 double dt_;
+ +
101
+
102
+
103
+
104 private:
+
109 void joystick_callback(const sensor_msgs::Joy::ConstPtr& msg);
+
114 void joystick_timer_callback(const ros::TimerEvent& event);
+
116 void control_loop(const ros::TimerEvent& event);
+
120 tf::Transform getStateVecToTransform(const std::vector<double>& state);
+
121
+
122 protected:
+
125 void publish_cmd_vel(const std::vector<double>&U);
+
130 double goal_distance(const std::vector<double>& X, const std::vector<double>& setPoints);
+
131 virtual void compute_control(const std::vector<double>& X, const std::vector<double>& setPoints, std::vector<double>& control) = 0;
+
132
+
133 };
+
134}
+
135
+
136
+
137#endif //airlib_CONTROLLERBASE_H
+ + +
Responsible to control the position, state and rotation of the drone and also provides the code to ma...
+
virtual void compute_control(const std::vector< double > &X, const std::vector< double > &setPoints, std::vector< double > &control)=0
+
double dt_
Sample Time.
+
double m_goal_thres
Goal region threshold.
+
std::mutex m_mu
Locks some functions for safe operations.
+
enum bebop2::ControllerBase::ButtonState m_buttonState
+
void publish_cmd_vel(const std::vector< double > &U)
This function sets the linear positon of the drone to all 3 linear axes and to angular z-axis and pub...
+
ButtonState
Applications applied to control the state of the robot using Joystick controller.
+
@ TAKEOFF
Drone will takeoff from the ground.
+
@ IDLE
Setpoint can be freely moved with joystick. Sphere color blue.
+
@ LAND
Drone will land.
+
@ CONTROL
Start PID controller for the current setpoint. Sphere color cyan.
+
@ ENGAGE
Set current location as a set point (for hover). Sphere color yellow.
+
double goal_distance(const std::vector< double > &X, const std::vector< double > &setPoints)
This function calculates the distance between the setpoint of the drone and the current state positio...
+
ros::NodeHandle m_nh
This ROS Handle attribute is used to create various publishers and subscribers which also deals with ...
+
StateObserverPtr m_get_state
This attribute gives the state of the robot.
+ +
const int X_AXIS_INDEX
+
const float STEP_INCR
+
const float DEAD_ZONE
+
const int Z_AXIS_INDEX
+
std::shared_ptr< StateObserver > StateObserverPtr
Definition: StateObserver.h:16
+
const int Y_AXIS_INDEX
+
const int NUM_CONTROLS
+
+ + + + diff --git a/docs/html/DummyState_8cpp.html b/docs/html/DummyState_8cpp.html new file mode 100644 index 0000000..4757600 --- /dev/null +++ b/docs/html/DummyState_8cpp.html @@ -0,0 +1,96 @@ + + + + + + + +airlib: airlib/localization/Sensors/DummyState.cpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Namespaces
+
DummyState.cpp File Reference
+
+
+
#include "airlib/localization/Sensors/DummyState.h"
+
+

Go to the source code of this file.

+ + + + +

+Namespaces

namespace  bebop2
 
+
+ + + + diff --git a/docs/html/DummyState_8cpp_source.html b/docs/html/DummyState_8cpp_source.html new file mode 100644 index 0000000..b31be44 --- /dev/null +++ b/docs/html/DummyState_8cpp_source.html @@ -0,0 +1,153 @@ + + + + + + + +airlib: airlib/localization/Sensors/DummyState.cpp Source File + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
DummyState.cpp
+
+
+Go to the documentation of this file.
+
2
+
3
+
4namespace bebop2
+
5{
+
6 DummyState::DummyState(ros::NodeHandle& nh, bool noisy_reading):nh_(nh), noisy_reading_(noisy_reading)
+
7 {
+
8 states_.resize(STATE_DIM);
+
9 std::fill(states_.begin(), states_.end(), 0.0);
+
10
+
11 sub_takeoff_ = nh_.subscribe("takeoff", 10, &DummyState::takeoff_callback, this);
+
12 sub_land_ = nh_.subscribe("land", 10, &DummyState::land_callback, this);
+
13 sub_cmd_vel_ = nh_.subscribe("cmd_vel", 1, &DummyState::cmd_vel_callback, this);
+
14 }
+
15
+
16 void DummyState::operator()(std::vector<double>& state)
+
17 {
+
18 state.clear();
+
19 std::copy(states_.begin(), states_.end(), std::back_inserter(state));
+
20
+
21 // don't add noise if noisy_reading is not enabled
+
22 if(!noisy_reading_)
+
23 return;
+
24
+
25 // add gaussian white noise for simulating a realistic measurement
+
26 std::normal_distribution<double> disturbance(0.0, sqrt(NOISE));
+
27 //focus on x, y coordinates only. Later tune it for all 4 axes
+
28 for(std::size_t i=0; i<state.size() - 2; ++i)
+
29 state[i] += disturbance(rd_);
+
30
+
31 }
+
32
+ +
34 {
+
35 return states_.empty();
+
36 }
+
37
+
38 void DummyState::takeoff_callback(const std_msgs::Empty::ConstPtr& msg)
+
39 {
+
40 states_[2] = 1.0;
+
41 ROS_INFO("[DummyState] takeoff message received");
+
42 }
+
43 void DummyState::land_callback(const std_msgs::Empty::ConstPtr& msg)
+
44 {
+
45 states_[2] = 0.0;
+
46 ROS_INFO("[DummyState] land message received");
+
47 }
+
48 void DummyState::cmd_vel_callback(const geometry_msgs::Twist::ConstPtr& msg)
+
49 {
+
50 states_[0] += DT * msg->linear.x;
+
51 // parrot bebop2 moves left for (+) linear.y and vice versa
+
52 states_[1] -= DT * msg->linear.y;
+
53 states_[2] += DT * msg->linear.z;
+
54 states_[3] += DT * msg->angular.z;
+
55
+
56 ROS_INFO("[DummyState] state = (%lf, %lf, %lf, %lf)", states_[0], states_[1], states_[2], states_[3]);
+
57 }
+
58
+
59} // namespace bebop2
+
60
+ +
void cmd_vel_callback(const geometry_msgs::Twist::ConstPtr &msg)
Joystic command to move the bebop2.
Definition: DummyState.cpp:48
+
void land_callback(const std_msgs::Empty::ConstPtr &msg)
Joystic command to land the bebop2.
Definition: DummyState.cpp:43
+
void operator()(std::vector< double > &state)
Populates the requested state vector.
Definition: DummyState.cpp:16
+
DummyState(ros::NodeHandle &nh, bool noisy_reading)
Construct a new Dummy State object To simulate desired behavior from a sensor so that we can develop ...
Definition: DummyState.cpp:6
+
void takeoff_callback(const std_msgs::Empty::ConstPtr &msg)
Joystic command to takeoff the bebop2.
Definition: DummyState.cpp:38
+
bool empty()
This is an interface to check whether internal state vector is empty or not so that we can safely rea...
Definition: DummyState.cpp:33
+ +
+ + + + diff --git a/docs/html/DummyState_8h.html b/docs/html/DummyState_8h.html new file mode 100644 index 0000000..2700aef --- /dev/null +++ b/docs/html/DummyState_8h.html @@ -0,0 +1,110 @@ + + + + + + + +airlib: include/airlib/localization/Sensors/DummyState.h File Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Classes | +Namespaces
+
DummyState.h File Reference
+
+
+
#include <iostream>
+#include <vector>
+#include <random>
+#include <math.h>
+#include <ros/ros.h>
+#include <std_msgs/Empty.h>
+#include <geometry_msgs/Twist.h>
+#include "SensorBase.h"
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  bebop2::DummyState
 Dummy state creates a state space repersentation for quadrotor. More...
 
+ + + +

+Namespaces

namespace  bebop2
 
+
+ + + + diff --git a/docs/html/DummyState_8h_source.html b/docs/html/DummyState_8h_source.html new file mode 100644 index 0000000..90fc1f4 --- /dev/null +++ b/docs/html/DummyState_8h_source.html @@ -0,0 +1,132 @@ + + + + + + + +airlib: include/airlib/localization/Sensors/DummyState.h Source File + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
DummyState.h
+
+
+Go to the documentation of this file.
1#pragma once
+
2
+
3#include <iostream>
+
4#include <vector>
+
5#include <random>
+
6#include <math.h>
+
7#include <ros/ros.h>
+
8#include <std_msgs/Empty.h>
+
9#include <geometry_msgs/Twist.h>
+
10#include "SensorBase.h"
+
11
+
12
+
13namespace bebop2{
+
26 class DummyState: public SensorBase{
+
27
+
28 public:
+
35 DummyState(ros::NodeHandle& nh, bool noisy_reading);
+
39 void operator()(std::vector<double>& state);
+
40 bool empty();
+
41
+
42 private:
+
43 ros::NodeHandle nh_;
+
45 std::vector<double> states_;
+
47 ros::Subscriber sub_takeoff_, sub_land_, sub_cmd_vel_;
+
49 std::random_device rd_;
+
51 bool noisy_reading_;
+
52
+
53 const size_t STATE_DIM = 4;
+
55 const double DT = 0.03; // 30 Hz
+
57 const double NOISE = 0.2;
+
58 protected:
+
63 void takeoff_callback(const std_msgs::Empty::ConstPtr& msg);
+
69 void land_callback(const std_msgs::Empty::ConstPtr& msg);
+
75 void cmd_vel_callback(const geometry_msgs::Twist::ConstPtr& msg);
+
76
+
77 };
+
78}
+
79
+ +
This class provides a conection to acquire internal state vector.
Definition: SensorBase.h:23
+
Dummy state creates a state space repersentation for quadrotor.
Definition: DummyState.h:26
+
void cmd_vel_callback(const geometry_msgs::Twist::ConstPtr &msg)
Joystic command to move the bebop2.
Definition: DummyState.cpp:48
+
void land_callback(const std_msgs::Empty::ConstPtr &msg)
Joystic command to land the bebop2.
Definition: DummyState.cpp:43
+
void operator()(std::vector< double > &state)
Populates the requested state vector.
Definition: DummyState.cpp:16
+
void takeoff_callback(const std_msgs::Empty::ConstPtr &msg)
Joystic command to takeoff the bebop2.
Definition: DummyState.cpp:38
+
bool empty()
This is an interface to check whether internal state vector is empty or not so that we can safely rea...
Definition: DummyState.cpp:33
+ +
+ + + + diff --git a/docs/html/ExtendedKalmanFilter_8cpp.html b/docs/html/ExtendedKalmanFilter_8cpp.html new file mode 100644 index 0000000..e130420 --- /dev/null +++ b/docs/html/ExtendedKalmanFilter_8cpp.html @@ -0,0 +1,88 @@ + + + + + + + +airlib: airlib/localization/Filters/ekf/ExtendedKalmanFilter.cpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
ExtendedKalmanFilter.cpp File Reference
+
+
+
#include "airlib/localization/Filters/ExtendedKalmanFilter.h"
+
+

Go to the source code of this file.

+
+ + + + diff --git a/docs/html/ExtendedKalmanFilter_8cpp_source.html b/docs/html/ExtendedKalmanFilter_8cpp_source.html new file mode 100644 index 0000000..8c506dc --- /dev/null +++ b/docs/html/ExtendedKalmanFilter_8cpp_source.html @@ -0,0 +1,214 @@ + + + + + + + +airlib: airlib/localization/Filters/ekf/ExtendedKalmanFilter.cpp Source File + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
ExtendedKalmanFilter.cpp
+
+
+Go to the documentation of this file.
1//
+
2// Created by Redwan Newaz on 12/29/22.
+
3//
+
4
+ +
6
+
7using namespace bebop2;
+
8
+
9ExtendedKalmanFilter::ExtendedKalmanFilter(const std::vector<double>& sigma_pos, double dt, int state_dim)
+
10:DT(dt), STATE_DIM(state_dim), CONTROL_DIM(STATE_DIM)
+
11{
+
12
+
13 Q_.resize(STATE_DIM, STATE_DIM);
+
14 R_.resize(STATE_DIM, STATE_DIM);
+
15
+
16 for (int i = 0; i < STATE_DIM; ++i) {
+
17 Q_(i, i) = sigma_pos[i];
+
18 R_(i, i) = 1;
+
19 }
+
20
+
21 X_.resize(STATE_DIM);
+
22 xEst_.resize(STATE_DIM);
+
23 PEst_.resize(STATE_DIM, STATE_DIM);
+
24 PEst_.setIdentity();
+
25
+
26
+
27}
+
28
+
29void ExtendedKalmanFilter::operator()(std::vector<double> &state) {
+
30
+
31 if(!state.empty())
+
32 state.clear();
+
33
+
34 std::copy(X_.begin(), X_.end(), std::back_inserter(state));
+
35
+
36}
+
37
+
38
+
39Eigen::VectorXd ExtendedKalmanFilter::motion_model(const Eigen::VectorXd &x, const Eigen::VectorXd &u) {
+
40 Eigen::MatrixXd F_;
+
41 F_.resize(STATE_DIM, STATE_DIM);
+
42 F_<<1.0, 0, 0, 0,
+
43 0, 1.0, 0, 0,
+
44 0, 0, 1.0, 0,
+
45 0, 0, 0, 1.0;
+
46
+
47 Eigen::MatrixXd B_;
+
48 B_.resize(STATE_DIM, STATE_DIM);
+
49 B_<< DT, 0, 0, 0,
+
50 DT, 0, 0, 0,
+
51 DT, 0, 0, 0,
+
52 DT, 0, 0, 0;
+
53
+
54 return F_ * x + B_ * u;
+
55}
+
56
+
57Eigen::MatrixXd ExtendedKalmanFilter::jacobF(const Eigen::VectorXd &x, const Eigen::VectorXd &u) {
+
58 Eigen::MatrixXd jF_ = Eigen::Matrix4d::Identity();
+
59 return jF_;
+
60}
+
61
+
62Eigen::MatrixXd ExtendedKalmanFilter::jacobH() const {
+
63 //# Jacobian of Observation Model
+
64 Eigen::Matrix4d jH;
+
65 jH.setIdentity();
+
66 return jH;
+
67}
+
68
+
69Eigen::VectorXd ExtendedKalmanFilter::observation_model(const Eigen::VectorXd &x) {
+
70 Eigen::Matrix4d H_;
+
71 H_.setIdentity();
+
72 return H_ * x;
+
73}
+
74
+
75void ExtendedKalmanFilter::internal_update(const Eigen::VectorXd &z, const Eigen::VectorXd &u) {
+
76 Eigen::VectorXd xPred = motion_model(xEst_, u_);
+
77 Eigen::MatrixXd jF = jacobF(xPred, u_);
+
78 Eigen::MatrixXd PPred = jF * PEst_ * jF.transpose() + Q_;
+
79
+
80 Eigen::MatrixXd jH = jacobH();
+
81 Eigen::VectorXd zPred = observation_model(xPred);
+
82 Eigen::VectorXd y = z - zPred;
+
83 Eigen::MatrixXd S = jH * PPred * jH.transpose() + R_;
+
84 Eigen::MatrixXd K = PPred * jH.transpose() * S.inverse();
+
85 xEst_ = xPred + K * y;
+
86 PEst_ = (Eigen::Matrix4d::Identity() - K * jH) * PPred;
+
87}
+
88
+
89void ExtendedKalmanFilter::update_cmd(const geometry_msgs::Twist::ConstPtr& cmd) {
+
90 u_.resize(CONTROL_DIM);
+
91 u_ << cmd->linear.x,
+
92 cmd->linear.y,
+
93 cmd->linear.z,
+
94 cmd->angular.z;
+
95}
+
96
+
97void ExtendedKalmanFilter::update(const std::vector<double>& obs, std::vector<double>& result)
+
98{
+
99 Eigen::VectorXd z(obs.size());
+
100 for (int i = 0; i < obs.size(); ++i) {
+
101 z(i) = obs[i];
+
102 }
+
103 internal_update(z, u_);
+
104 for (int j = 0; j < STATE_DIM; ++j) {
+
105 result[j] = xEst_(j);
+
106 }
+
107}
+
108
+
109void ExtendedKalmanFilter::init(const std::vector<double> &X0) {
+
110 for (int j = 0; j < STATE_DIM; ++j) {
+
111 xEst_(j) = X_[j] = X0[j];
+
112 }
+
113}
+ +
std::vector< double > X_
Estimated state of the system.
Definition: FilterBase.h:45
+
Eigen::MatrixXd jacobF(const Eigen::VectorXd &x, const Eigen::VectorXd &u)
Calculates the Jacobian matrix of the motion model.
+
void update(const std::vector< double > &obs, std::vector< double > &result) override
In this method, the input obs is converted from a std::vector to an Eigen vector z and then passed to...
+
Eigen::VectorXd observation_model(const Eigen::VectorXd &x)
Calculates the predicted measurement values.
+
void operator()(std::vector< double > &state)
Populates it with the estimated state of the system.
+ +
void init(const std::vector< double > &X0) override
Makes the current estimate of the state of the system start out being the same as the true state.
+
void internal_update(const Eigen::VectorXd &z, const Eigen::VectorXd &u)
The internal update step is used to update the linearized measurement model, which is used to calcula...
+
Eigen::MatrixXd jacobH() const
Checks the linearity between the state and the measured variables.
+
void update_cmd(const geometry_msgs::Twist::ConstPtr &cmd)
Updates the command velocity of the drone by changing the linear x,y,z and angular z values.
+
ExtendedKalmanFilter(const std::vector< double > &sigma_pos, double dt, int state_dim)
+ + +
Eigen::VectorXd motion_model(const Eigen::VectorXd &x, const Eigen::VectorXd &u)
+ +
+ + + + diff --git a/docs/html/ExtendedKalmanFilter_8h.html b/docs/html/ExtendedKalmanFilter_8h.html new file mode 100644 index 0000000..a429a26 --- /dev/null +++ b/docs/html/ExtendedKalmanFilter_8h.html @@ -0,0 +1,107 @@ + + + + + + + +airlib: include/airlib/localization/Filters/ExtendedKalmanFilter.h File Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Classes | +Namespaces
+
ExtendedKalmanFilter.h File Reference
+
+
+
#include <iostream>
+#include <Eigen/Dense>
+#include <vector>
+#include "geometry_msgs/Twist.h"
+#include <airlib/localization/Filters/FilterBase.h>
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  bebop2::ExtendedKalmanFilter
 The extended Kalman Filter uses an algorithm to estimate the state of the system like velocity and position of the drone by using past and possible noisy observations and current and possibly noisy measurements of that system. More...
 
+ + + +

+Namespaces

namespace  bebop2
 
+
+ + + + diff --git a/docs/html/ExtendedKalmanFilter_8h_source.html b/docs/html/ExtendedKalmanFilter_8h_source.html new file mode 100644 index 0000000..60cdcec --- /dev/null +++ b/docs/html/ExtendedKalmanFilter_8h_source.html @@ -0,0 +1,148 @@ + + + + + + + +airlib: include/airlib/localization/Filters/ExtendedKalmanFilter.h Source File + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
ExtendedKalmanFilter.h
+
+
+Go to the documentation of this file.
1//
+
2// Created by Redwan Newaz on 12/29/22.
+
3//
+
4
+
5#ifndef PARTICLEFILTER_EXTENDED_KALMAN_FILTER_H
+
6#define PARTICLEFILTER_EXTENDED_KALMAN_FILTER_H
+
7
+
8#include <iostream>
+
9#include <Eigen/Dense>
+
10#include <vector>
+
11#include "geometry_msgs/Twist.h"
+ +
13
+
14namespace bebop2{
+ +
22 public:
+
23 ExtendedKalmanFilter(const std::vector<double>& sigma_pos, double dt, int state_dim);
+
24 void init(const std::vector<double>& X0) override;
+
27 void operator()(std::vector<double>& state);
+
30 void update_cmd(const geometry_msgs::Twist::ConstPtr& cmd);
+
35 void update(const std::vector<double>& obs, std::vector<double>& result) override;
+
36
+
37;
+
38
+
39
+
40 private:
+
41 Eigen::VectorXd xEst_;
+
42 Eigen::MatrixXd PEst_;
+
43 Eigen::MatrixXd Q_;
+
44 Eigen::MatrixXd R_;
+
45 Eigen::VectorXd u_;
+
46
+
47 protected:
+
48 // x_{t+1} = F@x_{t}+B@u_t
+
49 Eigen::VectorXd motion_model(const Eigen::VectorXd& x, const Eigen::VectorXd& u);
+
54 Eigen::MatrixXd jacobF(const Eigen::VectorXd& x, const Eigen::VectorXd& u);
+
58 Eigen::VectorXd observation_model(const Eigen::VectorXd& x);
+
61 Eigen::MatrixXd jacobH() const;
+
67 void internal_update(const Eigen::VectorXd& z, const Eigen::VectorXd& u);
+ +
69
+
70
+
71 };
+
72}
+
73
+
74
+
75#endif //PARTICLEFILTER_EXTENDED_KALMAN_FILTER_H
+ +
The FilterBase class enables various other classes to share the FilterPtr. This class allows other cl...
Definition: FilterBase.h:17
+
The extended Kalman Filter uses an algorithm to estimate the state of the system like velocity and po...
+
Eigen::MatrixXd jacobF(const Eigen::VectorXd &x, const Eigen::VectorXd &u)
Calculates the Jacobian matrix of the motion model.
+
void update(const std::vector< double > &obs, std::vector< double > &result) override
In this method, the input obs is converted from a std::vector to an Eigen vector z and then passed to...
+
Eigen::VectorXd observation_model(const Eigen::VectorXd &x)
Calculates the predicted measurement values.
+
void operator()(std::vector< double > &state)
Populates it with the estimated state of the system.
+ +
void init(const std::vector< double > &X0) override
Makes the current estimate of the state of the system start out being the same as the true state.
+
void internal_update(const Eigen::VectorXd &z, const Eigen::VectorXd &u)
The internal update step is used to update the linearized measurement model, which is used to calcula...
+
Eigen::MatrixXd jacobH() const
Checks the linearity between the state and the measured variables.
+
void update_cmd(const geometry_msgs::Twist::ConstPtr &cmd)
Updates the command velocity of the drone by changing the linear x,y,z and angular z values.
+ + +
Eigen::VectorXd motion_model(const Eigen::VectorXd &x, const Eigen::VectorXd &u)
+ +
+ + + + diff --git a/docs/html/FilterBase_8h.html b/docs/html/FilterBase_8h.html new file mode 100644 index 0000000..9302566 --- /dev/null +++ b/docs/html/FilterBase_8h.html @@ -0,0 +1,122 @@ + + + + + + + +airlib: include/airlib/localization/Filters/FilterBase.h File Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Classes | +Typedefs
+
FilterBase.h File Reference
+
+
+
#include <iostream>
+#include <memory>
+#include <vector>
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  FilterBase
 The FilterBase class enables various other classes to share the FilterPtr. This class allows other classes like ComplementaryFilter.h, ExtendedKalmanFilter.h,Particle.h to use methods like init(), update() to store the estimated state and update the state. More...
 
+ + + +

+Typedefs

typedef std::shared_ptr< FilterBaseFilterPtr
 
+

Typedef Documentation

+ +

◆ FilterPtr

+ +
+
+ + + + +
typedef std::shared_ptr<FilterBase> FilterPtr
+
+ +

Definition at line 13 of file FilterBase.h.

+ +
+
+
+ + + + diff --git a/docs/html/FilterBase_8h_source.html b/docs/html/FilterBase_8h_source.html new file mode 100644 index 0000000..1ae78dd --- /dev/null +++ b/docs/html/FilterBase_8h_source.html @@ -0,0 +1,130 @@ + + + + + + + +airlib: include/airlib/localization/Filters/FilterBase.h Source File + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
FilterBase.h
+
+
+Go to the documentation of this file.
1//
+
2// Created by redwan on 1/14/23.
+
3//
+
4
+
5#ifndef BEBOP2_CONTROLLER_FILTERBASE_H
+
6#define BEBOP2_CONTROLLER_FILTERBASE_H
+
7#include <iostream>
+
8#include <memory>
+
9#include <vector>
+
10
+
11class FilterBase;
+
12
+
13typedef std::shared_ptr<FilterBase> FilterPtr;
+
16class FilterBase: std::enable_shared_from_this<FilterBase>
+
17{
+
18public:
+ +
21 {
+
22
+
23 }
+
25 virtual ~FilterBase()
+
26 {
+
27
+
28 }
+ +
32 {
+
33 return shared_from_this();
+
34 }
+
35
+
38 virtual void init(const std::vector<double>& X0) = 0;
+
42 virtual void update(const std::vector<double>& obs, std::vector<double>& result) = 0;
+
43protected:
+
45 std::vector<double> X_;
+
46
+
47};
+
48
+
49#endif //BEBOP2_CONTROLLER_FILTERBASE_H
+
std::shared_ptr< FilterBase > FilterPtr
Definition: FilterBase.h:13
+
The FilterBase class enables various other classes to share the FilterPtr. This class allows other cl...
Definition: FilterBase.h:17
+
virtual void update(const std::vector< double > &obs, std::vector< double > &result)=0
Updated state is calculated and stored.
+
virtual void init(const std::vector< double > &X0)=0
Makes the current estimate of the state of the system start out being the same as the true state.
+
virtual ~FilterBase()
Deconstructor.
Definition: FilterBase.h:25
+
FilterPtr getPtr()
systematic way to share FilterPtr to control class
Definition: FilterBase.h:31
+
FilterBase()
Constructor.
Definition: FilterBase.h:20
+
std::vector< double > X_
Estimated state of the system.
Definition: FilterBase.h:45
+
+ + + + diff --git a/docs/html/LQR_8cpp.html b/docs/html/LQR_8cpp.html new file mode 100644 index 0000000..0daeb95 --- /dev/null +++ b/docs/html/LQR_8cpp.html @@ -0,0 +1,96 @@ + + + + + + + +airlib: airlib/control/LQR/LQR.cpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Namespaces
+
LQR.cpp File Reference
+
+
+
#include "LQR.h"
+
+

Go to the source code of this file.

+ + + + +

+Namespaces

namespace  bebop2
 
+
+ + + + diff --git a/docs/html/LQR_8cpp_source.html b/docs/html/LQR_8cpp_source.html new file mode 100644 index 0000000..167f6d0 --- /dev/null +++ b/docs/html/LQR_8cpp_source.html @@ -0,0 +1,142 @@ + + + + + + + +airlib: airlib/control/LQR/LQR.cpp Source File + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
LQR.cpp
+
+
+Go to the documentation of this file.
1//
+
2// Created by redwan on 12/15/22.
+
3//
+
4
+
5#include "LQR.h"
+
6
+
7
+
8namespace bebop2 {
+
9 bool LQR::solveDARE(const Eigen::MatrixXd &A, const Eigen::MatrixXd &B, const Eigen::MatrixXd &Q,
+
10 const Eigen::MatrixXd &R, Eigen::MatrixXd *X) const {
+
11 // borrowed from https://github.com/wcaarls/grl/blob/master/addons/lqr/src/lqr.cpp
+
12
+
13 Eigen::MatrixXd At = A.transpose(), Bt = B.transpose();
+
14 *X = Q;
+
15
+
16 double d = EPS;
+
17 for (size_t ii=0; ii < MAX_ITERATION && d >= EPS; ++ii)
+
18 {
+
19 Eigen::MatrixXd Xp = *X;
+
20
+
21 *X = Q + At*(*X)*A - At*(*X)*B*(Bt*(*X)*B+R).inverse()*Bt*(*X)*A;
+
22 d = (*X - Xp).array().abs().sum();
+
23 }
+
24
+
25 return d >= EPS;
+
26 }
+
27
+
28 bool LQR::solve() {
+
29 Eigen::MatrixXd X;
+
30
+
31 if (!solveDARE(A, B, Q, R, &X))
+
32 {
+
33 WARNING("Could not solve DARE: error ");
+
34 return false;
+
35 }
+
36 DEBUG(X);
+
37 // Compute feedback gain matrix
+
38 Eigen::MatrixXd K = (B.transpose()* X * B + R).inverse()*(B.transpose() * X * A);
+
39
+
40// Eigen::MatrixXd U = -K * ERROR;
+
41 return true;
+
42 }
+
43
+ +
45 dt_ = 0.03;
+
46 A = Eigen::Matrix4d::Identity();
+
47 B = dt_ * Eigen::Vector4d::Identity();
+
48 Q = Eigen::Matrix4d::Identity();
+
49 R = Eigen::Matrix4d::Identity();
+
50 }
+
51} // bebop2
+ +
#define DEBUG(x)
Definition: LQR.h:12
+
#define EPS
Definition: LQR.h:9
+
#define WARNING(x)
Definition: LQR.h:11
+
LQR()
A defauld constructor for LQR.
Definition: LQR.cpp:44
+ +
+ + + + diff --git a/docs/html/LQR_8h.html b/docs/html/LQR_8h.html new file mode 100644 index 0000000..cf2bb89 --- /dev/null +++ b/docs/html/LQR_8h.html @@ -0,0 +1,189 @@ + + + + + + + +airlib: airlib/control/LQR/LQR.h File Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Classes | +Namespaces | +Macros
+
LQR.h File Reference
+
+
+
#include <iostream>
+#include <Eigen/Dense>
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  bebop2::LQR
 The LQR is an optimal control regulator that better tracks a reference trajectory. More...
 
+ + + +

+Namespaces

namespace  bebop2
 
+ + + + + + + + + +

+Macros

#define EPS   0.001
 
#define MAX_ITERATION   1000
 
#define WARNING(x)   std::cerr << x << std::endl
 
#define DEBUG(x)   std::cout << x << std::endl
 
+

Macro Definition Documentation

+ +

◆ DEBUG

+ +
+
+ + + + + + + + +
#define DEBUG( x)   std::cout << x << std::endl
+
+ +

Definition at line 12 of file LQR.h.

+ +
+
+ +

◆ EPS

+ +
+
+ + + + +
#define EPS   0.001
+
+ +

Definition at line 9 of file LQR.h.

+ +
+
+ +

◆ MAX_ITERATION

+ +
+
+ + + + +
#define MAX_ITERATION   1000
+
+ +

Definition at line 10 of file LQR.h.

+ +
+
+ +

◆ WARNING

+ +
+
+ + + + + + + + +
#define WARNING( x)   std::cerr << x << std::endl
+
+ +

Definition at line 11 of file LQR.h.

+ +
+
+
+ + + + diff --git a/docs/html/LQR_8h_source.html b/docs/html/LQR_8h_source.html new file mode 100644 index 0000000..69667b8 --- /dev/null +++ b/docs/html/LQR_8h_source.html @@ -0,0 +1,116 @@ + + + + + + + +airlib: airlib/control/LQR/LQR.h Source File + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
LQR.h
+
+
+Go to the documentation of this file.
1//
+
2// Created by redwan on 12/15/22.
+
3//
+
4
+
5#ifndef BEBOP2_CONTROLLER_LQR_H
+
6#define BEBOP2_CONTROLLER_LQR_H
+
7#include <iostream>
+
8#include <Eigen/Dense>
+
9#define EPS 0.001
+
10#define MAX_ITERATION 1000
+
11#define WARNING(x) std::cerr << x << std::endl
+
12#define DEBUG(x) std::cout << x << std::endl
+
13
+
14namespace bebop2 {
+
22 class LQR {
+
23 public:
+
25 LQR();
+
26
+
27 private:
+
28 bool solve();
+
29 bool solveDARE(const Eigen::MatrixXd &A, const Eigen::MatrixXd &B, const Eigen::MatrixXd &Q, const Eigen::MatrixXd &R, Eigen::MatrixXd *X) const;
+
30 Eigen::MatrixXd A, B, Q, R;
+
31 double dt_;
+
32 };
+
33
+
34} // bebop2
+
35
+
36#endif //BEBOP2_CONTROLLER_LQR_H
+
The LQR is an optimal control regulator that better tracks a reference trajectory.
Definition: LQR.h:22
+
LQR()
A defauld constructor for LQR.
Definition: LQR.cpp:44
+ +
+ + + + diff --git a/docs/html/LoggerCSV_8h.html b/docs/html/LoggerCSV_8h.html new file mode 100644 index 0000000..81c4e1d --- /dev/null +++ b/docs/html/LoggerCSV_8h.html @@ -0,0 +1,103 @@ + + + + + + + +airlib: include/airlib/utility/LoggerCSV.h File Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Classes
+
LoggerCSV.h File Reference
+
+
+
#include <iostream>
+#include <vector>
+#include <chrono>
+#include <sstream>
+#include <string>
+#include <fstream>
+#include <iomanip>
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  LoggerCSV
 This class allows us to easily log information to a CSV file format. More...
 
+
+ + + + diff --git a/docs/html/LoggerCSV_8h_source.html b/docs/html/LoggerCSV_8h_source.html new file mode 100644 index 0000000..269615c --- /dev/null +++ b/docs/html/LoggerCSV_8h_source.html @@ -0,0 +1,209 @@ + + + + + + + +airlib: include/airlib/utility/LoggerCSV.h Source File + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
LoggerCSV.h
+
+
+Go to the documentation of this file.
1#pragma once
+
2
+
3#include <iostream>
+
4#include <vector>
+
5#include <chrono>
+
6#include <sstream>
+
7#include <string>
+
8#include <fstream>
+
9#include <iomanip>
+
10
+
11using namespace std::literals;
+
12
+ +
15
+
16 using TIME_POINT = std::chrono::time_point<std::chrono::system_clock>;
+
17
+
18public:
+ +
22 {
+
23 m_header_enabled = false;
+
24 m_timer_enabled = false;
+
25 }
+
26
+
28 LoggerCSV(const std::vector<std::string>&header)
+
29 {
+
30 m_header_enabled = false;
+
31 m_timer_enabled = false;
+
32 addHeader(header);
+
33 }
+
34
+
36 explicit LoggerCSV(const std::vector<std::string>&header, const int frequency)
+
37 {
+
38 m_header_enabled = false;
+
39 m_timer_enabled = false;
+
40 addHeader(header);
+
42 m_last_update_time = std::chrono::system_clock::now() - 1min;
+
43 m_timer_enabled = true;
+
45 m_pause_time_ms = 1000 / frequency;
+
46
+
47 }
+
48
+ +
51 {
+
52 std::string value = m_data.str();
+
53
+
54 // don't write file if there is no data added to the logger
+
55 if(!value.length())
+
56 return;
+
57
+
59 value.pop_back();
+
60
+
61 // make sure you have unique name for each logger file. Use system timestamp to serve this purpose
+
62 std::string filename = "logger_" + getTimestamp() + ".csv";
+
63 std::ofstream myfile(filename);
+
64 myfile << value;
+
65 myfile.close();
+
66 }
+
67
+
69 std::string getTimestamp()
+
70 {
+
71 const TIME_POINT now = std::chrono::system_clock::now();
+
72 const std::time_t t_c = std::chrono::system_clock::to_time_t(now);
+
73
+
74 std::stringstream ss;
+
75 ss << std::put_time(std::localtime(&t_c), "%F_%T");
+
76 return ss.str();
+
77 }
+
78
+
79 void addHeader(const std::vector<std::string>&data)
+
80 {
+
81 addRow(data);
+
82 m_header_len = data.size();
+
83 m_header_enabled = true;
+
84 }
+
85
+
86 template<typename T>
+
87 void addRow(const std::vector<T>&data)
+
88 {
+
89 if(m_timer_enabled)
+
90 {
+
92 const auto end = std::chrono::system_clock::now();
+
93 int elapsed_time = std::chrono::duration_cast<std::chrono::milliseconds>(end - m_last_update_time).count();
+
94
+
95 if(elapsed_time <= m_pause_time_ms)
+
96 return;
+
97 // std::cout << elapsed_time << " Paused time " << m_pause_time_ms << std::endl;
+
98 m_last_update_time = std::chrono::system_clock::now();
+
99 }
+
100
+
102 if(m_header_enabled)
+
103 if(m_header_len != data.size())
+
104 {
+
105 std::cerr << "header len does not match with data len" << std::endl;
+
106 return;
+
107 }
+
108
+
110 int index = 0;
+
111 for(const auto& item: data)
+
112 if(++index < data.size())
+
113 m_data << item << ", ";
+
114 else
+
115 m_data << item;
+
116 m_data << "\n";
+
117
+
118
+
119 }
+
120
+
121private:
+
122 std::stringstream m_data;
+
123 size_t m_header_len;
+
124 bool m_header_enabled;
+
125 bool m_timer_enabled;
+
126 TIME_POINT m_last_update_time;
+
127 int m_pause_time_ms;
+
128
+
129};
+
This class allows us to easily log information to a CSV file format.
Definition: LoggerCSV.h:14
+
LoggerCSV(const std::vector< std::string > &header)
This constructor is used to create a csv file with header.
Definition: LoggerCSV.h:28
+
void addHeader(const std::vector< std::string > &data)
Definition: LoggerCSV.h:79
+
~LoggerCSV()
When this class will be distructed, we will write the logger values from ROM to a csv file on the har...
Definition: LoggerCSV.h:50
+
std::string getTimestamp()
This function is used to generate unique name for a file with timestamp.
Definition: LoggerCSV.h:69
+
LoggerCSV(const std::vector< std::string > &header, const int frequency)
This constructor is used to to record data row at different frequency than sensor frequency whenever ...
Definition: LoggerCSV.h:36
+
LoggerCSV()
This is a default contructor without st.pop_back();header. One can manually add header file using add...
Definition: LoggerCSV.h:21
+
void addRow(const std::vector< T > &data)
Definition: LoggerCSV.h:87
+
+ + + + diff --git a/docs/html/PID_8cpp.html b/docs/html/PID_8cpp.html new file mode 100644 index 0000000..4eaebfc --- /dev/null +++ b/docs/html/PID_8cpp.html @@ -0,0 +1,96 @@ + + + + + + + +airlib: airlib/control/PID.cpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Namespaces
+
PID.cpp File Reference
+
+
+
#include "airlib/control/PID.h"
+
+

Go to the source code of this file.

+ + + + +

+Namespaces

namespace  bebop2
 
+
+ + + + diff --git a/docs/html/PID_8cpp_source.html b/docs/html/PID_8cpp_source.html new file mode 100644 index 0000000..16fb2fa --- /dev/null +++ b/docs/html/PID_8cpp_source.html @@ -0,0 +1,141 @@ + + + + + + + +airlib: airlib/control/PID.cpp Source File + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PID.cpp
+
+
+Go to the documentation of this file.
1//
+
2// Created by redwan on 12/15/22.
+
3//
+
4
+ +
6
+
7namespace bebop2 {
+ +
9 _pre_error = 0;
+
10 _integral = 0;
+
11 }
+
12
+
13 void PID::init(double dt, double max, double min, double Kp, double Kd, double Ki) {
+
14 _dt = dt;
+
15 _max = max;
+
16 _min = min;
+
17 _Kp = Kp;
+
18 _Kd = Kd;
+
19 _Ki = Ki;
+
20 }
+
21
+
22 double PID::calculate(double setpoint, double pv) {
+
23 // Calculate error
+
24 double error = setpoint - pv;
+
25
+
26 // Proportional term
+
27 double Pout = _Kp * error;
+
28
+
29 // Integral term
+
30 _integral += error * _dt;
+
31 double Iout = _Ki * _integral;
+
32
+
33 // Derivative term
+
34 double derivative = (error - _pre_error) / _dt;
+
35 double Dout = _Kd * derivative;
+
36
+
37 // Calculate total output
+
38 double output = Pout + Iout + Dout;
+
39
+
40 // Restrict to max/min
+
41 if( output > _max )
+
42 output = _max;
+
43 else if( output < _min )
+
44 output = _min;
+
45
+
46 // Save error to previous error
+
47 _pre_error = error;
+
48
+
49 return output;
+
50 }
+
51} // bebop2
+ +
void init(double dt, double max, double min, double Kp, double Kd, double Ki)
Init method initiliazes all the controller parameters like proportional constant, Integral constant,...
Definition: PID.cpp:13
+
PID()
A default Constuctor.
Definition: PID.cpp:8
+
double calculate(double setpoint, double pv)
At first it calculates the error by subtracting the setpoint and current position of the drone,...
Definition: PID.cpp:22
+ +
+ + + + diff --git a/docs/html/PID_8h.html b/docs/html/PID_8h.html new file mode 100644 index 0000000..90d5708 --- /dev/null +++ b/docs/html/PID_8h.html @@ -0,0 +1,143 @@ + + + + + + + +airlib: include/airlib/control/PID.h File Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Classes | +Namespaces | +Macros
+
PID.h File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  bebop2::PID
 Calculates an error value as the difference between desired output and the current output and applies a correction based on proportional, integral and derivative terms(denoted by P, I, D respectively). More...
 
+ + + +

+Namespaces

namespace  bebop2
 
+ + + + + +

+Macros

#define NUM_CONTROLLER   4
 
#define NUM_GAINS   3
 
+

Macro Definition Documentation

+ +

◆ NUM_CONTROLLER

+ +
+
+ + + + +
#define NUM_CONTROLLER   4
+
+ +

Definition at line 7 of file PID.h.

+ +
+
+ +

◆ NUM_GAINS

+ +
+
+ + + + +
#define NUM_GAINS   3
+
+ +

Definition at line 8 of file PID.h.

+ +
+
+
+ + + + diff --git a/docs/html/PID_8h_source.html b/docs/html/PID_8h_source.html new file mode 100644 index 0000000..a736dd1 --- /dev/null +++ b/docs/html/PID_8h_source.html @@ -0,0 +1,124 @@ + + + + + + + +airlib: include/airlib/control/PID.h Source File + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PID.h
+
+
+Go to the documentation of this file.
1//
+
2// Created by redwan on 12/15/22.
+
3//
+
4
+
5#ifndef BEBOP2_CONTROLLER_PID_H
+
6#define BEBOP2_CONTROLLER_PID_H
+
7#define NUM_CONTROLLER 4
+
8#define NUM_GAINS 3
+
9
+
10namespace bebop2 {
+
12 class PID {
+
13
+
14 public:
+
16 PID();
+
20 void init(double dt, double max, double min, double Kp, double Kd, double Ki);
+
33 double calculate( double setpoint, double pv );
+
34
+
35
+
36
+
37 private:
+
38 double _dt;
+
39 double _max;
+
40 double _min;
+
41 double _Kp;
+
42 double _Kd;
+
43 double _Ki;
+
44 double _pre_error;
+
45 double _integral;
+
46
+
47 };
+
48
+
49} // bebop2
+
50
+
51#endif //BEBOP2_CONTROLLER_PID_H
+
Calculates an error value as the difference between desired output and the current output and applies...
Definition: PID.h:12
+
void init(double dt, double max, double min, double Kp, double Kd, double Ki)
Init method initiliazes all the controller parameters like proportional constant, Integral constant,...
Definition: PID.cpp:13
+
PID()
A default Constuctor.
Definition: PID.cpp:8
+
double calculate(double setpoint, double pv)
At first it calculates the error by subtracting the setpoint and current position of the drone,...
Definition: PID.cpp:22
+ +
+ + + + diff --git a/docs/html/QuadControllerPID_8cpp.html b/docs/html/QuadControllerPID_8cpp.html new file mode 100644 index 0000000..f3a1c85 --- /dev/null +++ b/docs/html/QuadControllerPID_8cpp.html @@ -0,0 +1,96 @@ + + + + + + + +airlib: airlib/control/QuadControllerPID.cpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Namespaces
+
QuadControllerPID.cpp File Reference
+
+
+
#include "airlib/control/QuadControllerPID.h"
+
+

Go to the source code of this file.

+ + + + +

+Namespaces

namespace  bebop2
 
+
+ + + + diff --git a/docs/html/QuadControllerPID_8cpp_source.html b/docs/html/QuadControllerPID_8cpp_source.html new file mode 100644 index 0000000..e0c6791 --- /dev/null +++ b/docs/html/QuadControllerPID_8cpp_source.html @@ -0,0 +1,135 @@ + + + + + + + +airlib: airlib/control/QuadControllerPID.cpp Source File + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
QuadControllerPID.cpp
+
+
+Go to the documentation of this file.
1//
+
2// Created by redwan on 1/14/23.
+
3//
+
4
+ +
6
+
7namespace bebop2
+
8{
+
9 QuadControllerPID::QuadControllerPID(bebop2::StateObserverPtr mGetState, ros::NodeHandle &nh): ControllerBase(mGetState, nh) {
+
10 std::vector<double> gains;
+
11 ros::param::get("~pid_gains", gains);
+
12 assert(gains.size() == NUM_GAINS * NUM_CONTROLLER && "inaccurate PID gains");
+
13 set_gains(gains, _quadController);
+
14 }
+
15
+
16 void QuadControllerPID::set_gains(const std::vector<double> &gains, bebop2::PID *controller) {
+
17 const double MAX_OUT = 1;
+
18 const double MIN_OUT = -1;
+
19
+
20 for (int i = 0; i < NUM_CONTROLLER; ++i) {
+
21 int j = i * NUM_GAINS;
+
22 controller[i].init(ControllerBase::dt_, MAX_OUT, MIN_OUT, gains[j], gains[j + 1], gains[j + 2]);
+
23 }
+
24 }
+
25
+
26 void QuadControllerPID::compute_control(const std::vector<double> &X, const std::vector<double> &setPoints,
+
27 std::vector<double> &control) {
+
28 std::lock_guard<std::mutex> lk(ControllerBase::m_mu);
+
29 for (int i = 0; i < NUM_CONTROLLER; ++i) {
+
30 // ROS_INFO("[PositionController]: control axis = %d setpoint = %lf X = %lf", i, setPoints[i], X[i] );
+
31 control[i] = _quadController[i].calculate(setPoints[i], X[i]);
+
32 }
+
33
+
34 }
+
35
+
36
+
37}
+
#define NUM_CONTROLLER
Definition: PID.h:7
+
#define NUM_GAINS
Definition: PID.h:8
+ +
Responsible to control the position, state and rotation of the drone and also provides the code to ma...
+
double dt_
Sample Time.
+
std::mutex m_mu
Locks some functions for safe operations.
+
Calculates an error value as the difference between desired output and the current output and applies...
Definition: PID.h:12
+
void init(double dt, double max, double min, double Kp, double Kd, double Ki)
Init method initiliazes all the controller parameters like proportional constant, Integral constant,...
Definition: PID.cpp:13
+
double calculate(double setpoint, double pv)
At first it calculates the error by subtracting the setpoint and current position of the drone,...
Definition: PID.cpp:22
+
QuadControllerPID(StateObserverPtr mGetState, ros::NodeHandle &nh)
The QuadControllerPID constructor initializes a vector of type double that is responsible for populat...
+
void compute_control(const std::vector< double > &X, const std::vector< double > &setPoints, std::vector< double > &control) override
Similar to the calculate() method in PID.h class, the compute_control method also calculates the erro...
+ +
std::shared_ptr< StateObserver > StateObserverPtr
Definition: StateObserver.h:16
+
+ + + + diff --git a/docs/html/QuadControllerPID_8h.html b/docs/html/QuadControllerPID_8h.html new file mode 100644 index 0000000..5b6075b --- /dev/null +++ b/docs/html/QuadControllerPID_8h.html @@ -0,0 +1,106 @@ + + + + + + + +airlib: include/airlib/control/QuadControllerPID.h File Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Classes | +Namespaces
+
QuadControllerPID.h File Reference
+
+
+
#include "airlib/control/PID.h"
+#include "airlib/localization/StateObserver.h"
+#include "airlib/control/ControllerBase.h"
+#include <vector>
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  bebop2::QuadControllerPID
 Responsible to find the error values every second whenever the position of the quadrators of the drone is updated. More...
 
+ + + +

+Namespaces

namespace  bebop2
 
+
+ + + + diff --git a/docs/html/QuadControllerPID_8h_source.html b/docs/html/QuadControllerPID_8h_source.html new file mode 100644 index 0000000..a25c518 --- /dev/null +++ b/docs/html/QuadControllerPID_8h_source.html @@ -0,0 +1,123 @@ + + + + + + + +airlib: include/airlib/control/QuadControllerPID.h Source File + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
QuadControllerPID.h
+
+
+Go to the documentation of this file.
1//
+
2// Created by redwan on 1/14/23.
+
3//
+
4
+
5#ifndef airlib_QUADCONTROLLERPID_H
+
6#define airlib_QUADCONTROLLERPID_H
+
7
+ + + +
11#include <vector>
+
12
+
13namespace bebop2{
+ +
16 public:
+
21 QuadControllerPID(StateObserverPtr mGetState, ros::NodeHandle& nh);
+
22 private:
+
23 bebop2::PID _quadController[NUM_CONTROLLER];
+
26
+
31 void set_gains(const std::vector<double> &gains, bebop2::PID *controller);
+
32 protected:
+
37 void compute_control(const std::vector<double> &X, const std::vector<double> &setPoints,
+
38 std::vector<double> &control) override;
+
39 };
+
40}
+
41
+
42
+
43#endif //airlib_QUADCONTROLLERPID_H
+ + +
#define NUM_CONTROLLER
Definition: PID.h:7
+ +
Responsible to control the position, state and rotation of the drone and also provides the code to ma...
+
Calculates an error value as the difference between desired output and the current output and applies...
Definition: PID.h:12
+
Responsible to find the error values every second whenever the position of the quadrators of the dron...
+
void compute_control(const std::vector< double > &X, const std::vector< double > &setPoints, std::vector< double > &control) override
Similar to the calculate() method in PID.h class, the compute_control method also calculates the erro...
+ +
std::shared_ptr< StateObserver > StateObserverPtr
Definition: StateObserver.h:16
+
+ + + + diff --git a/doxygen/html/index.html b/docs/html/README_8md.html similarity index 91% rename from doxygen/html/index.html rename to docs/html/README_8md.html index 4851a6d..705e855 100644 --- a/doxygen/html/index.html +++ b/docs/html/README_8md.html @@ -3,9 +3,9 @@ - + -airlib: Main Page +airlib: README.md File Reference @@ -29,7 +29,7 @@ - + -
+
-
airlib Documentation
+
README.md File Reference
diff --git a/docs/html/ReadMe_8md.html b/docs/html/ReadMe_8md.html new file mode 100644 index 0000000..499d50d --- /dev/null +++ b/docs/html/ReadMe_8md.html @@ -0,0 +1,81 @@ + + + + + + + +airlib: include/ReadMe.md File Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
include/ReadMe.md File Reference
+
+
+
+ + + + diff --git a/docs/html/SensorBase_8h.html b/docs/html/SensorBase_8h.html new file mode 100644 index 0000000..aaff512 --- /dev/null +++ b/docs/html/SensorBase_8h.html @@ -0,0 +1,123 @@ + + + + + + + +airlib: include/airlib/localization/Sensors/SensorBase.h File Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Classes | +Typedefs
+
SensorBase.h File Reference
+
+
+
#include <iostream>
+#include <memory>
+#include <vector>
+#include <tf/transform_broadcaster.h>
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  SensorBase
 This class provides a conection to acquire internal state vector. More...
 
+ + + +

+Typedefs

typedef std::shared_ptr< SensorBaseSensorPtr
 
+

Typedef Documentation

+ +

◆ SensorPtr

+ +
+
+ + + + +
typedef std::shared_ptr<SensorBase> SensorPtr
+
+ +

Definition at line 14 of file SensorBase.h.

+ +
+
+
+ + + + diff --git a/docs/html/SensorBase_8h_source.html b/docs/html/SensorBase_8h_source.html new file mode 100644 index 0000000..59f82da --- /dev/null +++ b/docs/html/SensorBase_8h_source.html @@ -0,0 +1,133 @@ + + + + + + + +airlib: include/airlib/localization/Sensors/SensorBase.h Source File + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
SensorBase.h
+
+
+Go to the documentation of this file.
1//
+
2// Created by redwan on 1/14/23.
+
3//
+
4
+
5#ifndef BEBOP2_CONTROLLER_SENSORBASE_H
+
6#define BEBOP2_CONTROLLER_SENSORBASE_H
+
7#include <iostream>
+
8#include <memory>
+
9#include <vector>
+
10#include <tf/transform_broadcaster.h>
+
11
+
12class SensorBase;
+
13
+
14typedef std::shared_ptr<SensorBase> SensorPtr;
+
15
+
22class SensorBase: std::enable_shared_from_this<SensorBase>
+
23{
+
24public:
+ +
28 {
+
29 return shared_from_this();
+
30 }
+
36 virtual void operator()(std::vector<double>& result) = 0;
+
43 virtual bool empty() = 0;
+
44
+
53 void publish_tf(const std::vector<double> &state) {
+
54 tf::Transform globalCoord;
+
55 tf::Quaternion q;
+
56 q.setRPY(0, 0, state[3]);
+
57 globalCoord.setOrigin(tf::Vector3(state[0], state[1], state[2]));
+
58 globalCoord.setRotation(q);
+
59 m_br.sendTransform(tf::StampedTransform(globalCoord, ros::Time::now(), "map", "robot"));
+
60// ROS_INFO_STREAM(robot_position_);
+
61 }
+
62
+
63private:
+
65 tf::TransformBroadcaster m_br;
+
66
+
67
+
68};
+
69
+
70#endif //BEBOP2_CONTROLLER_SENSORBASE_H
+
std::shared_ptr< SensorBase > SensorPtr
Definition: SensorBase.h:14
+
This class provides a conection to acquire internal state vector.
Definition: SensorBase.h:23
+
virtual bool empty()=0
This is an interface to check whether internal state vector is empty or not so that we can safely rea...
+
SensorPtr getPtr()
systematic way to share SensorPtr to control class
Definition: SensorBase.h:27
+
void publish_tf(const std::vector< double > &state)
Publish robot transformation so that we can visualize it in RVIZ. tf::TransformBroadcaster m_br; va...
Definition: SensorBase.h:53
+
virtual void operator()(std::vector< double > &result)=0
This is an interface to access to the internal state vector so that other modules can do their comput...
+
+ + + + diff --git a/docs/html/StateObserver_8cpp.html b/docs/html/StateObserver_8cpp.html new file mode 100644 index 0000000..fae6be5 --- /dev/null +++ b/docs/html/StateObserver_8cpp.html @@ -0,0 +1,96 @@ + + + + + + + +airlib: airlib/localization/StateObserver.cpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Namespaces
+
StateObserver.cpp File Reference
+
+
+
#include "airlib/localization/StateObserver.h"
+
+

Go to the source code of this file.

+ + + + +

+Namespaces

namespace  bebop2
 
+
+ + + + diff --git a/docs/html/StateObserver_8cpp_source.html b/docs/html/StateObserver_8cpp_source.html new file mode 100644 index 0000000..72340dd --- /dev/null +++ b/docs/html/StateObserver_8cpp_source.html @@ -0,0 +1,141 @@ + + + + + + + +airlib: airlib/localization/StateObserver.cpp Source File + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
StateObserver.cpp
+
+
+Go to the documentation of this file.
1//
+
2// Created by redwan on 12/15/22.
+
3//
+
4
+ +
6
+
7
+
8namespace bebop2 {
+
9
+
10
+ +
12 m_filter(filter), m_sensor(sensor) {
+
13 m_initialized = false;
+
14 }
+
15
+
16
+
17 void StateObserver::operator()(std::vector<double>& result) {
+
18
+
19 update_state();
+
20 result.clear();
+
21 std::copy(m_state.begin(), m_state.end(),std::back_inserter(result));
+
22 }
+
23
+
24
+
25 void StateObserver::update_state() {
+
26 while (!m_sensor->empty())
+
27 {
+
28 std::vector<double> obs;
+
29 m_sensor->operator()(obs);
+
30 if(!m_initialized)
+
31 {
+
32 m_filter->init(obs);
+
33 m_initialized = true;
+
34 }
+
35 m_filter->update(obs, m_state);
+
36
+
37// std::cout << m_state[0] << ", " << m_state[1] << ", " << m_state[2] << std::endl;
+
38 }
+
39
+
40 if(!m_state.empty())
+
41 m_sensor->publish_tf(m_state);
+
42
+
43 }
+
44
+
45
+
46} // bebop2
+
std::shared_ptr< FilterBase > FilterPtr
Definition: FilterBase.h:13
+
std::shared_ptr< SensorBase > SensorPtr
Definition: SensorBase.h:14
+ +
StateObserver(FilterPtr filter, SensorPtr sensor)
Initializes the filter and sensor parameter and sets m_initliazed to False.
+
void operator()(std::vector< double > &result)
It updates and copies the state of the drone and adds the copied state into the parameter result.
+ +
std::vector< double > m_state
This attribute is an array of values and the elements in the vector gives the state of the robot....
Definition: StateObserver.h:52
+
FilterPtr m_filter
Shared pointer that provides the address to the FilterBase.h class.
Definition: StateObserver.h:54
+
SensorPtr m_sensor
Shared pointer that provides the addreess to the SensorBase.h class.
Definition: StateObserver.h:56
+ +
+ + + + diff --git a/docs/html/StateObserver_8h.html b/docs/html/StateObserver_8h.html new file mode 100644 index 0000000..b0bce81 --- /dev/null +++ b/docs/html/StateObserver_8h.html @@ -0,0 +1,113 @@ + + + + + + + +airlib: include/airlib/localization/StateObserver.h File Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Classes | +Namespaces | +Typedefs
+
StateObserver.h File Reference
+
+
+
#include <iostream>
+#include <vector>
+#include <memory>
+#include "filters.h"
+#include "sensors.h"
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  bebop2::StateObserver
 The StateObserver class Observes and updates the state of the drone. More...
 
+ + + +

+Namespaces

namespace  bebop2
 
+ + + +

+Typedefs

typedef std::shared_ptr< StateObserver > bebop2::StateObserverPtr
 
+
+ + + + diff --git a/docs/html/StateObserver_8h_source.html b/docs/html/StateObserver_8h_source.html new file mode 100644 index 0000000..1b6f2b0 --- /dev/null +++ b/docs/html/StateObserver_8h_source.html @@ -0,0 +1,136 @@ + + + + + + + +airlib: include/airlib/localization/StateObserver.h Source File + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
StateObserver.h
+
+
+Go to the documentation of this file.
1//
+
2// Created by redwan on 12/15/22.
+
3//
+
4
+
5#ifndef BEBOP2_CONTROLLER_STATEOBSERVER_H
+
6#define BEBOP2_CONTROLLER_STATEOBSERVER_H
+
7#include <iostream>
+
8#include <vector>
+
9#include <memory>
+
10#include "filters.h"
+
11#include "sensors.h"
+
12
+
13
+
14namespace bebop2 {
+
15 class StateObserver;
+
16 typedef std::shared_ptr<StateObserver> StateObserverPtr;
+ +
24 public:
+
29 explicit StateObserver(FilterPtr filter, SensorPtr sensor);
+
30
+
33 void operator()(std::vector<double>& result);
+
34 private:
+
35 //
+
36 // Accesses the internal state vector
+
37 // Publishes robot transformation
+
38 void update_state();
+
39 protected:
+
40 /* Quadrotor state
+
41 * x, y, z, yaw
+
42 */
+
52 std::vector<double> m_state;
+ + + +
58
+
59 };
+
60
+
61} // bebop2
+
62#endif //BEBOP2_CONTROLLER_STATEOBSERVER_H
+
std::shared_ptr< FilterBase > FilterPtr
Definition: FilterBase.h:13
+
std::shared_ptr< SensorBase > SensorPtr
Definition: SensorBase.h:14
+
The StateObserver class Observes and updates the state of the drone.
Definition: StateObserver.h:23
+
void operator()(std::vector< double > &result)
It updates and copies the state of the drone and adds the copied state into the parameter result.
+ +
std::vector< double > m_state
This attribute is an array of values and the elements in the vector gives the state of the robot....
Definition: StateObserver.h:52
+
FilterPtr m_filter
Shared pointer that provides the address to the FilterBase.h class.
Definition: StateObserver.h:54
+
SensorPtr m_sensor
Shared pointer that provides the addreess to the SensorBase.h class.
Definition: StateObserver.h:56
+ + +
std::shared_ptr< StateObserver > StateObserverPtr
Definition: StateObserver.h:16
+ +
+ + + + diff --git a/doxygen/html/_apriltag_landmarks_8cpp.html b/docs/html/_apriltag_landmarks_8cpp.html similarity index 100% rename from doxygen/html/_apriltag_landmarks_8cpp.html rename to docs/html/_apriltag_landmarks_8cpp.html diff --git a/doxygen/html/_apriltag_landmarks_8cpp_source.html b/docs/html/_apriltag_landmarks_8cpp_source.html similarity index 100% rename from doxygen/html/_apriltag_landmarks_8cpp_source.html rename to docs/html/_apriltag_landmarks_8cpp_source.html diff --git a/doxygen/html/_apriltag_landmarks_8h.html b/docs/html/_apriltag_landmarks_8h.html similarity index 100% rename from doxygen/html/_apriltag_landmarks_8h.html rename to docs/html/_apriltag_landmarks_8h.html diff --git a/doxygen/html/_apriltag_landmarks_8h_source.html b/docs/html/_apriltag_landmarks_8h_source.html similarity index 100% rename from doxygen/html/_apriltag_landmarks_8h_source.html rename to docs/html/_apriltag_landmarks_8h_source.html diff --git a/doxygen/html/_complementary_filter_8h.html b/docs/html/_complementary_filter_8h.html similarity index 100% rename from doxygen/html/_complementary_filter_8h.html rename to docs/html/_complementary_filter_8h.html diff --git a/doxygen/html/_complementary_filter_8h_source.html b/docs/html/_complementary_filter_8h_source.html similarity index 100% rename from doxygen/html/_complementary_filter_8h_source.html rename to docs/html/_complementary_filter_8h_source.html diff --git a/doxygen/html/_control_viz_8cpp.html b/docs/html/_control_viz_8cpp.html similarity index 100% rename from doxygen/html/_control_viz_8cpp.html rename to docs/html/_control_viz_8cpp.html diff --git a/doxygen/html/_control_viz_8cpp_source.html b/docs/html/_control_viz_8cpp_source.html similarity index 100% rename from doxygen/html/_control_viz_8cpp_source.html rename to docs/html/_control_viz_8cpp_source.html diff --git a/doxygen/html/_control_viz_8h.html b/docs/html/_control_viz_8h.html similarity index 100% rename from doxygen/html/_control_viz_8h.html rename to docs/html/_control_viz_8h.html diff --git a/doxygen/html/_control_viz_8h_source.html b/docs/html/_control_viz_8h_source.html similarity index 100% rename from doxygen/html/_control_viz_8h_source.html rename to docs/html/_control_viz_8h_source.html diff --git a/doxygen/html/_controller_base_8cpp.html b/docs/html/_controller_base_8cpp.html similarity index 100% rename from doxygen/html/_controller_base_8cpp.html rename to docs/html/_controller_base_8cpp.html diff --git a/doxygen/html/_controller_base_8cpp_source.html b/docs/html/_controller_base_8cpp_source.html similarity index 100% rename from doxygen/html/_controller_base_8cpp_source.html rename to docs/html/_controller_base_8cpp_source.html diff --git a/doxygen/html/_controller_base_8h.html b/docs/html/_controller_base_8h.html similarity index 100% rename from doxygen/html/_controller_base_8h.html rename to docs/html/_controller_base_8h.html diff --git a/doxygen/html/_controller_base_8h_source.html b/docs/html/_controller_base_8h_source.html similarity index 100% rename from doxygen/html/_controller_base_8h_source.html rename to docs/html/_controller_base_8h_source.html diff --git a/doxygen/html/_dummy_state_8cpp.html b/docs/html/_dummy_state_8cpp.html similarity index 100% rename from doxygen/html/_dummy_state_8cpp.html rename to docs/html/_dummy_state_8cpp.html diff --git a/doxygen/html/_dummy_state_8cpp_source.html b/docs/html/_dummy_state_8cpp_source.html similarity index 100% rename from doxygen/html/_dummy_state_8cpp_source.html rename to docs/html/_dummy_state_8cpp_source.html diff --git a/doxygen/html/_dummy_state_8h.html b/docs/html/_dummy_state_8h.html similarity index 100% rename from doxygen/html/_dummy_state_8h.html rename to docs/html/_dummy_state_8h.html diff --git a/doxygen/html/_dummy_state_8h_source.html b/docs/html/_dummy_state_8h_source.html similarity index 100% rename from doxygen/html/_dummy_state_8h_source.html rename to docs/html/_dummy_state_8h_source.html diff --git a/doxygen/html/_extended_kalman_filter_8cpp.html b/docs/html/_extended_kalman_filter_8cpp.html similarity index 100% rename from doxygen/html/_extended_kalman_filter_8cpp.html rename to docs/html/_extended_kalman_filter_8cpp.html diff --git a/doxygen/html/_extended_kalman_filter_8cpp_source.html b/docs/html/_extended_kalman_filter_8cpp_source.html similarity index 100% rename from doxygen/html/_extended_kalman_filter_8cpp_source.html rename to docs/html/_extended_kalman_filter_8cpp_source.html diff --git a/doxygen/html/_extended_kalman_filter_8h.html b/docs/html/_extended_kalman_filter_8h.html similarity index 100% rename from doxygen/html/_extended_kalman_filter_8h.html rename to docs/html/_extended_kalman_filter_8h.html diff --git a/doxygen/html/_extended_kalman_filter_8h_source.html b/docs/html/_extended_kalman_filter_8h_source.html similarity index 100% rename from doxygen/html/_extended_kalman_filter_8h_source.html rename to docs/html/_extended_kalman_filter_8h_source.html diff --git a/doxygen/html/_filter_base_8h.html b/docs/html/_filter_base_8h.html similarity index 100% rename from doxygen/html/_filter_base_8h.html rename to docs/html/_filter_base_8h.html diff --git a/doxygen/html/_filter_base_8h_source.html b/docs/html/_filter_base_8h_source.html similarity index 100% rename from doxygen/html/_filter_base_8h_source.html rename to docs/html/_filter_base_8h_source.html diff --git a/doxygen/html/_l_q_r_8cpp.html b/docs/html/_l_q_r_8cpp.html similarity index 100% rename from doxygen/html/_l_q_r_8cpp.html rename to docs/html/_l_q_r_8cpp.html diff --git a/doxygen/html/_l_q_r_8cpp_source.html b/docs/html/_l_q_r_8cpp_source.html similarity index 100% rename from doxygen/html/_l_q_r_8cpp_source.html rename to docs/html/_l_q_r_8cpp_source.html diff --git a/doxygen/html/_l_q_r_8h.html b/docs/html/_l_q_r_8h.html similarity index 100% rename from doxygen/html/_l_q_r_8h.html rename to docs/html/_l_q_r_8h.html diff --git a/doxygen/html/_l_q_r_8h_source.html b/docs/html/_l_q_r_8h_source.html similarity index 100% rename from doxygen/html/_l_q_r_8h_source.html rename to docs/html/_l_q_r_8h_source.html diff --git a/doxygen/html/_logger_c_s_v_8h.html b/docs/html/_logger_c_s_v_8h.html similarity index 100% rename from doxygen/html/_logger_c_s_v_8h.html rename to docs/html/_logger_c_s_v_8h.html diff --git a/doxygen/html/_logger_c_s_v_8h_source.html b/docs/html/_logger_c_s_v_8h_source.html similarity index 100% rename from doxygen/html/_logger_c_s_v_8h_source.html rename to docs/html/_logger_c_s_v_8h_source.html diff --git a/doxygen/html/_p_i_d_8cpp.html b/docs/html/_p_i_d_8cpp.html similarity index 100% rename from doxygen/html/_p_i_d_8cpp.html rename to docs/html/_p_i_d_8cpp.html diff --git a/doxygen/html/_p_i_d_8cpp_source.html b/docs/html/_p_i_d_8cpp_source.html similarity index 100% rename from doxygen/html/_p_i_d_8cpp_source.html rename to docs/html/_p_i_d_8cpp_source.html diff --git a/doxygen/html/_p_i_d_8h.html b/docs/html/_p_i_d_8h.html similarity index 100% rename from doxygen/html/_p_i_d_8h.html rename to docs/html/_p_i_d_8h.html diff --git a/doxygen/html/_p_i_d_8h_source.html b/docs/html/_p_i_d_8h_source.html similarity index 100% rename from doxygen/html/_p_i_d_8h_source.html rename to docs/html/_p_i_d_8h_source.html diff --git a/doxygen/html/_quad_controller_p_i_d_8cpp.html b/docs/html/_quad_controller_p_i_d_8cpp.html similarity index 100% rename from doxygen/html/_quad_controller_p_i_d_8cpp.html rename to docs/html/_quad_controller_p_i_d_8cpp.html diff --git a/doxygen/html/_quad_controller_p_i_d_8cpp_source.html b/docs/html/_quad_controller_p_i_d_8cpp_source.html similarity index 100% rename from doxygen/html/_quad_controller_p_i_d_8cpp_source.html rename to docs/html/_quad_controller_p_i_d_8cpp_source.html diff --git a/doxygen/html/_quad_controller_p_i_d_8h.html b/docs/html/_quad_controller_p_i_d_8h.html similarity index 100% rename from doxygen/html/_quad_controller_p_i_d_8h.html rename to docs/html/_quad_controller_p_i_d_8h.html diff --git a/doxygen/html/_quad_controller_p_i_d_8h_source.html b/docs/html/_quad_controller_p_i_d_8h_source.html similarity index 100% rename from doxygen/html/_quad_controller_p_i_d_8h_source.html rename to docs/html/_quad_controller_p_i_d_8h_source.html diff --git a/doxygen/html/_r_e_a_d_m_e_8md.html b/docs/html/_r_e_a_d_m_e_8md.html similarity index 100% rename from doxygen/html/_r_e_a_d_m_e_8md.html rename to docs/html/_r_e_a_d_m_e_8md.html diff --git a/doxygen/html/_sensor_base_8h.html b/docs/html/_sensor_base_8h.html similarity index 100% rename from doxygen/html/_sensor_base_8h.html rename to docs/html/_sensor_base_8h.html diff --git a/doxygen/html/_sensor_base_8h_source.html b/docs/html/_sensor_base_8h_source.html similarity index 100% rename from doxygen/html/_sensor_base_8h_source.html rename to docs/html/_sensor_base_8h_source.html diff --git a/doxygen/html/_state_observer_8cpp.html b/docs/html/_state_observer_8cpp.html similarity index 100% rename from doxygen/html/_state_observer_8cpp.html rename to docs/html/_state_observer_8cpp.html diff --git a/doxygen/html/_state_observer_8cpp_source.html b/docs/html/_state_observer_8cpp_source.html similarity index 100% rename from doxygen/html/_state_observer_8cpp_source.html rename to docs/html/_state_observer_8cpp_source.html diff --git a/doxygen/html/_state_observer_8h.html b/docs/html/_state_observer_8h.html similarity index 100% rename from doxygen/html/_state_observer_8h.html rename to docs/html/_state_observer_8h.html diff --git a/doxygen/html/_state_observer_8h_source.html b/docs/html/_state_observer_8h_source.html similarity index 100% rename from doxygen/html/_state_observer_8h_source.html rename to docs/html/_state_observer_8h_source.html diff --git a/doxygen/html/annotated.html b/docs/html/annotated.html similarity index 53% rename from doxygen/html/annotated.html rename to docs/html/annotated.html index 9fbca22..6c01ce5 100644 --- a/doxygen/html/annotated.html +++ b/docs/html/annotated.html @@ -3,7 +3,7 @@ - + airlib: Class List @@ -29,7 +29,7 @@ - + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
ApriltagLandmarks Member List
+
+
+ +

This is the complete list of members for ApriltagLandmarks, including all inherited members.

+ + + + + + + + +
apriltag_callback(const apriltag_ros::AprilTagDetectionArray::ConstPtr &msg)ApriltagLandmarksprotected
ApriltagLandmarks(ros::NodeHandle &nh)ApriltagLandmarks
empty()ApriltagLandmarksvirtual
getPtr()SensorBaseinline
operator()(std::vector< double > &result)ApriltagLandmarksvirtual
publish_tf(const std::vector< double > &state)SensorBaseinline
transformToGlobalFrame(const tf::Transform &tagTransform, const std::string &tagName)ApriltagLandmarksprotected
+ + + + diff --git a/docs/html/classApriltagLandmarks.html b/docs/html/classApriltagLandmarks.html new file mode 100644 index 0000000..15e65d0 --- /dev/null +++ b/docs/html/classApriltagLandmarks.html @@ -0,0 +1,324 @@ + + + + + + + +airlib: ApriltagLandmarks Class Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
+Public Member Functions | +Protected Member Functions | +List of all members
+
ApriltagLandmarks Class Reference
+
+
+ +

This class computes the robot coordinate from stationary tags. + More...

+ +

#include <ApriltagLandmarks.h>

+
+Inheritance diagram for ApriltagLandmarks:
+
+
+ + +SensorBase + +
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 ApriltagLandmarks (ros::NodeHandle &nh)
 
void operator() (std::vector< double > &result)
 This is an interface to access to the internal state vector so that other modules can do their computation.
 
bool empty ()
 This is an interface to check whether internal state vector is empty or not so that we can safely read internal state vector.
 
- Public Member Functions inherited from SensorBase
SensorPtr getPtr ()
 systematic way to share SensorPtr to control class
 
virtual void operator() (std::vector< double > &result)=0
 This is an interface to access to the internal state vector so that other modules can do their computation.
 
virtual bool empty ()=0
 This is an interface to check whether internal state vector is empty or not so that we can safely read internal state vector.
 
void publish_tf (const std::vector< double > &state)
 Publish robot transformation so that we can visualize it in RVIZ.
+ tf::TransformBroadcaster m_br; variable does not depends of NodeHandle. Therefore we can implement publish_tf in this abstract class.
 
+ + + + + + + +

+Protected Member Functions

void apriltag_callback (const apriltag_ros::AprilTagDetectionArray::ConstPtr &msg)
 Given an array of detected tags, here we calculate robot global coordinate with respect to each tag. Each tag propose a noisy state of the robot when transformed it to the global frame. Therefore, an appropriate state filter is used to denoise those readings and compute the robot state accurately.
 
FieldLocation transformToGlobalFrame (const tf::Transform &tagTransform, const std::string &tagName)
 tag is detected with respect to camera frame which needs to be transformed to global frame through camera baselink -> global_frame
 
+

Detailed Description

+

This class computes the robot coordinate from stationary tags.

+

There are three stationary apriltags located on the wall. These tags are treated as known landmarks for the map. Bebop2 can view these tags with the front facing camera. It is not necessary to see all the tags since even one landmark can help to localize the robot. This information is feedback to the computer to detect apriltags from the camera image. Bebop2 can transmit this images upto 28 Hz speed Apparently, the tags are located only front direction, therefore robot yaw angle is ignored.

+ +

Definition at line 30 of file ApriltagLandmarks.h.

+

Constructor & Destructor Documentation

+ +

◆ ApriltagLandmarks()

+ +
+
+ + + + + + + + +
ApriltagLandmarks::ApriltagLandmarks (ros::NodeHandle & nh)
+
+ +

Definition at line 7 of file ApriltagLandmarks.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ apriltag_callback()

+ +
+
+ + + + + +
+ + + + + + + + +
void ApriltagLandmarks::apriltag_callback (const apriltag_ros::AprilTagDetectionArray::ConstPtr & msg)
+
+protected
+
+ +

Given an array of detected tags, here we calculate robot global coordinate with respect to each tag. Each tag propose a noisy state of the robot when transformed it to the global frame. Therefore, an appropriate state filter is used to denoise those readings and compute the robot state accurately.

+
Parameters
+ + +
msgan array of detected tags
+
+
+ +

Definition at line 29 of file ApriltagLandmarks.cpp.

+ +
+
+ +

◆ empty()

+ +
+
+ + + + + +
+ + + + + + + +
bool ApriltagLandmarks::empty ()
+
+virtual
+
+ +

This is an interface to check whether internal state vector is empty or not so that we can safely read internal state vector.

+
Returns
true if internal state vector has not been populated yet
+
+false if internal state vector has been initialized
+
Note
previous void operator()(std::vector<double>& result) depends on it
+ +

Implements SensorBase.

+ +

Definition at line 68 of file ApriltagLandmarks.cpp.

+ +
+
+ +

◆ operator()()

+ +
+
+ + + + + +
+ + + + + + + + +
void ApriltagLandmarks::operator() (std::vector< double > & result)
+
+virtual
+
+ +

This is an interface to access to the internal state vector so that other modules can do their computation.

+
Note
this interface depends on bool empty()
+
+
Parameters
+ + +
resultcopy internal state vector to result vector
+
+
+ +

Implements SensorBase.

+ +

Definition at line 63 of file ApriltagLandmarks.cpp.

+ +
+
+ +

◆ transformToGlobalFrame()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
FieldLocation ApriltagLandmarks::transformToGlobalFrame (const tf::Transform & tagTransform,
const std::string & tagName 
)
+
+protected
+
+ +

tag is detected with respect to camera frame which needs to be transformed to global frame through camera baselink -> global_frame

+
Parameters
+ + + +
tagTransformtag pose with resect to camera frame
tagNamename of the tag
+
+
+
Returns
global coordinate [x, y, z]
+ +

Definition at line 46 of file ApriltagLandmarks.cpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/doxygen/html/class_apriltag_landmarks.png b/docs/html/classApriltagLandmarks.png similarity index 100% rename from doxygen/html/class_apriltag_landmarks.png rename to docs/html/classApriltagLandmarks.png diff --git a/docs/html/classComplementaryFilter-members.html b/docs/html/classComplementaryFilter-members.html new file mode 100644 index 0000000..edcb855 --- /dev/null +++ b/docs/html/classComplementaryFilter-members.html @@ -0,0 +1,91 @@ + + + + + + + +airlib: Member List + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
ComplementaryFilter Member List
+
+
+ +

This is the complete list of members for ComplementaryFilter, including all inherited members.

+ + + + + + + + +
ComplementaryFilter(double alpha)ComplementaryFilterinline
FilterBase()FilterBaseinline
getPtr()FilterBaseinline
init(const std::vector< double > &X0)ComplementaryFilterinlinevirtual
update(const std::vector< double > &obs, std::vector< double > &result)ComplementaryFilterinlinevirtual
X_FilterBaseprotected
~FilterBase()FilterBaseinlinevirtual
+ + + + diff --git a/docs/html/classComplementaryFilter.html b/docs/html/classComplementaryFilter.html new file mode 100644 index 0000000..ff67b3b --- /dev/null +++ b/docs/html/classComplementaryFilter.html @@ -0,0 +1,261 @@ + + + + + + + +airlib: ComplementaryFilter Class Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
+Public Member Functions | +List of all members
+
ComplementaryFilter Class Reference
+
+
+ +

The ComplementaryFilter.h class implements the complmentary filter where it initializes the state and updates it using the. + More...

+ +

#include <ComplementaryFilter.h>

+
+Inheritance diagram for ComplementaryFilter:
+
+
+ + +FilterBase + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 ComplementaryFilter (double alpha)
 filter's alpha paramater in update() method.
 
void init (const std::vector< double > &X0)
 Makes the current estimate of the state of the system start out being the same as the true state.
 
void update (const std::vector< double > &obs, std::vector< double > &result)
 Updated state is calculated and stored.
 
- Public Member Functions inherited from FilterBase
 FilterBase ()
 Constructor.
 
virtual ~FilterBase ()
 Deconstructor.
 
FilterPtr getPtr ()
 systematic way to share FilterPtr to control class
 
virtual void init (const std::vector< double > &X0)=0
 Makes the current estimate of the state of the system start out being the same as the true state.
 
virtual void update (const std::vector< double > &obs, std::vector< double > &result)=0
 Updated state is calculated and stored.
 
+ + + + + +

+Additional Inherited Members

- Protected Attributes inherited from FilterBase
std::vector< double > X_
 Estimated state of the system.
 
+

Detailed Description

+

The ComplementaryFilter.h class implements the complmentary filter where it initializes the state and updates it using the.

+ +

Definition at line 11 of file ComplementaryFilter.h.

+

Constructor & Destructor Documentation

+ +

◆ ComplementaryFilter()

+ +
+
+ + + + + +
+ + + + + + + + +
ComplementaryFilter::ComplementaryFilter (double alpha)
+
+inline
+
+ +

filter's alpha paramater in update() method.

+ +

Definition at line 14 of file ComplementaryFilter.h.

+ +
+
+

Member Function Documentation

+ +

◆ init()

+ +
+
+ + + + + +
+ + + + + + + + +
void ComplementaryFilter::init (const std::vector< double > & X0)
+
+inlinevirtual
+
+ +

Makes the current estimate of the state of the system start out being the same as the true state.

+
Parameters
+ + +
X0A vector of initial values for the state estimate.
+
+
+
+ +

Implements FilterBase.

+ +

Definition at line 19 of file ComplementaryFilter.h.

+ +
+
+ +

◆ update()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void ComplementaryFilter::update (const std::vector< double > & obs,
std::vector< double > & result 
)
+
+inlinevirtual
+
+ +

Updated state is calculated and stored.

+
Parameters
+ + + +
obsA vector of measured values
resultA vector to store the update state estimate
+
+
+ +

Implements FilterBase.

+ +

Definition at line 26 of file ComplementaryFilter.h.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/html/class_complementary_filter.png b/docs/html/classComplementaryFilter.png similarity index 100% rename from doxygen/html/class_complementary_filter.png rename to docs/html/classComplementaryFilter.png diff --git a/docs/html/classFilterBase-members.html b/docs/html/classFilterBase-members.html new file mode 100644 index 0000000..079534d --- /dev/null +++ b/docs/html/classFilterBase-members.html @@ -0,0 +1,90 @@ + + + + + + + +airlib: Member List + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
FilterBase Member List
+
+
+ +

This is the complete list of members for FilterBase, including all inherited members.

+ + + + + + + +
FilterBase()FilterBaseinline
getPtr()FilterBaseinline
init(const std::vector< double > &X0)=0FilterBasepure virtual
update(const std::vector< double > &obs, std::vector< double > &result)=0FilterBasepure virtual
X_FilterBaseprotected
~FilterBase()FilterBaseinlinevirtual
+ + + + diff --git a/docs/html/classFilterBase.html b/docs/html/classFilterBase.html new file mode 100644 index 0000000..c1fb8cd --- /dev/null +++ b/docs/html/classFilterBase.html @@ -0,0 +1,334 @@ + + + + + + + +airlib: FilterBase Class Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
+Public Member Functions | +Protected Attributes | +List of all members
+
FilterBase Class Referenceabstract
+
+
+ +

The FilterBase class enables various other classes to share the FilterPtr. This class allows other classes like ComplementaryFilter.h, ExtendedKalmanFilter.h,Particle.h to use methods like init(), update() to store the estimated state and update the state. + More...

+ +

#include <FilterBase.h>

+
+Inheritance diagram for FilterBase:
+
+
+ + +ComplementaryFilter +bebop2::ExtendedKalmanFilter + +
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

 FilterBase ()
 Constructor.
 
virtual ~FilterBase ()
 Deconstructor.
 
FilterPtr getPtr ()
 systematic way to share FilterPtr to control class
 
virtual void init (const std::vector< double > &X0)=0
 Makes the current estimate of the state of the system start out being the same as the true state.
 
virtual void update (const std::vector< double > &obs, std::vector< double > &result)=0
 Updated state is calculated and stored.
 
+ + + + +

+Protected Attributes

std::vector< double > X_
 Estimated state of the system.
 
+

Detailed Description

+

The FilterBase class enables various other classes to share the FilterPtr. This class allows other classes like ComplementaryFilter.h, ExtendedKalmanFilter.h,Particle.h to use methods like init(), update() to store the estimated state and update the state.

+ +

Definition at line 16 of file FilterBase.h.

+

Constructor & Destructor Documentation

+ +

◆ FilterBase()

+ +
+
+ + + + + +
+ + + + + + + +
FilterBase::FilterBase ()
+
+inline
+
+ +

Constructor.

+ +

Definition at line 20 of file FilterBase.h.

+ +
+
+ +

◆ ~FilterBase()

+ +
+
+ + + + + +
+ + + + + + + +
virtual FilterBase::~FilterBase ()
+
+inlinevirtual
+
+ +

Deconstructor.

+ +

Definition at line 25 of file FilterBase.h.

+ +
+
+

Member Function Documentation

+ +

◆ getPtr()

+ +
+
+ + + + + +
+ + + + + + + +
FilterPtr FilterBase::getPtr ()
+
+inline
+
+ +

systematic way to share FilterPtr to control class

+
Returns
FilterPtr
+
+ +

Definition at line 31 of file FilterBase.h.

+ +
+
+ +

◆ init()

+ +
+
+ + + + + +
+ + + + + + + + +
virtual void FilterBase::init (const std::vector< double > & X0)
+
+pure virtual
+
+ +

Makes the current estimate of the state of the system start out being the same as the true state.

+
Parameters
+ + +
X0A vector of initial values for the state estimate.
+
+
+
+ +

Implemented in ComplementaryFilter, and bebop2::ExtendedKalmanFilter.

+ +
+
+ +

◆ update()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
virtual void FilterBase::update (const std::vector< double > & obs,
std::vector< double > & result 
)
+
+pure virtual
+
+ +

Updated state is calculated and stored.

+
Parameters
+ + + +
obsA vector of measured values
resultA vector to store the update state estimate
+
+
+ +

Implemented in ComplementaryFilter, and bebop2::ExtendedKalmanFilter.

+ +
+
+

Member Data Documentation

+ +

◆ X_

+ +
+
+ + + + + +
+ + + + +
std::vector<double> FilterBase::X_
+
+protected
+
+ +

Estimated state of the system.

+ +

Definition at line 45 of file FilterBase.h.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/html/class_filter_base.png b/docs/html/classFilterBase.png similarity index 100% rename from doxygen/html/class_filter_base.png rename to docs/html/classFilterBase.png diff --git a/docs/html/classLoggerCSV-members.html b/docs/html/classLoggerCSV-members.html new file mode 100644 index 0000000..1bff9e2 --- /dev/null +++ b/docs/html/classLoggerCSV-members.html @@ -0,0 +1,91 @@ + + + + + + + +airlib: Member List + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
LoggerCSV Member List
+
+
+ +

This is the complete list of members for LoggerCSV, including all inherited members.

+ + + + + + + + +
addHeader(const std::vector< std::string > &data)LoggerCSVinline
addRow(const std::vector< T > &data)LoggerCSVinline
getTimestamp()LoggerCSVinline
LoggerCSV()LoggerCSVinline
LoggerCSV(const std::vector< std::string > &header)LoggerCSVinline
LoggerCSV(const std::vector< std::string > &header, const int frequency)LoggerCSVinlineexplicit
~LoggerCSV()LoggerCSVinline
+ + + + diff --git a/docs/html/classLoggerCSV.html b/docs/html/classLoggerCSV.html new file mode 100644 index 0000000..12e1e02 --- /dev/null +++ b/docs/html/classLoggerCSV.html @@ -0,0 +1,343 @@ + + + + + + + +airlib: LoggerCSV Class Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
+Public Member Functions | +List of all members
+
LoggerCSV Class Reference
+
+
+ +

This class allows us to easily log information to a CSV file format. + More...

+ +

#include <LoggerCSV.h>

+ + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 LoggerCSV ()
 This is a default contructor without st.pop_back();header. One can manually add header file using addHeader function.
 
 LoggerCSV (const std::vector< std::string > &header)
 This constructor is used to create a csv file with header.
 
 LoggerCSV (const std::vector< std::string > &header, const int frequency)
 This constructor is used to to record data row at different frequency than sensor frequency whenever required.
 
 ~LoggerCSV ()
 When this class will be distructed, we will write the logger values from ROM to a csv file on the hard drive.
 
std::string getTimestamp ()
 This function is used to generate unique name for a file with timestamp.
 
void addHeader (const std::vector< std::string > &data)
 
template<typename T >
void addRow (const std::vector< T > &data)
 
+

Detailed Description

+

This class allows us to easily log information to a CSV file format.

+ +

Definition at line 14 of file LoggerCSV.h.

+

Constructor & Destructor Documentation

+ +

◆ LoggerCSV() [1/3]

+ +
+
+ + + + + +
+ + + + + + + +
LoggerCSV::LoggerCSV ()
+
+inline
+
+ +

This is a default contructor without st.pop_back();header. One can manually add header file using addHeader function.

+ +

Definition at line 21 of file LoggerCSV.h.

+ +
+
+ +

◆ LoggerCSV() [2/3]

+ +
+
+ + + + + +
+ + + + + + + + +
LoggerCSV::LoggerCSV (const std::vector< std::string > & header)
+
+inline
+
+ +

This constructor is used to create a csv file with header.

+ +

Definition at line 28 of file LoggerCSV.h.

+ +
+
+ +

◆ LoggerCSV() [3/3]

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
LoggerCSV::LoggerCSV (const std::vector< std::string > & header,
const int frequency 
)
+
+inlineexplicit
+
+ +

This constructor is used to to record data row at different frequency than sensor frequency whenever required.

+

Initiates last update time 1 min later to write data row and write time only depends on actual data not header

+

calculates the pause time in millisecond between two data rows

+ +

Definition at line 36 of file LoggerCSV.h.

+ +
+
+ +

◆ ~LoggerCSV()

+ +
+
+ + + + + +
+ + + + + + + +
LoggerCSV::~LoggerCSV ()
+
+inline
+
+ +

When this class will be distructed, we will write the logger values from ROM to a csv file on the hard drive.

+

Removes last new line from the string

+ +

Definition at line 50 of file LoggerCSV.h.

+ +
+
+

Member Function Documentation

+ +

◆ addHeader()

+ +
+
+ + + + + +
+ + + + + + + + +
void LoggerCSV::addHeader (const std::vector< std::string > & data)
+
+inline
+
+ +

Definition at line 79 of file LoggerCSV.h.

+ +
+
+ +

◆ addRow()

+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + + +
void LoggerCSV::addRow (const std::vector< T > & data)
+
+inline
+
+

If timer is enabled then it discards the data point based on the pause limit

+

If header is present then this checks the number of columns match with header column

+

This will store the data into RAM using stringstream

+ +

Definition at line 87 of file LoggerCSV.h.

+ +
+
+ +

◆ getTimestamp()

+ +
+
+ + + + + +
+ + + + + + + +
std::string LoggerCSV::getTimestamp ()
+
+inline
+
+ +

This function is used to generate unique name for a file with timestamp.

+ +

Definition at line 69 of file LoggerCSV.h.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/docs/html/classMvn-members.html b/docs/html/classMvn-members.html new file mode 100644 index 0000000..8fa1e67 --- /dev/null +++ b/docs/html/classMvn-members.html @@ -0,0 +1,87 @@ + + + + + + + +airlib: Member List + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
Mvn Member List
+
+
+ +

This is the complete list of members for Mvn, including all inherited members.

+ + + + +
Mvn(const TagMap::single_landmark_s &landmark, const std::vector< double > &std)Mvninline
pdf(const T &obs_m) constMvninline
~Mvn()Mvninline
+ + + + diff --git a/docs/html/classMvn.html b/docs/html/classMvn.html new file mode 100644 index 0000000..2e005c9 --- /dev/null +++ b/docs/html/classMvn.html @@ -0,0 +1,220 @@ + + + + + + + +airlib: Mvn Class Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
+Public Member Functions | +List of all members
+
Mvn Class Reference
+
+
+ +

initializes the mean and covariance matrix for the distribution. The mean and covariance matrix are used in the calculation along with the observation passed to the pdf function. + More...

+ +

#include <particle_filter.h>

+ + + + + + + + + + + + +

+Public Member Functions

 Mvn (const TagMap::single_landmark_s &landmark, const std::vector< double > &std)
 Constructo.
 
 ~Mvn ()
 Deconstructor.
 
template<typename T >
double pdf (const T &obs_m) const
 Calculates the probability density function value for a given observation.
 
+

Detailed Description

+

initializes the mean and covariance matrix for the distribution. The mean and covariance matrix are used in the calculation along with the observation passed to the pdf function.

+ +

Definition at line 41 of file particle_filter.h.

+

Constructor & Destructor Documentation

+ +

◆ Mvn()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Mvn::Mvn (const TagMap::single_landmark_slandmark,
const std::vector< double > & std 
)
+
+inline
+
+ +

Constructo.

+
Parameters
+ + + +
landmarkLandmark
stdArray of dimension 3 [standard deviation of x [m], standard deviation of y [m] standard deviation of yaw [rad]
+
+
+ +

Definition at line 47 of file particle_filter.h.

+ +
+
+ +

◆ ~Mvn()

+ +
+
+ + + + + +
+ + + + + + + +
Mvn::~Mvn ()
+
+inline
+
+ +

Deconstructor.

+ +

Definition at line 68 of file particle_filter.h.

+ +
+
+

Member Function Documentation

+ +

◆ pdf()

+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + + +
double Mvn::pdf (const T & obs_m) const
+
+inline
+
+ +

Calculates the probability density function value for a given observation.

+ +

Definition at line 74 of file particle_filter.h.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/docs/html/classParticleFilter-members.html b/docs/html/classParticleFilter-members.html new file mode 100644 index 0000000..97ad33c --- /dev/null +++ b/docs/html/classParticleFilter-members.html @@ -0,0 +1,99 @@ + + + + + + + +airlib: Member List + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
ParticleFilter Member List
+
+
+ +

This is the complete list of members for ParticleFilter, including all inherited members.

+ + + + + + + + + + + + + + + + +
dataAssociation(std::vector< LandmarkObs > predicted, std::vector< LandmarkObs > &observations)ParticleFilter
dist(double x1, double y1, double z1, double x2, double y2, double z2)ParticleFilterinlineprotected
getError(double gt_x, double gt_y, double gt_z, double gt_theta, double pf_x, double pf_y, double pf_z, double pf_theta)ParticleFilterinlineprotected
init(const std::vector< double > &x0, const std::vector< double > &std)ParticleFilter
initialized() constParticleFilterinline
operator()(std::vector< double > &state)ParticleFilter
ParticleFilter(int num_particles, const TagMap &tagMap, double delta_t)ParticleFilterinline
particlesParticleFilter
prediction(double delta_t, const std::vector< double > &std_pos, const Twist *cmd)ParticleFilter
resample()ParticleFilter
update(const std::vector< double > &obs, std::vector< double > &result)ParticleFilter
update_cmd(Twist *cmd)ParticleFilterinline
updateWeights(double sensor_range, const std::vector< double > &std_landmark, std::vector< LandmarkObs > observations, TagMap map_landmarks)ParticleFilter
write(std::string filename)ParticleFilter
~ParticleFilter()ParticleFilterinline
+ + + + diff --git a/docs/html/classParticleFilter.html b/docs/html/classParticleFilter.html new file mode 100644 index 0000000..3bbee2f --- /dev/null +++ b/docs/html/classParticleFilter.html @@ -0,0 +1,696 @@ + + + + + + + +airlib: ParticleFilter Class Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
+Public Member Functions | +Public Attributes | +Protected Member Functions | +List of all members
+
ParticleFilter Class Reference
+
+
+ +

initializing particles to Gaussian distribution around first position and then Predicts the state for the next time step using the process model. + More...

+ +

#include <particle_filter.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 ParticleFilter (int num_particles, const TagMap &tagMap, double delta_t)
 
void operator() (std::vector< double > &state)
 
 ~ParticleFilter ()
 
void update_cmd (Twist *cmd)
 
void update (const std::vector< double > &obs, std::vector< double > &result)
 
void init (const std::vector< double > &x0, const std::vector< double > &std)
 Init Initializes particle filter by initializing particles to Gaussian distribution around first position and all the weights to 1.
 
void prediction (double delta_t, const std::vector< double > &std_pos, const Twist *cmd)
 
void dataAssociation (std::vector< LandmarkObs > predicted, std::vector< LandmarkObs > &observations)
 
void updateWeights (double sensor_range, const std::vector< double > &std_landmark, std::vector< LandmarkObs > observations, TagMap map_landmarks)
 
void resample ()
 
void write (std::string filename)
 
const bool initialized () const
 
+ + + + +

+Public Attributes

std::vector< Particleparticles
 Set of current particles.
 
+ + + + + +

+Protected Member Functions

double dist (double x1, double y1, double z1, double x2, double y2, double z2)
 
double * getError (double gt_x, double gt_y, double gt_z, double gt_theta, double pf_x, double pf_y, double pf_z, double pf_theta)
 
+

Detailed Description

+

initializing particles to Gaussian distribution around first position and then Predicts the state for the next time step using the process model.

+

Updates the weights for each particle based on the likelihood of the observed measurements following the resampling from the updated set of particles to form the new set of particles and returns whether particle filter has been initliazed or not.

+ +

Definition at line 141 of file particle_filter.h.

+

Constructor & Destructor Documentation

+ +

◆ ParticleFilter()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
ParticleFilter::ParticleFilter (int num_particles,
const TagMaptagMap,
double delta_t 
)
+
+inline
+
+

Constructor of ParticleFilter class.

Parameters
+ + +
MNumber of particles
+
+
+ +

Definition at line 172 of file particle_filter.h.

+ +
+
+ +

◆ ~ParticleFilter()

+ +
+
+ + + + + +
+ + + + + + + +
ParticleFilter::~ParticleFilter ()
+
+inline
+
+ +

Definition at line 177 of file particle_filter.h.

+ +
+
+

Member Function Documentation

+ +

◆ dataAssociation()

+ +
+
+ + + + + + + + + + + + + + + + + + +
void ParticleFilter::dataAssociation (std::vector< LandmarkObspredicted,
std::vector< LandmarkObs > & observations 
)
+
+

dataAssociation Finds which observations correspond to which landmarks (likely by using a nearest-neighbors data association).

Parameters
+ + + +
predictedVector of predicted landmark observations
observationsVector of landmark observations
+
+
+ +

Definition at line 102 of file particle_filter.cpp.

+ +
+
+ +

◆ dist()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
double ParticleFilter::dist (double x1,
double y1,
double z1,
double x2,
double y2,
double z2 
)
+
+inlineprotected
+
+ +

Definition at line 261 of file particle_filter.h.

+ +
+
+ +

◆ getError()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
double * ParticleFilter::getError (double gt_x,
double gt_y,
double gt_z,
double gt_theta,
double pf_x,
double pf_y,
double pf_z,
double pf_theta 
)
+
+inlineprotected
+
+ +

Definition at line 265 of file particle_filter.h.

+ +
+
+ +

◆ init()

+ +
+
+ + + + + + + + + + + + + + + + + + +
void ParticleFilter::init (const std::vector< double > & x0,
const std::vector< double > & std 
)
+
+ +

Init Initializes particle filter by initializing particles to Gaussian distribution around first position and all the weights to 1.

+
Parameters
+ + + + + +
xInitial x position [m] (simulated estimate from GPS)
yInitial y position [m]
thetaInitial orientation [rad]
std[]Array of dimension 3 [standard deviation of x [m], standard deviation of y [m] standard deviation of yaw [rad]]
+
+
+ +

Definition at line 16 of file particle_filter.cpp.

+ +
+
+ +

◆ initialized()

+ +
+
+ + + + + +
+ + + + + + + +
const bool ParticleFilter::initialized () const
+
+inline
+
+

initialized Returns whether particle filter is initialized yet or not.

+ +

Definition at line 248 of file particle_filter.h.

+ +
+
+ +

◆ operator()()

+ +
+
+ + + + + + + + +
void ParticleFilter::operator() (std::vector< double > & state)
+
+ +

Definition at line 292 of file particle_filter.cpp.

+ +
+
+ +

◆ prediction()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void ParticleFilter::prediction (double delta_t,
const std::vector< double > & std_pos,
const Twist * cmd 
)
+
+

prediction() method Predicts the state for the next time step using the process model.

Parameters
+ + + + + +
delta_tTime between time step t and t+1 in measurements [s]
std_pos[]Array of dimension 3 [standard deviation of x [m], standard deviation of y [m] standard deviation of yaw [rad]]
velocityVelocity of car from t to t+1 [m/s]
yaw_rateYaw rate of car from t to t+1 [rad/s]
+
+
+ +

Definition at line 64 of file particle_filter.cpp.

+ +
+
+ +

◆ resample()

+ +
+
+ + + + + + + +
void ParticleFilter::resample ()
+
+

resample Resamples from the updated set of particles to form the new set of particles.

+ +

Definition at line 194 of file particle_filter.cpp.

+ +
+
+ +

◆ update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
void ParticleFilter::update (const std::vector< double > & obs,
std::vector< double > & result 
)
+
+ +

Definition at line 224 of file particle_filter.cpp.

+ +
+
+ +

◆ update_cmd()

+ +
+
+ + + + + +
+ + + + + + + + +
void ParticleFilter::update_cmd (Twist * cmd)
+
+inline
+
+ +

Definition at line 182 of file particle_filter.h.

+ +
+
+ +

◆ updateWeights()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void ParticleFilter::updateWeights (double sensor_range,
const std::vector< double > & std_landmark,
std::vector< LandmarkObsobservations,
TagMap map_landmarks 
)
+
+

updateWeights Updates the weights for each particle based on the likelihood of the observed measurements.

Parameters
+ + + + + +
sensor_rangeRange [m] of sensor
std_landmark[]Array of dimension 2 [standard deviation of range [m], standard deviation of bearing [rad]]
observationsVector of landmark observations
mapMap class containing map landmarks
+
+
+ +

Definition at line 124 of file particle_filter.cpp.

+ +
+
+ +

◆ write()

+ +
+
+ + + + + + + + +
void ParticleFilter::write (std::string filename)
+
+ +

Definition at line 214 of file particle_filter.cpp.

+ +
+
+

Member Data Documentation

+ +

◆ particles

+ +
+
+ + + + +
std::vector<Particle> ParticleFilter::particles
+
+ +

Set of current particles.

+ +

Definition at line 168 of file particle_filter.h.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/classSensorBase-members.html b/docs/html/classSensorBase-members.html new file mode 100644 index 0000000..1bd166d --- /dev/null +++ b/docs/html/classSensorBase-members.html @@ -0,0 +1,88 @@ + + + + + + + +airlib: Member List + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
SensorBase Member List
+
+
+ +

This is the complete list of members for SensorBase, including all inherited members.

+ + + + + +
empty()=0SensorBasepure virtual
getPtr()SensorBaseinline
operator()(std::vector< double > &result)=0SensorBasepure virtual
publish_tf(const std::vector< double > &state)SensorBaseinline
+ + + + diff --git a/docs/html/classSensorBase.html b/docs/html/classSensorBase.html new file mode 100644 index 0000000..4b25599 --- /dev/null +++ b/docs/html/classSensorBase.html @@ -0,0 +1,267 @@ + + + + + + + +airlib: SensorBase Class Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
+Public Member Functions | +List of all members
+
SensorBase Class Referenceabstract
+
+
+ +

This class provides a conection to acquire internal state vector. + More...

+ +

#include <SensorBase.h>

+
+Inheritance diagram for SensorBase:
+
+
+ + +ApriltagLandmarks +bebop2::DummyState + +
+ + + + + + + + + + + + + + +

+Public Member Functions

SensorPtr getPtr ()
 systematic way to share SensorPtr to control class
 
virtual void operator() (std::vector< double > &result)=0
 This is an interface to access to the internal state vector so that other modules can do their computation.
 
virtual bool empty ()=0
 This is an interface to check whether internal state vector is empty or not so that we can safely read internal state vector.
 
void publish_tf (const std::vector< double > &state)
 Publish robot transformation so that we can visualize it in RVIZ.
+ tf::TransformBroadcaster m_br; variable does not depends of NodeHandle. Therefore we can implement publish_tf in this abstract class.
 
+

Detailed Description

+

This class provides a conection to acquire internal state vector.

+

so that other components required for the bebop to operate successfully can do estimation and calculation. It also publishes the drone's positon and transformation so that we can picture it in a graphical interface such as RVIZ.
+

+ +

Definition at line 22 of file SensorBase.h.

+

Member Function Documentation

+ +

◆ empty()

+ +
+
+ + + + + +
+ + + + + + + +
virtual bool SensorBase::empty ()
+
+pure virtual
+
+ +

This is an interface to check whether internal state vector is empty or not so that we can safely read internal state vector.

+
Returns
true if internal state vector has not been populated yet
+
+false if internal state vector has been initialized
+
Note
previous void operator()(std::vector<double>& result) depends on it
+ +

Implemented in ApriltagLandmarks, and bebop2::DummyState.

+ +
+
+ +

◆ getPtr()

+ +
+
+ + + + + +
+ + + + + + + +
SensorPtr SensorBase::getPtr ()
+
+inline
+
+ +

systematic way to share SensorPtr to control class

+
Returns
SensorPtr
+
+ +

Definition at line 27 of file SensorBase.h.

+ +
+
+ +

◆ operator()()

+ +
+
+ + + + + +
+ + + + + + + + +
virtual void SensorBase::operator() (std::vector< double > & result)
+
+pure virtual
+
+ +

This is an interface to access to the internal state vector so that other modules can do their computation.

+
Note
this interface depends on bool empty()
+
+
Parameters
+ + +
resultcopy internal state vector to result vector
+
+
+ +

Implemented in ApriltagLandmarks, and bebop2::DummyState.

+ +
+
+ +

◆ publish_tf()

+ +
+
+ + + + + +
+ + + + + + + + +
void SensorBase::publish_tf (const std::vector< double > & state)
+
+inline
+
+ +

Publish robot transformation so that we can visualize it in RVIZ.
+ tf::TransformBroadcaster m_br; variable does not depends of NodeHandle. Therefore we can implement publish_tf in this abstract class.

+
Parameters
+ + +
statevector must have at least 4 parameters [x, y, z, yaw]
+
+
+
Returns
broadcast map to robot tf
+
Note
This function depends on private vairable tf::TransformBroadcaster m_br;
+ +

Definition at line 53 of file SensorBase.h.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/html/class_sensor_base.png b/docs/html/classSensorBase.png similarity index 100% rename from doxygen/html/class_sensor_base.png rename to docs/html/classSensorBase.png diff --git a/docs/html/classTagMap-members.html b/docs/html/classTagMap-members.html new file mode 100644 index 0000000..988c2eb --- /dev/null +++ b/docs/html/classTagMap-members.html @@ -0,0 +1,85 @@ + + + + + + + +airlib: Member List + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
TagMap Member List
+
+
+ +

This is the complete list of members for TagMap, including all inherited members.

+ + +
landmark_listTagMap
+ + + + diff --git a/docs/html/classTagMap.html b/docs/html/classTagMap.html new file mode 100644 index 0000000..fcfa437 --- /dev/null +++ b/docs/html/classTagMap.html @@ -0,0 +1,129 @@ + + + + + + + +airlib: TagMap Class Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
+Classes | +Public Attributes | +List of all members
+
TagMap Class Reference
+
+
+ +

Data structure to store information about landmarks in a map. + More...

+ +

#include <particle_filter.h>

+ + + + + +

+Classes

struct  single_landmark_s
 structure holds information about each individual landmark, including its ID, and its x, y, and z positions in the global coordinate system. More...
 
+ + + + +

+Public Attributes

std::vector< single_landmark_slandmark_list
 List of landmarks in the map.
 
+

Detailed Description

+

Data structure to store information about landmarks in a map.

+ +

Definition at line 19 of file particle_filter.h.

+

Member Data Documentation

+ +

◆ landmark_list

+ +
+
+ + + + +
std::vector<single_landmark_s> TagMap::landmark_list
+
+ +

List of landmarks in the map.

+ +

Definition at line 35 of file particle_filter.h.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/doxygen/html/class_apriltag_landmarks-members.html b/docs/html/class_apriltag_landmarks-members.html similarity index 100% rename from doxygen/html/class_apriltag_landmarks-members.html rename to docs/html/class_apriltag_landmarks-members.html diff --git a/doxygen/html/class_apriltag_landmarks.html b/docs/html/class_apriltag_landmarks.html similarity index 100% rename from doxygen/html/class_apriltag_landmarks.html rename to docs/html/class_apriltag_landmarks.html diff --git a/docs/html/class_apriltag_landmarks.png b/docs/html/class_apriltag_landmarks.png new file mode 100644 index 0000000..14065fc Binary files /dev/null and b/docs/html/class_apriltag_landmarks.png differ diff --git a/doxygen/html/class_complementary_filter-members.html b/docs/html/class_complementary_filter-members.html similarity index 100% rename from doxygen/html/class_complementary_filter-members.html rename to docs/html/class_complementary_filter-members.html diff --git a/doxygen/html/class_complementary_filter.html b/docs/html/class_complementary_filter.html similarity index 100% rename from doxygen/html/class_complementary_filter.html rename to docs/html/class_complementary_filter.html diff --git a/docs/html/class_complementary_filter.png b/docs/html/class_complementary_filter.png new file mode 100644 index 0000000..3e3ba37 Binary files /dev/null and b/docs/html/class_complementary_filter.png differ diff --git a/doxygen/html/class_filter_base-members.html b/docs/html/class_filter_base-members.html similarity index 100% rename from doxygen/html/class_filter_base-members.html rename to docs/html/class_filter_base-members.html diff --git a/doxygen/html/class_filter_base.html b/docs/html/class_filter_base.html similarity index 100% rename from doxygen/html/class_filter_base.html rename to docs/html/class_filter_base.html diff --git a/docs/html/class_filter_base.png b/docs/html/class_filter_base.png new file mode 100644 index 0000000..11e2ca3 Binary files /dev/null and b/docs/html/class_filter_base.png differ diff --git a/doxygen/html/class_logger_c_s_v-members.html b/docs/html/class_logger_c_s_v-members.html similarity index 100% rename from doxygen/html/class_logger_c_s_v-members.html rename to docs/html/class_logger_c_s_v-members.html diff --git a/doxygen/html/class_logger_c_s_v.html b/docs/html/class_logger_c_s_v.html similarity index 100% rename from doxygen/html/class_logger_c_s_v.html rename to docs/html/class_logger_c_s_v.html diff --git a/doxygen/html/class_mvn-members.html b/docs/html/class_mvn-members.html similarity index 100% rename from doxygen/html/class_mvn-members.html rename to docs/html/class_mvn-members.html diff --git a/doxygen/html/class_mvn.html b/docs/html/class_mvn.html similarity index 100% rename from doxygen/html/class_mvn.html rename to docs/html/class_mvn.html diff --git a/doxygen/html/class_particle_filter-members.html b/docs/html/class_particle_filter-members.html similarity index 100% rename from doxygen/html/class_particle_filter-members.html rename to docs/html/class_particle_filter-members.html diff --git a/doxygen/html/class_particle_filter.html b/docs/html/class_particle_filter.html similarity index 100% rename from doxygen/html/class_particle_filter.html rename to docs/html/class_particle_filter.html diff --git a/doxygen/html/class_sensor_base-members.html b/docs/html/class_sensor_base-members.html similarity index 100% rename from doxygen/html/class_sensor_base-members.html rename to docs/html/class_sensor_base-members.html diff --git a/doxygen/html/class_sensor_base.html b/docs/html/class_sensor_base.html similarity index 100% rename from doxygen/html/class_sensor_base.html rename to docs/html/class_sensor_base.html diff --git a/docs/html/class_sensor_base.png b/docs/html/class_sensor_base.png new file mode 100644 index 0000000..c8ac5e8 Binary files /dev/null and b/docs/html/class_sensor_base.png differ diff --git a/doxygen/html/class_state_space-members.html b/docs/html/class_state_space-members.html similarity index 100% rename from doxygen/html/class_state_space-members.html rename to docs/html/class_state_space-members.html diff --git a/doxygen/html/class_state_space.html b/docs/html/class_state_space.html similarity index 100% rename from doxygen/html/class_state_space.html rename to docs/html/class_state_space.html diff --git a/doxygen/html/class_tag_map-members.html b/docs/html/class_tag_map-members.html similarity index 100% rename from doxygen/html/class_tag_map-members.html rename to docs/html/class_tag_map-members.html diff --git a/doxygen/html/class_tag_map.html b/docs/html/class_tag_map.html similarity index 100% rename from doxygen/html/class_tag_map.html rename to docs/html/class_tag_map.html diff --git a/docs/html/classbebop2_1_1ControlViz-members.html b/docs/html/classbebop2_1_1ControlViz-members.html new file mode 100644 index 0000000..fb31ad9 --- /dev/null +++ b/docs/html/classbebop2_1_1ControlViz-members.html @@ -0,0 +1,93 @@ + + + + + + + +airlib: Member List + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
bebop2::ControlViz Member List
+
+
+ +

This is the complete list of members for bebop2::ControlViz, including all inherited members.

+ + + + + + +
ControlViz(ros::NodeHandle &nh)bebop2::ControlVizexplicit
set_marker_color(const MARKER_COLOR &color, visualization_msgs::Marker &msg)bebop2::ControlVizprotected
set_marker_from_pose(const tf::Transform &pose, visualization_msgs::Marker &msg)bebop2::ControlVizprotected
setDrone(const tf::Transform &pose)bebop2::ControlViz
update(const tf::Transform &pose, const MARKER_COLOR &color)bebop2::ControlViz
+ + + + diff --git a/docs/html/classbebop2_1_1ControlViz.html b/docs/html/classbebop2_1_1ControlViz.html new file mode 100644 index 0000000..19e8647 --- /dev/null +++ b/docs/html/classbebop2_1_1ControlViz.html @@ -0,0 +1,326 @@ + + + + + + + +airlib: bebop2::ControlViz Class Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +Protected Member Functions | +List of all members
+
bebop2::ControlViz Class Reference
+
+
+ +

This class helps in the 3D visualization of data being rendered. It receives the updated position and orientation of the drone and sends points and lines to a graphical interface. Hence, visualizes the movement, position, orientation and behaviors of the drone. + More...

+ +

#include <ControlViz.h>

+ + + + + + + + + + + +

+Public Member Functions

 ControlViz (ros::NodeHandle &nh)
 Publishes messages through /bebop2/goal topic.
 
void setDrone (const tf::Transform &pose)
 This function starts and slightly lifts the drone. As a result sets the Marker from the pose parameter and also sets the color by invoking the set_marker_from_pose() and set_marker_color() functions.
 
void update (const tf::Transform &pose, const MARKER_COLOR &color)
 This functions updates the path and the color of the path of the robot. It also publishes the messages from the visualization_msgs::Marker. Lastly, it sets the Marker object type to be a sphere.
 
+ + + + + + + +

+Protected Member Functions

void set_marker_from_pose (const tf::Transform &pose, visualization_msgs::Marker &msg)
 Receives the current position of the drone and uses that position to populate the point position and orientation of the marker messages. The marker messages will be used by a graphical interface to visualize the movement of the robot.
 
void set_marker_color (const MARKER_COLOR &color, visualization_msgs::Marker &msg)
 sets different colors for different flights and paths of the drone for better understanding.
 
+

Detailed Description

+

This class helps in the 3D visualization of data being rendered. It receives the updated position and orientation of the drone and sends points and lines to a graphical interface. Hence, visualizes the movement, position, orientation and behaviors of the drone.

+ +

Definition at line 25 of file ControlViz.h.

+

Constructor & Destructor Documentation

+ +

◆ ControlViz()

+ +
+
+ + + + + +
+ + + + + + + + +
bebop2::ControlViz::ControlViz (ros::NodeHandle & nh)
+
+explicit
+
+ +

Publishes messages through /bebop2/goal topic.

+
Parameters
+ + +
nhROS Node Handle which deals with messages.
+
+
+ +

Definition at line 8 of file ControlViz.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ set_marker_color()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void bebop2::ControlViz::set_marker_color (const MARKER_COLORcolor,
visualization_msgs::Marker & msg 
)
+
+protected
+
+ +

sets different colors for different flights and paths of the drone for better understanding.

+
Parameters
+ + + +
colorcolor of the path
msgis Marker object same as the parameter msg in set_marker_from_pose() and has attributes to set color as well.
+
+
+ +

Definition at line 45 of file ControlViz.cpp.

+ +
+
+ +

◆ set_marker_from_pose()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void bebop2::ControlViz::set_marker_from_pose (const tf::Transform & pose,
visualization_msgs::Marker & msg 
)
+
+protected
+
+ +

Receives the current position of the drone and uses that position to populate the point position and orientation of the marker messages. The marker messages will be used by a graphical interface to visualize the movement of the robot.

+
Parameters
+ + + +
poseRobot's pose having a /map frame.
msgis a Marker object from visualization msgs that has attributes like position, orientation etc.
+
+
+ +

Definition at line 16 of file ControlViz.cpp.

+ +
+
+ +

◆ setDrone()

+ +
+
+ + + + + + + + +
void bebop2::ControlViz::setDrone (const tf::Transform & pose)
+
+ +

This function starts and slightly lifts the drone. As a result sets the Marker from the pose parameter and also sets the color by invoking the set_marker_from_pose() and set_marker_color() functions.

+
Parameters
+ + +
poseDrone's positon.
+
+
+
Note
Sets the path of the color to gray.
+ +

Definition at line 101 of file ControlViz.cpp.

+ +
+
+ +

◆ update()

+ +
+
+ + + + + + + + + + + + + + + + + + +
void bebop2::ControlViz::update (const tf::Transform & pose,
const MARKER_COLORcolor 
)
+
+ +

This functions updates the path and the color of the path of the robot. It also publishes the messages from the visualization_msgs::Marker. Lastly, it sets the Marker object type to be a sphere.

+
Parameters
+ + + +
posecurrent position of the robot.
+
colorcolor of the path in which the robot is in.
+
+
+
Note
Calls the set_marker_from_pose() and set_marker_color() functions to update the path and color.
+ +

Definition at line 91 of file ControlViz.cpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/classbebop2_1_1ControllerBase-members.html b/docs/html/classbebop2_1_1ControllerBase-members.html new file mode 100644 index 0000000..e0c45be --- /dev/null +++ b/docs/html/classbebop2_1_1ControllerBase-members.html @@ -0,0 +1,104 @@ + + + + + + + +airlib: Member List + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
bebop2::ControllerBase Member List
+
+
+ +

This is the complete list of members for bebop2::ControllerBase, including all inherited members.

+ + + + + + + + + + + + + + + + + +
ButtonState enum namebebop2::ControllerBaseprotected
compute_control(const std::vector< double > &X, const std::vector< double > &setPoints, std::vector< double > &control)=0bebop2::ControllerBaseprotectedpure virtual
CONTROL enum valuebebop2::ControllerBaseprotected
ControllerBase(StateObserverPtr mGetState, ros::NodeHandle &nh)bebop2::ControllerBaseexplicit
dt_bebop2::ControllerBaseprotected
ENGAGE enum valuebebop2::ControllerBaseprotected
goal_distance(const std::vector< double > &X, const std::vector< double > &setPoints)bebop2::ControllerBaseprotected
IDLE enum valuebebop2::ControllerBaseprotected
LAND enum valuebebop2::ControllerBaseprotected
m_buttonStatebebop2::ControllerBaseprotected
m_get_statebebop2::ControllerBaseprotected
m_goal_thresbebop2::ControllerBaseprotected
m_mubebop2::ControllerBaseprotected
m_nhbebop2::ControllerBaseprotected
publish_cmd_vel(const std::vector< double > &U)bebop2::ControllerBaseprotected
TAKEOFF enum valuebebop2::ControllerBaseprotected
+ + + + diff --git a/docs/html/classbebop2_1_1ControllerBase.html b/docs/html/classbebop2_1_1ControllerBase.html new file mode 100644 index 0000000..cf3f558 --- /dev/null +++ b/docs/html/classbebop2_1_1ControllerBase.html @@ -0,0 +1,534 @@ + + + + + + + +airlib: bebop2::ControllerBase Class Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +Protected Types | +Protected Member Functions | +Protected Attributes | +List of all members
+
bebop2::ControllerBase Class Referenceabstract
+
+
+ +

Responsible to control the position, state and rotation of the drone and also provides the code to make the robot hover. It publishes the takeoff, landing commands along with the current position of the drone and the state of the axes and buttons of the joystick controller. It also updates the state of the robot in RVIZ which is used for visaulation. + More...

+ +

#include <ControllerBase.h>

+
+Inheritance diagram for bebop2::ControllerBase:
+
+
+ + +bebop2::QuadControllerPID + +
+ + + + + +

+Public Member Functions

 ControllerBase (StateObserverPtr mGetState, ros::NodeHandle &nh)
 Subscribes to sensor_msgs/joy which reports the state of a joystick's axes and buttons. It also publishes the message of drone takeoff and landing along with the linear and angular position of the drone. The constructor is also responsible to call the appropriate functions at specifc rates that plays a role in setting the set-point at a current location. Lastly it contructs an object to send the updated pose to the RVIZ for visualization and also sets the state of the controller's button.
 
+ + + + +

+Protected Types

enum  ButtonState {
+  IDLE = 0 +, TAKEOFF +, LAND +, ENGAGE +,
+  CONTROL +
+ }
 Applications applied to control the state of the robot using Joystick controller. More...
 
+ + + + + + + + + +

+Protected Member Functions

void publish_cmd_vel (const std::vector< double > &U)
 This function sets the linear positon of the drone to all 3 linear axes and to angular z-axis and publishes the message of the current position of the drone.
 
double goal_distance (const std::vector< double > &X, const std::vector< double > &setPoints)
 This function calculates the distance between the setpoint of the drone and the current state position.
 
virtual void compute_control (const std::vector< double > &X, const std::vector< double > &setPoints, std::vector< double > &control)=0
 
+ + + + + + + + + + + + + + + + + + +

+Protected Attributes

ros::NodeHandle m_nh
 This ROS Handle attribute is used to create various publishers and subscribers which also deals with messages.
 
std::mutex m_mu
 Locks some functions for safe operations.
 
enum bebop2::ControllerBase::ButtonState m_buttonState
 
StateObserverPtr m_get_state
 This attribute gives the state of the robot.
 
double dt_
 Sample Time.
 
double m_goal_thres
 Goal region threshold.
 
+

Detailed Description

+

Responsible to control the position, state and rotation of the drone and also provides the code to make the robot hover. It publishes the takeoff, landing commands along with the current position of the drone and the state of the axes and buttons of the joystick controller. It also updates the state of the robot in RVIZ which is used for visaulation.

+ +

Definition at line 47 of file ControllerBase.h.

+

Member Enumeration Documentation

+ +

◆ ButtonState

+ +
+
+ + + + + +
+ + + + +
enum bebop2::ControllerBase::ButtonState
+
+protected
+
+ +

Applications applied to control the state of the robot using Joystick controller.

+ + + + + + +
Enumerator
IDLE 

Setpoint can be freely moved with joystick. Sphere color blue.

+
TAKEOFF 

Drone will takeoff from the ground.

+
LAND 

Drone will land.

+
ENGAGE 

Set current location as a set point (for hover). Sphere color yellow.

+
CONTROL 

Start PID controller for the current setpoint. Sphere color cyan.

+
+ +

Definition at line 80 of file ControllerBase.h.

+ +
+
+

Constructor & Destructor Documentation

+ +

◆ ControllerBase()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bebop2::ControllerBase::ControllerBase (StateObserverPtr mGetState,
ros::NodeHandle & nh 
)
+
+explicit
+
+ +

Subscribes to sensor_msgs/joy which reports the state of a joystick's axes and buttons. It also publishes the message of drone takeoff and landing along with the linear and angular position of the drone. The constructor is also responsible to call the appropriate functions at specifc rates that plays a role in setting the set-point at a current location. Lastly it contructs an object to send the updated pose to the RVIZ for visualization and also sets the state of the controller's button.

+
Parameters
+ + + +
mGetStateObtains the current state of the robot
nhUsed to create publishers and subscribes. For eg: The ControllerBase constructor publishes messages during takeoff and landing with the help of the ros::NodeHandle aka nh parameter.
+
+
+ +

Definition at line 12 of file ControllerBase.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ compute_control()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual void bebop2::ControllerBase::compute_control (const std::vector< double > & X,
const std::vector< double > & setPoints,
std::vector< double > & control 
)
+
+protectedpure virtual
+
+ +

Implemented in bebop2::QuadControllerPID.

+ +
+
+ +

◆ goal_distance()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
double bebop2::ControllerBase::goal_distance (const std::vector< double > & X,
const std::vector< double > & setPoints 
)
+
+protected
+
+ +

This function calculates the distance between the setpoint of the drone and the current state position.

+
Parameters
+ + + +
Xis an array of vectors of data type double representing the present position of the drone.
setPointsis an array of vectors representing the commanded position.
+
+
+
Returns
Errors between the current and commanded position of the robot.
+ +

Definition at line 159 of file ControllerBase.cpp.

+ +
+
+ +

◆ publish_cmd_vel()

+ +
+
+ + + + + +
+ + + + + + + + +
void bebop2::ControllerBase::publish_cmd_vel (const std::vector< double > & U)
+
+protected
+
+ +

This function sets the linear positon of the drone to all 3 linear axes and to angular z-axis and publishes the message of the current position of the drone.

+
Parameters
+ + +
Uis array of commands of size 4 which sets the above mentioned position of the drone.
+
+
+ +

Definition at line 144 of file ControllerBase.cpp.

+ +
+
+

Member Data Documentation

+ +

◆ dt_

+ +
+
+ + + + + +
+ + + + +
double bebop2::ControllerBase::dt_
+
+protected
+
+ +

Sample Time.

+ +

Definition at line 98 of file ControllerBase.h.

+ +
+
+ +

◆ m_buttonState

+ +
+
+ + + + + +
+ + + + +
enum bebop2::ControllerBase::ButtonState bebop2::ControllerBase::m_buttonState
+
+protected
+
+ +
+
+ +

◆ m_get_state

+ +
+
+ + + + + +
+ + + + +
StateObserverPtr bebop2::ControllerBase::m_get_state
+
+protected
+
+ +

This attribute gives the state of the robot.

+ +

Definition at line 94 of file ControllerBase.h.

+ +
+
+ +

◆ m_goal_thres

+ +
+
+ + + + + +
+ + + + +
double bebop2::ControllerBase::m_goal_thres
+
+protected
+
+ +

Goal region threshold.

+ +

Definition at line 100 of file ControllerBase.h.

+ +
+
+ +

◆ m_mu

+ +
+
+ + + + + +
+ + + + +
std::mutex bebop2::ControllerBase::m_mu
+
+protected
+
+ +

Locks some functions for safe operations.

+ +

Definition at line 78 of file ControllerBase.h.

+ +
+
+ +

◆ m_nh

+ +
+
+ + + + + +
+ + + + +
ros::NodeHandle bebop2::ControllerBase::m_nh
+
+protected
+
+ +

This ROS Handle attribute is used to create various publishers and subscribers which also deals with messages.

+ +

Definition at line 76 of file ControllerBase.h.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/doxygen/html/classbebop2_1_1_controller_base.png b/docs/html/classbebop2_1_1ControllerBase.png similarity index 100% rename from doxygen/html/classbebop2_1_1_controller_base.png rename to docs/html/classbebop2_1_1ControllerBase.png diff --git a/docs/html/classbebop2_1_1DummyState-members.html b/docs/html/classbebop2_1_1DummyState-members.html new file mode 100644 index 0000000..3d1a180 --- /dev/null +++ b/docs/html/classbebop2_1_1DummyState-members.html @@ -0,0 +1,96 @@ + + + + + + + +airlib: Member List + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
bebop2::DummyState Member List
+
+
+ +

This is the complete list of members for bebop2::DummyState, including all inherited members.

+ + + + + + + + + +
cmd_vel_callback(const geometry_msgs::Twist::ConstPtr &msg)bebop2::DummyStateprotected
DummyState(ros::NodeHandle &nh, bool noisy_reading)bebop2::DummyState
empty()bebop2::DummyStatevirtual
getPtr()SensorBaseinline
land_callback(const std_msgs::Empty::ConstPtr &msg)bebop2::DummyStateprotected
operator()(std::vector< double > &state)bebop2::DummyStatevirtual
publish_tf(const std::vector< double > &state)SensorBaseinline
takeoff_callback(const std_msgs::Empty::ConstPtr &msg)bebop2::DummyStateprotected
+ + + + diff --git a/docs/html/classbebop2_1_1DummyState.html b/docs/html/classbebop2_1_1DummyState.html new file mode 100644 index 0000000..5473592 --- /dev/null +++ b/docs/html/classbebop2_1_1DummyState.html @@ -0,0 +1,374 @@ + + + + + + + +airlib: bebop2::DummyState Class Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +Protected Member Functions | +List of all members
+
bebop2::DummyState Class Reference
+
+
+ +

Dummy state creates a state space repersentation for quadrotor. + More...

+ +

#include <DummyState.h>

+
+Inheritance diagram for bebop2::DummyState:
+
+
+ + +SensorBase + +
+ + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 DummyState (ros::NodeHandle &nh, bool noisy_reading)
 Construct a new Dummy State object To simulate desired behavior from a sensor so that we can develop accurate control module.
 
void operator() (std::vector< double > &state)
 Populates the requested state vector.
 
bool empty ()
 This is an interface to check whether internal state vector is empty or not so that we can safely read internal state vector.
 
- Public Member Functions inherited from SensorBase
SensorPtr getPtr ()
 systematic way to share SensorPtr to control class
 
virtual void operator() (std::vector< double > &result)=0
 This is an interface to access to the internal state vector so that other modules can do their computation.
 
virtual bool empty ()=0
 This is an interface to check whether internal state vector is empty or not so that we can safely read internal state vector.
 
void publish_tf (const std::vector< double > &state)
 Publish robot transformation so that we can visualize it in RVIZ.
+ tf::TransformBroadcaster m_br; variable does not depends of NodeHandle. Therefore we can implement publish_tf in this abstract class.
 
+ + + + + + + + + + +

+Protected Member Functions

void takeoff_callback (const std_msgs::Empty::ConstPtr &msg)
 Joystic command to takeoff the bebop2.
 
void land_callback (const std_msgs::Empty::ConstPtr &msg)
 Joystic command to land the bebop2.
 
void cmd_vel_callback (const geometry_msgs::Twist::ConstPtr &msg)
 Joystic command to move the bebop2.
 
+

Detailed Description

+

Dummy state creates a state space repersentation for quadrotor.

+

The key idea is to initialize a state at (0, 0, 0, 0) and take joystick command to update state. To capture realistic behavior add some gaussian white noise to the state. When bebop2 takeoff from the ground it reaches 1m above from the ground origin and when it lands then z axis value is 0. This behavior can be achieved by simply subscribing takeoff and land messages. To change bebop coordinates in x and y direction subscribe cmd_vel topic and update the state based on the cmd_vel value. cmd_vel is a geometry_msg/Twist msg which provides 4 control inputs, i.e., linear.x, linear.y, linear.z, angular.z Here, we need to make a assumption that sampling time DT is a constant value.
+ Finally to integrate with our main framework, we need a public method void operator()(std::vector<double>& state) that can populate a requested state vector;

+ +

Definition at line 26 of file DummyState.h.

+

Constructor & Destructor Documentation

+ +

◆ DummyState()

+ +
+
+ + + + + + + + + + + + + + + + + + +
bebop2::DummyState::DummyState (ros::NodeHandle & nh,
bool noisy_reading 
)
+
+ +

Construct a new Dummy State object To simulate desired behavior from a sensor so that we can develop accurate control module.

+
Parameters
+ + + +
nhros NodeHandle to deal with various messages
noisy_readingan option to make a realistic sensor reading: if true white noise will be added to the output
+
+
+ +

Definition at line 6 of file DummyState.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ cmd_vel_callback()

+ +
+
+ + + + + +
+ + + + + + + + +
void bebop2::DummyState::cmd_vel_callback (const geometry_msgs::Twist::ConstPtr & msg)
+
+protected
+
+ +

Joystic command to move the bebop2.

+
Parameters
+ + +
msgpublish Twist message to the topic cmd_vel
+
+
+ +

Definition at line 48 of file DummyState.cpp.

+ +
+
+ +

◆ empty()

+ +
+
+ + + + + +
+ + + + + + + +
bool bebop2::DummyState::empty ()
+
+virtual
+
+ +

This is an interface to check whether internal state vector is empty or not so that we can safely read internal state vector.

+
Returns
true if internal state vector has not been populated yet
+
+false if internal state vector has been initialized
+
Note
previous void operator()(std::vector<double>& result) depends on it
+ +

Implements SensorBase.

+ +

Definition at line 33 of file DummyState.cpp.

+ +
+
+ +

◆ land_callback()

+ +
+
+ + + + + +
+ + + + + + + + +
void bebop2::DummyState::land_callback (const std_msgs::Empty::ConstPtr & msg)
+
+protected
+
+ +

Joystic command to land the bebop2.

+
Parameters
+ + +
msgpublish empty message to the topic land
+
+
+ +

Definition at line 43 of file DummyState.cpp.

+ +
+
+ +

◆ operator()()

+ +
+
+ + + + + +
+ + + + + + + + +
void bebop2::DummyState::operator() (std::vector< double > & state)
+
+virtual
+
+ +

Populates the requested state vector.

+
Parameters
+ + +
stateGives the current position of the drone.
+
+
+ +

Implements SensorBase.

+ +

Definition at line 16 of file DummyState.cpp.

+ +
+
+ +

◆ takeoff_callback()

+ +
+
+ + + + + +
+ + + + + + + + +
void bebop2::DummyState::takeoff_callback (const std_msgs::Empty::ConstPtr & msg)
+
+protected
+
+ +

Joystic command to takeoff the bebop2.

+
Parameters
+ + +
msgpublish empty message to the topic takeoff
+
+
+ +

Definition at line 38 of file DummyState.cpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/doxygen/html/classbebop2_1_1_dummy_state.png b/docs/html/classbebop2_1_1DummyState.png similarity index 100% rename from doxygen/html/classbebop2_1_1_dummy_state.png rename to docs/html/classbebop2_1_1DummyState.png diff --git a/docs/html/classbebop2_1_1ExtendedKalmanFilter-members.html b/docs/html/classbebop2_1_1ExtendedKalmanFilter-members.html new file mode 100644 index 0000000..716e817 --- /dev/null +++ b/docs/html/classbebop2_1_1ExtendedKalmanFilter-members.html @@ -0,0 +1,105 @@ + + + + + + + +airlib: Member List + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
bebop2::ExtendedKalmanFilter Member List
+
+
+ +

This is the complete list of members for bebop2::ExtendedKalmanFilter, including all inherited members.

+ + + + + + + + + + + + + + + + + + +
CONTROL_DIMbebop2::ExtendedKalmanFilterprotected
DTbebop2::ExtendedKalmanFilterprotected
ExtendedKalmanFilter(const std::vector< double > &sigma_pos, double dt, int state_dim)bebop2::ExtendedKalmanFilter
FilterBase()FilterBaseinline
getPtr()FilterBaseinline
init(const std::vector< double > &X0) overridebebop2::ExtendedKalmanFiltervirtual
internal_update(const Eigen::VectorXd &z, const Eigen::VectorXd &u)bebop2::ExtendedKalmanFilterprotected
jacobF(const Eigen::VectorXd &x, const Eigen::VectorXd &u)bebop2::ExtendedKalmanFilterprotected
jacobH() constbebop2::ExtendedKalmanFilterprotected
motion_model(const Eigen::VectorXd &x, const Eigen::VectorXd &u)bebop2::ExtendedKalmanFilterprotected
observation_model(const Eigen::VectorXd &x)bebop2::ExtendedKalmanFilterprotected
operator()(std::vector< double > &state)bebop2::ExtendedKalmanFilter
STATE_DIMbebop2::ExtendedKalmanFilterprotected
update(const std::vector< double > &obs, std::vector< double > &result) overridebebop2::ExtendedKalmanFiltervirtual
update_cmd(const geometry_msgs::Twist::ConstPtr &cmd)bebop2::ExtendedKalmanFilter
X_FilterBaseprotected
~FilterBase()FilterBaseinlinevirtual
+ + + + diff --git a/docs/html/classbebop2_1_1ExtendedKalmanFilter.html b/docs/html/classbebop2_1_1ExtendedKalmanFilter.html new file mode 100644 index 0000000..d533c7a --- /dev/null +++ b/docs/html/classbebop2_1_1ExtendedKalmanFilter.html @@ -0,0 +1,634 @@ + + + + + + + +airlib: bebop2::ExtendedKalmanFilter Class Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +Protected Member Functions | +Protected Attributes | +List of all members
+
bebop2::ExtendedKalmanFilter Class Reference
+
+
+ +

The extended Kalman Filter uses an algorithm to estimate the state of the system like velocity and position of the drone by using past and possible noisy observations and current and possibly noisy measurements of that system. + More...

+ +

#include <ExtendedKalmanFilter.h>

+
+Inheritance diagram for bebop2::ExtendedKalmanFilter:
+
+
+ + +FilterBase + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 ExtendedKalmanFilter (const std::vector< double > &sigma_pos, double dt, int state_dim)
 
void init (const std::vector< double > &X0) override
 Makes the current estimate of the state of the system start out being the same as the true state.
 
void operator() (std::vector< double > &state)
 Populates it with the estimated state of the system.
 
void update_cmd (const geometry_msgs::Twist::ConstPtr &cmd)
 Updates the command velocity of the drone by changing the linear x,y,z and angular z values.
 
void update (const std::vector< double > &obs, std::vector< double > &result) override
 In this method, the input obs is converted from a std::vector to an Eigen vector z and then passed to the internal_update() method. After the internal_update method is called, the updated state estimate stored in xEst_ is copied into the output result vector.
 
- Public Member Functions inherited from FilterBase
 FilterBase ()
 Constructor.
 
virtual ~FilterBase ()
 Deconstructor.
 
FilterPtr getPtr ()
 systematic way to share FilterPtr to control class
 
virtual void init (const std::vector< double > &X0)=0
 Makes the current estimate of the state of the system start out being the same as the true state.
 
virtual void update (const std::vector< double > &obs, std::vector< double > &result)=0
 Updated state is calculated and stored.
 
+ + + + + + + + + + + + + + + +

+Protected Member Functions

Eigen::VectorXd motion_model (const Eigen::VectorXd &x, const Eigen::VectorXd &u)
 
Eigen::MatrixXd jacobF (const Eigen::VectorXd &x, const Eigen::VectorXd &u)
 Calculates the Jacobian matrix of the motion model.
 
Eigen::VectorXd observation_model (const Eigen::VectorXd &x)
 Calculates the predicted measurement values.
 
Eigen::MatrixXd jacobH () const
 Checks the linearity between the state and the measured variables.
 
void internal_update (const Eigen::VectorXd &z, const Eigen::VectorXd &u)
 The internal update step is used to update the linearized measurement model, which is used to calculate the Kalman gain. The internal transformation step involves updating the Jacobian matrix that linearizes the measurement model around the current state estimate, and the measurement noise covariance.
 
+ + + + + + + + + + + +

+Protected Attributes

double DT
 
double STATE_DIM
 
double CONTROL_DIM
 
- Protected Attributes inherited from FilterBase
std::vector< double > X_
 Estimated state of the system.
 
+

Detailed Description

+

The extended Kalman Filter uses an algorithm to estimate the state of the system like velocity and position of the drone by using past and possible noisy observations and current and possibly noisy measurements of that system.

+

It estimates the next state of the drone and corrects the estimated state with actual measurements.

+ +

Definition at line 21 of file ExtendedKalmanFilter.h.

+

Constructor & Destructor Documentation

+ +

◆ ExtendedKalmanFilter()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ExtendedKalmanFilter::ExtendedKalmanFilter (const std::vector< double > & sigma_pos,
double dt,
int state_dim 
)
+
+ +

Definition at line 9 of file ExtendedKalmanFilter.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ init()

+ +
+
+ + + + + +
+ + + + + + + + +
void ExtendedKalmanFilter::init (const std::vector< double > & X0)
+
+overridevirtual
+
+ +

Makes the current estimate of the state of the system start out being the same as the true state.

+
Parameters
+ + +
X0A vector of initial values for the state estimate.
+
+
+
+ +

Implements FilterBase.

+ +

Definition at line 109 of file ExtendedKalmanFilter.cpp.

+ +
+
+ +

◆ internal_update()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void ExtendedKalmanFilter::internal_update (const Eigen::VectorXd & z,
const Eigen::VectorXd & u 
)
+
+protected
+
+ +

The internal update step is used to update the linearized measurement model, which is used to calculate the Kalman gain. The internal transformation step involves updating the Jacobian matrix that linearizes the measurement model around the current state estimate, and the measurement noise covariance.

+
Parameters
+ + + +
zA vector of measured values. This is the measurement data that is used to update the state estimate.
uA vector of control inputs. This is the control data that is used in the motion model to predict the state estimate.
+
+
+ +

Definition at line 75 of file ExtendedKalmanFilter.cpp.

+ +
+
+ +

◆ jacobF()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Eigen::MatrixXd ExtendedKalmanFilter::jacobF (const Eigen::VectorXd & x,
const Eigen::VectorXd & u 
)
+
+protected
+
+ +

Calculates the Jacobian matrix of the motion model.

+
Parameters
+ + + +
xState variable
u
+
+
+
Returns
Returns the Jacobian matrix
+ +

Definition at line 57 of file ExtendedKalmanFilter.cpp.

+ +
+
+ +

◆ jacobH()

+ +
+
+ + + + + +
+ + + + + + + +
Eigen::MatrixXd ExtendedKalmanFilter::jacobH () const
+
+protected
+
+ +

Checks the linearity between the state and the measured variables.

+
Returns
Jacobian matrix of the observation model.
+
+ +

Definition at line 62 of file ExtendedKalmanFilter.cpp.

+ +
+
+ +

◆ motion_model()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Eigen::VectorXd ExtendedKalmanFilter::motion_model (const Eigen::VectorXd & x,
const Eigen::VectorXd & u 
)
+
+protected
+
+ +

Definition at line 39 of file ExtendedKalmanFilter.cpp.

+ +
+
+ +

◆ observation_model()

+ +
+
+ + + + + +
+ + + + + + + + +
Eigen::VectorXd ExtendedKalmanFilter::observation_model (const Eigen::VectorXd & x)
+
+protected
+
+ +

Calculates the predicted measurement values.

+
Parameters
+ + +
xState variable
+
+
+
Returns
Returns the predicted measurement values
+ +

Definition at line 69 of file ExtendedKalmanFilter.cpp.

+ +
+
+ +

◆ operator()()

+ +
+
+ + + + + + + + +
void ExtendedKalmanFilter::operator() (std::vector< double > & state)
+
+ +

Populates it with the estimated state of the system.

+
Parameters
+ + +
stateVector of tyoe double indicating the state.
+
+
+ +

Definition at line 29 of file ExtendedKalmanFilter.cpp.

+ +
+
+ +

◆ update()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void ExtendedKalmanFilter::update (const std::vector< double > & obs,
std::vector< double > & result 
)
+
+overridevirtual
+
+ +

In this method, the input obs is converted from a std::vector to an Eigen vector z and then passed to the internal_update() method. After the internal_update method is called, the updated state estimate stored in xEst_ is copied into the output result vector.

+
Parameters
+ + + +
obsA vector of measured values
resultA vector to store the update state estimate
+
+
+ +

Implements FilterBase.

+ +

Definition at line 97 of file ExtendedKalmanFilter.cpp.

+ +
+
+ +

◆ update_cmd()

+ +
+
+ + + + + + + + +
void ExtendedKalmanFilter::update_cmd (const geometry_msgs::Twist::ConstPtr & cmd)
+
+ +

Updates the command velocity of the drone by changing the linear x,y,z and angular z values.

+
Parameters
+ + +
cmdA pointer that points to the cmd_vel topic.
+
+
+
+ +

Definition at line 89 of file ExtendedKalmanFilter.cpp.

+ +
+
+

Member Data Documentation

+ +

◆ CONTROL_DIM

+ +
+
+ + + + + +
+ + + + +
double bebop2::ExtendedKalmanFilter::CONTROL_DIM
+
+protected
+
+ +

Definition at line 68 of file ExtendedKalmanFilter.h.

+ +
+
+ +

◆ DT

+ +
+
+ + + + + +
+ + + + +
double bebop2::ExtendedKalmanFilter::DT
+
+protected
+
+ +

Definition at line 68 of file ExtendedKalmanFilter.h.

+ +
+
+ +

◆ STATE_DIM

+ +
+
+ + + + + +
+ + + + +
double bebop2::ExtendedKalmanFilter::STATE_DIM
+
+protected
+
+ +

Definition at line 68 of file ExtendedKalmanFilter.h.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/doxygen/html/classbebop2_1_1_extended_kalman_filter.png b/docs/html/classbebop2_1_1ExtendedKalmanFilter.png similarity index 100% rename from doxygen/html/classbebop2_1_1_extended_kalman_filter.png rename to docs/html/classbebop2_1_1ExtendedKalmanFilter.png diff --git a/docs/html/classbebop2_1_1LQR-members.html b/docs/html/classbebop2_1_1LQR-members.html new file mode 100644 index 0000000..ca09cbb --- /dev/null +++ b/docs/html/classbebop2_1_1LQR-members.html @@ -0,0 +1,89 @@ + + + + + + + +airlib: Member List + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
bebop2::LQR Member List
+
+
+ +

This is the complete list of members for bebop2::LQR, including all inherited members.

+ + +
LQR()bebop2::LQR
+ + + + diff --git a/docs/html/classbebop2_1_1LQR.html b/docs/html/classbebop2_1_1LQR.html new file mode 100644 index 0000000..4be4ba4 --- /dev/null +++ b/docs/html/classbebop2_1_1LQR.html @@ -0,0 +1,131 @@ + + + + + + + +airlib: bebop2::LQR Class Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
bebop2::LQR Class Reference
+
+
+ +

The LQR is an optimal control regulator that better tracks a reference trajectory. + More...

+ +

#include <LQR.h>

+ + + + + +

+Public Member Functions

 LQR ()
 A defauld constructor for LQR.
 
+

Detailed Description

+

The LQR is an optimal control regulator that better tracks a reference trajectory.

+

It predicts future states of the drone at every time step in order to minimize a global criterion/cost function. By estimating future states based on past outputs, we are able to better regulate offset in tracking. The LQR algorithm is essentially an automated way of finding an appropriate state-feedback controller.

+ +

Definition at line 22 of file LQR.h.

+

Constructor & Destructor Documentation

+ +

◆ LQR()

+ +
+
+ + + + + + + +
bebop2::LQR::LQR ()
+
+ +

A defauld constructor for LQR.

+ +

Definition at line 44 of file LQR.cpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/classbebop2_1_1PID-members.html b/docs/html/classbebop2_1_1PID-members.html new file mode 100644 index 0000000..c3f7e5a --- /dev/null +++ b/docs/html/classbebop2_1_1PID-members.html @@ -0,0 +1,91 @@ + + + + + + + +airlib: Member List + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
bebop2::PID Member List
+
+
+ +

This is the complete list of members for bebop2::PID, including all inherited members.

+ + + + +
calculate(double setpoint, double pv)bebop2::PID
init(double dt, double max, double min, double Kp, double Kd, double Ki)bebop2::PID
PID()bebop2::PID
+ + + + diff --git a/docs/html/classbebop2_1_1PID.html b/docs/html/classbebop2_1_1PID.html new file mode 100644 index 0000000..50b87a7 --- /dev/null +++ b/docs/html/classbebop2_1_1PID.html @@ -0,0 +1,239 @@ + + + + + + + +airlib: bebop2::PID Class Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +List of all members
+
bebop2::PID Class Reference
+
+
+ +

Calculates an error value as the difference between desired output and the current output and applies a correction based on proportional, integral and derivative terms(denoted by P, I, D respectively). + More...

+ +

#include <PID.h>

+ + + + + + + + + + + +

+Public Member Functions

 PID ()
 A default Constuctor.
 
void init (double dt, double max, double min, double Kp, double Kd, double Ki)
 Init method initiliazes all the controller parameters like proportional constant, Integral constant, Derivative constant, rate of change, maximum and minimum output values.
 
double calculate (double setpoint, double pv)
 At first it calculates the error by subtracting the setpoint and current position of the drone, Then the Proportional, Integral, Derivate terms are calculated using that error and their repective constans. Following that, we find out the total ouptput by the sum of three terms and tehn restrict the output withtin the boundaries of minimum, maximum valeus.
 
+

Detailed Description

+

Calculates an error value as the difference between desired output and the current output and applies a correction based on proportional, integral and derivative terms(denoted by P, I, D respectively).

+ +

Definition at line 12 of file PID.h.

+

Constructor & Destructor Documentation

+ +

◆ PID()

+ +
+
+ + + + + + + +
bebop2::PID::PID ()
+
+ +

A default Constuctor.

+ +

Definition at line 8 of file PID.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ calculate()

+ +
+
+ + + + + + + + + + + + + + + + + + +
double bebop2::PID::calculate (double setpoint,
double pv 
)
+
+ +

At first it calculates the error by subtracting the setpoint and current position of the drone, Then the Proportional, Integral, Derivate terms are calculated using that error and their repective constans. Following that, we find out the total ouptput by the sum of three terms and tehn restrict the output withtin the boundaries of minimum, maximum valeus.

+
Parameters
+ + + +
setpointIt is the desired position of the drone.
pvIt is the current position of the drone.
+
+
+
Returns
Returns the error between the setpoint and the current postion of the drone.
+
Note
PID Gains identifiers.
    +
  • Kp = Proportionality Constant
  • +
  • Kd = Derivative Constant
  • +
  • Ki = Intergration Constant
  • +
+
+ +

Definition at line 22 of file PID.cpp.

+ +
+
+ +

◆ init()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void bebop2::PID::init (double dt,
double max,
double min,
double Kp,
double Kd,
double Ki 
)
+
+ +

Init method initiliazes all the controller parameters like proportional constant, Integral constant, Derivative constant, rate of change, maximum and minimum output values.

+ +

Definition at line 13 of file PID.cpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/classbebop2_1_1QuadControllerPID-members.html b/docs/html/classbebop2_1_1QuadControllerPID-members.html new file mode 100644 index 0000000..3a07799 --- /dev/null +++ b/docs/html/classbebop2_1_1QuadControllerPID-members.html @@ -0,0 +1,105 @@ + + + + + + + +airlib: Member List + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
bebop2::QuadControllerPID Member List
+
+
+ +

This is the complete list of members for bebop2::QuadControllerPID, including all inherited members.

+ + + + + + + + + + + + + + + + + + +
ButtonState enum namebebop2::ControllerBaseprotected
compute_control(const std::vector< double > &X, const std::vector< double > &setPoints, std::vector< double > &control) overridebebop2::QuadControllerPIDprotectedvirtual
CONTROL enum valuebebop2::ControllerBaseprotected
ControllerBase(StateObserverPtr mGetState, ros::NodeHandle &nh)bebop2::ControllerBaseexplicit
dt_bebop2::ControllerBaseprotected
ENGAGE enum valuebebop2::ControllerBaseprotected
goal_distance(const std::vector< double > &X, const std::vector< double > &setPoints)bebop2::ControllerBaseprotected
IDLE enum valuebebop2::ControllerBaseprotected
LAND enum valuebebop2::ControllerBaseprotected
m_buttonStatebebop2::ControllerBaseprotected
m_get_statebebop2::ControllerBaseprotected
m_goal_thresbebop2::ControllerBaseprotected
m_mubebop2::ControllerBaseprotected
m_nhbebop2::ControllerBaseprotected
publish_cmd_vel(const std::vector< double > &U)bebop2::ControllerBaseprotected
QuadControllerPID(StateObserverPtr mGetState, ros::NodeHandle &nh)bebop2::QuadControllerPID
TAKEOFF enum valuebebop2::ControllerBaseprotected
+ + + + diff --git a/docs/html/classbebop2_1_1QuadControllerPID.html b/docs/html/classbebop2_1_1QuadControllerPID.html new file mode 100644 index 0000000..9221cb3 --- /dev/null +++ b/docs/html/classbebop2_1_1QuadControllerPID.html @@ -0,0 +1,267 @@ + + + + + + + +airlib: bebop2::QuadControllerPID Class Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +Protected Member Functions | +List of all members
+
bebop2::QuadControllerPID Class Reference
+
+
+ +

Responsible to find the error values every second whenever the position of the quadrators of the drone is updated. + More...

+ +

#include <QuadControllerPID.h>

+
+Inheritance diagram for bebop2::QuadControllerPID:
+
+
+ + +bebop2::ControllerBase + +
+ + + + + + + + + +

+Public Member Functions

 QuadControllerPID (StateObserverPtr mGetState, ros::NodeHandle &nh)
 The QuadControllerPID constructor initializes a vector of type double that is responsible for populating the PID Gains, maximum and minimum threshold values.
 
- Public Member Functions inherited from bebop2::ControllerBase
 ControllerBase (StateObserverPtr mGetState, ros::NodeHandle &nh)
 Subscribes to sensor_msgs/joy which reports the state of a joystick's axes and buttons. It also publishes the message of drone takeoff and landing along with the linear and angular position of the drone. The constructor is also responsible to call the appropriate functions at specifc rates that plays a role in setting the set-point at a current location. Lastly it contructs an object to send the updated pose to the RVIZ for visualization and also sets the state of the controller's button.
 
+ + + + + + + + + + + + + +

+Protected Member Functions

void compute_control (const std::vector< double > &X, const std::vector< double > &setPoints, std::vector< double > &control) override
 Similar to the calculate() method in PID.h class, the compute_control method also calculates the error, PID Gain constants and return the error value when the drone is hovering over a position for the four vector values.
 
- Protected Member Functions inherited from bebop2::ControllerBase
void publish_cmd_vel (const std::vector< double > &U)
 This function sets the linear positon of the drone to all 3 linear axes and to angular z-axis and publishes the message of the current position of the drone.
 
double goal_distance (const std::vector< double > &X, const std::vector< double > &setPoints)
 This function calculates the distance between the setpoint of the drone and the current state position.
 
virtual void compute_control (const std::vector< double > &X, const std::vector< double > &setPoints, std::vector< double > &control)=0
 
+ + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Types inherited from bebop2::ControllerBase
enum  ButtonState {
+  IDLE = 0 +, TAKEOFF +, LAND +, ENGAGE +,
+  CONTROL +
+ }
 Applications applied to control the state of the robot using Joystick controller. More...
 
- Protected Attributes inherited from bebop2::ControllerBase
ros::NodeHandle m_nh
 This ROS Handle attribute is used to create various publishers and subscribers which also deals with messages.
 
std::mutex m_mu
 Locks some functions for safe operations.
 
enum bebop2::ControllerBase::ButtonState m_buttonState
 
StateObserverPtr m_get_state
 This attribute gives the state of the robot.
 
double dt_
 Sample Time.
 
double m_goal_thres
 Goal region threshold.
 
+

Detailed Description

+

Responsible to find the error values every second whenever the position of the quadrators of the drone is updated.

+ +

Definition at line 15 of file QuadControllerPID.h.

+

Constructor & Destructor Documentation

+ +

◆ QuadControllerPID()

+ +
+
+ + + + + + + + + + + + + + + + + + +
bebop2::QuadControllerPID::QuadControllerPID (bebop2::StateObserverPtr mGetState,
ros::NodeHandle & nh 
)
+
+ +

The QuadControllerPID constructor initializes a vector of type double that is responsible for populating the PID Gains, maximum and minimum threshold values.

+
Parameters
+ + + +
mGetStateThis parameter givs the current state of the robot.
nhUsed to setup publishers, subscribers and deals with various messages.
+
+
+ +

Definition at line 9 of file QuadControllerPID.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ compute_control()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
void bebop2::QuadControllerPID::compute_control (const std::vector< double > & X,
const std::vector< double > & setPoints,
std::vector< double > & control 
)
+
+overrideprotectedvirtual
+
+ +

Similar to the calculate() method in PID.h class, the compute_control method also calculates the error, PID Gain constants and return the error value when the drone is hovering over a position for the four vector values.

+
Parameters
+ + + + +
Xis the current state of the drone.
setPointsis the desired goal position of the drone.
controlis the actively control position.
+
+
+ +

Implements bebop2::ControllerBase.

+ +

Definition at line 26 of file QuadControllerPID.cpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/doxygen/html/classbebop2_1_1_quad_controller_p_i_d.png b/docs/html/classbebop2_1_1QuadControllerPID.png similarity index 100% rename from doxygen/html/classbebop2_1_1_quad_controller_p_i_d.png rename to docs/html/classbebop2_1_1QuadControllerPID.png diff --git a/docs/html/classbebop2_1_1StateObserver-members.html b/docs/html/classbebop2_1_1StateObserver-members.html new file mode 100644 index 0000000..1e0bafb --- /dev/null +++ b/docs/html/classbebop2_1_1StateObserver-members.html @@ -0,0 +1,94 @@ + + + + + + + +airlib: Member List + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
bebop2::StateObserver Member List
+
+
+ +

This is the complete list of members for bebop2::StateObserver, including all inherited members.

+ + + + + + + +
m_filterbebop2::StateObserverprotected
m_initializedbebop2::StateObserverprotected
m_sensorbebop2::StateObserverprotected
m_statebebop2::StateObserverprotected
operator()(std::vector< double > &result)bebop2::StateObserver
StateObserver(FilterPtr filter, SensorPtr sensor)bebop2::StateObserverexplicit
+ + + + diff --git a/docs/html/classbebop2_1_1StateObserver.html b/docs/html/classbebop2_1_1StateObserver.html new file mode 100644 index 0000000..5db0c62 --- /dev/null +++ b/docs/html/classbebop2_1_1StateObserver.html @@ -0,0 +1,315 @@ + + + + + + + +airlib: bebop2::StateObserver Class Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +Protected Attributes | +List of all members
+
bebop2::StateObserver Class Reference
+
+
+ +

The StateObserver class Observes and updates the state of the drone. + More...

+ +

#include <StateObserver.h>

+ + + + + + + + +

+Public Member Functions

 StateObserver (FilterPtr filter, SensorPtr sensor)
 Initializes the filter and sensor parameter and sets m_initliazed to False.
 
void operator() (std::vector< double > &result)
 It updates and copies the state of the drone and adds the copied state into the parameter result.
 
+ + + + + + + + + + + + +

+Protected Attributes

std::vector< double > m_state
 This attribute is an array of values and the elements in the vector gives the state of the robot. The first three attributes are vectors that gives the linear state of the robot and yaw gives the rotation of the robot about these vectors.
 
FilterPtr m_filter
 Shared pointer that provides the address to the FilterBase.h class.
 
SensorPtr m_sensor
 Shared pointer that provides the addreess to the SensorBase.h class.
 
bool m_initialized
 
+

Detailed Description

+

The StateObserver class Observes and updates the state of the drone.

+

and sends those messages to different modules of the program such as controllers, sensors etc so that they can control the drone and perform tasks.

+ +

Definition at line 23 of file StateObserver.h.

+

Constructor & Destructor Documentation

+ +

◆ StateObserver()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bebop2::StateObserver::StateObserver (FilterPtr filter,
SensorPtr sensor 
)
+
+explicit
+
+ +

Initializes the filter and sensor parameter and sets m_initliazed to False.

+
Parameters
+ + + +
filterA barrier to refine the noise.
sensor
+
+
+ +

Definition at line 11 of file StateObserver.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ operator()()

+ +
+
+ + + + + + + + +
void bebop2::StateObserver::operator() (std::vector< double > & result)
+
+ +

It updates and copies the state of the drone and adds the copied state into the parameter result.

+
Parameters
+ + +
result
+
+
+
+ +

Definition at line 17 of file StateObserver.cpp.

+ +
+
+

Member Data Documentation

+ +

◆ m_filter

+ +
+
+ + + + + +
+ + + + +
FilterPtr bebop2::StateObserver::m_filter
+
+protected
+
+ +

Shared pointer that provides the address to the FilterBase.h class.

+ +

Definition at line 54 of file StateObserver.h.

+ +
+
+ +

◆ m_initialized

+ +
+
+ + + + + +
+ + + + +
bool bebop2::StateObserver::m_initialized
+
+protected
+
+ +

Definition at line 57 of file StateObserver.h.

+ +
+
+ +

◆ m_sensor

+ +
+
+ + + + + +
+ + + + +
SensorPtr bebop2::StateObserver::m_sensor
+
+protected
+
+ +

Shared pointer that provides the addreess to the SensorBase.h class.

+ +

Definition at line 56 of file StateObserver.h.

+ +
+
+ +

◆ m_state

+ +
+
+ + + + + +
+ + + + +
std::vector<double> bebop2::StateObserver::m_state
+
+protected
+
+ +

This attribute is an array of values and the elements in the vector gives the state of the robot. The first three attributes are vectors that gives the linear state of the robot and yaw gives the rotation of the robot about these vectors.

+
Note
The elements in the array are commonly represented by:-
    +
  • x —> Position of the drone in x-axis.
  • +
  • y —> Position of the drone in x-axis.
  • +
  • z —> Position of the drone in z-axis.
  • +
  • w —> yaw (Rotation about z-axis).
  • +
+
+ +

Definition at line 52 of file StateObserver.h.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/doxygen/html/classbebop2_1_1_control_viz-members.html b/docs/html/classbebop2_1_1_control_viz-members.html similarity index 100% rename from doxygen/html/classbebop2_1_1_control_viz-members.html rename to docs/html/classbebop2_1_1_control_viz-members.html diff --git a/doxygen/html/classbebop2_1_1_control_viz.html b/docs/html/classbebop2_1_1_control_viz.html similarity index 100% rename from doxygen/html/classbebop2_1_1_control_viz.html rename to docs/html/classbebop2_1_1_control_viz.html diff --git a/doxygen/html/classbebop2_1_1_controller_base-members.html b/docs/html/classbebop2_1_1_controller_base-members.html similarity index 100% rename from doxygen/html/classbebop2_1_1_controller_base-members.html rename to docs/html/classbebop2_1_1_controller_base-members.html diff --git a/doxygen/html/classbebop2_1_1_controller_base.html b/docs/html/classbebop2_1_1_controller_base.html similarity index 100% rename from doxygen/html/classbebop2_1_1_controller_base.html rename to docs/html/classbebop2_1_1_controller_base.html diff --git a/docs/html/classbebop2_1_1_controller_base.png b/docs/html/classbebop2_1_1_controller_base.png new file mode 100644 index 0000000..aa00dbb Binary files /dev/null and b/docs/html/classbebop2_1_1_controller_base.png differ diff --git a/doxygen/html/classbebop2_1_1_dummy_state-members.html b/docs/html/classbebop2_1_1_dummy_state-members.html similarity index 100% rename from doxygen/html/classbebop2_1_1_dummy_state-members.html rename to docs/html/classbebop2_1_1_dummy_state-members.html diff --git a/doxygen/html/classbebop2_1_1_dummy_state.html b/docs/html/classbebop2_1_1_dummy_state.html similarity index 100% rename from doxygen/html/classbebop2_1_1_dummy_state.html rename to docs/html/classbebop2_1_1_dummy_state.html diff --git a/docs/html/classbebop2_1_1_dummy_state.png b/docs/html/classbebop2_1_1_dummy_state.png new file mode 100644 index 0000000..652c6ec Binary files /dev/null and b/docs/html/classbebop2_1_1_dummy_state.png differ diff --git a/doxygen/html/classbebop2_1_1_extended_kalman_filter-members.html b/docs/html/classbebop2_1_1_extended_kalman_filter-members.html similarity index 100% rename from doxygen/html/classbebop2_1_1_extended_kalman_filter-members.html rename to docs/html/classbebop2_1_1_extended_kalman_filter-members.html diff --git a/doxygen/html/classbebop2_1_1_extended_kalman_filter.html b/docs/html/classbebop2_1_1_extended_kalman_filter.html similarity index 100% rename from doxygen/html/classbebop2_1_1_extended_kalman_filter.html rename to docs/html/classbebop2_1_1_extended_kalman_filter.html diff --git a/docs/html/classbebop2_1_1_extended_kalman_filter.png b/docs/html/classbebop2_1_1_extended_kalman_filter.png new file mode 100644 index 0000000..52de18d Binary files /dev/null and b/docs/html/classbebop2_1_1_extended_kalman_filter.png differ diff --git a/doxygen/html/classbebop2_1_1_l_q_r-members.html b/docs/html/classbebop2_1_1_l_q_r-members.html similarity index 100% rename from doxygen/html/classbebop2_1_1_l_q_r-members.html rename to docs/html/classbebop2_1_1_l_q_r-members.html diff --git a/doxygen/html/classbebop2_1_1_l_q_r.html b/docs/html/classbebop2_1_1_l_q_r.html similarity index 100% rename from doxygen/html/classbebop2_1_1_l_q_r.html rename to docs/html/classbebop2_1_1_l_q_r.html diff --git a/doxygen/html/classbebop2_1_1_p_i_d-members.html b/docs/html/classbebop2_1_1_p_i_d-members.html similarity index 100% rename from doxygen/html/classbebop2_1_1_p_i_d-members.html rename to docs/html/classbebop2_1_1_p_i_d-members.html diff --git a/doxygen/html/classbebop2_1_1_p_i_d.html b/docs/html/classbebop2_1_1_p_i_d.html similarity index 100% rename from doxygen/html/classbebop2_1_1_p_i_d.html rename to docs/html/classbebop2_1_1_p_i_d.html diff --git a/doxygen/html/classbebop2_1_1_quad_controller_p_i_d-members.html b/docs/html/classbebop2_1_1_quad_controller_p_i_d-members.html similarity index 100% rename from doxygen/html/classbebop2_1_1_quad_controller_p_i_d-members.html rename to docs/html/classbebop2_1_1_quad_controller_p_i_d-members.html diff --git a/doxygen/html/classbebop2_1_1_quad_controller_p_i_d.html b/docs/html/classbebop2_1_1_quad_controller_p_i_d.html similarity index 100% rename from doxygen/html/classbebop2_1_1_quad_controller_p_i_d.html rename to docs/html/classbebop2_1_1_quad_controller_p_i_d.html diff --git a/docs/html/classbebop2_1_1_quad_controller_p_i_d.png b/docs/html/classbebop2_1_1_quad_controller_p_i_d.png new file mode 100644 index 0000000..0b57c50 Binary files /dev/null and b/docs/html/classbebop2_1_1_quad_controller_p_i_d.png differ diff --git a/doxygen/html/classbebop2_1_1_state_observer-members.html b/docs/html/classbebop2_1_1_state_observer-members.html similarity index 100% rename from doxygen/html/classbebop2_1_1_state_observer-members.html rename to docs/html/classbebop2_1_1_state_observer-members.html diff --git a/doxygen/html/classbebop2_1_1_state_observer.html b/docs/html/classbebop2_1_1_state_observer.html similarity index 100% rename from doxygen/html/classbebop2_1_1_state_observer.html rename to docs/html/classbebop2_1_1_state_observer.html diff --git a/doxygen/html/classes.html b/docs/html/classes.html similarity index 68% rename from doxygen/html/classes.html rename to docs/html/classes.html index ce36e56..4361195 100644 --- a/doxygen/html/classes.html +++ b/docs/html/classes.html @@ -3,7 +3,7 @@ - + airlib: Class Index @@ -29,7 +29,7 @@ - + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Functions
+
main.cpp File Reference
+
+
+
#include <iostream>
+
+

Go to the source code of this file.

+ + + + +

+Functions

int main (int argc, char *argv[])
 
+

Function Documentation

+ +

◆ main()

+ +
+
+ + + + + + + + + + + + + + + + + + +
int main (int argc,
char * argv[] 
)
+
+ +

Definition at line 7 of file main.cpp.

+ +
+
+
+ + + + diff --git a/docs/html/control_2LQR_2main_8cpp_source.html b/docs/html/control_2LQR_2main_8cpp_source.html new file mode 100644 index 0000000..69be4c7 --- /dev/null +++ b/docs/html/control_2LQR_2main_8cpp_source.html @@ -0,0 +1,97 @@ + + + + + + + +airlib: airlib/control/LQR/main.cpp Source File + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
main.cpp
+
+
+Go to the documentation of this file.
1//
+
2// Created by redwan on 12/15/22.
+
3//
+
4#include <iostream>
+
5using namespace std;
+
6
+
7int main(int argc, char* argv[])
+
8{
+
9 cout << "LQR Controller Initialized" << endl;
+
10 return 0;
+
11}
+
int main()
Definition: main.cpp:8
+
+ + + + diff --git a/doxygen/html/control_2_l_q_r_2main_8cpp.html b/docs/html/control_2_l_q_r_2main_8cpp.html similarity index 100% rename from doxygen/html/control_2_l_q_r_2main_8cpp.html rename to docs/html/control_2_l_q_r_2main_8cpp.html diff --git a/doxygen/html/control_2_l_q_r_2main_8cpp_source.html b/docs/html/control_2_l_q_r_2main_8cpp_source.html similarity index 100% rename from doxygen/html/control_2_l_q_r_2main_8cpp_source.html rename to docs/html/control_2_l_q_r_2main_8cpp_source.html diff --git a/doxygen/html/dir_0b09c446dd7a9edef411ea7168ce1167.html b/docs/html/dir_0b09c446dd7a9edef411ea7168ce1167.html similarity index 90% rename from doxygen/html/dir_0b09c446dd7a9edef411ea7168ce1167.html rename to docs/html/dir_0b09c446dd7a9edef411ea7168ce1167.html index 5d4fed7..cefde27 100644 --- a/doxygen/html/dir_0b09c446dd7a9edef411ea7168ce1167.html +++ b/docs/html/dir_0b09c446dd7a9edef411ea7168ce1167.html @@ -3,7 +3,7 @@ - + airlib: airlib/localization/Sensors Directory Reference @@ -29,7 +29,7 @@ - + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- i -

+ + +

- j -

+ + +

- l -

+ + +

- m -

+ + +

- o -

+ + +

- p -

+ + +

- q -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+ + +

- w -

+ + +

- x -

+ + +

- y -

+ + +

- z -

+ + +

- ~ -

+
+ + + + diff --git a/doxygen/html/functions_b.html b/docs/html/functions_b.html similarity index 100% rename from doxygen/html/functions_b.html rename to docs/html/functions_b.html diff --git a/doxygen/html/functions_c.html b/docs/html/functions_c.html similarity index 100% rename from doxygen/html/functions_c.html rename to docs/html/functions_c.html diff --git a/doxygen/html/functions_d.html b/docs/html/functions_d.html similarity index 100% rename from doxygen/html/functions_d.html rename to docs/html/functions_d.html diff --git a/doxygen/html/functions_e.html b/docs/html/functions_e.html similarity index 100% rename from doxygen/html/functions_e.html rename to docs/html/functions_e.html diff --git a/doxygen/html/functions_enum.html b/docs/html/functions_enum.html similarity index 88% rename from doxygen/html/functions_enum.html rename to docs/html/functions_enum.html index 12fcd61..737e7b5 100644 --- a/doxygen/html/functions_enum.html +++ b/docs/html/functions_enum.html @@ -3,7 +3,7 @@ - + airlib: Class Members - Enumerations @@ -29,7 +29,7 @@ - + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all enum values with links to the classes they belong to:
+
+ + + + diff --git a/doxygen/html/functions_f.html b/docs/html/functions_f.html similarity index 100% rename from doxygen/html/functions_f.html rename to docs/html/functions_f.html diff --git a/docs/html/functions_func.html b/docs/html/functions_func.html new file mode 100644 index 0000000..d4c56c9 --- /dev/null +++ b/docs/html/functions_func.html @@ -0,0 +1,212 @@ + + + + + + + +airlib: Class Members - Functions + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all functions with links to the classes they belong to:
+ +

- a -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- i -

+ + +

- j -

+ + +

- l -

+ + +

- m -

+ + +

- o -

+ + +

- p -

+ + +

- q -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+ + +

- w -

+ + +

- ~ -

+
+ + + + diff --git a/doxygen/html/functions_g.html b/docs/html/functions_g.html similarity index 100% rename from doxygen/html/functions_g.html rename to docs/html/functions_g.html diff --git a/doxygen/html/functions_i.html b/docs/html/functions_i.html similarity index 100% rename from doxygen/html/functions_i.html rename to docs/html/functions_i.html diff --git a/doxygen/html/functions_j.html b/docs/html/functions_j.html similarity index 100% rename from doxygen/html/functions_j.html rename to docs/html/functions_j.html diff --git a/doxygen/html/functions_k.html b/docs/html/functions_k.html similarity index 100% rename from doxygen/html/functions_k.html rename to docs/html/functions_k.html diff --git a/doxygen/html/functions_l.html b/docs/html/functions_l.html similarity index 100% rename from doxygen/html/functions_l.html rename to docs/html/functions_l.html diff --git a/doxygen/html/functions_m.html b/docs/html/functions_m.html similarity index 100% rename from doxygen/html/functions_m.html rename to docs/html/functions_m.html diff --git a/doxygen/html/functions_o.html b/docs/html/functions_o.html similarity index 100% rename from doxygen/html/functions_o.html rename to docs/html/functions_o.html diff --git a/doxygen/html/functions_p.html b/docs/html/functions_p.html similarity index 100% rename from doxygen/html/functions_p.html rename to docs/html/functions_p.html diff --git a/doxygen/html/functions_q.html b/docs/html/functions_q.html similarity index 100% rename from doxygen/html/functions_q.html rename to docs/html/functions_q.html diff --git a/doxygen/html/functions_r.html b/docs/html/functions_r.html similarity index 100% rename from doxygen/html/functions_r.html rename to docs/html/functions_r.html diff --git a/doxygen/html/functions_rela.html b/docs/html/functions_rela.html similarity index 81% rename from doxygen/html/functions_rela.html rename to docs/html/functions_rela.html index f792243..b29f8ce 100644 --- a/doxygen/html/functions_rela.html +++ b/docs/html/functions_rela.html @@ -3,9 +3,9 @@ - + -airlib: Class Members - Related Functions +airlib: Class Members - Related Symbols @@ -29,7 +29,7 @@ - + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all variables with links to the classes they belong to:
+ +

- a -

+ + +

- c -

+ + +

- d -

+ + +

- i -

+ + +

- l -

+ + +

- m -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- w -

+ + +

- x -

+ + +

- y -

+ + +

- z -

+
+ + + + diff --git a/doxygen/html/functions_w.html b/docs/html/functions_w.html similarity index 100% rename from doxygen/html/functions_w.html rename to docs/html/functions_w.html diff --git a/doxygen/html/functions_x.html b/docs/html/functions_x.html similarity index 100% rename from doxygen/html/functions_x.html rename to docs/html/functions_x.html diff --git a/doxygen/html/functions_y.html b/docs/html/functions_y.html similarity index 100% rename from doxygen/html/functions_y.html rename to docs/html/functions_y.html diff --git a/doxygen/html/functions_z.html b/docs/html/functions_z.html similarity index 100% rename from doxygen/html/functions_z.html rename to docs/html/functions_z.html diff --git a/doxygen/html/functions_~.html b/docs/html/functions_~.html similarity index 100% rename from doxygen/html/functions_~.html rename to docs/html/functions_~.html diff --git a/doxygen/html/globals.html b/docs/html/globals.html similarity index 65% rename from doxygen/html/globals.html rename to docs/html/globals.html index cb18db1..9a05b4a 100644 --- a/doxygen/html/globals.html +++ b/docs/html/globals.html @@ -3,7 +3,7 @@ - + airlib: File Members @@ -29,7 +29,7 @@ - + + + + + + + + +
+
+ + + + + + +
+
Parrot Bebop2 +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Graph Legend
+
+
+

This page explains how to interpret the graphs that are generated by doxygen.

+

Consider the following example:

/*! Invisible class because of truncation */
+
class Invisible { };
+
+
/*! Truncated class, inheritance relation is hidden */
+
class Truncated : public Invisible { };
+
+
/* Class not documented with doxygen comments */
+
class Undocumented { };
+
+
/*! Class that is inherited using public inheritance */
+
class PublicBase : public Truncated { };
+
+
/*! A template class */
+
template<class T> class Templ { };
+
+
/*! Class that is inherited using protected inheritance */
+
class ProtectedBase { };
+
+
/*! Class that is inherited using private inheritance */
+
class PrivateBase { };
+
+
/*! Class that is used by the Inherited class */
+
class Used { };
+
+
/*! Super class that inherits a number of other classes */
+
class Inherited : public PublicBase,
+
protected ProtectedBase,
+
private PrivateBase,
+
public Undocumented,
+
public Templ<int>
+
{
+
private:
+
Used *m_usedClass;
+
};
+

This will result in the following graph:

+

The boxes in the above graph have the following meaning:

+ +

The arrows have the following meaning:

+ +
+ + + + diff --git a/docs/html/graph_legend.md5 b/docs/html/graph_legend.md5 new file mode 100644 index 0000000..0caaa53 --- /dev/null +++ b/docs/html/graph_legend.md5 @@ -0,0 +1 @@ +6baf1c18d0a85204edda4be500f3e271 \ No newline at end of file diff --git a/docs/html/graph_legend.png b/docs/html/graph_legend.png new file mode 100644 index 0000000..3b5238b Binary files /dev/null and b/docs/html/graph_legend.png differ diff --git a/doxygen/html/helper_8h.html b/docs/html/helper_8h.html similarity index 100% rename from doxygen/html/helper_8h.html rename to docs/html/helper_8h.html diff --git a/doxygen/html/helper_8h_source.html b/docs/html/helper_8h_source.html similarity index 100% rename from doxygen/html/helper_8h_source.html rename to docs/html/helper_8h_source.html diff --git a/doxygen/html/hierarchy.html b/docs/html/hierarchy.html similarity index 54% rename from doxygen/html/hierarchy.html rename to docs/html/hierarchy.html index d30e4ac..72b5edc 100644 --- a/doxygen/html/hierarchy.html +++ b/docs/html/hierarchy.html @@ -3,7 +3,7 @@ - + airlib: Class Hierarchy @@ -29,7 +29,7 @@ - + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Parrot Bebop2 Drone with Joystick Controller README File
+
+
+

+Introduction

+

The Parrot Bebop 2 is a small, lightweight manufactured by Parrot, a French company specializing in consumer electronics. It is compact and lightweight, making it easy to transport and use on the go which makes it a popular choice It's camera has a most impressive electronic image stabilization and with a top speed of 40 mph, this drone can really move. The Bebop 2 has a battery life of up to 25 minutes.
+

+

This README file explains how to control the drone using a joystick and ROS drivers, add visual servoing capabilities, and scan for April Tags to find the drone's relative position.

+
+

Parrot Bebop Drone 2

+

+Quick Run

+

Hardware Setup: Connect your joystick to the computer.
+

+

Before starting the program, the drone should be turned on and the computer connected to the drone WiFi.

+
+

Warning It is strictly recommended to use protective equipments while testing the drone.
+

+
+

If the drone needs to be shut down completely then we should flip the drone.

+

Joystick buttons perform following operations:

+
IDLE = 0, // Setpoint can be freely moved with joystick. Sphere color blue
+
+
TAKEOFF = 1, // Drone will takeoff from the ground
+
+
LAND = 2, // Drone will land
+
+
ENGAGE = 3, // Set current location as a set point (for hover). Sphere color yellow
+
+
CONTROL = 4 // Start PID controller for the current (ENGAGE) setpoint. Sphere color cyan
+

Once control mode is enabled, setpoint can also be controlled using joystick axes. Note that, only position controller is implemented from the analog sticks. Orientation controller needs yaw angle which could be directly obtained from bebop odom.

+
+

+Software Setup:

+

– A computer with Ubuntu 16.04, 18.04 or above and ROS Kinetic, Melodic or above installed.

+

Visp_ros package is needed to do visual servoing with Parrot Bebop 2 drone. Visual servoing, also known as vision-based robot control, is a technique which uses feedback information extracted from a vision sensor (visual feedback) to control the motion of a robot.

+

Installation of bebop_autonomy from fork manually is required to send relative move commands to the drone. Check out install bebop_autonomy from fork and build visp.
+ Bebop_autonomy is a ROS driver for Parrot Bebop 2.0 drones (quadrocopters), based on Parrot’s official ARDroneSDK3. You can check out this source code for the driver is for more understanding.

+
+

Joystick Controller

+

+Operating the drone

+

The Parrot Bebop 2 Drone can be controlled from a PID Joystick Controller. The drone can be manuvered with the joytsick analog sticks.

+

The functions of the Four Action Buttons of the joystick is as follows:

+

// To be written down.

+
    +
  1. A —>
  2. +
  3. B —>
  4. +
  5. X —>
  6. +
  7. Y —>
  8. +
+
+

AprilTag 36h11

+

+April Tags

+

AprilTag is a visual fiducial system, useful for a wide variety of tasks including augmented reality, robotics, and camera calibration. Targets can be created from an ordinary printer, and the AprilTag detection software computes the precise 3D position, orientation, and identity of the tags relative to the camera.
+
+

+

Using the built-in camera of the Parrot Bebop 2 Drone, it scans the tag and determines its relative postion from the tag.
+

+

An April Tag from 36h11 family that will serve as target for the visual servoing (see this page to print one).

+
+

+Visualisation using Graphical Interface (RVIZ)

+

The Parrot Bebop 2 drone can be monitored and visualised using a graphical interface like rviz.
+

+

For RVIZ installtion :-

sudo apt-get install ros-[ros-version]-rviz
+

For example:-

sudo apt-get install ros-noetic-rviz
+

To run rviz

rosrun rviz rviz
+

Check out http://wiki.ros.org/rviz/UserGuide for more information.

+
+

+Parameter Tuning

+

Refer to config/param.yaml file to read about tuning parameters. Apriltags are used for landmarks and then the drone position is estimated from those landmarks. A complementary filter is implemented to compute state by combining multiple landmarks.

+
+
+ + + + diff --git a/doxygen/html/jquery.js b/docs/html/jquery.js similarity index 100% rename from doxygen/html/jquery.js rename to docs/html/jquery.js diff --git a/docs/html/localization_2Filters_2ekf_2main_8cpp.html b/docs/html/localization_2Filters_2ekf_2main_8cpp.html new file mode 100644 index 0000000..85a4938 --- /dev/null +++ b/docs/html/localization_2Filters_2ekf_2main_8cpp.html @@ -0,0 +1,129 @@ + + + + + + + +airlib: airlib/localization/Filters/ekf/main.cpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Functions
+
main.cpp File Reference
+
+
+
#include <memory>
+#include "filters_common/helper.h"
+#include "bebop2_controller/localization/Filters/ExtendedKalmanFilter.h"
+
+

Go to the source code of this file.

+ + + + +

+Functions

int main (int argc, char *argv[])
 
+

Function Documentation

+ +

◆ main()

+ +
+
+ + + + + + + + + + + + + + + + + + +
int main (int argc,
char * argv[] 
)
+
+ +

Definition at line 9 of file main.cpp.

+ +
+
+
+ + + + diff --git a/docs/html/localization_2Filters_2ekf_2main_8cpp_source.html b/docs/html/localization_2Filters_2ekf_2main_8cpp_source.html new file mode 100644 index 0000000..e9da366 --- /dev/null +++ b/docs/html/localization_2Filters_2ekf_2main_8cpp_source.html @@ -0,0 +1,120 @@ + + + + + + + +airlib: airlib/localization/Filters/ekf/main.cpp Source File + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
main.cpp
+
+
+Go to the documentation of this file.
1//
+
2// Created by Redwan Newaz on 12/29/22.
+
3//
+
4#include <memory>
+
5#include "filters_common/helper.h"
+
6#include "bebop2_controller/localization/Filters/ExtendedKalmanFilter.h"
+
7
+
8
+
9int main(int argc, char* argv[])
+
10{
+
11
+
12
+
13
+
14 const int STATE_DIM = 4;
+
15
+
16 const double DT = 0.03;
+
17
+
18 std::vector<double>x0{0,0,1,0};
+
19
+
20 /*
+
21 * Sigmas - just an estimate, usually comes from uncertainty of sensor, but
+
22 * if you used fused data from multiple sensors, it's difficult to find
+
23 * these uncertainties directly.
+
24 */
+
25 std::vector<double> sigma_pos{0.015, 0.015, 0.015, 0.01}; // GPS measurement uncertainty [x [m], y [m], z [m], theta [rad]]
+
26
+
27 auto ekf = std::make_shared<extended_kalman_filter>(x0, sigma_pos, DT, STATE_DIM);
+
28
+
29 Simulator sim(STATE_DIM, ekf);
+
30 sim.run();
+
31
+
32
+
33 return 0;
+
34}
+
int main()
Definition: main.cpp:8
+
+ + + + diff --git a/docs/html/localization_2Filters_2pf_2main_8cpp.html b/docs/html/localization_2Filters_2pf_2main_8cpp.html new file mode 100644 index 0000000..9b746af --- /dev/null +++ b/docs/html/localization_2Filters_2pf_2main_8cpp.html @@ -0,0 +1,119 @@ + + + + + + + +airlib: airlib/localization/Filters/pf/main.cpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Functions
+
main.cpp File Reference
+
+
+
#include "../include/filters_common/helper.h"
+#include "bebop2_controller/localization/Filters/particle_filter.h"
+#include "filters_common/matplotlibcpp.h"
+#include <memory>
+
+

Go to the source code of this file.

+ + + + +

+Functions

int main ()
 
+

Function Documentation

+ +

◆ main()

+ +
+
+ + + + + + + +
int main ()
+
+ +

Definition at line 8 of file main.cpp.

+ +
+
+
+ + + + diff --git a/docs/html/localization_2Filters_2pf_2main_8cpp_source.html b/docs/html/localization_2Filters_2pf_2main_8cpp_source.html new file mode 100644 index 0000000..9cb1462 --- /dev/null +++ b/docs/html/localization_2Filters_2pf_2main_8cpp_source.html @@ -0,0 +1,126 @@ + + + + + + + +airlib: airlib/localization/Filters/pf/main.cpp Source File + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
main.cpp
+
+
+Go to the documentation of this file.
1#include "../include/filters_common/helper.h"
+
2#include "bebop2_controller/localization/Filters/particle_filter.h"
+
3#include "filters_common/matplotlibcpp.h"
+
4#include <memory>
+
5
+
6namespace plt = matplotlibcpp;
+
7
+
8int main() {
+
9
+
10 //Set up parameters here
+
11 int num_particles = 500;
+
12 const int STATE_DIM = 4;
+
13 const double DT = 0.03;
+
14
+
15 std::vector<double>x0{0,0,1,0};
+
16
+
17 /*
+
18 * Sigmas - just an estimate, usually comes from uncertainty of sensor, but
+
19 * if you used fused data from multiple sensors, it's difficult to find
+
20 * these uncertainties directly.
+
21 */
+
22 std::vector<double> sigma_pos{0.015, 0.015, 0.015, 0.01}; // GPS measurement uncertainty [x [m], y [m], z [m], theta [rad]]
+
23
+
24 TagMap tagMap;
+
25 tagMap.landmark_list.push_back({0, 5, 0, 0.95});
+
26 tagMap.landmark_list.push_back({1, 5, 2.05, 0.95});
+
27 tagMap.landmark_list.push_back({2, 5, 1.13, 0.95});
+
28
+
29
+
30 auto pf = std::make_shared<ParticleFilter>(num_particles, tagMap, DT);
+
31 pf->init(x0, sigma_pos);
+
32
+
33 Simulator sim(STATE_DIM, pf);
+
34 sim.run();
+
35
+
36
+
37 return 0;
+
38}
+
Data structure to store information about landmarks in a map.
+
std::vector< single_landmark_s > landmark_list
List of landmarks in the map.
+
int main()
Definition: main.cpp:8
+
+ + + + diff --git a/doxygen/html/localization_2_filters_2ekf_2main_8cpp.html b/docs/html/localization_2_filters_2ekf_2main_8cpp.html similarity index 100% rename from doxygen/html/localization_2_filters_2ekf_2main_8cpp.html rename to docs/html/localization_2_filters_2ekf_2main_8cpp.html diff --git a/doxygen/html/localization_2_filters_2ekf_2main_8cpp_source.html b/docs/html/localization_2_filters_2ekf_2main_8cpp_source.html similarity index 100% rename from doxygen/html/localization_2_filters_2ekf_2main_8cpp_source.html rename to docs/html/localization_2_filters_2ekf_2main_8cpp_source.html diff --git a/doxygen/html/localization_2_filters_2pf_2main_8cpp.html b/docs/html/localization_2_filters_2pf_2main_8cpp.html similarity index 100% rename from doxygen/html/localization_2_filters_2pf_2main_8cpp.html rename to docs/html/localization_2_filters_2pf_2main_8cpp.html diff --git a/doxygen/html/localization_2_filters_2pf_2main_8cpp_source.html b/docs/html/localization_2_filters_2pf_2main_8cpp_source.html similarity index 100% rename from doxygen/html/localization_2_filters_2pf_2main_8cpp_source.html rename to docs/html/localization_2_filters_2pf_2main_8cpp_source.html diff --git a/doxygen/html/matplotlibcpp_8h.html b/docs/html/matplotlibcpp_8h.html similarity index 100% rename from doxygen/html/matplotlibcpp_8h.html rename to docs/html/matplotlibcpp_8h.html diff --git a/doxygen/html/matplotlibcpp_8h_source.html b/docs/html/matplotlibcpp_8h_source.html similarity index 100% rename from doxygen/html/matplotlibcpp_8h_source.html rename to docs/html/matplotlibcpp_8h_source.html diff --git a/docs/html/md_README.html b/docs/html/md_README.html new file mode 100644 index 0000000..7cb0543 --- /dev/null +++ b/docs/html/md_README.html @@ -0,0 +1,93 @@ + + + + + + + +airlib: Bebop2 Controller + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
Bebop2 Controller
+
+
+

+Quick Run

+

Connect your joystick to the computer. Joystick buttons perform following operations:

IDLE = 0, // setpoint can be freely moved with joystick. Sphere color blue
+
TAKEOFF = 1, // drone will takeoff from the ground
+
LAND = 2, //drone will land
+
ENGAGE = 3, // set current location as a set point (for hover). Sphere color yellow
+
CONTROL = 4 // start PID controller for the current (ENGAGE) setpoint. Sphere color cyan
+

Once control mode is enabled, setpoint can also be controlled using joystick axes. Note that, only position controller is implemented. Orientation controller needs yaw angle which could be directly obtained from bebop odom.

+

+Parameter Tuning

+

Refer to config/param.yaml file to read about tuning parameters. Apriltags are used for landmarks and then the drone position is estimated from those landmarks. A complementary filter is implemented to compute state by combining multiple landmarks.

+
+
+ + + + diff --git a/docs/html/md__home_simant_bebop2_controller_docs_bebop2_controller__r_e_a_d_m_e.html b/docs/html/md__home_simant_bebop2_controller_docs_bebop2_controller__r_e_a_d_m_e.html new file mode 100644 index 0000000..e7bed66 --- /dev/null +++ b/docs/html/md__home_simant_bebop2_controller_docs_bebop2_controller__r_e_a_d_m_e.html @@ -0,0 +1,93 @@ + + + + + + + +My Project: Bebop2 Controller + + + + + + + + + +
+
+ + + + + + +
+
My Project +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
Bebop2 Controller
+
+
+

+Quick Run

+

Connect your joystick to the computer. Joystick buttons perform following operations:

IDLE = 0, // setpoint can be freely moved with joystick. Sphere color blue
+
TAKEOFF = 1, // drone will takeoff from the ground
+
LAND = 2, //drone will land
+
ENGAGE = 3, // set current location as a set point (for hover). Sphere color yellow
+
CONTROL = 4 // start PID controller for the current (ENGAGE) setpoint. Sphere color cyan
+

Once control mode is enabled, setpoint can also be controlled using joystick axes. Note that, only position controller is implemented. Orientation controller needs yaw angle which could be directly obtained from bebop odom.

+

+Parameter Tuning

+

Refer to config/param.yaml file to read about tuning parameters. Apriltags are used for landmarks and then the drone position is estimated from those landmarks. A complementary filter is implemented to compute state by combining multiple landmarks.

+
+
+ + + + diff --git a/doxygen/html/md__r_e_a_d_m_e.html b/docs/html/md__r_e_a_d_m_e.html similarity index 95% rename from doxygen/html/md__r_e_a_d_m_e.html rename to docs/html/md__r_e_a_d_m_e.html index 84ce742..e7bed66 100644 --- a/doxygen/html/md__r_e_a_d_m_e.html +++ b/docs/html/md__r_e_a_d_m_e.html @@ -3,9 +3,9 @@ - + -airlib: Bebop2 Controller +My Project: Bebop2 Controller @@ -21,7 +21,7 @@ -
airlib +
My Project
@@ -29,7 +29,7 @@
- + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
particle_filter.h
+
+
+Go to the documentation of this file.
1/*
+
2 * particle_filter.h
+
3 *
+
4 * 2D particle filter class.
+
5 */
+
6
+
7#ifndef PARTICLE_FILTER_H_
+
8#define PARTICLE_FILTER_H_
+
9
+
10#include <iostream>
+
11#include <utility>
+
12#include <vector>
+
13#include <numeric>
+
14#include "filters_common/helper.h"
+
15#include <Eigen/Dense>
+
16
+
17
+
19class TagMap {
+
20public:
+ +
23
+
25 int id_i ;
+
27 double x_d;
+
29 double y_d;
+
31 double z_d;
+
32 };
+
33
+
35 std::vector<single_landmark_s> landmark_list ;
+
36
+
37};
+
38
+
41class Mvn
+
42{
+
43public:
+ +
48 const std::vector<double>& std)
+
49 {
+
50 int N = std.size() - 1;
+
51 mean.resize(N);
+
52 mean(0) = landmark.x_d;
+
53 mean(1) = landmark.y_d;
+
54 mean(2) = landmark.z_d;
+
55
+
56 sigma.resize(N, N);
+
57 for (int i = 0; i < N; ++i) {
+
58 for (int j = 0; j < N; ++j) {
+
59 sigma(i, j) = (i == j) ? std[i] * std[j] : 0.0;
+
60 }
+
61 }
+
62
+
63 sigma_inv = sigma.inverse();
+
64 sigma_det = sigma.determinant();
+
65
+
66 }
+ +
69 {
+
70
+
71 }
+
72 template <typename T>
+
74 double pdf(const T& obs_m) const
+
75 {
+
76 Eigen::Vector3d x;
+
77 x << obs_m.x, obs_m.y, obs_m.z;
+
78
+
79 double n = x.rows();
+
80 double sqrt2pi = std::sqrt(2 * M_PI);
+
81 double quadform = (x - mean).transpose() * sigma_inv * (x - mean);
+
82 double norm = std::pow(sqrt2pi, - n) *
+
83 std::pow(sigma_det, - 0.5);
+
84
+
85 return norm * exp(-0.5 * quadform);
+
86 }
+
87
+
88private:
+
89 Eigen::VectorXd mean;
+
90 Eigen::MatrixXd sigma;
+
91 Eigen::MatrixXd sigma_inv;
+
92 double sigma_det;
+
93};
+
94
+
96struct Particle {
+
97
+
98 int id;
+
99 double x;
+
100 double y;
+
101 double z;
+
102 double theta;
+
103 double weight;
+
104
+
108 friend std::ostream &operator<<(std::ostream &os, const Particle &particle)
+
109 {
+
110 os << "id: " << particle.id << " x: " << particle.x << " y: " << particle.y << " z: " << particle.z << " theta: "
+
111 << particle.theta << " weight: " << particle.weight;
+
112 return os;
+
113 }
+
114
+
115};
+
116
+ +
121
+
123 int id;
+
125 double x;
+
127 double y;
+
129 double z;
+
130};
+
131
+
132
+ +
142
+
144 int num_particles;
+
145
+
146
+
148 bool is_initialized;
+
149
+
151 std::vector<double> weights;
+
152
+
153 const TagMap tagMap_;
+
154 double delta_t;
+
155
+
156 Twist * cmd_;
+
157 std::vector<Mvn*> mvn_;
+
158 std::vector<double> sigma_pos_;
+
159 std::vector<double> xEst_;
+
160
+
161
+
162
+
163
+
164
+
165public:
+
166
+
168 std::vector<Particle> particles;
+
169
+
172 ParticleFilter(int num_particles, const TagMap& tagMap, double delta_t) :
+
173 num_particles(num_particles), tagMap_(tagMap), is_initialized(false), delta_t(0.03) {}
+
174
+
175 void operator()(std::vector<double>& state);
+
176 // Deconstructor
+ +
178
+
179
+
180 }
+
181
+
182 void update_cmd(Twist *cmd)
+
183 {
+
184 cmd_ = cmd;
+
185 }
+
186
+
187 // interface
+
188 void update(const std::vector<double>& obs, std::vector<double>& result);
+
189
+
190
+
200 void init(const std::vector<double>& x0, const std::vector<double>& std);
+
201
+
211 void prediction(double delta_t, const std::vector<double>& std_pos, const Twist* cmd);
+
212
+
219 void dataAssociation(std::vector<LandmarkObs> predicted, std::vector<LandmarkObs>& observations);
+
220
+
230 void updateWeights(double sensor_range, const std::vector<double>& std_landmark, std::vector<LandmarkObs> observations,
+
231 TagMap map_landmarks);
+
232
+
237 void resample();
+
238
+
239 /*
+
240 * write Writes particle positions to a file.
+
241 * @param filename File to write particle positions to.
+
242 */
+
243 void write(std::string filename);
+
244
+
248 const bool initialized() const {
+
249 return is_initialized;
+
250 }
+
251
+
252protected:
+
253
+
254
+
255/*
+
256 * Computes the Euclidean distance between two 2D points.
+
257 * @param (x1,y1) x and y coordinates of first point
+
258 * @param (x2,y2) x and y coordinates of second point
+
259 * @output Euclidean distance between two 2D points
+
260 */
+
261 inline double dist(double x1, double y1, double z1, double x2, double y2, double z2) {
+
262 return sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) + (z2 - z1) * (z2 - z1) );
+
263 }
+
264
+
265 inline double * getError(double gt_x, double gt_y, double gt_z, double gt_theta, double pf_x, double pf_y, double pf_z, double pf_theta) {
+
266 static double error[3];
+
267 error[0] = fabs(pf_x - gt_x);
+
268 error[1] = fabs(pf_y - gt_y);
+
269 error[2] = fabs(pf_z - gt_z);
+
270 error[3] = fabs(pf_theta - gt_theta);
+
271 error[3] = fmod(error[2], 2.0 * M_PI);
+
272 if (error[3] > M_PI) {
+
273 error[3] = 2.0 * M_PI - error[3];
+
274 }
+
275 return error;
+
276 }
+
277
+
278};
+
279
+
280
+
281
+
282#endif /* PARTICLE_FILTER_H_ */
+
initializes the mean and covariance matrix for the distribution. The mean and covariance matrix are u...
+
Mvn(const TagMap::single_landmark_s &landmark, const std::vector< double > &std)
Constructo.
+
double pdf(const T &obs_m) const
Calculates the probability density function value for a given observation.
+
~Mvn()
Deconstructor.
+
initializing particles to Gaussian distribution around first position and then Predicts the state for...
+
void init(const std::vector< double > &x0, const std::vector< double > &std)
Init Initializes particle filter by initializing particles to Gaussian distribution around first posi...
+
double * getError(double gt_x, double gt_y, double gt_z, double gt_theta, double pf_x, double pf_y, double pf_z, double pf_theta)
+
const bool initialized() const
+
std::vector< Particle > particles
Set of current particles.
+ +
void prediction(double delta_t, const std::vector< double > &std_pos, const Twist *cmd)
+
void operator()(std::vector< double > &state)
+
void updateWeights(double sensor_range, const std::vector< double > &std_landmark, std::vector< LandmarkObs > observations, TagMap map_landmarks)
+ +
double dist(double x1, double y1, double z1, double x2, double y2, double z2)
+
void update(const std::vector< double > &obs, std::vector< double > &result)
+
void dataAssociation(std::vector< LandmarkObs > predicted, std::vector< LandmarkObs > &observations)
+
ParticleFilter(int num_particles, const TagMap &tagMap, double delta_t)
+
void update_cmd(Twist *cmd)
+
void write(std::string filename)
+
Data structure to store information about landmarks in a map.
+
std::vector< single_landmark_s > landmark_list
List of landmarks in the map.
+
It is a Struct representing one landmark observation measurement.
+
int id
Id of matching landmark in the map.
+
double y
Local (vehicle coordinates) y position of landmark observation [m].
+
double z
Local (vehicle coordinates) z position of landmark observation [m].
+
double x
Local (vehicle coordinates) x position of landmark observation [m].
+
This structure allows us to create particles and set their values.
+ +
friend std::ostream & operator<<(std::ostream &os, const Particle &particle)
+ + + +
double theta
+
double weight
+
structure holds information about each individual landmark, including its ID, and its x,...
+ +
double x_d
Landmark x-position in the map (global coordinates)
+
double y_d
Landmark y-position in the map (global coordinates)
+
double z_d
Landmark z-position in the map (global coordinates)
+
+ + + + diff --git a/doxygen/html/robot__defs_8h.html b/docs/html/robot__defs_8h.html similarity index 81% rename from doxygen/html/robot__defs_8h.html rename to docs/html/robot__defs_8h.html index 613c6ee..db557d8 100644 --- a/doxygen/html/robot__defs_8h.html +++ b/docs/html/robot__defs_8h.html @@ -3,7 +3,7 @@ - + airlib: include/airlib/robot_defs.h File Reference @@ -29,7 +29,7 @@ - + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
robot_defs.h
+
+
+Go to the documentation of this file.
1#pragma once
+
2#include <iostream>
+
3#include <string>
+
4#include <math.h>
+
5
+
6//const int STATE_DIM = 10;
+
7
+ +
10{
+
12 double x;
+
14 double y;
+
16 double z;
+
18 double theta;
+
19// double vx; // x-linear velocity (in meters)
+
20// double vy; // y-linear velocity (in meters)
+
21// double vz; // z-linear velocity (in meters)
+
22// double wx; // x-angular velocity (in meters)
+
23// double wy; // y-angular velocity (in meters)
+
24// double wz; // z-angular velocity (in meters)
+
25};
+
26
+
27
+ +
30{
+
31 std::string tagName; // Index of observed marker [0-n]
+ + +
37 double polar_angle;
+
38
+
39
+
44 friend std::ostream &operator<<(std::ostream &os, const MarkerObservation &observation) {
+
45 double degFactor = (180.0/3.141592653589793238463);
+
46 os << "tagName: " << observation.tagName << " radial_distance: " << observation.radial_distance
+
47 << " azimuthal_angle: " << observation.azimuthal_angle * degFactor << " polar_angle: " << observation.polar_angle * degFactor;
+
48 return os;
+
49 }
+
50
+
51};
+
52
+
53
+ +
56{
+
57 std::string tagName;
+
59 double x;
+
61 double y;
+
63 double z;
+
64
+ +
68 {
+
69 double rho = sqrt(x * x + y * y + z * z);
+
70 double phi = atan2(x, z);
+
71 double theta = atan2(hypot(x, z), y);
+
72 return MarkerObservation{tagName, rho, theta, phi};
+
73
+
74 }
+
78 friend std::ostream &operator<<(std::ostream &os, const FieldLocation &location) {
+
79 os << "tagName: " << location.tagName << " x: " << location.x << " y: " << location.y << " z: " << location.z;
+
80 return os;
+
81 }
+
82
+
83
+ +
88 {
+
89 double dx = x - other.x;
+
90 double dy = y - other.y;
+
91 double dz = z - other.z;
+
92 return FieldLocation{tagName + "-" + other.tagName, dx, dy, dz};
+
93 }
+
94
+ +
99 {
+
100 double dx = x + other.x;
+
101 double dy = y + other.y;
+
102 double dz = z + other.z;
+
103 return FieldLocation{tagName, dx, dy, dz};
+
104 }
+
105
+
109 FieldLocation operator * (double scale) const
+
110 {
+
111 double dx = x * scale;
+
112 double dy = y * scale;
+
113 double dz = z * scale;
+
114 return FieldLocation{tagName, dx, dy, dz};
+
115 }
+
116};
+
Field location structure.
Definition: robot_defs.h:56
+
std::string tagName
Definition: robot_defs.h:57
+
double x
x-position (in meters)
Definition: robot_defs.h:59
+
double z
z-position (in meters)
Definition: robot_defs.h:63
+
FieldLocation operator*(double scale) const
Calculates the product between two tags.
Definition: robot_defs.h:109
+
double y
y-position (in meters)
Definition: robot_defs.h:61
+
MarkerObservation toObservation()
Calculates the radial distance, azimuthal angle and polar angle using x,y,z position.
Definition: robot_defs.h:67
+
FieldLocation operator+(const FieldLocation &other) const
Calculates the sum of two tags.
Definition: robot_defs.h:98
+
FieldLocation operator-(const FieldLocation &other) const
Calculates the difference between two tags.
Definition: robot_defs.h:87
+
friend std::ostream & operator<<(std::ostream &os, const FieldLocation &location)
Definition: robot_defs.h:78
+
Field location structure in radial distance (r), azimuthal angle (theta), and polar angle (psi)
Definition: robot_defs.h:30
+
double azimuthal_angle
Observed bearing to landmark in the XY coordinate frame.
Definition: robot_defs.h:35
+
std::string tagName
Definition: robot_defs.h:31
+
friend std::ostream & operator<<(std::ostream &os, const MarkerObservation &observation)
Definition: robot_defs.h:44
+
double radial_distance
Observed distance to landmark from robot position
Definition: robot_defs.h:33
+
double polar_angle
Observed bearing to landmark in the positive Z axis.
Definition: robot_defs.h:37
+
Structure defining the state of the drone.
Definition: robot_defs.h:10
+
double theta
z-orientation (in radians)
Definition: robot_defs.h:18
+
double z
z-position (in meters)
Definition: robot_defs.h:16
+
double x
x-position(in meters)
Definition: robot_defs.h:12
+
double y
y-position (in meters)
Definition: robot_defs.h:14
+
+ + + + diff --git a/docs/html/search/all_0.js b/docs/html/search/all_0.js new file mode 100644 index 0000000..b0e33ed --- /dev/null +++ b/docs/html/search/all_0.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['addheader_0',['addHeader',['../classLoggerCSV.html#a2c3316d5c7c272357512d83c152232cd',1,'LoggerCSV']]], + ['addrow_1',['addRow',['../classLoggerCSV.html#a9c9d7e83cf30030bc380d0e31cbaceca',1,'LoggerCSV']]], + ['apriltag_5fcallback_2',['apriltag_callback',['../classApriltagLandmarks.html#ace7326fcc563193fabaa2e4e0a92d271',1,'ApriltagLandmarks']]], + ['apriltag_5fcomplementary_5fpid_2ecpp_3',['apriltag_complementary_pid.cpp',['../apriltag__complementary__pid_8cpp.html',1,'']]], + ['apriltag_5fekf_5fpid_2ecpp_4',['apriltag_ekf_pid.cpp',['../apriltag__ekf__pid_8cpp.html',1,'']]], + ['apriltaglandmarks_5',['ApriltagLandmarks',['../classApriltagLandmarks.html',1,'ApriltagLandmarks'],['../classApriltagLandmarks.html#a9e32395a2cd0485d753fb0979ef8ed68',1,'ApriltagLandmarks::ApriltagLandmarks()']]], + ['apriltaglandmarks_2ecpp_6',['ApriltagLandmarks.cpp',['../ApriltagLandmarks_8cpp.html',1,'']]], + ['apriltaglandmarks_2eh_7',['ApriltagLandmarks.h',['../ApriltagLandmarks_8h.html',1,'']]], + ['azimuthal_5fangle_8',['azimuthal_angle',['../structMarkerObservation.html#a100373bce74cf49ea8870196d2acf74b',1,'MarkerObservation']]] +]; diff --git a/docs/html/search/all_1.js b/docs/html/search/all_1.js new file mode 100644 index 0000000..b5111c9 --- /dev/null +++ b/docs/html/search/all_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['bebop2_0',['bebop2',['../namespacebebop2.html',1,'']]], + ['blue_1',['BLUE',['../namespacebebop2.html#a5db54b5dbc3283ac2d156b317597b5bfa3ba9d75b5521ab4bf2c90492a734c244',1,'bebop2']]], + ['buttonstate_2',['ButtonState',['../classbebop2_1_1ControllerBase.html#a76352e69566212036f3d7207ce4b6cc0',1,'bebop2::ControllerBase']]] +]; diff --git a/docs/html/search/all_10.js b/docs/html/search/all_10.js new file mode 100644 index 0000000..5932770 --- /dev/null +++ b/docs/html/search/all_10.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['sensorbase_0',['SensorBase',['../classSensorBase.html',1,'']]], + ['sensorbase_2eh_1',['SensorBase.h',['../SensorBase_8h.html',1,'']]], + ['sensorptr_2',['SensorPtr',['../SensorBase_8h.html#ae79ed385e2ca22ae255892167db2390c',1,'SensorBase.h']]], + ['sensors_2eh_3',['sensors.h',['../sensors_8h.html',1,'']]], + ['set_5fmarker_5fcolor_4',['set_marker_color',['../classbebop2_1_1ControlViz.html#aa520a0b7efe18ff02186c6cfcac05181',1,'bebop2::ControlViz']]], + ['set_5fmarker_5ffrom_5fpose_5',['set_marker_from_pose',['../classbebop2_1_1ControlViz.html#ae21b0f1d37929ae2378f709e201cd86c',1,'bebop2::ControlViz']]], + ['setdrone_6',['setDrone',['../classbebop2_1_1ControlViz.html#ac6141e56c2fd5936ed6f261309ca90a1',1,'bebop2::ControlViz']]], + ['single_5flandmark_5fs_7',['single_landmark_s',['../structTagMap_1_1single__landmark__s.html',1,'TagMap']]], + ['state_5fdim_8',['STATE_DIM',['../classbebop2_1_1ExtendedKalmanFilter.html#add430272eb0874b6608f17cbb0f88ad4',1,'bebop2::ExtendedKalmanFilter']]], + ['stateobserver_9',['StateObserver',['../classbebop2_1_1StateObserver.html',1,'bebop2::StateObserver'],['../classbebop2_1_1StateObserver.html#a1bfd8d999a4246192a566feed36b82b7',1,'bebop2::StateObserver::StateObserver()']]], + ['stateobserver_2ecpp_10',['StateObserver.cpp',['../StateObserver_8cpp.html',1,'']]], + ['stateobserver_2eh_11',['StateObserver.h',['../StateObserver_8h.html',1,'']]], + ['stateobserverptr_12',['StateObserverPtr',['../namespacebebop2.html#a73dc7da96dafd486f0c43a33ea064d4c',1,'bebop2']]], + ['step_5fincr_13',['STEP_INCR',['../namespacebebop2.html#a4fd8275c9f8db3ebcbd93e1ea602678b',1,'bebop2']]] +]; diff --git a/docs/html/search/all_11.js b/docs/html/search/all_11.js new file mode 100644 index 0000000..96b9629 --- /dev/null +++ b/docs/html/search/all_11.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['tagmap_0',['TagMap',['../classTagMap.html',1,'']]], + ['tagname_1',['tagName',['../structMarkerObservation.html#a1de968d571f84b2943de2a8609db2c3d',1,'MarkerObservation::tagName()'],['../structFieldLocation.html#a1be847da2ecefc18b2181b8d3e8a1bb2',1,'FieldLocation::tagName()']]], + ['takeoff_2',['TAKEOFF',['../classbebop2_1_1ControllerBase.html#a76352e69566212036f3d7207ce4b6cc0a034f3ebd64c6dedc4232ea246cb82f0a',1,'bebop2::ControllerBase']]], + ['takeoff_5fcallback_3',['takeoff_callback',['../classbebop2_1_1DummyState.html#ae9bf8c28c906bd9766f6d333a9155b0b',1,'bebop2::DummyState']]], + ['theta_4',['theta',['../structParticle.html#a589eaf4e282cf6c07036670ae48eaee2',1,'Particle::theta()'],['../structRobotState.html#a347039726076c6fbe8874635dfa21af0',1,'RobotState::theta()']]], + ['toobservation_5',['toObservation',['../structFieldLocation.html#aba8010cdbd3ea54265db5d7cd75de44e',1,'FieldLocation']]], + ['transformtoglobalframe_6',['transformToGlobalFrame',['../classApriltagLandmarks.html#ae1fedc5c1e5d0bba0ddfbd881269df99',1,'ApriltagLandmarks']]] +]; diff --git a/docs/html/search/all_12.js b/docs/html/search/all_12.js new file mode 100644 index 0000000..c769958 --- /dev/null +++ b/docs/html/search/all_12.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['update_0',['update',['../classbebop2_1_1ControlViz.html#ae7bf24b46f45546fadad51a19964ede0',1,'bebop2::ControlViz::update()'],['../classComplementaryFilter.html#a522291c234d0d3562cab71f591f8f328',1,'ComplementaryFilter::update()'],['../classbebop2_1_1ExtendedKalmanFilter.html#a222a3660fa70e667b932949cb2a59075',1,'bebop2::ExtendedKalmanFilter::update()'],['../classFilterBase.html#a6371eb4ec395f259edd15b00594c6312',1,'FilterBase::update()'],['../classParticleFilter.html#a90019fe33003b008575111640f15946c',1,'ParticleFilter::update()']]], + ['update_5fcmd_1',['update_cmd',['../classbebop2_1_1ExtendedKalmanFilter.html#a9b197ee9ee0c74a6a3632832666794c7',1,'bebop2::ExtendedKalmanFilter::update_cmd()'],['../classParticleFilter.html#ad8fffecf872b9241525b9dcd4ed1fea5',1,'ParticleFilter::update_cmd(Twist *cmd)']]], + ['updateweights_2',['updateWeights',['../classParticleFilter.html#a624174682b3cf3a4c71a341d1f994372',1,'ParticleFilter']]] +]; diff --git a/docs/html/search/all_13.js b/docs/html/search/all_13.js new file mode 100644 index 0000000..e48b0c6 --- /dev/null +++ b/docs/html/search/all_13.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['warning_0',['WARNING',['../LQR_8h.html#a9e1796fdadec0df60e8d280ee783b85c',1,'LQR.h']]], + ['weight_1',['weight',['../structParticle.html#aa010c7b3f2b60f707f14bbc26ce8b414',1,'Particle']]], + ['write_2',['write',['../classParticleFilter.html#af13313fde404befb521e3ff208a08a19',1,'ParticleFilter']]] +]; diff --git a/docs/html/search/all_14.js b/docs/html/search/all_14.js new file mode 100644 index 0000000..81521b1 --- /dev/null +++ b/docs/html/search/all_14.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['x_0',['x',['../structParticle.html#a1e3e5e103cee69ae9acb9c3269d009d7',1,'Particle::x()'],['../structLandmarkObs.html#ae5a02a81f693771bbae301156e101246',1,'LandmarkObs::x()'],['../structRobotState.html#a7ca6f4e88ac7982242ab32cf5fba15e6',1,'RobotState::x()'],['../structFieldLocation.html#a2f101b216cd1177702266249290f382b',1,'FieldLocation::x()']]], + ['x_5f_1',['X_',['../classFilterBase.html#aeb7e15b1e110d25ce56508aaecbd91e3',1,'FilterBase']]], + ['x_5faxis_5findex_2',['X_AXIS_INDEX',['../namespacebebop2.html#a3d1183926660c413534f54a30a3e9926',1,'bebop2']]], + ['x_5fd_3',['x_d',['../structTagMap_1_1single__landmark__s.html#a3be6096099b3026eb0d3314779d997a4',1,'TagMap::single_landmark_s']]] +]; diff --git a/docs/html/search/all_15.js b/docs/html/search/all_15.js new file mode 100644 index 0000000..3d83018 --- /dev/null +++ b/docs/html/search/all_15.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['y_0',['y',['../structParticle.html#a434ab690dde4422ac74ae10f6ace7a52',1,'Particle::y()'],['../structLandmarkObs.html#a18f5101eb6de02e127ce6bca26032286',1,'LandmarkObs::y()'],['../structRobotState.html#ac96a8e033454034c95745aee1811ffc2',1,'RobotState::y()'],['../structFieldLocation.html#a91e5558f47b388feffccf1c23a93b5e6',1,'FieldLocation::y()']]], + ['y_5faxis_5findex_1',['Y_AXIS_INDEX',['../namespacebebop2.html#ace37141259c7e75b0ffbfb6234da5cf8',1,'bebop2']]], + ['y_5fd_2',['y_d',['../structTagMap_1_1single__landmark__s.html#a4e87e55a7c6f9849be215f1ded19b442',1,'TagMap::single_landmark_s']]], + ['yellow_3',['YELLOW',['../namespacebebop2.html#a5db54b5dbc3283ac2d156b317597b5bfa5262f6b9940c6b77dcc59a75fa477e95',1,'bebop2']]] +]; diff --git a/docs/html/search/all_16.js b/docs/html/search/all_16.js new file mode 100644 index 0000000..f856cb5 --- /dev/null +++ b/docs/html/search/all_16.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['z_0',['z',['../structParticle.html#a518399a50ebdd632b22d7f48e5958461',1,'Particle::z()'],['../structLandmarkObs.html#a4bb27957f350bd05c829766946b5f724',1,'LandmarkObs::z()'],['../structRobotState.html#a552998092784696aaf6db9c47ab6a425',1,'RobotState::z()'],['../structFieldLocation.html#a4cdf46653fc5e8fae3688924f7705897',1,'FieldLocation::z()']]], + ['z_5faxis_5findex_1',['Z_AXIS_INDEX',['../namespacebebop2.html#a68385be43a1e12d2a6c3130441467c93',1,'bebop2']]], + ['z_5fd_2',['z_d',['../structTagMap_1_1single__landmark__s.html#a718ca1c4ade6bfc9e79b91cd833fb6c8',1,'TagMap::single_landmark_s']]] +]; diff --git a/docs/html/search/all_17.js b/docs/html/search/all_17.js new file mode 100644 index 0000000..cbb2ec4 --- /dev/null +++ b/docs/html/search/all_17.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['_7efilterbase_0',['~FilterBase',['../classFilterBase.html#a69cc7472a68edafc479061d0f411bbaa',1,'FilterBase']]], + ['_7eloggercsv_1',['~LoggerCSV',['../classLoggerCSV.html#a3241cbbbe476425821ce05204c8bba6f',1,'LoggerCSV']]], + ['_7emvn_2',['~Mvn',['../classMvn.html#aec49f8e17feb48fbbd47f64c26565502',1,'Mvn']]], + ['_7eparticlefilter_3',['~ParticleFilter',['../classParticleFilter.html#a4f4ccdfa224f0a62c411230f7fb0cd65',1,'ParticleFilter']]] +]; diff --git a/doxygen/html/search/all_18.js b/docs/html/search/all_18.js similarity index 100% rename from doxygen/html/search/all_18.js rename to docs/html/search/all_18.js diff --git a/doxygen/html/search/all_19.js b/docs/html/search/all_19.js similarity index 100% rename from doxygen/html/search/all_19.js rename to docs/html/search/all_19.js diff --git a/doxygen/html/search/all_1a.js b/docs/html/search/all_1a.js similarity index 100% rename from doxygen/html/search/all_1a.js rename to docs/html/search/all_1a.js diff --git a/doxygen/html/search/all_1b.js b/docs/html/search/all_1b.js similarity index 100% rename from doxygen/html/search/all_1b.js rename to docs/html/search/all_1b.js diff --git a/docs/html/search/all_2.js b/docs/html/search/all_2.js new file mode 100644 index 0000000..b014af3 --- /dev/null +++ b/docs/html/search/all_2.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['calculate_0',['calculate',['../classbebop2_1_1PID.html#a9b7afa3e1573a2f673d3c7165f4e8be0',1,'bebop2::PID']]], + ['cmd_5fvel_5fcallback_1',['cmd_vel_callback',['../classbebop2_1_1DummyState.html#a759c288e1c05a40707af808391a0d48f',1,'bebop2::DummyState']]], + ['complementaryfilter_2',['ComplementaryFilter',['../classComplementaryFilter.html',1,'ComplementaryFilter'],['../classComplementaryFilter.html#a3538e9422629678ee68874ee20937aac',1,'ComplementaryFilter::ComplementaryFilter()']]], + ['complementaryfilter_2eh_3',['ComplementaryFilter.h',['../ComplementaryFilter_8h.html',1,'']]], + ['compute_5fcontrol_4',['compute_control',['../classbebop2_1_1QuadControllerPID.html#adf0cbf720225ac7b9d73aa103a82ccd8',1,'bebop2::QuadControllerPID::compute_control()'],['../classbebop2_1_1ControllerBase.html#a0619e69c4759098a59a2bdae5c503501',1,'bebop2::ControllerBase::compute_control(const std::vector< double > &X, const std::vector< double > &setPoints, std::vector< double > &control)=0']]], + ['control_5',['CONTROL',['../classbebop2_1_1ControllerBase.html#a76352e69566212036f3d7207ce4b6cc0a9e134b87d5f808d52d03c5f982da417a',1,'bebop2::ControllerBase']]], + ['control_5fdim_6',['CONTROL_DIM',['../classbebop2_1_1ExtendedKalmanFilter.html#a864b08f6504af5b5ff0bd45dfa5c9bc8',1,'bebop2::ExtendedKalmanFilter']]], + ['controllerbase_7',['ControllerBase',['../classbebop2_1_1ControllerBase.html',1,'bebop2::ControllerBase'],['../classbebop2_1_1ControllerBase.html#aecd53db3daa5f49032713283163636b0',1,'bebop2::ControllerBase::ControllerBase()']]], + ['controllerbase_2ecpp_8',['ControllerBase.cpp',['../ControllerBase_8cpp.html',1,'']]], + ['controllerbase_2eh_9',['ControllerBase.h',['../ControllerBase_8h.html',1,'']]], + ['controlviz_10',['ControlViz',['../classbebop2_1_1ControlViz.html',1,'bebop2::ControlViz'],['../classbebop2_1_1ControlViz.html#aad6dd4782c5662f432a5fca0d44fb1f2',1,'bebop2::ControlViz::ControlViz()']]], + ['controlviz_2ecpp_11',['ControlViz.cpp',['../ControlViz_8cpp.html',1,'']]], + ['controlviz_2eh_12',['ControlViz.h',['../ControlViz_8h.html',1,'']]], + ['cyan_13',['CYAN',['../namespacebebop2.html#a5db54b5dbc3283ac2d156b317597b5bfa44c9a43229973ff5a8cc20e691444da5',1,'bebop2']]] +]; diff --git a/docs/html/search/all_3.js b/docs/html/search/all_3.js new file mode 100644 index 0000000..596e28d --- /dev/null +++ b/docs/html/search/all_3.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['dataassociation_0',['dataAssociation',['../classParticleFilter.html#abe77ed78890ea19a87a19c6cbad9a5b9',1,'ParticleFilter']]], + ['dead_5fzone_1',['DEAD_ZONE',['../namespacebebop2.html#a6338d1064f32f481f613f760641cb849',1,'bebop2']]], + ['debug_2',['DEBUG',['../LQR_8h.html#a3dfa58b1c5c2943dd49d8aa1981d377d',1,'LQR.h']]], + ['dist_3',['dist',['../classParticleFilter.html#a8589bf33200bca543a8a54caecf7ad14',1,'ParticleFilter']]], + ['dt_4',['DT',['../classbebop2_1_1ExtendedKalmanFilter.html#ace00431562f973d1e277e0fdf9249c82',1,'bebop2::ExtendedKalmanFilter']]], + ['dt_5f_5',['dt_',['../classbebop2_1_1ControllerBase.html#a2b0de02e8c727752a1dad0a2857f2013',1,'bebop2::ControllerBase']]], + ['dummy_5fekf_5fpid_2ecpp_6',['dummy_ekf_pid.cpp',['../dummy__ekf__pid_8cpp.html',1,'']]], + ['dummystate_7',['DummyState',['../classbebop2_1_1DummyState.html',1,'bebop2::DummyState'],['../classbebop2_1_1DummyState.html#aa704cb1fb20c0a80e881478b07af2118',1,'bebop2::DummyState::DummyState()']]], + ['dummystate_2ecpp_8',['DummyState.cpp',['../DummyState_8cpp.html',1,'']]], + ['dummystate_2eh_9',['DummyState.h',['../DummyState_8h.html',1,'']]] +]; diff --git a/docs/html/search/all_4.js b/docs/html/search/all_4.js new file mode 100644 index 0000000..bdb66f0 --- /dev/null +++ b/docs/html/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['empty_0',['empty',['../classApriltagLandmarks.html#adb855b900e2500bd2cb7b832b6a06d5d',1,'ApriltagLandmarks::empty()'],['../classbebop2_1_1DummyState.html#af718a706c941fb6cf3e283f8ff51965b',1,'bebop2::DummyState::empty()'],['../classSensorBase.html#a4f481426253035b3a39162d107f52a38',1,'SensorBase::empty()']]], + ['engage_1',['ENGAGE',['../classbebop2_1_1ControllerBase.html#a76352e69566212036f3d7207ce4b6cc0aa78035010c11ea80cefb7f54823d5083',1,'bebop2::ControllerBase']]], + ['eps_2',['EPS',['../LQR_8h.html#a6ebf6899d6c1c8b7b9d09be872c05aae',1,'LQR.h']]], + ['extendedkalmanfilter_3',['ExtendedKalmanFilter',['../classbebop2_1_1ExtendedKalmanFilter.html',1,'bebop2::ExtendedKalmanFilter'],['../classbebop2_1_1ExtendedKalmanFilter.html#acdff0e290cf27a84a68097a653245f37',1,'bebop2::ExtendedKalmanFilter::ExtendedKalmanFilter()']]], + ['extendedkalmanfilter_2ecpp_4',['ExtendedKalmanFilter.cpp',['../ExtendedKalmanFilter_8cpp.html',1,'']]], + ['extendedkalmanfilter_2eh_5',['ExtendedKalmanFilter.h',['../ExtendedKalmanFilter_8h.html',1,'']]] +]; diff --git a/docs/html/search/all_5.js b/docs/html/search/all_5.js new file mode 100644 index 0000000..de06c11 --- /dev/null +++ b/docs/html/search/all_5.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['fieldlocation_0',['FieldLocation',['../structFieldLocation.html',1,'']]], + ['filterbase_1',['FilterBase',['../classFilterBase.html',1,'FilterBase'],['../classFilterBase.html#ab4c3dc4501905d2d7d17d4d96ffbd6eb',1,'FilterBase::FilterBase()']]], + ['filterbase_2eh_2',['FilterBase.h',['../FilterBase_8h.html',1,'']]], + ['filterptr_3',['FilterPtr',['../FilterBase_8h.html#aec1719f7c37e43544283ed24fab742c9',1,'FilterBase.h']]], + ['filters_2eh_4',['filters.h',['../filters_8h.html',1,'']]] +]; diff --git a/docs/html/search/all_6.js b/docs/html/search/all_6.js new file mode 100644 index 0000000..a83a3cf --- /dev/null +++ b/docs/html/search/all_6.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['geterror_0',['getError',['../classParticleFilter.html#a1d90b6ed0e0e88f21d21dd324698ea7a',1,'ParticleFilter']]], + ['getptr_1',['getPtr',['../classFilterBase.html#a7ea28d3367b18f79a586e75546005172',1,'FilterBase::getPtr()'],['../classSensorBase.html#aacd7a71d84767414807a14b34a5ad7c6',1,'SensorBase::getPtr()']]], + ['gettimestamp_2',['getTimestamp',['../classLoggerCSV.html#a34f36a942a6fecb0cacf720f43774b44',1,'LoggerCSV']]], + ['goal_5fdistance_3',['goal_distance',['../classbebop2_1_1ControllerBase.html#adcc0fee29e5f7b7f6a19a640955eb652',1,'bebop2::ControllerBase']]], + ['gray_4',['GRAY',['../namespacebebop2.html#a5db54b5dbc3283ac2d156b317597b5bfa3bdf1108294862aab590f14ae8b19962',1,'bebop2']]], + ['green_5',['GREEN',['../namespacebebop2.html#a5db54b5dbc3283ac2d156b317597b5bfa60ee5eacf4c977d6bb56b14d659b4acb',1,'bebop2']]] +]; diff --git a/docs/html/search/all_7.js b/docs/html/search/all_7.js new file mode 100644 index 0000000..729934b --- /dev/null +++ b/docs/html/search/all_7.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['id_0',['id',['../structParticle.html#a544b202775517f8ba05efcb9e0a21bee',1,'Particle::id()'],['../structLandmarkObs.html#a102b941ef9037ff29102efbfd2c9043e',1,'LandmarkObs::id()']]], + ['id_5fi_1',['id_i',['../structTagMap_1_1single__landmark__s.html#a083fbd02bc345db3c25551765f4332c2',1,'TagMap::single_landmark_s']]], + ['idle_2',['IDLE',['../classbebop2_1_1ControllerBase.html#a76352e69566212036f3d7207ce4b6cc0a2eb4f2f58d711bb2fc7cf6443830e41b',1,'bebop2::ControllerBase']]], + ['init_3',['init',['../classbebop2_1_1PID.html#a3bdaa787b389dc3c1ce287110bd5adb8',1,'bebop2::PID::init()'],['../classComplementaryFilter.html#a73d1dccaf8172850b8ba2abd0875cd70',1,'ComplementaryFilter::init()'],['../classbebop2_1_1ExtendedKalmanFilter.html#a93b97c85025a9792558c02baa4ec6388',1,'bebop2::ExtendedKalmanFilter::init()'],['../classFilterBase.html#a67503fcfa27c21d3d0adb6570ec0a7da',1,'FilterBase::init()'],['../classParticleFilter.html#a11d7f5a1aba6a649dc9d0cb661fa014d',1,'ParticleFilter::init(const std::vector< double > &x0, const std::vector< double > &std)']]], + ['initialized_4',['initialized',['../classParticleFilter.html#a21191cc75e036c60f1b2a3965a241266',1,'ParticleFilter']]], + ['internal_5fupdate_5',['internal_update',['../classbebop2_1_1ExtendedKalmanFilter.html#a9780edd80082973223723de463046506',1,'bebop2::ExtendedKalmanFilter']]] +]; diff --git a/docs/html/search/all_8.js b/docs/html/search/all_8.js new file mode 100644 index 0000000..5ff07e8 --- /dev/null +++ b/docs/html/search/all_8.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['jacobf_0',['jacobF',['../classbebop2_1_1ExtendedKalmanFilter.html#a099b533a912aa76f92b7a820c3086f54',1,'bebop2::ExtendedKalmanFilter']]], + ['jacobh_1',['jacobH',['../classbebop2_1_1ExtendedKalmanFilter.html#a98b524af05ef67b13b5319e3531cb97c',1,'bebop2::ExtendedKalmanFilter']]] +]; diff --git a/docs/html/search/all_9.js b/docs/html/search/all_9.js new file mode 100644 index 0000000..7660207 --- /dev/null +++ b/docs/html/search/all_9.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['land_0',['LAND',['../classbebop2_1_1ControllerBase.html#a76352e69566212036f3d7207ce4b6cc0a8b7d2a81407259ab3721dfc2e6827b97',1,'bebop2::ControllerBase']]], + ['land_5fcallback_1',['land_callback',['../classbebop2_1_1DummyState.html#a7a06058ab728c2f955a8524f46f34c36',1,'bebop2::DummyState']]], + ['landmark_5flist_2',['landmark_list',['../classTagMap.html#aaca48e131c1dc7c3ba30e1313aebb13f',1,'TagMap']]], + ['landmarkobs_3',['LandmarkObs',['../structLandmarkObs.html',1,'']]], + ['loggercsv_4',['LoggerCSV',['../classLoggerCSV.html',1,'LoggerCSV'],['../classLoggerCSV.html#a727b61abcb5030665d0ab73a68ed6f6e',1,'LoggerCSV::LoggerCSV()'],['../classLoggerCSV.html#a0cfadbfb1cce7279e3c675a23d73ec7e',1,'LoggerCSV::LoggerCSV(const std::vector< std::string > &header)'],['../classLoggerCSV.html#a4730a968872141ec2ece9ef90c2d7186',1,'LoggerCSV::LoggerCSV(const std::vector< std::string > &header, const int frequency)']]], + ['loggercsv_2eh_5',['LoggerCSV.h',['../LoggerCSV_8h.html',1,'']]], + ['lqr_6',['LQR',['../classbebop2_1_1LQR.html',1,'bebop2::LQR'],['../classbebop2_1_1LQR.html#a78b5ce9848271cc53e117d1263bbd879',1,'bebop2::LQR::LQR()']]], + ['lqr_2ecpp_7',['LQR.cpp',['../LQR_8cpp.html',1,'']]], + ['lqr_2eh_8',['LQR.h',['../LQR_8h.html',1,'']]] +]; diff --git a/docs/html/search/all_a.js b/docs/html/search/all_a.js new file mode 100644 index 0000000..dd9bc09 --- /dev/null +++ b/docs/html/search/all_a.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['m_5fbuttonstate_0',['m_buttonState',['../classbebop2_1_1ControllerBase.html#a587d4539796276947acfceedd74daf2c',1,'bebop2::ControllerBase']]], + ['m_5ffilter_1',['m_filter',['../classbebop2_1_1StateObserver.html#a6ededc78ab08eba61eab678ed7a7896a',1,'bebop2::StateObserver']]], + ['m_5fget_5fstate_2',['m_get_state',['../classbebop2_1_1ControllerBase.html#afcf21b03e3a3c40f8173e4819a2a4230',1,'bebop2::ControllerBase']]], + ['m_5fgoal_5fthres_3',['m_goal_thres',['../classbebop2_1_1ControllerBase.html#a405dcc08256f764191275e542d37a955',1,'bebop2::ControllerBase']]], + ['m_5finitialized_4',['m_initialized',['../classbebop2_1_1StateObserver.html#a4304686fa39b86122ea6892dfd472c08',1,'bebop2::StateObserver']]], + ['m_5fmu_5',['m_mu',['../classbebop2_1_1ControllerBase.html#a419cc93fc0637717522429e67b63f8dd',1,'bebop2::ControllerBase']]], + ['m_5fnh_6',['m_nh',['../classbebop2_1_1ControllerBase.html#add1eb5b349b755bdad661697bb184f2a',1,'bebop2::ControllerBase']]], + ['m_5fsensor_7',['m_sensor',['../classbebop2_1_1StateObserver.html#a743085128ae5fdb567d61ec1159176b8',1,'bebop2::StateObserver']]], + ['m_5fstate_8',['m_state',['../classbebop2_1_1StateObserver.html#a693f9d73394813a3209e41b46590c14f',1,'bebop2::StateObserver']]], + ['main_9',['main',['../apriltag__ekf__pid_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97',1,'main(int argc, char *argv[]): apriltag_ekf_pid.cpp'],['../apriltag__complementary__pid_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97',1,'main(int argc, char *argv[]): apriltag_complementary_pid.cpp'],['../localization_2Filters_2pf_2main_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4',1,'main(): main.cpp'],['../localization_2Filters_2ekf_2main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97',1,'main(int argc, char *argv[]): main.cpp'],['../control_2LQR_2main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97',1,'main(int argc, char *argv[]): main.cpp'],['../dummy__ekf__pid_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97',1,'main(int argc, char *argv[]): dummy_ekf_pid.cpp']]], + ['main_2ecpp_10',['main.cpp',['../localization_2Filters_2pf_2main_8cpp.html',1,'(Global Namespace)'],['../localization_2Filters_2ekf_2main_8cpp.html',1,'(Global Namespace)'],['../control_2LQR_2main_8cpp.html',1,'(Global Namespace)']]], + ['marker_5fcolor_11',['MARKER_COLOR',['../namespacebebop2.html#a5db54b5dbc3283ac2d156b317597b5bf',1,'bebop2']]], + ['markerobservation_12',['MarkerObservation',['../structMarkerObservation.html',1,'']]], + ['max_5fiteration_13',['MAX_ITERATION',['../LQR_8h.html#aefa7672f40a44cb9b17c8fb46210d1fd',1,'LQR.h']]], + ['motion_5fmodel_14',['motion_model',['../classbebop2_1_1ExtendedKalmanFilter.html#ae584586d81bc66c0f46b1a5aeffe7d26',1,'bebop2::ExtendedKalmanFilter']]], + ['mvn_15',['Mvn',['../classMvn.html#a3e6c158a9d5a08050dafec14ca2f788c',1,'Mvn::Mvn()'],['../classMvn.html',1,'Mvn']]] +]; diff --git a/docs/html/search/all_b.js b/docs/html/search/all_b.js new file mode 100644 index 0000000..32c1a2c --- /dev/null +++ b/docs/html/search/all_b.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['num_5fcontroller_0',['NUM_CONTROLLER',['../PID_8h.html#a586eceffc45bcf6e44cd7561f67fac38',1,'PID.h']]], + ['num_5fcontrols_1',['NUM_CONTROLS',['../namespacebebop2.html#ad130bb29243bfa4b86a561fee67cdade',1,'bebop2']]], + ['num_5fgains_2',['NUM_GAINS',['../PID_8h.html#abbc754940c9a64fb612517c1de0c271a',1,'PID.h']]] +]; diff --git a/docs/html/search/all_c.js b/docs/html/search/all_c.js new file mode 100644 index 0000000..3dc255f --- /dev/null +++ b/docs/html/search/all_c.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['observation_5fmodel_0',['observation_model',['../classbebop2_1_1ExtendedKalmanFilter.html#a555a02b112e88b63a92c230ae365b17f',1,'bebop2::ExtendedKalmanFilter']]], + ['operator_28_29_1',['operator()',['../classbebop2_1_1ExtendedKalmanFilter.html#a69797105ff979b3e5a602d1a87149297',1,'bebop2::ExtendedKalmanFilter::operator()()'],['../classParticleFilter.html#a60b736fab3746b834dd7cfb08fa5fb11',1,'ParticleFilter::operator()()'],['../classApriltagLandmarks.html#a11f9b912b3f326faa40eccc67e3ba7b2',1,'ApriltagLandmarks::operator()()'],['../classbebop2_1_1DummyState.html#a9a18fcd35402f1d756bd052def7cfb0e',1,'bebop2::DummyState::operator()()'],['../classSensorBase.html#ae77f79abe25a2939434e30575ea5fd30',1,'SensorBase::operator()()'],['../classbebop2_1_1StateObserver.html#a1d829045f35ed3531559f53aeb1773ca',1,'bebop2::StateObserver::operator()()']]], + ['operator_2a_2',['operator*',['../structFieldLocation.html#a7da89910c0992173841458f493027814',1,'FieldLocation']]], + ['operator_2b_3',['operator+',['../structFieldLocation.html#ac5966312a3d0df900873be1fa853d840',1,'FieldLocation']]], + ['operator_2d_4',['operator-',['../structFieldLocation.html#ae317351db47c70444f72a68516454402',1,'FieldLocation']]], + ['operator_3c_3c_5',['operator<<',['../structParticle.html#a2fa6df9fcd4dca7af54e59ed25db6e1f',1,'Particle::operator<<()'],['../structMarkerObservation.html#a4755337b360a2c606740ae5cc60b00e5',1,'MarkerObservation::operator<<()'],['../structFieldLocation.html#ae81613697d66349de9e6bff55d3bca4d',1,'FieldLocation::operator<<()']]] +]; diff --git a/docs/html/search/all_d.js b/docs/html/search/all_d.js new file mode 100644 index 0000000..b822a85 --- /dev/null +++ b/docs/html/search/all_d.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['parrot_20bebop2_20drone_20with_20joystick_20controller_20readme_20file_0',['Parrot Bebop2 Drone with Joystick Controller README File',['../index.html',1,'']]], + ['particle_1',['Particle',['../structParticle.html',1,'']]], + ['particle_5ffilter_2ecpp_2',['particle_filter.cpp',['../particle__filter_8cpp.html',1,'']]], + ['particle_5ffilter_2eh_3',['particle_filter.h',['../particle__filter_8h.html',1,'']]], + ['particlefilter_4',['ParticleFilter',['../classParticleFilter.html',1,'ParticleFilter'],['../classParticleFilter.html#accc05e707b48f1a8f1a10ed318c0dc55',1,'ParticleFilter::ParticleFilter(int num_particles, const TagMap &tagMap, double delta_t)']]], + ['particles_5',['particles',['../classParticleFilter.html#a4d73f797a7a4bfffbfbb4fd6d09114f9',1,'ParticleFilter']]], + ['pdf_6',['pdf',['../classMvn.html#a8317e80dc988ad98cf93428c4bcbfed6',1,'Mvn']]], + ['pid_7',['PID',['../classbebop2_1_1PID.html',1,'bebop2::PID'],['../classbebop2_1_1PID.html#a8c9b9e1417bdcefb64e04041d6caa339',1,'bebop2::PID::PID()']]], + ['pid_2ecpp_8',['PID.cpp',['../PID_8cpp.html',1,'']]], + ['pid_2eh_9',['PID.h',['../PID_8h.html',1,'']]], + ['polar_5fangle_10',['polar_angle',['../structMarkerObservation.html#aad670bccd0f025ea8808148e828878a2',1,'MarkerObservation']]], + ['prediction_11',['prediction',['../classParticleFilter.html#a541ece0fecb05f999382559c22454f3b',1,'ParticleFilter']]], + ['publish_5fcmd_5fvel_12',['publish_cmd_vel',['../classbebop2_1_1ControllerBase.html#a644d91e6e4bc12977deff541165a6b8c',1,'bebop2::ControllerBase']]], + ['publish_5ftf_13',['publish_tf',['../classSensorBase.html#ad56a833e43ba1c3c10cbf52024390e44',1,'SensorBase']]] +]; diff --git a/docs/html/search/all_e.js b/docs/html/search/all_e.js new file mode 100644 index 0000000..2ca67bf --- /dev/null +++ b/docs/html/search/all_e.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['quadcontrollerpid_0',['QuadControllerPID',['../classbebop2_1_1QuadControllerPID.html',1,'bebop2::QuadControllerPID'],['../classbebop2_1_1QuadControllerPID.html#a9a47a9d55416b290dfba482caf970cc8',1,'bebop2::QuadControllerPID::QuadControllerPID()']]], + ['quadcontrollerpid_2ecpp_1',['QuadControllerPID.cpp',['../QuadControllerPID_8cpp.html',1,'']]], + ['quadcontrollerpid_2eh_2',['QuadControllerPID.h',['../QuadControllerPID_8h.html',1,'']]] +]; diff --git a/docs/html/search/all_f.js b/docs/html/search/all_f.js new file mode 100644 index 0000000..a4669c6 --- /dev/null +++ b/docs/html/search/all_f.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['radial_5fdistance_0',['radial_distance',['../structMarkerObservation.html#a74eaf75e45d859ee6b8f8e4bd5439bae',1,'MarkerObservation']]], + ['readme_2emd_1',['README.md',['../README_8md.html',1,'']]], + ['red_2',['RED',['../namespacebebop2.html#a5db54b5dbc3283ac2d156b317597b5bfab02670d8848b739df45d4d55d704a4ae',1,'bebop2']]], + ['resample_3',['resample',['../classParticleFilter.html#a84265f4c32f6d157da1d40677c6c47cf',1,'ParticleFilter']]], + ['robot_5fdefs_2eh_4',['robot_defs.h',['../robot__defs_8h.html',1,'']]], + ['robotstate_5',['RobotState',['../structRobotState.html',1,'']]] +]; diff --git a/docs/html/search/classes_0.js b/docs/html/search/classes_0.js new file mode 100644 index 0000000..4cd6c63 --- /dev/null +++ b/docs/html/search/classes_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['apriltaglandmarks_0',['ApriltagLandmarks',['../classApriltagLandmarks.html',1,'']]] +]; diff --git a/docs/html/search/classes_1.js b/docs/html/search/classes_1.js new file mode 100644 index 0000000..0601916 --- /dev/null +++ b/docs/html/search/classes_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['complementaryfilter_0',['ComplementaryFilter',['../classComplementaryFilter.html',1,'']]], + ['controllerbase_1',['ControllerBase',['../classbebop2_1_1ControllerBase.html',1,'bebop2']]], + ['controlviz_2',['ControlViz',['../classbebop2_1_1ControlViz.html',1,'bebop2']]] +]; diff --git a/docs/html/search/classes_2.js b/docs/html/search/classes_2.js new file mode 100644 index 0000000..863cb2f --- /dev/null +++ b/docs/html/search/classes_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['dummystate_0',['DummyState',['../classbebop2_1_1DummyState.html',1,'bebop2']]] +]; diff --git a/doxygen/html/search/classes_3.js b/docs/html/search/classes_3.js similarity index 62% rename from doxygen/html/search/classes_3.js rename to docs/html/search/classes_3.js index 51c9149..2460601 100644 --- a/doxygen/html/search/classes_3.js +++ b/docs/html/search/classes_3.js @@ -1,4 +1,4 @@ var searchData= [ - ['extendedkalmanfilter_0',['ExtendedKalmanFilter',['../classbebop2_1_1_extended_kalman_filter.html',1,'bebop2']]] + ['extendedkalmanfilter_0',['ExtendedKalmanFilter',['../classbebop2_1_1ExtendedKalmanFilter.html',1,'bebop2']]] ]; diff --git a/docs/html/search/classes_4.js b/docs/html/search/classes_4.js new file mode 100644 index 0000000..b12f5eb --- /dev/null +++ b/docs/html/search/classes_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['fieldlocation_0',['FieldLocation',['../structFieldLocation.html',1,'']]], + ['filterbase_1',['FilterBase',['../classFilterBase.html',1,'']]] +]; diff --git a/docs/html/search/classes_5.js b/docs/html/search/classes_5.js new file mode 100644 index 0000000..a85aa6a --- /dev/null +++ b/docs/html/search/classes_5.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['landmarkobs_0',['LandmarkObs',['../structLandmarkObs.html',1,'']]], + ['loggercsv_1',['LoggerCSV',['../classLoggerCSV.html',1,'']]], + ['lqr_2',['LQR',['../classbebop2_1_1LQR.html',1,'bebop2']]] +]; diff --git a/docs/html/search/classes_6.js b/docs/html/search/classes_6.js new file mode 100644 index 0000000..1c6c6a6 --- /dev/null +++ b/docs/html/search/classes_6.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['markerobservation_0',['MarkerObservation',['../structMarkerObservation.html',1,'']]], + ['mvn_1',['Mvn',['../classMvn.html',1,'']]] +]; diff --git a/docs/html/search/classes_7.js b/docs/html/search/classes_7.js new file mode 100644 index 0000000..be0a503 --- /dev/null +++ b/docs/html/search/classes_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['particle_0',['Particle',['../structParticle.html',1,'']]], + ['particlefilter_1',['ParticleFilter',['../classParticleFilter.html',1,'']]], + ['pid_2',['PID',['../classbebop2_1_1PID.html',1,'bebop2']]] +]; diff --git a/doxygen/html/search/classes_8.js b/docs/html/search/classes_8.js similarity index 65% rename from doxygen/html/search/classes_8.js rename to docs/html/search/classes_8.js index 4427f68..2843901 100644 --- a/doxygen/html/search/classes_8.js +++ b/docs/html/search/classes_8.js @@ -1,4 +1,4 @@ var searchData= [ - ['quadcontrollerpid_0',['QuadControllerPID',['../classbebop2_1_1_quad_controller_p_i_d.html',1,'bebop2']]] + ['quadcontrollerpid_0',['QuadControllerPID',['../classbebop2_1_1QuadControllerPID.html',1,'bebop2']]] ]; diff --git a/docs/html/search/classes_9.js b/docs/html/search/classes_9.js new file mode 100644 index 0000000..f47b37a --- /dev/null +++ b/docs/html/search/classes_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['robotstate_0',['RobotState',['../structRobotState.html',1,'']]] +]; diff --git a/docs/html/search/classes_a.js b/docs/html/search/classes_a.js new file mode 100644 index 0000000..1d1417b --- /dev/null +++ b/docs/html/search/classes_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['sensorbase_0',['SensorBase',['../classSensorBase.html',1,'']]], + ['single_5flandmark_5fs_1',['single_landmark_s',['../structTagMap_1_1single__landmark__s.html',1,'TagMap']]], + ['stateobserver_2',['StateObserver',['../classbebop2_1_1StateObserver.html',1,'bebop2']]] +]; diff --git a/docs/html/search/classes_b.js b/docs/html/search/classes_b.js new file mode 100644 index 0000000..6eb9ccd --- /dev/null +++ b/docs/html/search/classes_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['tagmap_0',['TagMap',['../classTagMap.html',1,'']]] +]; diff --git a/doxygen/html/search/classes_c.js b/docs/html/search/classes_c.js similarity index 100% rename from doxygen/html/search/classes_c.js rename to docs/html/search/classes_c.js diff --git a/doxygen/html/search/classes_d.js b/docs/html/search/classes_d.js similarity index 100% rename from doxygen/html/search/classes_d.js rename to docs/html/search/classes_d.js diff --git a/doxygen/html/search/close.svg b/docs/html/search/close.svg similarity index 100% rename from doxygen/html/search/close.svg rename to docs/html/search/close.svg diff --git a/docs/html/search/defines_0.js b/docs/html/search/defines_0.js new file mode 100644 index 0000000..7c278fd --- /dev/null +++ b/docs/html/search/defines_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['debug_0',['DEBUG',['../LQR_8h.html#a3dfa58b1c5c2943dd49d8aa1981d377d',1,'LQR.h']]] +]; diff --git a/docs/html/search/defines_1.js b/docs/html/search/defines_1.js new file mode 100644 index 0000000..b86b877 --- /dev/null +++ b/docs/html/search/defines_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['eps_0',['EPS',['../LQR_8h.html#a6ebf6899d6c1c8b7b9d09be872c05aae',1,'LQR.h']]] +]; diff --git a/docs/html/search/defines_2.js b/docs/html/search/defines_2.js new file mode 100644 index 0000000..d62e0b7 --- /dev/null +++ b/docs/html/search/defines_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['max_5fiteration_0',['MAX_ITERATION',['../LQR_8h.html#aefa7672f40a44cb9b17c8fb46210d1fd',1,'LQR.h']]] +]; diff --git a/docs/html/search/defines_3.js b/docs/html/search/defines_3.js new file mode 100644 index 0000000..1e04699 --- /dev/null +++ b/docs/html/search/defines_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['num_5fcontroller_0',['NUM_CONTROLLER',['../PID_8h.html#a586eceffc45bcf6e44cd7561f67fac38',1,'PID.h']]], + ['num_5fgains_1',['NUM_GAINS',['../PID_8h.html#abbc754940c9a64fb612517c1de0c271a',1,'PID.h']]] +]; diff --git a/docs/html/search/defines_4.js b/docs/html/search/defines_4.js new file mode 100644 index 0000000..a8e20f4 --- /dev/null +++ b/docs/html/search/defines_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['warning_0',['WARNING',['../LQR_8h.html#a9e1796fdadec0df60e8d280ee783b85c',1,'LQR.h']]] +]; diff --git a/docs/html/search/enums_0.js b/docs/html/search/enums_0.js new file mode 100644 index 0000000..524eec5 --- /dev/null +++ b/docs/html/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['buttonstate_0',['ButtonState',['../classbebop2_1_1ControllerBase.html#a76352e69566212036f3d7207ce4b6cc0',1,'bebop2::ControllerBase']]] +]; diff --git a/doxygen/html/search/enums_1.js b/docs/html/search/enums_1.js similarity index 100% rename from doxygen/html/search/enums_1.js rename to docs/html/search/enums_1.js diff --git a/doxygen/html/search/enumvalues_0.js b/docs/html/search/enumvalues_0.js similarity index 100% rename from doxygen/html/search/enumvalues_0.js rename to docs/html/search/enumvalues_0.js diff --git a/docs/html/search/enumvalues_1.js b/docs/html/search/enumvalues_1.js new file mode 100644 index 0000000..2fc04a7 --- /dev/null +++ b/docs/html/search/enumvalues_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['control_0',['CONTROL',['../classbebop2_1_1ControllerBase.html#a76352e69566212036f3d7207ce4b6cc0a9e134b87d5f808d52d03c5f982da417a',1,'bebop2::ControllerBase']]], + ['cyan_1',['CYAN',['../namespacebebop2.html#a5db54b5dbc3283ac2d156b317597b5bfa44c9a43229973ff5a8cc20e691444da5',1,'bebop2']]] +]; diff --git a/docs/html/search/enumvalues_2.js b/docs/html/search/enumvalues_2.js new file mode 100644 index 0000000..4e696c5 --- /dev/null +++ b/docs/html/search/enumvalues_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['engage_0',['ENGAGE',['../classbebop2_1_1ControllerBase.html#a76352e69566212036f3d7207ce4b6cc0aa78035010c11ea80cefb7f54823d5083',1,'bebop2::ControllerBase']]] +]; diff --git a/doxygen/html/search/enumvalues_3.js b/docs/html/search/enumvalues_3.js similarity index 100% rename from doxygen/html/search/enumvalues_3.js rename to docs/html/search/enumvalues_3.js diff --git a/docs/html/search/enumvalues_4.js b/docs/html/search/enumvalues_4.js new file mode 100644 index 0000000..65ca870 --- /dev/null +++ b/docs/html/search/enumvalues_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['idle_0',['IDLE',['../classbebop2_1_1ControllerBase.html#a76352e69566212036f3d7207ce4b6cc0a2eb4f2f58d711bb2fc7cf6443830e41b',1,'bebop2::ControllerBase']]] +]; diff --git a/docs/html/search/enumvalues_5.js b/docs/html/search/enumvalues_5.js new file mode 100644 index 0000000..f90be4c --- /dev/null +++ b/docs/html/search/enumvalues_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['land_0',['LAND',['../classbebop2_1_1ControllerBase.html#a76352e69566212036f3d7207ce4b6cc0a8b7d2a81407259ab3721dfc2e6827b97',1,'bebop2::ControllerBase']]] +]; diff --git a/doxygen/html/search/enumvalues_6.js b/docs/html/search/enumvalues_6.js similarity index 100% rename from doxygen/html/search/enumvalues_6.js rename to docs/html/search/enumvalues_6.js diff --git a/docs/html/search/enumvalues_7.js b/docs/html/search/enumvalues_7.js new file mode 100644 index 0000000..5908e2f --- /dev/null +++ b/docs/html/search/enumvalues_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['takeoff_0',['TAKEOFF',['../classbebop2_1_1ControllerBase.html#a76352e69566212036f3d7207ce4b6cc0a034f3ebd64c6dedc4232ea246cb82f0a',1,'bebop2::ControllerBase']]] +]; diff --git a/doxygen/html/search/enumvalues_8.js b/docs/html/search/enumvalues_8.js similarity index 100% rename from doxygen/html/search/enumvalues_8.js rename to docs/html/search/enumvalues_8.js diff --git a/doxygen/html/search/files_0.js b/docs/html/search/files_0.js similarity index 56% rename from doxygen/html/search/files_0.js rename to docs/html/search/files_0.js index 074ad7e..dbd517e 100644 --- a/doxygen/html/search/files_0.js +++ b/docs/html/search/files_0.js @@ -2,6 +2,6 @@ var searchData= [ ['apriltag_5fcomplementary_5fpid_2ecpp_0',['apriltag_complementary_pid.cpp',['../apriltag__complementary__pid_8cpp.html',1,'']]], ['apriltag_5fekf_5fpid_2ecpp_1',['apriltag_ekf_pid.cpp',['../apriltag__ekf__pid_8cpp.html',1,'']]], - ['apriltaglandmarks_2ecpp_2',['ApriltagLandmarks.cpp',['../_apriltag_landmarks_8cpp.html',1,'']]], - ['apriltaglandmarks_2eh_3',['ApriltagLandmarks.h',['../_apriltag_landmarks_8h.html',1,'']]] + ['apriltaglandmarks_2ecpp_2',['ApriltagLandmarks.cpp',['../ApriltagLandmarks_8cpp.html',1,'']]], + ['apriltaglandmarks_2eh_3',['ApriltagLandmarks.h',['../ApriltagLandmarks_8h.html',1,'']]] ]; diff --git a/docs/html/search/files_1.js b/docs/html/search/files_1.js new file mode 100644 index 0000000..09bff6b --- /dev/null +++ b/docs/html/search/files_1.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['complementaryfilter_2eh_0',['ComplementaryFilter.h',['../ComplementaryFilter_8h.html',1,'']]], + ['controllerbase_2ecpp_1',['ControllerBase.cpp',['../ControllerBase_8cpp.html',1,'']]], + ['controllerbase_2eh_2',['ControllerBase.h',['../ControllerBase_8h.html',1,'']]], + ['controlviz_2ecpp_3',['ControlViz.cpp',['../ControlViz_8cpp.html',1,'']]], + ['controlviz_2eh_4',['ControlViz.h',['../ControlViz_8h.html',1,'']]] +]; diff --git a/docs/html/search/files_2.js b/docs/html/search/files_2.js new file mode 100644 index 0000000..270d485 --- /dev/null +++ b/docs/html/search/files_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['dummy_5fekf_5fpid_2ecpp_0',['dummy_ekf_pid.cpp',['../dummy__ekf__pid_8cpp.html',1,'']]], + ['dummystate_2ecpp_1',['DummyState.cpp',['../DummyState_8cpp.html',1,'']]], + ['dummystate_2eh_2',['DummyState.h',['../DummyState_8h.html',1,'']]] +]; diff --git a/docs/html/search/files_3.js b/docs/html/search/files_3.js new file mode 100644 index 0000000..17320f6 --- /dev/null +++ b/docs/html/search/files_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['extendedkalmanfilter_2ecpp_0',['ExtendedKalmanFilter.cpp',['../ExtendedKalmanFilter_8cpp.html',1,'']]], + ['extendedkalmanfilter_2eh_1',['ExtendedKalmanFilter.h',['../ExtendedKalmanFilter_8h.html',1,'']]] +]; diff --git a/doxygen/html/search/files_4.js b/docs/html/search/files_4.js similarity index 52% rename from doxygen/html/search/files_4.js rename to docs/html/search/files_4.js index 9ee64bb..e8eee3d 100644 --- a/doxygen/html/search/files_4.js +++ b/docs/html/search/files_4.js @@ -1,5 +1,5 @@ var searchData= [ - ['filterbase_2eh_0',['FilterBase.h',['../_filter_base_8h.html',1,'']]], + ['filterbase_2eh_0',['FilterBase.h',['../FilterBase_8h.html',1,'']]], ['filters_2eh_1',['filters.h',['../filters_8h.html',1,'']]] ]; diff --git a/docs/html/search/files_5.js b/docs/html/search/files_5.js new file mode 100644 index 0000000..7664acd --- /dev/null +++ b/docs/html/search/files_5.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['loggercsv_2eh_0',['LoggerCSV.h',['../LoggerCSV_8h.html',1,'']]], + ['lqr_2ecpp_1',['LQR.cpp',['../LQR_8cpp.html',1,'']]], + ['lqr_2eh_2',['LQR.h',['../LQR_8h.html',1,'']]] +]; diff --git a/docs/html/search/files_6.js b/docs/html/search/files_6.js new file mode 100644 index 0000000..3b49034 --- /dev/null +++ b/docs/html/search/files_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['main_2ecpp_0',['main.cpp',['../control_2LQR_2main_8cpp.html',1,'(Global Namespace)'],['../localization_2Filters_2ekf_2main_8cpp.html',1,'(Global Namespace)'],['../localization_2Filters_2pf_2main_8cpp.html',1,'(Global Namespace)']]] +]; diff --git a/doxygen/html/search/files_7.js b/docs/html/search/files_7.js similarity index 64% rename from doxygen/html/search/files_7.js rename to docs/html/search/files_7.js index 28c6e56..b70818a 100644 --- a/doxygen/html/search/files_7.js +++ b/docs/html/search/files_7.js @@ -2,6 +2,6 @@ var searchData= [ ['particle_5ffilter_2ecpp_0',['particle_filter.cpp',['../particle__filter_8cpp.html',1,'']]], ['particle_5ffilter_2eh_1',['particle_filter.h',['../particle__filter_8h.html',1,'']]], - ['pid_2ecpp_2',['PID.cpp',['../_p_i_d_8cpp.html',1,'']]], - ['pid_2eh_3',['PID.h',['../_p_i_d_8h.html',1,'']]] + ['pid_2ecpp_2',['PID.cpp',['../PID_8cpp.html',1,'']]], + ['pid_2eh_3',['PID.h',['../PID_8h.html',1,'']]] ]; diff --git a/docs/html/search/files_8.js b/docs/html/search/files_8.js new file mode 100644 index 0000000..47940a6 --- /dev/null +++ b/docs/html/search/files_8.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['quadcontrollerpid_2ecpp_0',['QuadControllerPID.cpp',['../QuadControllerPID_8cpp.html',1,'']]], + ['quadcontrollerpid_2eh_1',['QuadControllerPID.h',['../QuadControllerPID_8h.html',1,'']]] +]; diff --git a/doxygen/html/search/files_9.js b/docs/html/search/files_9.js similarity index 57% rename from doxygen/html/search/files_9.js rename to docs/html/search/files_9.js index 0684f19..b37cf11 100644 --- a/doxygen/html/search/files_9.js +++ b/docs/html/search/files_9.js @@ -1,5 +1,5 @@ var searchData= [ - ['readme_2emd_0',['README.md',['../_r_e_a_d_m_e_8md.html',1,'']]], + ['readme_2emd_0',['README.md',['../README_8md.html',1,'']]], ['robot_5fdefs_2eh_1',['robot_defs.h',['../robot__defs_8h.html',1,'']]] ]; diff --git a/docs/html/search/files_a.js b/docs/html/search/files_a.js new file mode 100644 index 0000000..113c108 --- /dev/null +++ b/docs/html/search/files_a.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['sensorbase_2eh_0',['SensorBase.h',['../SensorBase_8h.html',1,'']]], + ['sensors_2eh_1',['sensors.h',['../sensors_8h.html',1,'']]], + ['stateobserver_2ecpp_2',['StateObserver.cpp',['../StateObserver_8cpp.html',1,'']]], + ['stateobserver_2eh_3',['StateObserver.h',['../StateObserver_8h.html',1,'']]] +]; diff --git a/doxygen/html/search/files_b.js b/docs/html/search/files_b.js similarity index 100% rename from doxygen/html/search/files_b.js rename to docs/html/search/files_b.js diff --git a/docs/html/search/functions_0.js b/docs/html/search/functions_0.js new file mode 100644 index 0000000..c46218b --- /dev/null +++ b/docs/html/search/functions_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['addheader_0',['addHeader',['../classLoggerCSV.html#a2c3316d5c7c272357512d83c152232cd',1,'LoggerCSV']]], + ['addrow_1',['addRow',['../classLoggerCSV.html#a9c9d7e83cf30030bc380d0e31cbaceca',1,'LoggerCSV']]], + ['apriltag_5fcallback_2',['apriltag_callback',['../classApriltagLandmarks.html#ace7326fcc563193fabaa2e4e0a92d271',1,'ApriltagLandmarks']]], + ['apriltaglandmarks_3',['ApriltagLandmarks',['../classApriltagLandmarks.html#a9e32395a2cd0485d753fb0979ef8ed68',1,'ApriltagLandmarks']]] +]; diff --git a/docs/html/search/functions_1.js b/docs/html/search/functions_1.js new file mode 100644 index 0000000..6a83788 --- /dev/null +++ b/docs/html/search/functions_1.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['calculate_0',['calculate',['../classbebop2_1_1PID.html#a9b7afa3e1573a2f673d3c7165f4e8be0',1,'bebop2::PID']]], + ['cmd_5fvel_5fcallback_1',['cmd_vel_callback',['../classbebop2_1_1DummyState.html#a759c288e1c05a40707af808391a0d48f',1,'bebop2::DummyState']]], + ['complementaryfilter_2',['ComplementaryFilter',['../classComplementaryFilter.html#a3538e9422629678ee68874ee20937aac',1,'ComplementaryFilter']]], + ['compute_5fcontrol_3',['compute_control',['../classbebop2_1_1ControllerBase.html#a0619e69c4759098a59a2bdae5c503501',1,'bebop2::ControllerBase::compute_control()'],['../classbebop2_1_1QuadControllerPID.html#adf0cbf720225ac7b9d73aa103a82ccd8',1,'bebop2::QuadControllerPID::compute_control()']]], + ['controllerbase_4',['ControllerBase',['../classbebop2_1_1ControllerBase.html#aecd53db3daa5f49032713283163636b0',1,'bebop2::ControllerBase']]], + ['controlviz_5',['ControlViz',['../classbebop2_1_1ControlViz.html#aad6dd4782c5662f432a5fca0d44fb1f2',1,'bebop2::ControlViz']]] +]; diff --git a/docs/html/search/functions_10.js b/docs/html/search/functions_10.js new file mode 100644 index 0000000..c769958 --- /dev/null +++ b/docs/html/search/functions_10.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['update_0',['update',['../classbebop2_1_1ControlViz.html#ae7bf24b46f45546fadad51a19964ede0',1,'bebop2::ControlViz::update()'],['../classComplementaryFilter.html#a522291c234d0d3562cab71f591f8f328',1,'ComplementaryFilter::update()'],['../classbebop2_1_1ExtendedKalmanFilter.html#a222a3660fa70e667b932949cb2a59075',1,'bebop2::ExtendedKalmanFilter::update()'],['../classFilterBase.html#a6371eb4ec395f259edd15b00594c6312',1,'FilterBase::update()'],['../classParticleFilter.html#a90019fe33003b008575111640f15946c',1,'ParticleFilter::update()']]], + ['update_5fcmd_1',['update_cmd',['../classbebop2_1_1ExtendedKalmanFilter.html#a9b197ee9ee0c74a6a3632832666794c7',1,'bebop2::ExtendedKalmanFilter::update_cmd()'],['../classParticleFilter.html#ad8fffecf872b9241525b9dcd4ed1fea5',1,'ParticleFilter::update_cmd(Twist *cmd)']]], + ['updateweights_2',['updateWeights',['../classParticleFilter.html#a624174682b3cf3a4c71a341d1f994372',1,'ParticleFilter']]] +]; diff --git a/docs/html/search/functions_11.js b/docs/html/search/functions_11.js new file mode 100644 index 0000000..8cbf585 --- /dev/null +++ b/docs/html/search/functions_11.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['write_0',['write',['../classParticleFilter.html#af13313fde404befb521e3ff208a08a19',1,'ParticleFilter']]] +]; diff --git a/docs/html/search/functions_12.js b/docs/html/search/functions_12.js new file mode 100644 index 0000000..cbb2ec4 --- /dev/null +++ b/docs/html/search/functions_12.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['_7efilterbase_0',['~FilterBase',['../classFilterBase.html#a69cc7472a68edafc479061d0f411bbaa',1,'FilterBase']]], + ['_7eloggercsv_1',['~LoggerCSV',['../classLoggerCSV.html#a3241cbbbe476425821ce05204c8bba6f',1,'LoggerCSV']]], + ['_7emvn_2',['~Mvn',['../classMvn.html#aec49f8e17feb48fbbd47f64c26565502',1,'Mvn']]], + ['_7eparticlefilter_3',['~ParticleFilter',['../classParticleFilter.html#a4f4ccdfa224f0a62c411230f7fb0cd65',1,'ParticleFilter']]] +]; diff --git a/doxygen/html/search/functions_13.js b/docs/html/search/functions_13.js similarity index 100% rename from doxygen/html/search/functions_13.js rename to docs/html/search/functions_13.js diff --git a/doxygen/html/search/functions_14.js b/docs/html/search/functions_14.js similarity index 100% rename from doxygen/html/search/functions_14.js rename to docs/html/search/functions_14.js diff --git a/doxygen/html/search/functions_15.js b/docs/html/search/functions_15.js similarity index 100% rename from doxygen/html/search/functions_15.js rename to docs/html/search/functions_15.js diff --git a/doxygen/html/search/functions_16.js b/docs/html/search/functions_16.js similarity index 100% rename from doxygen/html/search/functions_16.js rename to docs/html/search/functions_16.js diff --git a/doxygen/html/search/functions_17.js b/docs/html/search/functions_17.js similarity index 100% rename from doxygen/html/search/functions_17.js rename to docs/html/search/functions_17.js diff --git a/doxygen/html/search/functions_18.js b/docs/html/search/functions_18.js similarity index 100% rename from doxygen/html/search/functions_18.js rename to docs/html/search/functions_18.js diff --git a/docs/html/search/functions_2.js b/docs/html/search/functions_2.js new file mode 100644 index 0000000..dd54122 --- /dev/null +++ b/docs/html/search/functions_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['dataassociation_0',['dataAssociation',['../classParticleFilter.html#abe77ed78890ea19a87a19c6cbad9a5b9',1,'ParticleFilter']]], + ['dist_1',['dist',['../classParticleFilter.html#a8589bf33200bca543a8a54caecf7ad14',1,'ParticleFilter']]], + ['dummystate_2',['DummyState',['../classbebop2_1_1DummyState.html#aa704cb1fb20c0a80e881478b07af2118',1,'bebop2::DummyState']]] +]; diff --git a/docs/html/search/functions_3.js b/docs/html/search/functions_3.js new file mode 100644 index 0000000..c35cef0 --- /dev/null +++ b/docs/html/search/functions_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['empty_0',['empty',['../classApriltagLandmarks.html#adb855b900e2500bd2cb7b832b6a06d5d',1,'ApriltagLandmarks::empty()'],['../classbebop2_1_1DummyState.html#af718a706c941fb6cf3e283f8ff51965b',1,'bebop2::DummyState::empty()'],['../classSensorBase.html#a4f481426253035b3a39162d107f52a38',1,'SensorBase::empty()']]], + ['extendedkalmanfilter_1',['ExtendedKalmanFilter',['../classbebop2_1_1ExtendedKalmanFilter.html#acdff0e290cf27a84a68097a653245f37',1,'bebop2::ExtendedKalmanFilter']]] +]; diff --git a/docs/html/search/functions_4.js b/docs/html/search/functions_4.js new file mode 100644 index 0000000..fe73068 --- /dev/null +++ b/docs/html/search/functions_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['filterbase_0',['FilterBase',['../classFilterBase.html#ab4c3dc4501905d2d7d17d4d96ffbd6eb',1,'FilterBase']]] +]; diff --git a/docs/html/search/functions_5.js b/docs/html/search/functions_5.js new file mode 100644 index 0000000..7f0e0ab --- /dev/null +++ b/docs/html/search/functions_5.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['geterror_0',['getError',['../classParticleFilter.html#a1d90b6ed0e0e88f21d21dd324698ea7a',1,'ParticleFilter']]], + ['getptr_1',['getPtr',['../classFilterBase.html#a7ea28d3367b18f79a586e75546005172',1,'FilterBase::getPtr()'],['../classSensorBase.html#aacd7a71d84767414807a14b34a5ad7c6',1,'SensorBase::getPtr()']]], + ['gettimestamp_2',['getTimestamp',['../classLoggerCSV.html#a34f36a942a6fecb0cacf720f43774b44',1,'LoggerCSV']]], + ['goal_5fdistance_3',['goal_distance',['../classbebop2_1_1ControllerBase.html#adcc0fee29e5f7b7f6a19a640955eb652',1,'bebop2::ControllerBase']]] +]; diff --git a/docs/html/search/functions_6.js b/docs/html/search/functions_6.js new file mode 100644 index 0000000..db13783 --- /dev/null +++ b/docs/html/search/functions_6.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['init_0',['init',['../classbebop2_1_1PID.html#a3bdaa787b389dc3c1ce287110bd5adb8',1,'bebop2::PID::init()'],['../classComplementaryFilter.html#a73d1dccaf8172850b8ba2abd0875cd70',1,'ComplementaryFilter::init()'],['../classbebop2_1_1ExtendedKalmanFilter.html#a93b97c85025a9792558c02baa4ec6388',1,'bebop2::ExtendedKalmanFilter::init()'],['../classFilterBase.html#a67503fcfa27c21d3d0adb6570ec0a7da',1,'FilterBase::init()'],['../classParticleFilter.html#a11d7f5a1aba6a649dc9d0cb661fa014d',1,'ParticleFilter::init(const std::vector< double > &x0, const std::vector< double > &std)']]], + ['initialized_1',['initialized',['../classParticleFilter.html#a21191cc75e036c60f1b2a3965a241266',1,'ParticleFilter']]], + ['internal_5fupdate_2',['internal_update',['../classbebop2_1_1ExtendedKalmanFilter.html#a9780edd80082973223723de463046506',1,'bebop2::ExtendedKalmanFilter']]] +]; diff --git a/docs/html/search/functions_7.js b/docs/html/search/functions_7.js new file mode 100644 index 0000000..5ff07e8 --- /dev/null +++ b/docs/html/search/functions_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['jacobf_0',['jacobF',['../classbebop2_1_1ExtendedKalmanFilter.html#a099b533a912aa76f92b7a820c3086f54',1,'bebop2::ExtendedKalmanFilter']]], + ['jacobh_1',['jacobH',['../classbebop2_1_1ExtendedKalmanFilter.html#a98b524af05ef67b13b5319e3531cb97c',1,'bebop2::ExtendedKalmanFilter']]] +]; diff --git a/docs/html/search/functions_8.js b/docs/html/search/functions_8.js new file mode 100644 index 0000000..2c569d2 --- /dev/null +++ b/docs/html/search/functions_8.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['land_5fcallback_0',['land_callback',['../classbebop2_1_1DummyState.html#a7a06058ab728c2f955a8524f46f34c36',1,'bebop2::DummyState']]], + ['loggercsv_1',['LoggerCSV',['../classLoggerCSV.html#a727b61abcb5030665d0ab73a68ed6f6e',1,'LoggerCSV::LoggerCSV()'],['../classLoggerCSV.html#a0cfadbfb1cce7279e3c675a23d73ec7e',1,'LoggerCSV::LoggerCSV(const std::vector< std::string > &header)'],['../classLoggerCSV.html#a4730a968872141ec2ece9ef90c2d7186',1,'LoggerCSV::LoggerCSV(const std::vector< std::string > &header, const int frequency)']]], + ['lqr_2',['LQR',['../classbebop2_1_1LQR.html#a78b5ce9848271cc53e117d1263bbd879',1,'bebop2::LQR']]] +]; diff --git a/docs/html/search/functions_9.js b/docs/html/search/functions_9.js new file mode 100644 index 0000000..ffabd2e --- /dev/null +++ b/docs/html/search/functions_9.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['main_0',['main',['../control_2LQR_2main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97',1,'main(int argc, char *argv[]): main.cpp'],['../localization_2Filters_2ekf_2main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97',1,'main(int argc, char *argv[]): main.cpp'],['../localization_2Filters_2pf_2main_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4',1,'main(): main.cpp'],['../apriltag__complementary__pid_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97',1,'main(int argc, char *argv[]): apriltag_complementary_pid.cpp'],['../apriltag__ekf__pid_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97',1,'main(int argc, char *argv[]): apriltag_ekf_pid.cpp'],['../dummy__ekf__pid_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97',1,'main(int argc, char *argv[]): dummy_ekf_pid.cpp']]], + ['motion_5fmodel_1',['motion_model',['../classbebop2_1_1ExtendedKalmanFilter.html#ae584586d81bc66c0f46b1a5aeffe7d26',1,'bebop2::ExtendedKalmanFilter']]], + ['mvn_2',['Mvn',['../classMvn.html#a3e6c158a9d5a08050dafec14ca2f788c',1,'Mvn']]] +]; diff --git a/docs/html/search/functions_a.js b/docs/html/search/functions_a.js new file mode 100644 index 0000000..b15a4fa --- /dev/null +++ b/docs/html/search/functions_a.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['observation_5fmodel_0',['observation_model',['../classbebop2_1_1ExtendedKalmanFilter.html#a555a02b112e88b63a92c230ae365b17f',1,'bebop2::ExtendedKalmanFilter']]], + ['operator_28_29_1',['operator()',['../classbebop2_1_1ExtendedKalmanFilter.html#a69797105ff979b3e5a602d1a87149297',1,'bebop2::ExtendedKalmanFilter::operator()()'],['../classParticleFilter.html#a60b736fab3746b834dd7cfb08fa5fb11',1,'ParticleFilter::operator()()'],['../classApriltagLandmarks.html#a11f9b912b3f326faa40eccc67e3ba7b2',1,'ApriltagLandmarks::operator()()'],['../classbebop2_1_1DummyState.html#a9a18fcd35402f1d756bd052def7cfb0e',1,'bebop2::DummyState::operator()()'],['../classSensorBase.html#ae77f79abe25a2939434e30575ea5fd30',1,'SensorBase::operator()()'],['../classbebop2_1_1StateObserver.html#a1d829045f35ed3531559f53aeb1773ca',1,'bebop2::StateObserver::operator()()']]], + ['operator_2a_2',['operator*',['../structFieldLocation.html#a7da89910c0992173841458f493027814',1,'FieldLocation']]], + ['operator_2b_3',['operator+',['../structFieldLocation.html#ac5966312a3d0df900873be1fa853d840',1,'FieldLocation']]], + ['operator_2d_4',['operator-',['../structFieldLocation.html#ae317351db47c70444f72a68516454402',1,'FieldLocation']]] +]; diff --git a/docs/html/search/functions_b.js b/docs/html/search/functions_b.js new file mode 100644 index 0000000..010c41a --- /dev/null +++ b/docs/html/search/functions_b.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['particlefilter_0',['ParticleFilter',['../classParticleFilter.html#accc05e707b48f1a8f1a10ed318c0dc55',1,'ParticleFilter']]], + ['pdf_1',['pdf',['../classMvn.html#a8317e80dc988ad98cf93428c4bcbfed6',1,'Mvn']]], + ['pid_2',['PID',['../classbebop2_1_1PID.html#a8c9b9e1417bdcefb64e04041d6caa339',1,'bebop2::PID']]], + ['prediction_3',['prediction',['../classParticleFilter.html#a541ece0fecb05f999382559c22454f3b',1,'ParticleFilter']]], + ['publish_5fcmd_5fvel_4',['publish_cmd_vel',['../classbebop2_1_1ControllerBase.html#a644d91e6e4bc12977deff541165a6b8c',1,'bebop2::ControllerBase']]], + ['publish_5ftf_5',['publish_tf',['../classSensorBase.html#ad56a833e43ba1c3c10cbf52024390e44',1,'SensorBase']]] +]; diff --git a/docs/html/search/functions_c.js b/docs/html/search/functions_c.js new file mode 100644 index 0000000..c8a70ba --- /dev/null +++ b/docs/html/search/functions_c.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['quadcontrollerpid_0',['QuadControllerPID',['../classbebop2_1_1QuadControllerPID.html#a9a47a9d55416b290dfba482caf970cc8',1,'bebop2::QuadControllerPID']]] +]; diff --git a/docs/html/search/functions_d.js b/docs/html/search/functions_d.js new file mode 100644 index 0000000..42568d2 --- /dev/null +++ b/docs/html/search/functions_d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['resample_0',['resample',['../classParticleFilter.html#a84265f4c32f6d157da1d40677c6c47cf',1,'ParticleFilter']]] +]; diff --git a/docs/html/search/functions_e.js b/docs/html/search/functions_e.js new file mode 100644 index 0000000..c6e3111 --- /dev/null +++ b/docs/html/search/functions_e.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['set_5fmarker_5fcolor_0',['set_marker_color',['../classbebop2_1_1ControlViz.html#aa520a0b7efe18ff02186c6cfcac05181',1,'bebop2::ControlViz']]], + ['set_5fmarker_5ffrom_5fpose_1',['set_marker_from_pose',['../classbebop2_1_1ControlViz.html#ae21b0f1d37929ae2378f709e201cd86c',1,'bebop2::ControlViz']]], + ['setdrone_2',['setDrone',['../classbebop2_1_1ControlViz.html#ac6141e56c2fd5936ed6f261309ca90a1',1,'bebop2::ControlViz']]], + ['stateobserver_3',['StateObserver',['../classbebop2_1_1StateObserver.html#a1bfd8d999a4246192a566feed36b82b7',1,'bebop2::StateObserver']]] +]; diff --git a/docs/html/search/functions_f.js b/docs/html/search/functions_f.js new file mode 100644 index 0000000..f200bba --- /dev/null +++ b/docs/html/search/functions_f.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['takeoff_5fcallback_0',['takeoff_callback',['../classbebop2_1_1DummyState.html#ae9bf8c28c906bd9766f6d333a9155b0b',1,'bebop2::DummyState']]], + ['toobservation_1',['toObservation',['../structFieldLocation.html#aba8010cdbd3ea54265db5d7cd75de44e',1,'FieldLocation']]], + ['transformtoglobalframe_2',['transformToGlobalFrame',['../classApriltagLandmarks.html#ae1fedc5c1e5d0bba0ddfbd881269df99',1,'ApriltagLandmarks']]] +]; diff --git a/doxygen/html/search/mag.svg b/docs/html/search/mag.svg similarity index 100% rename from doxygen/html/search/mag.svg rename to docs/html/search/mag.svg diff --git a/doxygen/html/search/mag_d.svg b/docs/html/search/mag_d.svg similarity index 100% rename from doxygen/html/search/mag_d.svg rename to docs/html/search/mag_d.svg diff --git a/doxygen/html/search/mag_sel.svg b/docs/html/search/mag_sel.svg similarity index 100% rename from doxygen/html/search/mag_sel.svg rename to docs/html/search/mag_sel.svg diff --git a/doxygen/html/search/mag_seld.svg b/docs/html/search/mag_seld.svg similarity index 100% rename from doxygen/html/search/mag_seld.svg rename to docs/html/search/mag_seld.svg diff --git a/doxygen/html/search/namespaces_0.js b/docs/html/search/namespaces_0.js similarity index 100% rename from doxygen/html/search/namespaces_0.js rename to docs/html/search/namespaces_0.js diff --git a/doxygen/html/search/namespaces_1.js b/docs/html/search/namespaces_1.js similarity index 100% rename from doxygen/html/search/namespaces_1.js rename to docs/html/search/namespaces_1.js diff --git a/docs/html/search/pages_0.js b/docs/html/search/pages_0.js new file mode 100644 index 0000000..8bf31cf --- /dev/null +++ b/docs/html/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['parrot_20bebop2_20drone_20with_20joystick_20controller_20readme_20file_0',['Parrot Bebop2 Drone with Joystick Controller README File',['../index.html',1,'']]] +]; diff --git a/docs/html/search/related_0.js b/docs/html/search/related_0.js new file mode 100644 index 0000000..b9472a4 --- /dev/null +++ b/docs/html/search/related_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['operator_3c_3c_0',['operator<<',['../structParticle.html#a2fa6df9fcd4dca7af54e59ed25db6e1f',1,'Particle::operator<<()'],['../structMarkerObservation.html#a4755337b360a2c606740ae5cc60b00e5',1,'MarkerObservation::operator<<()'],['../structFieldLocation.html#ae81613697d66349de9e6bff55d3bca4d',1,'FieldLocation::operator<<()']]] +]; diff --git a/doxygen/html/search/search.css b/docs/html/search/search.css similarity index 100% rename from doxygen/html/search/search.css rename to docs/html/search/search.css diff --git a/doxygen/html/search/search.js b/docs/html/search/search.js similarity index 100% rename from doxygen/html/search/search.js rename to docs/html/search/search.js diff --git a/doxygen/html/search/searchdata.js b/docs/html/search/searchdata.js similarity index 98% rename from doxygen/html/search/searchdata.js rename to docs/html/search/searchdata.js index 061236d..e5eb26a 100644 --- a/doxygen/html/search/searchdata.js +++ b/docs/html/search/searchdata.js @@ -11,7 +11,7 @@ var indexSectionsWithContent = 8: "bcegilrty", 9: "o", 10: "demnw", - 11: "b" + 11: "p" }; var indexSectionNames = diff --git a/docs/html/search/typedefs_0.js b/docs/html/search/typedefs_0.js new file mode 100644 index 0000000..d16109f --- /dev/null +++ b/docs/html/search/typedefs_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['filterptr_0',['FilterPtr',['../FilterBase_8h.html#aec1719f7c37e43544283ed24fab742c9',1,'FilterBase.h']]] +]; diff --git a/doxygen/html/search/typedefs_1.js b/docs/html/search/typedefs_1.js similarity index 55% rename from doxygen/html/search/typedefs_1.js rename to docs/html/search/typedefs_1.js index 94edfee..54b6fd4 100644 --- a/doxygen/html/search/typedefs_1.js +++ b/docs/html/search/typedefs_1.js @@ -1,5 +1,5 @@ var searchData= [ - ['sensorptr_0',['SensorPtr',['../_sensor_base_8h.html#ae79ed385e2ca22ae255892167db2390c',1,'SensorBase.h']]], + ['sensorptr_0',['SensorPtr',['../SensorBase_8h.html#ae79ed385e2ca22ae255892167db2390c',1,'SensorBase.h']]], ['stateobserverptr_1',['StateObserverPtr',['../namespacebebop2.html#a73dc7da96dafd486f0c43a33ea064d4c',1,'bebop2']]] ]; diff --git a/doxygen/html/search/typedefs_2.js b/docs/html/search/typedefs_2.js similarity index 100% rename from doxygen/html/search/typedefs_2.js rename to docs/html/search/typedefs_2.js diff --git a/doxygen/html/search/typedefs_3.js b/docs/html/search/typedefs_3.js similarity index 100% rename from doxygen/html/search/typedefs_3.js rename to docs/html/search/typedefs_3.js diff --git a/doxygen/html/search/typedefs_4.js b/docs/html/search/typedefs_4.js similarity index 100% rename from doxygen/html/search/typedefs_4.js rename to docs/html/search/typedefs_4.js diff --git a/docs/html/search/variables_0.js b/docs/html/search/variables_0.js new file mode 100644 index 0000000..f4c21e0 --- /dev/null +++ b/docs/html/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['azimuthal_5fangle_0',['azimuthal_angle',['../structMarkerObservation.html#a100373bce74cf49ea8870196d2acf74b',1,'MarkerObservation']]] +]; diff --git a/docs/html/search/variables_1.js b/docs/html/search/variables_1.js new file mode 100644 index 0000000..5f66a63 --- /dev/null +++ b/docs/html/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['control_5fdim_0',['CONTROL_DIM',['../classbebop2_1_1ExtendedKalmanFilter.html#a864b08f6504af5b5ff0bd45dfa5c9bc8',1,'bebop2::ExtendedKalmanFilter']]] +]; diff --git a/docs/html/search/variables_2.js b/docs/html/search/variables_2.js new file mode 100644 index 0000000..1884d80 --- /dev/null +++ b/docs/html/search/variables_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['dead_5fzone_0',['DEAD_ZONE',['../namespacebebop2.html#a6338d1064f32f481f613f760641cb849',1,'bebop2']]], + ['dt_1',['DT',['../classbebop2_1_1ExtendedKalmanFilter.html#ace00431562f973d1e277e0fdf9249c82',1,'bebop2::ExtendedKalmanFilter']]], + ['dt_5f_2',['dt_',['../classbebop2_1_1ControllerBase.html#a2b0de02e8c727752a1dad0a2857f2013',1,'bebop2::ControllerBase']]] +]; diff --git a/docs/html/search/variables_3.js b/docs/html/search/variables_3.js new file mode 100644 index 0000000..c9cfa7b --- /dev/null +++ b/docs/html/search/variables_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['id_0',['id',['../structParticle.html#a544b202775517f8ba05efcb9e0a21bee',1,'Particle::id()'],['../structLandmarkObs.html#a102b941ef9037ff29102efbfd2c9043e',1,'LandmarkObs::id()']]], + ['id_5fi_1',['id_i',['../structTagMap_1_1single__landmark__s.html#a083fbd02bc345db3c25551765f4332c2',1,'TagMap::single_landmark_s']]] +]; diff --git a/docs/html/search/variables_4.js b/docs/html/search/variables_4.js new file mode 100644 index 0000000..4c8103d --- /dev/null +++ b/docs/html/search/variables_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['landmark_5flist_0',['landmark_list',['../classTagMap.html#aaca48e131c1dc7c3ba30e1313aebb13f',1,'TagMap']]] +]; diff --git a/docs/html/search/variables_5.js b/docs/html/search/variables_5.js new file mode 100644 index 0000000..3efe595 --- /dev/null +++ b/docs/html/search/variables_5.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['m_5fbuttonstate_0',['m_buttonState',['../classbebop2_1_1ControllerBase.html#a587d4539796276947acfceedd74daf2c',1,'bebop2::ControllerBase']]], + ['m_5ffilter_1',['m_filter',['../classbebop2_1_1StateObserver.html#a6ededc78ab08eba61eab678ed7a7896a',1,'bebop2::StateObserver']]], + ['m_5fget_5fstate_2',['m_get_state',['../classbebop2_1_1ControllerBase.html#afcf21b03e3a3c40f8173e4819a2a4230',1,'bebop2::ControllerBase']]], + ['m_5fgoal_5fthres_3',['m_goal_thres',['../classbebop2_1_1ControllerBase.html#a405dcc08256f764191275e542d37a955',1,'bebop2::ControllerBase']]], + ['m_5finitialized_4',['m_initialized',['../classbebop2_1_1StateObserver.html#a4304686fa39b86122ea6892dfd472c08',1,'bebop2::StateObserver']]], + ['m_5fmu_5',['m_mu',['../classbebop2_1_1ControllerBase.html#a419cc93fc0637717522429e67b63f8dd',1,'bebop2::ControllerBase']]], + ['m_5fnh_6',['m_nh',['../classbebop2_1_1ControllerBase.html#add1eb5b349b755bdad661697bb184f2a',1,'bebop2::ControllerBase']]], + ['m_5fsensor_7',['m_sensor',['../classbebop2_1_1StateObserver.html#a743085128ae5fdb567d61ec1159176b8',1,'bebop2::StateObserver']]], + ['m_5fstate_8',['m_state',['../classbebop2_1_1StateObserver.html#a693f9d73394813a3209e41b46590c14f',1,'bebop2::StateObserver']]] +]; diff --git a/doxygen/html/search/variables_6.js b/docs/html/search/variables_6.js similarity index 100% rename from doxygen/html/search/variables_6.js rename to docs/html/search/variables_6.js diff --git a/docs/html/search/variables_7.js b/docs/html/search/variables_7.js new file mode 100644 index 0000000..95191b7 --- /dev/null +++ b/docs/html/search/variables_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['particles_0',['particles',['../classParticleFilter.html#a4d73f797a7a4bfffbfbb4fd6d09114f9',1,'ParticleFilter']]], + ['polar_5fangle_1',['polar_angle',['../structMarkerObservation.html#aad670bccd0f025ea8808148e828878a2',1,'MarkerObservation']]] +]; diff --git a/docs/html/search/variables_8.js b/docs/html/search/variables_8.js new file mode 100644 index 0000000..11d077c --- /dev/null +++ b/docs/html/search/variables_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['radial_5fdistance_0',['radial_distance',['../structMarkerObservation.html#a74eaf75e45d859ee6b8f8e4bd5439bae',1,'MarkerObservation']]] +]; diff --git a/docs/html/search/variables_9.js b/docs/html/search/variables_9.js new file mode 100644 index 0000000..6bd9009 --- /dev/null +++ b/docs/html/search/variables_9.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['state_5fdim_0',['STATE_DIM',['../classbebop2_1_1ExtendedKalmanFilter.html#add430272eb0874b6608f17cbb0f88ad4',1,'bebop2::ExtendedKalmanFilter']]], + ['step_5fincr_1',['STEP_INCR',['../namespacebebop2.html#a4fd8275c9f8db3ebcbd93e1ea602678b',1,'bebop2']]] +]; diff --git a/docs/html/search/variables_a.js b/docs/html/search/variables_a.js new file mode 100644 index 0000000..2cd73c9 --- /dev/null +++ b/docs/html/search/variables_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['tagname_0',['tagName',['../structMarkerObservation.html#a1de968d571f84b2943de2a8609db2c3d',1,'MarkerObservation::tagName()'],['../structFieldLocation.html#a1be847da2ecefc18b2181b8d3e8a1bb2',1,'FieldLocation::tagName()']]], + ['theta_1',['theta',['../structParticle.html#a589eaf4e282cf6c07036670ae48eaee2',1,'Particle::theta()'],['../structRobotState.html#a347039726076c6fbe8874635dfa21af0',1,'RobotState::theta()']]] +]; diff --git a/docs/html/search/variables_b.js b/docs/html/search/variables_b.js new file mode 100644 index 0000000..32dac19 --- /dev/null +++ b/docs/html/search/variables_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['weight_0',['weight',['../structParticle.html#aa010c7b3f2b60f707f14bbc26ce8b414',1,'Particle']]] +]; diff --git a/docs/html/search/variables_c.js b/docs/html/search/variables_c.js new file mode 100644 index 0000000..81521b1 --- /dev/null +++ b/docs/html/search/variables_c.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['x_0',['x',['../structParticle.html#a1e3e5e103cee69ae9acb9c3269d009d7',1,'Particle::x()'],['../structLandmarkObs.html#ae5a02a81f693771bbae301156e101246',1,'LandmarkObs::x()'],['../structRobotState.html#a7ca6f4e88ac7982242ab32cf5fba15e6',1,'RobotState::x()'],['../structFieldLocation.html#a2f101b216cd1177702266249290f382b',1,'FieldLocation::x()']]], + ['x_5f_1',['X_',['../classFilterBase.html#aeb7e15b1e110d25ce56508aaecbd91e3',1,'FilterBase']]], + ['x_5faxis_5findex_2',['X_AXIS_INDEX',['../namespacebebop2.html#a3d1183926660c413534f54a30a3e9926',1,'bebop2']]], + ['x_5fd_3',['x_d',['../structTagMap_1_1single__landmark__s.html#a3be6096099b3026eb0d3314779d997a4',1,'TagMap::single_landmark_s']]] +]; diff --git a/docs/html/search/variables_d.js b/docs/html/search/variables_d.js new file mode 100644 index 0000000..4119f31 --- /dev/null +++ b/docs/html/search/variables_d.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['y_0',['y',['../structParticle.html#a434ab690dde4422ac74ae10f6ace7a52',1,'Particle::y()'],['../structLandmarkObs.html#a18f5101eb6de02e127ce6bca26032286',1,'LandmarkObs::y()'],['../structRobotState.html#ac96a8e033454034c95745aee1811ffc2',1,'RobotState::y()'],['../structFieldLocation.html#a91e5558f47b388feffccf1c23a93b5e6',1,'FieldLocation::y()']]], + ['y_5faxis_5findex_1',['Y_AXIS_INDEX',['../namespacebebop2.html#ace37141259c7e75b0ffbfb6234da5cf8',1,'bebop2']]], + ['y_5fd_2',['y_d',['../structTagMap_1_1single__landmark__s.html#a4e87e55a7c6f9849be215f1ded19b442',1,'TagMap::single_landmark_s']]] +]; diff --git a/docs/html/search/variables_e.js b/docs/html/search/variables_e.js new file mode 100644 index 0000000..f856cb5 --- /dev/null +++ b/docs/html/search/variables_e.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['z_0',['z',['../structParticle.html#a518399a50ebdd632b22d7f48e5958461',1,'Particle::z()'],['../structLandmarkObs.html#a4bb27957f350bd05c829766946b5f724',1,'LandmarkObs::z()'],['../structRobotState.html#a552998092784696aaf6db9c47ab6a425',1,'RobotState::z()'],['../structFieldLocation.html#a4cdf46653fc5e8fae3688924f7705897',1,'FieldLocation::z()']]], + ['z_5faxis_5findex_1',['Z_AXIS_INDEX',['../namespacebebop2.html#a68385be43a1e12d2a6c3130441467c93',1,'bebop2']]], + ['z_5fd_2',['z_d',['../structTagMap_1_1single__landmark__s.html#a718ca1c4ade6bfc9e79b91cd833fb6c8',1,'TagMap::single_landmark_s']]] +]; diff --git a/doxygen/html/search/variables_f.js b/docs/html/search/variables_f.js similarity index 100% rename from doxygen/html/search/variables_f.js rename to docs/html/search/variables_f.js diff --git a/doxygen/html/sensors_8h.html b/docs/html/sensors_8h.html similarity index 87% rename from doxygen/html/sensors_8h.html rename to docs/html/sensors_8h.html index 89dafb3..22d4731 100644 --- a/doxygen/html/sensors_8h.html +++ b/docs/html/sensors_8h.html @@ -3,7 +3,7 @@ - + airlib: include/airlib/localization/sensors.h File Reference @@ -29,7 +29,7 @@ - + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
FieldLocation Member List
+
+
+ +

This is the complete list of members for FieldLocation, including all inherited members.

+ + + + + + + + + + +
operator*(double scale) constFieldLocationinline
operator+(const FieldLocation &other) constFieldLocationinline
operator-(const FieldLocation &other) constFieldLocationinline
operator<<FieldLocationfriend
tagNameFieldLocation
toObservation()FieldLocationinline
xFieldLocation
yFieldLocation
zFieldLocation
+ + + + diff --git a/docs/html/structFieldLocation.html b/docs/html/structFieldLocation.html new file mode 100644 index 0000000..244bf94 --- /dev/null +++ b/docs/html/structFieldLocation.html @@ -0,0 +1,397 @@ + + + + + + + +airlib: FieldLocation Struct Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
+Public Member Functions | +Public Attributes | +Friends | +List of all members
+
FieldLocation Struct Reference
+
+
+ +

Field location structure. + More...

+ +

#include <robot_defs.h>

+ + + + + + + + + + + + + + +

+Public Member Functions

MarkerObservation toObservation ()
 Calculates the radial distance, azimuthal angle and polar angle using x,y,z position.
 
FieldLocation operator- (const FieldLocation &other) const
 Calculates the difference between two tags.
 
FieldLocation operator+ (const FieldLocation &other) const
 Calculates the sum of two tags.
 
FieldLocation operator* (double scale) const
 Calculates the product between two tags.
 
+ + + + + + + + + + + + +

+Public Attributes

std::string tagName
 
double x
 x-position (in meters)
 
double y
 y-position (in meters)
+
 
double z
 z-position (in meters)
+
 
+ + + +

+Friends

std::ostream & operator<< (std::ostream &os, const FieldLocation &location)
 
+

Detailed Description

+

Field location structure.

+ +

Definition at line 55 of file robot_defs.h.

+

Member Function Documentation

+ +

◆ operator*()

+ +
+
+ + + + + +
+ + + + + + + + +
FieldLocation FieldLocation::operator* (double scale) const
+
+inline
+
+ +

Calculates the product between two tags.

+
Parameters
+ + +
otheris the other AprilTag.
+
+
+
Returns
the struct with the new tagname, x,y and z position
+ +

Definition at line 109 of file robot_defs.h.

+ +
+
+ +

◆ operator+()

+ +
+
+ + + + + +
+ + + + + + + + +
FieldLocation FieldLocation::operator+ (const FieldLocationother) const
+
+inline
+
+ +

Calculates the sum of two tags.

+
Parameters
+ + +
otheris the other AprilTag.
+
+
+
Returns
the struct with the new tagname, x,y and z position
+ +

Definition at line 98 of file robot_defs.h.

+ +
+
+ +

◆ operator-()

+ +
+
+ + + + + +
+ + + + + + + + +
FieldLocation FieldLocation::operator- (const FieldLocationother) const
+
+inline
+
+ +

Calculates the difference between two tags.

+
Parameters
+ + +
otheris the other AprilTag.
+
+
+
Returns
the struct with the new tagname, x,y and z position
+ +

Definition at line 87 of file robot_defs.h.

+ +
+
+ +

◆ toObservation()

+ +
+
+ + + + + +
+ + + + + + + +
MarkerObservation FieldLocation::toObservation ()
+
+inline
+
+ +

Calculates the radial distance, azimuthal angle and polar angle using x,y,z position.

+
Returns
Returns the the structure of MarkerObservation with the spherical coordinates.
+ +

Definition at line 67 of file robot_defs.h.

+ +
+
+

Friends And Related Symbol Documentation

+ +

◆ operator<<

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
std::ostream & operator<< (std::ostream & os,
const FieldLocationlocation 
)
+
+friend
+
+
Parameters
+ + + +
osIt is an output stream object that writes sequences of characters.
locationReference to the FieldLocation Struct.
+
+
+
Returns
Returns the output of tagName, x, y and z positions in string format.
+ +

Definition at line 78 of file robot_defs.h.

+ +
+
+

Member Data Documentation

+ +

◆ tagName

+ +
+
+ + + + +
std::string FieldLocation::tagName
+
+ +

Definition at line 57 of file robot_defs.h.

+ +
+
+ +

◆ x

+ +
+
+ + + + +
double FieldLocation::x
+
+ +

x-position (in meters)

+ +

Definition at line 59 of file robot_defs.h.

+ +
+
+ +

◆ y

+ +
+
+ + + + +
double FieldLocation::y
+
+ +

y-position (in meters)
+

+ +

Definition at line 61 of file robot_defs.h.

+ +
+
+ +

◆ z

+ +
+
+ + + + +
double FieldLocation::z
+
+ +

z-position (in meters)
+

+ +

Definition at line 63 of file robot_defs.h.

+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/docs/html/structLandmarkObs-members.html b/docs/html/structLandmarkObs-members.html new file mode 100644 index 0000000..55aeda8 --- /dev/null +++ b/docs/html/structLandmarkObs-members.html @@ -0,0 +1,88 @@ + + + + + + + +airlib: Member List + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
LandmarkObs Member List
+
+
+ +

This is the complete list of members for LandmarkObs, including all inherited members.

+ + + + + +
idLandmarkObs
xLandmarkObs
yLandmarkObs
zLandmarkObs
+ + + + diff --git a/docs/html/structLandmarkObs.html b/docs/html/structLandmarkObs.html new file mode 100644 index 0000000..04027e9 --- /dev/null +++ b/docs/html/structLandmarkObs.html @@ -0,0 +1,185 @@ + + + + + + + +airlib: LandmarkObs Struct Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
+Public Attributes | +List of all members
+
LandmarkObs Struct Reference
+
+
+ +

It is a Struct representing one landmark observation measurement. + More...

+ +

#include <particle_filter.h>

+ + + + + + + + + + + + + + +

+Public Attributes

int id
 Id of matching landmark in the map.
 
double x
 Local (vehicle coordinates) x position of landmark observation [m].
 
double y
 Local (vehicle coordinates) y position of landmark observation [m].
 
double z
 Local (vehicle coordinates) z position of landmark observation [m].
 
+

Detailed Description

+

It is a Struct representing one landmark observation measurement.

+ +

Definition at line 120 of file particle_filter.h.

+

Member Data Documentation

+ +

◆ id

+ +
+
+ + + + +
int LandmarkObs::id
+
+ +

Id of matching landmark in the map.

+ +

Definition at line 123 of file particle_filter.h.

+ +
+
+ +

◆ x

+ +
+
+ + + + +
double LandmarkObs::x
+
+ +

Local (vehicle coordinates) x position of landmark observation [m].

+ +

Definition at line 125 of file particle_filter.h.

+ +
+
+ +

◆ y

+ +
+
+ + + + +
double LandmarkObs::y
+
+ +

Local (vehicle coordinates) y position of landmark observation [m].

+ +

Definition at line 127 of file particle_filter.h.

+ +
+
+ +

◆ z

+ +
+
+ + + + +
double LandmarkObs::z
+
+ +

Local (vehicle coordinates) z position of landmark observation [m].

+ +

Definition at line 129 of file particle_filter.h.

+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/docs/html/structMarkerObservation-members.html b/docs/html/structMarkerObservation-members.html new file mode 100644 index 0000000..5c09270 --- /dev/null +++ b/docs/html/structMarkerObservation-members.html @@ -0,0 +1,89 @@ + + + + + + + +airlib: Member List + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
MarkerObservation Member List
+
+
+ +

This is the complete list of members for MarkerObservation, including all inherited members.

+ + + + + + +
azimuthal_angleMarkerObservation
operator<<MarkerObservationfriend
polar_angleMarkerObservation
radial_distanceMarkerObservation
tagNameMarkerObservation
+ + + + diff --git a/doxygen/html/struct_marker_observation.html b/docs/html/structMarkerObservation.html similarity index 74% rename from doxygen/html/struct_marker_observation.html rename to docs/html/structMarkerObservation.html index 8999d24..afe1835 100644 --- a/doxygen/html/struct_marker_observation.html +++ b/docs/html/structMarkerObservation.html @@ -3,7 +3,7 @@ - + airlib: MarkerObservation Struct Reference @@ -29,7 +29,7 @@ - + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
Particle Member List
+
+
+ +

This is the complete list of members for Particle, including all inherited members.

+ + + + + + + + +
idParticle
operator<<Particlefriend
thetaParticle
weightParticle
xParticle
yParticle
zParticle
+ + + + diff --git a/docs/html/structParticle.html b/docs/html/structParticle.html new file mode 100644 index 0000000..96c1a3f --- /dev/null +++ b/docs/html/structParticle.html @@ -0,0 +1,262 @@ + + + + + + + +airlib: Particle Struct Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
+Public Attributes | +Friends | +List of all members
+
Particle Struct Reference
+
+
+ +

This structure allows us to create particles and set their values. + More...

+ +

#include <particle_filter.h>

+ + + + + + + + + + + + + + +

+Public Attributes

int id
 
double x
 
double y
 
double z
 
double theta
 
double weight
 
+ + + +

+Friends

std::ostream & operator<< (std::ostream &os, const Particle &particle)
 
+

Detailed Description

+

This structure allows us to create particles and set their values.

+ +

Definition at line 96 of file particle_filter.h.

+

Friends And Related Symbol Documentation

+ +

◆ operator<<

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
std::ostream & operator<< (std::ostream & os,
const Particleparticle 
)
+
+friend
+
+
Parameters
+ + + +
osIt is an output stream objects that writes sequences of characters.
locationParticle struct
+
+
+
Returns
Returns the output of the id, x, y, z positions in string format.
+ +

Definition at line 108 of file particle_filter.h.

+ +
+
+

Member Data Documentation

+ +

◆ id

+ +
+
+ + + + +
int Particle::id
+
+ +

Definition at line 98 of file particle_filter.h.

+ +
+
+ +

◆ theta

+ +
+
+ + + + +
double Particle::theta
+
+ +

Definition at line 102 of file particle_filter.h.

+ +
+
+ +

◆ weight

+ +
+
+ + + + +
double Particle::weight
+
+ +

Definition at line 103 of file particle_filter.h.

+ +
+
+ +

◆ x

+ +
+
+ + + + +
double Particle::x
+
+ +

Definition at line 99 of file particle_filter.h.

+ +
+
+ +

◆ y

+ +
+
+ + + + +
double Particle::y
+
+ +

Definition at line 100 of file particle_filter.h.

+ +
+
+ +

◆ z

+ +
+
+ + + + +
double Particle::z
+
+ +

Definition at line 101 of file particle_filter.h.

+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/docs/html/structRobotState-members.html b/docs/html/structRobotState-members.html new file mode 100644 index 0000000..c65ec18 --- /dev/null +++ b/docs/html/structRobotState-members.html @@ -0,0 +1,88 @@ + + + + + + + +airlib: Member List + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
RobotState Member List
+
+
+ +

This is the complete list of members for RobotState, including all inherited members.

+ + + + + +
thetaRobotState
xRobotState
yRobotState
zRobotState
+ + + + diff --git a/doxygen/html/struct_robot_state.html b/docs/html/structRobotState.html similarity index 78% rename from doxygen/html/struct_robot_state.html rename to docs/html/structRobotState.html index e7eb873..d951812 100644 --- a/doxygen/html/struct_robot_state.html +++ b/docs/html/structRobotState.html @@ -3,7 +3,7 @@ - + airlib: RobotState Struct Reference @@ -29,7 +29,7 @@ - + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
TagMap::single_landmark_s Member List
+
+
+ +

This is the complete list of members for TagMap::single_landmark_s, including all inherited members.

+ + + + + +
id_iTagMap::single_landmark_s
x_dTagMap::single_landmark_s
y_dTagMap::single_landmark_s
z_dTagMap::single_landmark_s
+ + + + diff --git a/docs/html/structTagMap_1_1single__landmark__s.html b/docs/html/structTagMap_1_1single__landmark__s.html new file mode 100644 index 0000000..d6b53ff --- /dev/null +++ b/docs/html/structTagMap_1_1single__landmark__s.html @@ -0,0 +1,189 @@ + + + + + + + +airlib: TagMap::single_landmark_s Struct Reference + + + + + + + + + +
+
+ + + + + + +
+
airlib +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Attributes | +List of all members
+
TagMap::single_landmark_s Struct Reference
+
+
+ +

structure holds information about each individual landmark, including its ID, and its x, y, and z positions in the global coordinate system. + More...

+ +

#include <particle_filter.h>

+ + + + + + + + + + + + + + +

+Public Attributes

int id_i
 Landmark ID.
 
double x_d
 Landmark x-position in the map (global coordinates)
 
double y_d
 Landmark y-position in the map (global coordinates)
 
double z_d
 Landmark z-position in the map (global coordinates)
 
+

Detailed Description

+

structure holds information about each individual landmark, including its ID, and its x, y, and z positions in the global coordinate system.

+ +

Definition at line 22 of file particle_filter.h.

+

Member Data Documentation

+ +

◆ id_i

+ +
+
+ + + + +
int TagMap::single_landmark_s::id_i
+
+ +

Landmark ID.

+ +

Definition at line 25 of file particle_filter.h.

+ +
+
+ +

◆ x_d

+ +
+
+ + + + +
double TagMap::single_landmark_s::x_d
+
+ +

Landmark x-position in the map (global coordinates)

+ +

Definition at line 27 of file particle_filter.h.

+ +
+
+ +

◆ y_d

+ +
+
+ + + + +
double TagMap::single_landmark_s::y_d
+
+ +

Landmark y-position in the map (global coordinates)

+ +

Definition at line 29 of file particle_filter.h.

+ +
+
+ +

◆ z_d

+ +
+
+ + + + +
double TagMap::single_landmark_s::z_d
+
+ +

Landmark z-position in the map (global coordinates)

+ +

Definition at line 31 of file particle_filter.h.

+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/doxygen/html/struct_field_location-members.html b/docs/html/struct_field_location-members.html similarity index 91% rename from doxygen/html/struct_field_location-members.html rename to docs/html/struct_field_location-members.html index a3d3472..79008de 100644 --- a/doxygen/html/struct_field_location-members.html +++ b/docs/html/struct_field_location-members.html @@ -3,9 +3,9 @@ - + -airlib: Member List +Parrot Bebop2: Member List @@ -21,7 +21,7 @@ -
airlib +
Parrot Bebop2
@@ -29,7 +29,7 @@
- + @@ -21,7 +21,7 @@ -
airlib +
Parrot Bebop2
@@ -29,7 +29,7 @@
- + @@ -21,7 +21,7 @@ -
airlib +
Parrot Bebop2
@@ -29,7 +29,7 @@
- + + + + + + + + +
+
+ + + + + + +
+
Parrot Bebop2 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
+Public Attributes | +Friends | +List of all members
+
MarkerObservation Struct Reference
+
+
+ + + + + + + + + + + + + +

+Public Attributes

+std::string tagName
 
+double radial_distance
 Observed distance to landmark from robot position
+
 
+double azimuthal_angle
 Observed bearing to landmark in the XY coordinate frame.
 
+double polar_angle
 Observed bearing to landmark in the positive Z axis.
 
+ + + +

+Friends

std::ostream & operator<< (std::ostream &os, const MarkerObservation &observation)
 
+

Friends And Related Symbol Documentation

+ +

◆ operator<<

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
std::ostream & operator<< (std::ostream & os,
const MarkerObservationobservation 
)
+
+friend
+
+
Parameters
+ + + +
osIt is an output stream objects that writes sequences of characters
observationReference to MarkerObservation struct.
+
+
+
Returns
Returns the output of tagname, radial distance, azimuthal angle and polar angle.
+ +
+
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/doxygen/html/struct_particle-members.html b/docs/html/struct_particle-members.html similarity index 100% rename from doxygen/html/struct_particle-members.html rename to docs/html/struct_particle-members.html diff --git a/doxygen/html/struct_particle.html b/docs/html/struct_particle.html similarity index 100% rename from doxygen/html/struct_particle.html rename to docs/html/struct_particle.html diff --git a/doxygen/html/struct_robot_state-members.html b/docs/html/struct_robot_state-members.html similarity index 95% rename from doxygen/html/struct_robot_state-members.html rename to docs/html/struct_robot_state-members.html index 01ad739..b28a993 100644 --- a/doxygen/html/struct_robot_state-members.html +++ b/docs/html/struct_robot_state-members.html @@ -3,9 +3,9 @@ - + -airlib: Member List +Parrot Bebop2: Member List @@ -21,7 +21,7 @@ -
airlib +
Parrot Bebop2
@@ -29,7 +29,7 @@
- + + + + + + + + +
+
+ + + + + + +
+
Parrot Bebop2 +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
+Public Attributes | +List of all members
+
RobotState Struct Reference
+
+
+ + + + + + + + + + + + + + +

+Public Attributes

+double x
 x-position(in meters)
 
+double y
 y-position (in meters)
+
 
+double z
 z-position (in meters)
+
 
+double theta
 z-orientation (in radians)
+
 
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/doxygen/html/struct_tag_map_1_1single__landmark__s-members.html b/docs/html/struct_tag_map_1_1single__landmark__s-members.html similarity index 100% rename from doxygen/html/struct_tag_map_1_1single__landmark__s-members.html rename to docs/html/struct_tag_map_1_1single__landmark__s-members.html diff --git a/doxygen/html/struct_tag_map_1_1single__landmark__s.html b/docs/html/struct_tag_map_1_1single__landmark__s.html similarity index 100% rename from doxygen/html/struct_tag_map_1_1single__landmark__s.html rename to docs/html/struct_tag_map_1_1single__landmark__s.html diff --git a/doxygen/html/struct_twist-members.html b/docs/html/struct_twist-members.html similarity index 100% rename from doxygen/html/struct_twist-members.html rename to docs/html/struct_twist-members.html diff --git a/doxygen/html/struct_twist.html b/docs/html/struct_twist.html similarity index 100% rename from doxygen/html/struct_twist.html rename to docs/html/struct_twist.html diff --git a/doxygen/html/struct_twist_1_1_angular_vel-members.html b/docs/html/struct_twist_1_1_angular_vel-members.html similarity index 100% rename from doxygen/html/struct_twist_1_1_angular_vel-members.html rename to docs/html/struct_twist_1_1_angular_vel-members.html diff --git a/doxygen/html/struct_twist_1_1_angular_vel.html b/docs/html/struct_twist_1_1_angular_vel.html similarity index 100% rename from doxygen/html/struct_twist_1_1_angular_vel.html rename to docs/html/struct_twist_1_1_angular_vel.html diff --git a/doxygen/html/struct_twist_1_1_linear_vel-members.html b/docs/html/struct_twist_1_1_linear_vel-members.html similarity index 100% rename from doxygen/html/struct_twist_1_1_linear_vel-members.html rename to docs/html/struct_twist_1_1_linear_vel-members.html diff --git a/doxygen/html/struct_twist_1_1_linear_vel.html b/docs/html/struct_twist_1_1_linear_vel.html similarity index 100% rename from doxygen/html/struct_twist_1_1_linear_vel.html rename to docs/html/struct_twist_1_1_linear_vel.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1__interpreter-members.html b/docs/html/structmatplotlibcpp_1_1detail_1_1__interpreter-members.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1__interpreter-members.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1__interpreter-members.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1__interpreter.html b/docs/html/structmatplotlibcpp_1_1detail_1_1__interpreter.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1__interpreter.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1__interpreter.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable-members.html b/docs/html/structmatplotlibcpp_1_1detail_1_1is__callable-members.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable-members.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1is__callable-members.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable.html b/docs/html/structmatplotlibcpp_1_1detail_1_1is__callable.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1is__callable.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl.html b/docs/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01false_00_01_t_01_4-members.html b/docs/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01false_00_01_t_01_4-members.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01false_00_01_t_01_4-members.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01false_00_01_t_01_4-members.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01false_00_01_t_01_4.html b/docs/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01false_00_01_t_01_4.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01false_00_01_t_01_4.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01false_00_01_t_01_4.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4-members.html b/docs/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4-members.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4-members.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4-members.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4.html b/docs/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_check.html b/docs/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_check.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_check.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_check.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_derived-members.html b/docs/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_derived-members.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_derived-members.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_derived-members.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_derived.html b/docs/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_derived.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_derived.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_derived.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_derived.png b/docs/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_derived.png similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_derived.png rename to docs/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_derived.png diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_fallback-members.html b/docs/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_fallback-members.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_fallback-members.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_fallback-members.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_fallback.html b/docs/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_fallback.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_fallback.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_fallback.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_fallback.png b/docs/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_fallback.png similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_fallback.png rename to docs/html/structmatplotlibcpp_1_1detail_1_1is__callable__impl_3_01true_00_01_t_01_4_1_1_fallback.png diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1plot__impl.html b/docs/html/structmatplotlibcpp_1_1detail_1_1plot__impl.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1plot__impl.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1plot__impl.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1plot__impl_3_01std_1_1false__type_01_4-members.html b/docs/html/structmatplotlibcpp_1_1detail_1_1plot__impl_3_01std_1_1false__type_01_4-members.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1plot__impl_3_01std_1_1false__type_01_4-members.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1plot__impl_3_01std_1_1false__type_01_4-members.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1plot__impl_3_01std_1_1false__type_01_4.html b/docs/html/structmatplotlibcpp_1_1detail_1_1plot__impl_3_01std_1_1false__type_01_4.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1plot__impl_3_01std_1_1false__type_01_4.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1plot__impl_3_01std_1_1false__type_01_4.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1plot__impl_3_01std_1_1true__type_01_4-members.html b/docs/html/structmatplotlibcpp_1_1detail_1_1plot__impl_3_01std_1_1true__type_01_4-members.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1plot__impl_3_01std_1_1true__type_01_4-members.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1plot__impl_3_01std_1_1true__type_01_4-members.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1plot__impl_3_01std_1_1true__type_01_4.html b/docs/html/structmatplotlibcpp_1_1detail_1_1plot__impl_3_01std_1_1true__type_01_4.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1plot__impl_3_01std_1_1true__type_01_4.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1plot__impl_3_01std_1_1true__type_01_4.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type-members.html b/docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type-members.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type-members.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type-members.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type.html b/docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01bool_01_4-members.html b/docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01bool_01_4-members.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01bool_01_4-members.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01bool_01_4-members.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01bool_01_4.html b/docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01bool_01_4.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01bool_01_4.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01bool_01_4.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01double_01_4-members.html b/docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01double_01_4-members.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01double_01_4-members.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01double_01_4-members.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01double_01_4.html b/docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01double_01_4.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01double_01_4.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01double_01_4.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01float_01_4-members.html b/docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01float_01_4-members.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01float_01_4-members.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01float_01_4-members.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01float_01_4.html b/docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01float_01_4.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01float_01_4.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01float_01_4.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int16__t_01_4-members.html b/docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int16__t_01_4-members.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int16__t_01_4-members.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int16__t_01_4-members.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int16__t_01_4.html b/docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int16__t_01_4.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int16__t_01_4.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int16__t_01_4.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int32__t_01_4-members.html b/docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int32__t_01_4-members.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int32__t_01_4-members.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int32__t_01_4-members.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int32__t_01_4.html b/docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int32__t_01_4.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int32__t_01_4.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int32__t_01_4.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int64__t_01_4-members.html b/docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int64__t_01_4-members.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int64__t_01_4-members.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int64__t_01_4-members.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int64__t_01_4.html b/docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int64__t_01_4.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int64__t_01_4.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int64__t_01_4.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int8__t_01_4-members.html b/docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int8__t_01_4-members.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int8__t_01_4-members.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int8__t_01_4-members.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int8__t_01_4.html b/docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int8__t_01_4.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int8__t_01_4.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01int8__t_01_4.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint16__t_01_4-members.html b/docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint16__t_01_4-members.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint16__t_01_4-members.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint16__t_01_4-members.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint16__t_01_4.html b/docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint16__t_01_4.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint16__t_01_4.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint16__t_01_4.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint32__t_01_4-members.html b/docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint32__t_01_4-members.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint32__t_01_4-members.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint32__t_01_4-members.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint32__t_01_4.html b/docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint32__t_01_4.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint32__t_01_4.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint32__t_01_4.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint64__t_01_4-members.html b/docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint64__t_01_4-members.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint64__t_01_4-members.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint64__t_01_4-members.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint64__t_01_4.html b/docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint64__t_01_4.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint64__t_01_4.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint64__t_01_4.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint8__t_01_4-members.html b/docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint8__t_01_4-members.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint8__t_01_4-members.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint8__t_01_4-members.html diff --git a/doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint8__t_01_4.html b/docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint8__t_01_4.html similarity index 100% rename from doxygen/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint8__t_01_4.html rename to docs/html/structmatplotlibcpp_1_1detail_1_1select__npy__type_3_01uint8__t_01_4.html diff --git a/doxygen/html/sync_off.png b/docs/html/sync_off.png similarity index 100% rename from doxygen/html/sync_off.png rename to docs/html/sync_off.png diff --git a/doxygen/html/sync_on.png b/docs/html/sync_on.png similarity index 100% rename from doxygen/html/sync_on.png rename to docs/html/sync_on.png diff --git a/doxygen/html/tab_a.png b/docs/html/tab_a.png similarity index 100% rename from doxygen/html/tab_a.png rename to docs/html/tab_a.png diff --git a/doxygen/html/tab_ad.png b/docs/html/tab_ad.png similarity index 100% rename from doxygen/html/tab_ad.png rename to docs/html/tab_ad.png diff --git a/doxygen/html/tab_b.png b/docs/html/tab_b.png similarity index 100% rename from doxygen/html/tab_b.png rename to docs/html/tab_b.png diff --git a/doxygen/html/tab_bd.png b/docs/html/tab_bd.png similarity index 100% rename from doxygen/html/tab_bd.png rename to docs/html/tab_bd.png diff --git a/doxygen/html/tab_h.png b/docs/html/tab_h.png similarity index 100% rename from doxygen/html/tab_h.png rename to docs/html/tab_h.png diff --git a/doxygen/html/tab_hd.png b/docs/html/tab_hd.png similarity index 100% rename from doxygen/html/tab_hd.png rename to docs/html/tab_hd.png diff --git a/doxygen/html/tab_s.png b/docs/html/tab_s.png similarity index 100% rename from doxygen/html/tab_s.png rename to docs/html/tab_s.png diff --git a/doxygen/html/tab_sd.png b/docs/html/tab_sd.png similarity index 100% rename from doxygen/html/tab_sd.png rename to docs/html/tab_sd.png diff --git a/doxygen/html/tabs.css b/docs/html/tabs.css similarity index 100% rename from doxygen/html/tabs.css rename to docs/html/tabs.css diff --git a/docs/latex/Makefile b/docs/latex/Makefile new file mode 100644 index 0000000..07f226d --- /dev/null +++ b/docs/latex/Makefile @@ -0,0 +1,27 @@ +LATEX_CMD?=pdflatex +MKIDX_CMD?=makeindex +BIBTEX_CMD?=bibtex +LATEX_COUNT?=8 +MANUAL_FILE?=refman + +all: $(MANUAL_FILE).pdf + +pdf: $(MANUAL_FILE).pdf + +$(MANUAL_FILE).pdf: clean $(MANUAL_FILE).tex + $(LATEX_CMD) $(MANUAL_FILE) + $(MKIDX_CMD) $(MANUAL_FILE).idx + $(LATEX_CMD) $(MANUAL_FILE) + latex_count=$(LATEX_COUNT) ; \ + while egrep -s 'Rerun (LaTeX|to get cross-references right|to get bibliographical references right)' $(MANUAL_FILE).log && [ $$latex_count -gt 0 ] ;\ + do \ + echo "Rerunning latex...." ;\ + $(LATEX_CMD) $(MANUAL_FILE) ;\ + latex_count=`expr $$latex_count - 1` ;\ + done + $(MKIDX_CMD) $(MANUAL_FILE).idx + $(LATEX_CMD) $(MANUAL_FILE) + + +clean: + rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl $(MANUAL_FILE).pdf diff --git a/docs/latex/annotated.tex b/docs/latex/annotated.tex new file mode 100644 index 0000000..bd7681a --- /dev/null +++ b/docs/latex/annotated.tex @@ -0,0 +1,6 @@ +\doxysection{Class List} +Here are the classes, structs, unions and interfaces with brief descriptions\+:\begin{DoxyCompactList} +\item\contentsline{section}{\mbox{\hyperlink{struct_field_location}{Field\+Location}} }{\pageref{struct_field_location}}{} +\item\contentsline{section}{\mbox{\hyperlink{struct_marker_observation}{Marker\+Observation}} }{\pageref{struct_marker_observation}}{} +\item\contentsline{section}{\mbox{\hyperlink{struct_robot_state}{Robot\+State}} }{\pageref{struct_robot_state}}{} +\end{DoxyCompactList} diff --git a/docs/latex/doxygen.sty b/docs/latex/doxygen.sty new file mode 100644 index 0000000..4d0a649 --- /dev/null +++ b/docs/latex/doxygen.sty @@ -0,0 +1,621 @@ +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{doxygen} + +% Packages used by this style file +\RequirePackage{alltt} +%%\RequirePackage{array} %% moved to refman.tex due to workaround for LaTex 2019 version and unmaintained tabu package +\RequirePackage{calc} +\RequirePackage{float} +%%\RequirePackage{ifthen} %% moved to refman.tex due to workaround for LaTex 2019 version and unmaintained tabu package +\RequirePackage{verbatim} +\RequirePackage[table]{xcolor} +\RequirePackage{longtable_doxygen} +\RequirePackage{tabu_doxygen} +\RequirePackage{fancyvrb} +\RequirePackage{tabularx} +\RequirePackage{multicol} +\RequirePackage{multirow} +\RequirePackage{hanging} +\RequirePackage{ifpdf} +\RequirePackage{adjustbox} +\RequirePackage{amssymb} +\RequirePackage{stackengine} +\RequirePackage{enumitem} +\RequirePackage{alphalph} +\RequirePackage[normalem]{ulem} % for strikeout, but don't modify emphasis + +%---------- Internal commands used in this style file ---------------- + +\newcommand{\ensurespace}[1]{% + \begingroup% + \setlength{\dimen@}{#1}% + \vskip\z@\@plus\dimen@% + \penalty -100\vskip\z@\@plus -\dimen@% + \vskip\dimen@% + \penalty 9999% + \vskip -\dimen@% + \vskip\z@skip% hide the previous |\vskip| from |\addvspace| + \endgroup% +} + +\newcommand{\DoxyHorRuler}[1]{% + \setlength{\parskip}{0ex plus 0ex minus 0ex}% + \ifthenelse{#1=0}% + {% + \hrule% + }% + {% + \hrulefilll% + }% +} +\newcommand{\DoxyLabelFont}{} +\newcommand{\entrylabel}[1]{% + {% + \parbox[b]{\labelwidth-4pt}{% + \makebox[0pt][l]{\DoxyLabelFont#1}% + \vspace{1.5\baselineskip}% + }% + }% +} + +\newenvironment{DoxyDesc}[1]{% + \ensurespace{4\baselineskip}% + \begin{list}{}{% + \settowidth{\labelwidth}{20pt}% + %\setlength{\parsep}{0pt}% + \setlength{\itemsep}{0pt}% + \setlength{\leftmargin}{\labelwidth+\labelsep}% + \renewcommand{\makelabel}{\entrylabel}% + }% + \item[#1]% +}{% + \end{list}% +} + +\newsavebox{\xrefbox} +\newlength{\xreflength} +\newcommand{\xreflabel}[1]{% + \sbox{\xrefbox}{#1}% + \setlength{\xreflength}{\wd\xrefbox}% + \ifthenelse{\xreflength>\labelwidth}{% + \begin{minipage}{\textwidth}% + \setlength{\parindent}{0pt}% + \hangindent=15pt\bfseries #1\vspace{1.2\itemsep}% + \end{minipage}% + }{% + \parbox[b]{\labelwidth}{\makebox[0pt][l]{\textbf{#1}}}% + }% +} + +%---------- Commands used by doxygen LaTeX output generator ---------- + +% Used by
 ... 
+\newenvironment{DoxyPre}{% + \small% + \begin{alltt}% +}{% + \end{alltt}% + \normalsize% +} +% Necessary for redefining not defined characters, i.e. "Replacement Character" in tex output. +\newlength{\CodeWidthChar} +\newlength{\CodeHeightChar} +\settowidth{\CodeWidthChar}{?} +\settoheight{\CodeHeightChar}{?} +% Necessary for hanging indent +\newlength{\DoxyCodeWidth} + +\newcommand\DoxyCodeLine[1]{ + \ifthenelse{\equal{\detokenize{#1}}{}} + { + \vspace*{\baselineskip} + } + { + \hangpara{\DoxyCodeWidth}{1}{#1}\par + } +} + +\newcommand\NiceSpace{% + \discretionary{}{\kern\fontdimen2\font}{\kern\fontdimen2\font}% +} + +% Used by @code ... @endcode +\newenvironment{DoxyCode}[1]{% + \par% + \scriptsize% + \normalfont\ttfamily% + \rightskip0pt plus 1fil% + \settowidth{\DoxyCodeWidth}{000000}% + \settowidth{\CodeWidthChar}{?}% + \settoheight{\CodeHeightChar}{?}% + \setlength{\parskip}{0ex plus 0ex minus 0ex}% + \ifthenelse{\equal{#1}{0}} + { + {\lccode`~32 \lowercase{\global\let~}\NiceSpace}\obeyspaces% + } + { + {\lccode`~32 \lowercase{\global\let~}}\obeyspaces% + } + +}{% + \normalfont% + \normalsize% + \settowidth{\CodeWidthChar}{?}% + \settoheight{\CodeHeightChar}{?}% +} + +% Redefining not defined characters, i.e. "Replacement Character" in tex output. +\def\ucr{\adjustbox{width=\CodeWidthChar,height=\CodeHeightChar}{\stackinset{c}{}{c}{-.2pt}{% + \textcolor{white}{\sffamily\bfseries\small ?}}{% + \rotatebox{45}{$\blacksquare$}}}} + +% Used by @example, @include, @includelineno and @dontinclude +\newenvironment{DoxyCodeInclude}[1]{% + \DoxyCode{#1}% +}{% + \endDoxyCode% +} + +% Used by @verbatim ... @endverbatim +\newenvironment{DoxyVerb}{% + \par% + \footnotesize% + \verbatim% +}{% + \endverbatim% + \normalsize% +} + +% Used by @verbinclude +\newenvironment{DoxyVerbInclude}{% + \DoxyVerb% +}{% + \endDoxyVerb% +} + +% Used by numbered lists (using '-#' or
    ...
) +\setlistdepth{12} +\newlist{DoxyEnumerate}{enumerate}{12} +\setlist[DoxyEnumerate,1]{label=\arabic*.} +\setlist[DoxyEnumerate,2]{label=(\enumalphalphcnt*)} +\setlist[DoxyEnumerate,3]{label=\roman*.} +\setlist[DoxyEnumerate,4]{label=\enumAlphAlphcnt*.} +\setlist[DoxyEnumerate,5]{label=\arabic*.} +\setlist[DoxyEnumerate,6]{label=(\enumalphalphcnt*)} +\setlist[DoxyEnumerate,7]{label=\roman*.} +\setlist[DoxyEnumerate,8]{label=\enumAlphAlphcnt*.} +\setlist[DoxyEnumerate,9]{label=\arabic*.} +\setlist[DoxyEnumerate,10]{label=(\enumalphalphcnt*)} +\setlist[DoxyEnumerate,11]{label=\roman*.} +\setlist[DoxyEnumerate,12]{label=\enumAlphAlphcnt*.} + +% Used by bullet lists (using '-', @li, @arg, or ) +\setlistdepth{12} +\newlist{DoxyItemize}{itemize}{12} +\setlist[DoxyItemize]{label=\textperiodcentered} + +\setlist[DoxyItemize,1]{label=\textbullet} +\setlist[DoxyItemize,2]{label=\normalfont\bfseries \textendash} +\setlist[DoxyItemize,3]{label=\textasteriskcentered} +\setlist[DoxyItemize,4]{label=\textperiodcentered} + +% Used by description lists (using
...
) +\newenvironment{DoxyDescription}{% + \description% +}{% + \enddescription% +} + +% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc +% (only if caption is specified) +\newenvironment{DoxyImage}{% + \begin{figure}[H]% + \centering% +}{% + \end{figure}% +} + +% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc +% (only if no caption is specified) +\newenvironment{DoxyImageNoCaption}{% + \begin{center}% +}{% + \end{center}% +} + +% Used by @image +% (only if inline is specified) +\newenvironment{DoxyInlineImage}{% +}{% +} + +% Used by @attention +\newenvironment{DoxyAttention}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @author and @authors +\newenvironment{DoxyAuthor}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @date +\newenvironment{DoxyDate}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @invariant +\newenvironment{DoxyInvariant}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @note +\newenvironment{DoxyNote}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @post +\newenvironment{DoxyPostcond}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @pre +\newenvironment{DoxyPrecond}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @copyright +\newenvironment{DoxyCopyright}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @remark +\newenvironment{DoxyRemark}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @return and @returns +\newenvironment{DoxyReturn}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @since +\newenvironment{DoxySince}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @see +\newenvironment{DoxySeeAlso}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @version +\newenvironment{DoxyVersion}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @warning +\newenvironment{DoxyWarning}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @par and @paragraph +\newenvironment{DoxyParagraph}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by parameter lists +\newenvironment{DoxyParams}[2][]{% + \tabulinesep=1mm% + \par% + \ifthenelse{\equal{#1}{}}% + {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|}}% name + description + {\ifthenelse{\equal{#1}{1}}% + {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + name + desc + {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + type + name + desc + } + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used for fields of simple structs +\newenvironment{DoxyFields}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|X[-1,l]|}% + \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used for fields simple class style enums +\newenvironment{DoxyEnumFields}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used for parameters within a detailed function description +\newenvironment{DoxyParamCaption}{% + \renewcommand{\item}[2][]{\\ \hspace*{2.0cm} ##1 {\em ##2}}% +}{% +} + +% Used by return value lists +\newenvironment{DoxyRetVals}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used by exception lists +\newenvironment{DoxyExceptions}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used by template parameter lists +\newenvironment{DoxyTemplParams}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used for member lists +\newenvironment{DoxyCompactItemize}{% + \begin{itemize}% + \setlength{\itemsep}{-3pt}% + \setlength{\parsep}{0pt}% + \setlength{\topsep}{0pt}% + \setlength{\partopsep}{0pt}% +}{% + \end{itemize}% +} + +% Used for member descriptions +\newenvironment{DoxyCompactList}{% + \begin{list}{}{% + \setlength{\leftmargin}{0.5cm}% + \setlength{\itemsep}{0pt}% + \setlength{\parsep}{0pt}% + \setlength{\topsep}{0pt}% + \renewcommand{\makelabel}{\hfill}% + }% +}{% + \end{list}% +} + +% Used for reference lists (@bug, @deprecated, @todo, etc.) +\newenvironment{DoxyRefList}{% + \begin{list}{}{% + \setlength{\labelwidth}{10pt}% + \setlength{\leftmargin}{\labelwidth}% + \addtolength{\leftmargin}{\labelsep}% + \renewcommand{\makelabel}{\xreflabel}% + }% +}{% + \end{list}% +} + +% Used by @bug, @deprecated, @todo, etc. +\newenvironment{DoxyRefDesc}[1]{% + \begin{list}{}{% + \renewcommand\makelabel[1]{\textbf{##1}}% + \settowidth\labelwidth{\makelabel{#1}}% + \setlength\leftmargin{\labelwidth+\labelsep}% + }% +}{% + \end{list}% +} + +% Used by parameter lists and simple sections +\newenvironment{Desc} +{\begin{list}{}{% + \settowidth{\labelwidth}{20pt}% + \setlength{\parsep}{0pt}% + \setlength{\itemsep}{0pt}% + \setlength{\leftmargin}{\labelwidth+\labelsep}% + \renewcommand{\makelabel}{\entrylabel}% + } +}{% + \end{list}% +} + +% Used by tables +\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}% +\newenvironment{TabularC}[1]% +{\tabulinesep=1mm +\begin{longtabu*}spread 0pt [c]{*#1{|X[-1]}|}}% +{\end{longtabu*}\par}% + +\newenvironment{TabularNC}[1]% +{\begin{tabu}spread 0pt [l]{*#1{|X[-1]}|}}% +{\end{tabu}\par}% + +% Used for member group headers +\newenvironment{Indent}{% + \begin{list}{}{% + \setlength{\leftmargin}{0.5cm}% + }% + \item[]\ignorespaces% +}{% + \unskip% + \end{list}% +} + +% Used when hyperlinks are turned on +\newcommand{\doxylink}[2]{% + \mbox{\hyperlink{#1}{#2}}% +} + +% Used when hyperlinks are turned on +% Third argument is the SectionType, see the doxygen internal +% documentation for the values (relevant: Page ... Subsubsection). +\newcommand{\doxysectlink}[3]{% + \mbox{\hyperlink{#1}{#2}}% +} +% Used when hyperlinks are turned off +\newcommand{\doxyref}[3]{% + \textbf{#1} (\textnormal{#2}\,\pageref{#3})% +} + +% Used when hyperlinks are turned off +% Fourth argument is the SectionType, see the doxygen internal +% documentation for the values (relevant: Page ... Subsubsection). +\newcommand{\doxysectref}[4]{% + \textbf{#1} (\textnormal{#2}\,\pageref{#3})% +} + +% Used to link to a table when hyperlinks are turned on +\newcommand{\doxytablelink}[2]{% + \ref{#1}% +} + +% Used to link to a table when hyperlinks are turned off +\newcommand{\doxytableref}[3]{% + \ref{#3}% +} + +% Used by @addindex +\newcommand{\lcurly}{\{} +\newcommand{\rcurly}{\}} + +% Colors used for syntax highlighting +\definecolor{comment}{rgb}{0.5,0.0,0.0} +\definecolor{keyword}{rgb}{0.0,0.5,0.0} +\definecolor{keywordtype}{rgb}{0.38,0.25,0.125} +\definecolor{keywordflow}{rgb}{0.88,0.5,0.0} +\definecolor{preprocessor}{rgb}{0.5,0.38,0.125} +\definecolor{stringliteral}{rgb}{0.0,0.125,0.25} +\definecolor{charliteral}{rgb}{0.0,0.5,0.5} +\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0} +\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43} +\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0} +\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0} + +% Color used for table heading +\newcommand{\tableheadbgcolor}{lightgray}% + +% Version of hypertarget with correct landing location +\newcommand{\Hypertarget}[1]{\Hy@raisedlink{\hypertarget{#1}{}}} + +% possibility to have sections etc. be within the margins +% unfortunately had to copy part of book.cls and add \raggedright +\makeatletter +\newcommand\doxysection{\@startsection {section}{1}{\z@}% + {-3.5ex \@plus -1ex \@minus -.2ex}% + {2.3ex \@plus.2ex}% + {\raggedright\normalfont\Large\bfseries}} +\newcommand\doxysubsection{\@startsection{subsection}{2}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\raggedright\normalfont\large\bfseries}} +\newcommand\doxysubsubsection{\@startsection{subsubsection}{3}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\raggedright\normalfont\normalsize\bfseries}} +\newcommand\doxyparagraph{\@startsection{paragraph}{4}{\z@}% + {3.25ex \@plus1ex \@minus.2ex}% + {-1em}% + {\raggedright\normalfont\normalsize\bfseries}} +\newcommand\doxysubparagraph{\@startsection{subparagraph}{5}{\parindent}% + {3.25ex \@plus1ex \@minus .2ex}% + {-1em}% + {\raggedright\normalfont\normalsize\bfseries}} +\makeatother +% Define caption that is also suitable in a table +\makeatletter +\def\doxyfigcaption{% +\H@refstepcounter{figure}% +\@dblarg{\@caption{figure}}} +\makeatother + +% Define alpha enumarative names for counters > 26 +\makeatletter +\def\enumalphalphcnt#1{\expandafter\@enumalphalphcnt\csname c@#1\endcsname} +\def\@enumalphalphcnt#1{\alphalph{#1}} +\def\enumAlphAlphcnt#1{\expandafter\@enumAlphAlphcnt\csname c@#1\endcsname} +\def\@enumAlphAlphcnt#1{\AlphAlph{#1}} +\makeatother +\AddEnumerateCounter{\enumalphalphcnt}{\@enumalphalphcnt}{aa} +\AddEnumerateCounter{\enumAlphAlphcnt}{\@enumAlphAlphcnt}{AA} diff --git a/docs/latex/files.tex b/docs/latex/files.tex new file mode 100644 index 0000000..9b0d2b0 --- /dev/null +++ b/docs/latex/files.tex @@ -0,0 +1,4 @@ +\doxysection{File List} +Here is a list of all documented files with brief descriptions\+:\begin{DoxyCompactList} +\item\contentsline{section}{include/airlib/\mbox{\hyperlink{robot__defs_8h_source}{robot\+\_\+defs.\+h}} }{\pageref{robot__defs_8h_source}}{} +\end{DoxyCompactList} diff --git a/docs/latex/index.tex b/docs/latex/index.tex new file mode 100644 index 0000000..9612107 --- /dev/null +++ b/docs/latex/index.tex @@ -0,0 +1,15 @@ +\hypertarget{index_autotoc_md0}{}\doxysection{Bebop2 Controller README File}\label{index_autotoc_md0} +\hypertarget{index_autotoc_md1}{}\doxysubsection{Quick Run}\label{index_autotoc_md1} +Connect your joystick to the computer. Joystick buttons perform following operations\+: +\begin{DoxyCode}{0} +\DoxyCodeLine{IDLE\ =\ 0,\ //\ setpoint\ can\ be\ freely\ moved\ with\ joystick.\ Sphere\ color\ blue} +\DoxyCodeLine{TAKEOFF\ =\ 1,\ //\ drone\ will\ takeoff\ from\ the\ ground} +\DoxyCodeLine{LAND\ =\ 2,\ //drone\ will\ land} +\DoxyCodeLine{ENGAGE\ =\ 3,\ //\ set\ current\ location\ as\ a\ set\ point\ (for\ hover).\ Sphere\ color\ yellow} +\DoxyCodeLine{CONTROL\ =\ 4\ //\ start\ PID\ controller\ for\ the\ current\ (ENGAGE)\ setpoint.\ Sphere\ color\ cyan} + +\end{DoxyCode} + + +Once control mode is enabled, setpoint can also be controlled using joystick axes. Note that, only position controller is implemented. Orientation controller needs yaw angle which could be directly obtained from bebop odom.\hypertarget{index_autotoc_md2}{}\doxysubsection{Parameter Tuning}\label{index_autotoc_md2} +Refer to {\ttfamily config/param.\+yaml} file to read about tuning parameters. Apriltags are used for landmarks and then the drone position is estimated from those landmarks. A complementary filter is implemented to compute state by combining multiple landmarks. \ No newline at end of file diff --git a/docs/latex/longtable_doxygen.sty b/docs/latex/longtable_doxygen.sty new file mode 100644 index 0000000..a0eb314 --- /dev/null +++ b/docs/latex/longtable_doxygen.sty @@ -0,0 +1,448 @@ +%% +%% This is file `longtable.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% longtable.dtx (with options: `package') +%% +%% This is a generated file. +%% +%% The source is maintained by the LaTeX Project team and bug +%% reports for it can be opened at http://latex-project.org/bugs.html +%% (but please observe conditions on bug reports sent to that address!) +%% +%% Copyright 1993-2016 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file was generated from file(s) of the Standard LaTeX `Tools Bundle'. +%% -------------------------------------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3c +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3c or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file may only be distributed together with a copy of the LaTeX +%% `Tools Bundle'. You may however distribute the LaTeX `Tools Bundle' +%% without such generated files. +%% +%% The list of all files belonging to the LaTeX `Tools Bundle' is +%% given in the file `manifest.txt'. +%% +%% File: longtable.dtx Copyright (C) 1990-2001 David Carlisle +\NeedsTeXFormat{LaTeX2e}[1995/06/01] +\ProvidesPackage{longtable_doxygen} + [2014/10/28 v4.11 Multi-page Table package (DPC) - frozen version for doxygen] +\def\LT@err{\PackageError{longtable}} +\def\LT@warn{\PackageWarning{longtable}} +\def\LT@final@warn{% + \AtEndDocument{% + \LT@warn{Table \@width s have changed. Rerun LaTeX.\@gobbletwo}}% + \global\let\LT@final@warn\relax} +\DeclareOption{errorshow}{% + \def\LT@warn{\PackageInfo{longtable}}} +\DeclareOption{pausing}{% + \def\LT@warn#1{% + \LT@err{#1}{This is not really an error}}} +\DeclareOption{set}{} +\DeclareOption{final}{} +\ProcessOptions +\newskip\LTleft \LTleft=\fill +\newskip\LTright \LTright=\fill +\newskip\LTpre \LTpre=\bigskipamount +\newskip\LTpost \LTpost=\bigskipamount +\newcount\LTchunksize \LTchunksize=20 +\let\c@LTchunksize\LTchunksize +\newdimen\LTcapwidth \LTcapwidth=4in +\newbox\LT@head +\newbox\LT@firsthead +\newbox\LT@foot +\newbox\LT@lastfoot +\newcount\LT@cols +\newcount\LT@rows +\newcounter{LT@tables} +\newcounter{LT@chunks}[LT@tables] +\ifx\c@table\undefined + \newcounter{table} + \def\fnum@table{\tablename~\thetable} +\fi +\ifx\tablename\undefined + \def\tablename{Table} +\fi +\newtoks\LT@p@ftn +\mathchardef\LT@end@pen=30000 +\def\longtable{% + \par + \ifx\multicols\@undefined + \else + \ifnum\col@number>\@ne + \@twocolumntrue + \fi + \fi + \if@twocolumn + \LT@err{longtable not in 1-column mode}\@ehc + \fi + \begingroup + \@ifnextchar[\LT@array{\LT@array[x]}} +\def\LT@array[#1]#2{% + \refstepcounter{table}\stepcounter{LT@tables}% + \if l#1% + \LTleft\z@ \LTright\fill + \else\if r#1% + \LTleft\fill \LTright\z@ + \else\if c#1% + \LTleft\fill \LTright\fill + \fi\fi\fi + \let\LT@mcol\multicolumn + \let\LT@@tabarray\@tabarray + \let\LT@@hl\hline + \def\@tabarray{% + \let\hline\LT@@hl + \LT@@tabarray}% + \let\\\LT@tabularcr\let\tabularnewline\\% + \def\newpage{\noalign{\break}}% + \def\pagebreak{\noalign{\ifnum`}=0\fi\@testopt{\LT@no@pgbk-}4}% + \def\nopagebreak{\noalign{\ifnum`}=0\fi\@testopt\LT@no@pgbk4}% + \let\hline\LT@hline \let\kill\LT@kill\let\caption\LT@caption + \@tempdima\ht\strutbox + \let\@endpbox\LT@endpbox + \ifx\extrarowheight\@undefined + \let\@acol\@tabacol + \let\@classz\@tabclassz \let\@classiv\@tabclassiv + \def\@startpbox{\vtop\LT@startpbox}% + \let\@@startpbox\@startpbox + \let\@@endpbox\@endpbox + \let\LT@LL@FM@cr\@tabularcr + \else + \advance\@tempdima\extrarowheight + \col@sep\tabcolsep + \let\@startpbox\LT@startpbox\let\LT@LL@FM@cr\@arraycr + \fi + \setbox\@arstrutbox\hbox{\vrule + \@height \arraystretch \@tempdima + \@depth \arraystretch \dp \strutbox + \@width \z@}% + \let\@sharp##\let\protect\relax + \begingroup + \@mkpream{#2}% + \xdef\LT@bchunk{% + \global\advance\c@LT@chunks\@ne + \global\LT@rows\z@\setbox\z@\vbox\bgroup + \LT@setprevdepth + \tabskip\LTleft \noexpand\halign to\hsize\bgroup + \tabskip\z@ \@arstrut \@preamble \tabskip\LTright \cr}% + \endgroup + \expandafter\LT@nofcols\LT@bchunk&\LT@nofcols + \LT@make@row + \m@th\let\par\@empty + \everycr{}\lineskip\z@\baselineskip\z@ + \LT@bchunk} +\def\LT@no@pgbk#1[#2]{\penalty #1\@getpen{#2}\ifnum`{=0\fi}} +\def\LT@start{% + \let\LT@start\endgraf + \endgraf\penalty\z@\vskip\LTpre + \dimen@\pagetotal + \advance\dimen@ \ht\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi + \advance\dimen@ \dp\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi + \advance\dimen@ \ht\LT@foot + \dimen@ii\vfuzz + \vfuzz\maxdimen + \setbox\tw@\copy\z@ + \setbox\tw@\vsplit\tw@ to \ht\@arstrutbox + \setbox\tw@\vbox{\unvbox\tw@}% + \vfuzz\dimen@ii + \advance\dimen@ \ht + \ifdim\ht\@arstrutbox>\ht\tw@\@arstrutbox\else\tw@\fi + \advance\dimen@\dp + \ifdim\dp\@arstrutbox>\dp\tw@\@arstrutbox\else\tw@\fi + \advance\dimen@ -\pagegoal + \ifdim \dimen@>\z@\vfil\break\fi + \global\@colroom\@colht + \ifvoid\LT@foot\else + \advance\vsize-\ht\LT@foot + \global\advance\@colroom-\ht\LT@foot + \dimen@\pagegoal\advance\dimen@-\ht\LT@foot\pagegoal\dimen@ + \maxdepth\z@ + \fi + \ifvoid\LT@firsthead\copy\LT@head\else\box\LT@firsthead\fi\nobreak + \output{\LT@output}} +\def\endlongtable{% + \crcr + \noalign{% + \let\LT@entry\LT@entry@chop + \xdef\LT@save@row{\LT@save@row}}% + \LT@echunk + \LT@start + \unvbox\z@ + \LT@get@widths + \if@filesw + {\let\LT@entry\LT@entry@write\immediate\write\@auxout{% + \gdef\expandafter\noexpand + \csname LT@\romannumeral\c@LT@tables\endcsname + {\LT@save@row}}}% + \fi + \ifx\LT@save@row\LT@@save@row + \else + \LT@warn{Column \@width s have changed\MessageBreak + in table \thetable}% + \LT@final@warn + \fi + \endgraf\penalty -\LT@end@pen + \endgroup + \global\@mparbottom\z@ + \pagegoal\vsize + \endgraf\penalty\z@\addvspace\LTpost + \ifvoid\footins\else\insert\footins{}\fi} +\def\LT@nofcols#1&{% + \futurelet\@let@token\LT@n@fcols} +\def\LT@n@fcols{% + \advance\LT@cols\@ne + \ifx\@let@token\LT@nofcols + \expandafter\@gobble + \else + \expandafter\LT@nofcols + \fi} +\def\LT@tabularcr{% + \relax\iffalse{\fi\ifnum0=`}\fi + \@ifstar + {\def\crcr{\LT@crcr\noalign{\nobreak}}\let\cr\crcr + \LT@t@bularcr}% + {\LT@t@bularcr}} +\let\LT@crcr\crcr +\let\LT@setprevdepth\relax +\def\LT@t@bularcr{% + \global\advance\LT@rows\@ne + \ifnum\LT@rows=\LTchunksize + \gdef\LT@setprevdepth{% + \prevdepth\z@\global + \global\let\LT@setprevdepth\relax}% + \expandafter\LT@xtabularcr + \else + \ifnum0=`{}\fi + \expandafter\LT@LL@FM@cr + \fi} +\def\LT@xtabularcr{% + \@ifnextchar[\LT@argtabularcr\LT@ntabularcr} +\def\LT@ntabularcr{% + \ifnum0=`{}\fi + \LT@echunk + \LT@start + \unvbox\z@ + \LT@get@widths + \LT@bchunk} +\def\LT@argtabularcr[#1]{% + \ifnum0=`{}\fi + \ifdim #1>\z@ + \unskip\@xargarraycr{#1}% + \else + \@yargarraycr{#1}% + \fi + \LT@echunk + \LT@start + \unvbox\z@ + \LT@get@widths + \LT@bchunk} +\def\LT@echunk{% + \crcr\LT@save@row\cr\egroup + \global\setbox\@ne\lastbox + \unskip + \egroup} +\def\LT@entry#1#2{% + \ifhmode\@firstofone{&}\fi\omit + \ifnum#1=\c@LT@chunks + \else + \kern#2\relax + \fi} +\def\LT@entry@chop#1#2{% + \noexpand\LT@entry + {\ifnum#1>\c@LT@chunks + 1}{0pt% + \else + #1}{#2% + \fi}} +\def\LT@entry@write{% + \noexpand\LT@entry^^J% + \@spaces} +\def\LT@kill{% + \LT@echunk + \LT@get@widths + \expandafter\LT@rebox\LT@bchunk} +\def\LT@rebox#1\bgroup{% + #1\bgroup + \unvbox\z@ + \unskip + \setbox\z@\lastbox} +\def\LT@blank@row{% + \xdef\LT@save@row{\expandafter\LT@build@blank + \romannumeral\number\LT@cols 001 }} +\def\LT@build@blank#1{% + \if#1m% + \noexpand\LT@entry{1}{0pt}% + \expandafter\LT@build@blank + \fi} +\def\LT@make@row{% + \global\expandafter\let\expandafter\LT@save@row + \csname LT@\romannumeral\c@LT@tables\endcsname + \ifx\LT@save@row\relax + \LT@blank@row + \else + {\let\LT@entry\or + \if!% + \ifcase\expandafter\expandafter\expandafter\LT@cols + \expandafter\@gobble\LT@save@row + \or + \else + \relax + \fi + !% + \else + \aftergroup\LT@blank@row + \fi}% + \fi} +\let\setlongtables\relax +\def\LT@get@widths{% + \setbox\tw@\hbox{% + \unhbox\@ne + \let\LT@old@row\LT@save@row + \global\let\LT@save@row\@empty + \count@\LT@cols + \loop + \unskip + \setbox\tw@\lastbox + \ifhbox\tw@ + \LT@def@row + \advance\count@\m@ne + \repeat}% + \ifx\LT@@save@row\@undefined + \let\LT@@save@row\LT@save@row + \fi} +\def\LT@def@row{% + \let\LT@entry\or + \edef\@tempa{% + \ifcase\expandafter\count@\LT@old@row + \else + {1}{0pt}% + \fi}% + \let\LT@entry\relax + \xdef\LT@save@row{% + \LT@entry + \expandafter\LT@max@sel\@tempa + \LT@save@row}} +\def\LT@max@sel#1#2{% + {\ifdim#2=\wd\tw@ + #1% + \else + \number\c@LT@chunks + \fi}% + {\the\wd\tw@}} +\def\LT@hline{% + \noalign{\ifnum0=`}\fi + \penalty\@M + \futurelet\@let@token\LT@@hline} +\def\LT@@hline{% + \ifx\@let@token\hline + \global\let\@gtempa\@gobble + \gdef\LT@sep{\penalty-\@medpenalty\vskip\doublerulesep}% + \else + \global\let\@gtempa\@empty + \gdef\LT@sep{\penalty-\@lowpenalty\vskip-\arrayrulewidth}% + \fi + \ifnum0=`{\fi}% + \multispan\LT@cols + \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr + \noalign{\LT@sep}% + \multispan\LT@cols + \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr + \noalign{\penalty\@M}% + \@gtempa} +\def\LT@caption{% + \noalign\bgroup + \@ifnextchar[{\egroup\LT@c@ption\@firstofone}\LT@capti@n} +\def\LT@c@ption#1[#2]#3{% + \LT@makecaption#1\fnum@table{#3}% + \def\@tempa{#2}% + \ifx\@tempa\@empty\else + {\let\\\space + \addcontentsline{lot}{table}{\protect\numberline{\thetable}{#2}}}% + \fi} +\def\LT@capti@n{% + \@ifstar + {\egroup\LT@c@ption\@gobble[]}% + {\egroup\@xdblarg{\LT@c@ption\@firstofone}}} +\def\LT@makecaption#1#2#3{% + \LT@mcol\LT@cols c{\hbox to\z@{\hss\parbox[t]\LTcapwidth{% + \sbox\@tempboxa{#1{#2: }#3}% + \ifdim\wd\@tempboxa>\hsize + #1{#2: }#3% + \else + \hbox to\hsize{\hfil\box\@tempboxa\hfil}% + \fi + \endgraf\vskip\baselineskip}% + \hss}}} +\def\LT@output{% + \ifnum\outputpenalty <-\@Mi + \ifnum\outputpenalty > -\LT@end@pen + \LT@err{floats and marginpars not allowed in a longtable}\@ehc + \else + \setbox\z@\vbox{\unvbox\@cclv}% + \ifdim \ht\LT@lastfoot>\ht\LT@foot + \dimen@\pagegoal + \advance\dimen@-\ht\LT@lastfoot + \ifdim\dimen@<\ht\z@ + \setbox\@cclv\vbox{\unvbox\z@\copy\LT@foot\vss}% + \@makecol + \@outputpage + \setbox\z@\vbox{\box\LT@head}% + \fi + \fi + \global\@colroom\@colht + \global\vsize\@colht + \vbox + {\unvbox\z@\box\ifvoid\LT@lastfoot\LT@foot\else\LT@lastfoot\fi}% + \fi + \else + \setbox\@cclv\vbox{\unvbox\@cclv\copy\LT@foot\vss}% + \@makecol + \@outputpage + \global\vsize\@colroom + \copy\LT@head\nobreak + \fi} +\def\LT@end@hd@ft#1{% + \LT@echunk + \ifx\LT@start\endgraf + \LT@err + {Longtable head or foot not at start of table}% + {Increase LTchunksize}% + \fi + \setbox#1\box\z@ + \LT@get@widths + \LT@bchunk} +\def\endfirsthead{\LT@end@hd@ft\LT@firsthead} +\def\endhead{\LT@end@hd@ft\LT@head} +\def\endfoot{\LT@end@hd@ft\LT@foot} +\def\endlastfoot{\LT@end@hd@ft\LT@lastfoot} +\def\LT@startpbox#1{% + \bgroup + \let\@footnotetext\LT@p@ftntext + \setlength\hsize{#1}% + \@arrayparboxrestore + \vrule \@height \ht\@arstrutbox \@width \z@} +\def\LT@endpbox{% + \@finalstrut\@arstrutbox + \egroup + \the\LT@p@ftn + \global\LT@p@ftn{}% + \hfil} +\def\LT@p@ftntext#1{% + \edef\@tempa{\the\LT@p@ftn\noexpand\footnotetext[\the\c@footnote]}% + \global\LT@p@ftn\expandafter{\@tempa{#1}}}% + +\@namedef{ver@longtable.sty}{2014/10/28 v4.11 Multi-page Table package (DPC) - frozen version for doxygen} +\endinput +%% +%% End of file `longtable.sty'. diff --git a/docs/latex/md__home_simant_bebop2_controller_docs_bebop2_controller__r_e_a_d_m_e.tex b/docs/latex/md__home_simant_bebop2_controller_docs_bebop2_controller__r_e_a_d_m_e.tex new file mode 100644 index 0000000..3678999 --- /dev/null +++ b/docs/latex/md__home_simant_bebop2_controller_docs_bebop2_controller__r_e_a_d_m_e.tex @@ -0,0 +1,14 @@ +\hypertarget{md__home_simant_bebop2_controller_docs_bebop2_controller__r_e_a_d_m_e_autotoc_md1}{}\doxysection{Quick Run}\label{md__home_simant_bebop2_controller_docs_bebop2_controller__r_e_a_d_m_e_autotoc_md1} +Connect your joystick to the computer. Joystick buttons perform following operations\+: +\begin{DoxyCode}{0} +\DoxyCodeLine{IDLE\ =\ 0,\ //\ setpoint\ can\ be\ freely\ moved\ with\ joystick.\ Sphere\ color\ blue} +\DoxyCodeLine{TAKEOFF\ =\ 1,\ //\ drone\ will\ takeoff\ from\ the\ ground} +\DoxyCodeLine{LAND\ =\ 2,\ //drone\ will\ land} +\DoxyCodeLine{ENGAGE\ =\ 3,\ //\ set\ current\ location\ as\ a\ set\ point\ (for\ hover).\ Sphere\ color\ yellow} +\DoxyCodeLine{CONTROL\ =\ 4\ //\ start\ PID\ controller\ for\ the\ current\ (ENGAGE)\ setpoint.\ Sphere\ color\ cyan} + +\end{DoxyCode} + + +Once control mode is enabled, setpoint can also be controlled using joystick axes. Note that, only position controller is implemented. Orientation controller needs yaw angle which could be directly obtained from bebop odom.\hypertarget{md__home_simant_bebop2_controller_docs_bebop2_controller__r_e_a_d_m_e_autotoc_md2}{}\doxysection{Parameter Tuning}\label{md__home_simant_bebop2_controller_docs_bebop2_controller__r_e_a_d_m_e_autotoc_md2} +Refer to {\ttfamily config/param.\+yaml} file to read about tuning parameters. Apriltags are used for landmarks and then the drone position is estimated from those landmarks. A complementary filter is implemented to compute state by combining multiple landmarks. \ No newline at end of file diff --git a/docs/latex/md__r_e_a_d_m_e.tex b/docs/latex/md__r_e_a_d_m_e.tex new file mode 100644 index 0000000..c9307bc --- /dev/null +++ b/docs/latex/md__r_e_a_d_m_e.tex @@ -0,0 +1,14 @@ +\hypertarget{md__r_e_a_d_m_e_autotoc_md1}{}\doxysection{Quick Run}\label{md__r_e_a_d_m_e_autotoc_md1} +Connect your joystick to the computer. Joystick buttons perform following operations\+: +\begin{DoxyCode}{0} +\DoxyCodeLine{IDLE\ =\ 0,\ //\ setpoint\ can\ be\ freely\ moved\ with\ joystick.\ Sphere\ color\ blue} +\DoxyCodeLine{TAKEOFF\ =\ 1,\ //\ drone\ will\ takeoff\ from\ the\ ground} +\DoxyCodeLine{LAND\ =\ 2,\ //drone\ will\ land} +\DoxyCodeLine{ENGAGE\ =\ 3,\ //\ set\ current\ location\ as\ a\ set\ point\ (for\ hover).\ Sphere\ color\ yellow} +\DoxyCodeLine{CONTROL\ =\ 4\ //\ start\ PID\ controller\ for\ the\ current\ (ENGAGE)\ setpoint.\ Sphere\ color\ cyan} + +\end{DoxyCode} + + +Once control mode is enabled, setpoint can also be controlled using joystick axes. Note that, only position controller is implemented. Orientation controller needs yaw angle which could be directly obtained from bebop odom.\hypertarget{md__r_e_a_d_m_e_autotoc_md2}{}\doxysection{Parameter Tuning}\label{md__r_e_a_d_m_e_autotoc_md2} +Refer to {\ttfamily config/param.\+yaml} file to read about tuning parameters. Apriltags are used for landmarks and then the drone position is estimated from those landmarks. A complementary filter is implemented to compute state by combining multiple landmarks. \ No newline at end of file diff --git a/docs/latex/refman.tex b/docs/latex/refman.tex new file mode 100644 index 0000000..1e63a76 --- /dev/null +++ b/docs/latex/refman.tex @@ -0,0 +1,198 @@ + % Handle batch mode + % to overcome problems with too many open files + \let\mypdfximage\pdfximage\def\pdfximage{\immediate\mypdfximage} + % Set document class depending on configuration + \documentclass[twoside]{book} + %% moved from doxygen.sty due to workaround for LaTex 2019 version and unmaintained tabu package + \usepackage{ifthen} + \ifx\requestedLaTeXdate\undefined + \usepackage{array} + \else + \usepackage{array}[=2016-10-06] + \fi + %% + % Packages required by doxygen + \usepackage{fixltx2e} % for \textsubscript + \usepackage{doxygen} + \usepackage{graphicx} + \usepackage[utf8]{inputenc} + \usepackage{makeidx} + \PassOptionsToPackage{warn}{textcomp} + \usepackage{textcomp} + \usepackage[nointegrals]{wasysym} + \usepackage{ifxetex} + % NLS support packages + % Define default fonts + % Font selection + \usepackage[T1]{fontenc} + % set main and monospaced font + \usepackage[scaled=.90]{helvet} +\usepackage{courier} +\renewcommand{\familydefault}{\sfdefault} + \usepackage{sectsty} + \allsectionsfont{% + \fontseries{bc}\selectfont% + \color{darkgray}% + } + \renewcommand{\DoxyLabelFont}{% + \fontseries{bc}\selectfont% + \color{darkgray}% + } + \newcommand{\+}{\discretionary{\mbox{\scriptsize$\hookleftarrow$}}{}{}} + % Arguments of doxygenemoji: + % 1) '::' form of the emoji, already LaTeX-escaped + % 2) file with the name of the emoji without the .png extension + % in case image exist use this otherwise use the '::' form + \newcommand{\doxygenemoji}[2]{% + \IfFileExists{./#2.png}{\raisebox{-0.1em}{\includegraphics[height=0.9em]{./#2.png}}}{#1}% + } + % Page & text layout + \usepackage{geometry} + \geometry{% + a4paper,% + top=2.5cm,% + bottom=2.5cm,% + left=2.5cm,% + right=2.5cm% + } + \usepackage{changepage} + % Allow a bit of overflow to go unnoticed by other means + \tolerance=750 + \hfuzz=15pt + \hbadness=750 + \setlength{\emergencystretch}{15pt} + \setlength{\parindent}{0cm} + \newcommand{\doxynormalparskip}{\setlength{\parskip}{3ex plus 2ex minus 2ex}} + \newcommand{\doxytocparskip}{\setlength{\parskip}{1ex plus 0ex minus 0ex}} + \doxynormalparskip + % Redefine paragraph/subparagraph environments, using sectsty fonts + \makeatletter + \renewcommand{\paragraph}{% + \@startsection{paragraph}{4}{0ex}{-1.0ex}{1.0ex}{% + \normalfont\normalsize\bfseries\SS@parafont% + }% + } + \renewcommand{\subparagraph}{% + \@startsection{subparagraph}{5}{0ex}{-1.0ex}{1.0ex}{% + \normalfont\normalsize\bfseries\SS@subparafont% + }% + } + \makeatother + \makeatletter + \newcommand\hrulefilll{\leavevmode\leaders\hrule\hskip 0pt plus 1filll\kern\z@} + \makeatother + % Headers & footers + \usepackage{fancyhdr} + \pagestyle{fancyplain} + \renewcommand{\footrulewidth}{0.4pt} + \fancypagestyle{fancyplain}{ + \fancyhf{} + \fancyhead[LE, RO]{\bfseries\thepage} + \fancyhead[LO]{\bfseries\rightmark} + \fancyhead[RE]{\bfseries\leftmark} + \fancyfoot[LO, RE]{\bfseries\scriptsize Generated by Doxygen } + } + \fancypagestyle{plain}{ + \fancyhf{} + \fancyfoot[LO, RE]{\bfseries\scriptsize Generated by Doxygen } + \renewcommand{\headrulewidth}{0pt} + } + \pagestyle{fancyplain} + \renewcommand{\chaptermark}[1]{% + \markboth{#1}{}% + } + \renewcommand{\sectionmark}[1]{% + \markright{\thesection\ #1}% + } + % ToC, LoF, LoT, bibliography, and index + % Indices & bibliography + \usepackage{natbib} + \usepackage[titles]{tocloft} + \setcounter{tocdepth}{3} + \setcounter{secnumdepth}{5} + % creating indexes + \makeindex + \usepackage{newunicodechar} + \newunicodechar{⁻}{${}^{-}$}% Superscript minus + \newunicodechar{²}{${}^{2}$}% Superscript two + \newunicodechar{³}{${}^{3}$}% Superscript three + % Hyperlinks + % Hyperlinks (required, but should be loaded last) + \ifpdf + \usepackage[pdftex,pagebackref=true]{hyperref} + \else + \ifxetex + \usepackage[pagebackref=true]{hyperref} + \else + \usepackage[ps2pdf,pagebackref=true]{hyperref} + \fi + \fi + \hypersetup{% + colorlinks=true,% + linkcolor=blue,% + citecolor=blue,% + unicode,% + pdftitle={Parrot Bebop2},% + pdfsubject={}% + } + % Custom commands used by the header + % Custom commands + \newcommand{\clearemptydoublepage}{% + \newpage{\pagestyle{empty}\cleardoublepage}% + } + % caption style definition + \usepackage{caption} + \captionsetup{labelsep=space,justification=centering,font={bf},singlelinecheck=off,skip=4pt,position=top} + % in page table of contents + \usepackage{etoc} + \etocsettocstyle{\doxytocparskip}{\doxynormalparskip} + % prevent numbers overlap the titles in toc + \renewcommand{\numberline}[1]{#1~} +% End of preamble, now comes the document contents +%===== C O N T E N T S ===== +\begin{document} + \raggedbottom + % Titlepage & ToC + % To avoid duplicate page anchors due to reuse of same numbers for + % the index (be it as roman numbers) + \hypersetup{pageanchor=false, + bookmarksnumbered=true, + pdfencoding=unicode + } + \pagenumbering{alph} + \begin{titlepage} + \vspace*{7cm} + \begin{center}% + {\Large Parrot Bebop2}\\ + \vspace*{1cm} + {\large Generated by Doxygen 1.9.7}\\ + \end{center} + \end{titlepage} + \clearemptydoublepage + \pagenumbering{roman} + \tableofcontents + \clearemptydoublepage + \pagenumbering{arabic} + % re-enable anchors again + \hypersetup{pageanchor=true} +%--- Begin generated contents --- +\chapter{Class Index} +\input{annotated} +\chapter{File Index} +\input{files} +\chapter{Class Documentation} +\input{struct_field_location} +\input{struct_marker_observation} +\input{struct_robot_state} +\chapter{File Documentation} +\input{robot__defs_8h_source} +%--- End generated contents --- +% Index + \backmatter + \newpage + \phantomsection + \clearemptydoublepage + \addcontentsline{toc}{chapter}{\indexname} + \printindex +% Required for some languages (in combination with latexdocumentpre from the header) +\end{document} diff --git a/docs/latex/robot__defs_8h_source.tex b/docs/latex/robot__defs_8h_source.tex new file mode 100644 index 0000000..80ca90e --- /dev/null +++ b/docs/latex/robot__defs_8h_source.tex @@ -0,0 +1,93 @@ +\hypertarget{robot__defs_8h_source}{}\doxysection{robot\+\_\+defs.\+h} +\label{robot__defs_8h_source}\index{include/airlib/robot\_defs.h@{include/airlib/robot\_defs.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00005\ } +\DoxyCodeLine{00006\ \textcolor{comment}{//const\ int\ STATE\_DIM\ =\ 10;}} +\DoxyCodeLine{00007\ } +\DoxyCodeLine{00008\ \textcolor{keyword}{struct\ }\mbox{\hyperlink{struct_robot_state}{RobotState}}} +\DoxyCodeLine{00009\ \{} +\DoxyCodeLine{00011\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{struct_robot_state_a7ca6f4e88ac7982242ab32cf5fba15e6}{x}};\ } +\DoxyCodeLine{00013\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{struct_robot_state_ac96a8e033454034c95745aee1811ffc2}{y}};} +\DoxyCodeLine{00015\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{struct_robot_state_a552998092784696aaf6db9c47ab6a425}{z}};} +\DoxyCodeLine{00017\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{struct_robot_state_a347039726076c6fbe8874635dfa21af0}{theta}};\ \ } +\DoxyCodeLine{00018\ \textcolor{comment}{//\ \ \ \ double\ vx;\ \ \ \ \ //\ x-\/linear\ velocity\ (in\ meters)}} +\DoxyCodeLine{00019\ \textcolor{comment}{//\ \ \ \ double\ vy;\ \ \ \ \ //\ y-\/linear\ velocity\ (in\ meters)}} +\DoxyCodeLine{00020\ \textcolor{comment}{//\ \ \ \ double\ vz;\ \ \ \ \ //\ z-\/linear\ velocity\ (in\ meters)}} +\DoxyCodeLine{00021\ \textcolor{comment}{//\ \ \ \ double\ wx;\ \ \ \ \ //\ x-\/angular\ velocity\ (in\ meters)}} +\DoxyCodeLine{00022\ \textcolor{comment}{//\ \ \ \ double\ wy;\ \ \ \ \ //\ y-\/angular\ velocity\ (in\ meters)}} +\DoxyCodeLine{00023\ \textcolor{comment}{//\ \ \ \ double\ wz;\ \ \ \ \ //\ z-\/angular\ velocity\ (in\ meters)}} +\DoxyCodeLine{00024\ \};} +\DoxyCodeLine{00025\ } +\DoxyCodeLine{00026\ } +\DoxyCodeLine{00027\ \textcolor{comment}{/*\ Field\ location\ structure\ in\ radial\ distance\ (r),\ azimuthal\ angle\ (theta),\ and\ polar\ angle\ (psi)\ */}} +\DoxyCodeLine{00028\ \textcolor{keyword}{struct\ }\mbox{\hyperlink{struct_marker_observation}{MarkerObservation}}} +\DoxyCodeLine{00029\ \{} +\DoxyCodeLine{00030\ \ \ \ \ std::string\ tagName;\ \ \textcolor{comment}{//\ Index\ of\ observed\ marker\ [0-\/n]}} +\DoxyCodeLine{00032\ \textcolor{comment}{}\ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{struct_marker_observation_a74eaf75e45d859ee6b8f8e4bd5439bae}{radial\_distance}};\ \ \ \ } +\DoxyCodeLine{00034\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{struct_marker_observation_a100373bce74cf49ea8870196d2acf74b}{azimuthal\_angle}};\ } +\DoxyCodeLine{00036\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{struct_marker_observation_aad670bccd0f025ea8808148e828878a2}{polar\_angle}};\ } +\DoxyCodeLine{00037\ } +\DoxyCodeLine{00038\ } +\DoxyCodeLine{00043\ \ \ \ \ \textcolor{keyword}{friend}\ std::ostream\ \&\mbox{\hyperlink{struct_marker_observation_a4755337b360a2c606740ae5cc60b00e5}{operator<<}}(std::ostream\ \&os,\ \textcolor{keyword}{const}\ \mbox{\hyperlink{struct_marker_observation}{MarkerObservation}}\ \&observation)\ \{} +\DoxyCodeLine{00044\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ degFactor\ =\ (180.0/3.141592653589793238463);} +\DoxyCodeLine{00045\ \ \ \ \ \ \ \ \ os\ <<\ \textcolor{stringliteral}{"{}tagName:\ "{}}\ <<\ observation.tagName\ <<\ \textcolor{stringliteral}{"{}\ radial\_distance:\ "{}}\ <<\ observation.\mbox{\hyperlink{struct_marker_observation_a74eaf75e45d859ee6b8f8e4bd5439bae}{radial\_distance}}} +\DoxyCodeLine{00046\ \ \ \ \ \ \ \ \ \ \ \ <<\ \textcolor{stringliteral}{"{}\ azimuthal\_angle:\ "{}}\ <<\ observation.\mbox{\hyperlink{struct_marker_observation_a100373bce74cf49ea8870196d2acf74b}{azimuthal\_angle}}\ *\ degFactor\ <<\ \textcolor{stringliteral}{"{}\ polar\_angle:\ "{}}\ <<\ observation.\mbox{\hyperlink{struct_marker_observation_aad670bccd0f025ea8808148e828878a2}{polar\_angle}}\ *\ degFactor;} +\DoxyCodeLine{00047\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{return}\ os;} +\DoxyCodeLine{00048\ \ \ \ \ \}} +\DoxyCodeLine{00049\ } +\DoxyCodeLine{00050\ \};} +\DoxyCodeLine{00051\ } +\DoxyCodeLine{00052\ } +\DoxyCodeLine{00053\ \textcolor{comment}{/*\ Field\ location\ structure\ */}} +\DoxyCodeLine{00054\ \textcolor{keyword}{struct\ }\mbox{\hyperlink{struct_field_location}{FieldLocation}}} +\DoxyCodeLine{00055\ \{} +\DoxyCodeLine{00056\ \ \ \ \ std::string\ tagName;} +\DoxyCodeLine{00058\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{struct_field_location_a2f101b216cd1177702266249290f382b}{x}};\ \ } +\DoxyCodeLine{00060\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{struct_field_location_a91e5558f47b388feffccf1c23a93b5e6}{y}};\ } +\DoxyCodeLine{00062\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{struct_field_location_a4cdf46653fc5e8fae3688924f7705897}{z}};\ \ \ \ \ \ } +\DoxyCodeLine{00063\ } +\DoxyCodeLine{00066\ \ \ \ \ \mbox{\hyperlink{struct_marker_observation}{MarkerObservation}}\ \mbox{\hyperlink{struct_field_location_aba8010cdbd3ea54265db5d7cd75de44e}{toObservation}}()} +\DoxyCodeLine{00067\ \ \ \ \ \{} +\DoxyCodeLine{00068\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ rho\ =\ sqrt(\mbox{\hyperlink{struct_field_location_a2f101b216cd1177702266249290f382b}{x}}\ *\ \mbox{\hyperlink{struct_field_location_a2f101b216cd1177702266249290f382b}{x}}\ +\ \mbox{\hyperlink{struct_field_location_a91e5558f47b388feffccf1c23a93b5e6}{y}}\ *\ \mbox{\hyperlink{struct_field_location_a91e5558f47b388feffccf1c23a93b5e6}{y}}\ +\ \mbox{\hyperlink{struct_field_location_a4cdf46653fc5e8fae3688924f7705897}{z}}\ *\ \mbox{\hyperlink{struct_field_location_a4cdf46653fc5e8fae3688924f7705897}{z}});} +\DoxyCodeLine{00069\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ phi\ =\ atan2(\mbox{\hyperlink{struct_field_location_a2f101b216cd1177702266249290f382b}{x}},\ \mbox{\hyperlink{struct_field_location_a4cdf46653fc5e8fae3688924f7705897}{z}});} +\DoxyCodeLine{00070\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ theta\ =\ atan2(hypot(\mbox{\hyperlink{struct_field_location_a2f101b216cd1177702266249290f382b}{x}},\ \mbox{\hyperlink{struct_field_location_a4cdf46653fc5e8fae3688924f7705897}{z}}),\ \mbox{\hyperlink{struct_field_location_a91e5558f47b388feffccf1c23a93b5e6}{y}});} +\DoxyCodeLine{00071\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{return}\ \mbox{\hyperlink{struct_marker_observation}{MarkerObservation}}\{tagName,\ rho,\ theta,\ phi\};} +\DoxyCodeLine{00072\ } +\DoxyCodeLine{00073\ \ \ \ \ \}} +\DoxyCodeLine{00077\ \ \ \ \ \textcolor{keyword}{friend}\ std::ostream\ \&\mbox{\hyperlink{struct_field_location_ae81613697d66349de9e6bff55d3bca4d}{operator<<}}(std::ostream\ \&os,\ \textcolor{keyword}{const}\ \mbox{\hyperlink{struct_field_location}{FieldLocation}}\ \&location)\ \{} +\DoxyCodeLine{00078\ \ \ \ \ \ \ \ \ os\ <<\ \textcolor{stringliteral}{"{}tagName:\ "{}}\ <<\ location.tagName\ <<\ \textcolor{stringliteral}{"{}\ x:\ "{}}\ <<\ location.\mbox{\hyperlink{struct_field_location_a2f101b216cd1177702266249290f382b}{x}}\ <<\ \textcolor{stringliteral}{"{}\ y:\ "{}}\ <<\ location.\mbox{\hyperlink{struct_field_location_a91e5558f47b388feffccf1c23a93b5e6}{y}}\ <<\ \textcolor{stringliteral}{"{}\ z:\ "{}}\ <<\ location.\mbox{\hyperlink{struct_field_location_a4cdf46653fc5e8fae3688924f7705897}{z}};} +\DoxyCodeLine{00079\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{return}\ os;} +\DoxyCodeLine{00080\ \ \ \ \ \}} +\DoxyCodeLine{00081\ } +\DoxyCodeLine{00082\ } +\DoxyCodeLine{00086\ \ \ \ \ \mbox{\hyperlink{struct_field_location}{FieldLocation}}\ \mbox{\hyperlink{struct_field_location_ae317351db47c70444f72a68516454402}{operator\ -\/\ }}(\textcolor{keyword}{const}\ \mbox{\hyperlink{struct_field_location}{FieldLocation}}\&\ other)\textcolor{keyword}{\ const}} +\DoxyCodeLine{00087\ \textcolor{keyword}{\ \ \ \ }\{} +\DoxyCodeLine{00088\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ dx\ =\ \mbox{\hyperlink{struct_field_location_a2f101b216cd1177702266249290f382b}{x}}\ -\/\ other.\mbox{\hyperlink{struct_field_location_a2f101b216cd1177702266249290f382b}{x}};} +\DoxyCodeLine{00089\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ dy\ =\ \mbox{\hyperlink{struct_field_location_a91e5558f47b388feffccf1c23a93b5e6}{y}}\ -\/\ other.\mbox{\hyperlink{struct_field_location_a91e5558f47b388feffccf1c23a93b5e6}{y}};} +\DoxyCodeLine{00090\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ dz\ =\ \mbox{\hyperlink{struct_field_location_a4cdf46653fc5e8fae3688924f7705897}{z}}\ -\/\ other.\mbox{\hyperlink{struct_field_location_a4cdf46653fc5e8fae3688924f7705897}{z}};} +\DoxyCodeLine{00091\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{return}\ \mbox{\hyperlink{struct_field_location}{FieldLocation}}\{tagName\ +\ \textcolor{stringliteral}{"{}-\/"{}}\ +\ other.tagName,\ dx,\ dy,\ dz\};} +\DoxyCodeLine{00092\ \ \ \ \ \}} +\DoxyCodeLine{00093\ } +\DoxyCodeLine{00097\ \ \ \ \ \mbox{\hyperlink{struct_field_location}{FieldLocation}}\ \mbox{\hyperlink{struct_field_location_ac5966312a3d0df900873be1fa853d840}{operator\ +\ }}(\textcolor{keyword}{const}\ \mbox{\hyperlink{struct_field_location}{FieldLocation}}\&\ other)\textcolor{keyword}{\ const}} +\DoxyCodeLine{00098\ \textcolor{keyword}{\ \ \ \ }\{} +\DoxyCodeLine{00099\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ dx\ =\ \mbox{\hyperlink{struct_field_location_a2f101b216cd1177702266249290f382b}{x}}\ +\ other.\mbox{\hyperlink{struct_field_location_a2f101b216cd1177702266249290f382b}{x}};} +\DoxyCodeLine{00100\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ dy\ =\ \mbox{\hyperlink{struct_field_location_a91e5558f47b388feffccf1c23a93b5e6}{y}}\ +\ other.\mbox{\hyperlink{struct_field_location_a91e5558f47b388feffccf1c23a93b5e6}{y}};} +\DoxyCodeLine{00101\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ dz\ =\ \mbox{\hyperlink{struct_field_location_a4cdf46653fc5e8fae3688924f7705897}{z}}\ +\ other.\mbox{\hyperlink{struct_field_location_a4cdf46653fc5e8fae3688924f7705897}{z}};} +\DoxyCodeLine{00102\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{return}\ \mbox{\hyperlink{struct_field_location}{FieldLocation}}\{tagName,\ dx,\ dy,\ dz\};} +\DoxyCodeLine{00103\ \ \ \ \ \}} +\DoxyCodeLine{00104\ } +\DoxyCodeLine{00108\ \ \ \ \ \mbox{\hyperlink{struct_field_location}{FieldLocation}}\ \mbox{\hyperlink{struct_field_location_a7da89910c0992173841458f493027814}{operator\ *\ }}(\textcolor{keywordtype}{double}\ scale)\textcolor{keyword}{\ const}} +\DoxyCodeLine{00109\ \textcolor{keyword}{\ \ \ \ }\{} +\DoxyCodeLine{00110\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ dx\ =\ \mbox{\hyperlink{struct_field_location_a2f101b216cd1177702266249290f382b}{x}}\ *\ scale;} +\DoxyCodeLine{00111\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ dy\ =\ \mbox{\hyperlink{struct_field_location_a91e5558f47b388feffccf1c23a93b5e6}{y}}\ *\ scale;} +\DoxyCodeLine{00112\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ dz\ =\ \mbox{\hyperlink{struct_field_location_a4cdf46653fc5e8fae3688924f7705897}{z}}\ *\ scale;} +\DoxyCodeLine{00113\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{return}\ \mbox{\hyperlink{struct_field_location}{FieldLocation}}\{tagName,\ dx,\ dy,\ dz\};} +\DoxyCodeLine{00114\ \ \ \ \ \}} +\DoxyCodeLine{00115\ \};} + +\end{DoxyCode} diff --git a/docs/latex/struct_field_location.tex b/docs/latex/struct_field_location.tex new file mode 100644 index 0000000..438d8e0 --- /dev/null +++ b/docs/latex/struct_field_location.tex @@ -0,0 +1,129 @@ +\hypertarget{struct_field_location}{}\doxysection{Field\+Location Struct Reference} +\label{struct_field_location}\index{FieldLocation@{FieldLocation}} +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{struct_marker_observation}{Marker\+Observation}} \mbox{\hyperlink{struct_field_location_aba8010cdbd3ea54265db5d7cd75de44e}{to\+Observation}} () +\begin{DoxyCompactList}\small\item\em Calculates the radial distance, azimuthal angle and polar angle using x,y,z position. \end{DoxyCompactList}\item +\mbox{\hyperlink{struct_field_location}{Field\+Location}} \mbox{\hyperlink{struct_field_location_ae317351db47c70444f72a68516454402}{operator-\/}} (const \mbox{\hyperlink{struct_field_location}{Field\+Location}} \&other) const +\begin{DoxyCompactList}\small\item\em Calculates the difference between two tags. \end{DoxyCompactList}\item +\mbox{\hyperlink{struct_field_location}{Field\+Location}} \mbox{\hyperlink{struct_field_location_ac5966312a3d0df900873be1fa853d840}{operator+}} (const \mbox{\hyperlink{struct_field_location}{Field\+Location}} \&other) const +\begin{DoxyCompactList}\small\item\em Calculates the sum of two tags. \end{DoxyCompactList}\item +\mbox{\hyperlink{struct_field_location}{Field\+Location}} \mbox{\hyperlink{struct_field_location_a7da89910c0992173841458f493027814}{operator$\ast$}} (double scale) const +\begin{DoxyCompactList}\small\item\em Calculates the product between two tags. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{struct_field_location_a1be847da2ecefc18b2181b8d3e8a1bb2}\label{struct_field_location_a1be847da2ecefc18b2181b8d3e8a1bb2}} +std\+::string {\bfseries tag\+Name} +\item +\mbox{\Hypertarget{struct_field_location_a2f101b216cd1177702266249290f382b}\label{struct_field_location_a2f101b216cd1177702266249290f382b}} +double {\bfseries x} +\begin{DoxyCompactList}\small\item\em x-\/position (in meters) \end{DoxyCompactList}\item +\mbox{\Hypertarget{struct_field_location_a91e5558f47b388feffccf1c23a93b5e6}\label{struct_field_location_a91e5558f47b388feffccf1c23a93b5e6}} +double {\bfseries y} +\begin{DoxyCompactList}\small\item\em y-\/position (in meters) ~\newline + \end{DoxyCompactList}\item +\mbox{\Hypertarget{struct_field_location_a4cdf46653fc5e8fae3688924f7705897}\label{struct_field_location_a4cdf46653fc5e8fae3688924f7705897}} +double {\bfseries z} +\begin{DoxyCompactList}\small\item\em z-\/position (in meters) ~\newline + \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Friends} +\begin{DoxyCompactItemize} +\item +std\+::ostream \& \mbox{\hyperlink{struct_field_location_ae81613697d66349de9e6bff55d3bca4d}{operator$<$$<$}} (std\+::ostream \&os, const \mbox{\hyperlink{struct_field_location}{Field\+Location}} \&location) +\end{DoxyCompactItemize} + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{struct_field_location_a7da89910c0992173841458f493027814}\label{struct_field_location_a7da89910c0992173841458f493027814}} +\index{FieldLocation@{FieldLocation}!operator$\ast$@{operator$\ast$}} +\index{operator$\ast$@{operator$\ast$}!FieldLocation@{FieldLocation}} +\doxysubsubsection{\texorpdfstring{operator$\ast$()}{operator*()}} +{\footnotesize\ttfamily \mbox{\hyperlink{struct_field_location}{Field\+Location}} Field\+Location\+::operator$\ast$ (\begin{DoxyParamCaption}\item[{double}]{scale }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}} + + + +Calculates the product between two tags. + + +\begin{DoxyParams}{Parameters} +{\em other} & is the other April\+Tag. \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +the struct with the new tagname, x,y and z position +\end{DoxyReturn} +\mbox{\Hypertarget{struct_field_location_ac5966312a3d0df900873be1fa853d840}\label{struct_field_location_ac5966312a3d0df900873be1fa853d840}} +\index{FieldLocation@{FieldLocation}!operator+@{operator+}} +\index{operator+@{operator+}!FieldLocation@{FieldLocation}} +\doxysubsubsection{\texorpdfstring{operator+()}{operator+()}} +{\footnotesize\ttfamily \mbox{\hyperlink{struct_field_location}{Field\+Location}} Field\+Location\+::operator+ (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{struct_field_location}{Field\+Location}} \&}]{other }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}} + + + +Calculates the sum of two tags. + + +\begin{DoxyParams}{Parameters} +{\em other} & is the other April\+Tag. \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +the struct with the new tagname, x,y and z position +\end{DoxyReturn} +\mbox{\Hypertarget{struct_field_location_ae317351db47c70444f72a68516454402}\label{struct_field_location_ae317351db47c70444f72a68516454402}} +\index{FieldLocation@{FieldLocation}!operator-\/@{operator-\/}} +\index{operator-\/@{operator-\/}!FieldLocation@{FieldLocation}} +\doxysubsubsection{\texorpdfstring{operator-\/()}{operator-()}} +{\footnotesize\ttfamily \mbox{\hyperlink{struct_field_location}{Field\+Location}} Field\+Location\+::operator-\/ (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{struct_field_location}{Field\+Location}} \&}]{other }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}} + + + +Calculates the difference between two tags. + + +\begin{DoxyParams}{Parameters} +{\em other} & is the other April\+Tag. \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +the struct with the new tagname, x,y and z position +\end{DoxyReturn} +\mbox{\Hypertarget{struct_field_location_aba8010cdbd3ea54265db5d7cd75de44e}\label{struct_field_location_aba8010cdbd3ea54265db5d7cd75de44e}} +\index{FieldLocation@{FieldLocation}!toObservation@{toObservation}} +\index{toObservation@{toObservation}!FieldLocation@{FieldLocation}} +\doxysubsubsection{\texorpdfstring{toObservation()}{toObservation()}} +{\footnotesize\ttfamily \mbox{\hyperlink{struct_marker_observation}{Marker\+Observation}} Field\+Location\+::to\+Observation (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Calculates the radial distance, azimuthal angle and polar angle using x,y,z position. + +\begin{DoxyReturn}{Returns} +Returns the the structure of \doxylink{struct_marker_observation}{Marker\+Observation} with the spherical coordinates. +\end{DoxyReturn} + + +\doxysubsection{Friends And Related Symbol Documentation} +\mbox{\Hypertarget{struct_field_location_ae81613697d66349de9e6bff55d3bca4d}\label{struct_field_location_ae81613697d66349de9e6bff55d3bca4d}} +\index{FieldLocation@{FieldLocation}!operator$<$$<$@{operator$<$$<$}} +\index{operator$<$$<$@{operator$<$$<$}!FieldLocation@{FieldLocation}} +\doxysubsubsection{\texorpdfstring{operator$<$$<$}{operator<<}} +{\footnotesize\ttfamily std\+::ostream \& operator$<$$<$ (\begin{DoxyParamCaption}\item[{std\+::ostream \&}]{os, }\item[{const \mbox{\hyperlink{struct_field_location}{Field\+Location}} \&}]{location }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [friend]}} + + +\begin{DoxyParams}{Parameters} +{\em os} & It is an output stream object that writes sequences of characters. \\ +\hline +{\em location} & Reference to the \doxylink{struct_field_location}{Field\+Location} Struct. \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns the output of tag\+Name, x, y and z positions in string format. +\end{DoxyReturn} + + +The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} +\item +include/airlib/robot\+\_\+defs.\+h\end{DoxyCompactItemize} diff --git a/docs/latex/struct_marker_observation.tex b/docs/latex/struct_marker_observation.tex new file mode 100644 index 0000000..19c9248 --- /dev/null +++ b/docs/latex/struct_marker_observation.tex @@ -0,0 +1,47 @@ +\hypertarget{struct_marker_observation}{}\doxysection{Marker\+Observation Struct Reference} +\label{struct_marker_observation}\index{MarkerObservation@{MarkerObservation}} +\doxysubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{struct_marker_observation_a1de968d571f84b2943de2a8609db2c3d}\label{struct_marker_observation_a1de968d571f84b2943de2a8609db2c3d}} +std\+::string {\bfseries tag\+Name} +\item +\mbox{\Hypertarget{struct_marker_observation_a74eaf75e45d859ee6b8f8e4bd5439bae}\label{struct_marker_observation_a74eaf75e45d859ee6b8f8e4bd5439bae}} +double {\bfseries radial\+\_\+distance} +\begin{DoxyCompactList}\small\item\em Observed distance to landmark from robot position ~\newline + \end{DoxyCompactList}\item +\mbox{\Hypertarget{struct_marker_observation_a100373bce74cf49ea8870196d2acf74b}\label{struct_marker_observation_a100373bce74cf49ea8870196d2acf74b}} +double {\bfseries azimuthal\+\_\+angle} +\begin{DoxyCompactList}\small\item\em Observed bearing to landmark in the XY coordinate frame. \end{DoxyCompactList}\item +\mbox{\Hypertarget{struct_marker_observation_aad670bccd0f025ea8808148e828878a2}\label{struct_marker_observation_aad670bccd0f025ea8808148e828878a2}} +double {\bfseries polar\+\_\+angle} +\begin{DoxyCompactList}\small\item\em Observed bearing to landmark in the positive Z axis. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Friends} +\begin{DoxyCompactItemize} +\item +std\+::ostream \& \mbox{\hyperlink{struct_marker_observation_a4755337b360a2c606740ae5cc60b00e5}{operator$<$$<$}} (std\+::ostream \&os, const \mbox{\hyperlink{struct_marker_observation}{Marker\+Observation}} \&observation) +\end{DoxyCompactItemize} + + +\doxysubsection{Friends And Related Symbol Documentation} +\mbox{\Hypertarget{struct_marker_observation_a4755337b360a2c606740ae5cc60b00e5}\label{struct_marker_observation_a4755337b360a2c606740ae5cc60b00e5}} +\index{MarkerObservation@{MarkerObservation}!operator$<$$<$@{operator$<$$<$}} +\index{operator$<$$<$@{operator$<$$<$}!MarkerObservation@{MarkerObservation}} +\doxysubsubsection{\texorpdfstring{operator$<$$<$}{operator<<}} +{\footnotesize\ttfamily std\+::ostream \& operator$<$$<$ (\begin{DoxyParamCaption}\item[{std\+::ostream \&}]{os, }\item[{const \mbox{\hyperlink{struct_marker_observation}{Marker\+Observation}} \&}]{observation }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [friend]}} + + +\begin{DoxyParams}{Parameters} +{\em os} & It is an output stream objects that writes sequences of characters \\ +\hline +{\em observation} & Reference to \doxylink{struct_marker_observation}{Marker\+Observation} struct. \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns the output of tagname, radial distance, azimuthal angle and polar angle. +\end{DoxyReturn} + + +The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} +\item +include/airlib/robot\+\_\+defs.\+h\end{DoxyCompactItemize} diff --git a/docs/latex/struct_robot_state.tex b/docs/latex/struct_robot_state.tex new file mode 100644 index 0000000..5b53199 --- /dev/null +++ b/docs/latex/struct_robot_state.tex @@ -0,0 +1,25 @@ +\hypertarget{struct_robot_state}{}\doxysection{Robot\+State Struct Reference} +\label{struct_robot_state}\index{RobotState@{RobotState}} +\doxysubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{struct_robot_state_a7ca6f4e88ac7982242ab32cf5fba15e6}\label{struct_robot_state_a7ca6f4e88ac7982242ab32cf5fba15e6}} +double {\bfseries x} +\begin{DoxyCompactList}\small\item\em x-\/position(in meters) \end{DoxyCompactList}\item +\mbox{\Hypertarget{struct_robot_state_ac96a8e033454034c95745aee1811ffc2}\label{struct_robot_state_ac96a8e033454034c95745aee1811ffc2}} +double {\bfseries y} +\begin{DoxyCompactList}\small\item\em y-\/position (in meters) ~\newline + \end{DoxyCompactList}\item +\mbox{\Hypertarget{struct_robot_state_a552998092784696aaf6db9c47ab6a425}\label{struct_robot_state_a552998092784696aaf6db9c47ab6a425}} +double {\bfseries z} +\begin{DoxyCompactList}\small\item\em z-\/position (in meters) ~\newline + \end{DoxyCompactList}\item +\mbox{\Hypertarget{struct_robot_state_a347039726076c6fbe8874635dfa21af0}\label{struct_robot_state_a347039726076c6fbe8874635dfa21af0}} +double {\bfseries theta} +\begin{DoxyCompactList}\small\item\em z-\/orientation (in radians) ~\newline + \end{DoxyCompactList}\end{DoxyCompactItemize} + + +The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} +\item +include/airlib/robot\+\_\+defs.\+h\end{DoxyCompactItemize} diff --git a/docs/latex/tabu_doxygen.sty b/docs/latex/tabu_doxygen.sty new file mode 100644 index 0000000..3f17d1d --- /dev/null +++ b/docs/latex/tabu_doxygen.sty @@ -0,0 +1,2557 @@ +%% +%% This is file `tabu.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% tabu.dtx (with options: `package') +%% +%% This is a generated file. +%% Copyright (FC) 2010-2011 - lppl +%% +%% tabu : 2011/02/26 v2.8 - tabu : Flexible LaTeX tabulars +%% +%% ********************************************************************************************** +%% \begin{tabu} { preamble } => default target: \linewidth or \linegoal +%% \begin{tabu} to { preamble } => target specified +%% \begin{tabu} spread { preamble } => target relative to the ``natural width'' +%% +%% tabu works in text and in math modes. +%% +%% X columns: automatic width adjustment + horizontal and vertical alignment +%% \begin{tabu} { X[4c] X[1c] X[-2ml] } +%% +%% Horizontal lines and / or leaders: +%% \hline\hline => double horizontal line +%% \firsthline\hline => for nested tabulars +%% \lasthline\hline => for nested tabulars +%% \tabucline[line spec]{column-column} => ``funny'' lines (dash/leader) +%% Automatic lines / leaders : +%% \everyrow{\hline\hline} +%% +%% Vertical lines and / or leaders: +%% \begin{tabu} { |[3pt red] X[4c] X[1c] X[-2ml] |[3pt blue] } +%% \begin{tabu} { |[3pt red] X[4c] X[1c] X[-2ml] |[3pt on 2pt off 4pt blue] } +%% +%% Fixed vertical spacing adjustment: +%% \extrarowheight= \extrarowdepth= +%% or: \extrarowsep= => may be prefixed by \global +%% +%% Dynamic vertical spacing adjustment: +%% \abovetabulinesep= \belowtabulinesep= +%% or: \tabulinesep= => may be prefixed by \global +%% +%% delarray.sty shortcuts: in math and text modes +%% \begin{tabu} .... \({ preamble }\) +%% +%% Algorithms reports: +%% \tracingtabu=1 \tracingtabu=2 +%% +%% ********************************************************************************************** +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.3 of this license or (at your option) any later +%% version. The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% +%% This work consists of the main source file tabu.dtx +%% and the derived files +%% tabu.sty, tabu.pdf, tabu.ins +%% +%% tabu : Flexible LaTeX tabulars +%% lppl copyright 2010-2011 by FC +%% + +\NeedsTeXFormat{LaTeX2e}[2005/12/01] +\ProvidesPackage{tabu_doxygen}[2011/02/26 v2.8 - flexible LaTeX tabulars (FC), frozen version for doxygen] +\RequirePackage{array}[2008/09/09] +\RequirePackage{varwidth}[2009/03/30] +\AtEndOfPackage{\tabu@AtEnd \let\tabu@AtEnd \@undefined} +\let\tabu@AtEnd\@empty +\def\TMP@EnsureCode#1={% + \edef\tabu@AtEnd{\tabu@AtEnd + \catcode#1 \the\catcode#1}% + \catcode#1=% +}% \TMP@EnsureCode +\TMP@EnsureCode 33 = 12 % ! +\TMP@EnsureCode 58 = 12 % : (for siunitx) +\TMP@EnsureCode124 = 12 % | +\TMP@EnsureCode 36 = 3 % $ = math shift +\TMP@EnsureCode 38 = 4 % & = tab alignment character +\TMP@EnsureCode 32 = 10 % space +\TMP@EnsureCode 94 = 7 % ^ +\TMP@EnsureCode 95 = 8 % _ +%% Constants -------------------------------------------------------- +\newcount \c@taburow \def\thetaburow {\number\c@taburow} +\newcount \tabu@nbcols +\newcount \tabu@cnt +\newcount \tabu@Xcol +\let\tabu@start \@tempcnta +\let\tabu@stop \@tempcntb +\newcount \tabu@alloc \tabu@alloc=\m@ne +\newcount \tabu@nested +\def\tabu@alloc@{\global\advance\tabu@alloc \@ne \tabu@nested\tabu@alloc} +\newdimen \tabu@target +\newdimen \tabu@spreadtarget +\newdimen \tabu@naturalX +\newdimen \tabucolX +\let\tabu@DELTA \@tempdimc +\let\tabu@thick \@tempdima +\let\tabu@on \@tempdimb +\let\tabu@off \@tempdimc +\newdimen \tabu@Xsum +\newdimen \extrarowdepth +\newdimen \abovetabulinesep +\newdimen \belowtabulinesep +\newdimen \tabustrutrule \tabustrutrule \z@ +\newtoks \tabu@thebody +\newtoks \tabu@footnotes +\newsavebox \tabu@box +\newsavebox \tabu@arstrutbox +\newsavebox \tabu@hleads +\newsavebox \tabu@vleads +\newif \iftabu@colortbl +\newif \iftabu@siunitx +\newif \iftabu@measuring +\newif \iftabu@spread +\newif \iftabu@negcoef +\newif \iftabu@everyrow +\def\tabu@everyrowtrue {\global\let\iftabu@everyrow \iftrue} +\def\tabu@everyrowfalse{\global\let\iftabu@everyrow \iffalse} +\newif \iftabu@long +\newif \iftabuscantokens +\def\tabu@rescan {\tabu@verbatim \scantokens } +%% Utilities (for internal usage) ----------------------------------- +\def\tabu@gobblespace #1 {#1} +\def\tabu@gobbletoken #1#2{#1} +\def\tabu@gobbleX{\futurelet\@let@token \tabu@gobblex} +\def\tabu@gobblex{\if ^^J\noexpand\@let@token \expandafter\@gobble + \else\ifx \@sptoken\@let@token + \expandafter\tabu@gobblespace\expandafter\tabu@gobbleX + \fi\fi +}% \tabu@gobblex +\def\tabu@X{^^J} +{\obeyspaces +\global\let\tabu@spxiii= % saves an active space (for \ifx) +\gdef\tabu@@spxiii{ }} +\def\tabu@ifenvir {% only for \multicolumn + \expandafter\tabu@if@nvir\csname\@currenvir\endcsname +}% \tabu@ifenvir +\def\tabu@if@nvir #1{\csname @\ifx\tabu#1first\else + \ifx\longtabu#1first\else + second\fi\fi oftwo\endcsname +}% \tabu@ifenvir +\def\tabu@modulo #1#2{\numexpr\ifnum\numexpr#1=\z@ 0\else #1-(#1-(#2-1)/2)/(#2)*(#2)\fi} +{\catcode`\&=3 +\gdef\tabu@strtrim #1{% #1 = control sequence to trim + \ifodd 1\ifx #1\@empty \else \ifx #1\space \else 0\fi \fi + \let\tabu@c@l@r \@empty \let#1\@empty + \else \expandafter \tabu@trimspaces #1\@nnil + \fi +}% \tabu@strtrim +\gdef\tabu@trimspaces #1\@nnil{\let\tabu@c@l@r=#2\tabu@firstspace .#1& }% +\gdef\tabu@firstspace #1#2#3 &{\tabu@lastspace #2#3&} +\gdef\tabu@lastspace #1{\def #3{#1}% + \ifx #3\tabu@c@l@r \def\tabu@c@l@r{\protect\color{#1}}\expandafter\remove@to@nnil \fi + \tabu@trimspaces #1\@nnil} +}% \catcode +\def\tabu@sanitizearg #1#2{{% + \csname \ifcsname if@safe@actives\endcsname % + @safe@activestrue\else + relax\fi \endcsname + \edef#2{#1}\tabu@strtrim#2\@onelevel@sanitize#2% + \expandafter}\expandafter\def\expandafter#2\expandafter{#2}% +}% \tabu@sanitizearg +\def\tabu@textbar #1{\begingroup \endlinechar\m@ne \scantokens{\def\:{|}}% + \expandafter\endgroup \expandafter#1\:% !!! semi simple group !!! +}% \tabu@textbar +\def\tabu@everyrow@bgroup{\iftabu@everyrow \begingroup \else \noalign{\ifnum0=`}\fi \fi} +\def\tabu@everyrow@egroup{% + \iftabu@everyrow \expandafter \endgroup \the\toks@ + \else \ifnum0=`{\fi}% + \fi +}% \tabu@everyrow@egroup +\def\tabu@arstrut {\global\setbox\@arstrutbox \hbox{\vrule + height \arraystretch \dimexpr\ht\strutbox+\extrarowheight + depth \arraystretch \dimexpr\dp\strutbox+\extrarowdepth + width \z@}% +}% \tabu@arstrut +\def\tabu@rearstrut {% + \@tempdima \arraystretch\dimexpr\ht\strutbox+\extrarowheight \relax + \@tempdimb \arraystretch\dimexpr\dp\strutbox+\extrarowdepth \relax + \ifodd 1\ifdim \ht\@arstrutbox=\@tempdima + \ifdim \dp\@arstrutbox=\@tempdimb 0 \fi\fi + \tabu@mkarstrut + \fi +}% \tabu@rearstrut +\def\tabu@@DBG #1{\ifdim\tabustrutrule>\z@ \color{#1}\fi} +\def\tabu@DBG@arstrut {\global\setbox\@arstrutbox + \hbox to\z@{\hbox to\z@{\hss + {\tabu@DBG{cyan}\vrule + height \arraystretch \dimexpr\ht\strutbox+\extrarowheight + depth \z@ + width \tabustrutrule}\kern-\tabustrutrule + {\tabu@DBG{pink}\vrule + height \z@ + depth \arraystretch \dimexpr\dp\strutbox+\extrarowdepth + width \tabustrutrule}}}% +}% \tabu@DBG@arstrut +\def\tabu@save@decl{\toks\count@ \expandafter{\the\toks\expandafter\count@ + \@nextchar}}% +\def\tabu@savedecl{\ifcat$\d@llarend\else + \let\save@decl \tabu@save@decl \fi % no inversion of tokens in text mode +}% \tabu@savedecl +\def\tabu@finalstrut #1{\unskip\ifhmode\nobreak\fi\vrule height\z@ depth\z@ width\z@} +\newcommand*\tabuDisableCommands {\g@addto@macro\tabu@trialh@@k } +\let\tabu@trialh@@k \@empty +\def\tabu@nowrite #1#{{\afterassignment}\toks@} +\let\tabu@write\write +\let\tabu@immediate\immediate +\def\tabu@WRITE{\begingroup + \def\immediate\write{\aftergroup\endgroup + \tabu@immediate\tabu@write}% +}% \tabu@WRITE +\expandafter\def\expandafter\tabu@GenericError\expandafter{% + \expandafter\tabu@WRITE\GenericError} +\def\tabu@warn{\tabu@WRITE\PackageWarning{tabu}} +\def\tabu@noxfootnote [#1]{\@gobble} +\def\tabu@nocolor #1#{\@gobble} +\newcommand*\tabu@norowcolor[2][]{} +\def\tabu@maybesiunitx #1{\def\tabu@temp{#1}% + \futurelet\@let@token \tabu@m@ybesiunitx} +\def\tabu@m@ybesiunitx #1{\def\tabu@m@ybesiunitx {% + \ifx #1\@let@token \let\tabu@cellleft \@empty \let\tabu@cellright \@empty \fi + \tabu@temp}% \tabu@m@ybesiunitx +}\expandafter\tabu@m@ybesiunitx \csname siunitx_table_collect_begin:Nn\endcsname +\def\tabu@celllalign@def #1{\def\tabu@celllalign{\tabu@maybesiunitx{#1}}}% +%% Fixed vertical spacing adjustment: \extrarowsep ------------------ +\newcommand*\extrarowsep{\edef\tabu@C@extra{\the\numexpr\tabu@C@extra+1}% + \iftabu@everyrow \aftergroup\tabu@Gextra + \else \aftergroup\tabu@n@Gextra + \fi + \@ifnextchar={\tabu@gobbletoken\tabu@extra} \tabu@extra +}% \extrarowsep +\def\tabu@extra {\@ifnextchar_% + {\tabu@gobbletoken{\tabu@setextra\extrarowheight \extrarowdepth}} + {\ifx ^\@let@token \def\tabu@temp{% + \tabu@gobbletoken{\tabu@setextra\extrarowdepth \extrarowheight}}% + \else \let\tabu@temp \@empty + \afterassignment \tabu@setextrasep \extrarowdepth + \fi \tabu@temp}% +}% \tabu@extra +\def\tabu@setextra #1#2{\def\tabu@temp{\tabu@extr@#1#2}\afterassignment\tabu@temp#2} +\def\tabu@extr@ #1#2{\@ifnextchar^% + {\tabu@gobbletoken{\tabu@setextra\extrarowdepth \extrarowheight}} + {\ifx _\@let@token \def\tabu@temp{% + \tabu@gobbletoken{\tabu@setextra\extrarowheight \extrarowdepth}}% + \else \let\tabu@temp \@empty + \tabu@Gsave \tabu@G@extra \tabu@C@extra \extrarowheight \extrarowdepth + \fi \tabu@temp}% +}% \tabu@extr@ +\def\tabu@setextrasep {\extrarowheight=\extrarowdepth + \tabu@Gsave \tabu@G@extra \tabu@C@extra \extrarowheight \extrarowdepth +}% \tabu@setextrasep +\def\tabu@Gextra{\ifx \tabu@G@extra\@empty \else {\tabu@Rextra}\fi} +\def\tabu@n@Gextra{\ifx \tabu@G@extra\@empty \else \noalign{\tabu@Rextra}\fi} +\def\tabu@Rextra{\tabu@Grestore \tabu@G@extra \tabu@C@extra} +\let\tabu@C@extra \z@ +\let\tabu@G@extra \@empty +%% Dynamic vertical spacing adjustment: \tabulinesep ---------------- +\newcommand*\tabulinesep{\edef\tabu@C@linesep{\the\numexpr\tabu@C@linesep+1}% + \iftabu@everyrow \aftergroup\tabu@Glinesep + \else \aftergroup\tabu@n@Glinesep + \fi + \@ifnextchar={\tabu@gobbletoken\tabu@linesep} \tabu@linesep +}% \tabulinesep +\def\tabu@linesep {\@ifnextchar_% + {\tabu@gobbletoken{\tabu@setsep\abovetabulinesep \belowtabulinesep}} + {\ifx ^\@let@token \def\tabu@temp{% + \tabu@gobbletoken{\tabu@setsep\belowtabulinesep \abovetabulinesep}}% + \else \let\tabu@temp \@empty + \afterassignment \tabu@setlinesep \abovetabulinesep + \fi \tabu@temp}% +}% \tabu@linesep +\def\tabu@setsep #1#2{\def\tabu@temp{\tabu@sets@p#1#2}\afterassignment\tabu@temp#2} +\def\tabu@sets@p #1#2{\@ifnextchar^% + {\tabu@gobbletoken{\tabu@setsep\belowtabulinesep \abovetabulinesep}} + {\ifx _\@let@token \def\tabu@temp{% + \tabu@gobbletoken{\tabu@setsep\abovetabulinesep \belowtabulinesep}}% + \else \let\tabu@temp \@empty + \tabu@Gsave \tabu@G@linesep \tabu@C@linesep \abovetabulinesep \belowtabulinesep + \fi \tabu@temp}% +}% \tabu@sets@p +\def\tabu@setlinesep {\belowtabulinesep=\abovetabulinesep + \tabu@Gsave \tabu@G@linesep \tabu@C@linesep \abovetabulinesep \belowtabulinesep +}% \tabu@setlinesep +\def\tabu@Glinesep{\ifx \tabu@G@linesep\@empty \else {\tabu@Rlinesep}\fi} +\def\tabu@n@Glinesep{\ifx \tabu@G@linesep\@empty \else \noalign{\tabu@Rlinesep}\fi} +\def\tabu@Rlinesep{\tabu@Grestore \tabu@G@linesep \tabu@C@linesep} +\let\tabu@C@linesep \z@ +\let\tabu@G@linesep \@empty +%% \global\extrarowsep and \global\tabulinesep ------------------- +\def\tabu@Gsave #1#2#3#4{\xdef#1{#1% + \toks#2{\toks\the\currentgrouplevel{\global#3\the#3\global#4\the#4}}}% +}% \tabu@Gsave +\def\tabu@Grestore#1#2{% + \toks#2{}#1\toks\currentgrouplevel\expandafter{\expandafter}\the\toks#2\relax + \ifcat$\the\toks\currentgrouplevel$\else + \global\let#1\@empty \global\let#2\z@ + \the\toks\currentgrouplevel + \fi +}% \tabu@Grestore +%% Setting code for every row --------------------------------------- +\newcommand*\everyrow{\tabu@everyrow@bgroup + \tabu@start \z@ \tabu@stop \z@ \tabu@evrstartstop +}% \everyrow +\def\tabu@evrstartstop {\@ifnextchar^% + {\afterassignment \tabu@evrstartstop \tabu@stop=}% + {\ifx ^\@let@token + \afterassignment\tabu@evrstartstop \tabu@start=% + \else \afterassignment\tabu@everyr@w \toks@ + \fi}% +}% \tabu@evrstartstop +\def\tabu@everyr@w {% + \xdef\tabu@everyrow{% + \noexpand\tabu@everyrowfalse + \let\noalign \relax + \noexpand\tabu@rowfontreset + \iftabu@colortbl \noexpand\tabu@rc@ \fi % \taburowcolors + \let\noexpand\tabu@docline \noexpand\tabu@docline@evr + \the\toks@ + \noexpand\tabu@evrh@@k + \noexpand\tabu@rearstrut + \global\advance\c@taburow \@ne}% + \iftabu@everyrow \toks@\expandafter + {\expandafter\def\expandafter\tabu@evr@L\expandafter{\the\toks@}\ignorespaces}% + \else \xdef\tabu@evr@G{\the\toks@}% + \fi + \tabu@everyrow@egroup +}% \tabu@everyr@w +\def\tabu@evr {\def\tabu@evrh@@k} % for internal use only +\tabu@evr{} +%% line style and leaders ------------------------------------------- +\newcommand*\newtabulinestyle [1]{% + {\@for \@tempa :=#1\do{\expandafter\tabu@newlinestyle \@tempa==\@nil}}% +}% \newtabulinestyle +\def\tabu@newlinestyle #1=#2=#3\@nil{\tabu@getline {#2}% + \tabu@sanitizearg {#1}\@tempa + \ifodd 1\ifx \@tempa\@empty \ifdefined\tabu@linestyle@ 0 \fi\fi + \global\expandafter\let + \csname tabu@linestyle@\@tempa \endcsname =\tabu@thestyle \fi +}% \tabu@newlinestyle +\newcommand*\tabulinestyle [1]{\tabu@everyrow@bgroup \tabu@getline{#1}% + \iftabu@everyrow + \toks@\expandafter{\expandafter \def \expandafter + \tabu@ls@L\expandafter{\tabu@thestyle}\ignorespaces}% + \gdef\tabu@ls@{\tabu@ls@L}% + \else + \global\let\tabu@ls@G \tabu@thestyle + \gdef\tabu@ls@{\tabu@ls@G}% + \fi + \tabu@everyrow@egroup +}% \tabulinestyle +\newcommand*\taburulecolor{\tabu@everyrow@bgroup \tabu@textbar \tabu@rulecolor} +\def\tabu@rulecolor #1{\toks@{}% + \def\tabu@temp #1##1#1{\tabu@ruledrsc{##1}}\@ifnextchar #1% + \tabu@temp + \tabu@rulearc +}% \tabu@rulecolor +\def\tabu@ruledrsc #1{\edef\tabu@temp{#1}\tabu@strtrim\tabu@temp + \ifx \tabu@temp\@empty \def\tabu@temp{\tabu@rule@drsc@ {}{}}% + \else \edef\tabu@temp{\noexpand\tabu@rule@drsc@ {}{\tabu@temp}}% + \fi + \tabu@temp +}% \tabu@ruledrsc@ +\def\tabu@ruledrsc@ #1#{\tabu@rule@drsc@ {#1}} +\def\tabu@rule@drsc@ #1#2{% + \iftabu@everyrow + \ifx \\#1#2\\\toks@{\let\CT@drsc@ \relax}% + \else \toks@{\def\CT@drsc@{\color #1{#2}}}% + \fi + \else + \ifx \\#1#2\\\global\let\CT@drsc@ \relax + \else \gdef\CT@drsc@{\color #1{#2}}% + \fi + \fi + \tabu@rulearc +}% \tabu@rule@drsc@ +\def\tabu@rulearc #1#{\tabu@rule@arc@ {#1}} +\def\tabu@rule@arc@ #1#2{% + \iftabu@everyrow + \ifx \\#1#2\\\toks@\expandafter{\the\toks@ \def\CT@arc@{}}% + \else \toks@\expandafter{\the\toks@ \def\CT@arc@{\color #1{#2}}}% + \fi + \toks@\expandafter{\the\toks@ + \let\tabu@arc@L \CT@arc@ + \let\tabu@drsc@L \CT@drsc@ + \ignorespaces}% + \else + \ifx \\#1#2\\\gdef\CT@arc@{}% + \else \gdef\CT@arc@{\color #1{#2}}% + \fi + \global\let\tabu@arc@G \CT@arc@ + \global\let\tabu@drsc@G \CT@drsc@ + \fi + \tabu@everyrow@egroup +}% \tabu@rule@arc@ +\def\taburowcolors {\tabu@everyrow@bgroup \@testopt \tabu@rowcolors 1} +\def\tabu@rowcolors [#1]#2#{\tabu@rowc@lors{#1}{#2}} +\def\tabu@rowc@lors #1#2#3{% + \toks@{}\@defaultunits \count@ =\number0#2\relax \@nnil + \@defaultunits \tabu@start =\number0#1\relax \@nnil + \ifnum \count@<\tw@ \count@=\tw@ \fi + \advance\tabu@start \m@ne + \ifnum \tabu@start<\z@ \tabu@start \z@ \fi + \tabu@rowcolorseries #3\in@..\in@ \@nnil +}% \tabu@rowcolors +\def\tabu@rowcolorseries #1..#2\in@ #3\@nnil {% + \ifx \in@#1\relax + \iftabu@everyrow \toks@{\def\tabu@rc@{}\let\tabu@rc@L \tabu@rc@}% + \else \gdef\tabu@rc@{}\global\let\tabu@rc@G \tabu@rc@ + \fi + \else + \ifx \\#2\\\tabu@rowcolorserieserror \fi + \tabu@sanitizearg{#1}\tabu@temp + \tabu@sanitizearg{#2}\@tempa + \advance\count@ \m@ne + \iftabu@everyrow + \def\tabu@rc@ ##1##2##3##4{\def\tabu@rc@{% + \ifnum ##2=\c@taburow + \definecolorseries{tabu@rcseries@\the\tabu@nested}{rgb}{last}{##3}{##4}\fi + \ifnum \c@taburow<##2 \else + \ifnum \tabu@modulo {\c@taburow-##2}{##1+1}=\z@ + \resetcolorseries[{##1}]{tabu@rcseries@\the\tabu@nested}\fi + \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}% + \rowcolor{tabu@rc@\the\tabu@nested}\fi}% + }\edef\x{\noexpand\tabu@rc@ {\the\count@} + {\the\tabu@start} + {\tabu@temp} + {\@tempa}% + }\x + \toks@\expandafter{\expandafter\def\expandafter\tabu@rc@\expandafter{\tabu@rc@}}% + \toks@\expandafter{\the\toks@ \let\tabu@rc@L \tabu@rc@ \ignorespaces}% + \else % inside \noalign + \definecolorseries{tabu@rcseries@\the\tabu@nested}{rgb}{last}{\tabu@temp}{\@tempa}% + \expandafter\resetcolorseries\expandafter[\the\count@]{tabu@rcseries@\the\tabu@nested}% + \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}% + \let\noalign \relax \rowcolor{tabu@rc@\the\tabu@nested}% + \def\tabu@rc@ ##1##2{\gdef\tabu@rc@{% + \ifnum \tabu@modulo {\c@taburow-##2}{##1+1}=\@ne + \resetcolorseries[{##1}]{tabu@rcseries@\the\tabu@nested}\fi + \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}% + \rowcolor{tabu@rc@\the\tabu@nested}}% + }\edef\x{\noexpand\tabu@rc@{\the\count@}{\the\c@taburow}}\x + \global\let\tabu@rc@G \tabu@rc@ + \fi + \fi + \tabu@everyrow@egroup +}% \tabu@rowcolorseries +\tabuDisableCommands {\let\tabu@rc@ \@empty } +\def\tabu@rowcolorserieserror {\PackageError{tabu} + {Invalid syntax for \string\taburowcolors + \MessageBreak Please look at the documentation!}\@ehd +}% \tabu@rowcolorserieserror +\newcommand*\tabureset {% + \tabulinesep=\z@ \extrarowsep=\z@ \extratabsurround=\z@ + \tabulinestyle{}\everyrow{}\taburulecolor||{}\taburowcolors{}% +}% \tabureset +%% Parsing the line styles ------------------------------------------ +\def\tabu@getline #1{\begingroup + \csname \ifcsname if@safe@actives\endcsname % + @safe@activestrue\else + relax\fi \endcsname + \edef\tabu@temp{#1}\tabu@sanitizearg{#1}\@tempa + \let\tabu@thestyle \relax + \ifcsname tabu@linestyle@\@tempa \endcsname + \edef\tabu@thestyle{\endgroup + \def\tabu@thestyle{\expandafter\noexpand + \csname tabu@linestyle@\@tempa\endcsname}% + }\tabu@thestyle + \else \expandafter\tabu@definestyle \tabu@temp \@nil + \fi +}% \tabu@getline +\def\tabu@definestyle #1#2\@nil {\endlinechar \m@ne \makeatletter + \tabu@thick \maxdimen \tabu@on \maxdimen \tabu@off \maxdimen + \let\tabu@c@lon \@undefined \let\tabu@c@loff \@undefined + \ifodd 1\ifcat .#1\else\ifcat\relax #1\else 0\fi\fi % catcode 12 or non expandable cs + \def\tabu@temp{\tabu@getparam{thick}}% + \else \def\tabu@temp{\tabu@getparam{thick}\maxdimen}% + \fi + {% + \let\tabu@ \relax + \def\:{\obeyspaces \tabu@oXIII \tabu@commaXIII \edef\:}% (space active \: happy ;-)) + \scantokens{\:{\tabu@temp #1#2 \tabu@\tabu@}}% + \expandafter}\expandafter + \def\expandafter\:\expandafter{\:}% line spec rewritten now ;-) + \def\;{\def\:}% + \scantokens\expandafter{\expandafter\;\expandafter{\:}}% space is now inactive (catcode 10) + \let\tabu@ \tabu@getcolor \:% all arguments are ready now ;-) + \ifdefined\tabu@c@lon \else \let\tabu@c@lon\@empty \fi + \ifx \tabu@c@lon\@empty \def\tabu@c@lon{\CT@arc@}\fi + \ifdefined\tabu@c@loff \else \let\tabu@c@loff \@empty \fi + \ifdim \tabu@on=\maxdimen \ifdim \tabu@off<\maxdimen + \tabu@on \tabulineon \fi\fi + \ifdim \tabu@off=\maxdimen \ifdim \tabu@on<\maxdimen + \tabu@off \tabulineoff \fi\fi + \ifodd 1\ifdim \tabu@off=\maxdimen \ifdim \tabu@on=\maxdimen 0 \fi\fi + \in@true % + \else \in@false % + \fi + \ifdim\tabu@thick=\maxdimen \def\tabu@thick{\arrayrulewidth}% + \else \edef\tabu@thick{\the\tabu@thick}% + \fi + \edef \tabu@thestyle ##1##2{\endgroup + \def\tabu@thestyle{% + \ifin@ \noexpand\tabu@leadersstyle {\tabu@thick} + {\the\tabu@on}{##1} + {\the\tabu@off}{##2}% + \else \noexpand\tabu@rulesstyle + {##1\vrule width \tabu@thick}% + {##1\leaders \hrule height \tabu@thick \hfil}% + \fi}% + }\expandafter \expandafter + \expandafter \tabu@thestyle \expandafter + \expandafter \expandafter + {\expandafter\tabu@c@lon\expandafter}\expandafter{\tabu@c@loff}% +}% \tabu@definestyle +{\catcode`\O=\active \lccode`\O=`\o \catcode`\,=\active + \lowercase{\gdef\tabu@oXIII {\catcode`\o=\active \let O=\tabu@oxiii}} + \gdef\tabu@commaXIII {\catcode`\,=\active \let ,=\space} +}% \catcode +\def\tabu@oxiii #1{% + \ifcase \ifx n#1\z@ \else + \ifx f#1\@ne\else + \tw@ \fi\fi + \expandafter\tabu@onxiii + \or \expandafter\tabu@ofxiii + \else o% + \fi#1}% +\def\tabu@onxiii #1#2{% + \ifcase \ifx !#2\tw@ \else + \ifcat.\noexpand#2\z@ \else + \ifx \tabu@spxiii#2\@ne\else + \tw@ \fi\fi\fi + \tabu@getparam{on}#2\expandafter\@gobble + \or \expandafter\tabu@onxiii % (space is active) + \else o\expandafter\@firstofone + \fi{#1#2}}% +\def\tabu@ofxiii #1#2{% + \ifx #2f\expandafter\tabu@offxiii + \else o\expandafter\@firstofone + \fi{#1#2}} +\def\tabu@offxiii #1#2{% + \ifcase \ifx !#2\tw@ \else + \ifcat.\noexpand#2\z@ \else + \ifx\tabu@spxiii#2\@ne \else + \tw@ \fi\fi\fi + \tabu@getparam{off}#2\expandafter\@gobble + \or \expandafter\tabu@offxiii % (space is active) + \else o\expandafter\@firstofone + \fi{#1#2}} +\def\tabu@getparam #1{\tabu@ \csname tabu@#1\endcsname=} +\def\tabu@getcolor #1{% \tabu@ <- \tabu@getcolor after \edef + \ifx \tabu@#1\else % no more spec + \let\tabu@theparam=#1\afterassignment \tabu@getc@l@r #1\fi +}% \tabu@getcolor +\def\tabu@getc@l@r #1\tabu@ {% + \def\tabu@temp{#1}\tabu@strtrim \tabu@temp + \ifx \tabu@temp\@empty + \else%\ifcsname \string\color@\tabu@temp \endcsname % if the color exists + \ifx \tabu@theparam \tabu@off \let\tabu@c@loff \tabu@c@l@r + \else \let\tabu@c@lon \tabu@c@l@r + \fi + %\else \tabu@warncolour{\tabu@temp}% + \fi%\fi + \tabu@ % next spec +}% \tabu@getc@l@r +\def\tabu@warncolour #1{\PackageWarning{tabu} + {Color #1 is not defined. Default color used}% +}% \tabu@warncolour +\def\tabu@leadersstyle #1#2#3#4#5{\def\tabu@leaders{{#1}{#2}{#3}{#4}{#5}}% + \ifx \tabu@leaders\tabu@leaders@G \else + \tabu@LEADERS{#1}{#2}{#3}{#4}{#5}\fi +}% \tabu@leadersstyle +\def\tabu@rulesstyle #1#2{\let\tabu@leaders \@undefined + \gdef\tabu@thevrule{#1}\gdef\tabu@thehrule{#2}% +}% \tabu@rulesstyle +%% The leaders boxes ------------------------------------------------ +\def\tabu@LEADERS #1#2#3#4#5{%% width, dash, dash color, gap, gap color + {\let\color \tabu@color % => during trials -> \color = \tabu@nocolor + {% % but the leaders boxes should have colors ! + \def\@therule{\vrule}\def\@thick{height}\def\@length{width}% + \def\@box{\hbox}\def\@unbox{\unhbox}\def\@elt{\wd}% + \def\@skip{\hskip}\def\@ss{\hss}\def\tabu@leads{\tabu@hleads}% + \tabu@l@@d@rs {#1}{#2}{#3}{#4}{#5}% + \global\let\tabu@thehleaders \tabu@theleaders + }% + {% + \def\@therule{\hrule}\def\@thick{width}\def\@length{height}% + \def\@box{\vbox}\def\@unbox{\unvbox}\def\@elt{\ht}% + \def\@skip{\vskip}\def\@ss{\vss}\def\tabu@leads{\tabu@vleads}% + \tabu@l@@d@rs {#1}{#2}{#3}{#4}{#5}% + \global\let\tabu@thevleaders \tabu@theleaders + }% + \gdef\tabu@leaders@G{{#1}{#2}{#3}{#4}{#5}}% + }% +}% \tabu@LEADERS +\def\tabu@therule #1#2{\@therule \@thick#1\@length\dimexpr#2/2 \@depth\z@} +\def\tabu@l@@d@rs #1#2#3#4#5{%% width, dash, dash color, gap, gap color + \global\setbox \tabu@leads=\@box{% + {#3\tabu@therule{#1}{#2}}% + \ifx\\#5\\\@skip#4\else{#5\tabu@therule{#1}{#4*2}}\fi + {#3\tabu@therule{#1}{#2}}}% + \global\setbox\tabu@leads=\@box to\@elt\tabu@leads{\@ss + {#3\tabu@therule{#1}{#2}}\@unbox\tabu@leads}% + \edef\tabu@theleaders ##1{\def\noexpand\tabu@theleaders {% + {##1\tabu@therule{#1}{#2}}% + \xleaders \copy\tabu@leads \@ss + \tabu@therule{0pt}{-#2}{##1\tabu@therule{#1}{#2}}}% + }\tabu@theleaders{#3}% +}% \tabu@l@@d@rs +%% \tabu \endtabu \tabu* \longtabu \endlongtabu \longtabu* ---------- +\newcommand*\tabu {\tabu@longfalse + \ifmmode \def\tabu@ {\array}\def\endtabu {\endarray}% + \else \def\tabu@ {\tabu@tabular}\def\endtabu {\endtabular}\fi + \expandafter\let\csname tabu*\endcsname \tabu + \expandafter\def\csname endtabu*\endcsname{\endtabu}% + \tabu@spreadfalse \tabu@negcoeffalse \tabu@settarget +}% {tabu} +\let\tabu@tabular \tabular % +\expandafter\def\csname tabu*\endcsname{\tabuscantokenstrue \tabu} +\newcommand*\longtabu {\tabu@longtrue + \ifmmode\PackageError{tabu}{longtabu not allowed in math mode}\fi + \def\tabu@{\longtable}\def\endlongtabu{\endlongtable}% + \LTchunksize=\@M + \expandafter\let\csname tabu*\endcsname \tabu + \expandafter\def\csname endlongtabu*\endcsname{\endlongtabu}% + \let\LT@startpbox \tabu@LT@startpbox % \everypar{ array struts } + \tabu@spreadfalse \tabu@negcoeffalse \tabu@settarget +}% {longtabu} +\expandafter\def\csname longtabu*\endcsname{\tabuscantokenstrue \longtabu} +\def\tabu@nolongtabu{\PackageError{tabu} + {longtabu requires the longtable package}\@ehd} +%% Read the target and then : \tabular or \@array ------------------ +\def\tabu@settarget {\futurelet\@let@token \tabu@sett@rget } +\def\tabu@sett@rget {\tabu@target \z@ + \ifcase \ifx \bgroup\@let@token \z@ \else + \ifx \@sptoken\@let@token \@ne \else + \if t\@let@token \tw@ \else + \if s\@let@token \thr@@\else + \z@\fi\fi\fi\fi + \expandafter\tabu@begin + \or \expandafter\tabu@gobblespace\expandafter\tabu@settarget + \or \expandafter\tabu@to + \or \expandafter\tabu@spread + \fi +}% \tabu@sett@rget +\def\tabu@to to{\def\tabu@halignto{to}\tabu@gettarget} +\def\tabu@spread spread{\tabu@spreadtrue\def\tabu@halignto{spread}\tabu@gettarget} +\def\tabu@gettarget {\afterassignment\tabu@linegoaltarget \tabu@target } +\def\tabu@linegoaltarget {\futurelet\tabu@temp \tabu@linegoalt@rget } +\def\tabu@linegoalt@rget {% + \ifx \tabu@temp\LNGL@setlinegoal + \LNGL@setlinegoal \expandafter \@firstoftwo \fi % @gobbles \LNGL@setlinegoal + \tabu@begin +}% \tabu@linegoalt@rget +\def\tabu@begin #1#{% + \iftabu@measuring \expandafter\tabu@nestedmeasure \fi + \ifdim \tabu@target=\z@ \let\tabu@halignto \@empty + \else \edef\tabu@halignto{\tabu@halignto\the\tabu@target}% + \fi + \@testopt \tabu@tabu@ \tabu@aligndefault #1\@nil +}% \tabu@begin +\long\def\tabu@tabu@ [#1]#2\@nil #3{\tabu@setup + \def\tabu@align {#1}\def\tabu@savedpream{\NC@find #3}% + \tabu@ [\tabu@align ]#2{#3\tabu@rewritefirst }% +}% \tabu@tabu@ +\def\tabu@nestedmeasure {% + \ifodd 1\iftabu@spread \else \ifdim\tabu@target=\z@ \else 0 \fi\fi\relax + \tabu@spreadtrue + \else \begingroup \iffalse{\fi \ifnum0=`}\fi + \toks@{}\def\tabu@stack{b}% + \expandafter\tabu@collectbody\expandafter\tabu@quickrule + \expandafter\endgroup + \fi +}% \tabu@nestedmeasure +\def\tabu@quickrule {\indent\vrule height\z@ depth\z@ width\tabu@target} +%% \tabu@setup \tabu@init \tabu@indent +\def\tabu@setup{\tabu@alloc@ + \ifcase \tabu@nested + \ifmmode \else \iftabu@spread\else \ifdim\tabu@target=\z@ + \let\tabu@afterendpar \par + \fi\fi\fi + \def\tabu@aligndefault{c}\tabu@init \tabu@indent + \else % + \def\tabu@aligndefault{t}\let\tabudefaulttarget \linewidth + \fi + \let\tabu@thetarget \tabudefaulttarget \let\tabu@restored \@undefined + \edef\tabu@NC@list{\the\NC@list}\NC@list{\NC@do \tabu@rewritefirst}% + \everycr{}\let\@startpbox \tabu@startpbox % for nested tabu inside longtabu... + \let\@endpbox \tabu@endpbox % idem " " " " " " + \let\@tabarray \tabu@tabarray % idem " " " " " " + \tabu@setcleanup \tabu@setreset +}% \tabu@setup +\def\tabu@init{\tabu@starttimer \tabu@measuringfalse + \edef\tabu@hfuzz {\the\dimexpr\hfuzz+1sp}\global\tabu@footnotes{}% + \let\firsthline \tabu@firsthline \let\lasthline \tabu@lasthline + \let\firstline \tabu@firstline \let\lastline \tabu@lastline + \let\hline \tabu@hline \let\@xhline \tabu@xhline + \let\color \tabu@color \let\@arstrutbox \tabu@arstrutbox + \iftabu@colortbl\else\let\LT@@hline \tabu@LT@@hline \fi + \tabu@trivlist % + \let\@footnotetext \tabu@footnotetext \let\@xfootnotetext \tabu@xfootnotetext + \let\@xfootnote \tabu@xfootnote \let\centering \tabu@centering + \let\raggedright \tabu@raggedright \let\raggedleft \tabu@raggedleft + \let\tabudecimal \tabu@tabudecimal \let\Centering \tabu@Centering + \let\RaggedRight \tabu@RaggedRight \let\RaggedLeft \tabu@RaggedLeft + \let\justifying \tabu@justifying \let\rowfont \tabu@rowfont + \let\fbox \tabu@fbox \let\color@b@x \tabu@color@b@x + \let\tabu@@everycr \everycr \let\tabu@@everypar \everypar + \let\tabu@prepnext@tokORI \prepnext@tok\let\prepnext@tok \tabu@prepnext@tok + \let\tabu@multicolumnORI\multicolumn \let\multicolumn \tabu@multicolumn + \let\tabu@startpbox \@startpbox % for nested tabu inside longtabu pfff !!! + \let\tabu@endpbox \@endpbox % idem " " " " " " " + \let\tabu@tabarray \@tabarray % idem " " " " " " " + \tabu@adl@fix \let\endarray \tabu@endarray % colortbl & arydshln (delarray) + \iftabu@colortbl\CT@everycr\expandafter{\expandafter\iftabu@everyrow \the\CT@everycr \fi}\fi +}% \tabu@init +\def\tabu@indent{% correction for indentation + \ifdim \parindent>\z@\ifx \linewidth\tabudefaulttarget + \everypar\expandafter{% + \the\everypar\everypar\expandafter{\the\everypar}% + \setbox\z@=\lastbox + \ifdim\wd\z@>\z@ \edef\tabu@thetarget + {\the\dimexpr -\wd\z@+\tabudefaulttarget}\fi + \box\z@}% + \fi\fi +}% \tabu@indent +\def\tabu@setcleanup {% saves last global assignments + \ifodd 1\ifmmode \else \iftabu@long \else 0\fi\fi\relax + \def\tabu@aftergroupcleanup{% + \def\tabu@aftergroupcleanup{\aftergroup\tabu@cleanup}}% + \else + \def\tabu@aftergroupcleanup{% + \aftergroup\aftergroup\aftergroup\tabu@cleanup + \let\tabu@aftergroupcleanup \relax}% + \fi + \let\tabu@arc@Gsave \tabu@arc@G + \let\tabu@arc@G \tabu@arc@L % + \let\tabu@drsc@Gsave \tabu@drsc@G + \let\tabu@drsc@G \tabu@drsc@L % + \let\tabu@ls@Gsave \tabu@ls@G + \let\tabu@ls@G \tabu@ls@L % + \let\tabu@rc@Gsave \tabu@rc@G + \let\tabu@rc@G \tabu@rc@L % + \let\tabu@evr@Gsave \tabu@evr@G + \let\tabu@evr@G \tabu@evr@L % + \let\tabu@celllalign@save \tabu@celllalign + \let\tabu@cellralign@save \tabu@cellralign + \let\tabu@cellleft@save \tabu@cellleft + \let\tabu@cellright@save \tabu@cellright + \let\tabu@@celllalign@save \tabu@@celllalign + \let\tabu@@cellralign@save \tabu@@cellralign + \let\tabu@@cellleft@save \tabu@@cellleft + \let\tabu@@cellright@save \tabu@@cellright + \let\tabu@rowfontreset@save \tabu@rowfontreset + \let\tabu@@rowfontreset@save\tabu@@rowfontreset + \let\tabu@rowfontreset \@empty + \edef\tabu@alloc@save {\the\tabu@alloc}% restore at \tabu@reset + \edef\c@taburow@save {\the\c@taburow}% + \edef\tabu@naturalX@save {\the\tabu@naturalX}% + \let\tabu@naturalXmin@save \tabu@naturalXmin + \let\tabu@naturalXmax@save \tabu@naturalXmax + \let\tabu@mkarstrut@save \tabu@mkarstrut + \edef\tabu@clarstrut{% + \extrarowheight \the\dimexpr \ht\@arstrutbox-\ht\strutbox \relax + \extrarowdepth \the\dimexpr \dp\@arstrutbox-\dp\strutbox \relax + \let\noexpand\@arraystretch \@ne \noexpand\tabu@rearstrut}% +}% \tabu@setcleanup +\def\tabu@cleanup {\begingroup + \globaldefs\@ne \tabu@everyrowtrue + \let\tabu@arc@G \tabu@arc@Gsave + \let\CT@arc@ \tabu@arc@G + \let\tabu@drsc@G \tabu@drsc@Gsave + \let\CT@drsc@ \tabu@drsc@G + \let\tabu@ls@G \tabu@ls@Gsave + \let\tabu@ls@ \tabu@ls@G + \let\tabu@rc@G \tabu@rc@Gsave + \let\tabu@rc@ \tabu@rc@G + \let\CT@do@color \relax + \let\tabu@evr@G \tabu@evr@Gsave + \let\tabu@celllalign \tabu@celllalign@save + \let\tabu@cellralign \tabu@cellralign@save + \let\tabu@cellleft \tabu@cellleft@save + \let\tabu@cellright \tabu@cellright@save + \let\tabu@@celllalign \tabu@@celllalign@save + \let\tabu@@cellralign \tabu@@cellralign@save + \let\tabu@@cellleft \tabu@@cellleft@save + \let\tabu@@cellright \tabu@@cellright@save + \let\tabu@rowfontreset \tabu@rowfontreset@save + \let\tabu@@rowfontreset \tabu@@rowfontreset@save + \tabu@naturalX =\tabu@naturalX@save + \let\tabu@naturalXmax \tabu@naturalXmax@save + \let\tabu@naturalXmin \tabu@naturalXmin@save + \let\tabu@mkarstrut \tabu@mkarstrut@save + \c@taburow =\c@taburow@save + \ifcase \tabu@nested \tabu@alloc \m@ne\fi + \endgroup % + \ifcase \tabu@nested + \the\tabu@footnotes \global\tabu@footnotes{}% + \tabu@afterendpar \tabu@elapsedtime + \fi + \tabu@clarstrut + \everyrow\expandafter {\tabu@evr@G}% +}% \tabu@cleanup +\let\tabu@afterendpar \relax +\def\tabu@setreset {% + \edef\tabu@savedparams {% \relax for \tabu@message@save + \ifmmode \col@sep \the\arraycolsep + \else \col@sep \the\tabcolsep \fi \relax + \arrayrulewidth \the\arrayrulewidth \relax + \doublerulesep \the\doublerulesep \relax + \extratabsurround \the\extratabsurround \relax + \extrarowheight \the\extrarowheight \relax + \extrarowdepth \the\extrarowdepth \relax + \abovetabulinesep \the\abovetabulinesep \relax + \belowtabulinesep \the\belowtabulinesep \relax + \def\noexpand\arraystretch{\arraystretch}% + \ifdefined\minrowclearance \minrowclearance\the\minrowclearance\relax\fi}% + \begingroup + \@temptokena\expandafter{\tabu@savedparams}% => only for \savetabu / \usetabu + \ifx \tabu@arc@L\relax \else \tabu@setsave \tabu@arc@L \fi + \ifx \tabu@drsc@L\relax \else \tabu@setsave \tabu@drsc@L \fi + \tabu@setsave \tabu@ls@L \tabu@setsave \tabu@evr@L + \expandafter \endgroup \expandafter + \def\expandafter\tabu@saved@ \expandafter{\the\@temptokena + \let\tabu@arc@G \tabu@arc@L + \let\tabu@drsc@G \tabu@drsc@L + \let\tabu@ls@G \tabu@ls@L + \let\tabu@rc@G \tabu@rc@L + \let\tabu@evr@G \tabu@evr@L}% + \def\tabu@reset{\tabu@savedparams + \tabu@everyrowtrue \c@taburow \z@ + \let\CT@arc@ \tabu@arc@L + \let\CT@drsc@ \tabu@drsc@L + \let\tabu@ls@ \tabu@ls@L + \let\tabu@rc@ \tabu@rc@L + \global\tabu@alloc \tabu@alloc@save + \everyrow\expandafter{\tabu@evr@L}}% +}% \tabu@reset +\def\tabu@setsave #1{\expandafter\tabu@sets@ve #1\@nil{#1}} +\long\def\tabu@sets@ve #1\@nil #2{\@temptokena\expandafter{\the\@temptokena \def#2{#1}}} +%% The Rewriting Process ------------------------------------------- +\def\tabu@newcolumntype #1{% + \expandafter\tabu@new@columntype + \csname NC@find@\string#1\expandafter\endcsname + \csname NC@rewrite@\string#1\endcsname + {#1}% +}% \tabu@newcolumntype +\def\tabu@new@columntype #1#2#3{% + \def#1##1#3{\NC@{##1}}% + \let#2\relax \newcommand*#2% +}% \tabu@new@columntype +\def\tabu@privatecolumntype #1{% + \expandafter\tabu@private@columntype + \csname NC@find@\string#1\expandafter\endcsname + \csname NC@rewrite@\string#1\expandafter\endcsname + \csname tabu@NC@find@\string#1\expandafter\endcsname + \csname tabu@NC@rewrite@\string#1\endcsname + {#1}% +}% \tabu@privatecolumntype +\def\tabu@private@columntype#1#2#3#4{% + \g@addto@macro\tabu@privatecolumns{\let#1#3\let#2#4}% + \tabu@new@columntype#3#4% +}% \tabu@private@columntype +\let\tabu@privatecolumns \@empty +\newcommand*\tabucolumn [1]{\expandafter \def \expandafter + \tabu@highprioritycolumns\expandafter{\tabu@highprioritycolumns + \NC@do #1}}% +\let\tabu@highprioritycolumns \@empty +%% The | ``column'' : rewriting process -------------------------- +\tabu@privatecolumntype |{\tabu@rewritevline} +\newcommand*\tabu@rewritevline[1][]{\tabu@vlinearg{#1}% + \expandafter \NC@find \tabu@rewritten} +\def\tabu@lines #1{% + \ifx|#1\else \tabu@privatecolumntype #1{\tabu@rewritevline}\fi + \NC@list\expandafter{\the\NC@list \NC@do #1}% +}% \tabu@lines@ +\def\tabu@vlinearg #1{% + \ifx\\#1\\\def\tabu@thestyle {\tabu@ls@}% + \else\tabu@getline {#1}% + \fi + \def\tabu@rewritten ##1{\def\tabu@rewritten{!{##1\tabu@thevline}}% + }\expandafter\tabu@rewritten\expandafter{\tabu@thestyle}% + \expandafter \tabu@keepls \tabu@thestyle \@nil +}% \tabu@vlinearg +\def\tabu@keepls #1\@nil{% + \ifcat $\@cdr #1\@nil $% + \ifx \relax#1\else + \ifx \tabu@ls@#1\else + \let#1\relax + \xdef\tabu@mkpreambuffer{\tabu@mkpreambuffer + \tabu@savels\noexpand#1}\fi\fi\fi +}% \tabu@keepls +\def\tabu@thevline {\begingroup + \ifdefined\tabu@leaders + \setbox\@tempboxa=\vtop to\dimexpr + \ht\@arstrutbox+\dp\@arstrutbox{{\tabu@thevleaders}}% + \ht\@tempboxa=\ht\@arstrutbox \dp\@tempboxa=\dp\@arstrutbox + \box\@tempboxa + \else + \tabu@thevrule + \fi \endgroup +}% \tabu@thevline +\def\tabu@savels #1{% + \expandafter\let\csname\string#1\endcsname #1% + \expandafter\def\expandafter\tabu@reset\expandafter{\tabu@reset + \tabu@resetls#1}}% +\def\tabu@resetls #1{\expandafter\let\expandafter#1\csname\string#1\endcsname}% +%% \multicolumn inside tabu environment ----------------------------- +\tabu@newcolumntype \tabu@rewritemulticolumn{% + \aftergroup \tabu@endrewritemulticolumn % after \@mkpream group + \NC@list{\NC@do *}\tabu@textbar \tabu@lines + \tabu@savedecl + \tabu@privatecolumns + \NC@list\expandafter{\the\expandafter\NC@list \tabu@NC@list}% + \let\tabu@savels \relax + \NC@find +}% \tabu@rewritemulticolumn +\def\tabu@endrewritemulticolumn{\gdef\tabu@mkpreambuffer{}\endgroup} +\def\tabu@multicolumn{\tabu@ifenvir \tabu@multic@lumn \tabu@multicolumnORI} +\long\def\tabu@multic@lumn #1#2#3{\multispan{#1}\begingroup + \tabu@everyrowtrue + \NC@list{\NC@do \tabu@rewritemulticolumn}% + \expandafter\@gobbletwo % gobbles \multispan{#1} + \tabu@multicolumnORI{#1}{\tabu@rewritemulticolumn #2}% + {\iftabuscantokens \tabu@rescan \else \expandafter\@firstofone \fi + {#3}}% +}% \tabu@multic@lumn +%% The X column(s): rewriting process ----------------------------- +\tabu@privatecolumntype X[1][]{\begingroup \tabu@siunitx{\endgroup \tabu@rewriteX {#1}}} +\def\tabu@nosiunitx #1{#1{}{}\expandafter \NC@find \tabu@rewritten } +\def\tabu@siunitx #1{\@ifnextchar \bgroup + {\tabu@rewriteX@Ss{#1}} + {\tabu@nosiunitx{#1}}} +\def\tabu@rewriteX@Ss #1#2{\@temptokena{}% + \@defaultunits \let\tabu@temp =#2\relax\@nnil + \ifodd 1\ifx S\tabu@temp \else \ifx s\tabu@temp \else 0 \fi\fi + \def\NC@find{\def\NC@find >####1####2<####3\relax{#1 {####1}{####3}% + }\expandafter\NC@find \the\@temptokena \relax + }\expandafter\NC@rewrite@S \@gobble #2\relax + \else \tabu@siunitxerror + \fi + \expandafter \NC@find \tabu@rewritten +}% \tabu@rewriteX@Ss +\def\tabu@siunitxerror {\PackageError{tabu}{Not a S nor s column ! + \MessageBreak X column can only embed siunitx S or s columns}\@ehd +}% \tabu@siunitxerror +\def\tabu@rewriteX #1#2#3{\tabu@Xarg {#1}{#2}{#3}% + \iftabu@measuring + \else \tabu@measuringtrue % first X column found in the preamble + \let\@halignto \relax \let\tabu@halignto \relax + \iftabu@spread \tabu@spreadtarget \tabu@target \tabu@target \z@ + \else \tabu@spreadtarget \z@ \fi + \ifdim \tabu@target=\z@ + \setlength\tabu@target \tabu@thetarget + \tabu@message{\tabu@message@defaulttarget}% + \else \tabu@message{\tabu@message@target}\fi + \fi +}% \tabu@rewriteX +\def\tabu@rewriteXrestore #1#2#3{\let\@halignto \relax + \def\tabu@rewritten{l}} +\def\tabu@Xarg #1#2#3{% + \advance\tabu@Xcol \@ne \let\tabu@Xlcr \@empty + \let\tabu@Xdisp \@empty \let\tabu@Xmath \@empty + \ifx\\#1\\% + \def\tabu@rewritten{p}\tabucolX \p@ % + \else + \let\tabu@rewritten \@empty \let\tabu@temp \@empty \tabucolX \z@ + \tabu@Xparse {}#1\relax + \fi + \tabu@Xrewritten{#2}{#3}% +}% \tabu@Xarg +\def\tabu@Xparse #1{\futurelet\@let@token \tabu@Xtest} +\expandafter\def\expandafter\tabu@Xparsespace\space{\tabu@Xparse{}} +\def\tabu@Xtest{% + \ifcase \ifx \relax\@let@token \z@ \else + \if ,\@let@token \m@ne\else + \if p\@let@token 1\else + \if m\@let@token 2\else + \if b\@let@token 3\else + \if l\@let@token 4\else + \if c\@let@token 5\else + \if r\@let@token 6\else + \if j\@let@token 7\else + \if L\@let@token 8\else + \if C\@let@token 9\else + \if R\@let@token 10\else + \if J\@let@token 11\else + \ifx \@sptoken\@let@token 12\else + \if .\@let@token 13\else + \if -\@let@token 13\else + \ifcat $\@let@token 14\else + 15\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\relax + \or \tabu@Xtype {p}% + \or \tabu@Xtype {m}% + \or \tabu@Xtype {b}% + \or \tabu@Xalign \raggedright\relax + \or \tabu@Xalign \centering\relax + \or \tabu@Xalign \raggedleft\relax + \or \tabu@Xalign \tabu@justify\relax + \or \tabu@Xalign \RaggedRight\raggedright + \or \tabu@Xalign \Centering\centering + \or \tabu@Xalign \RaggedLeft\raggedleft + \or \tabu@Xalign \justifying\tabu@justify + \or \expandafter \tabu@Xparsespace + \or \expandafter \tabu@Xcoef + \or \expandafter \tabu@Xm@th + \or \tabu@Xcoef{}% + \else\expandafter \tabu@Xparse + \fi +}% \tabu@Xtest +\def\tabu@Xalign #1#2{% + \ifx \tabu@Xlcr\@empty \else \PackageWarning{tabu} + {Duplicate horizontal alignment specification}\fi + \ifdefined#1\def\tabu@Xlcr{#1}\let#1\relax + \else \def\tabu@Xlcr{#2}\let#2\relax\fi + \expandafter\tabu@Xparse +}% \tabu@Xalign +\def\tabu@Xtype #1{% + \ifx \tabu@rewritten\@empty \else \PackageWarning{tabu} + {Duplicate vertical alignment specification}\fi + \def\tabu@rewritten{#1}\expandafter\tabu@Xparse +}% \tabu@Xtype +\def\tabu@Xcoef#1{\edef\tabu@temp{\tabu@temp#1}% + \afterassignment\tabu@Xc@ef \tabu@cnt\number\if-#10\fi +}% \tabu@Xcoef +\def\tabu@Xc@ef{\advance\tabucolX \tabu@temp\the\tabu@cnt\p@ + \tabu@Xparse{}% +}% \tabu@Xc@ef +\def\tabu@Xm@th #1{\futurelet \@let@token \tabu@Xd@sp} +\def\tabu@Xd@sp{\let\tabu@Xmath=$% + \ifx $\@let@token \def\tabu@Xdisp{\displaystyle}% + \expandafter\tabu@Xparse + \else \expandafter\tabu@Xparse\expandafter{\expandafter}% + \fi +}% \tabu@Xd@sp +\def\tabu@Xrewritten {% + \ifx \tabu@rewritten\@empty \def\tabu@rewritten{p}\fi + \ifdim \tabucolX<\z@ \tabu@negcoeftrue + \else\ifdim \tabucolX=\z@ \tabucolX \p@ + \fi\fi + \edef\tabu@temp{{\the\tabu@Xcol}{\tabu@strippt\tabucolX}}% + \edef\tabu@Xcoefs{\tabu@Xcoefs \tabu@ \tabu@temp}% + \edef\tabu@rewritten ##1##2{\def\noexpand\tabu@rewritten{% + >{\tabu@Xlcr \ifx$\tabu@Xmath$\tabu@Xdisp\fi ##1}% + \tabu@rewritten {\tabu@hsize \tabu@temp}% + <{##2\ifx$\tabu@Xmath$\fi}}% + }\tabu@rewritten +}% \tabu@Xrewritten +\def\tabu@hsize #1#2{% + \ifdim #2\p@<\z@ + \ifdim \tabucolX=\maxdimen \tabu@wd{#1}\else + \ifdim \tabu@wd{#1}<-#2\tabucolX \tabu@wd{#1}\else -#2\tabucolX\fi + \fi + \else #2\tabucolX + \fi +}% \tabu@hsize +%% \usetabu and \preamble: rewriting process --------------------- +\tabu@privatecolumntype \usetabu [1]{% + \ifx\\#1\\\tabu@saveerr{}\else + \@ifundefined{tabu@saved@\string#1} + {\tabu@saveerr{#1}} + {\let\tabu@rewriteX \tabu@rewriteXrestore + \csname tabu@saved@\string#1\expandafter\endcsname\expandafter\@ne}% + \fi +}% \NC@rewrite@\usetabu +\tabu@privatecolumntype \preamble [1]{% + \ifx\\#1\\\tabu@saveerr{}\else + \@ifundefined{tabu@saved@\string#1} + {\tabu@saveerr{#1}} + {\csname tabu@saved@\string#1\expandafter\endcsname\expandafter\z@}% + \fi +}% \NC@rewrite@\preamble +%% Controlling the rewriting process ------------------------------- +\tabu@newcolumntype \tabu@rewritefirst{% + \iftabu@long \aftergroup \tabu@longpream % + \else \aftergroup \tabu@pream + \fi + \let\tabu@ \relax \let\tabu@hsize \relax + \let\tabu@Xcoefs \@empty \let\tabu@savels \relax + \tabu@Xcol \z@ \tabu@cnt \tw@ + \gdef\tabu@mkpreambuffer{\tabu@{}}\tabu@measuringfalse + \global\setbox\@arstrutbox \box\@arstrutbox + \NC@list{\NC@do *}\tabu@textbar \tabu@lines + \NC@list\expandafter{\the\NC@list \NC@do X}% + \iftabu@siunitx % + \NC@list\expandafter{\the\NC@list \NC@do S\NC@do s}\fi + \NC@list\expandafter{\the\expandafter\NC@list \tabu@highprioritycolumns}% + \expandafter\def\expandafter\tabu@NC@list\expandafter{% + \the\expandafter\NC@list \tabu@NC@list}% % * | X S + \NC@list\expandafter{\expandafter \NC@do \expandafter\usetabu + \expandafter \NC@do \expandafter\preamble + \the\NC@list \NC@do \tabu@rewritemiddle + \NC@do \tabu@rewritelast}% + \tabu@savedecl + \tabu@privatecolumns + \edef\tabu@prev{\the\@temptokena}\NC@find \tabu@rewritemiddle +}% NC@rewrite@\tabu@rewritefirst +\tabu@newcolumntype \tabu@rewritemiddle{% + \edef\tabu@temp{\the\@temptokena}\NC@find \tabu@rewritelast +}% \NC@rewrite@\tabu@rewritemiddle +\tabu@newcolumntype \tabu@rewritelast{% + \ifx \tabu@temp\tabu@prev \advance\tabu@cnt \m@ne + \NC@list\expandafter{\tabu@NC@list \NC@do \tabu@rewritemiddle + \NC@do \tabu@rewritelast}% + \else \let\tabu@prev\tabu@temp + \fi + \ifcase \tabu@cnt \expandafter\tabu@endrewrite + \else \expandafter\NC@find \expandafter\tabu@rewritemiddle + \fi +}% \NC@rewrite@\tabu@rewritelast +%% Choosing the strategy -------------------------------------------- +\def\tabu@endrewrite {% + \let\tabu@temp \NC@find + \ifx \@arrayright\relax \let\@arrayright \@empty \fi + \count@=% + \ifx \@finalstrut\tabu@finalstrut \z@ % outer in mode 0 print + \iftabu@measuring + \xdef\tabu@mkpreambuffer{\tabu@mkpreambuffer + \tabu@target \csname tabu@\the\tabu@nested.T\endcsname + \tabucolX \csname tabu@\the\tabu@nested.X\endcsname + \edef\@halignto {\ifx\@arrayright\@empty to\tabu@target\fi}}% + \fi + \else\iftabu@measuring 4 % X columns + \xdef\tabu@mkpreambuffer{\tabu@{\tabu@mkpreambuffer + \tabu@target \the\tabu@target + \tabu@spreadtarget \the\tabu@spreadtarget}% + \def\noexpand\tabu@Xcoefs{\tabu@Xcoefs}% + \edef\tabu@halignto{\ifx \@arrayright\@empty to\tabu@target\fi}}% + \let\tabu@Xcoefs \relax + \else\ifcase\tabu@nested \thr@@ % outer, no X + \global\let\tabu@afterendpar \relax + \else \@ne % inner, no X, outer in mode 1 or 2 + \fi + \ifdefined\tabu@usetabu + \else \ifdim\tabu@target=\z@ + \else \let\tabu@temp \tabu@extracolsep + \fi\fi + \fi + \fi + \xdef\tabu@mkpreambuffer{\count@ \the\count@ \tabu@mkpreambuffer}% + \tabu@temp +}% \tabu@endrewrite +\def\tabu@extracolsep{\@defaultunits \expandafter\let + \expandafter\tabu@temp \expandafter=\the\@temptokena \relax\@nnil + \ifx \tabu@temp\@sptoken + \expandafter\tabu@gobblespace \expandafter\tabu@extracolsep + \else + \edef\tabu@temp{\noexpand\NC@find + \if |\noexpand\tabu@temp @% + \else\if !\noexpand\tabu@temp @% + \else !% + \fi\fi + {\noexpand\extracolsep\noexpand\@flushglue}}% + \fi + \tabu@temp +}% \tabu@extrac@lsep +%% Implementing the strategy ---------------------------------------- +\long\def\tabu@pream #1\@preamble {% + \let\tabu@ \tabu@@ \tabu@mkpreambuffer \tabu@aftergroupcleanup + \NC@list\expandafter {\tabu@NC@list}% in case of nesting... + \ifdefined\tabu@usetabu \tabu@usetabu \tabu@target \z@ \fi + \let\tabu@savedpreamble \@preamble + \global\let\tabu@elapsedtime \relax + \tabu@thebody ={#1\tabu@aftergroupcleanup}% + \tabu@thebody =\expandafter{\the\expandafter\tabu@thebody + \@preamble}% + \edef\tabuthepreamble {\the\tabu@thebody}% ( no @ allowed for \scantokens ) + \tabu@select +}% \tabu@pream +\long\def\tabu@longpream #1\LT@bchunk #2\LT@bchunk{% + \let\tabu@ \tabu@@ \tabu@mkpreambuffer \tabu@aftergroupcleanup + \NC@list\expandafter {\tabu@NC@list}% in case of nesting... + \let\tabu@savedpreamble \@preamble + \global\let\tabu@elapsedtime \relax + \tabu@thebody ={#1\LT@bchunk #2\tabu@aftergroupcleanup \LT@bchunk}% + \edef\tabuthepreamble {\the\tabu@thebody}% ( no @ allowed for \scantokens ) + \tabu@select +}% \tabu@longpream +\def\tabu@select {% + \ifnum\tabu@nested>\z@ \tabuscantokensfalse \fi + \ifnum \count@=\@ne \iftabu@measuring \count@=\tw@ \fi\fi + \ifcase \count@ + \global\let\tabu@elapsedtime \relax + \tabu@seteverycr + \expandafter \tabuthepreamble % vertical adjustment (inherited from outer) + \or % exit in vertical measure + struts per cell because no X and outer in mode 3 + \tabu@evr{\tabu@verticalinit}\tabu@celllalign@def{\tabu@verticalmeasure}% + \def\tabu@cellralign{\tabu@verticalspacing}% + \tabu@seteverycr + \expandafter \tabuthepreamble + \or % exit without measure because no X and outer in mode 4 + \tabu@evr{}\tabu@celllalign@def{}\let\tabu@cellralign \@empty + \tabu@seteverycr + \expandafter \tabuthepreamble + \else % needs trials + \tabu@evr{}\tabu@celllalign@def{}\let\tabu@cellralign \@empty + \tabu@savecounters + \expandafter \tabu@setstrategy + \fi +}% \tabu@select +\def\tabu@@ {\gdef\tabu@mkpreambuffer} +%% Protections to set up before trials ------------------------------ +\def\tabu@setstrategy {\begingroup % + \tabu@trialh@@k \tabu@cnt \z@ % number of trials + \hbadness \@M \let\hbadness \@tempcnta + \hfuzz \maxdimen \let\hfuzz \@tempdima + \let\write \tabu@nowrite\let\GenericError \tabu@GenericError + \let\savetabu \@gobble \let\tabudefaulttarget \linewidth + \let\@footnotetext \@gobble \let\@xfootnote \tabu@xfootnote + \let\color \tabu@nocolor\let\rowcolor \tabu@norowcolor + \let\tabu@aftergroupcleanup \relax % only after the last trial + \tabu@mkpreambuffer + \ifnum \count@>\thr@@ \let\@halignto \@empty \tabucolX@init + \def\tabu@lasttry{\m@ne\p@}\fi + \begingroup \iffalse{\fi \ifnum0=`}\fi + \toks@{}\def\tabu@stack{b}\iftabuscantokens \endlinechar=10 \obeyspaces \fi % + \tabu@collectbody \tabu@strategy % +}% \tabu@setstrategy +\def\tabu@savecounters{% + \def\@elt ##1{\csname c@##1\endcsname\the\csname c@##1\endcsname}% + \edef\tabu@clckpt {\begingroup \globaldefs=\@ne \cl@@ckpt \endgroup}\let\@elt \relax +}% \tabu@savecounters +\def\tabucolX@init {% \tabucolX <= \tabu@target / (sum coefs > 0) + \dimen@ \z@ \tabu@Xsum \z@ \tabucolX \z@ \let\tabu@ \tabu@Xinit \tabu@Xcoefs + \ifdim \dimen@>\z@ + \@tempdima \dimexpr \tabu@target *\p@/\dimen@ + \tabu@hfuzz\relax + \ifdim \tabucolX<\@tempdima \tabucolX \@tempdima \fi + \fi +}% \tabucolX@init +\def\tabu@Xinit #1#2{\tabu@Xcol #1 \advance \tabu@Xsum + \ifdim #2\p@>\z@ #2\p@ \advance\dimen@ #2\p@ + \else -#2\p@ \tabu@negcoeftrue + \@tempdima \dimexpr \tabu@target*\p@/\dimexpr-#2\p@\relax \relax + \ifdim \tabucolX<\@tempdima \tabucolX \@tempdima \fi + \tabu@wddef{#1}{0pt}% + \fi +}% \tabu@Xinit +%% Collecting the environment body ---------------------------------- +\long\def\tabu@collectbody #1#2\end #3{% + \edef\tabu@stack{\tabu@pushbegins #2\begin\end\expandafter\@gobble\tabu@stack}% + \ifx \tabu@stack\@empty + \toks@\expandafter{\expandafter\tabu@thebody\expandafter{\the\toks@ #2}% + \def\tabu@end@envir{\end{#3}}% + \iftabuscantokens + \iftabu@long \def\tabu@endenvir {\end{#3}\tabu@gobbleX}% + \else \def\tabu@endenvir {\let\endarray \@empty + \end{#3}\tabu@gobbleX}% + \fi + \else \def\tabu@endenvir {\end{#3}}\fi}% + \let\tabu@collectbody \tabu@endofcollect + \else\def\tabu@temp{#3}% + \ifx \tabu@temp\@empty \toks@\expandafter{\the\toks@ #2\end }% + \else \ifx\tabu@temp\tabu@@spxiii \toks@\expandafter{\the\toks@ #2\end #3}% + \else \ifx\tabu@temp\tabu@X \toks@\expandafter{\the\toks@ #2\end #3}% + \else \toks@\expandafter{\the\toks@ #2\end{#3}}% + \fi\fi\fi + \fi + \tabu@collectbody{#1}% +}% \tabu@collectbody +\long\def\tabu@pushbegins#1\begin#2{\ifx\end#2\else b\expandafter\tabu@pushbegins\fi}% +\def\tabu@endofcollect #1{\ifnum0=`{}\fi + \expandafter\endgroup \the\toks@ #1% +}% \tabu@endofcollect +%% The trials: switching between strategies ------------------------- +\def\tabu@strategy {\relax % stops \count@ assignment ! + \ifcase\count@ % case 0 = print with vertical adjustment (outer is finished) + \expandafter \tabu@endoftrials + \or % case 1 = exit in vertical measure (outer in mode 3) + \expandafter\xdef\csname tabu@\the\tabu@nested.T\endcsname{\the\tabu@target}% + \expandafter\xdef\csname tabu@\the\tabu@nested.X\endcsname{\the\tabucolX}% + \expandafter \tabu@endoftrials + \or % case 2 = exit with a rule replacing the table (outer in mode 4) + \expandafter \tabu@quickend + \or % case 3 = outer is in mode 3 because of no X + \begingroup + \tabu@evr{\tabu@verticalinit}\tabu@celllalign@def{\tabu@verticalmeasure}% + \def\tabu@cellralign{\tabu@verticalspacing}% + \expandafter \tabu@measuring + \else % case 4 = horizontal measure + \begingroup + \global\let\tabu@elapsedtime \tabu@message@etime + \long\def\multicolumn##1##2##3{\multispan{##1}}% + \let\tabu@startpboxORI \@startpbox + \iftabu@spread + \def\tabu@naturalXmax {\z@}% + \let\tabu@naturalXmin \tabu@naturalXmax + \tabu@evr{\global\tabu@naturalX \z@}% + \let\@startpbox \tabu@startpboxmeasure + \else\iftabu@negcoef + \let\@startpbox \tabu@startpboxmeasure + \else \let\@startpbox \tabu@startpboxquick + \fi\fi + \expandafter \tabu@measuring + \fi +}% \tabu@strategy +\def\tabu@measuring{\expandafter \tabu@trial \expandafter + \count@ \the\count@ \tabu@endtrial +}% \tabu@measuring +\def\tabu@trial{\iftabu@long \tabu@longtrial \else \tabu@shorttrial \fi} +\def\tabu@shorttrial {\setbox\tabu@box \hbox\bgroup \tabu@seteverycr + \ifx \tabu@savecounters\relax \else + \let\tabu@savecounters \relax \tabu@clckpt \fi + $\iftabuscantokens \tabu@rescan \else \expandafter\@secondoftwo \fi + \expandafter{\expandafter \tabuthepreamble + \the\tabu@thebody + \csname tabu@adl@endtrial\endcsname + \endarray}$\egroup % got \tabu@box +}% \tabu@shorttrial +\def\tabu@longtrial {\setbox\tabu@box \hbox\bgroup \tabu@seteverycr + \ifx \tabu@savecounters\relax \else + \let\tabu@savecounters \relax \tabu@clckpt \fi + \iftabuscantokens \tabu@rescan \else \expandafter\@secondoftwo \fi + \expandafter{\expandafter \tabuthepreamble + \the\tabu@thebody + \tabuendlongtrial}\egroup % got \tabu@box +}% \tabu@longtrial +\def\tabuendlongtrial{% no @ allowed for \scantokens + \LT@echunk \global\setbox\@ne \hbox{\unhbox\@ne}\kern\wd\@ne + \LT@get@widths +}% \tabuendlongtrial +\def\tabu@adl@endtrial{% + \crcr \noalign{\global\adl@ncol \tabu@nbcols}}% anything global is crap, junky and fails ! +\def\tabu@seteverycr {\tabu@reset + \everycr \expandafter{\the\everycr \tabu@everycr}% + \let\everycr \tabu@noeverycr % +}% \tabu@seteverycr +\def\tabu@noeverycr{{\aftergroup\tabu@restoreeverycr \afterassignment}\toks@} +\def\tabu@restoreeverycr {\let\everycr \tabu@@everycr} +\def\tabu@everycr {\iftabu@everyrow \noalign{\tabu@everyrow}\fi} +\def\tabu@endoftrials {% + \iftabuscantokens \expandafter\@firstoftwo + \else \expandafter\@secondoftwo + \fi + {\expandafter \tabu@closetrialsgroup \expandafter + \tabu@rescan \expandafter{% + \expandafter\tabuthepreamble + \the\expandafter\tabu@thebody + \iftabu@long \else \endarray \fi}} + {\expandafter\tabu@closetrialsgroup \expandafter + \tabuthepreamble + \the\tabu@thebody}% + \tabu@endenvir % Finish ! +}% \tabu@endoftrials +\def\tabu@closetrialsgroup {% + \toks@\expandafter{\tabu@endenvir}% + \edef\tabu@bufferX{\endgroup + \tabucolX \the\tabucolX + \tabu@target \the\tabu@target + \tabu@cnt \the\tabu@cnt + \def\noexpand\tabu@endenvir{\the\toks@}% + %Quid de \@halignto = \tabu@halignto ?? + }% \tabu@bufferX + \tabu@bufferX + \ifcase\tabu@nested % print out (outer in mode 0) + \global\tabu@cnt \tabu@cnt + \tabu@evr{\tabu@verticaldynamicadjustment}% + \tabu@celllalign@def{\everypar{}}\let\tabu@cellralign \@empty + \let\@finalstrut \tabu@finalstrut + \else % vertical measure of nested tabu + \tabu@evr{\tabu@verticalinit}% + \tabu@celllalign@def{\tabu@verticalmeasure}% + \def\tabu@cellralign{\tabu@verticalspacing}% + \fi + \tabu@clckpt \let\@halignto \tabu@halignto + \let\@halignto \@empty + \tabu@seteverycr + \ifdim \tabustrutrule>\z@ \ifnum\tabu@nested=\z@ + \setbox\@arstrutbox \box\voidb@x % force \@arstrutbox to be rebuilt (visible struts) + \fi\fi +}% \tabu@closetrialsgroup +\def\tabu@quickend {\expandafter \endgroup \expandafter + \tabu@target \the\tabu@target \tabu@quickrule + \let\endarray \relax \tabu@endenvir +}% \tabu@quickend +\def\tabu@endtrial {\relax % stops \count@ assignment ! + \ifcase \count@ \tabu@err % case 0 = impossible here + \or \tabu@err % case 1 = impossible here + \or \tabu@err % case 2 = impossible here + \or % case 3 = outer goes into mode 0 + \def\tabu@bufferX{\endgroup}\count@ \z@ + \else % case 4 = outer goes into mode 3 + \iftabu@spread \tabu@spreadarith % inner into mode 1 (outer in mode 3) + \else \tabu@arith % or 2 (outer in mode 4) + \fi + \count@=% + \ifcase\tabu@nested \thr@@ % outer goes into mode 3 + \else\iftabu@measuring \tw@ % outer is in mode 4 + \else \@ne % outer is in mode 3 + \fi\fi + \edef\tabu@bufferX{\endgroup + \tabucolX \the\tabucolX + \tabu@target \the\tabu@target}% + \fi + \expandafter \tabu@bufferX \expandafter + \count@ \the\count@ \tabu@strategy +}% \tabu@endtrial +\def\tabu@err{\errmessage{(tabu) Internal impossible error! (\count@=\the\count@)}} +%% The algorithms: compute the widths / stop or go on --------------- +\def\tabu@arithnegcoef {% + \@tempdima \z@ \dimen@ \z@ \let\tabu@ \tabu@arith@negcoef \tabu@Xcoefs +}% \tabu@arithnegcoef +\def\tabu@arith@negcoef #1#2{% + \ifdim #2\p@>\z@ \advance\dimen@ #2\p@ % saturated by definition + \advance\@tempdima #2\tabucolX + \else + \ifdim -#2\tabucolX <\tabu@wd{#1}% c_i X < natural width <= \tabu@target-> saturated + \advance\dimen@ -#2\p@ + \advance\@tempdima -#2\tabucolX + \else + \advance\@tempdima \tabu@wd{#1}% natural width <= c_i X => neutralised + \ifdim \tabu@wd{#1}<\tabu@target \else % neutralised + \advance\dimen@ -#2\p@ % saturated (natural width = tabu@target) + \fi + \fi + \fi +}% \tabu@arith@negcoef +\def\tabu@givespace #1#2{% here \tabu@DELTA < \z@ + \ifdim \@tempdima=\z@ + \tabu@wddef{#1}{\the\dimexpr -\tabu@DELTA*\p@/\tabu@Xsum}% + \else + \tabu@wddef{#1}{\the\dimexpr \tabu@hsize{#1}{#2} + *(\p@ -\tabu@DELTA*\p@/\@tempdima)/\p@\relax}% + \fi +}% \tabu@givespace +\def\tabu@arith {\advance\tabu@cnt \@ne + \ifnum \tabu@cnt=\@ne \tabu@message{\tabu@titles}\fi + \tabu@arithnegcoef + \@tempdimb \dimexpr \wd\tabu@box -\@tempdima \relax % + \tabu@DELTA = \dimexpr \wd\tabu@box - \tabu@target \relax + \tabu@message{\tabu@message@arith}% + \ifdim \tabu@DELTA <\tabu@hfuzz + \ifdim \tabu@DELTA<\z@ % wd (tabu)<\tabu@target ? + \let\tabu@ \tabu@givespace \tabu@Xcoefs + \advance\@tempdima \@tempdimb \advance\@tempdima -\tabu@DELTA % for message + \else % already converged: nothing to do but nearly impossible... + \fi + \tabucolX \maxdimen + \tabu@measuringfalse + \else % need for narrower X columns + \tabucolX =\dimexpr (\@tempdima -\tabu@DELTA) *\p@/\tabu@Xsum \relax + \tabu@measuringtrue + \@whilesw \iftabu@measuring\fi {% + \advance\tabu@cnt \@ne + \tabu@arithnegcoef + \tabu@DELTA =\dimexpr \@tempdima+\@tempdimb -\tabu@target \relax % always < 0 here + \tabu@message{\tabu@header + \tabu@msgalign \tabucolX { }{ }{ }{ }{ }\@@ + \tabu@msgalign \@tempdima+\@tempdimb { }{ }{ }{ }{ }\@@ + \tabu@msgalign \tabu@target { }{ }{ }{ }{ }\@@ + \tabu@msgalign@PT \dimen@ { }{}{}{}{}{}{}\@@ + \ifdim -\tabu@DELTA<\tabu@hfuzz \tabu@spaces target ok\else + \tabu@msgalign \dimexpr -\tabu@DELTA *\p@/\dimen@ {}{}{}{}{}\@@ + \fi}% + \ifdim -\tabu@DELTA<\tabu@hfuzz + \advance\@tempdima \@tempdimb % for message + \tabu@measuringfalse + \else + \advance\tabucolX \dimexpr -\tabu@DELTA *\p@/\dimen@ \relax + \fi + }% + \fi + \tabu@message{\tabu@message@reached}% + \edef\tabu@bufferX{\endgroup \tabu@cnt \the\tabu@cnt + \tabucolX \the\tabucolX + \tabu@target \the\tabu@target}% +}% \tabu@arith +\def\tabu@spreadarith {% + \dimen@ \z@ \@tempdima \tabu@naturalXmax \let\tabu@ \tabu@spread@arith \tabu@Xcoefs + \edef\tabu@naturalXmin {\the\dimexpr\tabu@naturalXmin*\dimen@/\p@}% + \@tempdimc =\dimexpr \wd\tabu@box -\tabu@naturalXmax+\tabu@naturalXmin \relax + \iftabu@measuring + \tabu@target =\dimexpr \@tempdimc+\tabu@spreadtarget \relax + \edef\tabu@bufferX{\endgroup \tabucolX \the\tabucolX \tabu@target\the\tabu@target}% + \else + \tabu@message{\tabu@message@spreadarith}% + \ifdim \dimexpr \@tempdimc+\tabu@spreadtarget >\tabu@target + \tabu@message{(tabu) spread + \ifdim \@tempdimc>\tabu@target useless here: default target used% + \else too large: reduced to fit default target\fi.}% + \else + \tabu@target =\dimexpr \@tempdimc+\tabu@spreadtarget \relax + \tabu@message{(tabu) spread: New target set to \the\tabu@target^^J}% + \fi + \begingroup \let\tabu@wddef \@gobbletwo + \@tempdimb \@tempdima + \tabucolX@init + \tabu@arithnegcoef + \wd\tabu@box =\dimexpr \wd\tabu@box +\@tempdima-\@tempdimb \relax + \expandafter\endgroup \expandafter\tabucolX \the\tabucolX + \tabu@arith + \fi +}% \tabu@spreadarith +\def\tabu@spread@arith #1#2{% + \ifdim #2\p@>\z@ \advance\dimen@ #2\p@ + \else \advance\@tempdima \tabu@wd{#1}\relax + \fi +}% \tabu@spread@arith +%% Reporting in the .log file --------------------------------------- +\def\tabu@message@defaulttarget{% + \ifnum\tabu@nested=\z@^^J(tabu) Default target: + \ifx\tabudefaulttarget\linewidth \string\linewidth + \ifdim \tabu@thetarget=\linewidth \else + -\the\dimexpr\linewidth-\tabu@thetarget\fi = + \else\ifx\tabudefaulttarget\linegoal\string\linegoal= + \fi\fi + \else (tabu) Default target (nested): \fi + \the\tabu@target \on@line + \ifnum\tabu@nested=\z@ , page \the\c@page\fi} +\def\tabu@message@target {^^J(tabu) Target specified: + \the\tabu@target \on@line, page \the\c@page} +\def\tabu@message@arith {\tabu@header + \tabu@msgalign \tabucolX { }{ }{ }{ }{ }\@@ + \tabu@msgalign \wd\tabu@box { }{ }{ }{ }{ }\@@ + \tabu@msgalign \tabu@target { }{ }{ }{ }{ }\@@ + \tabu@msgalign@PT \dimen@ { }{}{}{}{}{}{}\@@ + \ifdim \tabu@DELTA<\tabu@hfuzz giving space\else + \tabu@msgalign \dimexpr (\@tempdima-\tabu@DELTA) *\p@/\tabu@Xsum -\tabucolX {}{}{}{}{}\@@ + \fi +}% \tabu@message@arith +\def\tabu@message@spreadarith {\tabu@spreadheader + \tabu@msgalign \tabu@spreadtarget { }{ }{ }{ }{}\@@ + \tabu@msgalign \wd\tabu@box { }{ }{ }{ }{}\@@ + \tabu@msgalign -\tabu@naturalXmax { }{}{}{}{}\@@ + \tabu@msgalign \tabu@naturalXmin { }{ }{ }{ }{}\@@ + \tabu@msgalign \ifdim \dimexpr\@tempdimc>\tabu@target \tabu@target + \else \@tempdimc+\tabu@spreadtarget \fi + {}{}{}{}{}\@@} +\def\tabu@message@negcoef #1#2{ + \tabu@spaces\tabu@spaces\space * #1. X[\rem@pt#2]: + \space width = \tabu@wd {#1} + \expandafter\string\csname tabu@\the\tabu@nested.W\number#1\endcsname + \ifdim -\tabu@pt#2\tabucolX<\tabu@target + < \number-\rem@pt#2 X + = \the\dimexpr -\tabu@pt#2\tabucolX \relax + \else + <= \the\tabu@target\space < \number-\rem@pt#2 X\fi} +\def\tabu@message@reached{\tabu@header + ******* Reached Target: + hfuzz = \tabu@hfuzz\on@line\space *******} +\def\tabu@message@etime{\edef\tabu@stoptime{\the\pdfelapsedtime}% + \tabu@message{(tabu)\tabu@spaces Time elapsed during measure: + \the\numexpr(\tabu@stoptime-\tabu@starttime-32767)/65536\relax sec + \the\numexpr\numexpr(\tabu@stoptime-\tabu@starttime) + -\numexpr(\tabu@stoptime-\tabu@starttime-32767)/65536\relax*65536\relax + *1000/65536\relax ms \tabu@spaces(\the\tabu@cnt\space + cycle\ifnum\tabu@cnt>\@ne s\fi)^^J^^J}} +\def\tabu@message@verticalsp {% + \ifdim \@tempdima>\tabu@ht + \ifdim \@tempdimb>\tabu@dp + \expandafter\expandafter\expandafter\string\tabu@ht = + \tabu@msgalign \@tempdima { }{ }{ }{ }{ }\@@ + \expandafter\expandafter\expandafter\string\tabu@dp = + \tabu@msgalign \@tempdimb { }{ }{ }{ }{ }\@@^^J% + \else + \expandafter\expandafter\expandafter\string\tabu@ht = + \tabu@msgalign \@tempdima { }{ }{ }{ }{ }\@@^^J% + \fi + \else\ifdim \@tempdimb>\tabu@dp + \tabu@spaces\tabu@spaces\tabu@spaces + \expandafter\expandafter\expandafter\string\tabu@dp = + \tabu@msgalign \@tempdimb { }{ }{ }{ }{ }\@@^^J\fi + \fi +}% \tabu@message@verticalsp +\edef\tabu@spaces{\@spaces} +\def\tabu@strippt{\expandafter\tabu@pt\the} +{\@makeother\P \@makeother\T\lowercase{\gdef\tabu@pt #1PT{#1}}} +\def\tabu@msgalign{\expandafter\tabu@msg@align\the\dimexpr} +\def\tabu@msgalign@PT{\expandafter\tabu@msg@align\romannumeral-`\0\tabu@strippt} +\def\do #1{% + \def\tabu@msg@align##1.##2##3##4##5##6##7##8##9\@@{% + \ifnum##1<10 #1 #1\else + \ifnum##1<100 #1 \else + \ifnum##1<\@m #1\fi\fi\fi + ##1.##2##3##4##5##6##7##8#1}% + \def\tabu@header{(tabu) \ifnum\tabu@cnt<10 #1\fi\the\tabu@cnt) }% + \def\tabu@titles{\ifnum \tabu@nested=\z@ + (tabu) Try#1 #1 tabu X #1 #1 #1tabu Width #1 #1 Target + #1 #1 #1 Coefs #1 #1 #1 Update^^J\fi}% + \def\tabu@spreadheader{% + (tabu) Try#1 #1 Spread #1 #1 tabu Width #1 #1 #1 Nat. X #1 #1 #1 #1Nat. Min. + #1 New Target^^J% + (tabu) sprd} + \def\tabu@message@save {\begingroup + \def\x ####1{\tabu@msg@align ####1{ }{ }{ }{ }{}\@@} + \def\z ####1{\expandafter\x\expandafter{\romannumeral-`\0\tabu@strippt + \dimexpr####1\p@{ }{ }}}% + \let\color \relax \def\tabu@rulesstyle ####1####2{\detokenize{####1}}% + \let\CT@arc@ \relax \let\@preamble \@gobble + \let\tabu@savedpream \@firstofone + \let\tabu@savedparams \@firstofone + \def\tabu@target ####1\relax {(tabu) target #1 #1 #1 #1 #1 = \x{####1}^^J}% + \def\tabucolX ####1\relax {(tabu) X columns width#1 = \x{####1}^^J}% + \def\tabu@nbcols ####1\relax {(tabu) Number of columns: \z{####1}^^J}% + \def\tabu@aligndefault ####1{(tabu) Default alignment: #1 #1 ####1^^J}% + \def\col@sep ####1\relax {(tabu) column sep #1 #1 #1 = \x{####1}^^J}% + \def\arrayrulewidth ####1\relax{(tabu) arrayrulewidth #1 = \x{####1}}% + \def\doublerulesep ####1\relax { doublerulesep = \x{####1}^^J}% + \def\extratabsurround####1\relax{(tabu) extratabsurround = \x{####1}^^J}% + \def\extrarowheight ####1\relax{(tabu) extrarowheight #1 = \x{####1}}% + \def\extrarowdepth ####1\relax {extrarowdepth = \x{####1}^^J}% + \def\abovetabulinesep####1\relax{(tabu) abovetabulinesep=\x{####1} }% + \def\belowtabulinesep####1\relax{ belowtabulinesep=\x{####1}^^J}% + \def\arraystretch ####1{(tabu) arraystretch #1 #1 = \z{####1}^^J}% + \def\minrowclearance####1\relax{(tabu) minrowclearance #1 = \x{####1}^^J}% + \def\tabu@arc@L ####1{(tabu) taburulecolor #1 #1 = ####1^^J}% + \def\tabu@drsc@L ####1{(tabu) tabudoublerulecolor= ####1^^J}% + \def\tabu@evr@L ####1{(tabu) everyrow #1 #1 #1 #1 = \detokenize{####1}^^J}% + \def\tabu@ls@L ####1{(tabu) line style = \detokenize{####1}^^J}% + \def\NC@find ####1\@nil{(tabu) tabu preamble#1 #1 = \detokenize{####1}^^J}% + \def\tabu@wddef####1####2{(tabu) Natural width ####1 = \x{####2}^^J}% + \let\edef \@gobbletwo \let\def \@empty \let\let \@gobbletwo + \tabu@message{% + (tabu) \string\savetabu{\tabu@temp}: \on@line^^J% + \tabu@usetabu \@nil^^J}% + \endgroup} +}\do{ } +%% Measuring the natural width (varwidth) - store the results ------- +\def\tabu@startpboxmeasure #1{\bgroup % entering \vtop + \edef\tabu@temp{\expandafter\@secondoftwo \ifx\tabu@hsize #1\else\relax\fi}% + \ifodd 1\ifx \tabu@temp\@empty 0 \else % starts with \tabu@hsize ? + \iftabu@spread \else % if spread -> measure + \ifdim \tabu@temp\p@>\z@ 0 \fi\fi\fi% if coef>0 -> do not measure + \let\@startpbox \tabu@startpboxORI % restore immediately (nesting) + \tabu@measuringtrue % for the quick option... + \tabu@Xcol =\expandafter\@firstoftwo\ifx\tabu@hsize #1\fi + \ifdim \tabu@temp\p@>\z@ \ifdim \tabu@temp\tabucolX<\tabu@target + \tabu@target=\tabu@temp\tabucolX \fi\fi + \setbox\tabu@box \hbox \bgroup + \begin{varwidth}\tabu@target + \let\FV@ListProcessLine \tabu@FV@ListProcessLine % \hbox to natural width... + \narrowragged \arraybackslash \parfillskip \@flushglue + \ifdefined\pdfadjustspacing \pdfadjustspacing\z@ \fi + \bgroup \aftergroup\tabu@endpboxmeasure + \ifdefined \cellspacetoplimit \tabu@cellspacepatch \fi + \else \expandafter\@gobble + \tabu@startpboxquick{#1}% \@gobble \bgroup + \fi +}% \tabu@startpboxmeasure +\def\tabu@cellspacepatch{\def\bcolumn##1\@nil{}\let\ecolumn\@empty + \bgroup\color@begingroup} +\def\tabu@endpboxmeasure {% + \@finalstrut \@arstrutbox + \end{varwidth}\egroup % + \ifdim \tabu@temp\p@ <\z@ % neg coef + \ifdim \tabu@wd\tabu@Xcol <\wd\tabu@box + \tabu@wddef\tabu@Xcol {\the\wd\tabu@box}% + \tabu@debug{\tabu@message@endpboxmeasure}% + \fi + \else % spread coef>0 + \global\advance \tabu@naturalX \wd\tabu@box + \@tempdima =\dimexpr \wd\tabu@box *\p@/\dimexpr \tabu@temp\p@\relax \relax + \ifdim \tabu@naturalXmax <\tabu@naturalX + \xdef\tabu@naturalXmax {\the\tabu@naturalX}\fi + \ifdim \tabu@naturalXmin <\@tempdima + \xdef\tabu@naturalXmin {\the\@tempdima}\fi + \fi + \box\tabu@box \egroup % end of \vtop (measure) restore \tabu@target +}% \tabu@endpboxmeasure +\def\tabu@wddef #1{\expandafter\xdef + \csname tabu@\the\tabu@nested.W\number#1\endcsname} +\def\tabu@wd #1{\csname tabu@\the\tabu@nested.W\number#1\endcsname} +\def\tabu@message@endpboxmeasure{\tabu@spaces\tabu@spaces<-> % <-> save natural wd + \the\tabu@Xcol. X[\tabu@temp]: + target = \the\tabucolX \space + \expandafter\expandafter\expandafter\string\tabu@wd\tabu@Xcol + =\tabu@wd\tabu@Xcol +}% \tabu@message@endpboxmeasure +\def\tabu@startpboxquick {\bgroup + \let\@startpbox \tabu@startpboxORI % restore immediately + \let\tabu \tabu@quick % \begin is expanded before... + \expandafter\@gobble \@startpbox % gobbles \bgroup +}% \tabu@startpboxquick +\def\tabu@quick {\begingroup \iffalse{\fi \ifnum0=`}\fi + \toks@{}\def\tabu@stack{b}\tabu@collectbody \tabu@endquick +}% \tabu@quick +\def\tabu@endquick {% + \ifodd 1\ifx\tabu@end@envir\tabu@endtabu \else + \ifx\tabu@end@envir\tabu@endtabus \else 0\fi\fi\relax + \endgroup + \else \let\endtabu \relax + \tabu@end@envir + \fi +}% \tabu@quick +\def\tabu@endtabu {\end{tabu}} +\def\tabu@endtabus {\end{tabu*}} +%% Measuring the heights and depths - store the results ------------- +\def\tabu@verticalmeasure{\everypar{}% + \ifnum \currentgrouptype>12 % 14=semi-simple, 15=math shift group + \setbox\tabu@box =\hbox\bgroup + \let\tabu@verticalspacing \tabu@verticalsp@lcr + \d@llarbegin % after \hbox ... + \else + \edef\tabu@temp{\ifnum\currentgrouptype=5\vtop + \else\ifnum\currentgrouptype=12\vcenter + \else\vbox\fi\fi}% + \setbox\tabu@box \hbox\bgroup$\tabu@temp \bgroup + \let\tabu@verticalspacing \tabu@verticalsp@pmb + \fi +}% \tabu@verticalmeasure +\def\tabu@verticalsp@lcr{% + \d@llarend \egroup % + \@tempdima \dimexpr \ht\tabu@box+\abovetabulinesep + \@tempdimb \dimexpr \dp\tabu@box+\belowtabulinesep \relax + \ifdim\tabustrutrule>\z@ \tabu@debug{\tabu@message@verticalsp}\fi + \ifdim \tabu@ht<\@tempdima \tabu@htdef{\the\@tempdima}\fi + \ifdim \tabu@dp<\@tempdimb \tabu@dpdef{\the\@tempdimb}\fi + \noindent\vrule height\@tempdima depth\@tempdimb +}% \tabu@verticalsp@lcr +\def\tabu@verticalsp@pmb{% inserts struts as needed + \par \expandafter\egroup + \expandafter$\expandafter + \egroup \expandafter + \@tempdimc \the\prevdepth + \@tempdima \dimexpr \ht\tabu@box+\abovetabulinesep + \@tempdimb \dimexpr \dp\tabu@box+\belowtabulinesep \relax + \ifdim\tabustrutrule>\z@ \tabu@debug{\tabu@message@verticalsp}\fi + \ifdim \tabu@ht<\@tempdima \tabu@htdef{\the\@tempdima}\fi + \ifdim \tabu@dp<\@tempdimb \tabu@dpdef{\the\@tempdimb}\fi + \let\@finalstrut \@gobble + \hrule height\@tempdima depth\@tempdimb width\hsize +%% \box\tabu@box +}% \tabu@verticalsp@pmb + +\def\tabu@verticalinit{% + \ifnum \c@taburow=\z@ \tabu@rearstrut \fi % after \tabu@reset ! + \advance\c@taburow \@ne + \tabu@htdef{\the\ht\@arstrutbox}\tabu@dpdef{\the\dp\@arstrutbox}% + \advance\c@taburow \m@ne +}% \tabu@verticalinit +\def\tabu@htdef {\expandafter\xdef \csname tabu@\the\tabu@nested.H\the\c@taburow\endcsname} +\def\tabu@ht {\csname tabu@\the\tabu@nested.H\the\c@taburow\endcsname} +\def\tabu@dpdef {\expandafter\xdef \csname tabu@\the\tabu@nested.D\the\c@taburow\endcsname} +\def\tabu@dp {\csname tabu@\the\tabu@nested.D\the\c@taburow\endcsname} +\def\tabu@verticaldynamicadjustment {% + \advance\c@taburow \@ne + \extrarowheight \dimexpr\tabu@ht - \ht\strutbox + \extrarowdepth \dimexpr\tabu@dp - \dp\strutbox + \let\arraystretch \@empty + \advance\c@taburow \m@ne +}% \tabu@verticaldynamicadjustment +\def\tabuphantomline{\crcr \noalign{% + {\globaldefs \@ne + \setbox\@arstrutbox \box\voidb@x + \let\tabu@@celllalign \tabu@celllalign + \let\tabu@@cellralign \tabu@cellralign + \let\tabu@@cellleft \tabu@cellleft + \let\tabu@@cellright \tabu@cellright + \let\tabu@@thevline \tabu@thevline + \let\tabu@celllalign \@empty + \let\tabu@cellralign \@empty + \let\tabu@cellright \@empty + \let\tabu@cellleft \@empty + \let\tabu@thevline \relax}% + \edef\tabu@temp{\tabu@multispan \tabu@nbcols{\noindent &}}% + \toks@\expandafter{\tabu@temp \noindent\tabu@everyrowfalse \cr + \noalign{\tabu@rearstrut + {\globaldefs\@ne + \let\tabu@celllalign \tabu@@celllalign + \let\tabu@cellralign \tabu@@cellralign + \let\tabu@cellleft \tabu@@cellleft + \let\tabu@cellright \tabu@@cellright + \let\tabu@thevline \tabu@@thevline}}}% + \expandafter}\the\toks@ +}% \tabuphantomline +%% \firsthline and \lasthline corrections --------------------------- +\def\tabu@firstline {\tabu@hlineAZ \tabu@firsthlinecorrection {}} +\def\tabu@firsthline{\tabu@hlineAZ \tabu@firsthlinecorrection \hline} +\def\tabu@lastline {\tabu@hlineAZ \tabu@lasthlinecorrection {}} +\def\tabu@lasthline {\tabu@hlineAZ \tabu@lasthlinecorrection \hline} +\def\tabu@hline {% replaces \hline if no colortbl (see \AtBeginDocument) + \noalign{\ifnum0=`}\fi + {\CT@arc@\hrule height\arrayrulewidth}% + \futurelet \tabu@temp \tabu@xhline +}% \tabu@hline +\def\tabu@xhline{% + \ifx \tabu@temp \hline + {\ifx \CT@drsc@\relax \vskip + \else\ifx \CT@drsc@\@empty \vskip + \else \CT@drsc@\hrule height + \fi\fi + \doublerulesep}% + \fi + \ifnum0=`{\fi}% +}% \tabu@xhline +\def\tabu@hlineAZ #1#2{\noalign{\ifnum0=`}\fi \dimen@ \z@ \count@ \z@ + \toks@{}\def\tabu@hlinecorrection{#1}\def\tabu@temp{#2}% + \tabu@hlineAZsurround +}% \tabu@hlineAZ +\newcommand*\tabu@hlineAZsurround[1][\extratabsurround]{% + \extratabsurround #1\let\tabucline \tabucline@scan + \let\hline \tabu@hlinescan \let\firsthline \hline + \let\cline \tabu@clinescan \let\lasthline \hline + \expandafter \futurelet \expandafter \tabu@temp + \expandafter \tabu@nexthlineAZ \tabu@temp +}% \tabu@hlineAZsurround +\def\tabu@hlinescan {\tabu@thick \arrayrulewidth \tabu@xhlineAZ \hline} +\def\tabu@clinescan #1{\tabu@thick \arrayrulewidth \tabu@xhlineAZ {\cline{#1}}} +\def\tabucline@scan{\@testopt \tabucline@sc@n {}} +\def\tabucline@sc@n #1[#2]{\tabu@xhlineAZ {\tabucline[{#1}]{#2}}} +\def\tabu@nexthlineAZ{% + \ifx \tabu@temp\hline \else + \ifx \tabu@temp\cline \else + \ifx \tabu@temp\tabucline \else + \tabu@hlinecorrection + \fi\fi\fi +}% \tabu@nexthlineAZ +\def\tabu@xhlineAZ #1{% + \toks@\expandafter{\the\toks@ #1}% + \@tempdimc \tabu@thick % The last line width + \ifcase\count@ \@tempdimb \tabu@thick % The first line width + \else \advance\dimen@ \dimexpr \tabu@thick+\doublerulesep \relax + \fi + \advance\count@ \@ne \futurelet \tabu@temp \tabu@nexthlineAZ +}% \tabu@xhlineAZ +\def\tabu@firsthlinecorrection{% \count@ = number of \hline -1 + \@tempdima \dimexpr \ht\@arstrutbox+\dimen@ + \edef\firsthline{% + \omit \hbox to\z@{\hss{\noexpand\tabu@DBG{yellow}\vrule + height \the\dimexpr\@tempdima+\extratabsurround + depth \dp\@arstrutbox + width \tabustrutrule}\hss}\cr + \noalign{\vskip -\the\dimexpr \@tempdima+\@tempdimb + +\dp\@arstrutbox \relax}% + \the\toks@ + }\ifnum0=`{\fi + \expandafter}\firsthline % we are then ! +}% \tabu@firsthlinecorrection +\def\tabu@lasthlinecorrection{% + \@tempdima \dimexpr \dp\@arstrutbox+\dimen@+\@tempdimb+\@tempdimc + \edef\lasthline{% + \the\toks@ + \noalign{\vskip -\the\dimexpr\dimen@+\@tempdimb+\dp\@arstrutbox}% + \omit \hbox to\z@{\hss{\noexpand\tabu@DBG{yellow}\vrule + depth \the\dimexpr \dp\@arstrutbox+\@tempdimb+\dimen@ + +\extratabsurround-\@tempdimc + height \z@ + width \tabustrutrule}\hss}\cr + }\ifnum0=`{\fi + \expandafter}\lasthline % we are then ! +}% \tabu@lasthlinecorrection +\def\tabu@LT@@hline{% + \ifx\LT@next\hline + \global\let\LT@next \@gobble + \ifx \CT@drsc@\relax + \gdef\CT@LT@sep{% + \noalign{\penalty-\@medpenalty\vskip\doublerulesep}}% + \else + \gdef\CT@LT@sep{% + \multispan\LT@cols{% + \CT@drsc@\leaders\hrule\@height\doublerulesep\hfill}\cr}% + \fi + \else + \global\let\LT@next\empty + \gdef\CT@LT@sep{% + \noalign{\penalty-\@lowpenalty\vskip-\arrayrulewidth}}% + \fi + \ifnum0=`{\fi}% + \multispan\LT@cols + {\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr + \CT@LT@sep + \multispan\LT@cols + {\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr + \noalign{\penalty\@M}% + \LT@next +}% \tabu@LT@@hline +%% Horizontal lines : \tabucline ------------------------------------ +\let\tabu@start \@tempcnta +\let\tabu@stop \@tempcntb +\newcommand*\tabucline{\noalign{\ifnum0=`}\fi \tabu@cline} +\newcommand*\tabu@cline[2][]{\tabu@startstop{#2}% + \ifnum \tabu@stop<\z@ \toks@{}% + \else \tabu@clinearg{#1}\tabu@thestyle + \edef\tabucline{\toks@{% + \ifnum \tabu@start>\z@ \omit + \tabu@multispan\tabu@start {\span\omit}&\fi + \omit \tabu@multispan\tabu@stop {\span\omit}% + \tabu@thehline\cr + }}\tabucline + \tabu@tracinglines{(tabu:tabucline) Style: #1^^J\the\toks@^^J^^J}% + \fi + \futurelet \tabu@temp \tabu@xcline +}% \tabu@cline +\def\tabu@clinearg #1{% + \ifx\\#1\\\let\tabu@thestyle \tabu@ls@ + \else \@defaultunits \expandafter\let\expandafter\@tempa + \romannumeral-`\0#1\relax \@nnil + \ifx \hbox\@tempa \tabu@clinebox{#1}% + \else\ifx \box\@tempa \tabu@clinebox{#1}% + \else\ifx \vbox\@tempa \tabu@clinebox{#1}% + \else\ifx \vtop\@tempa \tabu@clinebox{#1}% + \else\ifx \copy\@tempa \tabu@clinebox{#1}% + \else\ifx \leaders\@tempa \tabu@clineleads{#1}% + \else\ifx \cleaders\@tempa \tabu@clineleads{#1}% + \else\ifx \xleaders\@tempa \tabu@clineleads{#1}% + \else\tabu@getline {#1}% + \fi\fi\fi\fi\fi\fi\fi\fi + \fi +}% \tabu@clinearg +\def\tabu@clinebox #1{\tabu@clineleads{\xleaders#1\hss}} +\def\tabu@clineleads #1{% + \let\tabu@thestyle \relax \let\tabu@leaders \@undefined + \gdef\tabu@thehrule{#1}} +\def\tabu@thehline{\begingroup + \ifdefined\tabu@leaders + \noexpand\tabu@thehleaders + \else \noexpand\tabu@thehrule + \fi \endgroup +}% \tabu@thehline +\def\tabu@xcline{% + \ifx \tabu@temp\tabucline + \toks@\expandafter{\the\toks@ \noalign + {\ifx\CT@drsc@\relax \vskip + \else \CT@drsc@\hrule height + \fi + \doublerulesep}}% + \fi + \tabu@docline +}% \tabu@xcline +\def\tabu@docline {\ifnum0=`{\fi \expandafter}\the\toks@} +\def\tabu@docline@evr {\xdef\tabu@doclineafter{\the\toks@}% + \ifnum0=`{\fi}\aftergroup\tabu@doclineafter} +\def\tabu@multispan #1#2{% + \ifnum\numexpr#1>\@ne #2\expandafter\tabu@multispan + \else \expandafter\@gobbletwo + \fi {#1-1}{#2}% +}% \tabu@multispan +\def\tabu@startstop #1{\tabu@start@stop #1\relax 1-\tabu@nbcols \@nnil} +\def\tabu@start@stop #1-#2\@nnil{% + \@defaultunits \tabu@start\number 0#1\relax \@nnil + \@defaultunits \tabu@stop \number 0#2\relax \@nnil + \tabu@stop \ifnum \tabu@start>\tabu@nbcols \m@ne + \else\ifnum \tabu@stop=\z@ \tabu@nbcols + \else\ifnum \tabu@stop>\tabu@nbcols \tabu@nbcols + \else \tabu@stop + \fi\fi\fi + \advance\tabu@start \m@ne + \ifnum \tabu@start>\z@ \advance\tabu@stop -\tabu@start \fi +}% \tabu@start@stop +%% Numbers: siunitx S columns (and \tabudecimal) ------------------- +\def\tabu@tabudecimal #1{% + \def\tabu@decimal{#1}\@temptokena{}% + \let\tabu@getdecimal@ \tabu@getdecimal@ignorespaces + \tabu@scandecimal +}% \tabu@tabudecimal +\def\tabu@scandecimal{\futurelet \tabu@temp \tabu@getdecimal@} +\def\tabu@skipdecimal#1{#1\tabu@scandecimal} +\def\tabu@getdecimal@ignorespaces{% + \ifcase 0\ifx\tabu@temp\ignorespaces\else + \ifx\tabu@temp\@sptoken1\else + 2\fi\fi\relax + \let\tabu@getdecimal@ \tabu@getdecimal + \expandafter\tabu@skipdecimal + \or \expandafter\tabu@gobblespace\expandafter\tabu@scandecimal + \else \expandafter\tabu@skipdecimal + \fi +}% \tabu@getdecimal@ignorespaces +\def\tabu@get@decimal#1{\@temptokena\expandafter{\the\@temptokena #1}% + \tabu@scandecimal} +\def\do#1{% + \def\tabu@get@decimalspace#1{% + \@temptokena\expandafter{\the\@temptokena #1}\tabu@scandecimal}% +}\do{ } +\let\tabu@@tabudecimal \tabu@tabudecimal +\def\tabu@getdecimal{% + \ifcase 0\ifx 0\tabu@temp\else + \ifx 1\tabu@temp\else + \ifx 2\tabu@temp\else + \ifx 3\tabu@temp\else + \ifx 4\tabu@temp\else + \ifx 5\tabu@temp\else + \ifx 6\tabu@temp\else + \ifx 7\tabu@temp\else + \ifx 8\tabu@temp\else + \ifx 9\tabu@temp\else + \ifx .\tabu@temp\else + \ifx ,\tabu@temp\else + \ifx -\tabu@temp\else + \ifx +\tabu@temp\else + \ifx e\tabu@temp\else + \ifx E\tabu@temp\else + \ifx\tabu@cellleft\tabu@temp1\else + \ifx\ignorespaces\tabu@temp1\else + \ifx\@sptoken\tabu@temp2\else + 3\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\relax + \expandafter\tabu@get@decimal + \or \expandafter\tabu@skipdecimal + \or \expandafter\tabu@get@decimalspace + \else\expandafter\tabu@printdecimal + \fi +}% \tabu@getdecimal +\def\tabu@printdecimal{% + \edef\tabu@temp{\the\@temptokena}% + \ifx\tabu@temp\@empty\else + \ifx\tabu@temp\space\else + \expandafter\tabu@decimal\expandafter{\the\@temptokena}% + \fi\fi +}% \tabu@printdecimal +%% Verbatim inside X columns ---------------------------------------- +\def\tabu@verbatim{% + \let\verb \tabu@verb + \let\FV@DefineCheckEnd \tabu@FV@DefineCheckEnd +}% \tabu@verbatim +\let\tabu@ltx@verb \verb +\def\tabu@verb{\@ifstar {\tabu@ltx@verb*} \tabu@ltx@verb} +\def\tabu@fancyvrb {% + \def\tabu@FV@DefineCheckEnd ##1{% + \def\tabu@FV@DefineCheckEnd{% + ##1% + \let\FV@CheckEnd \tabu@FV@CheckEnd + \let\FV@@CheckEnd \tabu@FV@@CheckEnd + \let\FV@@@CheckEnd \tabu@FV@@@CheckEnd + \edef\FV@EndScanning{% + \def\noexpand\next{\noexpand\end{\FV@EnvironName}}% + \global\let\noexpand\FV@EnvironName\relax + \noexpand\next}% + \xdef\FV@EnvironName{\detokenize\expandafter{\FV@EnvironName}}}% + }\expandafter\tabu@FV@DefineCheckEnd\expandafter{\FV@DefineCheckEnd} +}% \tabu@fancyvrb +\def\tabu@FV@CheckEnd #1{\expandafter\FV@@CheckEnd \detokenize{#1\end{}}\@nil} +\edef\tabu@FV@@@CheckEnd {\detokenize{\end{}}} +\begingroup +\catcode`\[1 \catcode`\]2 +\@makeother\{ \@makeother\} + \edef\x[\endgroup + \def\noexpand\tabu@FV@@CheckEnd ##1\detokenize[\end{]##2\detokenize[}]##3% + ]\x \@nil{\def\@tempa{#2}\def\@tempb{#3}} +\def\tabu@FV@ListProcessLine #1{% + \hbox {%to \hsize{% + \kern\leftmargin + \hbox {%to \linewidth{% + \FV@LeftListNumber + \FV@LeftListFrame + \FancyVerbFormatLine{#1}\hss +%% DG/SR modification begin - Jan. 28, 1998 (for numbers=right add-on) +%% \FV@RightListFrame}% + \FV@RightListFrame + \FV@RightListNumber}% +%% DG/SR modification end + \hss}} +%% \savetabu -------------------------------------------------------- +\newcommand*\savetabu[1]{\noalign{% + \tabu@sanitizearg{#1}\tabu@temp + \ifx \tabu@temp\@empty \tabu@savewarn{}{The tabu will not be saved}\else + \@ifundefined{tabu@saved@\tabu@temp}{}{\tabu@savewarn{#1}{Overwriting}}% + \ifdefined\tabu@restored \expandafter\let + \csname tabu@saved@\tabu@temp \endcsname \tabu@restored + \else {\tabu@save}% + \fi + \fi}% +}% \savetabu +\def\tabu@save {% + \toks0\expandafter{\tabu@saved@}% + \iftabu@negcoef + \let\tabu@wddef \relax \let\tabu@ \tabu@savewd \edef\tabu@savewd{\tabu@Xcoefs}% + \toks0\expandafter{\the\toks\expandafter0\tabu@savewd}\fi + \toks1\expandafter{\tabu@savedpream}% + \toks2\expandafter{\tabu@savedpreamble}% + \let\@preamble \relax + \let\tabu@savedpream \relax \let\tabu@savedparams \relax + \edef\tabu@preamble{% + \def\noexpand\tabu@aligndefault{\tabu@align}% + \def\tabu@savedparams {\noexpand\the\toks0}% + \def\tabu@savedpream {\noexpand\the\toks1}}% + \edef\tabu@usetabu{% + \def\@preamble {\noexpand\the\toks2}% + \tabu@target \the\tabu@target \relax + \tabucolX \the\tabucolX \relax + \tabu@nbcols \the\tabu@nbcols \relax + \def\noexpand\tabu@aligndefault{\tabu@align}% + \def\tabu@savedparams {\noexpand\the\toks0}% + \def\tabu@savedpream {\noexpand\the\toks1}}% + \let\tabu@aligndefault \relax \let\@sharp \relax + \edef\@tempa{\noexpand\tabu@s@ved + {\tabu@usetabu} + {\tabu@preamble} + {\the\toks1}}\@tempa + \tabu@message@save +}% \tabu@save +\long\def\tabu@s@ved #1#2#3{% + \def\tabu@usetabu{#1}% + \expandafter\gdef\csname tabu@saved@\tabu@temp\endcsname ##1{% + \ifodd ##1% \usetabu + \tabu@measuringfalse \tabu@spreadfalse % Just in case... + \gdef\tabu@usetabu {% + \ifdim \tabu@target>\z@ \tabu@warn@usetabu \fi + \global\let\tabu@usetabu \@undefined + \def\@halignto {to\tabu@target}% + #1% + \ifx \tabu@align\tabu@aligndefault@text + \ifnum \tabu@nested=\z@ + \let\tabu@align \tabu@aligndefault \fi\fi}% + \else % \preamble + \gdef\tabu@preamble {% + \global\let\tabu@preamble \@undefined + #2% + \ifx \tabu@align\tabu@aligndefault@text + \ifnum \tabu@nested=\z@ + \let\tabu@align \tabu@aligndefault \fi\fi}% + \fi + #3}% +}% \tabu@s@ved +\def\tabu@aligndefault@text {\tabu@aligndefault}% +\def\tabu@warn@usetabu {\PackageWarning{tabu} + {Specifying a target with \string\usetabu\space is useless + \MessageBreak The target cannot be changed!}} +\def\tabu@savewd #1#2{\ifdim #2\p@<\z@ \tabu@wddef{#1}{\tabu@wd{#1}}\fi} +\def\tabu@savewarn#1#2{\PackageInfo{tabu} + {User-name `#1' already used for \string\savetabu + \MessageBreak #2}}% +\def\tabu@saveerr#1{\PackageError{tabu} + {User-name `#1' is unknown for \string\usetabu + \MessageBreak I cannot restore an unknown preamble!}\@ehd} +%% \rowfont --------------------------------------------------------- +\newskip \tabu@cellskip +\def\tabu@rowfont{\ifdim \baselineskip=\z@\noalign\fi + {\ifnum0=`}\fi \tabu@row@font} +\newcommand*\tabu@row@font[2][]{% + \ifnum7=\currentgrouptype + \global\let\tabu@@cellleft \tabu@cellleft + \global\let\tabu@@cellright \tabu@cellright + \global\let\tabu@@celllalign \tabu@celllalign + \global\let\tabu@@cellralign \tabu@cellralign + \global\let\tabu@@rowfontreset\tabu@rowfontreset + \fi + \global\let\tabu@rowfontreset \tabu@rowfont@reset + \expandafter\gdef\expandafter\tabu@cellleft\expandafter{\tabu@cellleft #2}% + \ifcsname tabu@cell@#1\endcsname % row alignment + \csname tabu@cell@#1\endcsname \fi + \ifnum0=`{\fi}% end of group / noalign group +}% \rowfont +\def\tabu@ifcolorleavevmode #1{\let\color \tabu@leavevmodecolor #1\let\color\tabu@color}% +\def\tabu@rowfont@reset{% + \global\let\tabu@rowfontreset \tabu@@rowfontreset + \global\let\tabu@cellleft \tabu@@cellleft + \global\let\tabu@cellright \tabu@@cellright + \global\let\tabu@cellfont \@empty + \global\let\tabu@celllalign \tabu@@celllalign + \global\let\tabu@cellralign \tabu@@cellralign +}% \tabu@@rowfontreset +\let\tabu@rowfontreset \@empty % overwritten \AtBeginDocument if colortbl +%% \tabu@prepnext@tok ----------------------------------------------- +\newif \iftabu@cellright +\def\tabu@prepnext@tok{% + \ifnum \count@<\z@ % + \@tempcnta \@M % + \tabu@nbcols\z@ + \let\tabu@fornoopORI \@fornoop + \tabu@cellrightfalse + \else + \ifcase \numexpr \count@-\@tempcnta \relax % (case 0): prev. token is left + \advance \tabu@nbcols \@ne + \iftabu@cellright % before-previous token is right and is finished + \tabu@cellrightfalse % + \tabu@righttok + \fi + \tabu@lefttok + \or % (case 1) previous token is right + \tabu@cellrighttrue \let\@fornoop \tabu@lastnoop + \else % special column: do not change the token + \iftabu@cellright % before-previous token is right + \tabu@cellrightfalse + \tabu@righttok + \fi + \fi % \ifcase + \fi + \tabu@prepnext@tokORI +}% \tabu@prepnext@tok +\long\def\tabu@lastnoop#1\@@#2#3{\tabu@lastn@@p #2\@nextchar \in@\in@@} +\def\tabu@lastn@@p #1\@nextchar #2#3\in@@{% + \ifx \in@#2\else + \let\@fornoop \tabu@fornoopORI + \xdef\tabu@mkpreambuffer{\tabu@nbcols\the\tabu@nbcols \tabu@mkpreambuffer}% + \toks0\expandafter{\expandafter\tabu@everyrowtrue \the\toks0}% + \expandafter\prepnext@tok + \fi +}% \tabu@lastnoop +\def\tabu@righttok{% + \advance \count@ \m@ne + \toks\count@\expandafter {\the\toks\count@ \tabu@cellright \tabu@cellralign}% + \advance \count@ \@ne +}% \tabu@righttok +\def\tabu@lefttok{\toks\count@\expandafter{\expandafter\tabu@celllalign + \the\toks\count@ \tabu@cellleft}% after because of $ +}% \tabu@lefttok +%% Neutralisation of glues ------------------------------------------ +\let\tabu@cellleft \@empty +\let\tabu@cellright \@empty +\tabu@celllalign@def{\tabu@cellleft}% +\let\tabu@cellralign \@empty +\def\tabu@cell@align #1#2#3{% + \let\tabu@maybesiunitx \toks@ \tabu@celllalign + \global \expandafter \tabu@celllalign@def \expandafter {\the\toks@ #1}% + \toks@\expandafter{\tabu@cellralign #2}% + \xdef\tabu@cellralign{\the\toks@}% + \toks@\expandafter{\tabu@cellleft #3}% + \xdef\tabu@cellleft{\the\toks@}% +}% \tabu@cell@align +\def\tabu@cell@l{% force alignment to left + \tabu@cell@align + {\tabu@removehfil \raggedright \tabu@cellleft}% left + {\tabu@flush1\tabu@ignorehfil}% right + \raggedright +}% \tabu@cell@l +\def\tabu@cell@c{% force alignment to center + \tabu@cell@align + {\tabu@removehfil \centering \tabu@flush{.5}\tabu@cellleft} + {\tabu@flush{.5}\tabu@ignorehfil} + \centering +}% \tabu@cell@c +\def\tabu@cell@r{% force alignment to right + \tabu@cell@align + {\tabu@removehfil \raggedleft \tabu@flush1\tabu@cellleft} + \tabu@ignorehfil + \raggedleft +}% \tabu@cell@r +\def\tabu@cell@j{% force justification (for p, m, b columns) + \tabu@cell@align + {\tabu@justify\tabu@cellleft} + {} + \tabu@justify +}% \tabu@cell@j +\def\tabu@justify{% + \leftskip\z@skip \@rightskip\leftskip \rightskip\@rightskip + \parfillskip\@flushglue +}% \tabu@justify +%% ragged2e settings +\def\tabu@cell@L{% force alignment to left (ragged2e) + \tabu@cell@align + {\tabu@removehfil \RaggedRight \tabu@cellleft} + {\tabu@flush 1\tabu@ignorehfil} + \RaggedRight +}% \tabu@cell@L +\def\tabu@cell@C{% force alignment to center (ragged2e) + \tabu@cell@align + {\tabu@removehfil \Centering \tabu@flush{.5}\tabu@cellleft} + {\tabu@flush{.5}\tabu@ignorehfil} + \Centering +}% \tabu@cell@C +\def\tabu@cell@R{% force alignment to right (ragged2e) + \tabu@cell@align + {\tabu@removehfil \RaggedLeft \tabu@flush 1\tabu@cellleft} + \tabu@ignorehfil + \RaggedLeft +}% \tabu@cell@R +\def\tabu@cell@J{% force justification (ragged2e) + \tabu@cell@align + {\justifying \tabu@cellleft} + {} + \justifying +}% \tabu@cell@J +\def\tabu@flush#1{% + \iftabu@colortbl % colortbl uses \hfill rather than \hfil + \hskip \ifnum13<\currentgrouptype \stretch{#1}% + \else \ifdim#1pt<\p@ \tabu@cellskip + \else \stretch{#1} + \fi\fi \relax + \else % array.sty + \ifnum 13<\currentgrouptype + \hfil \hskip1sp \relax \fi + \fi +}% \tabu@flush +\let\tabu@hfil \hfil +\let\tabu@hfill \hfill +\let\tabu@hskip \hskip +\def\tabu@removehfil{% + \iftabu@colortbl + \unkern \tabu@cellskip =\lastskip + \ifnum\gluestretchorder\tabu@cellskip =\tw@ \hskip-\tabu@cellskip + \else \tabu@cellskip \z@skip + \fi + \else + \ifdim\lastskip=1sp\unskip\fi + \ifnum\gluestretchorder\lastskip =\@ne + \hfilneg % \hfilneg for array.sty but not for colortbl... + \fi + \fi +}% \tabu@removehfil +\def\tabu@ignorehfil{\aftergroup \tabu@nohfil} +\def\tabu@nohfil{% \hfil -> do nothing + restore original \hfil + \def\hfil{\let\hfil \tabu@hfil}% local to (alignment template) group +}% \tabu@nohfil +\def\tabu@colortblalignments {% if colortbl + \def\tabu@nohfil{% + \def\hfil {\let\hfil \tabu@hfil}% local to (alignment template) group + \def\hfill {\let\hfill \tabu@hfill}% (colortbl uses \hfill) pfff... + \def\hskip ####1\relax{\let\hskip \tabu@hskip}}% local +}% \tabu@colortblalignments +%% Taking care of footnotes and hyperfootnotes ---------------------- +\long\def\tabu@footnotetext #1{% + \edef\@tempa{\the\tabu@footnotes + \noexpand\footnotetext [\the\csname c@\@mpfn\endcsname]}% + \global\tabu@footnotes\expandafter{\@tempa {#1}}}% +\long\def\tabu@xfootnotetext [#1]#2{% + \global\tabu@footnotes\expandafter{\the\tabu@footnotes + \footnotetext [{#1}]{#2}}} +\let\tabu@xfootnote \@xfootnote +\long\def\tabu@Hy@ftntext{\tabu@Hy@ftntxt {\the \c@footnote }} +\long\def\tabu@Hy@xfootnote [#1]{% + \begingroup + \value\@mpfn #1\relax + \protected@xdef \@thefnmark {\thempfn}% + \endgroup + \@footnotemark \tabu@Hy@ftntxt {#1}% +}% \tabu@Hy@xfootnote +\long\def\tabu@Hy@ftntxt #1#2{% + \edef\@tempa{% + \the\tabu@footnotes + \begingroup + \value\@mpfn #1\relax + \noexpand\protected@xdef\noexpand\@thefnmark {\noexpand\thempfn}% + \expandafter \noexpand \expandafter + \tabu@Hy@footnotetext \expandafter{\Hy@footnote@currentHref}% + }% + \global\tabu@footnotes\expandafter{\@tempa {#2}% + \endgroup}% +}% \tabu@Hy@ftntxt +\long\def\tabu@Hy@footnotetext #1#2{% + \H@@footnotetext{% + \ifHy@nesting + \hyper@@anchor {#1}{#2}% + \else + \Hy@raisedlink{% + \hyper@@anchor {#1}{\relax}% + }% + \def\@currentHref {#1}% + \let\@currentlabelname \@empty + #2% + \fi + }% +}% \tabu@Hy@footnotetext +%% No need for \arraybackslash ! ------------------------------------ +\def\tabu@latextwoe {% +\def\tabu@temp##1##2##3{{\toks@\expandafter{##2##3}\xdef##1{\the\toks@}}} +\tabu@temp \tabu@centering \centering \arraybackslash +\tabu@temp \tabu@raggedleft \raggedleft \arraybackslash +\tabu@temp \tabu@raggedright \raggedright \arraybackslash +}% \tabu@latextwoe +\def\tabu@raggedtwoe {% +\def\tabu@temp ##1##2##3{{\toks@\expandafter{##2##3}\xdef##1{\the\toks@}}} +\tabu@temp \tabu@Centering \Centering \arraybackslash +\tabu@temp \tabu@RaggedLeft \RaggedLeft \arraybackslash +\tabu@temp \tabu@RaggedRight \RaggedRight \arraybackslash +\tabu@temp \tabu@justifying \justifying \arraybackslash +}% \tabu@raggedtwoe +\def\tabu@normalcrbackslash{\let\\\@normalcr} +\def\tabu@trivlist{\expandafter\def\expandafter\@trivlist\expandafter{% + \expandafter\tabu@normalcrbackslash \@trivlist}} +%% Utilities: \fbox \fcolorbox and \tabudecimal ------------------- +\def\tabu@fbox {\leavevmode\afterassignment\tabu@beginfbox \setbox\@tempboxa\hbox} +\def\tabu@beginfbox {\bgroup \kern\fboxsep + \bgroup\aftergroup\tabu@endfbox} +\def\tabu@endfbox {\kern\fboxsep\egroup\egroup + \@frameb@x\relax} +\def\tabu@color@b@x #1#2{\leavevmode \bgroup + \def\tabu@docolor@b@x{#1{#2\color@block{\wd\z@}{\ht\z@}{\dp\z@}\box\z@}}% + \afterassignment\tabu@begincolor@b@x \setbox\z@ \hbox +}% \tabu@color@b@x +\def\tabu@begincolor@b@x {\kern\fboxsep \bgroup + \aftergroup\tabu@endcolor@b@x \set@color} +\def\tabu@endcolor@b@x {\kern\fboxsep \egroup + \dimen@\ht\z@ \advance\dimen@ \fboxsep \ht\z@ \dimen@ + \dimen@\dp\z@ \advance\dimen@ \fboxsep \dp\z@ \dimen@ + \tabu@docolor@b@x \egroup +}% \tabu@endcolor@b@x +%% Corrections (arydshln, delarray, colortbl) ----------------------- +\def\tabu@fix@arrayright {%% \@arrayright is missing from \endarray + \iftabu@colortbl + \ifdefined\adl@array % + \def\tabu@endarray{% + \adl@endarray \egroup \adl@arrayrestore \CT@end \egroup % + \@arrayright % + \gdef\@preamble{}}% + \else % + \def\tabu@endarray{% + \crcr \egroup \egroup % + \@arrayright % + \gdef\@preamble{}\CT@end}% + \fi + \else + \ifdefined\adl@array % + \def\tabu@endarray{% + \adl@endarray \egroup \adl@arrayrestore \egroup % + \@arrayright % + \gdef\@preamble{}}% + \else % + \PackageWarning{tabu} + {\string\@arrayright\space is missing from the + \MessageBreak definition of \string\endarray. + \MessageBreak Compatibility with delarray.sty is broken.}% + \fi\fi +}% \tabu@fix@arrayright +\def\tabu@adl@xarraydashrule #1#2#3{% + \ifnum\@lastchclass=\adl@class@start\else + \ifnum\@lastchclass=\@ne\else + \ifnum\@lastchclass=5 \else % @-arg (class 5) and !-arg (class 1) + \adl@leftrulefalse \fi\fi % must be treated the same + \fi + \ifadl@zwvrule\else \ifadl@inactive\else + \@addtopreamble{\vrule\@width\arrayrulewidth + \@height\z@ \@depth\z@}\fi \fi + \ifadl@leftrule + \@addtopreamble{\adl@vlineL{\CT@arc@}{\adl@dashgapcolor}% + {\number#1}#3}% + \else \@addtopreamble{\adl@vlineR{\CT@arc@}{\adl@dashgapcolor}% + {\number#2}#3} + \fi +}% \tabu@adl@xarraydashrule +\def\tabu@adl@act@endpbox {% + \unskip \ifhmode \nobreak \fi \@finalstrut \@arstrutbox + \egroup \egroup + \adl@colhtdp \box\adl@box \hfil +}% \tabu@adl@act@endpbox +\def\tabu@adl@fix {% + \let\adl@xarraydashrule \tabu@adl@xarraydashrule % arydshln + \let\adl@act@endpbox \tabu@adl@act@endpbox % arydshln + \let\adl@act@@endpbox \tabu@adl@act@endpbox % arydshln + \let\@preamerror \@preamerr % arydshln +}% \tabu@adl@fix +%% Correction for longtable' \@startbox definition ------------------ +%% => \everypar is ``missing'' : TeX should be in vertical mode +\def\tabu@LT@startpbox #1{% + \bgroup + \let\@footnotetext\LT@p@ftntext + \setlength\hsize{#1}% + \@arrayparboxrestore + \everypar{% + \vrule \@height \ht\@arstrutbox \@width \z@ + \everypar{}}% +}% \tabu@LT@startpbox +%% \tracingtabu and the package options ------------------ +\DeclareOption{delarray}{\AtEndOfPackage{\RequirePackage{delarray}}} +\DeclareOption{linegoal}{% + \AtEndOfPackage{% + \RequirePackage{linegoal}[2010/12/07]% + \let\tabudefaulttarget \linegoal% \linegoal is \linewidth if not pdfTeX +}} +\DeclareOption{scantokens}{\tabuscantokenstrue} +\DeclareOption{debugshow}{\AtEndOfPackage{\tracingtabu=\tw@}} +\def\tracingtabu {\begingroup\@ifnextchar=% + {\afterassignment\tabu@tracing\count@} + {\afterassignment\tabu@tracing\count@1\relax}} +\def\tabu@tracing{\expandafter\endgroup + \expandafter\tabu@tr@cing \the\count@ \relax +}% \tabu@tracing +\def\tabu@tr@cing #1\relax {% + \ifnum#1>\thr@@ \let\tabu@tracinglines\message + \else \let\tabu@tracinglines\@gobble + \fi + \ifnum#1>\tw@ \let\tabu@DBG \tabu@@DBG + \def\tabu@mkarstrut {\tabu@DBG@arstrut}% + \tabustrutrule 1.5\p@ + \else \let\tabu@DBG \@gobble + \def\tabu@mkarstrut {\tabu@arstrut}% + \tabustrutrule \z@ + \fi + \ifnum#1>\@ne \let\tabu@debug \message + \else \let\tabu@debug \@gobble + \fi + \ifnum#1>\z@ + \let\tabu@message \message + \let\tabu@tracing@save \tabu@message@save + \let\tabu@starttimer \tabu@pdftimer + \else + \let\tabu@message \@gobble + \let\tabu@tracing@save \@gobble + \let\tabu@starttimer \relax + \fi +}% \tabu@tr@cing +%% Setup \AtBeginDocument +\AtBeginDocument{\tabu@AtBeginDocument} +\def\tabu@AtBeginDocument{\let\tabu@AtBeginDocument \@undefined + \ifdefined\arrayrulecolor \tabu@colortbltrue % + \tabu@colortblalignments % different glues are used + \else \tabu@colortblfalse \fi + \ifdefined\CT@arc@ \else \let\CT@arc@ \relax \fi + \ifdefined\CT@drsc@\else \let\CT@drsc@ \relax \fi + \let\tabu@arc@L \CT@arc@ \let\tabu@drsc@L \CT@drsc@ + \ifodd 1\ifcsname siunitx_table_collect_begin:Nn\endcsname % + \expandafter\ifx + \csname siunitx_table_collect_begin:Nn\endcsname\relax 0\fi\fi\relax + \tabu@siunitxtrue + \else \let\tabu@maybesiunitx \@firstofone % + \let\tabu@siunitx \tabu@nosiunitx + \tabu@siunitxfalse + \fi + \ifdefined\adl@array % + \else \let\tabu@adl@fix \relax + \let\tabu@adl@endtrial \@empty \fi + \ifdefined\longtable % + \else \let\longtabu \tabu@nolongtabu \fi + \ifdefined\cellspacetoplimit \tabu@warn@cellspace\fi + \csname\ifcsname ifHy@hyperfootnotes\endcsname % + ifHy@hyperfootnotes\else iffalse\fi\endcsname + \let\tabu@footnotetext \tabu@Hy@ftntext + \let\tabu@xfootnote \tabu@Hy@xfootnote \fi + \ifdefined\FV@DefineCheckEnd% + \tabu@fancyvrb \fi + \ifdefined\color % + \let\tabu@color \color + \def\tabu@leavevmodecolor ##1{% + \def\tabu@leavevmodecolor {\leavevmode ##1}% + }\expandafter\tabu@leavevmodecolor\expandafter{\color}% + \else + \let\tabu@color \tabu@nocolor + \let\tabu@leavevmodecolor \@firstofone \fi + \tabu@latextwoe + \ifdefined\@raggedtwoe@everyselectfont % + \tabu@raggedtwoe + \else + \let\tabu@cell@L \tabu@cell@l + \let\tabu@cell@R \tabu@cell@r + \let\tabu@cell@C \tabu@cell@c + \let\tabu@cell@J \tabu@cell@j \fi + \expandafter\in@ \expandafter\@arrayright \expandafter{\endarray}% + \ifin@ \let\tabu@endarray \endarray + \else \tabu@fix@arrayright \fi% + \everyrow{}% +}% \tabu@AtBeginDocument +\def\tabu@warn@cellspace{% + \PackageWarning{tabu}{% + Package cellspace has some limitations + \MessageBreak And redefines some macros of array.sty. + \MessageBreak Please use \string\tabulinesep\space to control + \MessageBreak vertical spacing of lines inside tabu environment}% +}% \tabu@warn@cellspace +%% tabu Package initialisation +\tabuscantokensfalse +\let\tabu@arc@G \relax +\let\tabu@drsc@G \relax +\let\tabu@evr@G \@empty +\let\tabu@rc@G \@empty +\def\tabu@ls@G {\tabu@linestyle@}% +\let\tabu@@rowfontreset \@empty % +\let\tabu@@celllalign \@empty +\let\tabu@@cellralign \@empty +\let\tabu@@cellleft \@empty +\let\tabu@@cellright \@empty +\def\tabu@naturalXmin {\z@} +\def\tabu@naturalXmax {\z@} +\let\tabu@rowfontreset \@empty +\def\tabulineon {4pt}\let\tabulineoff \tabulineon +\tabu@everyrowtrue +\ifdefined\pdfelapsedtime % + \def\tabu@pdftimer {\xdef\tabu@starttime{\the\pdfelapsedtime}}% +\else \let\tabu@pdftimer \relax \let\tabu@message@etime \relax +\fi +\tracingtabu=\z@ +\newtabulinestyle {=\maxdimen}% creates the 'factory' settings \tabu@linestyle@ +\tabulinestyle{} +\taburowcolors{} +\let\tabudefaulttarget \linewidth +\ProcessOptions* % \ProcessOptions* is quicker ! +\endinput +%% +%% End of file `tabu.sty'. diff --git a/doxygen/html/functions.html b/doxygen/html/functions.html deleted file mode 100644 index cac1456..0000000 --- a/doxygen/html/functions.html +++ /dev/null @@ -1,265 +0,0 @@ - - - - - - - -airlib: Class Members - - - - - - - - - -
-
- - - - - - -
-
airlib -
-
-
- - - - - - - -
- -
-
- - -
-
-
-
-
-
Loading...
-
Searching...
-
No Matches
-
-
-
-
- -
-
Here is a list of all class members with links to the classes they belong to:
- -

- a -

- - -

- b -

- - -

- c -

- - -

- d -

- - -

- e -

- - -

- f -

- - -

- g -

- - -

- i -

- - -

- j -

- - -

- l -

- - -

- m -

- - -

- o -

- - -

- p -

- - -

- q -

- - -

- r -

- - -

- s -

- - -

- t -

- - -

- u -

- - -

- w -

- - -

- x -

- - -

- y -

- - -

- z -

- - -

- ~ -

-
- - - - diff --git a/doxygen/html/functions_func.html b/doxygen/html/functions_func.html deleted file mode 100644 index da1bbbe..0000000 --- a/doxygen/html/functions_func.html +++ /dev/null @@ -1,212 +0,0 @@ - - - - - - - -airlib: Class Members - Functions - - - - - - - - - -
-
- - - - - - -
-
airlib -
-
-
- - - - - - - -
- -
-
- - -
-
-
-
-
-
Loading...
-
Searching...
-
No Matches
-
-
-
-
- -
-  - -

- a -

- - -

- c -

- - -

- d -

- - -

- e -

- - -

- f -

- - -

- g -

- - -

- i -

- - -

- j -

- - -

- l -

- - -

- m -

- - -

- o -

- - -

- p -

- - -

- q -

- - -

- r -

- - -

- s -

- - -

- t -

- - -

- u -

- - -

- w -

- - -

- ~ -

-
- - - - diff --git a/doxygen/html/functions_vars.html b/doxygen/html/functions_vars.html deleted file mode 100644 index 8a2328a..0000000 --- a/doxygen/html/functions_vars.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - -airlib: Class Members - Variables - - - - - - - - - -
-
- - - - - - -
-
airlib -
-
-
- - - - - - - -
- -
-
- - -
-
-
-
-
-
Loading...
-
Searching...
-
No Matches
-
-
-
-
- -
-  - -

- a -

- - -

- c -

- - -

- d -

- - -

- i -

- - -

- l -

- - -

- m -

- - -

- p -

- - -

- r -

- - -

- s -

- - -

- t -

- - -

- w -

- - -

- x -

- - -

- y -

- - -

- z -

-
- - - - diff --git a/doxygen/html/particle__filter_8h_source.html b/doxygen/html/particle__filter_8h_source.html deleted file mode 100644 index 6d64dbf..0000000 --- a/doxygen/html/particle__filter_8h_source.html +++ /dev/null @@ -1,341 +0,0 @@ - - - - - - - -airlib: include/airlib/localization/Filters/particle_filter.h Source File - - - - - - - - - -
-
- - - - - - -
-
airlib -
-
-
- - - - - - - - -
-
- - -
-
-
-
-
-
Loading...
-
Searching...
-
No Matches
-
-
-
-
- - -
-
-
particle_filter.h
-
-
-Go to the documentation of this file.
1/*
-
2 * particle_filter.h
-
3 *
-
4 * 2D particle filter class.
-
5 */
-
6
-
7#ifndef PARTICLE_FILTER_H_
-
8#define PARTICLE_FILTER_H_
-
9
-
10#include <iostream>
-
11#include <utility>
-
12#include <vector>
-
13#include <numeric>
-
14#include "filters_common/helper.h"
-
15#include <Eigen/Dense>
-
16
-
17
-
18
-
19class TagMap {
-
20public:
-
21
- -
23
-
24 int id_i ; // Landmark ID
-
25 double x_d; // Landmark x-position in the map (global coordinates)
-
26 double y_d; // Landmark y-position in the map (global coordinates)
-
27 double z_d; // Landmark z-position in the map (global coordinates)
-
28 };
-
29
-
30 std::vector<single_landmark_s> landmark_list ; // List of landmarks in the map
-
31
-
32};
-
33
-
34
-
35class Mvn
-
36{
-
37public:
- -
39 const std::vector<double>& std)
-
40 {
-
41 int N = std.size() - 1;
-
42 mean.resize(N);
-
43 mean(0) = landmark.x_d;
-
44 mean(1) = landmark.y_d;
-
45 mean(2) = landmark.z_d;
-
46
-
47 sigma.resize(N, N);
-
48 for (int i = 0; i < N; ++i) {
-
49 for (int j = 0; j < N; ++j) {
-
50 sigma(i, j) = (i == j) ? std[i] * std[j] : 0.0;
-
51 }
-
52 }
-
53
-
54 sigma_inv = sigma.inverse();
-
55 sigma_det = sigma.determinant();
-
56
-
57 }
- -
59 {
-
60
-
61 }
-
62 template <typename T>
-
63 double pdf(const T& obs_m) const
-
64 {
-
65 Eigen::Vector3d x;
-
66 x << obs_m.x, obs_m.y, obs_m.z;
-
67
-
68 double n = x.rows();
-
69 double sqrt2pi = std::sqrt(2 * M_PI);
-
70 double quadform = (x - mean).transpose() * sigma_inv * (x - mean);
-
71 double norm = std::pow(sqrt2pi, - n) *
-
72 std::pow(sigma_det, - 0.5);
-
73
-
74 return norm * exp(-0.5 * quadform);
-
75 }
-
76
-
77private:
-
78 Eigen::VectorXd mean;
-
79 Eigen::MatrixXd sigma;
-
80 Eigen::MatrixXd sigma_inv;
-
81 double sigma_det;
-
82};
-
83
-
84
-
85struct Particle {
-
86
-
87 int id;
-
88 double x;
-
89 double y;
-
90 double z;
-
91 double theta;
-
92 double weight;
-
93
-
94 friend std::ostream &operator<<(std::ostream &os, const Particle &particle)
-
95 {
-
96 os << "id: " << particle.id << " x: " << particle.x << " y: " << particle.y << " z: " << particle.z << " theta: "
-
97 << particle.theta << " weight: " << particle.weight;
-
98 return os;
-
99 }
-
100
-
101};
-
102
-
103/*
-
104 * Struct representing one landmark observation measurement.
-
105 */
- -
107
-
108 int id; // Id of matching landmark in the map.
-
109 double x; // Local (vehicle coordinates) x position of landmark observation [m]
-
110 double y; // Local (vehicle coordinates) y position of landmark observation [m]
-
111 double z; // Local (vehicle coordinates) z position of landmark observation [m]
-
112};
-
113
-
114
-
115
- -
117
-
118 // Number of particles to draw
-
119 int num_particles;
-
120
-
121
-
122 // Flag, if filter is initialized
-
123 bool is_initialized;
-
124
-
125 // Vector of weights of all particles
-
126 std::vector<double> weights;
-
127
-
128 const TagMap tagMap_;
-
129 double delta_t;
-
130
-
131 Twist * cmd_;
-
132 std::vector<Mvn*> mvn_;
-
133 std::vector<double> sigma_pos_;
-
134 std::vector<double> xEst_;
-
135
-
136
-
137
-
138
-
139
-
140public:
-
141
-
142 // Set of current particles
-
143 std::vector<Particle> particles;
-
144
-
145 // Constructor
-
146 // @param M Number of particles
-
147 ParticleFilter(int num_particles, const TagMap& tagMap, double delta_t) :
-
148 num_particles(num_particles), tagMap_(tagMap), is_initialized(false), delta_t(0.03) {}
-
149 void operator()(std::vector<double>& state);
-
150 // Destructor
- -
152
-
153
-
154 }
-
155
-
156 void update_cmd(Twist *cmd)
-
157 {
-
158 cmd_ = cmd;
-
159 }
-
160
-
161 // interface
-
162 void update(const std::vector<double>& obs, std::vector<double>& result);
-
163
-
164
-
174 void init(const std::vector<double>& x0, const std::vector<double>& std);
-
175
-
185 void prediction(double delta_t, const std::vector<double>& std_pos, const Twist* cmd);
-
186
-
193 void dataAssociation(std::vector<LandmarkObs> predicted, std::vector<LandmarkObs>& observations);
-
194
-
204 void updateWeights(double sensor_range, const std::vector<double>& std_landmark, std::vector<LandmarkObs> observations,
-
205 TagMap map_landmarks);
-
206
-
211 void resample();
-
212
-
213 /*
-
214 * write Writes particle positions to a file.
-
215 * @param filename File to write particle positions to.
-
216 */
-
217 void write(std::string filename);
-
218
-
222 const bool initialized() const {
-
223 return is_initialized;
-
224 }
-
225
-
226protected:
-
227
-
228
-
229/*
-
230 * Computes the Euclidean distance between two 2D points.
-
231 * @param (x1,y1) x and y coordinates of first point
-
232 * @param (x2,y2) x and y coordinates of second point
-
233 * @output Euclidean distance between two 2D points
-
234 */
-
235 inline double dist(double x1, double y1, double z1, double x2, double y2, double z2) {
-
236 return sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) + (z2 - z1) * (z2 - z1) );
-
237 }
-
238
-
239 inline double * getError(double gt_x, double gt_y, double gt_z, double gt_theta, double pf_x, double pf_y, double pf_z, double pf_theta) {
-
240 static double error[3];
-
241 error[0] = fabs(pf_x - gt_x);
-
242 error[1] = fabs(pf_y - gt_y);
-
243 error[2] = fabs(pf_z - gt_z);
-
244 error[3] = fabs(pf_theta - gt_theta);
-
245 error[3] = fmod(error[2], 2.0 * M_PI);
-
246 if (error[3] > M_PI) {
-
247 error[3] = 2.0 * M_PI - error[3];
-
248 }
-
249 return error;
-
250 }
-
251
-
252};
-
253
-
254
-
255
-
256#endif /* PARTICLE_FILTER_H_ */
- -
Mvn(const TagMap::single_landmark_s &landmark, const std::vector< double > &std)
-
double pdf(const T &obs_m) const
- - -
void init(const std::vector< double > &x0, const std::vector< double > &std)
-
double * getError(double gt_x, double gt_y, double gt_z, double gt_theta, double pf_x, double pf_y, double pf_z, double pf_theta)
-
const bool initialized() const
-
std::vector< Particle > particles
- -
void prediction(double delta_t, const std::vector< double > &std_pos, const Twist *cmd)
-
void operator()(std::vector< double > &state)
-
void updateWeights(double sensor_range, const std::vector< double > &std_landmark, std::vector< LandmarkObs > observations, TagMap map_landmarks)
- -
double dist(double x1, double y1, double z1, double x2, double y2, double z2)
-
void update(const std::vector< double > &obs, std::vector< double > &result)
-
void dataAssociation(std::vector< LandmarkObs > predicted, std::vector< LandmarkObs > &observations)
-
ParticleFilter(int num_particles, const TagMap &tagMap, double delta_t)
-
void update_cmd(Twist *cmd)
-
void write(std::string filename)
- -
std::vector< single_landmark_s > landmark_list
- - - - - - - -
friend std::ostream & operator<<(std::ostream &os, const Particle &particle)
- - - -
double theta
-
double weight
- - - - - -
- - - - diff --git a/doxygen/html/robot__defs_8h_source.html b/doxygen/html/robot__defs_8h_source.html deleted file mode 100644 index d68a9e2..0000000 --- a/doxygen/html/robot__defs_8h_source.html +++ /dev/null @@ -1,192 +0,0 @@ - - - - - - - -airlib: include/airlib/robot_defs.h Source File - - - - - - - - - -
-
- - - - - - -
-
airlib -
-
-
- - - - - - - - -
-
- - -
-
-
-
-
-
Loading...
-
Searching...
-
No Matches
-
-
-
-
- - -
-
-
robot_defs.h
-
-
-Go to the documentation of this file.
1#pragma once
-
2#include <iostream>
-
3#include <string>
-
4#include <math.h>
-
5
-
6//const int STATE_DIM = 10;
-
7
- -
9{
-
10 double x; // x-position (in meters)
-
11 double y; // y-position (in meters)
-
12 double z; // z-position (in meters)
-
13 double theta; // z-orientation (in radians)
-
14// double vx; // x-linear velocity (in meters)
-
15// double vy; // y-linear velocity (in meters)
-
16// double vz; // z-linear velocity (in meters)
-
17// double wx; // x-angular velocity (in meters)
-
18// double wy; // y-angular velocity (in meters)
-
19// double wz; // z-angular velocity (in meters)
-
20};
-
21
-
22
-
23/* Field location structure in radial distance (r), azimuthal angle (theta), and polar angle (psi)*/
- -
25{
-
26 std::string tagName; // Index of observed marker [0-n]
-
27 double radial_distance; // Observed distance to landmark from robot position
-
28 double azimuthal_angle; // Observed bearing to landmark in the XY coordinate frame
-
29 double polar_angle; // Observed bearing to landmark in the positive Z axis,
-
30
-
31 friend std::ostream &operator<<(std::ostream &os, const MarkerObservation &observation) {
-
32 double degFactor = (180.0/3.141592653589793238463);
-
33 os << "tagName: " << observation.tagName << " radial_distance: " << observation.radial_distance
-
34 << " azimuthal_angle: " << observation.azimuthal_angle * degFactor << " polar_angle: " << observation.polar_angle * degFactor;
-
35 return os;
-
36 }
-
37
-
38};
-
39
-
40
-
41/* Field location structure */
- -
43{
-
44 std::string tagName;
-
45 double x; // x-position (in meters)
-
46 double y; // y-position (in meters)
-
47 double z; // z-position (in meters)
-
48
- -
50 {
-
51 double rho = sqrt(x * x + y * y + z * z);
-
52 double phi = atan2(x, z);
-
53 double theta = atan2(hypot(x, z), y);
-
54 return MarkerObservation{tagName, rho, theta, phi};
-
55
-
56 }
-
57
-
58 friend std::ostream &operator<<(std::ostream &os, const FieldLocation &location) {
-
59 os << "tagName: " << location.tagName << " x: " << location.x << " y: " << location.y << " z: " << location.z;
-
60 return os;
-
61 }
-
62
- -
64 {
-
65 double dx = x - other.x;
-
66 double dy = y - other.y;
-
67 double dz = z - other.z;
-
68 return FieldLocation{tagName + "-" + other.tagName, dx, dy, dz};
-
69 }
-
70
- -
72 {
-
73 double dx = x + other.x;
-
74 double dy = y + other.y;
-
75 double dz = z + other.z;
-
76 return FieldLocation{tagName, dx, dy, dz};
-
77 }
-
78
-
79 FieldLocation operator * (double scale) const
-
80 {
-
81 double dx = x * scale;
-
82 double dy = y * scale;
-
83 double dz = z * scale;
-
84 return FieldLocation{tagName, dx, dy, dz};
-
85 }
-
86};
- -
std::string tagName
Definition: robot_defs.h:44
- - -
FieldLocation operator*(double scale) const
Definition: robot_defs.h:79
- -
MarkerObservation toObservation()
Definition: robot_defs.h:49
-
FieldLocation operator+(const FieldLocation &other) const
Definition: robot_defs.h:71
-
FieldLocation operator-(const FieldLocation &other) const
Definition: robot_defs.h:63
-
friend std::ostream & operator<<(std::ostream &os, const FieldLocation &location)
Definition: robot_defs.h:58
- -
double azimuthal_angle
Definition: robot_defs.h:28
-
std::string tagName
Definition: robot_defs.h:26
-
friend std::ostream & operator<<(std::ostream &os, const MarkerObservation &observation)
Definition: robot_defs.h:31
-
double radial_distance
Definition: robot_defs.h:27
-
double polar_angle
Definition: robot_defs.h:29
- -
double theta
Definition: robot_defs.h:13
-
double z
Definition: robot_defs.h:12
-
double x
Definition: robot_defs.h:10
-
double y
Definition: robot_defs.h:11
-
- - - - diff --git a/doxygen/html/search/all_0.js b/doxygen/html/search/all_0.js deleted file mode 100644 index 5d510d2..0000000 --- a/doxygen/html/search/all_0.js +++ /dev/null @@ -1,12 +0,0 @@ -var searchData= -[ - ['addheader_0',['addHeader',['../class_logger_c_s_v.html#a2c3316d5c7c272357512d83c152232cd',1,'LoggerCSV']]], - ['addrow_1',['addRow',['../class_logger_c_s_v.html#a9c9d7e83cf30030bc380d0e31cbaceca',1,'LoggerCSV']]], - ['apriltag_5fcallback_2',['apriltag_callback',['../class_apriltag_landmarks.html#ace7326fcc563193fabaa2e4e0a92d271',1,'ApriltagLandmarks']]], - ['apriltag_5fcomplementary_5fpid_2ecpp_3',['apriltag_complementary_pid.cpp',['../apriltag__complementary__pid_8cpp.html',1,'']]], - ['apriltag_5fekf_5fpid_2ecpp_4',['apriltag_ekf_pid.cpp',['../apriltag__ekf__pid_8cpp.html',1,'']]], - ['apriltaglandmarks_5',['ApriltagLandmarks',['../class_apriltag_landmarks.html',1,'ApriltagLandmarks'],['../class_apriltag_landmarks.html#a9e32395a2cd0485d753fb0979ef8ed68',1,'ApriltagLandmarks::ApriltagLandmarks()']]], - ['apriltaglandmarks_2ecpp_6',['ApriltagLandmarks.cpp',['../_apriltag_landmarks_8cpp.html',1,'']]], - ['apriltaglandmarks_2eh_7',['ApriltagLandmarks.h',['../_apriltag_landmarks_8h.html',1,'']]], - ['azimuthal_5fangle_8',['azimuthal_angle',['../struct_marker_observation.html#a100373bce74cf49ea8870196d2acf74b',1,'MarkerObservation']]] -]; diff --git a/doxygen/html/search/all_1.js b/doxygen/html/search/all_1.js deleted file mode 100644 index 9bc098a..0000000 --- a/doxygen/html/search/all_1.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['bebop2_0',['bebop2',['../namespacebebop2.html',1,'']]], - ['bebop2_20controller_1',['Bebop2 Controller',['../md__r_e_a_d_m_e.html',1,'']]], - ['blue_2',['BLUE',['../namespacebebop2.html#a5db54b5dbc3283ac2d156b317597b5bfa3ba9d75b5521ab4bf2c90492a734c244',1,'bebop2']]], - ['buttonstate_3',['ButtonState',['../classbebop2_1_1_controller_base.html#a76352e69566212036f3d7207ce4b6cc0',1,'bebop2::ControllerBase']]] -]; diff --git a/doxygen/html/search/all_10.js b/doxygen/html/search/all_10.js deleted file mode 100644 index a0f961e..0000000 --- a/doxygen/html/search/all_10.js +++ /dev/null @@ -1,17 +0,0 @@ -var searchData= -[ - ['sensorbase_0',['SensorBase',['../class_sensor_base.html',1,'']]], - ['sensorbase_2eh_1',['SensorBase.h',['../_sensor_base_8h.html',1,'']]], - ['sensorptr_2',['SensorPtr',['../_sensor_base_8h.html#ae79ed385e2ca22ae255892167db2390c',1,'SensorBase.h']]], - ['sensors_2eh_3',['sensors.h',['../sensors_8h.html',1,'']]], - ['set_5fmarker_5fcolor_4',['set_marker_color',['../classbebop2_1_1_control_viz.html#aa520a0b7efe18ff02186c6cfcac05181',1,'bebop2::ControlViz']]], - ['set_5fmarker_5ffrom_5fpose_5',['set_marker_from_pose',['../classbebop2_1_1_control_viz.html#ae21b0f1d37929ae2378f709e201cd86c',1,'bebop2::ControlViz']]], - ['setdrone_6',['setDrone',['../classbebop2_1_1_control_viz.html#ac6141e56c2fd5936ed6f261309ca90a1',1,'bebop2::ControlViz']]], - ['single_5flandmark_5fs_7',['single_landmark_s',['../struct_tag_map_1_1single__landmark__s.html',1,'TagMap']]], - ['state_5fdim_8',['STATE_DIM',['../classbebop2_1_1_extended_kalman_filter.html#add430272eb0874b6608f17cbb0f88ad4',1,'bebop2::ExtendedKalmanFilter']]], - ['stateobserver_9',['StateObserver',['../classbebop2_1_1_state_observer.html',1,'bebop2::StateObserver'],['../classbebop2_1_1_state_observer.html#a1bfd8d999a4246192a566feed36b82b7',1,'bebop2::StateObserver::StateObserver()']]], - ['stateobserver_2ecpp_10',['StateObserver.cpp',['../_state_observer_8cpp.html',1,'']]], - ['stateobserver_2eh_11',['StateObserver.h',['../_state_observer_8h.html',1,'']]], - ['stateobserverptr_12',['StateObserverPtr',['../namespacebebop2.html#a73dc7da96dafd486f0c43a33ea064d4c',1,'bebop2']]], - ['step_5fincr_13',['STEP_INCR',['../namespacebebop2.html#a4fd8275c9f8db3ebcbd93e1ea602678b',1,'bebop2']]] -]; diff --git a/doxygen/html/search/all_11.js b/doxygen/html/search/all_11.js deleted file mode 100644 index 744776a..0000000 --- a/doxygen/html/search/all_11.js +++ /dev/null @@ -1,10 +0,0 @@ -var searchData= -[ - ['tagmap_0',['TagMap',['../class_tag_map.html',1,'']]], - ['tagname_1',['tagName',['../struct_marker_observation.html#a1de968d571f84b2943de2a8609db2c3d',1,'MarkerObservation::tagName()'],['../struct_field_location.html#a1be847da2ecefc18b2181b8d3e8a1bb2',1,'FieldLocation::tagName()']]], - ['takeoff_2',['TAKEOFF',['../classbebop2_1_1_controller_base.html#a76352e69566212036f3d7207ce4b6cc0a034f3ebd64c6dedc4232ea246cb82f0a',1,'bebop2::ControllerBase']]], - ['takeoff_5fcallback_3',['takeoff_callback',['../classbebop2_1_1_dummy_state.html#ae9bf8c28c906bd9766f6d333a9155b0b',1,'bebop2::DummyState']]], - ['theta_4',['theta',['../struct_particle.html#a589eaf4e282cf6c07036670ae48eaee2',1,'Particle::theta()'],['../struct_robot_state.html#a347039726076c6fbe8874635dfa21af0',1,'RobotState::theta()']]], - ['toobservation_5',['toObservation',['../struct_field_location.html#aba8010cdbd3ea54265db5d7cd75de44e',1,'FieldLocation']]], - ['transformtoglobalframe_6',['transformToGlobalFrame',['../class_apriltag_landmarks.html#ae1fedc5c1e5d0bba0ddfbd881269df99',1,'ApriltagLandmarks']]] -]; diff --git a/doxygen/html/search/all_12.js b/doxygen/html/search/all_12.js deleted file mode 100644 index bee37b4..0000000 --- a/doxygen/html/search/all_12.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['update_0',['update',['../classbebop2_1_1_control_viz.html#ae7bf24b46f45546fadad51a19964ede0',1,'bebop2::ControlViz::update()'],['../class_complementary_filter.html#a522291c234d0d3562cab71f591f8f328',1,'ComplementaryFilter::update()'],['../classbebop2_1_1_extended_kalman_filter.html#a222a3660fa70e667b932949cb2a59075',1,'bebop2::ExtendedKalmanFilter::update()'],['../class_filter_base.html#a6371eb4ec395f259edd15b00594c6312',1,'FilterBase::update()'],['../class_particle_filter.html#a90019fe33003b008575111640f15946c',1,'ParticleFilter::update()']]], - ['update_5fcmd_1',['update_cmd',['../classbebop2_1_1_extended_kalman_filter.html#a9b197ee9ee0c74a6a3632832666794c7',1,'bebop2::ExtendedKalmanFilter::update_cmd()'],['../class_particle_filter.html#ad8fffecf872b9241525b9dcd4ed1fea5',1,'ParticleFilter::update_cmd(Twist *cmd)']]], - ['updateweights_2',['updateWeights',['../class_particle_filter.html#a624174682b3cf3a4c71a341d1f994372',1,'ParticleFilter']]] -]; diff --git a/doxygen/html/search/all_13.js b/doxygen/html/search/all_13.js deleted file mode 100644 index 0588d50..0000000 --- a/doxygen/html/search/all_13.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['warning_0',['WARNING',['../_l_q_r_8h.html#a9e1796fdadec0df60e8d280ee783b85c',1,'LQR.h']]], - ['weight_1',['weight',['../struct_particle.html#aa010c7b3f2b60f707f14bbc26ce8b414',1,'Particle']]], - ['write_2',['write',['../class_particle_filter.html#af13313fde404befb521e3ff208a08a19',1,'ParticleFilter']]] -]; diff --git a/doxygen/html/search/all_14.js b/doxygen/html/search/all_14.js deleted file mode 100644 index 3d3b784..0000000 --- a/doxygen/html/search/all_14.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['x_0',['x',['../struct_particle.html#a1e3e5e103cee69ae9acb9c3269d009d7',1,'Particle::x()'],['../struct_landmark_obs.html#ae5a02a81f693771bbae301156e101246',1,'LandmarkObs::x()'],['../struct_robot_state.html#a7ca6f4e88ac7982242ab32cf5fba15e6',1,'RobotState::x()'],['../struct_field_location.html#a2f101b216cd1177702266249290f382b',1,'FieldLocation::x()']]], - ['x_5f_1',['X_',['../class_filter_base.html#aeb7e15b1e110d25ce56508aaecbd91e3',1,'FilterBase']]], - ['x_5faxis_5findex_2',['X_AXIS_INDEX',['../namespacebebop2.html#a3d1183926660c413534f54a30a3e9926',1,'bebop2']]], - ['x_5fd_3',['x_d',['../struct_tag_map_1_1single__landmark__s.html#a3be6096099b3026eb0d3314779d997a4',1,'TagMap::single_landmark_s']]] -]; diff --git a/doxygen/html/search/all_15.js b/doxygen/html/search/all_15.js deleted file mode 100644 index 1c13d71..0000000 --- a/doxygen/html/search/all_15.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['y_0',['y',['../struct_particle.html#a434ab690dde4422ac74ae10f6ace7a52',1,'Particle::y()'],['../struct_landmark_obs.html#a18f5101eb6de02e127ce6bca26032286',1,'LandmarkObs::y()'],['../struct_robot_state.html#ac96a8e033454034c95745aee1811ffc2',1,'RobotState::y()'],['../struct_field_location.html#a91e5558f47b388feffccf1c23a93b5e6',1,'FieldLocation::y()']]], - ['y_5faxis_5findex_1',['Y_AXIS_INDEX',['../namespacebebop2.html#ace37141259c7e75b0ffbfb6234da5cf8',1,'bebop2']]], - ['y_5fd_2',['y_d',['../struct_tag_map_1_1single__landmark__s.html#a4e87e55a7c6f9849be215f1ded19b442',1,'TagMap::single_landmark_s']]], - ['yellow_3',['YELLOW',['../namespacebebop2.html#a5db54b5dbc3283ac2d156b317597b5bfa5262f6b9940c6b77dcc59a75fa477e95',1,'bebop2']]] -]; diff --git a/doxygen/html/search/all_16.js b/doxygen/html/search/all_16.js deleted file mode 100644 index 6d6a941..0000000 --- a/doxygen/html/search/all_16.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['z_0',['z',['../struct_particle.html#a518399a50ebdd632b22d7f48e5958461',1,'Particle::z()'],['../struct_landmark_obs.html#a4bb27957f350bd05c829766946b5f724',1,'LandmarkObs::z()'],['../struct_robot_state.html#a552998092784696aaf6db9c47ab6a425',1,'RobotState::z()'],['../struct_field_location.html#a4cdf46653fc5e8fae3688924f7705897',1,'FieldLocation::z()']]], - ['z_5faxis_5findex_1',['Z_AXIS_INDEX',['../namespacebebop2.html#a68385be43a1e12d2a6c3130441467c93',1,'bebop2']]], - ['z_5fd_2',['z_d',['../struct_tag_map_1_1single__landmark__s.html#a718ca1c4ade6bfc9e79b91cd833fb6c8',1,'TagMap::single_landmark_s']]] -]; diff --git a/doxygen/html/search/all_17.js b/doxygen/html/search/all_17.js deleted file mode 100644 index bef90ab..0000000 --- a/doxygen/html/search/all_17.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['_7efilterbase_0',['~FilterBase',['../class_filter_base.html#a69cc7472a68edafc479061d0f411bbaa',1,'FilterBase']]], - ['_7eloggercsv_1',['~LoggerCSV',['../class_logger_c_s_v.html#a3241cbbbe476425821ce05204c8bba6f',1,'LoggerCSV']]], - ['_7emvn_2',['~Mvn',['../class_mvn.html#aec49f8e17feb48fbbd47f64c26565502',1,'Mvn']]], - ['_7eparticlefilter_3',['~ParticleFilter',['../class_particle_filter.html#a4f4ccdfa224f0a62c411230f7fb0cd65',1,'ParticleFilter']]] -]; diff --git a/doxygen/html/search/all_2.js b/doxygen/html/search/all_2.js deleted file mode 100644 index c18bfc0..0000000 --- a/doxygen/html/search/all_2.js +++ /dev/null @@ -1,17 +0,0 @@ -var searchData= -[ - ['calculate_0',['calculate',['../classbebop2_1_1_p_i_d.html#a9b7afa3e1573a2f673d3c7165f4e8be0',1,'bebop2::PID']]], - ['cmd_5fvel_5fcallback_1',['cmd_vel_callback',['../classbebop2_1_1_dummy_state.html#a759c288e1c05a40707af808391a0d48f',1,'bebop2::DummyState']]], - ['complementaryfilter_2',['ComplementaryFilter',['../class_complementary_filter.html',1,'ComplementaryFilter'],['../class_complementary_filter.html#a3538e9422629678ee68874ee20937aac',1,'ComplementaryFilter::ComplementaryFilter()']]], - ['complementaryfilter_2eh_3',['ComplementaryFilter.h',['../_complementary_filter_8h.html',1,'']]], - ['compute_5fcontrol_4',['compute_control',['../classbebop2_1_1_controller_base.html#a0619e69c4759098a59a2bdae5c503501',1,'bebop2::ControllerBase::compute_control()'],['../classbebop2_1_1_quad_controller_p_i_d.html#adf0cbf720225ac7b9d73aa103a82ccd8',1,'bebop2::QuadControllerPID::compute_control()']]], - ['control_5',['CONTROL',['../classbebop2_1_1_controller_base.html#a76352e69566212036f3d7207ce4b6cc0a9e134b87d5f808d52d03c5f982da417a',1,'bebop2::ControllerBase']]], - ['control_5fdim_6',['CONTROL_DIM',['../classbebop2_1_1_extended_kalman_filter.html#a864b08f6504af5b5ff0bd45dfa5c9bc8',1,'bebop2::ExtendedKalmanFilter']]], - ['controllerbase_7',['ControllerBase',['../classbebop2_1_1_controller_base.html',1,'bebop2::ControllerBase'],['../classbebop2_1_1_controller_base.html#aecd53db3daa5f49032713283163636b0',1,'bebop2::ControllerBase::ControllerBase()']]], - ['controllerbase_2ecpp_8',['ControllerBase.cpp',['../_controller_base_8cpp.html',1,'']]], - ['controllerbase_2eh_9',['ControllerBase.h',['../_controller_base_8h.html',1,'']]], - ['controlviz_10',['ControlViz',['../classbebop2_1_1_control_viz.html',1,'bebop2::ControlViz'],['../classbebop2_1_1_control_viz.html#aad6dd4782c5662f432a5fca0d44fb1f2',1,'bebop2::ControlViz::ControlViz()']]], - ['controlviz_2ecpp_11',['ControlViz.cpp',['../_control_viz_8cpp.html',1,'']]], - ['controlviz_2eh_12',['ControlViz.h',['../_control_viz_8h.html',1,'']]], - ['cyan_13',['CYAN',['../namespacebebop2.html#a5db54b5dbc3283ac2d156b317597b5bfa44c9a43229973ff5a8cc20e691444da5',1,'bebop2']]] -]; diff --git a/doxygen/html/search/all_3.js b/doxygen/html/search/all_3.js deleted file mode 100644 index 1b52418..0000000 --- a/doxygen/html/search/all_3.js +++ /dev/null @@ -1,13 +0,0 @@ -var searchData= -[ - ['dataassociation_0',['dataAssociation',['../class_particle_filter.html#abe77ed78890ea19a87a19c6cbad9a5b9',1,'ParticleFilter']]], - ['dead_5fzone_1',['DEAD_ZONE',['../namespacebebop2.html#a6338d1064f32f481f613f760641cb849',1,'bebop2']]], - ['debug_2',['DEBUG',['../_l_q_r_8h.html#a3dfa58b1c5c2943dd49d8aa1981d377d',1,'LQR.h']]], - ['dist_3',['dist',['../class_particle_filter.html#a8589bf33200bca543a8a54caecf7ad14',1,'ParticleFilter']]], - ['dt_4',['DT',['../classbebop2_1_1_extended_kalman_filter.html#ace00431562f973d1e277e0fdf9249c82',1,'bebop2::ExtendedKalmanFilter']]], - ['dt_5f_5',['dt_',['../classbebop2_1_1_controller_base.html#a2b0de02e8c727752a1dad0a2857f2013',1,'bebop2::ControllerBase']]], - ['dummy_5fekf_5fpid_2ecpp_6',['dummy_ekf_pid.cpp',['../dummy__ekf__pid_8cpp.html',1,'']]], - ['dummystate_7',['DummyState',['../classbebop2_1_1_dummy_state.html',1,'bebop2::DummyState'],['../classbebop2_1_1_dummy_state.html#aa704cb1fb20c0a80e881478b07af2118',1,'bebop2::DummyState::DummyState()']]], - ['dummystate_2ecpp_8',['DummyState.cpp',['../_dummy_state_8cpp.html',1,'']]], - ['dummystate_2eh_9',['DummyState.h',['../_dummy_state_8h.html',1,'']]] -]; diff --git a/doxygen/html/search/all_4.js b/doxygen/html/search/all_4.js deleted file mode 100644 index 66340b4..0000000 --- a/doxygen/html/search/all_4.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['empty_0',['empty',['../class_apriltag_landmarks.html#adb855b900e2500bd2cb7b832b6a06d5d',1,'ApriltagLandmarks::empty()'],['../classbebop2_1_1_dummy_state.html#af718a706c941fb6cf3e283f8ff51965b',1,'bebop2::DummyState::empty()'],['../class_sensor_base.html#a4f481426253035b3a39162d107f52a38',1,'SensorBase::empty()']]], - ['engage_1',['ENGAGE',['../classbebop2_1_1_controller_base.html#a76352e69566212036f3d7207ce4b6cc0aa78035010c11ea80cefb7f54823d5083',1,'bebop2::ControllerBase']]], - ['eps_2',['EPS',['../_l_q_r_8h.html#a6ebf6899d6c1c8b7b9d09be872c05aae',1,'LQR.h']]], - ['extendedkalmanfilter_3',['ExtendedKalmanFilter',['../classbebop2_1_1_extended_kalman_filter.html',1,'bebop2::ExtendedKalmanFilter'],['../classbebop2_1_1_extended_kalman_filter.html#acdff0e290cf27a84a68097a653245f37',1,'bebop2::ExtendedKalmanFilter::ExtendedKalmanFilter()']]], - ['extendedkalmanfilter_2ecpp_4',['ExtendedKalmanFilter.cpp',['../_extended_kalman_filter_8cpp.html',1,'']]], - ['extendedkalmanfilter_2eh_5',['ExtendedKalmanFilter.h',['../_extended_kalman_filter_8h.html',1,'']]] -]; diff --git a/doxygen/html/search/all_5.js b/doxygen/html/search/all_5.js deleted file mode 100644 index d1b949d..0000000 --- a/doxygen/html/search/all_5.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['fieldlocation_0',['FieldLocation',['../struct_field_location.html',1,'']]], - ['filterbase_1',['FilterBase',['../class_filter_base.html',1,'FilterBase'],['../class_filter_base.html#ab4c3dc4501905d2d7d17d4d96ffbd6eb',1,'FilterBase::FilterBase()']]], - ['filterbase_2eh_2',['FilterBase.h',['../_filter_base_8h.html',1,'']]], - ['filterptr_3',['FilterPtr',['../_filter_base_8h.html#aec1719f7c37e43544283ed24fab742c9',1,'FilterBase.h']]], - ['filters_2eh_4',['filters.h',['../filters_8h.html',1,'']]] -]; diff --git a/doxygen/html/search/all_6.js b/doxygen/html/search/all_6.js deleted file mode 100644 index a72879f..0000000 --- a/doxygen/html/search/all_6.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['geterror_0',['getError',['../class_particle_filter.html#a1d90b6ed0e0e88f21d21dd324698ea7a',1,'ParticleFilter']]], - ['getptr_1',['getPtr',['../class_filter_base.html#a7ea28d3367b18f79a586e75546005172',1,'FilterBase::getPtr()'],['../class_sensor_base.html#aacd7a71d84767414807a14b34a5ad7c6',1,'SensorBase::getPtr()']]], - ['gettimestamp_2',['getTimestamp',['../class_logger_c_s_v.html#a34f36a942a6fecb0cacf720f43774b44',1,'LoggerCSV']]], - ['goal_5fdistance_3',['goal_distance',['../classbebop2_1_1_controller_base.html#adcc0fee29e5f7b7f6a19a640955eb652',1,'bebop2::ControllerBase']]], - ['gray_4',['GRAY',['../namespacebebop2.html#a5db54b5dbc3283ac2d156b317597b5bfa3bdf1108294862aab590f14ae8b19962',1,'bebop2']]], - ['green_5',['GREEN',['../namespacebebop2.html#a5db54b5dbc3283ac2d156b317597b5bfa60ee5eacf4c977d6bb56b14d659b4acb',1,'bebop2']]] -]; diff --git a/doxygen/html/search/all_7.js b/doxygen/html/search/all_7.js deleted file mode 100644 index ce3518a..0000000 --- a/doxygen/html/search/all_7.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['id_0',['id',['../struct_particle.html#a544b202775517f8ba05efcb9e0a21bee',1,'Particle::id()'],['../struct_landmark_obs.html#a102b941ef9037ff29102efbfd2c9043e',1,'LandmarkObs::id()']]], - ['id_5fi_1',['id_i',['../struct_tag_map_1_1single__landmark__s.html#a083fbd02bc345db3c25551765f4332c2',1,'TagMap::single_landmark_s']]], - ['idle_2',['IDLE',['../classbebop2_1_1_controller_base.html#a76352e69566212036f3d7207ce4b6cc0a2eb4f2f58d711bb2fc7cf6443830e41b',1,'bebop2::ControllerBase']]], - ['init_3',['init',['../classbebop2_1_1_p_i_d.html#a3bdaa787b389dc3c1ce287110bd5adb8',1,'bebop2::PID::init()'],['../class_complementary_filter.html#a73d1dccaf8172850b8ba2abd0875cd70',1,'ComplementaryFilter::init()'],['../classbebop2_1_1_extended_kalman_filter.html#a93b97c85025a9792558c02baa4ec6388',1,'bebop2::ExtendedKalmanFilter::init()'],['../class_filter_base.html#a67503fcfa27c21d3d0adb6570ec0a7da',1,'FilterBase::init()'],['../class_particle_filter.html#a11d7f5a1aba6a649dc9d0cb661fa014d',1,'ParticleFilter::init(const std::vector< double > &x0, const std::vector< double > &std)']]], - ['initialized_4',['initialized',['../class_particle_filter.html#a21191cc75e036c60f1b2a3965a241266',1,'ParticleFilter']]], - ['internal_5fupdate_5',['internal_update',['../classbebop2_1_1_extended_kalman_filter.html#a9780edd80082973223723de463046506',1,'bebop2::ExtendedKalmanFilter']]] -]; diff --git a/doxygen/html/search/all_8.js b/doxygen/html/search/all_8.js deleted file mode 100644 index 9c2110b..0000000 --- a/doxygen/html/search/all_8.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['jacobf_0',['jacobF',['../classbebop2_1_1_extended_kalman_filter.html#a099b533a912aa76f92b7a820c3086f54',1,'bebop2::ExtendedKalmanFilter']]], - ['jacobh_1',['jacobH',['../classbebop2_1_1_extended_kalman_filter.html#a98b524af05ef67b13b5319e3531cb97c',1,'bebop2::ExtendedKalmanFilter']]] -]; diff --git a/doxygen/html/search/all_9.js b/doxygen/html/search/all_9.js deleted file mode 100644 index 74fc9b4..0000000 --- a/doxygen/html/search/all_9.js +++ /dev/null @@ -1,12 +0,0 @@ -var searchData= -[ - ['land_0',['LAND',['../classbebop2_1_1_controller_base.html#a76352e69566212036f3d7207ce4b6cc0a8b7d2a81407259ab3721dfc2e6827b97',1,'bebop2::ControllerBase']]], - ['land_5fcallback_1',['land_callback',['../classbebop2_1_1_dummy_state.html#a7a06058ab728c2f955a8524f46f34c36',1,'bebop2::DummyState']]], - ['landmark_5flist_2',['landmark_list',['../class_tag_map.html#aaca48e131c1dc7c3ba30e1313aebb13f',1,'TagMap']]], - ['landmarkobs_3',['LandmarkObs',['../struct_landmark_obs.html',1,'']]], - ['loggercsv_4',['LoggerCSV',['../class_logger_c_s_v.html',1,'LoggerCSV'],['../class_logger_c_s_v.html#a727b61abcb5030665d0ab73a68ed6f6e',1,'LoggerCSV::LoggerCSV()'],['../class_logger_c_s_v.html#a0cfadbfb1cce7279e3c675a23d73ec7e',1,'LoggerCSV::LoggerCSV(const std::vector< std::string > &header)'],['../class_logger_c_s_v.html#a4730a968872141ec2ece9ef90c2d7186',1,'LoggerCSV::LoggerCSV(const std::vector< std::string > &header, const int frequency)']]], - ['loggercsv_2eh_5',['LoggerCSV.h',['../_logger_c_s_v_8h.html',1,'']]], - ['lqr_6',['LQR',['../classbebop2_1_1_l_q_r.html',1,'bebop2::LQR'],['../classbebop2_1_1_l_q_r.html#a78b5ce9848271cc53e117d1263bbd879',1,'bebop2::LQR::LQR()']]], - ['lqr_2ecpp_7',['LQR.cpp',['../_l_q_r_8cpp.html',1,'']]], - ['lqr_2eh_8',['LQR.h',['../_l_q_r_8h.html',1,'']]] -]; diff --git a/doxygen/html/search/all_a.js b/doxygen/html/search/all_a.js deleted file mode 100644 index 1c3a264..0000000 --- a/doxygen/html/search/all_a.js +++ /dev/null @@ -1,19 +0,0 @@ -var searchData= -[ - ['m_5fbuttonstate_0',['m_buttonState',['../classbebop2_1_1_controller_base.html#a587d4539796276947acfceedd74daf2c',1,'bebop2::ControllerBase']]], - ['m_5ffilter_1',['m_filter',['../classbebop2_1_1_state_observer.html#a6ededc78ab08eba61eab678ed7a7896a',1,'bebop2::StateObserver']]], - ['m_5fget_5fstate_2',['m_get_state',['../classbebop2_1_1_controller_base.html#afcf21b03e3a3c40f8173e4819a2a4230',1,'bebop2::ControllerBase']]], - ['m_5fgoal_5fthres_3',['m_goal_thres',['../classbebop2_1_1_controller_base.html#a405dcc08256f764191275e542d37a955',1,'bebop2::ControllerBase']]], - ['m_5finitialized_4',['m_initialized',['../classbebop2_1_1_state_observer.html#a4304686fa39b86122ea6892dfd472c08',1,'bebop2::StateObserver']]], - ['m_5fmu_5',['m_mu',['../classbebop2_1_1_controller_base.html#a419cc93fc0637717522429e67b63f8dd',1,'bebop2::ControllerBase']]], - ['m_5fnh_6',['m_nh',['../classbebop2_1_1_controller_base.html#add1eb5b349b755bdad661697bb184f2a',1,'bebop2::ControllerBase']]], - ['m_5fsensor_7',['m_sensor',['../classbebop2_1_1_state_observer.html#a743085128ae5fdb567d61ec1159176b8',1,'bebop2::StateObserver']]], - ['m_5fstate_8',['m_state',['../classbebop2_1_1_state_observer.html#a693f9d73394813a3209e41b46590c14f',1,'bebop2::StateObserver']]], - ['main_9',['main',['../control_2_l_q_r_2main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97',1,'main(int argc, char *argv[]): main.cpp'],['../localization_2_filters_2ekf_2main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97',1,'main(int argc, char *argv[]): main.cpp'],['../localization_2_filters_2pf_2main_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4',1,'main(): main.cpp'],['../apriltag__complementary__pid_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97',1,'main(int argc, char *argv[]): apriltag_complementary_pid.cpp'],['../apriltag__ekf__pid_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97',1,'main(int argc, char *argv[]): apriltag_ekf_pid.cpp'],['../dummy__ekf__pid_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97',1,'main(int argc, char *argv[]): dummy_ekf_pid.cpp']]], - ['main_2ecpp_10',['main.cpp',['../control_2_l_q_r_2main_8cpp.html',1,'(Global Namespace)'],['../localization_2_filters_2ekf_2main_8cpp.html',1,'(Global Namespace)'],['../localization_2_filters_2pf_2main_8cpp.html',1,'(Global Namespace)']]], - ['marker_5fcolor_11',['MARKER_COLOR',['../namespacebebop2.html#a5db54b5dbc3283ac2d156b317597b5bf',1,'bebop2']]], - ['markerobservation_12',['MarkerObservation',['../struct_marker_observation.html',1,'']]], - ['max_5fiteration_13',['MAX_ITERATION',['../_l_q_r_8h.html#aefa7672f40a44cb9b17c8fb46210d1fd',1,'LQR.h']]], - ['motion_5fmodel_14',['motion_model',['../classbebop2_1_1_extended_kalman_filter.html#ae584586d81bc66c0f46b1a5aeffe7d26',1,'bebop2::ExtendedKalmanFilter']]], - ['mvn_15',['Mvn',['../class_mvn.html',1,'Mvn'],['../class_mvn.html#a3e6c158a9d5a08050dafec14ca2f788c',1,'Mvn::Mvn()']]] -]; diff --git a/doxygen/html/search/all_b.js b/doxygen/html/search/all_b.js deleted file mode 100644 index 2d44285..0000000 --- a/doxygen/html/search/all_b.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['num_5fcontroller_0',['NUM_CONTROLLER',['../_p_i_d_8h.html#a586eceffc45bcf6e44cd7561f67fac38',1,'PID.h']]], - ['num_5fcontrols_1',['NUM_CONTROLS',['../namespacebebop2.html#ad130bb29243bfa4b86a561fee67cdade',1,'bebop2']]], - ['num_5fgains_2',['NUM_GAINS',['../_p_i_d_8h.html#abbc754940c9a64fb612517c1de0c271a',1,'PID.h']]] -]; diff --git a/doxygen/html/search/all_c.js b/doxygen/html/search/all_c.js deleted file mode 100644 index 9e10580..0000000 --- a/doxygen/html/search/all_c.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['observation_5fmodel_0',['observation_model',['../classbebop2_1_1_extended_kalman_filter.html#a555a02b112e88b63a92c230ae365b17f',1,'bebop2::ExtendedKalmanFilter']]], - ['operator_28_29_1',['operator()',['../classbebop2_1_1_extended_kalman_filter.html#a69797105ff979b3e5a602d1a87149297',1,'bebop2::ExtendedKalmanFilter::operator()()'],['../class_particle_filter.html#a60b736fab3746b834dd7cfb08fa5fb11',1,'ParticleFilter::operator()()'],['../class_apriltag_landmarks.html#a11f9b912b3f326faa40eccc67e3ba7b2',1,'ApriltagLandmarks::operator()()'],['../classbebop2_1_1_dummy_state.html#a9a18fcd35402f1d756bd052def7cfb0e',1,'bebop2::DummyState::operator()()'],['../class_sensor_base.html#ae77f79abe25a2939434e30575ea5fd30',1,'SensorBase::operator()()'],['../classbebop2_1_1_state_observer.html#a1d829045f35ed3531559f53aeb1773ca',1,'bebop2::StateObserver::operator()()']]], - ['operator_2a_2',['operator*',['../struct_field_location.html#a7da89910c0992173841458f493027814',1,'FieldLocation']]], - ['operator_2b_3',['operator+',['../struct_field_location.html#ac5966312a3d0df900873be1fa853d840',1,'FieldLocation']]], - ['operator_2d_4',['operator-',['../struct_field_location.html#ae317351db47c70444f72a68516454402',1,'FieldLocation']]], - ['operator_3c_3c_5',['operator<<',['../struct_particle.html#a2fa6df9fcd4dca7af54e59ed25db6e1f',1,'Particle::operator<<()'],['../struct_marker_observation.html#a4755337b360a2c606740ae5cc60b00e5',1,'MarkerObservation::operator<<()'],['../struct_field_location.html#ae81613697d66349de9e6bff55d3bca4d',1,'FieldLocation::operator<<()']]] -]; diff --git a/doxygen/html/search/all_d.js b/doxygen/html/search/all_d.js deleted file mode 100644 index 00d37dc..0000000 --- a/doxygen/html/search/all_d.js +++ /dev/null @@ -1,16 +0,0 @@ -var searchData= -[ - ['particle_0',['Particle',['../struct_particle.html',1,'']]], - ['particle_5ffilter_2ecpp_1',['particle_filter.cpp',['../particle__filter_8cpp.html',1,'']]], - ['particle_5ffilter_2eh_2',['particle_filter.h',['../particle__filter_8h.html',1,'']]], - ['particlefilter_3',['ParticleFilter',['../class_particle_filter.html',1,'ParticleFilter'],['../class_particle_filter.html#accc05e707b48f1a8f1a10ed318c0dc55',1,'ParticleFilter::ParticleFilter(int num_particles, const TagMap &tagMap, double delta_t)']]], - ['particles_4',['particles',['../class_particle_filter.html#a4d73f797a7a4bfffbfbb4fd6d09114f9',1,'ParticleFilter']]], - ['pdf_5',['pdf',['../class_mvn.html#a8317e80dc988ad98cf93428c4bcbfed6',1,'Mvn']]], - ['pid_6',['PID',['../classbebop2_1_1_p_i_d.html',1,'bebop2::PID'],['../classbebop2_1_1_p_i_d.html#a8c9b9e1417bdcefb64e04041d6caa339',1,'bebop2::PID::PID()']]], - ['pid_2ecpp_7',['PID.cpp',['../_p_i_d_8cpp.html',1,'']]], - ['pid_2eh_8',['PID.h',['../_p_i_d_8h.html',1,'']]], - ['polar_5fangle_9',['polar_angle',['../struct_marker_observation.html#aad670bccd0f025ea8808148e828878a2',1,'MarkerObservation']]], - ['prediction_10',['prediction',['../class_particle_filter.html#a541ece0fecb05f999382559c22454f3b',1,'ParticleFilter']]], - ['publish_5fcmd_5fvel_11',['publish_cmd_vel',['../classbebop2_1_1_controller_base.html#a644d91e6e4bc12977deff541165a6b8c',1,'bebop2::ControllerBase']]], - ['publish_5ftf_12',['publish_tf',['../class_sensor_base.html#ad56a833e43ba1c3c10cbf52024390e44',1,'SensorBase']]] -]; diff --git a/doxygen/html/search/all_e.js b/doxygen/html/search/all_e.js deleted file mode 100644 index 4de1839..0000000 --- a/doxygen/html/search/all_e.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['quadcontrollerpid_0',['QuadControllerPID',['../classbebop2_1_1_quad_controller_p_i_d.html',1,'bebop2::QuadControllerPID'],['../classbebop2_1_1_quad_controller_p_i_d.html#a9a47a9d55416b290dfba482caf970cc8',1,'bebop2::QuadControllerPID::QuadControllerPID()']]], - ['quadcontrollerpid_2ecpp_1',['QuadControllerPID.cpp',['../_quad_controller_p_i_d_8cpp.html',1,'']]], - ['quadcontrollerpid_2eh_2',['QuadControllerPID.h',['../_quad_controller_p_i_d_8h.html',1,'']]] -]; diff --git a/doxygen/html/search/all_f.js b/doxygen/html/search/all_f.js deleted file mode 100644 index c9c1c73..0000000 --- a/doxygen/html/search/all_f.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['radial_5fdistance_0',['radial_distance',['../struct_marker_observation.html#a74eaf75e45d859ee6b8f8e4bd5439bae',1,'MarkerObservation']]], - ['readme_2emd_1',['README.md',['../_r_e_a_d_m_e_8md.html',1,'']]], - ['red_2',['RED',['../namespacebebop2.html#a5db54b5dbc3283ac2d156b317597b5bfab02670d8848b739df45d4d55d704a4ae',1,'bebop2']]], - ['resample_3',['resample',['../class_particle_filter.html#a84265f4c32f6d157da1d40677c6c47cf',1,'ParticleFilter']]], - ['robot_5fdefs_2eh_4',['robot_defs.h',['../robot__defs_8h.html',1,'']]], - ['robotstate_5',['RobotState',['../struct_robot_state.html',1,'']]] -]; diff --git a/doxygen/html/search/classes_0.js b/doxygen/html/search/classes_0.js deleted file mode 100644 index fc4b943..0000000 --- a/doxygen/html/search/classes_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['apriltaglandmarks_0',['ApriltagLandmarks',['../class_apriltag_landmarks.html',1,'']]] -]; diff --git a/doxygen/html/search/classes_1.js b/doxygen/html/search/classes_1.js deleted file mode 100644 index b4f7aaa..0000000 --- a/doxygen/html/search/classes_1.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['complementaryfilter_0',['ComplementaryFilter',['../class_complementary_filter.html',1,'']]], - ['controllerbase_1',['ControllerBase',['../classbebop2_1_1_controller_base.html',1,'bebop2']]], - ['controlviz_2',['ControlViz',['../classbebop2_1_1_control_viz.html',1,'bebop2']]] -]; diff --git a/doxygen/html/search/classes_2.js b/doxygen/html/search/classes_2.js deleted file mode 100644 index 788786b..0000000 --- a/doxygen/html/search/classes_2.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['dummystate_0',['DummyState',['../classbebop2_1_1_dummy_state.html',1,'bebop2']]] -]; diff --git a/doxygen/html/search/classes_4.js b/doxygen/html/search/classes_4.js deleted file mode 100644 index cc9c06d..0000000 --- a/doxygen/html/search/classes_4.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['fieldlocation_0',['FieldLocation',['../struct_field_location.html',1,'']]], - ['filterbase_1',['FilterBase',['../class_filter_base.html',1,'']]] -]; diff --git a/doxygen/html/search/classes_5.js b/doxygen/html/search/classes_5.js deleted file mode 100644 index a52696f..0000000 --- a/doxygen/html/search/classes_5.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['landmarkobs_0',['LandmarkObs',['../struct_landmark_obs.html',1,'']]], - ['loggercsv_1',['LoggerCSV',['../class_logger_c_s_v.html',1,'']]], - ['lqr_2',['LQR',['../classbebop2_1_1_l_q_r.html',1,'bebop2']]] -]; diff --git a/doxygen/html/search/classes_6.js b/doxygen/html/search/classes_6.js deleted file mode 100644 index b6defb0..0000000 --- a/doxygen/html/search/classes_6.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['markerobservation_0',['MarkerObservation',['../struct_marker_observation.html',1,'']]], - ['mvn_1',['Mvn',['../class_mvn.html',1,'']]] -]; diff --git a/doxygen/html/search/classes_7.js b/doxygen/html/search/classes_7.js deleted file mode 100644 index 9f6e358..0000000 --- a/doxygen/html/search/classes_7.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['particle_0',['Particle',['../struct_particle.html',1,'']]], - ['particlefilter_1',['ParticleFilter',['../class_particle_filter.html',1,'']]], - ['pid_2',['PID',['../classbebop2_1_1_p_i_d.html',1,'bebop2']]] -]; diff --git a/doxygen/html/search/classes_9.js b/doxygen/html/search/classes_9.js deleted file mode 100644 index 23dd762..0000000 --- a/doxygen/html/search/classes_9.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['robotstate_0',['RobotState',['../struct_robot_state.html',1,'']]] -]; diff --git a/doxygen/html/search/classes_a.js b/doxygen/html/search/classes_a.js deleted file mode 100644 index f936369..0000000 --- a/doxygen/html/search/classes_a.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['sensorbase_0',['SensorBase',['../class_sensor_base.html',1,'']]], - ['single_5flandmark_5fs_1',['single_landmark_s',['../struct_tag_map_1_1single__landmark__s.html',1,'TagMap']]], - ['stateobserver_2',['StateObserver',['../classbebop2_1_1_state_observer.html',1,'bebop2']]] -]; diff --git a/doxygen/html/search/classes_b.js b/doxygen/html/search/classes_b.js deleted file mode 100644 index 012272f..0000000 --- a/doxygen/html/search/classes_b.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['tagmap_0',['TagMap',['../class_tag_map.html',1,'']]] -]; diff --git a/doxygen/html/search/defines_0.js b/doxygen/html/search/defines_0.js deleted file mode 100644 index d4a71b1..0000000 --- a/doxygen/html/search/defines_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['debug_0',['DEBUG',['../_l_q_r_8h.html#a3dfa58b1c5c2943dd49d8aa1981d377d',1,'LQR.h']]] -]; diff --git a/doxygen/html/search/defines_1.js b/doxygen/html/search/defines_1.js deleted file mode 100644 index b8c1535..0000000 --- a/doxygen/html/search/defines_1.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['eps_0',['EPS',['../_l_q_r_8h.html#a6ebf6899d6c1c8b7b9d09be872c05aae',1,'LQR.h']]] -]; diff --git a/doxygen/html/search/defines_2.js b/doxygen/html/search/defines_2.js deleted file mode 100644 index 4abb29a..0000000 --- a/doxygen/html/search/defines_2.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['max_5fiteration_0',['MAX_ITERATION',['../_l_q_r_8h.html#aefa7672f40a44cb9b17c8fb46210d1fd',1,'LQR.h']]] -]; diff --git a/doxygen/html/search/defines_3.js b/doxygen/html/search/defines_3.js deleted file mode 100644 index 7c46b55..0000000 --- a/doxygen/html/search/defines_3.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['num_5fcontroller_0',['NUM_CONTROLLER',['../_p_i_d_8h.html#a586eceffc45bcf6e44cd7561f67fac38',1,'PID.h']]], - ['num_5fgains_1',['NUM_GAINS',['../_p_i_d_8h.html#abbc754940c9a64fb612517c1de0c271a',1,'PID.h']]] -]; diff --git a/doxygen/html/search/defines_4.js b/doxygen/html/search/defines_4.js deleted file mode 100644 index 4b4303a..0000000 --- a/doxygen/html/search/defines_4.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['warning_0',['WARNING',['../_l_q_r_8h.html#a9e1796fdadec0df60e8d280ee783b85c',1,'LQR.h']]] -]; diff --git a/doxygen/html/search/enums_0.js b/doxygen/html/search/enums_0.js deleted file mode 100644 index 8b3b9f0..0000000 --- a/doxygen/html/search/enums_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['buttonstate_0',['ButtonState',['../classbebop2_1_1_controller_base.html#a76352e69566212036f3d7207ce4b6cc0',1,'bebop2::ControllerBase']]] -]; diff --git a/doxygen/html/search/enumvalues_1.js b/doxygen/html/search/enumvalues_1.js deleted file mode 100644 index 5011d91..0000000 --- a/doxygen/html/search/enumvalues_1.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['control_0',['CONTROL',['../classbebop2_1_1_controller_base.html#a76352e69566212036f3d7207ce4b6cc0a9e134b87d5f808d52d03c5f982da417a',1,'bebop2::ControllerBase']]], - ['cyan_1',['CYAN',['../namespacebebop2.html#a5db54b5dbc3283ac2d156b317597b5bfa44c9a43229973ff5a8cc20e691444da5',1,'bebop2']]] -]; diff --git a/doxygen/html/search/enumvalues_2.js b/doxygen/html/search/enumvalues_2.js deleted file mode 100644 index 169e1d4..0000000 --- a/doxygen/html/search/enumvalues_2.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['engage_0',['ENGAGE',['../classbebop2_1_1_controller_base.html#a76352e69566212036f3d7207ce4b6cc0aa78035010c11ea80cefb7f54823d5083',1,'bebop2::ControllerBase']]] -]; diff --git a/doxygen/html/search/enumvalues_4.js b/doxygen/html/search/enumvalues_4.js deleted file mode 100644 index b7e1094..0000000 --- a/doxygen/html/search/enumvalues_4.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['idle_0',['IDLE',['../classbebop2_1_1_controller_base.html#a76352e69566212036f3d7207ce4b6cc0a2eb4f2f58d711bb2fc7cf6443830e41b',1,'bebop2::ControllerBase']]] -]; diff --git a/doxygen/html/search/enumvalues_5.js b/doxygen/html/search/enumvalues_5.js deleted file mode 100644 index cc9a14d..0000000 --- a/doxygen/html/search/enumvalues_5.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['land_0',['LAND',['../classbebop2_1_1_controller_base.html#a76352e69566212036f3d7207ce4b6cc0a8b7d2a81407259ab3721dfc2e6827b97',1,'bebop2::ControllerBase']]] -]; diff --git a/doxygen/html/search/enumvalues_7.js b/doxygen/html/search/enumvalues_7.js deleted file mode 100644 index b8a53e6..0000000 --- a/doxygen/html/search/enumvalues_7.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['takeoff_0',['TAKEOFF',['../classbebop2_1_1_controller_base.html#a76352e69566212036f3d7207ce4b6cc0a034f3ebd64c6dedc4232ea246cb82f0a',1,'bebop2::ControllerBase']]] -]; diff --git a/doxygen/html/search/files_1.js b/doxygen/html/search/files_1.js deleted file mode 100644 index 1324b65..0000000 --- a/doxygen/html/search/files_1.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['complementaryfilter_2eh_0',['ComplementaryFilter.h',['../_complementary_filter_8h.html',1,'']]], - ['controllerbase_2ecpp_1',['ControllerBase.cpp',['../_controller_base_8cpp.html',1,'']]], - ['controllerbase_2eh_2',['ControllerBase.h',['../_controller_base_8h.html',1,'']]], - ['controlviz_2ecpp_3',['ControlViz.cpp',['../_control_viz_8cpp.html',1,'']]], - ['controlviz_2eh_4',['ControlViz.h',['../_control_viz_8h.html',1,'']]] -]; diff --git a/doxygen/html/search/files_2.js b/doxygen/html/search/files_2.js deleted file mode 100644 index 66152ba..0000000 --- a/doxygen/html/search/files_2.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['dummy_5fekf_5fpid_2ecpp_0',['dummy_ekf_pid.cpp',['../dummy__ekf__pid_8cpp.html',1,'']]], - ['dummystate_2ecpp_1',['DummyState.cpp',['../_dummy_state_8cpp.html',1,'']]], - ['dummystate_2eh_2',['DummyState.h',['../_dummy_state_8h.html',1,'']]] -]; diff --git a/doxygen/html/search/files_3.js b/doxygen/html/search/files_3.js deleted file mode 100644 index 493eb3e..0000000 --- a/doxygen/html/search/files_3.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['extendedkalmanfilter_2ecpp_0',['ExtendedKalmanFilter.cpp',['../_extended_kalman_filter_8cpp.html',1,'']]], - ['extendedkalmanfilter_2eh_1',['ExtendedKalmanFilter.h',['../_extended_kalman_filter_8h.html',1,'']]] -]; diff --git a/doxygen/html/search/files_5.js b/doxygen/html/search/files_5.js deleted file mode 100644 index 0341e8c..0000000 --- a/doxygen/html/search/files_5.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['loggercsv_2eh_0',['LoggerCSV.h',['../_logger_c_s_v_8h.html',1,'']]], - ['lqr_2ecpp_1',['LQR.cpp',['../_l_q_r_8cpp.html',1,'']]], - ['lqr_2eh_2',['LQR.h',['../_l_q_r_8h.html',1,'']]] -]; diff --git a/doxygen/html/search/files_6.js b/doxygen/html/search/files_6.js deleted file mode 100644 index 4037574..0000000 --- a/doxygen/html/search/files_6.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['main_2ecpp_0',['main.cpp',['../control_2_l_q_r_2main_8cpp.html',1,'(Global Namespace)'],['../localization_2_filters_2ekf_2main_8cpp.html',1,'(Global Namespace)'],['../localization_2_filters_2pf_2main_8cpp.html',1,'(Global Namespace)']]] -]; diff --git a/doxygen/html/search/files_8.js b/doxygen/html/search/files_8.js deleted file mode 100644 index b20dfba..0000000 --- a/doxygen/html/search/files_8.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['quadcontrollerpid_2ecpp_0',['QuadControllerPID.cpp',['../_quad_controller_p_i_d_8cpp.html',1,'']]], - ['quadcontrollerpid_2eh_1',['QuadControllerPID.h',['../_quad_controller_p_i_d_8h.html',1,'']]] -]; diff --git a/doxygen/html/search/files_a.js b/doxygen/html/search/files_a.js deleted file mode 100644 index 55a7509..0000000 --- a/doxygen/html/search/files_a.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['sensorbase_2eh_0',['SensorBase.h',['../_sensor_base_8h.html',1,'']]], - ['sensors_2eh_1',['sensors.h',['../sensors_8h.html',1,'']]], - ['stateobserver_2ecpp_2',['StateObserver.cpp',['../_state_observer_8cpp.html',1,'']]], - ['stateobserver_2eh_3',['StateObserver.h',['../_state_observer_8h.html',1,'']]] -]; diff --git a/doxygen/html/search/functions_0.js b/doxygen/html/search/functions_0.js deleted file mode 100644 index 9643381..0000000 --- a/doxygen/html/search/functions_0.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['addheader_0',['addHeader',['../class_logger_c_s_v.html#a2c3316d5c7c272357512d83c152232cd',1,'LoggerCSV']]], - ['addrow_1',['addRow',['../class_logger_c_s_v.html#a9c9d7e83cf30030bc380d0e31cbaceca',1,'LoggerCSV']]], - ['apriltag_5fcallback_2',['apriltag_callback',['../class_apriltag_landmarks.html#ace7326fcc563193fabaa2e4e0a92d271',1,'ApriltagLandmarks']]], - ['apriltaglandmarks_3',['ApriltagLandmarks',['../class_apriltag_landmarks.html#a9e32395a2cd0485d753fb0979ef8ed68',1,'ApriltagLandmarks']]] -]; diff --git a/doxygen/html/search/functions_1.js b/doxygen/html/search/functions_1.js deleted file mode 100644 index a9833d5..0000000 --- a/doxygen/html/search/functions_1.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['calculate_0',['calculate',['../classbebop2_1_1_p_i_d.html#a9b7afa3e1573a2f673d3c7165f4e8be0',1,'bebop2::PID']]], - ['cmd_5fvel_5fcallback_1',['cmd_vel_callback',['../classbebop2_1_1_dummy_state.html#a759c288e1c05a40707af808391a0d48f',1,'bebop2::DummyState']]], - ['complementaryfilter_2',['ComplementaryFilter',['../class_complementary_filter.html#a3538e9422629678ee68874ee20937aac',1,'ComplementaryFilter']]], - ['compute_5fcontrol_3',['compute_control',['../classbebop2_1_1_controller_base.html#a0619e69c4759098a59a2bdae5c503501',1,'bebop2::ControllerBase::compute_control()'],['../classbebop2_1_1_quad_controller_p_i_d.html#adf0cbf720225ac7b9d73aa103a82ccd8',1,'bebop2::QuadControllerPID::compute_control()']]], - ['controllerbase_4',['ControllerBase',['../classbebop2_1_1_controller_base.html#aecd53db3daa5f49032713283163636b0',1,'bebop2::ControllerBase']]], - ['controlviz_5',['ControlViz',['../classbebop2_1_1_control_viz.html#aad6dd4782c5662f432a5fca0d44fb1f2',1,'bebop2::ControlViz']]] -]; diff --git a/doxygen/html/search/functions_10.js b/doxygen/html/search/functions_10.js deleted file mode 100644 index bee37b4..0000000 --- a/doxygen/html/search/functions_10.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['update_0',['update',['../classbebop2_1_1_control_viz.html#ae7bf24b46f45546fadad51a19964ede0',1,'bebop2::ControlViz::update()'],['../class_complementary_filter.html#a522291c234d0d3562cab71f591f8f328',1,'ComplementaryFilter::update()'],['../classbebop2_1_1_extended_kalman_filter.html#a222a3660fa70e667b932949cb2a59075',1,'bebop2::ExtendedKalmanFilter::update()'],['../class_filter_base.html#a6371eb4ec395f259edd15b00594c6312',1,'FilterBase::update()'],['../class_particle_filter.html#a90019fe33003b008575111640f15946c',1,'ParticleFilter::update()']]], - ['update_5fcmd_1',['update_cmd',['../classbebop2_1_1_extended_kalman_filter.html#a9b197ee9ee0c74a6a3632832666794c7',1,'bebop2::ExtendedKalmanFilter::update_cmd()'],['../class_particle_filter.html#ad8fffecf872b9241525b9dcd4ed1fea5',1,'ParticleFilter::update_cmd(Twist *cmd)']]], - ['updateweights_2',['updateWeights',['../class_particle_filter.html#a624174682b3cf3a4c71a341d1f994372',1,'ParticleFilter']]] -]; diff --git a/doxygen/html/search/functions_11.js b/doxygen/html/search/functions_11.js deleted file mode 100644 index ac6fc94..0000000 --- a/doxygen/html/search/functions_11.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['write_0',['write',['../class_particle_filter.html#af13313fde404befb521e3ff208a08a19',1,'ParticleFilter']]] -]; diff --git a/doxygen/html/search/functions_12.js b/doxygen/html/search/functions_12.js deleted file mode 100644 index bef90ab..0000000 --- a/doxygen/html/search/functions_12.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['_7efilterbase_0',['~FilterBase',['../class_filter_base.html#a69cc7472a68edafc479061d0f411bbaa',1,'FilterBase']]], - ['_7eloggercsv_1',['~LoggerCSV',['../class_logger_c_s_v.html#a3241cbbbe476425821ce05204c8bba6f',1,'LoggerCSV']]], - ['_7emvn_2',['~Mvn',['../class_mvn.html#aec49f8e17feb48fbbd47f64c26565502',1,'Mvn']]], - ['_7eparticlefilter_3',['~ParticleFilter',['../class_particle_filter.html#a4f4ccdfa224f0a62c411230f7fb0cd65',1,'ParticleFilter']]] -]; diff --git a/doxygen/html/search/functions_2.js b/doxygen/html/search/functions_2.js deleted file mode 100644 index 900addb..0000000 --- a/doxygen/html/search/functions_2.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['dataassociation_0',['dataAssociation',['../class_particle_filter.html#abe77ed78890ea19a87a19c6cbad9a5b9',1,'ParticleFilter']]], - ['dist_1',['dist',['../class_particle_filter.html#a8589bf33200bca543a8a54caecf7ad14',1,'ParticleFilter']]], - ['dummystate_2',['DummyState',['../classbebop2_1_1_dummy_state.html#aa704cb1fb20c0a80e881478b07af2118',1,'bebop2::DummyState']]] -]; diff --git a/doxygen/html/search/functions_3.js b/doxygen/html/search/functions_3.js deleted file mode 100644 index aa08d19..0000000 --- a/doxygen/html/search/functions_3.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['empty_0',['empty',['../class_apriltag_landmarks.html#adb855b900e2500bd2cb7b832b6a06d5d',1,'ApriltagLandmarks::empty()'],['../classbebop2_1_1_dummy_state.html#af718a706c941fb6cf3e283f8ff51965b',1,'bebop2::DummyState::empty()'],['../class_sensor_base.html#a4f481426253035b3a39162d107f52a38',1,'SensorBase::empty()']]], - ['extendedkalmanfilter_1',['ExtendedKalmanFilter',['../classbebop2_1_1_extended_kalman_filter.html#acdff0e290cf27a84a68097a653245f37',1,'bebop2::ExtendedKalmanFilter']]] -]; diff --git a/doxygen/html/search/functions_4.js b/doxygen/html/search/functions_4.js deleted file mode 100644 index aeb569a..0000000 --- a/doxygen/html/search/functions_4.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['filterbase_0',['FilterBase',['../class_filter_base.html#ab4c3dc4501905d2d7d17d4d96ffbd6eb',1,'FilterBase']]] -]; diff --git a/doxygen/html/search/functions_5.js b/doxygen/html/search/functions_5.js deleted file mode 100644 index 6b270ea..0000000 --- a/doxygen/html/search/functions_5.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['geterror_0',['getError',['../class_particle_filter.html#a1d90b6ed0e0e88f21d21dd324698ea7a',1,'ParticleFilter']]], - ['getptr_1',['getPtr',['../class_filter_base.html#a7ea28d3367b18f79a586e75546005172',1,'FilterBase::getPtr()'],['../class_sensor_base.html#aacd7a71d84767414807a14b34a5ad7c6',1,'SensorBase::getPtr()']]], - ['gettimestamp_2',['getTimestamp',['../class_logger_c_s_v.html#a34f36a942a6fecb0cacf720f43774b44',1,'LoggerCSV']]], - ['goal_5fdistance_3',['goal_distance',['../classbebop2_1_1_controller_base.html#adcc0fee29e5f7b7f6a19a640955eb652',1,'bebop2::ControllerBase']]] -]; diff --git a/doxygen/html/search/functions_6.js b/doxygen/html/search/functions_6.js deleted file mode 100644 index 9ed041c..0000000 --- a/doxygen/html/search/functions_6.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['init_0',['init',['../classbebop2_1_1_p_i_d.html#a3bdaa787b389dc3c1ce287110bd5adb8',1,'bebop2::PID::init()'],['../class_complementary_filter.html#a73d1dccaf8172850b8ba2abd0875cd70',1,'ComplementaryFilter::init()'],['../classbebop2_1_1_extended_kalman_filter.html#a93b97c85025a9792558c02baa4ec6388',1,'bebop2::ExtendedKalmanFilter::init()'],['../class_filter_base.html#a67503fcfa27c21d3d0adb6570ec0a7da',1,'FilterBase::init()'],['../class_particle_filter.html#a11d7f5a1aba6a649dc9d0cb661fa014d',1,'ParticleFilter::init(const std::vector< double > &x0, const std::vector< double > &std)']]], - ['initialized_1',['initialized',['../class_particle_filter.html#a21191cc75e036c60f1b2a3965a241266',1,'ParticleFilter']]], - ['internal_5fupdate_2',['internal_update',['../classbebop2_1_1_extended_kalman_filter.html#a9780edd80082973223723de463046506',1,'bebop2::ExtendedKalmanFilter']]] -]; diff --git a/doxygen/html/search/functions_7.js b/doxygen/html/search/functions_7.js deleted file mode 100644 index 9c2110b..0000000 --- a/doxygen/html/search/functions_7.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['jacobf_0',['jacobF',['../classbebop2_1_1_extended_kalman_filter.html#a099b533a912aa76f92b7a820c3086f54',1,'bebop2::ExtendedKalmanFilter']]], - ['jacobh_1',['jacobH',['../classbebop2_1_1_extended_kalman_filter.html#a98b524af05ef67b13b5319e3531cb97c',1,'bebop2::ExtendedKalmanFilter']]] -]; diff --git a/doxygen/html/search/functions_8.js b/doxygen/html/search/functions_8.js deleted file mode 100644 index 5fc6b30..0000000 --- a/doxygen/html/search/functions_8.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['land_5fcallback_0',['land_callback',['../classbebop2_1_1_dummy_state.html#a7a06058ab728c2f955a8524f46f34c36',1,'bebop2::DummyState']]], - ['loggercsv_1',['LoggerCSV',['../class_logger_c_s_v.html#a727b61abcb5030665d0ab73a68ed6f6e',1,'LoggerCSV::LoggerCSV()'],['../class_logger_c_s_v.html#a0cfadbfb1cce7279e3c675a23d73ec7e',1,'LoggerCSV::LoggerCSV(const std::vector< std::string > &header)'],['../class_logger_c_s_v.html#a4730a968872141ec2ece9ef90c2d7186',1,'LoggerCSV::LoggerCSV(const std::vector< std::string > &header, const int frequency)']]], - ['lqr_2',['LQR',['../classbebop2_1_1_l_q_r.html#a78b5ce9848271cc53e117d1263bbd879',1,'bebop2::LQR']]] -]; diff --git a/doxygen/html/search/functions_9.js b/doxygen/html/search/functions_9.js deleted file mode 100644 index 19e8b02..0000000 --- a/doxygen/html/search/functions_9.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['main_0',['main',['../control_2_l_q_r_2main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97',1,'main(int argc, char *argv[]): main.cpp'],['../localization_2_filters_2ekf_2main_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97',1,'main(int argc, char *argv[]): main.cpp'],['../localization_2_filters_2pf_2main_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4',1,'main(): main.cpp'],['../apriltag__complementary__pid_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97',1,'main(int argc, char *argv[]): apriltag_complementary_pid.cpp'],['../apriltag__ekf__pid_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97',1,'main(int argc, char *argv[]): apriltag_ekf_pid.cpp'],['../dummy__ekf__pid_8cpp.html#a0ddf1224851353fc92bfbff6f499fa97',1,'main(int argc, char *argv[]): dummy_ekf_pid.cpp']]], - ['motion_5fmodel_1',['motion_model',['../classbebop2_1_1_extended_kalman_filter.html#ae584586d81bc66c0f46b1a5aeffe7d26',1,'bebop2::ExtendedKalmanFilter']]], - ['mvn_2',['Mvn',['../class_mvn.html#a3e6c158a9d5a08050dafec14ca2f788c',1,'Mvn']]] -]; diff --git a/doxygen/html/search/functions_a.js b/doxygen/html/search/functions_a.js deleted file mode 100644 index a7f66dc..0000000 --- a/doxygen/html/search/functions_a.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['observation_5fmodel_0',['observation_model',['../classbebop2_1_1_extended_kalman_filter.html#a555a02b112e88b63a92c230ae365b17f',1,'bebop2::ExtendedKalmanFilter']]], - ['operator_28_29_1',['operator()',['../classbebop2_1_1_extended_kalman_filter.html#a69797105ff979b3e5a602d1a87149297',1,'bebop2::ExtendedKalmanFilter::operator()()'],['../class_particle_filter.html#a60b736fab3746b834dd7cfb08fa5fb11',1,'ParticleFilter::operator()()'],['../class_apriltag_landmarks.html#a11f9b912b3f326faa40eccc67e3ba7b2',1,'ApriltagLandmarks::operator()()'],['../classbebop2_1_1_dummy_state.html#a9a18fcd35402f1d756bd052def7cfb0e',1,'bebop2::DummyState::operator()()'],['../class_sensor_base.html#ae77f79abe25a2939434e30575ea5fd30',1,'SensorBase::operator()()'],['../classbebop2_1_1_state_observer.html#a1d829045f35ed3531559f53aeb1773ca',1,'bebop2::StateObserver::operator()()']]], - ['operator_2a_2',['operator*',['../struct_field_location.html#a7da89910c0992173841458f493027814',1,'FieldLocation']]], - ['operator_2b_3',['operator+',['../struct_field_location.html#ac5966312a3d0df900873be1fa853d840',1,'FieldLocation']]], - ['operator_2d_4',['operator-',['../struct_field_location.html#ae317351db47c70444f72a68516454402',1,'FieldLocation']]] -]; diff --git a/doxygen/html/search/functions_b.js b/doxygen/html/search/functions_b.js deleted file mode 100644 index bb9bba4..0000000 --- a/doxygen/html/search/functions_b.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['particlefilter_0',['ParticleFilter',['../class_particle_filter.html#accc05e707b48f1a8f1a10ed318c0dc55',1,'ParticleFilter']]], - ['pdf_1',['pdf',['../class_mvn.html#a8317e80dc988ad98cf93428c4bcbfed6',1,'Mvn']]], - ['pid_2',['PID',['../classbebop2_1_1_p_i_d.html#a8c9b9e1417bdcefb64e04041d6caa339',1,'bebop2::PID']]], - ['prediction_3',['prediction',['../class_particle_filter.html#a541ece0fecb05f999382559c22454f3b',1,'ParticleFilter']]], - ['publish_5fcmd_5fvel_4',['publish_cmd_vel',['../classbebop2_1_1_controller_base.html#a644d91e6e4bc12977deff541165a6b8c',1,'bebop2::ControllerBase']]], - ['publish_5ftf_5',['publish_tf',['../class_sensor_base.html#ad56a833e43ba1c3c10cbf52024390e44',1,'SensorBase']]] -]; diff --git a/doxygen/html/search/functions_c.js b/doxygen/html/search/functions_c.js deleted file mode 100644 index f1cd11d..0000000 --- a/doxygen/html/search/functions_c.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['quadcontrollerpid_0',['QuadControllerPID',['../classbebop2_1_1_quad_controller_p_i_d.html#a9a47a9d55416b290dfba482caf970cc8',1,'bebop2::QuadControllerPID']]] -]; diff --git a/doxygen/html/search/functions_d.js b/doxygen/html/search/functions_d.js deleted file mode 100644 index c4da6d3..0000000 --- a/doxygen/html/search/functions_d.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['resample_0',['resample',['../class_particle_filter.html#a84265f4c32f6d157da1d40677c6c47cf',1,'ParticleFilter']]] -]; diff --git a/doxygen/html/search/functions_e.js b/doxygen/html/search/functions_e.js deleted file mode 100644 index 922bb5a..0000000 --- a/doxygen/html/search/functions_e.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['set_5fmarker_5fcolor_0',['set_marker_color',['../classbebop2_1_1_control_viz.html#aa520a0b7efe18ff02186c6cfcac05181',1,'bebop2::ControlViz']]], - ['set_5fmarker_5ffrom_5fpose_1',['set_marker_from_pose',['../classbebop2_1_1_control_viz.html#ae21b0f1d37929ae2378f709e201cd86c',1,'bebop2::ControlViz']]], - ['setdrone_2',['setDrone',['../classbebop2_1_1_control_viz.html#ac6141e56c2fd5936ed6f261309ca90a1',1,'bebop2::ControlViz']]], - ['stateobserver_3',['StateObserver',['../classbebop2_1_1_state_observer.html#a1bfd8d999a4246192a566feed36b82b7',1,'bebop2::StateObserver']]] -]; diff --git a/doxygen/html/search/functions_f.js b/doxygen/html/search/functions_f.js deleted file mode 100644 index 0638a0d..0000000 --- a/doxygen/html/search/functions_f.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['takeoff_5fcallback_0',['takeoff_callback',['../classbebop2_1_1_dummy_state.html#ae9bf8c28c906bd9766f6d333a9155b0b',1,'bebop2::DummyState']]], - ['toobservation_1',['toObservation',['../struct_field_location.html#aba8010cdbd3ea54265db5d7cd75de44e',1,'FieldLocation']]], - ['transformtoglobalframe_2',['transformToGlobalFrame',['../class_apriltag_landmarks.html#ae1fedc5c1e5d0bba0ddfbd881269df99',1,'ApriltagLandmarks']]] -]; diff --git a/doxygen/html/search/pages_0.js b/doxygen/html/search/pages_0.js deleted file mode 100644 index c2b59cd..0000000 --- a/doxygen/html/search/pages_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['bebop2_20controller_0',['Bebop2 Controller',['../md__r_e_a_d_m_e.html',1,'']]] -]; diff --git a/doxygen/html/search/related_0.js b/doxygen/html/search/related_0.js deleted file mode 100644 index 3b8d7f1..0000000 --- a/doxygen/html/search/related_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['operator_3c_3c_0',['operator<<',['../struct_particle.html#a2fa6df9fcd4dca7af54e59ed25db6e1f',1,'Particle::operator<<()'],['../struct_marker_observation.html#a4755337b360a2c606740ae5cc60b00e5',1,'MarkerObservation::operator<<()'],['../struct_field_location.html#ae81613697d66349de9e6bff55d3bca4d',1,'FieldLocation::operator<<()']]] -]; diff --git a/doxygen/html/search/typedefs_0.js b/doxygen/html/search/typedefs_0.js deleted file mode 100644 index 798487a..0000000 --- a/doxygen/html/search/typedefs_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['filterptr_0',['FilterPtr',['../_filter_base_8h.html#aec1719f7c37e43544283ed24fab742c9',1,'FilterBase.h']]] -]; diff --git a/doxygen/html/search/variables_0.js b/doxygen/html/search/variables_0.js deleted file mode 100644 index 1f1bb41..0000000 --- a/doxygen/html/search/variables_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['azimuthal_5fangle_0',['azimuthal_angle',['../struct_marker_observation.html#a100373bce74cf49ea8870196d2acf74b',1,'MarkerObservation']]] -]; diff --git a/doxygen/html/search/variables_1.js b/doxygen/html/search/variables_1.js deleted file mode 100644 index b903b21..0000000 --- a/doxygen/html/search/variables_1.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['control_5fdim_0',['CONTROL_DIM',['../classbebop2_1_1_extended_kalman_filter.html#a864b08f6504af5b5ff0bd45dfa5c9bc8',1,'bebop2::ExtendedKalmanFilter']]] -]; diff --git a/doxygen/html/search/variables_2.js b/doxygen/html/search/variables_2.js deleted file mode 100644 index 23749f3..0000000 --- a/doxygen/html/search/variables_2.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['dead_5fzone_0',['DEAD_ZONE',['../namespacebebop2.html#a6338d1064f32f481f613f760641cb849',1,'bebop2']]], - ['dt_1',['DT',['../classbebop2_1_1_extended_kalman_filter.html#ace00431562f973d1e277e0fdf9249c82',1,'bebop2::ExtendedKalmanFilter']]], - ['dt_5f_2',['dt_',['../classbebop2_1_1_controller_base.html#a2b0de02e8c727752a1dad0a2857f2013',1,'bebop2::ControllerBase']]] -]; diff --git a/doxygen/html/search/variables_3.js b/doxygen/html/search/variables_3.js deleted file mode 100644 index 06b3397..0000000 --- a/doxygen/html/search/variables_3.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['id_0',['id',['../struct_particle.html#a544b202775517f8ba05efcb9e0a21bee',1,'Particle::id()'],['../struct_landmark_obs.html#a102b941ef9037ff29102efbfd2c9043e',1,'LandmarkObs::id()']]], - ['id_5fi_1',['id_i',['../struct_tag_map_1_1single__landmark__s.html#a083fbd02bc345db3c25551765f4332c2',1,'TagMap::single_landmark_s']]] -]; diff --git a/doxygen/html/search/variables_4.js b/doxygen/html/search/variables_4.js deleted file mode 100644 index 18099f0..0000000 --- a/doxygen/html/search/variables_4.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['landmark_5flist_0',['landmark_list',['../class_tag_map.html#aaca48e131c1dc7c3ba30e1313aebb13f',1,'TagMap']]] -]; diff --git a/doxygen/html/search/variables_5.js b/doxygen/html/search/variables_5.js deleted file mode 100644 index fb886d0..0000000 --- a/doxygen/html/search/variables_5.js +++ /dev/null @@ -1,12 +0,0 @@ -var searchData= -[ - ['m_5fbuttonstate_0',['m_buttonState',['../classbebop2_1_1_controller_base.html#a587d4539796276947acfceedd74daf2c',1,'bebop2::ControllerBase']]], - ['m_5ffilter_1',['m_filter',['../classbebop2_1_1_state_observer.html#a6ededc78ab08eba61eab678ed7a7896a',1,'bebop2::StateObserver']]], - ['m_5fget_5fstate_2',['m_get_state',['../classbebop2_1_1_controller_base.html#afcf21b03e3a3c40f8173e4819a2a4230',1,'bebop2::ControllerBase']]], - ['m_5fgoal_5fthres_3',['m_goal_thres',['../classbebop2_1_1_controller_base.html#a405dcc08256f764191275e542d37a955',1,'bebop2::ControllerBase']]], - ['m_5finitialized_4',['m_initialized',['../classbebop2_1_1_state_observer.html#a4304686fa39b86122ea6892dfd472c08',1,'bebop2::StateObserver']]], - ['m_5fmu_5',['m_mu',['../classbebop2_1_1_controller_base.html#a419cc93fc0637717522429e67b63f8dd',1,'bebop2::ControllerBase']]], - ['m_5fnh_6',['m_nh',['../classbebop2_1_1_controller_base.html#add1eb5b349b755bdad661697bb184f2a',1,'bebop2::ControllerBase']]], - ['m_5fsensor_7',['m_sensor',['../classbebop2_1_1_state_observer.html#a743085128ae5fdb567d61ec1159176b8',1,'bebop2::StateObserver']]], - ['m_5fstate_8',['m_state',['../classbebop2_1_1_state_observer.html#a693f9d73394813a3209e41b46590c14f',1,'bebop2::StateObserver']]] -]; diff --git a/doxygen/html/search/variables_7.js b/doxygen/html/search/variables_7.js deleted file mode 100644 index 9aa6a87..0000000 --- a/doxygen/html/search/variables_7.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['particles_0',['particles',['../class_particle_filter.html#a4d73f797a7a4bfffbfbb4fd6d09114f9',1,'ParticleFilter']]], - ['polar_5fangle_1',['polar_angle',['../struct_marker_observation.html#aad670bccd0f025ea8808148e828878a2',1,'MarkerObservation']]] -]; diff --git a/doxygen/html/search/variables_8.js b/doxygen/html/search/variables_8.js deleted file mode 100644 index d396d2f..0000000 --- a/doxygen/html/search/variables_8.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['radial_5fdistance_0',['radial_distance',['../struct_marker_observation.html#a74eaf75e45d859ee6b8f8e4bd5439bae',1,'MarkerObservation']]] -]; diff --git a/doxygen/html/search/variables_9.js b/doxygen/html/search/variables_9.js deleted file mode 100644 index 752b162..0000000 --- a/doxygen/html/search/variables_9.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['state_5fdim_0',['STATE_DIM',['../classbebop2_1_1_extended_kalman_filter.html#add430272eb0874b6608f17cbb0f88ad4',1,'bebop2::ExtendedKalmanFilter']]], - ['step_5fincr_1',['STEP_INCR',['../namespacebebop2.html#a4fd8275c9f8db3ebcbd93e1ea602678b',1,'bebop2']]] -]; diff --git a/doxygen/html/search/variables_a.js b/doxygen/html/search/variables_a.js deleted file mode 100644 index 5cfed87..0000000 --- a/doxygen/html/search/variables_a.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['tagname_0',['tagName',['../struct_marker_observation.html#a1de968d571f84b2943de2a8609db2c3d',1,'MarkerObservation::tagName()'],['../struct_field_location.html#a1be847da2ecefc18b2181b8d3e8a1bb2',1,'FieldLocation::tagName()']]], - ['theta_1',['theta',['../struct_particle.html#a589eaf4e282cf6c07036670ae48eaee2',1,'Particle::theta()'],['../struct_robot_state.html#a347039726076c6fbe8874635dfa21af0',1,'RobotState::theta()']]] -]; diff --git a/doxygen/html/search/variables_b.js b/doxygen/html/search/variables_b.js deleted file mode 100644 index bab6404..0000000 --- a/doxygen/html/search/variables_b.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['weight_0',['weight',['../struct_particle.html#aa010c7b3f2b60f707f14bbc26ce8b414',1,'Particle']]] -]; diff --git a/doxygen/html/search/variables_c.js b/doxygen/html/search/variables_c.js deleted file mode 100644 index 3d3b784..0000000 --- a/doxygen/html/search/variables_c.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['x_0',['x',['../struct_particle.html#a1e3e5e103cee69ae9acb9c3269d009d7',1,'Particle::x()'],['../struct_landmark_obs.html#ae5a02a81f693771bbae301156e101246',1,'LandmarkObs::x()'],['../struct_robot_state.html#a7ca6f4e88ac7982242ab32cf5fba15e6',1,'RobotState::x()'],['../struct_field_location.html#a2f101b216cd1177702266249290f382b',1,'FieldLocation::x()']]], - ['x_5f_1',['X_',['../class_filter_base.html#aeb7e15b1e110d25ce56508aaecbd91e3',1,'FilterBase']]], - ['x_5faxis_5findex_2',['X_AXIS_INDEX',['../namespacebebop2.html#a3d1183926660c413534f54a30a3e9926',1,'bebop2']]], - ['x_5fd_3',['x_d',['../struct_tag_map_1_1single__landmark__s.html#a3be6096099b3026eb0d3314779d997a4',1,'TagMap::single_landmark_s']]] -]; diff --git a/doxygen/html/search/variables_d.js b/doxygen/html/search/variables_d.js deleted file mode 100644 index 3d53ba9..0000000 --- a/doxygen/html/search/variables_d.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['y_0',['y',['../struct_particle.html#a434ab690dde4422ac74ae10f6ace7a52',1,'Particle::y()'],['../struct_landmark_obs.html#a18f5101eb6de02e127ce6bca26032286',1,'LandmarkObs::y()'],['../struct_robot_state.html#ac96a8e033454034c95745aee1811ffc2',1,'RobotState::y()'],['../struct_field_location.html#a91e5558f47b388feffccf1c23a93b5e6',1,'FieldLocation::y()']]], - ['y_5faxis_5findex_1',['Y_AXIS_INDEX',['../namespacebebop2.html#ace37141259c7e75b0ffbfb6234da5cf8',1,'bebop2']]], - ['y_5fd_2',['y_d',['../struct_tag_map_1_1single__landmark__s.html#a4e87e55a7c6f9849be215f1ded19b442',1,'TagMap::single_landmark_s']]] -]; diff --git a/doxygen/html/search/variables_e.js b/doxygen/html/search/variables_e.js deleted file mode 100644 index 6d6a941..0000000 --- a/doxygen/html/search/variables_e.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['z_0',['z',['../struct_particle.html#a518399a50ebdd632b22d7f48e5958461',1,'Particle::z()'],['../struct_landmark_obs.html#a4bb27957f350bd05c829766946b5f724',1,'LandmarkObs::z()'],['../struct_robot_state.html#a552998092784696aaf6db9c47ab6a425',1,'RobotState::z()'],['../struct_field_location.html#a4cdf46653fc5e8fae3688924f7705897',1,'FieldLocation::z()']]], - ['z_5faxis_5findex_1',['Z_AXIS_INDEX',['../namespacebebop2.html#a68385be43a1e12d2a6c3130441467c93',1,'bebop2']]], - ['z_5fd_2',['z_d',['../struct_tag_map_1_1single__landmark__s.html#a718ca1c4ade6bfc9e79b91cd833fb6c8',1,'TagMap::single_landmark_s']]] -]; diff --git a/include/airlib/control/ControlViz.h b/include/airlib/control/ControlViz.h index 347d6f2..cbf28f0 100644 --- a/include/airlib/control/ControlViz.h +++ b/include/airlib/control/ControlViz.h @@ -20,20 +20,56 @@ namespace bebop2 { YELLOW, GRAY }; - + /// @brief This class helps in the 3D visualization of data being rendered. It receives the updated position and orientation of the drone and sends points and lines to a graphical interface. + /// Hence, visualizes the movement, position, orientation and behaviors of the drone. class ControlViz { - public: + public: + /** + * @brief Publishes messages through /bebop2/goal topic. + * @param nh ROS Node Handle which deals with messages. + */ + explicit ControlViz( ros::NodeHandle &nh); + /** + * @brief This function starts and slightly lifts the drone. + * As a result sets the Marker from the pose parameter and also sets the color by invoking the set_marker_from_pose() and set_marker_color() functions. + * @param pose Drone's positon. + * @note Sets the path of the color to gray. + */ + void setDrone(const tf::Transform& pose); + /** + * @brief This functions updates the path and the color of the path of the robot. + * It also publishes the messages from the visualization_msgs::Marker. + * Lastly, it sets the Marker object type to be a sphere. + * @param pose current position of the robot. + * @param color color of the path in which the robot is in. + * @note Calls the set_marker_from_pose() and set_marker_color() functions to update the path and color. + */ + void update(const tf::Transform& pose, const MARKER_COLOR& color); private: + /// ROS NodeHandle for dealing with various messages. ros::NodeHandle nh_; + /// ROS Publisher to advertise various visualization messages to /bebop2/goal. ros::Publisher pub_marker_; std::unique_ptr logger_; const int LOGGER_FQ = 10; // Hz + protected: + /** + * @brief Receives the current position of the drone and uses that position to populate the point position and orientation of the marker messages. + * The marker messages will be used by a graphical interface to visualize the movement of the robot. + * @param pose Robot's pose having a /map frame. + * @param msg is a Marker object from visualization msgs that has attributes like position, orientation etc. + */ void set_marker_from_pose(const tf::Transform& pose, visualization_msgs::Marker& msg); + /** + * @brief sets different colors for different flights and paths of the drone for better understanding. + * @param color color of the path + * @param msg is Marker object same as the parameter msg in set_marker_from_pose() and has attributes to set color as well. + */ void set_marker_color(const MARKER_COLOR& color, visualization_msgs::Marker& msg); diff --git a/include/airlib/control/ControllerBase.h b/include/airlib/control/ControllerBase.h index 94f1ae9..1dd562e 100644 --- a/include/airlib/control/ControllerBase.h +++ b/include/airlib/control/ControllerBase.h @@ -40,51 +40,93 @@ namespace bebop2 - + /** + * @brief Responsible to control the position, state and rotation of the drone and also provides the code to make the robot hover. It publishes the takeoff, landing commands along with the current position of the drone and the state of the axes and buttons of the joystick controller. + * It also updates the state of the robot in RVIZ which is used for visaulation. + */ class ControllerBase{ public: - - + /** @brief Subscribes to sensor_msgs/joy which reports the state of a joystick's axes and buttons. + * It also publishes the message of drone takeoff and landing along with the linear and angular position of the drone. + * The constructor is also responsible to call the appropriate functions at specifc rates that plays a role in setting the set-point at a current location. + * Lastly it contructs an object to send the updated pose to the RVIZ for visualization and also sets the state of the controller's button. + * @param mGetState Obtains the current state of the robot + * @param nh Used to create publishers and subscribes. For eg: The ControllerBase constructor publishes messages during takeoff and landing with the help of the **ros::NodeHandle** aka nh parameter. + */ explicit ControllerBase(StateObserverPtr mGetState, ros::NodeHandle& nh); private: + /// Array of four real numbers in which the first three numbers most commonly represented by x,y,z are vectors and the last number is w which represents the rotation of the robot about the vectors. std::vectoraxes_values_; + /// @brief Timer to call the joystick_timer_callback() function at a specific rate. + /// @note The joystick_timer_callback() is invoked every 0.05 second. ros::Timer joystick_timer_; + /// @brief Timer to call the control_loop() function at a specific rate. ros::Timer controller_timer_; + /// @brief Unique Pointer that points to the address of ControlViz class in the ControlViz.h header file. std::unique_ptr viz_; + /// Subscribes from sensors_msgs/joy and calls the joystick_callback() as a callback function. ros::Subscriber joystick_sub_; + /// Publishes the takeoff, landing and velocity information respectively. ros::Publisher drone_takeoff_pub_, drone_land_pub_,cmd_vel_pub_; std::vector setPoints_; protected: - ros::NodeHandle m_nh; // if you need to create some publisher and subscriber - std::mutex m_mu; // if you need to lock some function for safe operations + /// This ROS Handle attribute is used to create various publishers and subscribers which also deals with messages. + ros::NodeHandle m_nh; + /// Locks some functions for safe operations + std::mutex m_mu; + /// @brief Applications applied to control the state of the robot using Joystick controller. enum ButtonState{ - IDLE = 0, // setpoint can be freely moved with joystick. Sphere color blue - TAKEOFF, // drone will takeoff from the ground - LAND, //drone will land - ENGAGE, // set current location as a set point (for hover). Sphere color yellow - CONTROL // start PID controller for the current setpoint. Sphere color cyan + /// Setpoint can be freely moved with joystick. Sphere color blue + IDLE = 0, + /// Drone will takeoff from the ground + TAKEOFF, + /// Drone will land + LAND, + /// Set current location as a set point (for hover). Sphere color yellow + ENGAGE, + /// Start PID controller for the current setpoint. Sphere color cyan + CONTROL }m_buttonState; - // this function will give robot state + /// This attribute gives the state of the robot. StateObserverPtr m_get_state; - // controller param - double dt_; // sample time - double m_goal_thres; // goal region threshold + // controller parameters. + /// Sample Time + double dt_; + /// Goal region threshold + double m_goal_thres; private: + /// @brief This function finds out the engaged button of the joystick i.e, checks the state of the button and + /// and publishes the resulted behavior of the drone (Take Off or Land). + /// It also updates the positon of drone which is also passed to RVIZ to update the position and path for visalization. + /// @param msg reports the state of a joysticks axes and buttons. void joystick_callback(const sensor_msgs::Joy::ConstPtr& msg); + /** + * @brief Updates the setpoint of the drone when the axes of the joystick controller is changed or moved. As a result, it also updates the color and path of the drone for visualization. + * @param event Creates a timer to call a function at a specific rate. + */ void joystick_timer_callback(const ros::TimerEvent& event); - + /// @brief Responsible for making the drone hover at a certain position void control_loop(const ros::TimerEvent& event); + /// @brief Sets the position and rotation of the drone through the setpoints . + /// @param state is used as an parameter to pass the setpoints. + /// @return Returns the tf::Transform pose which is the new position and rotated angle of the robot. tf::Transform getStateVecToTransform(const std::vector& state); protected: + /// @brief This function sets the linear positon of the drone to all 3 linear axes and to angular z-axis and publishes the message of the current position of the drone. + /// @param U is array of commands of size 4 which sets the above mentioned position of the drone. void publish_cmd_vel(const std::vector&U); + /// @brief This function calculates the distance between the setpoint of the drone and the current state position. + /// @param X is an array of vectors of data type double representing the present position of the drone. + /// @param setPoints is an array of vectors representing the commanded position. + /// @return Errors between the current and commanded position of the robot. double goal_distance(const std::vector& X, const std::vector& setPoints); virtual void compute_control(const std::vector& X, const std::vector& setPoints, std::vector& control) = 0; diff --git a/include/airlib/control/PID.h b/include/airlib/control/PID.h index cdda0e0..63f0782 100644 --- a/include/airlib/control/PID.h +++ b/include/airlib/control/PID.h @@ -8,12 +8,28 @@ #define NUM_GAINS 3 namespace bebop2 { - + /// @brief Calculates an error value as the difference between desired output and the current output and applies a correction based on proportional, integral and derivative terms(denoted by P, I, D respectively). class PID { public: + /// @brief A default Constuctor. PID(); + /** @brief Init method initiliazes all the controller parameters like proportional constant, Integral constant, Derivative constant, + * rate of change, maximum and minimum output values. + */ void init(double dt, double max, double min, double Kp, double Kd, double Ki); + /** @brief At first it calculates the error by subtracting the setpoint and current position of the drone, + * Then the Proportional, Integral, Derivate terms are calculated using that error and their repective constans. + * Following that, we find out the total ouptput by the sum of three terms and tehn restrict the output withtin the boundaries of minimum, maximum valeus. + * @param setpoint It is the desired position of the drone. + * @param pv It is the current position of the drone. + * @return Returns the error between the setpoint and the current postion of the drone. + */ + /** @note PID Gains identifiers. + * - Kp = Proportionality Constant + * - Kd = Derivative Constant + * - Ki = Intergration Constant + */ double calculate( double setpoint, double pv ); diff --git a/include/airlib/control/QuadControllerPID.h b/include/airlib/control/QuadControllerPID.h index 8613627..d673294 100644 --- a/include/airlib/control/QuadControllerPID.h +++ b/include/airlib/control/QuadControllerPID.h @@ -11,13 +11,29 @@ #include namespace bebop2{ + /// @brief Responsible to find the error values every second whenever the position of the quadrators of the drone is updated. class QuadControllerPID : public ControllerBase{ public: + /** @brief The QuadControllerPID constructor initializes a vector of type double that is responsible for populating the PID Gains, maximum and minimum threshold values. + * @param mGetState This parameter givs the current state of the robot. + * @param nh Used to setup publishers, subscribers and deals with various messages. + */ QuadControllerPID(StateObserverPtr mGetState, ros::NodeHandle& nh); private: bebop2::PID _quadController[NUM_CONTROLLER]; + /// @brief Sets all the proportional, integral, and derivative constants along with the maximum and minimum output values. + /// @param gains vector of size 4 and of type double that stores the PID controller parameters. + /** @note PID Gains identifiers. + * - Kp = Proportionality Constant + * - Kd = Derivative Constant + * - Ki = Intergration Constant + */ void set_gains(const std::vector &gains, bebop2::PID *controller); protected: + /// @brief Similar to the calculate() method in PID.h class, the compute_control method also calculates the error, PID Gain constants and return the error value when the drone is hovering over a position for the four vector values. + /// @param X is the current state of the drone. + /// @param setPoints is the desired goal position of the drone. + /// @param control is the actively control position. void compute_control(const std::vector &X, const std::vector &setPoints, std::vector &control) override; }; diff --git a/include/airlib/localization/Filters/ComplementaryFilter.h b/include/airlib/localization/Filters/ComplementaryFilter.h index 5b50681..bfb89b9 100644 --- a/include/airlib/localization/Filters/ComplementaryFilter.h +++ b/include/airlib/localization/Filters/ComplementaryFilter.h @@ -7,7 +7,9 @@ #include #include "FilterBase.h" +/// @brief The ComplementaryFilter.h class implements the complmentary filter where it initializes the state and updates it using the class ComplementaryFilter: public FilterBase{ +/// filter's alpha paramater in update() method. public: ComplementaryFilter(double alpha): m_alpha(alpha) { @@ -19,6 +21,8 @@ class ComplementaryFilter: public FilterBase{ X_.clear(); std::copy(X0.begin(), X0.end(), std::back_inserter(X_)); } + + void update(const std::vector& obs, std::vector& result) { diff --git a/include/airlib/localization/Filters/ExtendedKalmanFilter.h b/include/airlib/localization/Filters/ExtendedKalmanFilter.h index b7da259..b8b1358 100644 --- a/include/airlib/localization/Filters/ExtendedKalmanFilter.h +++ b/include/airlib/localization/Filters/ExtendedKalmanFilter.h @@ -12,13 +12,26 @@ #include namespace bebop2{ - + /** + * @brief The extended Kalman Filter uses an algorithm to estimate the state of the system like velocity and position of the drone + * by using past and possible noisy observations and current and possibly noisy measurements of that system. + * + * It estimates the next state of the drone and corrects the estimated state with actual measurements. + */ class ExtendedKalmanFilter: public FilterBase{ public: ExtendedKalmanFilter(const std::vector& sigma_pos, double dt, int state_dim); void init(const std::vector& X0) override; + /// @brief Populates it with the estimated state of the system. + /// @param state Vector of tyoe double indicating the state. void operator()(std::vector& state); + /// @brief Updates the command velocity of the drone by changing the linear x,y,z and angular z values. + /// @param cmd A pointer that points to the cmd_vel topic. void update_cmd(const geometry_msgs::Twist::ConstPtr& cmd); + /// @brief In this method, the input obs is converted from a std::vector to an Eigen vector z and then passed to the internal_update() method. + /// After the internal_update method is called, the updated state estimate stored in xEst_ is copied into the output result vector. + /// @param obs A vector of measured values + /// @param result A vector to store the update state estimate void update(const std::vector& obs, std::vector& result) override; ; @@ -34,9 +47,23 @@ namespace bebop2{ protected: // x_{t+1} = F@x_{t}+B@u_t Eigen::VectorXd motion_model(const Eigen::VectorXd& x, const Eigen::VectorXd& u); + /// @brief Calculates the Jacobian matrix of the motion model + /// @param x State variable + /// @param u + /// @return Returns the Jacobian matrix Eigen::MatrixXd jacobF(const Eigen::VectorXd& x, const Eigen::VectorXd& u); + /// @brief Calculates the predicted measurement values + /// @param x State variable + /// @return Returns the predicted measurement values Eigen::VectorXd observation_model(const Eigen::VectorXd& x); + /// @brief Checks the linearity between the state and the measured variables. + /// @return Jacobian matrix of the observation model. Eigen::MatrixXd jacobH() const; + /** @brief The internal update step is used to update the linearized measurement model, which is used to calculate the Kalman gain. + * The internal transformation step involves updating the Jacobian matrix that linearizes the measurement model around the current state estimate, and the measurement noise covariance. + * @param z A vector of measured values. This is the measurement data that is used to update the state estimate. + * @param u A vector of control inputs. This is the control data that is used in the motion model to predict the state estimate. + */ void internal_update(const Eigen::VectorXd& z, const Eigen::VectorXd& u); double DT, STATE_DIM, CONTROL_DIM; diff --git a/include/airlib/localization/Filters/FilterBase.h b/include/airlib/localization/Filters/FilterBase.h index 82c29e8..4010192 100644 --- a/include/airlib/localization/Filters/FilterBase.h +++ b/include/airlib/localization/Filters/FilterBase.h @@ -11,25 +11,37 @@ class FilterBase; typedef std::shared_ptr FilterPtr; - +/// @brief The FilterBase class enables various other classes to share the FilterPtr. This class allows other classes like ComplementaryFilter.h, +/// ExtendedKalmanFilter.h,Particle.h to use methods like init(), update() to store the estimated state and update the state. class FilterBase: std::enable_shared_from_this { public: + /// @brief Constructor FilterBase() { } + /// @brief Deconstructor virtual ~FilterBase() { } + /// @brief systematic way to share FilterPtr to control class + /// @return FilterPtr FilterPtr getPtr() { return shared_from_this(); } + + /// @brief Makes the current estimate of the state of the system start out being the same as the true state. + /// @param X0 A vector of initial values for the state estimate. virtual void init(const std::vector& X0) = 0; + /// @brief Updated state is calculated and stored. + /// @param obs A vector of measured values + /// @param result A vector to store the update state estimate virtual void update(const std::vector& obs, std::vector& result) = 0; protected: + /// @brief Estimated state of the system. std::vector X_; }; diff --git a/include/airlib/localization/Filters/particle_filter.h b/include/airlib/localization/Filters/particle_filter.h index df39497..abdfb7e 100644 --- a/include/airlib/localization/Filters/particle_filter.h +++ b/include/airlib/localization/Filters/particle_filter.h @@ -15,26 +15,35 @@ #include - +/// @brief Data structure to store information about landmarks in a map. class TagMap { public: - + /// @brief structure holds information about each individual landmark, including its ID, and its x, y, and z positions in the global coordinate system. struct single_landmark_s{ - int id_i ; // Landmark ID - double x_d; // Landmark x-position in the map (global coordinates) - double y_d; // Landmark y-position in the map (global coordinates) - double z_d; // Landmark z-position in the map (global coordinates) + /// Landmark ID + int id_i ; + /// Landmark x-position in the map (global coordinates) + double x_d; + /// Landmark y-position in the map (global coordinates) + double y_d; + /// Landmark z-position in the map (global coordinates) + double z_d; }; - std::vector landmark_list ; // List of landmarks in the map + /// List of landmarks in the map + std::vector landmark_list ; }; - +/// @brief initializes the mean and covariance matrix for the distribution. The mean and covariance matrix are used in the calculation +/// along with the observation passed to the pdf function. class Mvn { public: + /// @brief Constructo + /// @param landmark Landmark + /// @param std Array of dimension 3 [standard deviation of x [m], standard deviation of y [m] standard deviation of yaw [rad] Mvn(const TagMap::single_landmark_s & landmark, const std::vector& std) { @@ -55,11 +64,13 @@ class Mvn sigma_det = sigma.determinant(); } + /// Deconstructor ~Mvn() { } template + /// Calculates the probability density function value for a given observation. double pdf(const T& obs_m) const { Eigen::Vector3d x; @@ -81,7 +92,7 @@ class Mvn double sigma_det; }; - +/// @brief This structure allows us to create particles and set their values. struct Particle { int id; @@ -91,6 +102,9 @@ struct Particle { double theta; double weight; + /// @param os It is an output stream objects that writes sequences of characters. + /// @param location Particle struct + /// @return Returns the output of the id, x, y, z positions in string format. friend std::ostream &operator<<(std::ostream &os, const Particle &particle) { os << "id: " << particle.id << " x: " << particle.x << " y: " << particle.y << " z: " << particle.z << " theta: " @@ -100,29 +114,40 @@ struct Particle { }; -/* - * Struct representing one landmark observation measurement. - */ +/** +* @brief It is a Struct representing one landmark observation measurement. +*/ struct LandmarkObs { - int id; // Id of matching landmark in the map. - double x; // Local (vehicle coordinates) x position of landmark observation [m] - double y; // Local (vehicle coordinates) y position of landmark observation [m] - double z; // Local (vehicle coordinates) z position of landmark observation [m] + /// Id of matching landmark in the map. + int id; + /// Local (vehicle coordinates) x position of landmark observation [m] + double x; + /// Local (vehicle coordinates) y position of landmark observation [m] + double y; + /// Local (vehicle coordinates) z position of landmark observation [m] + double z; }; - +/** +* @brief initializing particles to Gaussian distribution around first position and then Predicts the state for the next time step +* using the process model. +* +* Updates the weights for each particle based on the likelihood of the observed measurements following the resampling from the updated set of particles to form +* the new set of particles and returns whether particle filter has been initliazed or not. +* +*/ class ParticleFilter { - // Number of particles to draw + /// Number of particles to draw int num_particles; - // Flag, if filter is initialized + /// Flag, if filter is initialized bool is_initialized; - // Vector of weights of all particles + /// Vector of weights of all particles std::vector weights; const TagMap tagMap_; @@ -139,15 +164,16 @@ class ParticleFilter { public: - // Set of current particles + /// Set of current particles std::vector particles; - // Constructor - // @param M Number of particles + /// Constructor of ParticleFilter class. + /// @param M Number of particles ParticleFilter(int num_particles, const TagMap& tagMap, double delta_t) : num_particles(num_particles), tagMap_(tagMap), is_initialized(false), delta_t(0.03) {} + void operator()(std::vector& state); - // Destructor + // Deconstructor ~ParticleFilter() { @@ -163,7 +189,7 @@ class ParticleFilter { /** - * init Initializes particle filter by initializing particles to Gaussian + * @brief Init Initializes particle filter by initializing particles to Gaussian * distribution around first position and all the weights to 1. * @param x Initial x position [m] (simulated estimate from GPS) * @param y Initial y position [m] @@ -174,7 +200,7 @@ class ParticleFilter { void init(const std::vector& x0, const std::vector& std); /** - * prediction Predicts the state for the next time step + * prediction() method Predicts the state for the next time step * using the process model. * @param delta_t Time between time step t and t+1 in measurements [s] * @param std_pos[] Array of dimension 3 [standard deviation of x [m], standard deviation of y [m] diff --git a/include/airlib/localization/Sensors/ApriltagLandmarks.h b/include/airlib/localization/Sensors/ApriltagLandmarks.h index e6cf003..8ae059f 100644 --- a/include/airlib/localization/Sensors/ApriltagLandmarks.h +++ b/include/airlib/localization/Sensors/ApriltagLandmarks.h @@ -15,18 +15,19 @@ #include #include "SensorBase.h" -class ApriltagLandmarks : public SensorBase{ /** - * @brief This class compute the robot coordinate from stationary tags. + * @brief This class computes the robot coordinate from stationary tags. + * * There are three stationary apriltags located on the wall. * These tags are treated as known landmarks for the map. * Bebop2 can view these tags with the front facing camera. - * It is not necessary to see all the tags even one landmark can help to localize the robot. + * It is not necessary to see all the tags since even one landmark can help to localize the robot. * This information is feedback to the computer to detect apriltags from the camera image. * Bebop2 can transmit this images upto 28 Hz speed - * Apprantly, the tags are located only front direction, therefore robot yaw angle is ignored. + * Apparently, the tags are located only front direction, therefore robot yaw angle is ignored. * */ +class ApriltagLandmarks : public SensorBase{ public: ApriltagLandmarks(ros::NodeHandle& nh); @@ -38,14 +39,14 @@ class ApriltagLandmarks : public SensorBase{ std::unordered_map landmarks_; /// @brief apriltag node subscriber ros::Subscriber apriltagSub_; - /// @brief ros NodeHandle for dealing with various messages + /// @brief ROS NodeHandle for dealing with various messages ros::NodeHandle nh_; /// @brief measurements_ queue is reponsible to efficiently communicate with Control Module std::queue> measurements_; protected: /** - * @brief given a array of detected tags, here we calculate robot global coordinate with respect to each tag. + * @brief Given an array of detected tags, here we calculate robot global coordinate with respect to each tag. * Each tag propose a noisy state of the robot when transformed it to the global frame. * Therefore, an appropriate state filter is used to denoise those readings and compute the robot state accurately. * diff --git a/include/airlib/localization/Sensors/DummyState.h b/include/airlib/localization/Sensors/DummyState.h index df9a4a1..0452976 100644 --- a/include/airlib/localization/Sensors/DummyState.h +++ b/include/airlib/localization/Sensors/DummyState.h @@ -12,7 +12,8 @@ namespace bebop2{ /** - * Dummy state will create a state space repersentation for quadrotor. + * @brief Dummy state creates a state space repersentation for quadrotor. + * The key idea is to initialize a state at (0, 0, 0, 0) and take joystick command to update state. * To capture realistic behavior add some gaussian white noise to the state. * When bebop2 takeoff from the ground it reaches 1m above from the ground origin and when it lands then z axis value is 0. @@ -32,6 +33,9 @@ namespace bebop2{ * @param noisy_reading an option to make a realistic sensor reading: if true white noise will be added to the output */ DummyState(ros::NodeHandle& nh, bool noisy_reading); + /** @brief Populates the requested state vector. + * @param state Gives the current position of the drone. + */ void operator()(std::vector& state); bool empty(); @@ -43,10 +47,11 @@ namespace bebop2{ ros::Subscriber sub_takeoff_, sub_land_, sub_cmd_vel_; /// @brief to generate Gaussian white noise we need random device std::random_device rd_; + /// @brief Checks if noise reading is enabled or not. bool noisy_reading_; const size_t STATE_DIM = 4; - /// @brief discrete sample time is determined by control frequence + /// @brief discrete sample time is determined by control frequency. const double DT = 0.03; // 30 Hz /// @brief white noise amplitude const double NOISE = 0.2; diff --git a/include/airlib/localization/Sensors/SensorBase.h b/include/airlib/localization/Sensors/SensorBase.h index f6552e8..f5124a7 100644 --- a/include/airlib/localization/Sensors/SensorBase.h +++ b/include/airlib/localization/Sensors/SensorBase.h @@ -13,6 +13,12 @@ class SensorBase; typedef std::shared_ptr SensorPtr; +/** +* @brief This class provides a conection to acquire internal state vector + +* so that other components required for the bebop to operate successfully can do estimation and calculation. +* It also publishes the drone's positon and transformation so that we can picture it in a graphical interface such as RVIZ. +*/ class SensorBase: std::enable_shared_from_this { public: @@ -26,7 +32,7 @@ class SensorBase: std::enable_shared_from_this * @brief This is an interface to access to the internal state vector so that other modules can do their computation * @note this interface depends on bool empty() * @param result copy internal state vector to result vector - */ + */ virtual void operator()(std::vector& result) = 0; /** * @brief This is an interface to check whether internal state vector is empty or not so that we can safely read internal state vector. diff --git a/include/airlib/localization/StateObserver.h b/include/airlib/localization/StateObserver.h index 7693a95..d2afd78 100644 --- a/include/airlib/localization/StateObserver.h +++ b/include/airlib/localization/StateObserver.h @@ -14,22 +14,45 @@ namespace bebop2 { class StateObserver; typedef std::shared_ptr StateObserverPtr; + /** + * @brief The StateObserver class Observes and updates the state of the drone + * + * and sends those messages to different modules of the program such as controllers, sensors etc so that they can control the drone and perform tasks. + */ + class StateObserver { public: + /// @brief Initializes the filter and sensor parameter and sets m_initliazed to False. + /// @param filter A barrier to refine the noise. + /// @param sensor + /// explicit StateObserver(FilterPtr filter, SensorPtr sensor); - void operator()(std::vector& result); - - - + /// @brief It updates and copies the state of the drone and adds the copied state into the parameter result. + /// @param result + void operator()(std::vector& result); private: + // + // Accesses the internal state vector + // Publishes robot transformation void update_state(); protected: /* Quadrotor state * x, y, z, yaw - */ + */ + /** @brief This attribute is an array of values and the elements in the vector gives the state of the robot. The first three + * attributes are vectors that gives the linear state of the robot and yaw gives the rotation of the robot about these vectors + */ + /** @note The elements in the array are commonly represented by:- + * - x ---> Position of the drone in x-axis. + * - y ---> Position of the drone in x-axis. + * - z ---> Position of the drone in z-axis. + * - w ---> yaw (Rotation about z-axis). + */ std::vector m_state; + /// @brief Shared pointer that provides the address to the FilterBase.h class FilterPtr m_filter; + /// @brief Shared pointer that provides the addreess to the SensorBase.h class SensorPtr m_sensor; bool m_initialized; diff --git a/include/airlib/robot_defs.h b/include/airlib/robot_defs.h index 5e1efa9..024d666 100644 --- a/include/airlib/robot_defs.h +++ b/include/airlib/robot_defs.h @@ -5,12 +5,17 @@ //const int STATE_DIM = 10; +/// @brief Structure defining the state of the drone. struct RobotState { - double x; // x-position (in meters) - double y; // y-position (in meters) - double z; // z-position (in meters) - double theta; // z-orientation (in radians) + /// x-position(in meters) + double x; + /// y-position (in meters) + double y; + /// z-position (in meters) + double z; + /// z-orientation (in radians) + double theta; // double vx; // x-linear velocity (in meters) // double vy; // y-linear velocity (in meters) // double vz; // z-linear velocity (in meters) @@ -20,14 +25,22 @@ struct RobotState }; -/* Field location structure in radial distance (r), azimuthal angle (theta), and polar angle (psi)*/ +/// Field location structure in radial distance (r), azimuthal angle (theta), and polar angle (psi) struct MarkerObservation { - std::string tagName; // Index of observed marker [0-n] - double radial_distance; // Observed distance to landmark from robot position - double azimuthal_angle; // Observed bearing to landmark in the XY coordinate frame - double polar_angle; // Observed bearing to landmark in the positive Z axis, + std::string tagName; // Index of observed marker [0-n] + /// Observed distance to landmark from robot position + double radial_distance; + /// Observed bearing to landmark in the XY coordinate frame + double azimuthal_angle; + /// Observed bearing to landmark in the positive Z axis + double polar_angle; + + /// @brief + /// @param os It is an output stream objects that writes sequences of characters + /// @param observation Reference to MarkerObservation struct. + /// @return Returns the output of tagname, radial distance, azimuthal angle and polar angle. friend std::ostream &operator<<(std::ostream &os, const MarkerObservation &observation) { double degFactor = (180.0/3.141592653589793238463); os << "tagName: " << observation.tagName << " radial_distance: " << observation.radial_distance @@ -38,14 +51,19 @@ struct MarkerObservation }; -/* Field location structure */ +/// Field location structure struct FieldLocation { std::string tagName; - double x; // x-position (in meters) - double y; // y-position (in meters) - double z; // z-position (in meters) + /// x-position (in meters) + double x; + /// y-position (in meters) + double y; + /// z-position (in meters) + double z; + /// @brief Calculates the radial distance, azimuthal angle and polar angle using x,y,z position. + /// @return Returns the the structure of MarkerObservation with the spherical coordinates. MarkerObservation toObservation() { double rho = sqrt(x * x + y * y + z * z); @@ -54,12 +72,18 @@ struct FieldLocation return MarkerObservation{tagName, rho, theta, phi}; } - + /// @param os It is an output stream object that writes sequences of characters. + /// @param location Reference to the FieldLocation Struct. + /// @return Returns the output of tagName, x, y and z positions in string format. friend std::ostream &operator<<(std::ostream &os, const FieldLocation &location) { os << "tagName: " << location.tagName << " x: " << location.x << " y: " << location.y << " z: " << location.z; return os; } + + /// @brief Calculates the difference between two tags. + /// @param other is the other AprilTag. + /// @return the struct with the new tagname, x,y and z position FieldLocation operator - (const FieldLocation& other) const { double dx = x - other.x; @@ -68,6 +92,9 @@ struct FieldLocation return FieldLocation{tagName + "-" + other.tagName, dx, dy, dz}; } + /// @brief Calculates the sum of two tags. + /// @param other is the other AprilTag. + /// @return the struct with the new tagname, x,y and z position FieldLocation operator + (const FieldLocation& other) const { double dx = x + other.x; @@ -76,6 +103,9 @@ struct FieldLocation return FieldLocation{tagName, dx, dy, dz}; } + /// @brief Calculates the product between two tags. + /// @param other is the other AprilTag. + /// @return the struct with the new tagname, x,y and z position FieldLocation operator * (double scale) const { double dx = x * scale; diff --git a/include/airlib/utility/LoggerCSV.h b/include/airlib/utility/LoggerCSV.h index 8f35fcc..5ebb9c1 100644 --- a/include/airlib/utility/LoggerCSV.h +++ b/include/airlib/utility/LoggerCSV.h @@ -10,20 +10,21 @@ using namespace std::literals; +/// @brief This class allows us to easily log information to a CSV file format. class LoggerCSV{ using TIME_POINT = std::chrono::time_point; public: - // this is a default contructor without st.pop_back();header. - // one can manually add header file using addHeader function + /// @brief This is a default contructor without st.pop_back();header. + /// One can manually add header file using addHeader function LoggerCSV() { m_header_enabled = false; m_timer_enabled = false; } - /// use this constructor to create a csv file with header + ///@brief This constructor is used to create a csv file with header LoggerCSV(const std::vector&header) { m_header_enabled = false; @@ -31,31 +32,30 @@ class LoggerCSV{ addHeader(header); } - /// use this contructor when you want to record data row at different frequency than sensor frequency + ///@brief This constructor is used to to record data row at different frequency than sensor frequency whenever required. explicit LoggerCSV(const std::vector&header, const int frequency) { m_header_enabled = false; m_timer_enabled = false; addHeader(header); - // initiate last update time 1 min later to write data row - // write time only depends on actual data not header + /// @brief Initiates last update time 1 min later to write data row and write time only depends on actual data not header m_last_update_time = std::chrono::system_clock::now() - 1min; m_timer_enabled = true; - // calculate pause time in millisecond between two data rows + /// calculates the pause time in millisecond between two data rows m_pause_time_ms = 1000 / frequency; } + /// @brief When this class will be distructed, we will write the logger values from ROM to a csv file on the hard drive. ~LoggerCSV() { - // when this class will be distructed, we will write the logger values from ROM to a csv file on the hard drive. std::string value = m_data.str(); // don't write file if there is no data added to the logger if(!value.length()) return; - // remove last new line from the string + /// Removes last new line from the string value.pop_back(); // make sure you have unique name for each logger file. Use system timestamp to serve this purpose @@ -65,7 +65,7 @@ class LoggerCSV{ myfile.close(); } - /// this function is used to generate unique name for a file with timestamp + /// @brief This function is used to generate unique name for a file with timestamp std::string getTimestamp() { const TIME_POINT now = std::chrono::system_clock::now(); @@ -88,7 +88,7 @@ class LoggerCSV{ { if(m_timer_enabled) { - // if timer is enabled then discard the data point based on the pause limit + /// If timer is enabled then it discards the data point based on the pause limit const auto end = std::chrono::system_clock::now(); int elapsed_time = std::chrono::duration_cast(end - m_last_update_time).count(); @@ -98,7 +98,7 @@ class LoggerCSV{ m_last_update_time = std::chrono::system_clock::now(); } - // if header is present then check the number of columns match with header column + /// If header is present then this checks the number of columns match with header column if(m_header_enabled) if(m_header_len != data.size()) { @@ -106,7 +106,7 @@ class LoggerCSV{ return; } - // we are now ready to store the data into RAM using stringstream + /// This will store the data into RAM using stringstream int index = 0; for(const auto& item: data) if(++index < data.size())