Robotics StackExchange | Archived questions

ekf angle estimation

Hello everyone! My setup is ROS Jade, Ubuntu Trusty I am currently using a 2 wheeled robot that is driving a full circle or a straight line, for calibrating purposes. The available sensors are: wheel encoders and gyro.

I now fuse linear velocity and yaw velocity in the ekflocalizationnode via a TwistWithCovarianceStamped message. First I ignored yaw velocity to determine the gain of the wheel encoders. It works just fine since when I rostopic echo /odometry/filtered I actually see that the robot followed a 5.5 m straight line.

Now, when i also fuse yaw velocity I have some issues.Although the robot is supposed to drive 2pi counter-clockwise, what happens is that after being filtered, the estimated orientation (following z axis) is between 1 and -1 when I determined the gain.

To determine the gain I just assumed that the total number of impulses output to the gyro between the beginning and the end equals 2pi (6.28). Did I make a mistake?

Here is my launchfile:

<!-- Launch file for ekf_localization_node -->

<!-- This node will take in measurements from odometry, IMU, stamped pose, and stamped twist messages. It tracks
     the state of the robot, with the state vector being defined as X position, Y position, Z position,
     roll, pitch, yaw, their respective velocites, and linear acceleration. Units for all measurements are assumed
     to conform to the SI standard as specified in REP-103. -->
<node pkg="robot_localization" type="ekf_localization_node" name="ekf_localization" clear_params="true">

  <!-- ======== STANDARD PARAMETERS ======== -->

  <!-- The frequency, in Hz, at which the filter will output a position estimate. Note that
       the filter will not begin computation until it receives at least one message from
       one of the inputs. It will then run continuously at the frequency specified here,
       regardless of whether it receives more measurements. Defaults to 30 if unspecified. -->
  <param name="frequency" value="20"/>

  <!-- The period, in seconds, after which we consider a sensor to have timed out. In this event, we
       carry out a predict cycle on the EKF without correcting it. This parameter can be thought of
       as the minimum frequency with which the filter will generate new output. Defaults to 1 / frequency
       if not specified. -->
  <param name="sensor_timeout" value="0.06"/>

  <!-- If this is set to true, no 3D information will be used in your state estimate. Use this if you
       are operating in a planar environment and want to ignore the effect of small variations in the
       ground plane that might otherwise be detected by, for example, an IMU. Defaults to false if
       unspecified. -->
  <param name="two_d_mode" value="true"/>

  <!-- REP-105 (http://www.ros.org/reps/rep-0105.html) specifies three principal coordinate frames: map,
       odom, and base_link. base_link is the coordinate frame that is affixed to the robot. The robot's
       position in the odom frame will drift over time, but is accurate in the short term and should be
       continuous. The odom frame is therefore the best frame for executing local motion plans. The map
       frame, like the odom frame, is a world-fixed coordinate frame, and while it contains the most
       globally accurate position estimate for your robot, it is subject to discrete jumps, e.g., due to
       the fusion of GPS data. Here is how to use the following settings:
         1. Set the map_frame, odom_frame, and base_link frames to the appropriate frame names for your system.
              * If your system does not have a map_frame, just remove it, and make sure "world_frame" is set
                to the value of odom_frame.
         2. If you are fusing continuous position data such as wheel encoder odometry, visual odometry, or IMU data,
            set "world_frame" to your odom_frame value. This is the default behavior for robot_localization's state
            estimation nodes.
         3. If you are fusing global absolute position data that is subject to discrete jumps (e.g., GPS or position
            updates from landmark observations) then:
              3a. Set your "world_frame" to your map_frame value
              3b. MAKE SURE something else is generating the odom->base_link transform. Note that this can even be
                  another instance of robot_localization! However, that instance should *not* fuse the global data. -->
  <!-- Defaults to "map" if unspecified -->
  <!-- <param name="map_frame" value="map"/> -->

  <!-- Defaults to "odom" if unspecified -->
  <param name="odom_frame" value="odom"/>
  <!-- Defaults to "base_link" if unspecified -->
  <param name="base_link_frame" value="base_link"/>
  <!-- Defaults to the value of "odom_frame" if unspecified -->
  <param name="world_frame" value="odom"/>

  <!-- Use this parameter to provide an offset to the transform generated by ekf_localization_node. This
       can be used for future dating the transform, which is required for interaction with some other
       packages. Defaults to 0.0 if unspecified. -->
  <param name="transform_time_offset" value="0.0"/>

  <!-- The filter accepts an arbitrary number of inputs from each input message type (Odometry, PoseStamped,
       TwistStamped, Imu). To add a new one, simply append the next number in the sequence to its base name,
       e.g., odom0, odom1, twist0, twist1, imu0, imu1, imu2, etc. The value should be the topic name. These
       parameters obviously have no default values, and must be specified. -->

  <!--<param name="odom0" value="example/odom"/>
  <param name="odom1" value="example/another_odom"/>
  <param name="pose0" value="example/pose"/>
  <param name="twist0" value="example/twist"/>
  <param name="imu0" value="example/imu/data"/> -->
    <!--<param name="twist0" value="/turtle1/cmd_vel"/>-->
    <param name="twist0" value="/out/realmfr"/>

  <!-- Each sensor reading updates some or all of the filter's state. These options give you greater control over
       which values from each measurement are fed to the filter. For example, if you have an odometry message as input,
       but only want to use its Z position value, then set the entire vector to false, except for the third entry.
       The order of the values is x, y, z, roll, pitch, yaw, vx, vy, vz, vroll, vpitch, vyaw, ax, ay, az. Note that not some
       message types lack certain variables. For example, a TwistWithCovarianceStamped message has no pose information, so
       the first six values would be meaningless in that case. Each vector defaults to all false if unspecified, effectively
       making this parameter required for each sensor. -->
  <rosparam param="twist0_config">[false, false, false,
                                  false, false, false,
                                  true,  true, false,
                                  false, false, true,
                                  false, false, false]</rosparam>

 <!-- <rosparam param="odom1_config">[false, false, false,
                                  false, false, false,
                                  true,  false, false,
                                  false, false, false,
                                  false, false, false]</rosparam>

  <rosparam param="pose0_config">[true,  true,  false,
                                  false, false, false,
                                  false, false, false,
                                  false, false, false,
                                  false, false, false]</rosparam>

  <rosparam param="twist0_config">[false, false, false,
                                   false, false, false,
                                   true,  true,  true,
                                   true,  true,  true,
                                   false, false, false]</rosparam>

  <rosparam param="imu0_config">[false, false, false,
                                 true,  true,  true,
                                 false, false, false,
                                 true,  true,  true,
                                 true,  true,  true]</rosparam> -->

  <!-- The best practice for including new sensors in robot_localization's state estimation nodes is to pass in velocity
       measurements and let the nodes integrate them. However, this isn't always feasible, and so the state estimation
       nodes support fusion of absolute measurements. If you have more than one sensor providing absolute measurements,
       however, you may run into problems if your covariances are not large enough, as the sensors will inevitably
       diverge from one another, causing the filter to jump back and forth rapidly. To combat this situation, you can
       either increase the covariances for the variables in question, or you can simply set the sensor's differential
       parameter to true. When differential mode is enabled, all absolute pose data is converted to velocity data by
       differentiating the absolute pose measurements. These velocities are then integrated as usual. NOTE: this only
       applies to sensors that provide absolute measurements, so setting differential to true for twit measurements has
       no effect.

       Users should take care when setting this to true for orientation variables: if you have only one source of
       absolute orientation data, you should not set the differential parameter to true. This is due to the fact that
       integration of velocities leads to slowly increasing error in the absolute (pose) variable. For position variables,
       this is acceptable. For orientation variables, it can lead to trouble. Users should make sure that all orientation
       variables have at least one source of absolute measurement. -->



  <!-- When the node starts, if this parameter is true, then the first measurement is treated as a "zero point" for all
       future measurements. While you can achieve the same effect with the differential paremeter, the key difference is
       that the relative parameter doesn't cause the measurement to be converted to a velocity before integrating it. If
       you simply want your measurements to start at 0 for a given sensor, set this to true. -->

  <!-- <param name="odom1_relative" value="true"/>
  <param name="pose0_relative" value="false"/>
  <param name="imu0_relative" value="true"/> -->

  <!-- If we're including accelerations in our state estimate, then we'll probably want to remove any acceleration that
       is due to gravity for each IMU. If you don't want to, then set this to false. Defaults to false if unspecified. -->
   <!--<param name="imu0_remove_gravitational_acceleration" value="false"/>-->

  <!-- If you're having trouble, try setting this to true, and then echo the /diagnostics_agg topic to see
       if the node is unhappy with any settings or data. -->
  <param name="print_diagnostics" value="true"/>

  <!-- ======== ADVANCED PARAMETERS ======== -->

  <!-- Most users will be able to remove these parameters from the launch file without any consequences. We recommend
       that users do not set values for these parameters without having a thorough understanding of
       the parameters do. -->

  <!-- By default, the subscription queue size for each message type is 1. If you wish to increase that so as not
       miss any messages (even if your frequency is set to a relatively small value), increase these. -->
  <param name="twist0_queue_size" value="2"/>
  <!--<param name="odom1_queue_size" value="1"/>
  <param name="pose0_queue_size" value="10"/>
  <param name="twist0_queue_size" value="3"/>
  <param name="imu0_queue_size" value="10"/>-->

  <!-- If your data is subject to outliers, use these threshold settings, expressed as Mahalanobis distances, to control
       how far away from the current vehicle state a sensor measurement is permitted to be. Each defaults to
       numeric_limits<double>::max() if unspecified. -->
   <!--<param name="odom0_pose_rejection_threshold" value="5"/>
  <param name="odom0_twist_rejection_threshold" value="1"/>
  <param name="pose0_rejection_threshold" value="2"/>
  <param name="twist0_rejection_threshold" value="1.2"/>
  <param name="imu0_pose_rejection_threshold" value="0.3"/>
  <param name="imu0_twist_rejection_threshold" value="0.1"/>
  <param name="imu0_linear_acceleration_rejection_threshold" value="0.1"/>-->

  <!-- Debug settings. Not for the faint of heart. Outputs a ludicrous amount of information to the file
       specified by debug_out_file. I hope you like matrices! Defaults to false if unspecified. -->
  <param name="debug"           value="false"/>
  <!-- Defaults to "robot_localization_debug.txt" if unspecified. -->
  <param name="debug_out_file"  value="debug_ekf_localization.txt"/>

  <!-- The process noise covariance matrix can be difficult to tune, and can vary for each application, so it
       is exposed as a configuration parameter. The values are ordered as x, y, z, roll, pitch, yaw, vx, vy, vz,
       vroll, vpitch, vyaw, ax, ay, az. Defaults to the matrix below if unspecified. -->

       <!-- ICI Q -->
  <rosparam param="process_noise_covariance">[0.05, 0,    0,    0,    0,    0,    0,     0,     0,    0,    0,    0,    0,    0,    0,
                                              0,    0.05, 0,    0,    0,    0,    0,     0,     0,    0,    0,    0,    0,    0,    0,
                                              0,    0,    0.06, 0,    0,    0,    0,     0,     0,    0,    0,    0,    0,    0,    0,
                                              0,    0,    0,    0.03, 0,    0,    0,     0,     0,    0,    0,    0,    0,    0,    0,
                                              0,    0,    0,    0,    0.03, 0,    0,     0,     0,    0,    0,    0,    0,    0,    0,
                                              0,    0,    0,    0,    0,    0.06, 0,     0,     0,    0,    0,    0,    0,    0,    0,
                                              0,    0,    0,    0,    0,    0,    0.025, 0,     0,    0,    0,    0,    0,    0,    0,
                                              0,    0,    0,    0,    0,    0,    0,     0.025, 0,    0,    0,    0,    0,    0,    0,
                                              0,    0,    0,    0,    0,    0,    0,     0,     0.04, 0,    0,    0,    0,    0,    0,
                                              0,    0,    0,    0,    0,    0,    0,     0,     0,    0.01, 0,    0,    0,    0,    0,
                                              0,    0,    0,    0,    0,    0,    0,     0,     0,    0,    0.01, 0,    0,    0,    0,
                                              0,    0,    0,    0,    0,    0,    0,     0,     0,    0,    0,    0.04, 0,    0,    0,
                                              0,    0,    0,    0,    0,    0,    0,     0,     0,    0,    0,    0,    0.01, 0,    0,
                                              0,    0,    0,    0,    0,    0,    0,     0,     0,    0,    0,    0,    0,    0.01, 0,
                                              0,    0,    0,    0,    0,    0,    0,     0,     0,    0,    0,    0,    0,    0,    0.015]</rosparam>

  <!-- This represents the initial value for the state estimate error covariance matrix. Setting a diagonal value (a
       variance) to a large value will result in early measurements for that variable being accepted quickly. Users should
       take care not to use large values for variables that will not be measured directly. The values are ordered as x, y,
       z, roll, pitch, yaw, vx, vy, vz, vroll, vpitch, vyaw, ax, ay, az. Defaults to the matrix below if unspecified. -->
       <rosparam param="initial_estimate_covariance">[1e-9, 0,    0,    0,    0,    0,    0,    0,    0,    0,     0,     0,     0,    0,    0,
                                                      0,    1e-9, 0,    0,    0,    0,    0,    0,    0,    0,     0,     0,     0,    0,    0,
                                                      0,    0,    1e-9, 0,    0,    0,    0,    0,    0,    0,     0,     0,     0,    0,    0,
                                                      0,    0,    0,    1e-9, 0,    0,    0,    0,    0,    0,     0,     0,     0,    0,    0,
                                                      0,    0,    0,    0,    1e-9, 0,    0,    0,    0,    0,     0,     0,     0,    0,    0,
                                                      0,    0,    0,    0,    0,    1e-9, 0,    0,    0,    0,     0,     0,     0,    0,    0,
                                                      0,    0,    0,    0,    0,    0,    1e-9, 0,    0,    0,     0,     0,     0,    0,    0,
                                                      0,    0,    0,    0,    0,    0,    0,    1e-9, 0,    0,     0,     0,     0,    0,    0,
                                                      0,    0,    0,    0,    0,    0,    0,    0,    1e-9, 0,     0,     0,     0,    0,    0,
                                                      0,    0,    0,    0,    0,    0,    0,    0,    0,    1e-9,  0,     0,     0,    0,    0,
                                                      0,    0,    0,    0,    0,    0,    0,    0,    0,    0,     1e-9,  0,     0,    0,    0,
                                                      0,    0,    0,    0,    0,    0,    0,    0,    0,    0,     0,     0.042,  0,    0,    0,
                                                      0,    0,    0,    0,    0,    0,    0,    0,    0,    0,     0,     0,     1e-9, 0,    0,
                                                      0,    0,    0,    0,    0,    0,    0,    0,    0,    0,     0,     0,     0,    1e-9, 0,
                                                      0,    0,    0,    0,    0,    0,    0,    0,    0,    0,     0,     0,     0,    0,    1e-9]</rosparam>


  <!--  Placeholder for output topic remapping
  <remap from="odometry/filtered" to=""/>
  -->

</node>

Followed by a sample of the Kalman filter output:

header: seq: 155 stamp: secs: 1440599293 nsecs: 756675578 frameid: odom childframeid: baselink pose: pose: position: x: 0.261712981957 y: 0.0370161871934 z: 0.0 orientation: x: 0.0 y: 0.0 z: 0.152542489559 w: 0.988296913321 covariance: [0.3890485342941935, -0.0039183196144295385, 0.0, 0.0, 0.0, -0.01607435547087469, -0.003918319614429533, 0.4152315092636918, 0.0, 0.0, 0.0, 0.10748818846233059, 0.0, 0.0, 9.997501624606665e-07, -5.209302660671822e-23, -1.3354453640733445e-15, 0.0, 0.0, 0.0, -5.2093026606718334e-23, 9.99500574820414e-07, -3.5850278094587188e-28, 0.0, 0.0, 0.0, -1.335445364073345e-15, -3.584512058961307e-28, 9.995005748204068e-07, 0.0, -0.01607435547087469, 0.10748818846233059, 0.0, 0.0, 0.0, 0.46599867013397817] twist: twist: linear: x: 0.159430001436 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.633599762436

covariance: [9.99999424793863e-10, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.99999424793863e-10, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.996253374327161e-07, -9.985937698793593e-25, -3.1570224820892286e-24, 0.0, 0.0, 0.0, -9.985937698793598e-25, 9.985047023726426e-07, -2.0161202664475545e-29, 0.0, 0.0, 0.0, -3.15702248208923e-24, -2.016093258087779e-29, 9.985047023726426e-07, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.999996250562416e-10]

header: seq: 156 stamp: secs: 1440599293 nsecs: 806678363 frameid: odom childframeid: baselink pose: pose: position: x: 0.266799119345 y: 0.038625326981 z: 0.0 orientation: x: 0.0 y: 0.0 z: 0.162977859818 w: 0.986629726498 covariance: [0.3907694720471096, -0.00417696009185921, 0.0, 0.0, 0.0, -0.016824404410461038, -0.004176960091859206, 0.4180057514995635, 0.0, 0.0, 0.0, 0.10986002379018349, 0.0, 0.0, 9.995008665978815e-07, -5.3520521885821474e-17, -2.6727775077225184e-15, 0.0, 0.0, 0.0, -5.352052188582147e-17, 9.990027420142374e-07, -2.865937613111346e-22, 0.0, 0.0, 0.0, -2.6727775077225184e-15, -2.8659376233953153e-22, 9.99002742014223e-07, 0.0, -0.016824404410461038, 0.10986002379018349, 0.0, 0.0, 0.0, 0.4680001416545611] twist: twist: linear: x: 0.16050000015 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 4.748497342e-07

covariance: [9.999988261133521e-10, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.999988261133521e-10, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.992516734903502e-07, -2.1205744459003253e-24, -6.2658853589490064e-24, 0.0, 0.0, 0.0, -2.120574445900326e-24, 9.970200587904243e-07, -4.270505625682825e-29, 0.0, 0.0, 0.0, -6.2658853589490086e-24, -4.2705831769700955e-29, 9.970200587904243e-07, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.999992505525372e-10]

header: seq: 157 stamp: secs: 1440599293 nsecs: 856681264 frameid: odom childframeid: baselink pose: pose: position: x: 0.276937326814 y: 0.0420835163304 z: 0.0 orientation: x: 0.0 y: 0.0 z: 0.162977883682 w: 0.986629722556 covariance: [0.3942267500926072, -0.0047460846589982, 0.0, 0.0, 0.0, -0.018446783688883833, -0.004746084658998194, 0.4236321374392196, 0.0, 0.0, 0.0, 0.11463677801476996, 0.0, 0.0, 9.997501195937417e-07, -4.678191435775004e-23, -1.3441183474599554e-15, 0.0, 0.0, 0.0, -4.6781914357749745e-23, 9.995004891720719e-07, -3.231047919257749e-28, 0.0, 0.0, 0.0, -1.344118347459955e-15, -3.2320803211514436e-28, 9.995004891720645e-07, 0.0, -0.018446783688883833, 0.11463677801476996, 0.0, 0.0, 0.0, 0.4720000520136196] twist: twist: linear: x: 0.160500001374 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.668799749195

covariance: [9.999994246886718e-10, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.999994246886718e-10, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.996252731643341e-07, -1.0719895693964647e-24, -3.1555919514519223e-24, 0.0, 0.0, 0.0, -1.071989569396464e-24, 9.985044464533285e-07, -2.1628574627525257e-29, 0.0, 0.0, 0.0, -3.1555919514519208e-24, -2.1629509962437725e-29, 9.985044464533285e-07, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.99999624991877e-10]

header: seq: 158 stamp: secs: 1440599293 nsecs: 906675852 frameid: odom childframeid: baselink pose: pose: position: x: 0.282014696343 y: 0.043808448052 z: 0.0 orientation: x: 0.0 y: 0.0 z: 0.173955719639 w: 0.984753475549 covariance: [0.39595713015075196, -0.0050416917851505046, 0.0, 0.0, 0.0, -0.019261076421183135, -0.0050416917851504985, 0.42647423177115035, 0.0, 0.0, 0.0, 0.11703429115048763, 0.0, 0.0, 9.995000705815345e-07, -5.646904629274185e-17, -2.696593847969033e-15, 0.0, 0.0, 0.0, -5.646904629274187e-17, 9.990011548243905e-07, -3.0459131944053243e-22, 0.0, 0.0, 0.0, -2.6965938479690342e-15, -3.045913195438138e-22, 9.990011548243761e-07, 0.0, -0.019261076421183135, 0.11703429115048763, 0.0, 0.0, 0.0, 0.47399833349361065] twist: twist: linear: x: 0.161570000087 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 5.0203043378e-07

covariance: [9.999988241976541e-10, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.999988241976541e-10, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.992504806573086e-07, -2.2783652638684924e-24, -6.273039598958877e-24, 0.0, 0.0, 0.0, -2.278365263868493e-24, 9.970153300096452e-07, -4.586329786448767e-29, 0.0, 0.0, 0.0, -6.273039598958882e-24, -4.586274587297832e-29, 9.970153300096452e-07, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.999992493561274e-10]

header: seq: 159 stamp: secs: 1440599293 nsecs: 956676136 frameid: odom childframeid: baselink pose: pose: position: x: 0.282014696343 y: 0.043808448052 z: 0.0 orientation: x: 0.0 y: 0.0 z: 0.173955719639 w: 0.984753475549 covariance: [0.39595713015075196, -0.0050416917851505046, 0.0, 0.0, 0.0, -0.019261076421183135, -0.0050416917851504985, 0.42647423177115035, 0.0, 0.0, 0.0, 0.11703429115048763, 0.0, 0.0, 9.995000705815345e-07, -5.646904629274185e-17, -2.696593847969033e-15, 0.0, 0.0, 0.0, -5.646904629274187e-17, 9.990011548243905e-07, -3.0459131944053243e-22, 0.0, 0.0, 0.0, -2.6965938479690342e-15, -3.045913195438138e-22, 9.990011548243761e-07, 0.0, -0.019261076421183135, 0.11703429115048763, 0.0, 0.0, 0.0, 0.47399833349361065] twist: twist: linear: x: 0.161570000087 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 5.0203043378e-07

covariance: [9.999988241976541e-10, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.999988241976541e-10, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.992504806573086e-07, -2.2783652638684924e-24, -6.273039598958877e-24, 0.0, 0.0, 0.0, -2.278365263868493e-24, 9.970153300096452e-07, -4.586329786448767e-29, 0.0, 0.0, 0.0, -6.273039598958882e-24, -4.586274587297832e-29, 9.970153300096452e-07, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.999992493561274e-10]

header: seq: 160 stamp: secs: 1440599294 nsecs: 6676314 frameid: odom childframeid: baselink pose: pose: position: x: 0.297214911077 y: 0.0493837731797 z: 0.0 orientation: x: 0.0 y: 0.0 z: 0.173964537664 w: 0.984751917813 covariance: [0.4011954390669385, -0.006033143872784402, 0.0, 0.0, 0.0, -0.021914256590615137, -0.0060331438727843955, 0.43518644612030116, 0.0, 0.0, 0.0, 0.12430970166215417, 0.0, 0.0, 7.223769423743865e-07, -7.174419553675734e-18, -4.27610045233976e-13, 0.0, 0.0, 0.0, -7.174419553675735e-18, 6.429547753665571e-07, -1.1060788515895056e-23, 0.0, 0.0, 0.0, -4.276100452339761e-13, -1.1060665071489341e-23, 6.429547753658979e-07, 0.0, -0.021914256590615137, 0.12430970166215417, 0.0, 0.0, 0.0, 0.4800017180937655] twist: twist: linear: x: 0.1599673983 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.000624979265337

covariance: [9.985065344013831e-10, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.985065344013831e-10, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.740404618707297e-07, -1.51317712801591e-23, -4.1491306454488306e-23, 0.0, 0.0, 0.0, -1.5131771280159098e-23, 5.586997895796972e-07, -3.301980774969856e-29, 0.0, 0.0, 0.0, -4.14913064544883e-23, -3.302093564379043e-29, 5.586997895796972e-07, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.99065521199857e-10]

Asked by Cookie32 on 2015-08-26 09:31:32 UTC

Comments

Answers