22
33Welcome to PickNik Robotics's fork of fuse!
44
5+ This branch is for ROS Humble.
6+
57## Getting Started
68
79Using the Dockerfile is the easiest way to get started. Once inside, simply ` rosdep update ` and ` colcon build ` and you're ready to get started! Try ` ros2 launch fuse_tutorials fuse_3d_tutorial.launch.py ` and look at its pertinent code for a crash course in fuse and its capabilities.
@@ -40,7 +42,7 @@ optimizer will cache the constraints and process them in small batches on some s
4042require considerable processing time, introducing a delay between the completion of the optimization cycle and the
4143publishing of data to the ROS topic.
4244
43- ![ fuse sequence diagram] ( doc/fuse_sequence_diagram.png )
45+ ![ fuse sequence diagram] ( doc/images/ fuse_sequence_diagram.png )
4446
4547## Example
4648
@@ -74,14 +76,14 @@ time. This is enough to construct our first `fuse` system. Below is the constrai
7476system. The large circles represent state variables at a given time, while the small squares represent measurements.
7577The graph connectivity indicates which variables are involved in what measurements.
7678
77- ![ fuse graph] ( doc/fuse_graph_1.png )
79+ ![ fuse graph] ( doc/images/ fuse_graph_1.png )
7880
7981The two sensor models are configured as plugins to an optimizer implementation. The optimizer performs the required
8082computation to generate the optimal state variable values based on the provided sensor constraints. We will never be
8183able to exactly satisfy both the wheel encoder constraints and the laserscan constraints. Instead we minimize the error
8284of all the constraints using nonlinear least squares optimization.
8385
84- ![ fuse optimizer] ( doc/fuse_optimizer_1.png )
86+ ![ fuse optimizer] ( doc/images/ fuse_optimizer_1.png )
8587
8688While our ` fuse ` system is optimizing constraints from two different sensors, it is not yet publishing any data back
8789out to ROS. In order to publish data to ROS, we derive a ` fuse_core::Publisher ` class and add it to the
@@ -90,7 +92,7 @@ implementation determines what type of messages are published and at what freque
9092we would like visualize the current pose of the robot in RViz, so we create a ` fuse ` publisher that finds the most
9193recent pose and converts it into a ` geometry_msgs::msg::PoseStamped ` message, then publishes the message to a topic.
9294
93- ![ fuse optimizer] ( doc/fuse_optimizer_2.png )
95+ ![ fuse optimizer] ( doc/images/ fuse_optimizer_2.png )
9496
9597We finally have something that is starting to be useful.
9698
@@ -100,38 +102,38 @@ Typically the laser measurements and the wheel encoder measurements are not sync
100102sampled faster than the laser, and are sampled at different times using a different clock. If we do not do anything
101103different in this situation, the constraint graph becomes disconnected.
102104
103- ![ fuse graph] ( doc/fuse_graph_2.png )
105+ ![ fuse graph] ( doc/images/ fuse_graph_2.png )
104106
105107This is where motion models come into play. A motion model differs from a sensor model in that constraints can be
106108generated between any two requested timestamps. Motion model constraints are generated upon request, not due to their
107109own internal clock. We use the motion model to connect the states introduced by the other sensor measurements. We
108110derive a class from the ` fuse_core::MotionModel ` base class and implement a differential drive kinematic
109111constraint for our robot.
110112
111- ![ fuse optimizer] ( doc/fuse_optimizer_3.png )
113+ ![ fuse optimizer] ( doc/images/ fuse_optimizer_3.png )
112114
113115The motion models are also configured as plugins to the optimizer. The optimizer requests motion models constraints
114116from the configured plugins whenever new states are created by the sensor models.
115117
116- ![ fuse graph] ( doc/fuse_graph_3.png )
118+ ![ fuse graph] ( doc/images/ fuse_graph_3.png )
117119
118120### Adaptation #2 : Full path publishing
119121
120122Nothing about the ` fuse ` framework limits you to having a single publisher. What if you want to visualize the entire
121123robot trajectory, instead of just the most recent pose? Well, we can create a new derived ` fuse_core::Publisher ` class
122124that publishes all of the robot poses using a ` nav_msgs::msg::Path ` message.
123125
124- ![ fuse optimizer] ( doc/fuse_optimizer_4.png )
126+ ![ fuse optimizer] ( doc/images/ fuse_optimizer_4.png )
125127
126128### Adaptation #3 : Changing kinematics
127129
128130In your spare time, you also build [ autonomous power wheels racers] ( http://www.powerracingseries.org/ ) . But race cars
129131don't use differential drive; you need a different motion model. Easy enough. We simply derive a new
130132` fuse_core::MotionModel ` class that implements an Ackermann steering model. Everything else can be reused.
131133
132- ![ fuse optimizer] ( doc/fuse_optimizer_5.png )
134+ ![ fuse optimizer] ( doc/images/ fuse_optimizer_5.png )
133135
134- ![ fuse graph] ( doc/fuse_graph_4.png )
136+ ![ fuse graph] ( doc/images/ fuse_graph_4.png )
135137
136138### Adaptation #4 : Online calibration
137139
@@ -146,9 +148,9 @@ how the wheel diameter is expected to change over time. Maybe some sort of expon
146148derive a new publisher plugin from ` fuse_core::Publisher ` that publishes the current wheel diameter. This allows us to
147149plot how the wheel diameter changes over the length of the race.
148150
149- ![ fuse optimizer] ( doc/fuse_optimizer_6.png )
151+ ![ fuse optimizer] ( doc/images/ fuse_optimizer_6.png )
150152
151- ![ fuse graph] ( doc/fuse_graph_5.png )
153+ ![ fuse graph] ( doc/images/ fuse_graph_5.png )
152154
153155Now our system estimates the wheel diameters at each time step as well as the robot's pose.
154156
@@ -167,11 +169,27 @@ end users to concentrate on modeling the robot, sensor, system, etc. and spend l
167169sensor models together into runable code. And since all of the models are implemented as plugins, separate plugin
168170libraries can be shared or kept private at the discretion of their authors.
169171
170- ## API Concepts
172+ ## Documentation
173+
174+ ### API Concepts
171175
172- * [ Variables] ( doc/Variables.md )
173- * [ Constraints] ( doc/Constraints.md )
176+ * Optimizers -- coming soon
177+ * [ Variables] ( doc/concepts/Variables.md )
178+ * Graphs -- coming soon
174179* Sensor Models -- coming soon
175180* Motion Models -- coming soon
176181* Publishers -- coming soon
177- * Optimizers -- coming soon
182+ * [ Constraints] ( doc/concepts/Constraints.md )
183+
184+ ### Implementation Documentation
185+
186+ This is documentation of specific implementations of the above concepts.
187+
188+ Documentation in progress, see [ this issue] ( https://github.com/PickNikRobotics/fuse/issues/23 ) .
189+
190+ * [ Optimizers] ( ./fuse_optimizers/doc/optimizers.md )
191+ * [ Variables] ( ./fuse_variables/doc/variables.md )
192+ * [ Graphs] ( ./fuse_graphs/doc/graphs.md )
193+ * [ Motion Models] ( ./fuse_models/doc/motion_models/motion_models.md )
194+ * [ Sensor Models] ( ./fuse_models/doc/sensor_models/sensor_models.md )
195+ * [ Constraints] ( ./fuse_constraints/doc/constraints.md )
0 commit comments