Initial commit

This commit is contained in:
2026-07-27 13:51:19 +08:00
commit 7bec56ca51
5408 changed files with 1126933 additions and 0 deletions
@@ -0,0 +1,301 @@
Change history
==============
1.5.2 (2019-01-28)
------------------
* Merge pull request `#205 <https://github.com/ros-drivers/velodyne/issues/205>`_ from xiesc/master
support for 64E-S3
* add an example yaml file for S3
* Contributors: Joshua Whitley, Shichao XIE, xiesc
1.5.1 (2018-12-10)
------------------
* Merge pull request `#194 <https://github.com/ros-drivers/velodyne/issues/194>`_ from ros-drivers/avoid_unnecessary_computation
Avoid unnecessary computation - causes approximately 20% performance increase on VLP-32C - should be similar for other sensors
* std::vector<>::reserve is your friend
* add static to avoid frequence memory allocation
* avoid unecesary calculations in unpack()
* Contributors: Davide Faconti, Joshua Whitley
1.5.0 (2018-10-19)
------------------
* Merge pull request `#164 <https://github.com/ros-drivers/velodyne/issues/164>`_ from ros-drivers/maint/vlp_32c_support
Adding VLP-32C support.
This was tested by AutonomouStuff and several external users. Though it does not include new information that I've learned (it appears that the distance resolution is different <50m vs >=50m), it is a good start.
* Merge pull request `#189 <https://github.com/ros-drivers/velodyne/issues/189>`_ from kveretennicov/patch-1
* Fix malformed plugin description XML
ROS pluginlib only recognizes multiple <library> elements if they are under
<class_libraries> XML root. It silently ignores malformed XMLs with multiple
<library> "root"s and just reads the first one, due to relaxed way tinyxml2 does
parsing. Though if you do `rosrun nodelet declared_nodelets`, the issue is
reported properly.
See also similar issue in https://github.com/ros-perception/perception_pcl/issues/131
* Adding distance_resolution to test yaml files.
* Adding VLP-32C support.
Based on work done by @rockcdr. Adds distance_resolution calibration
value to support 0.004m distance resolution for VLP-32C.
* Contributors: Joshua Whitley, Konstantin Veretennicov
1.4.0 (2018-09-19)
------------------
* Merge pull request `#178 <https://github.com/ros-drivers/velodyne/issues/178>`_ from sts-thm/bugfix_issue\_`#174 <https://github.com/ros-drivers/velodyne/issues/174>`_
Bugfix issue `#174 <https://github.com/ros-drivers/velodyne/issues/174>`_
* Merge pull request `#177 <https://github.com/ros-drivers/velodyne/issues/177>`_ from C-NR/feature/WrapPointcloudData
Feature/wrap pointcloud data
* Changes fixing deadlock for specific cut_angle values.
* moved definition of VPoint and VPointCloud back to namespace rawdata in rawdata.h
* put a wrapper around pointcloud data including a generic setter method to enable the use of arbitrary data structures (pcl pointcloud, depth image, octomaps and so on) to be filled by just using RawData::unpack method with the wrapper object as parameter
* Merge pull request `#170 <https://github.com/ros-drivers/velodyne/issues/170>`_ from ros-drivers/maint/move_header_files
Moving header files to traditional location inside include folders.
* Merge pull request `#160 <https://github.com/ros-drivers/velodyne/issues/160>`_ from ros-drivers/maint/updating_package_xml_to_v2
* Updated all package.xmls to ver 2. Cleaned up catkin_lint errors.
All package.xml files are now compatible with version 2 of the
package.xml specification in REP 140. Removed some unnecessary
execute permissions on a few files. Fixed a missing test_depend.
* Merge pull request `#136 <https://github.com/ros-drivers/velodyne/issues/136>`_ from stsundermann/patch-1
Use std::abs instead of abs
* Adding missing 32C configuration file.
* Merge pull request `#139 <https://github.com/ros-drivers/velodyne/issues/139>`_ from ASDeveloper00/vlp32
Adding support for VLP-32C.
* Merge pull request `#138 <https://github.com/ros-drivers/velodyne/issues/138>`_ from volkandre/cut_at_specified_angle_feature
Cut at specified angle feature
* Updated default cut_angle parameters in launch files after switching from deg to rad.
* Use std::abs instead of abs
abs is the c version which returns an integer. This is probably not intended here, so use the templated std::abs function.
* Contributors: Andre Volk, Autonomoustuff Developer, CNR, Joshua Whitley, Kyle Rector, Stephan Sundermann, Tobias Athmer, kennouni
1.3.0 (2017-11-10)
-------------------
* Merge pull request `#110 <https://github.com/ros-drivers/velodyne/issues/110>`_ from kmhallen/master
Added velodyne_laserscan package
* Merge remote-tracking branch ros-drivers/master
* Merge pull request `#129 <https://github.com/ros-drivers/velodyne/issues/129>`_ from kmhallen/pluginlib_macro
Modern pluginlib macro
* Update to use non deprecated pluginlib macro
* Merge pull request `#127 <https://github.com/ros-drivers/velodyne/issues/127>`_ from swri-robotics/add_vlp16_hires_support
Add VLP16 Puck Hi-Res config file
* Add VLP16 Puck Hi-Res support
* velodyne_pointcloud: remove incorrect catkin_package() DEPENDS option (`#93 <https://github.com/ros-drivers/velodyne/issues/93>`_)
This eliminates a CMake warning when building on Xenial.
* Merge pull request `#111 <https://github.com/ros-drivers/velodyne/issues/111>`_ from OrebroUniversity/master
Added an interface to set up raw data processing offline
* Added an interface to set up raw data processing from a locally defined calibration file. This method is useful when processing data offline from a bag file, without starting any ros master
* Added velodyne_laserscan package and inserted into existing launch files
* test multiple nodelet manager support (`#108 <https://github.com/ros-drivers/velodyne/issues/108>`_)
* add launch args to support multiple devices (`#108 <https://github.com/ros-drivers/velodyne/issues/108>`_)
* Merge pull request `#105 <https://github.com/ros-drivers/velodyne/issues/105>`_ from fudger/patch-1
Remove unused constants.
* Merge pull request `#104 <https://github.com/ros-drivers/velodyne/issues/104>`_ from altrouge/launch_options
Add more options in launch files.
* Rearranged alphabetically.
* Remove unused constants.
DISTANCE_MAX and DISTANCE_MAX_UNITS are not used anywhere in the code.
Furthermore, using them would lead to errors as both VLP-64 manuals state that returns above 120 m should not be used. The VLP-32 manual allows 70 m as the maximum valid sensor range.
* Merge pull request `#103 <https://github.com/ros-drivers/velodyne/issues/103>`_ from fudger/patch-1
Fix misleading typecasts.
* Add more options in launch files.
- rpm, device_ip, port, read_once, read_fast, repeat_delay
* Fix misleading typecasts.
intensity and VPoint::intensity are both of type float.
* update change history
* merge current master (`#94 <https://github.com/ros-drivers/velodyne/issues/94>`_)
* Merge pull request `#92 <https://github.com/ros-drivers/velodyne/issues/92>`_ from adasta/master
GCC Build Warnings
* Modified velodyne_point_cloud/src/lib/rawdata.cc to address warning
that last_azimuth_diff variable may be used uninitialized. Variable
is now initialized to 0 at creation.
velodyne/velodyne_pointcloud/src/lib/rawdata.cc:328:57: error: last_azimuth_diff may be used uninitialized in this function [-Werror=maybe-uninitialized]
azimuth_corrected_f = azimuth + (azimuth_diff * ((dsr*VLP16_DSR_TOFFSET) + (firing*VLP16_FIRING_TOFFSET)) / VLP16_BLOCK_TDURATION);
* Modified velodyne_pointcloud/src/conversion/colors.cc to remove
address build warning for strict-aliasing.
velodyne/velodyne_pointcloud/src/conversions/colors.cc:84:58:
* Merge pull request `#89 <https://github.com/ros-drivers/velodyne/issues/89>`_ from Tones29/feat_dynrec_driver
Add dynamic latency configuration to velodyne_driver
* velodyne_pointcloud: Fix compile warning "Wrong initialization order"
* velodyne_pointcloud: add dynamic reconfig update to change log (`#78 <https://github.com/ros-drivers/velodyne/issues/78>`_)
* Merge branch fudger-reconfigure_transform_node
* velodyne_pointcloud: use recommended add_dependencies() CMake variable `#78 <https://github.com/ros-drivers/velodyne/issues/78>`_
* velodyne_pointcloud: fix transform unit tests
Use tf2_ros static_transform_publisher for more consistent timing (`#2 <https://github.com/ros-drivers/velodyne/issues/2>`_)
* Merge branch reconfigure_transform_node of https://github.com/fudger/velodyne
* prepare change history for coming Indigo release (`#59 <https://github.com/ros-drivers/velodyne/issues/59>`_)
* calibration: unit test case improvements (`#84 <https://github.com/ros-drivers/velodyne/issues/84>`_)
* calibration: read all intensities as float, then convert (`#84 <https://github.com/ros-drivers/velodyne/issues/84>`_)
* calibration: add gtest for `#84 <https://github.com/ros-drivers/velodyne/issues/84>`_
This currently fails on 64e_s2.1-sztaki.yaml and on issue_84_float_intensities.yaml.
* calibration: make max_intensity and min_intensity optional (`#84 <https://github.com/ros-drivers/velodyne/issues/84>`_)
This fixes a regression in the 32e and VLP-16 calibrations which do not contain
intensity values. There is still a problem with the 64e_s2.1 calibration.
* Merge pull request `#76 <https://github.com/ros-drivers/velodyne/issues/76>`_ from pomerlef/master
Sign inversion in some equations
* Merge pull request `#82 <https://github.com/ros-drivers/velodyne/issues/82>`_ from ros-drivers/fix_pr_80
Fix pr 80; adding travis CI tests.
* fix the yaml-cpp 0.5 code paths
* Merge pull request `#80 <https://github.com/ros-drivers/velodyne/issues/80>`_ from ros-drivers/fix_yaml_import
allow floats in min/max_intensity and make horiz_offset_correction optional
* allow horiz_offset_correction to be optional with 0 as default
* allow floats instead of ints in min/max_intensity
* Resolve frame ID name using tf prefix.
* Improve coding style.
* Set up dynamic reconfiguration for transform_node.
Previously, transform_node has neither read parameters other than frame_id from the command line nor has it exposed these parameters via dynamic reconfigure. As parameters like max_range and view_width have been initialized to zero, the inconfigurable transform_node has returned an empty point cloud.
Now, transform_node launches an reconfigure server just as cloud_node. In contrast to cloud_node, transform node exposes another parameter for dynamic reconfiguration: frame_id, i.e. the frame of reference the incoming Velodyne points are transformed to.
* Merge pull request `#77 <https://github.com/ros-drivers/velodyne/issues/77>`_ from fudger/pretty_print
Fix output of calibration data onto console
* Add a missing space.
* Fix line that always indicates use of model VLP-16.
* Align console output of calibration data.
* Merge branch master of https://github.com/ros-drivers/velodyne
* resolve sign error
* Merge pull request `#73 <https://github.com/ros-drivers/velodyne/issues/73>`_ from fudger/master
Correct important data type error for VLP-16
* Fix data type error that distorts the point cloud.
* Fix and add a few comments.
* Merge pull request `#68 <https://github.com/ros-drivers/velodyne/issues/68>`_ from jlblancoc/patch-1
Remove unused variable
* Remove unused variable
I think that `dsr` was unused. See line 317:
for (int dsr=0; ...
* VLP-16: skip badly formatted data packets (`#62 <https://github.com/ros-drivers/velodyne/issues/62>`_, `#63 <https://github.com/ros-drivers/velodyne/issues/63>`_)
* restore VLP-16 min_range setting to 0.4 (`#60 <https://github.com/ros-drivers/velodyne/issues/60>`_)
NOTE: There is still some other problem keeping that from working.
* permit min_range settings below 0.9 meters (`#60 <https://github.com/ros-drivers/velodyne/issues/60>`_)
No known models are currently known to return closer measurements.
* Merge pull request `#55 <https://github.com/ros-drivers/velodyne/issues/55>`_ from lemiant/azimuth_bug_VLP16
Fixed azimuth overflow bug.
* Fixed azimuth overflow bug.
For interpolated azimuth values between 35999.5 and 36000.0 the nested round(fmod())
yields a value of 36000 which is invalid and overflows the pre-computed sin/cos arrays,
since they only go form 0..35999
* Merge pull request `#51 <https://github.com/ros-drivers/velodyne/issues/51>`_ from kunlileo/master
Added vertical sin angle correction
* Added vertical sin angle correction
* Merge pull request `#47 <https://github.com/ros-drivers/velodyne/issues/47>`_ from prclibo/master
fixed rounding bug in intensity calculation found by songshiyu
* fixed rounding bug in intensity calculation found by songshiyu
* fix some overly long C++ source lines
* Merge pull request `#44 <https://github.com/ros-drivers/velodyne/issues/44>`_ from SISegwayRmp/master
adding driver and pointcloud support for the VLP16
* missed the space in the file name which caused the build to fail, removed space before extension
* adding the VLP16 test scripts and updating the CMakeLists to include the test file from http://download.ros.org/data/velodyne/vlp16.pcap
* adding support for the VLP16
* Merge pull request `#43 <https://github.com/ros-drivers/velodyne/issues/43>`_ from prclibo/fix_rawdata
fixed point computation according to the 64e_s2(.1) velodyne manual
* fixed point computation according to the 64e_s2(.1) velodyne manual, with luopei"s help
* Merge pull request `#41 <https://github.com/ros-drivers/velodyne/issues/41>`_ from prclibo/master
fixed a calibration file parsing bug
* Merge pull request `#42 <https://github.com/ros-drivers/velodyne/issues/42>`_ from prclibo/fix_gen_calibration
fixed gen_calibration min/max intensity type
* fixed gen_calibration min/max intensity type
* fixed a calibration file parsing bug
* Contributors: Adam Stambler, Alex Rodrigues, Alexander Schaefer, Andreas Wachaja, Bo Li, Daniel Jartoux, Gabor Meszaros, Jack OQuin, Jose Luis Blanco-Claraco, Joshua Whitley, Kevin Hallenbeck, Kris Kozak, Kun Li, Micho Radovnikovich, Scott K Logan, Thomas Solatges, Todor Stoyanov, William Woodall, jack.oquin, libo24, phussey, piyushk, pomerlef
1.2.0 (2014-08-06)
------------------
* velodyne_pointcloud: remove model-dependent "constants" from
rawdata.h (`#28
<https://github.com/ros-drivers/velodyne/issues/28>`_)
* velodyne_pointcloud: change default min_range to 0.9 meters (`#25
<https://github.com/ros-drivers/velodyne/issues/25>`_)
* Added support for YAML-CPP 0.5+ (`#23
<https://github.com/ros-drivers/velodyne/pull/23>`_).
* Add dynamic_reconfigure feature.
* Add angular limits to the output point cloud, useful for omitting
part of it. (`#22 <https://github.com/ros-drivers/velodyne/pull/22>`_).
* Contributors: Jack OQuin, Scott K Logan, Thomas Solatges
1.1.2 (2013-11-05)
------------------
* Move unit test data to download.ros.org (`#18`_).
* Install missing gen_calibration.py script (`#20`_).
1.1.1 (2013-07-30)
------------------
* Fix lost frame_id transform problem caused by PCL 1.7 fix (`#13`_).
* Add support for HDL-64E S2 and S2.1 models, which were not working
before (`#11`_), thanks to Gabor Meszaros (`#12`_).
* Add additional parameters to launch files (`#14`_).
* Contributors: Gabor Meszaros, Jack OQuin
1.1.0 (2013-07-16)
------------------
* Fix build problems due to PCL 1.7 API incompatibilities (`#8`_),
thanks to William Woodall. This version also works with Groovy, as
long as the correct ``pcl_conversions`` is installed.
* Fix errors with Mac OSX compiler (`#8`_).
* Install ``pluginlib`` XML files (`#9`_).
* Install some launch and parameter files.
* Enable unit tests when ``CATKIN_ENABLE_TESTING`` is set (`#10`_).
1.0.1 (2013-06-15)
------------------
* Declare explicit ``pluginlib`` dependency (`#4`_).
1.0.0 (2013-06-14)
------------------
* Convert to catkin (`#1`_).
* Release to Hydro.
0.9.2 (2013-07-08)
------------------
* Fix Groovy build problem (`#7`_).
0.9.1 (2012-06-05)
------------------
* Only include "enabled" lasers in YAML calibration file.
* New param subdirectory for parameter files.
* Add launch file for the HDL-32E.
* Add rviz_points.vcg file for viewing Velodyne point clouds with rviz.
* Fix bug when reading configuration with default minIntensity.
* Add unit tests with 32E data.
* Released to Electric, Fuerte and Groovy.
0.9.0 (2012-04-03)
------------------
* Completely revised API, anticipating a 1.0.0 release.
* HDL-32E device support.
* New YAML configuration file format.
* New velodyne_driver and velodyne_pointcloud packages.
* Old velodyne_common and velodyne_pcl packages no longer included.
* Released to Electric, Fuerte and Groovy.
0.2.6 (2011-02-23)
------------------
* Label all timing-dependent tests "realtime" so they do not run by
default on the build farm machines.
0.2.5 (2010-11-19)
------------------
* Initial implementation of new 0.3 interfaces.
* Support for ROS 1.3 `std_msgs::Header` changes.
0.2.0 (2010-08-17)
------------------
* Initial release to ROS C-turtle.
.. _`#1`: https://github.com/ros-drivers/velodyne/issues/1
.. _`#4`: https://github.com/ros-drivers/velodyne/issues/4
.. _`#7`: https://github.com/ros-drivers/velodyne/issues/7
.. _`#8`: https://github.com/ros-drivers/velodyne/pull/8
.. _`#9`: https://github.com/ros-drivers/velodyne/issues/9
.. _`#10`: https://github.com/ros-drivers/velodyne/issues/10
.. _`#11`: https://github.com/ros-drivers/velodyne/issues/11
.. _`#12`: https://github.com/ros-drivers/velodyne/pull/12
.. _`#13`: https://github.com/ros-drivers/velodyne/issues/13
.. _`#14`: https://github.com/ros-drivers/velodyne/pull/14
.. _`#17`: https://github.com/ros-drivers/velodyne/issues/17
.. _`#18`: https://github.com/ros-drivers/velodyne/issues/18
.. _`#20`: https://github.com/ros-drivers/velodyne/issues/20
.. _`#50`: https://github.com/ros-drivers/velodyne/issue/50
@@ -0,0 +1,86 @@
cmake_minimum_required(VERSION 2.8.3)
project(velodyne_pointcloud)
# Set minimum C++ standard to C++11
if (NOT "${CMAKE_CXX_STANDARD_COMPUTED_DEFAULT}")
message(STATUS "Changing CXX_STANDARD from C++98 to C++11")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
elseif ("${CMAKE_CXX_STANDARD_COMPUTED_DEFAULT}" STREQUAL "98")
message(STATUS "Changing CXX_STANDARD from C++98 to C++11")
set(CMAKE_CXX_STANDARD 11)
endif()
set(${PROJECT_NAME}_CATKIN_DEPS
angles
nodelet
roscpp
roslib
sensor_msgs
tf
velodyne_driver
velodyne_msgs
dynamic_reconfigure
diagnostic_updater
)
find_package(catkin REQUIRED COMPONENTS
${${PROJECT_NAME}_CATKIN_DEPS}
roslint)
find_package(Boost COMPONENTS signals)
find_package(Eigen3 REQUIRED)
# Resolve system dependency on yaml-cpp, which apparently does not
# provide a CMake find_package() module.
find_package(PkgConfig REQUIRED)
pkg_check_modules(YAML_CPP REQUIRED yaml-cpp)
find_path(YAML_CPP_INCLUDE_DIR
NAMES yaml_cpp.h
PATHS ${YAML_CPP_INCLUDE_DIRS})
find_library(YAML_CPP_LIBRARY
NAMES YAML_CPP
PATHS ${YAML_CPP_LIBRARY_DIRS})
link_directories(${YAML_CPP_LIBRARY_DIRS})
generate_dynamic_reconfigure_options(
cfg/CloudNode.cfg cfg/TransformNode.cfg
)
if(NOT ${YAML_CPP_VERSION} VERSION_LESS "0.5")
add_definitions(-DHAVE_NEW_YAMLCPP)
endif(NOT ${YAML_CPP_VERSION} VERSION_LESS "0.5")
include_directories(include ${catkin_INCLUDE_DIRS}
${dynamic_reconfigure_PACKAGE_PATH}/cmake/cfgbuild.cmake
${EIGEN3_INCLUDE_DIR}
)
catkin_package(
CATKIN_DEPENDS ${${PROJECT_NAME}_CATKIN_DEPS}
INCLUDE_DIRS include
LIBRARIES velodyne_rawdata)
#add_executable(dynamic_reconfigure_node src/dynamic_reconfigure_node.cpp)
#target_link_libraries(dynamic_reconfigure_node
# ${catkin_LIBRARIES}
# )
add_subdirectory(src/lib)
add_subdirectory(src/conversions)
install(DIRECTORY include/${PROJECT_NAME}/
DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION})
install(FILES nodelets.xml
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION})
install(DIRECTORY launch/
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch)
install(DIRECTORY params/
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/params)
install(PROGRAMS scripts/gen_calibration.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
roslint_cpp()
if (CATKIN_ENABLE_TESTING)
add_subdirectory(tests)
endif()
@@ -0,0 +1,19 @@
#!/usr/bin/env python
PACKAGE = "velodyne_pointcloud"
from math import pi
from dynamic_reconfigure.parameter_generator_catkin import *
gen = ParameterGenerator()
gen.add("fixed_frame", str_t, 0, "The desired input frame", "velodyne")
gen.add("target_frame", str_t, 0, "The desired output frame", "velodyne")
gen.add("min_range", double_t, 0, "min range to publish", 0.9, 0.1, 10.0)
gen.add("max_range", double_t, 0, "max range to publish", 130, 0.1, 200)
gen.add("view_direction", double_t, 0, "angle defining the center of view",
0.0, -pi, pi)
gen.add("view_width", double_t, 0, "angle defining the view width",
2*pi, 0.0, 2*pi)
gen.add("organize_cloud", bool_t, 0, "organized cloud", False)
exit(gen.generate(PACKAGE, "cloud_node", "CloudNode"))
@@ -0,0 +1,45 @@
#!/usr/bin/env python
PACKAGE = "velodyne_pointcloud"
from math import pi
import dynamic_reconfigure.parameter_generator_catkin as pgc
gen = pgc.ParameterGenerator()
gen.add("min_range",
pgc.double_t,
0,
"min range to publish",
0.9, 0.1, 10.0)
gen.add("max_range",
pgc.double_t,
0,
"max range to publish",
130, 0.1, 200)
gen.add("view_direction",
pgc.double_t,
0,
"angle defining the center of view",
0.0, -pi, pi)
gen.add("view_width",
pgc.double_t,
0,
"angle defining the view width",
2*pi, 0.0, 2*pi)
gen.add("frame_id",
pgc.str_t,
0,
"fixed frame of reference for point clouds",
"map")
gen.add("organize_cloud",
pgc.bool_t,
0,
"organize cloud",
False)
exit(gen.generate(PACKAGE, "transform_node", "TransformNode"))
@@ -0,0 +1,109 @@
// Copyright (C) 2012, 2019 Austin Robot Technology, Piyush Khandelwal, Joshua Whitley
// All rights reserved.
//
// Software License Agreement (BSD License 2.0)
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
// * Neither the name of {copyright_holder} nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
#ifndef VELODYNE_POINTCLOUD_CALIBRATION_H
#define VELODYNE_POINTCLOUD_CALIBRATION_H
#include <map>
#include <vector>
#include <string>
namespace velodyne_pointcloud
{
/** \brief correction values for a single laser
*
* Correction values for a single laser (as provided by db.xml from
* Velodyne). Includes parameters for Velodyne HDL-64E S2.1.
*
* http://velodynelidar.com/lidar/products/manual/63-HDL64E%20S2%20Manual_Rev%20D_2011_web.pdf
*/
/** \brief Correction information for a single laser. */
struct LaserCorrection
{
/** parameters in db.xml */
float rot_correction;
float vert_correction;
float dist_correction;
bool two_pt_correction_available;
float dist_correction_x;
float dist_correction_y;
float vert_offset_correction;
float horiz_offset_correction;
int max_intensity;
int min_intensity;
float focal_distance;
float focal_slope;
/** cached values calculated when the calibration file is read */
float cos_rot_correction; ///< cosine of rot_correction
float sin_rot_correction; ///< sine of rot_correction
float cos_vert_correction; ///< cosine of vert_correction
float sin_vert_correction; ///< sine of vert_correction
int laser_ring; ///< ring number for this laser
};
/** \brief Calibration information for the entire device. */
class Calibration
{
public:
float distance_resolution_m;
std::map<int, LaserCorrection> laser_corrections_map;
std::vector<LaserCorrection> laser_corrections;
int num_lasers;
bool initialized;
bool ros_info;
public:
explicit Calibration(bool info = true)
: distance_resolution_m(0.002f),
num_lasers(0),
initialized(false),
ros_info(info) {}
explicit Calibration(
const std::string& calibration_file,
bool info = true)
: distance_resolution_m(0.002f),
ros_info(info)
{
read(calibration_file);
}
void read(const std::string& calibration_file);
void write(const std::string& calibration_file);
};
} // namespace velodyne_pointcloud
#endif // VELODYNE_POINTCLOUD_CALIBRATION_H
@@ -0,0 +1,102 @@
// Copyright (C) 2009, 2010, 2011, 2012, 2019 Austin Robot Technology, Jack O'Quin, Jesse Vera, Joshua Whitley
// All rights reserved.
//
// Software License Agreement (BSD License 2.0)
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
// * Neither the name of {copyright_holder} nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
/** @file
This class converts raw Velodyne 3D LIDAR packets to PointCloud2.
*/
#ifndef VELODYNE_POINTCLOUD_CONVERT_H
#define VELODYNE_POINTCLOUD_CONVERT_H
#include <string>
#include <ros/ros.h>
#include <diagnostic_updater/diagnostic_updater.h>
#include <diagnostic_updater/publisher.h>
#include <sensor_msgs/PointCloud2.h>
#include <velodyne_pointcloud/rawdata.h>
#include <dynamic_reconfigure/server.h>
#include <velodyne_pointcloud/CloudNodeConfig.h>
namespace velodyne_pointcloud
{
class Convert
{
public:
Convert(
ros::NodeHandle node,
ros::NodeHandle private_nh,
std::string const & node_name = ros::this_node::getName());
~Convert() {}
private:
void callback(velodyne_pointcloud::CloudNodeConfig &config, uint32_t level);
void processScan(const velodyne_msgs::VelodyneScan::ConstPtr &scanMsg);
boost::shared_ptr<dynamic_reconfigure::Server<velodyne_pointcloud::CloudNodeConfig> > srv_;
boost::shared_ptr<velodyne_rawdata::RawData> data_;
ros::Subscriber velodyne_scan_;
ros::Publisher output_;
boost::shared_ptr<velodyne_rawdata::DataContainerBase> container_ptr_;
boost::mutex reconfigure_mtx_;
/// configuration parameters
typedef struct
{
std::string target_frame; ///< target frame
std::string fixed_frame; ///< fixed frame
bool organize_cloud; ///< enable/disable organized cloud structure
double max_range; ///< maximum range to publish
double min_range; ///< minimum range to publish
uint16_t num_lasers; ///< number of lasers
int npackets; ///< number of packets to combine
}
Config;
Config config_;
bool first_rcfg_call;
// diagnostics updater
diagnostic_updater::Updater diagnostics_;
double diag_min_freq_;
double diag_max_freq_;
boost::shared_ptr<diagnostic_updater::TopicDiagnostic> diag_topic_;
};
} // namespace velodyne_pointcloud
#endif // VELODYNE_POINTCLOUD_CONVERT_H
@@ -0,0 +1,208 @@
#ifndef VELODYNE_POINTCLOUD_DATACONTAINERBASE_H
#define VELODYNE_POINTCLOUD_DATACONTAINERBASE_H
// Copyright (C) 2012, 2019 Austin Robot Technology, Jack O'Quin, Joshua Whitley, Sebastian Pütz
// All rights reserved.
//
// Software License Agreement (BSD License 2.0)
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
// * Neither the name of {copyright_holder} nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
#include <tf/transform_listener.h>
#include <velodyne_msgs/VelodyneScan.h>
#include <sensor_msgs/point_cloud2_iterator.h>
#include <Eigen/Dense>
#include <string>
#include <algorithm>
#include <cstdarg>
namespace velodyne_rawdata
{
class DataContainerBase
{
public:
DataContainerBase(const double max_range, const double min_range, const std::string& target_frame,
const std::string& fixed_frame, const unsigned int init_width, const unsigned int init_height,
const bool is_dense, const unsigned int scans_per_packet,
boost::shared_ptr<tf::TransformListener>& tf_ptr, int fields, ...)
: config_(max_range, min_range, target_frame, fixed_frame, init_width, init_height, is_dense, scans_per_packet)
, tf_ptr(tf_ptr)
{
va_list vl;
cloud.fields.clear();
cloud.fields.reserve(fields);
va_start(vl, fields);
int offset = 0;
for (int i = 0; i < fields; ++i)
{
// Create the corresponding PointField
std::string name(va_arg(vl, char*));
int count(va_arg(vl, int));
int datatype(va_arg(vl, int));
offset = addPointField(cloud, name, count, datatype, offset);
}
va_end(vl);
cloud.point_step = offset;
cloud.row_step = init_width * cloud.point_step;
if (config_.transform && !tf_ptr)
{
tf_ptr = boost::shared_ptr<tf::TransformListener>(new tf::TransformListener);
}
}
struct Config
{
double max_range; ///< maximum range to publish
double min_range; ///< minimum range to publish
std::string target_frame; ///< target frame to transform a point
std::string fixed_frame; ///< fixed frame used for transform
unsigned int init_width;
unsigned int init_height;
bool is_dense;
unsigned int scans_per_packet;
bool transform; ///< enable / disable transform points
Config(double max_range, double min_range, std::string target_frame, std::string fixed_frame,
unsigned int init_width, unsigned int init_height, bool is_dense, unsigned int scans_per_packet)
: max_range(max_range)
, min_range(min_range)
, target_frame(target_frame)
, fixed_frame(fixed_frame)
, transform(fixed_frame != target_frame)
, init_width(init_width)
, init_height(init_height)
, is_dense(is_dense)
, scans_per_packet(scans_per_packet)
{
ROS_INFO_STREAM("Initialized container with "
<< "min_range: " << min_range << ", max_range: " << max_range
<< ", target_frame: " << target_frame << ", fixed_frame: " << fixed_frame
<< ", init_width: " << init_width << ", init_height: " << init_height
<< ", is_dense: " << is_dense << ", scans_per_packet: " << scans_per_packet);
}
};
virtual void setup(const velodyne_msgs::VelodyneScan::ConstPtr& scan_msg)
{
cloud.header = scan_msg->header;
cloud.data.resize(scan_msg->packets.size() * config_.scans_per_packet * cloud.point_step);
cloud.width = config_.init_width;
cloud.height = config_.init_height;
cloud.is_dense = static_cast<uint8_t>(config_.is_dense);
}
virtual void addPoint(float x, float y, float z, const uint16_t ring, const uint16_t azimuth, const float distance,
const float intensity, const float time) = 0;
virtual void newLine() = 0;
const sensor_msgs::PointCloud2& finishCloud()
{
cloud.data.resize(cloud.point_step * cloud.width * cloud.height);
cloud.row_step = cloud.point_step * cloud.width;
if (!config_.target_frame.empty())
{
cloud.header.frame_id = config_.target_frame;
}
ROS_DEBUG_STREAM("Prepared cloud width" << cloud.height * cloud.width
<< " Velodyne points, time: " << cloud.header.stamp);
return cloud;
}
void configure(const double max_range, const double min_range, const std::string fixed_frame,
const std::string target_frame)
{
config_.max_range = max_range;
config_.min_range = min_range;
config_.fixed_frame = fixed_frame;
config_.target_frame = target_frame;
config_.transform = fixed_frame.compare(target_frame) != 0;
if (config_.transform && !tf_ptr)
{
tf_ptr = boost::shared_ptr<tf::TransformListener>(new tf::TransformListener);
}
}
sensor_msgs::PointCloud2 cloud;
inline void vectorTfToEigen(tf::Vector3& tf_vec, Eigen::Vector3f& eigen_vec)
{
eigen_vec(0) = tf_vec[0];
eigen_vec(1) = tf_vec[1];
eigen_vec(2) = tf_vec[2];
}
inline bool computeTransformation(const ros::Time& time)
{
tf::StampedTransform transform;
try
{
tf_ptr->lookupTransform(config_.target_frame, cloud.header.frame_id, time, transform);
}
catch (tf::LookupException& e)
{
ROS_ERROR("%s", e.what());
return false;
}
catch (tf::ExtrapolationException& e)
{
ROS_ERROR("%s", e.what());
return false;
}
tf::Quaternion quaternion = transform.getRotation();
Eigen::Quaternionf rotation(quaternion.w(), quaternion.x(), quaternion.y(), quaternion.z());
Eigen::Vector3f eigen_origin;
vectorTfToEigen(transform.getOrigin(), eigen_origin);
Eigen::Translation3f translation(eigen_origin);
transformation = translation * rotation;
return true;
}
inline void transformPoint(float& x, float& y, float& z)
{
Eigen::Vector3f p = transformation * Eigen::Vector3f(x, y, z);
x = p.x();
y = p.y();
z = p.z();
}
inline bool pointInRange(float range)
{
return (range >= config_.min_range && range <= config_.max_range);
}
protected:
Config config_;
boost::shared_ptr<tf::TransformListener> tf_ptr; ///< transform listener
Eigen::Affine3f transformation;
};
} /* namespace velodyne_rawdata */
#endif // VELODYNE_POINTCLOUD_DATACONTAINERBASE_H
@@ -0,0 +1,61 @@
// Copyright (C) 2012, 2019 Austin Robot Technology, Jack O'Quin, Joshua Whitley, Sebastian Pütz
// All rights reserved.
//
// Software License Agreement (BSD License 2.0)
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
// * Neither the name of {copyright_holder} nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
#ifndef VELODYNE_POINTCLOUD_ORGANIZED_CLOUDXYZIR_H
#define VELODYNE_POINTCLOUD_ORGANIZED_CLOUDXYZIR_H
#include <velodyne_pointcloud/datacontainerbase.h>
#include <sensor_msgs/point_cloud2_iterator.h>
#include <string>
namespace velodyne_pointcloud
{
class OrganizedCloudXYZIR : public velodyne_rawdata::DataContainerBase
{
public:
OrganizedCloudXYZIR(const double max_range, const double min_range, const std::string& target_frame,
const std::string& fixed_frame, const unsigned int num_lasers, const unsigned int scans_per_block,
boost::shared_ptr<tf::TransformListener> tf_ptr = boost::shared_ptr<tf::TransformListener>());
virtual void newLine();
virtual void setup(const velodyne_msgs::VelodyneScan::ConstPtr& scan_msg);
virtual void addPoint(float x, float y, float z, const uint16_t ring, const uint16_t azimuth, const float distance,
const float intensity, const float time);
private:
sensor_msgs::PointCloud2Iterator<float> iter_x, iter_y, iter_z, iter_intensity, iter_time;
sensor_msgs::PointCloud2Iterator<uint16_t> iter_ring;
};
} /* namespace velodyne_pointcloud */
#endif // VELODYNE_POINTCLOUD_ORGANIZED_CLOUDXYZIR_H
@@ -0,0 +1,60 @@
// Copyright (C) 2012, 2019 Austin Robot Technology, Jack O'Quin, Joshua Whitley, Sebastian Pütz
// All rights reserved.
//
// Software License Agreement (BSD License 2.0)
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
// * Neither the name of {copyright_holder} nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
#ifndef VELODYNE_POINTCLOUD_POINTCLOUDXYZIR_H
#define VELODYNE_POINTCLOUD_POINTCLOUDXYZIR_H
#include <velodyne_pointcloud/datacontainerbase.h>
#include <string>
namespace velodyne_pointcloud
{
class PointcloudXYZIR : public velodyne_rawdata::DataContainerBase
{
public:
PointcloudXYZIR(const double max_range, const double min_range, const std::string& target_frame,
const std::string& fixed_frame, const unsigned int scans_per_block,
boost::shared_ptr<tf::TransformListener> tf_ptr = boost::shared_ptr<tf::TransformListener>());
virtual void newLine();
virtual void setup(const velodyne_msgs::VelodyneScan::ConstPtr& scan_msg);
virtual void addPoint(float x, float y, float z, const uint16_t ring, const uint16_t azimuth,
const float distance, const float intensity, const float time);
sensor_msgs::PointCloud2Iterator<float> iter_x, iter_y, iter_z, iter_intensity, iter_time;
sensor_msgs::PointCloud2Iterator<uint16_t> iter_ring;
};
} // namespace velodyne_pointcloud
#endif // VELODYNE_POINTCLOUD_POINTCLOUDXYZIR_H
@@ -0,0 +1,216 @@
// Copyright (C) 2007, 2009, 2010, 2012, 2019 Yaxin Liu, Patrick Beeson, Jack O'Quin, Joshua Whitley
// All rights reserved.
//
// Software License Agreement (BSD License 2.0)
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
// * Neither the name of {copyright_holder} nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
/** @file
*
* @brief Interfaces for interpreting raw packets from the Velodyne 3D LIDAR.
*
* @author Yaxin Liu
* @author Patrick Beeson
* @author Jack O'Quin
*/
#ifndef VELODYNE_POINTCLOUD_RAWDATA_H
#define VELODYNE_POINTCLOUD_RAWDATA_H
#include <errno.h>
#include <stdint.h>
#include <string>
#include <boost/format.hpp>
#include <math.h>
#include <vector>
#include <ros/ros.h>
#include <velodyne_msgs/VelodyneScan.h>
#include <velodyne_pointcloud/calibration.h>
#include <velodyne_pointcloud/datacontainerbase.h>
namespace velodyne_rawdata
{
/**
* Raw Velodyne packet constants and structures.
*/
static const int SIZE_BLOCK = 100;
static const int RAW_SCAN_SIZE = 3;
static const int SCANS_PER_BLOCK = 32;
static const int BLOCK_DATA_SIZE = (SCANS_PER_BLOCK * RAW_SCAN_SIZE);
static const float ROTATION_RESOLUTION = 0.01f; // [deg]
static const uint16_t ROTATION_MAX_UNITS = 36000u; // [deg/100]
/** @todo make this work for both big and little-endian machines */
static const uint16_t UPPER_BANK = 0xeeff;
static const uint16_t LOWER_BANK = 0xddff;
/** Special Defines for VLP16 support **/
static const int VLP16_FIRINGS_PER_BLOCK = 2;
static const int VLP16_SCANS_PER_FIRING = 16;
static const float VLP16_BLOCK_TDURATION = 110.592f; // [µs]
static const float VLP16_DSR_TOFFSET = 2.304f; // [µs]
static const float VLP16_FIRING_TOFFSET = 55.296f; // [µs]
/** \brief Raw Velodyne data block.
*
* Each block contains data from either the upper or lower laser
* bank. The device returns three times as many upper bank blocks.
*
* use stdint.h types, so things work with both 64 and 32-bit machines
*/
typedef struct raw_block
{
uint16_t header; ///< UPPER_BANK or LOWER_BANK
uint16_t rotation; ///< 0-35999, divide by 100 to get degrees
uint8_t data[BLOCK_DATA_SIZE];
}
raw_block_t;
/** used for unpacking the first two data bytes in a block
*
* They are packed into the actual data stream misaligned. I doubt
* this works on big endian machines.
*/
union two_bytes
{
uint16_t uint;
uint8_t bytes[2];
};
static const int PACKET_SIZE = 1206;
static const int BLOCKS_PER_PACKET = 12;
static const int PACKET_STATUS_SIZE = 4;
static const int SCANS_PER_PACKET = (SCANS_PER_BLOCK * BLOCKS_PER_PACKET);
/** \brief Raw Velodyne packet.
*
* revolution is described in the device manual as incrementing
* (mod 65536) for each physical turn of the device. Our device
* seems to alternate between two different values every third
* packet. One value increases, the other decreases.
*
* \todo figure out if revolution is only present for one of the
* two types of status fields
*
* status has either a temperature encoding or the microcode level
*/
typedef struct raw_packet
{
raw_block_t blocks[BLOCKS_PER_PACKET];
uint16_t revolution;
uint8_t status[PACKET_STATUS_SIZE];
}
raw_packet_t;
/** \brief Velodyne data conversion class */
class RawData
{
public:
RawData();
~RawData()
{
}
/** \brief Set up for data processing.
*
* Perform initializations needed before data processing can
* begin:
*
* - read device-specific angles calibration
*
* @param private_nh private node handle for ROS parameters
* @returns an optional calibration
*/
boost::optional<velodyne_pointcloud::Calibration> setup(ros::NodeHandle private_nh);
/** \brief Set up for data processing offline.
* Performs the same initialization as in setup, in the abscence of a ros::NodeHandle.
* this method is useful if unpacking data directly from bag files, without passing
* through a communication overhead.
*
* @param calibration_file path to the calibration file
* @param max_range_ cutoff for maximum range
* @param min_range_ cutoff for minimum range
* @returns 0 if successful;
* errno value for failure
*/
int setupOffline(std::string calibration_file, double max_range_, double min_range_);
void unpack(const velodyne_msgs::VelodynePacket& pkt, DataContainerBase& data,
const ros::Time& scan_start_time);
void setParameters(double min_range, double max_range, double view_direction, double view_width);
int scansPerPacket() const;
private:
/** configuration parameters */
typedef struct
{
std::string model;
std::string calibrationFile; ///< calibration file name
double max_range; ///< maximum range to publish
double min_range; ///< minimum range to publish
int min_angle; ///< minimum angle to publish
int max_angle; ///< maximum angle to publish
double tmp_min_angle;
double tmp_max_angle;
}
Config;
Config config_;
/**
* Calibration file
*/
velodyne_pointcloud::Calibration calibration_;
float sin_rot_table_[ROTATION_MAX_UNITS];
float cos_rot_table_[ROTATION_MAX_UNITS];
// timing offset lookup table
std::vector< std::vector<float> > timing_offsets;
/** \brief setup per-point timing offsets
*
* Runs during initialization and determines the firing time for each point in the scan
*
* NOTE: Does not support all sensors yet (vlp16, vlp32, and hdl32 are currently supported)
*/
bool buildTimings();
/** add private function to handle the VLP16 **/
void unpack_vlp16(const velodyne_msgs::VelodynePacket& pkt, DataContainerBase& data,
const ros::Time& scan_start_time);
};
} // namespace velodyne_rawdata
#endif // VELODYNE_POINTCLOUD_RAWDATA_H
@@ -0,0 +1,112 @@
// Copyright (C) 2009, 2010, 2011, 2012, 2019 Austin Robot Technology, Jack O'Quin, Jesse Vera, Joshua Whitley,
// Sebastian Pütz All rights reserved.
//
// Software License Agreement (BSD License 2.0)
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
// * Neither the name of {copyright_holder} nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
/** @file
This class transforms raw Velodyne 3D LIDAR packets to PointCloud2
in the /map frame of reference.
*/
#ifndef VELODYNE_POINTCLOUD_TRANSFORM_H
#define VELODYNE_POINTCLOUD_TRANSFORM_H
#include <string>
#include <ros/ros.h>
#include "tf/message_filter.h"
#include "message_filters/subscriber.h"
#include <diagnostic_updater/diagnostic_updater.h>
#include <diagnostic_updater/publisher.h>
#include <sensor_msgs/PointCloud2.h>
#include <velodyne_pointcloud/rawdata.h>
#include <velodyne_pointcloud/pointcloudXYZIR.h>
#include <dynamic_reconfigure/server.h>
#include <velodyne_pointcloud/TransformNodeConfig.h>
namespace velodyne_pointcloud
{
using TransformNodeCfg = velodyne_pointcloud::TransformNodeConfig;
class Transform
{
public:
Transform(
ros::NodeHandle node,
ros::NodeHandle private_nh,
std::string const & node_name = ros::this_node::getName());
~Transform()
{
}
private:
void processScan(const velodyne_msgs::VelodyneScan::ConstPtr& scanMsg);
// Pointer to dynamic reconfigure service srv_
boost::shared_ptr<dynamic_reconfigure::Server<velodyne_pointcloud::TransformNodeConfig>> srv_;
void reconfigure_callback(velodyne_pointcloud::TransformNodeConfig& config, uint32_t level);
const std::string tf_prefix_;
boost::shared_ptr<velodyne_rawdata::RawData> data_;
message_filters::Subscriber<velodyne_msgs::VelodyneScan> velodyne_scan_;
ros::Publisher output_;
boost::shared_ptr<tf::MessageFilter<velodyne_msgs::VelodyneScan>> tf_filter_ptr_;
boost::shared_ptr<tf::TransformListener> tf_ptr_;
/// configuration parameters
typedef struct
{
std::string target_frame; ///< target frame
std::string fixed_frame; ///< fixed frame
bool organize_cloud; ///< enable/disable organized cloud structure
double max_range; ///< maximum range to publish
double min_range; ///< minimum range to publish
uint16_t num_lasers; ///< number of lasers
}
Config;
Config config_;
bool first_rcfg_call;
boost::shared_ptr<velodyne_rawdata::DataContainerBase> container_ptr;
// diagnostics updater
diagnostic_updater::Updater diagnostics_;
double diag_min_freq_;
double diag_max_freq_;
boost::shared_ptr<diagnostic_updater::TopicDiagnostic> diag_topic_;
boost::mutex reconfigure_mtx_;
};
} // namespace velodyne_pointcloud
#endif // VELODYNE_POINTCLOUD_TRANSFORM_H
@@ -0,0 +1,62 @@
<!-- -*- mode: XML -*- -->
<!-- run velodyne_pointcloud/CloudNodelet in a nodelet manager for an HDL-32E -->
<launch>
<!-- declare arguments with default values -->
<arg name="calibration" default="$(find velodyne_pointcloud)/params/32db.yaml"/>
<arg name="device_ip" default="" />
<arg name="frame_id" default="velodyne" />
<arg name="manager" default="$(arg frame_id)_nodelet_manager" />
<arg name="max_range" default="130.0" />
<arg name="min_range" default="0.4" />
<arg name="pcap" default="" />
<arg name="port" default="2368" />
<arg name="read_fast" default="false" />
<arg name="read_once" default="false" />
<arg name="repeat_delay" default="0.0" />
<arg name="rpm" default="600.0" />
<arg name="gps_time" default="false" />
<arg name="cut_angle" default="-0.01" />
<arg name="timestamp_first_packet" default="false" />
<arg name="laserscan_ring" default="-1" />
<arg name="laserscan_resolution" default="0.007" />
<arg name="organize_cloud" default="false" />
<!-- start nodelet manager and driver nodelets -->
<include file="$(find velodyne_driver)/launch/nodelet_manager.launch">
<arg name="device_ip" value="$(arg device_ip)"/>
<arg name="frame_id" value="$(arg frame_id)"/>
<arg name="manager" value="$(arg manager)" />
<arg name="model" value="32E"/>
<arg name="pcap" value="$(arg pcap)"/>
<arg name="port" value="$(arg port)"/>
<arg name="read_fast" value="$(arg read_fast)"/>
<arg name="read_once" value="$(arg read_once)"/>
<arg name="repeat_delay" value="$(arg repeat_delay)"/>
<arg name="rpm" value="$(arg rpm)"/>
<arg name="gps_time" value="$(arg gps_time)"/>
<arg name="cut_angle" value="$(arg cut_angle)"/>
<arg name="timestamp_first_packet" value="$(arg timestamp_first_packet)"/>
</include>
<!-- start cloud nodelet -->
<include file="$(find velodyne_pointcloud)/launch/cloud_nodelet.launch">
<arg name="model" value="32E"/>
<arg name="calibration" value="$(arg calibration)"/>
<arg name="manager" value="$(arg manager)" />
<arg name="fixed_frame" value="$(arg frame_id)" />
<arg name="target_frame" value="$(arg frame_id)" />
<arg name="max_range" value="$(arg max_range)"/>
<arg name="min_range" value="$(arg min_range)"/>
<arg name="organize_cloud" value="$(arg organize_cloud)"/>
</include>
<!-- start laserscan nodelet -->
<include file="$(find velodyne_pointcloud)/launch/laserscan_nodelet.launch">
<arg name="manager" value="$(arg manager)" />
<arg name="ring" value="$(arg laserscan_ring)"/>
<arg name="resolution" value="$(arg laserscan_resolution)"/>
</include>
</launch>
@@ -0,0 +1,61 @@
<!-- -*- mode: XML -*- -->
<!-- run velodyne_pointcloud/CloudNodelet in a nodelet manager for an HDL-32E -->
<launch>
<!-- declare arguments with default values -->
<arg name="calibration" default="$(find velodyne_pointcloud)/params/64e_s3-xiesc.yaml"/>
<arg name="device_ip" default="" />
<arg name="frame_id" default="velodyne" />
<arg name="manager" default="$(arg frame_id)_nodelet_manager" />
<arg name="max_range" default="130.0" />
<arg name="min_range" default="0.4" />
<arg name="pcap" default="" />
<arg name="port" default="2368" />
<arg name="read_fast" default="false" />
<arg name="read_once" default="false" />
<arg name="repeat_delay" default="0.0" />
<arg name="rpm" default="600.0" />
<arg name="gps_time" default="false" />
<arg name="cut_angle" default="-0.01" />
<arg name="timestamp_first_packet" default="false" />
<arg name="laserscan_ring" default="-1" />
<arg name="laserscan_resolution" default="0.007" />
<arg name="model" value="64E_S3"/>
<!-- start nodelet manager and driver nodelets -->
<include file="$(find velodyne_driver)/launch/nodelet_manager.launch">
<arg name="device_ip" value="$(arg device_ip)"/>
<arg name="frame_id" value="$(arg frame_id)"/>
<arg name="manager" value="$(arg manager)" />
<arg name="model" value="$(arg model)"/>
<arg name="pcap" value="$(arg pcap)"/>
<arg name="port" value="$(arg port)"/>
<arg name="read_fast" value="$(arg read_fast)"/>
<arg name="read_once" value="$(arg read_once)"/>
<arg name="repeat_delay" value="$(arg repeat_delay)"/>
<arg name="rpm" value="$(arg rpm)"/>
<arg name="gps_time" value="$(arg gps_time)"/>
<arg name="cut_angle" value="$(arg cut_angle)"/>
<arg name="timestamp_first_packet" value="$(arg timestamp_first_packet)"/>
</include>
<!-- start cloud nodelet -->
<include file="$(find velodyne_pointcloud)/launch/cloud_nodelet.launch">
<arg name="model" value="$(arg model)"/>
<arg name="calibration" value="$(arg calibration)"/>
<arg name="manager" value="$(arg manager)" />
<arg name="fixed_frame" value="$(arg frame_id)" />
<arg name="target_frame" value="$(arg frame_id)" />
<arg name="max_range" value="$(arg max_range)"/>
<arg name="min_range" value="$(arg min_range)"/>
</include>
<!-- start laserscan nodelet -->
<include file="$(find velodyne_pointcloud)/launch/laserscan_nodelet.launch">
<arg name="manager" value="$(arg manager)" />
<arg name="ring" value="$(arg laserscan_ring)"/>
<arg name="resolution" value="$(arg laserscan_resolution)"/>
</include>
</launch>
@@ -0,0 +1,62 @@
<!-- -*- mode: XML -*- -->
<!-- run velodyne_pointcloud/CloudNodelet in a nodelet manager for an VLP-32C -->
<launch>
<!-- declare arguments with default values -->
<arg name="calibration" default="$(find velodyne_pointcloud)/params/VeloView-VLP-32C.yaml"/>
<arg name="device_ip" default="" />
<arg name="frame_id" default="velodyne" />
<arg name="manager" default="$(arg frame_id)_nodelet_manager" />
<arg name="max_range" default="200.0" />
<arg name="min_range" default="0.4" />
<arg name="pcap" default="" />
<arg name="port" default="2368" />
<arg name="read_fast" default="false" />
<arg name="read_once" default="false" />
<arg name="repeat_delay" default="0.0" />
<arg name="rpm" default="600.0" />
<arg name="gps_time" default="false" />
<arg name="cut_angle" default="-0.01" />
<arg name="timestamp_first_packet" default="false" />
<arg name="laserscan_ring" default="-1" />
<arg name="laserscan_resolution" default="0.007" />
<arg name="organize_cloud" default="false" />
<!-- start nodelet manager and driver nodelets -->
<include file="$(find velodyne_driver)/launch/nodelet_manager.launch">
<arg name="device_ip" value="$(arg device_ip)"/>
<arg name="frame_id" value="$(arg frame_id)"/>
<arg name="manager" value="$(arg manager)" />
<arg name="model" value="32C"/>
<arg name="pcap" value="$(arg pcap)"/>
<arg name="port" value="$(arg port)"/>
<arg name="read_fast" value="$(arg read_fast)"/>
<arg name="read_once" value="$(arg read_once)"/>
<arg name="repeat_delay" value="$(arg repeat_delay)"/>
<arg name="rpm" value="$(arg rpm)"/>
<arg name="gps_time" value="$(arg gps_time)"/>
<arg name="cut_angle" value="$(arg cut_angle)"/>
<arg name="timestamp_first_packet" value="$(arg timestamp_first_packet)"/>
</include>
<!-- start cloud nodelet -->
<include file="$(find velodyne_pointcloud)/launch/cloud_nodelet.launch">
<arg name="model" value="32C"/>
<arg name="calibration" value="$(arg calibration)"/>
<arg name="manager" value="$(arg manager)" />
<arg name="fixed_frame" value="$(arg frame_id)" />
<arg name="target_frame" value="$(arg frame_id)" />
<arg name="max_range" value="$(arg max_range)"/>
<arg name="min_range" value="$(arg min_range)"/>
<arg name="organize_cloud" value="$(arg organize_cloud)"/>
</include>
<!-- start laserscan nodelet -->
<include file="$(find velodyne_pointcloud)/launch/laserscan_nodelet.launch">
<arg name="manager" value="$(arg manager)" />
<arg name="ring" value="$(arg laserscan_ring)"/>
<arg name="resolution" value="$(arg laserscan_resolution)"/>
</include>
</launch>
@@ -0,0 +1,62 @@
<!-- -*- mode: XML -*- -->
<!-- run velodyne_pointcloud/CloudNodelet in a nodelet manager for a VLP-16 -->
<launch>
<!-- declare arguments with default values -->
<arg name="calibration" default="$(find velodyne_pointcloud)/params/VLP16db.yaml"/>
<arg name="device_ip" default="" />
<arg name="frame_id" default="velodyne" />
<arg name="manager" default="$(arg frame_id)_nodelet_manager" />
<arg name="max_range" default="130.0" />
<arg name="min_range" default="0.4" />
<arg name="pcap" default="" />
<arg name="port" default="2368" />
<arg name="read_fast" default="false" />
<arg name="read_once" default="false" />
<arg name="repeat_delay" default="0.0" />
<arg name="rpm" default="600.0" />
<arg name="gps_time" default="false" />
<arg name="cut_angle" default="-0.01" />
<arg name="timestamp_first_packet" default="false" />
<arg name="laserscan_ring" default="-1" />
<arg name="laserscan_resolution" default="0.007" />
<arg name="organize_cloud" default="false" />
<!-- start nodelet manager and driver nodelets -->
<include file="$(find velodyne_driver)/launch/nodelet_manager.launch">
<arg name="device_ip" value="$(arg device_ip)"/>
<arg name="frame_id" value="$(arg frame_id)"/>
<arg name="manager" value="$(arg manager)" />
<arg name="model" value="VLP16"/>
<arg name="pcap" value="$(arg pcap)"/>
<arg name="port" value="$(arg port)"/>
<arg name="read_fast" value="$(arg read_fast)"/>
<arg name="read_once" value="$(arg read_once)"/>
<arg name="repeat_delay" value="$(arg repeat_delay)"/>
<arg name="rpm" value="$(arg rpm)"/>
<arg name="gps_time" value="$(arg gps_time)"/>
<arg name="cut_angle" value="$(arg cut_angle)"/>
<arg name="timestamp_first_packet" value="$(arg timestamp_first_packet)"/>
</include>
<!-- start cloud nodelet -->
<include file="$(find velodyne_pointcloud)/launch/cloud_nodelet.launch">
<arg name="model" value="VLP16"/>
<arg name="calibration" value="$(arg calibration)"/>
<arg name="manager" value="$(arg manager)" />
<arg name="fixed_frame" value="$(arg frame_id)" />
<arg name="target_frame" value="$(arg frame_id)" />
<arg name="max_range" value="$(arg max_range)"/>
<arg name="min_range" value="$(arg min_range)"/>
<arg name="organize_cloud" value="$(arg organize_cloud)"/>
</include>
<!-- start laserscan nodelet -->
<!-- <include file="$(find velodyne_pointcloud)/launch/laserscan_nodelet.launch">
<arg name="manager" value="$(arg manager)" />
<arg name="ring" value="$(arg laserscan_ring)"/>
<arg name="resolution" value="$(arg laserscan_resolution)"/>
</include> -->
</launch>
@@ -0,0 +1,24 @@
<!-- -*- mode: XML -*- -->
<!-- run velodyne_pointcloud/CloudNodelet in a nodelet manager -->
<launch>
<arg name="model" default="" />
<arg name="calibration" default="" />
<arg name="manager" default="velodyne_nodelet_manager" />
<arg name="fixed_frame" default="velodyne" />
<arg name="target_frame" default="velodyne" />
<arg name="max_range" default="130.0" />
<arg name="min_range" default="0.9" />
<arg name="organize_cloud" default="false" />
<node pkg="nodelet" type="nodelet" name="$(arg manager)_cloud"
args="load velodyne_pointcloud/CloudNodelet $(arg manager)">
<param name="model" value="$(arg model)"/>
<param name="calibration" value="$(arg calibration)"/>
<param name="fixed_frame" value="$(arg fixed_frame)"/>
<param name="target_frame" value="$(arg target_frame)"/>
<param name="max_range" value="$(arg max_range)"/>
<param name="min_range" value="$(arg min_range)"/>
<param name="organize_cloud" value="$(arg organize_cloud)"/>
</node>
</launch>
@@ -0,0 +1,14 @@
<!-- -*- mode: XML -*- -->
<!-- run velodyne_laserscan/LaserScanNodelet in a nodelet manager -->
<launch>
<arg name="manager" default="velodyne_nodelet_manager" />
<arg name="ring" default="-1" />
<arg name="resolution" default="0.007" />
<node pkg="nodelet" type="nodelet" name="$(arg manager)_laserscan"
args="load velodyne_laserscan/LaserScanNodelet $(arg manager)">
<param name="ring" value="$(arg ring)"/>
<param name="resolution" value="$(arg resolution)"/>
</node>
</launch>
@@ -0,0 +1,21 @@
<!-- -*- mode: XML -*- -->
<!-- run velodyne_pointcloud/TransformNodelet in a nodelet manager -->
<launch>
<arg name="model" default="" />
<arg name="calibration" default="" />
<arg name="frame_id" default="map" />
<arg name="manager" default="velodyne_nodelet_manager" />
<arg name="max_range" default="130.0" />
<arg name="min_range" default="0.9" />
<arg name="organize_cloud" default="false" />
<node pkg="nodelet" type="nodelet" name="$(arg manager)_transform"
args="load velodyne_pointcloud/TransformNodelet $(arg manager)" >
<param name="model" value="$(arg model)"/>
<param name="calibration" value="$(arg calibration)"/>
<param name="frame_id" value="$(arg frame_id)"/>
<param name="max_range" value="$(arg max_range)"/>
<param name="min_range" value="$(arg min_range)"/>
<param name="organize_cloud" value="$(arg organize_cloud)"/>
</node>
</launch>
@@ -0,0 +1,8 @@
/**
\mainpage
\htmlinclude manifest.html
Nodes and nodelets for converting raw Velodyne 3D LIDAR data to point
clouds.
*/
@@ -0,0 +1,35 @@
<class_libraries>
<library path="lib/libcloud_nodelet">
<class name="velodyne_pointcloud/CloudNodelet"
type="velodyne_pointcloud::CloudNodelet"
base_class_type="nodelet::Nodelet">
<description>
Aggregates points from multiple packets, publishing PointCloud2.
</description>
</class>
</library>
<library path="lib/libringcolors_nodelet">
<class name="velodyne_pointcloud/RingColorsNodelet"
type="velodyne_pointcloud::RingColorsNodelet"
base_class_type="nodelet::Nodelet">
<description>
Converts a Velodyne PointCloud2 to PointXYZRGB, assigning colors
for visualization of the laser rings.
</description>
</class>
</library>
<library path="lib/libtransform_nodelet">
<class name="velodyne_pointcloud/TransformNodelet"
type="velodyne_pointcloud::TransformNodelet"
base_class_type="nodelet::Nodelet">
<description>
Transforms packets into /map frame, publishing multiple packets
as PointCloud2.
</description>
</class>
</library>
</class_libraries>
@@ -0,0 +1,45 @@
<?xml version="1.0"?>
<package format="2">
<name>velodyne_pointcloud</name>
<version>1.5.2</version>
<description>
Point cloud conversions for Velodyne 3D LIDARs.
</description>
<maintainer email="josh.whitley@autoware.org">Josh Whitley</maintainer>
<author>Jack O'Quin</author>
<author>Piyush Khandelwal</author>
<author>Jesse Vera</author>
<author>Sebastian Pütz</author>
<license>BSD</license>
<url type="website">http://ros.org/wiki/velodyne_pointcloud</url>
<url type="repository">https://github.com/ros-drivers/velodyne</url>
<url type="bugtracker">https://github.com/ros-drivers/velodyne/issues</url>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roslint</build_depend>
<depend>angles</depend>
<depend>nodelet</depend>
<depend>roscpp</depend>
<depend>roslib</depend>
<depend>sensor_msgs</depend>
<depend>tf</depend>
<depend>velodyne_driver</depend>
<depend>velodyne_msgs</depend>
<depend>yaml-cpp</depend>
<depend>dynamic_reconfigure</depend>
<depend>diagnostic_updater</depend>
<depend>eigen</depend>
<exec_depend>velodyne_laserscan</exec_depend>
<test_depend>rosunit</test_depend>
<test_depend>roslaunch</test_depend>
<test_depend>rostest</test_depend>
<test_depend>tf2_ros</test_depend>
<export>
<nodelet plugin="${prefix}/nodelets.xml"/>
</export>
</package>
@@ -0,0 +1,100 @@
# standard Velodyne HDL-32E calibration parameters
lasers:
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 0, rot_correction: 0.0,
vert_correction: -0.5352924815866609, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 1, rot_correction: 0.0,
vert_correction: -0.1628392174657417, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 2, rot_correction: 0.0,
vert_correction: -0.5119050696099369, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 3, rot_correction: 0.0,
vert_correction: -0.13962634015954636, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 4, rot_correction: 0.0,
vert_correction: -0.4886921905584123, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 5, rot_correction: 0.0,
vert_correction: -0.11641346285335104, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 6, rot_correction: 0.0,
vert_correction: -0.4654793115068877, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 7, rot_correction: 0.0,
vert_correction: -0.09302604738596851, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 8, rot_correction: 0.0,
vert_correction: -0.44209189953016365, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 9, rot_correction: 0.0,
vert_correction: -0.06981317007977318, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 10, rot_correction: 0.0,
vert_correction: -0.4188790204786391, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 11, rot_correction: 0.0,
vert_correction: -0.046600292773577856, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 12, rot_correction: 0.0,
vert_correction: -0.39566614142711454, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 13, rot_correction: 0.0,
vert_correction: -0.023212879051524585, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 14, rot_correction: 0.0,
vert_correction: -0.3722787294503905, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 15, rot_correction: 0.0,
vert_correction: 0.0, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 16, rot_correction: 0.0,
vert_correction: -0.3490658503988659, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 17, rot_correction: 0.0,
vert_correction: 0.023212879051524585, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 18, rot_correction: 0.0,
vert_correction: -0.32585297134734137, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 19, rot_correction: 0.0,
vert_correction: 0.046600292773577856, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 20, rot_correction: 0.0,
vert_correction: -0.30246555937061725, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 21, rot_correction: 0.0,
vert_correction: 0.06981317007977318, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 22, rot_correction: 0.0,
vert_correction: -0.2792526803190927, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 23, rot_correction: 0.0,
vert_correction: 0.09302604738596851, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 24, rot_correction: 0.0,
vert_correction: -0.25603980126756815, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 25, rot_correction: 0.0,
vert_correction: 0.11641346285335104, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 26, rot_correction: 0.0,
vert_correction: -0.23265238929084414, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 27, rot_correction: 0.0,
vert_correction: 0.13962634015954636, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 28, rot_correction: 0.0,
vert_correction: -0.20943951023931956, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 29, rot_correction: 0.0,
vert_correction: 0.1628392174657417, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 30, rot_correction: 0.0,
vert_correction: -0.18622663118779495, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 31, rot_correction: 0.0,
vert_correction: 0.18622663118779495, vert_offset_correction: 0.0}
num_lasers: 32
distance_resolution: 0.002
@@ -0,0 +1,246 @@
lasers:
- {dist_correction: 1.5195264000000002, dist_correction_x: 1.5500304, dist_correction_y: 1.5231381,
focal_distance: 12.0, focal_slope: 1.4, horiz_offset_correction: 0.025999999, laser_id: 0,
max_intensity: 235.0, min_intensity: 30.0, rot_correction: -0.1248942899601548,
vert_correction: -0.15304134919741974, vert_offset_correction: 0.19548199}
- {dist_correction: 1.5145139, dist_correction_x: 1.5256960000000002, dist_correction_y: 1.5491043,
focal_distance: 5.0, focal_slope: 1.0, horiz_offset_correction: -0.025999999, laser_id: 1,
min_intensity: 40.0, rot_correction: -0.06924466398252106, vert_correction: -0.1458455539136526,
vert_offset_correction: 0.19601112}
- {dist_correction: 1.4963768, dist_correction_x: 1.5571011, dist_correction_y: 1.5456782999999998,
focal_distance: 5.0, focal_slope: 0.89999998, horiz_offset_correction: 0.025999999,
laser_id: 2, min_intensity: 60.0, rot_correction: 0.0824016906676694, vert_correction: 0.04339494149708345,
vert_offset_correction: 0.20969539999999998}
- {dist_correction: 1.3771207, dist_correction_x: 1.4103835, dist_correction_y: 1.4343457000000002,
focal_distance: 9.5, focal_slope: 1.1, horiz_offset_correction: -0.025999999, laser_id: 3,
min_intensity: 20.0, rot_correction: 0.137808349360133, vert_correction: 0.05196082373432465,
vert_offset_correction: 0.21031273}
- {dist_correction: 1.2947885, dist_correction_x: 1.3720455999999999, dist_correction_y: 1.4025244000000001,
focal_distance: 10.0, focal_slope: 1.0, horiz_offset_correction: 0.025999999, laser_id: 4,
min_intensity: 50.0, rot_correction: -0.011199603626188263, vert_correction: -0.1358262679404349,
vert_offset_correction: 0.19674603999999998}
- {dist_correction: 1.4395787000000002, dist_correction_x: 1.4801956, dist_correction_y: 1.5074649,
focal_distance: 7.0, focal_slope: 1.0, horiz_offset_correction: -0.025999999, laser_id: 5,
min_intensity: 30.0, rot_correction: 0.045795414990398894, vert_correction: -0.12678532627942263,
vert_offset_correction: 0.19740747}
- {dist_correction: 1.3618773, dist_correction_x: 1.4004077000000001, dist_correction_y: 1.3900876,
focal_distance: 5.0, focal_slope: 1.1, horiz_offset_correction: 0.025999999, laser_id: 6,
min_intensity: 65.0, rot_correction: -0.031646046452444135, vert_correction: -0.1895564226946273,
vert_offset_correction: 0.19277746}
- {dist_correction: 1.5325716, dist_correction_x: 1.5337143, dist_correction_y: 1.5452948000000002,
focal_distance: 6.0, focal_slope: 1.0, horiz_offset_correction: -0.025999999, laser_id: 7,
min_intensity: 10.0, rot_correction: 0.023408326257150665, vert_correction: -0.18086723120040343,
vert_offset_correction: 0.19342419}
- {dist_correction: 1.3743323, dist_correction_x: 1.4474606, dist_correction_y: 1.4533472,
focal_distance: 6.0, focal_slope: 1.0, horiz_offset_correction: 0.025999999, laser_id: 8,
min_intensity: 30.0, rot_correction: 0.10065885915180103, vert_correction: -0.11973897655818674,
vert_offset_correction: 0.19792192}
- {dist_correction: 1.4969112000000002, dist_correction_x: 1.4754176, dist_correction_y: 1.4888799000000001,
focal_distance: 5.0, focal_slope: 1.0, horiz_offset_correction: -0.025999999, laser_id: 9,
min_intensity: 10.0, rot_correction: 0.15996423607269877, vert_correction: -0.10924820210484752,
vert_offset_correction: 0.19868624000000001}
- {dist_correction: 1.434263, dist_correction_x: 1.4957901000000002, dist_correction_y: 1.5191892999999999,
focal_distance: 5.0, focal_slope: 0.89999998, horiz_offset_correction: 0.025999999,
laser_id: 10, min_intensity: 35.0, rot_correction: 0.08313316164783874, vert_correction: -0.17135657256846043,
vert_offset_correction: 0.19412970999999998}
- {dist_correction: 1.5500841, dist_correction_x: 1.542697, dist_correction_y: 1.5716737,
focal_distance: 8.0, focal_slope: 1.2, horiz_offset_correction: -0.025999999, laser_id: 11,
min_intensity: 30.0, rot_correction: 0.13862572370075624, vert_correction: -0.1630088948849621,
vert_offset_correction: 0.19474705}
- {dist_correction: 1.3725992, dist_correction_x: 1.4353555, dist_correction_y: 1.3932405,
focal_distance: 11.0, focal_slope: 1.1, horiz_offset_correction: 0.025999999, laser_id: 12,
min_intensity: 50.0, rot_correction: -0.1255805045528199, vert_correction: -0.04526314018308893,
vert_offset_correction: 0.20331627000000002}
- {dist_correction: 1.3111591000000002, dist_correction_x: 1.3470857, dist_correction_y: 1.3652054000000002,
focal_distance: 6.0, focal_slope: 0.69999999, horiz_offset_correction: -0.025999999,
laser_id: 13, min_intensity: 30.0, rot_correction: -0.06716508498014805, vert_correction: -0.03587557613263058,
vert_offset_correction: 0.20399239000000002}
- {dist_correction: 1.5360803, dist_correction_x: 1.5528035, dist_correction_y: 1.5666801000000001,
focal_distance: 8.0, focal_slope: 1.1, horiz_offset_correction: 0.025999999, laser_id: 14,
min_intensity: 20.0, rot_correction: -0.14578889529014513, vert_correction: -0.09893566067472198,
vert_offset_correction: 0.19943586}
- {dist_correction: 1.4755448999999998, dist_correction_x: 1.5032428, dist_correction_y: 1.5326752,
focal_distance: 5.0, focal_slope: 0.89999998, horiz_offset_correction: -0.025999999,
laser_id: 15, min_intensity: 30.0, rot_correction: -0.08892898296002069, vert_correction: -0.09062974348423608,
vert_offset_correction: 0.20003851}
- {dist_correction: 1.4410587000000001, dist_correction_x: 1.4870845, dist_correction_y: 1.4627965,
focal_distance: 18.0, focal_slope: 0.5, horiz_offset_correction: 0.025999999, laser_id: 16,
min_intensity: 40.0, rot_correction: -0.013006177528832626, vert_correction: -0.02770725895504266,
vert_offset_correction: 0.20458033}
- {dist_correction: 1.4434521, dist_correction_x: 1.4897508, dist_correction_y: 1.4791382,
focal_distance: 11.0, focal_slope: 0.80000001, horiz_offset_correction: -0.025999999,
laser_id: 17, min_intensity: 55.0, rot_correction: 0.04596628970548614, vert_correction: -0.02014825541794774,
vert_offset_correction: 0.20512417}
- {dist_correction: 1.3243448000000002, dist_correction_x: 1.3816666000000002, dist_correction_y: 1.3647719,
focal_distance: 12.0, focal_slope: 1.0, horiz_offset_correction: 0.025999999, laser_id: 18,
min_intensity: 10.0, rot_correction: -0.03237303019110658, vert_correction: -0.08210824496987311,
vert_offset_correction: 0.20065581999999998}
- {dist_correction: 1.4565853999999998, dist_correction_x: 1.4340645, dist_correction_y: 1.4550516,
focal_distance: 20.0, focal_slope: 0.69999999, horiz_offset_correction: -0.025999999,
laser_id: 19, min_intensity: 30.0, rot_correction: 0.02431275238487562, vert_correction: -0.0727614640280461,
vert_offset_correction: 0.20133196000000003}
- {dist_correction: 1.3313776, dist_correction_x: 1.3819601000000001, dist_correction_y: 1.3847791,
focal_distance: 5.0, focal_slope: 0.89999998, horiz_offset_correction: 0.025999999,
laser_id: 20, min_intensity: 45.0, rot_correction: 0.10029393174916004, vert_correction: -0.009929893699589059,
vert_offset_correction: 0.20585909000000002}
- {dist_correction: 1.3787535, dist_correction_x: 1.3978789, dist_correction_y: 1.4257806,
focal_distance: 10.0, focal_slope: 1.1, horiz_offset_correction: -0.025999999, laser_id: 21,
min_intensity: 35.0, rot_correction: 0.15867894419560363, vert_correction: -0.0037977317325845416,
vert_offset_correction: 0.20630005}
- {dist_correction: 1.3419412, dist_correction_x: 1.4059189, dist_correction_y: 1.4113303,
focal_distance: 11.0, focal_slope: 1.0, horiz_offset_correction: 0.025999999, laser_id: 22,
min_intensity: 40.0, rot_correction: 0.08044522544540282, vert_correction: -0.06482699129962814,
vert_offset_correction: 0.20190518999999998}
- {dist_correction: 1.4338304, dist_correction_x: 1.4212059, dist_correction_y: 1.4900565000000001,
focal_distance: 11.0, focal_slope: 1.1, horiz_offset_correction: -0.025999999, laser_id: 23,
min_intensity: 55.0, rot_correction: 0.13867708175932542, vert_correction: -0.05566171063737453,
vert_offset_correction: 0.20256662}
- {dist_correction: 1.4930911, dist_correction_x: 1.5572188, dist_correction_y: 1.5182672,
focal_distance: 5.0, focal_slope: 1.0, horiz_offset_correction: 0.025999999, laser_id: 24,
min_intensity: 25.0, rot_correction: -0.12505298227706313, vert_correction: 0.06113007152996804,
vert_offset_correction: 0.21097416}
- {dist_correction: 1.4367653000000002, dist_correction_x: 1.4614236, dist_correction_y: 1.4587589,
focal_distance: 3.0, focal_slope: 1.0, horiz_offset_correction: -0.025999999, laser_id: 25,
min_intensity: 50.0, rot_correction: -0.06814826559971075, vert_correction: 0.06988221181432357,
vert_offset_correction: 0.21160620000000002}
- {dist_correction: 1.5279892000000002, dist_correction_x: 1.5686107999999999, dist_correction_y: 1.55737,
focal_distance: 7.5, focal_slope: 1.0, horiz_offset_correction: 0.025999999, laser_id: 26,
min_intensity: 30.0, rot_correction: -0.14531660046790917, vert_correction: 0.00887576771486082,
vert_offset_correction: 0.20721134}
- {dist_correction: 1.5077638, dist_correction_x: 1.5453738000000001, dist_correction_y: 1.5483368,
focal_distance: 4.0, focal_slope: 0.89999998, horiz_offset_correction: -0.025999999,
laser_id: 27, min_intensity: 30.0, rot_correction: -0.08904354811745085, vert_correction: 0.017050959569839413,
vert_offset_correction: 0.20779928000000003}
- {dist_correction: 1.3627797000000001, dist_correction_x: 1.4232985, dist_correction_y: 1.4116524000000001,
focal_distance: 4.0, focal_slope: 1.0, horiz_offset_correction: 0.025999999, laser_id: 28,
min_intensity: 50.0, rot_correction: -0.012061568860271928, vert_correction: 0.07842048992411524,
vert_offset_correction: 0.21222351}
- {dist_correction: 1.3749608, dist_correction_x: 1.4045798, dist_correction_y: 1.4006630999999998,
focal_distance: 4.0, focal_slope: 1.1, horiz_offset_correction: -0.025999999, laser_id: 29,
min_intensity: 40.0, rot_correction: 0.043892943273872005, vert_correction: 0.08674443287511571,
vert_offset_correction: 0.21282616000000001}
- {dist_correction: 1.2940709000000001, dist_correction_x: 1.392794, dist_correction_y: 1.3225565000000001,
focal_distance: 8.0, focal_slope: 0.89999998, horiz_offset_correction: 0.025999999,
laser_id: 30, min_intensity: 90.0, rot_correction: -0.033068739374902546, vert_correction: 0.02522388232225749,
vert_offset_correction: 0.20838722}
- {dist_correction: 1.3907666, dist_correction_x: 1.4365166, dist_correction_y: 1.4501437000000001,
focal_distance: 9.0, focal_slope: 1.0, horiz_offset_correction: -0.025999999, laser_id: 31,
min_intensity: 5.0, rot_correction: 0.025535290948715324, vert_correction: 0.034414332377654115,
vert_offset_correction: 0.20904865}
- {dist_correction: 1.3461819, dist_correction_x: 1.3678523000000002, dist_correction_y: 1.3552880999999999,
focal_distance: 11.0, focal_slope: 1.5, horiz_offset_correction: 0.025999999, laser_id: 32,
min_intensity: 45.0, rot_correction: -0.13309965698710405, vert_correction: -0.39666389380060213,
vert_offset_correction: 0.10812234999999999}
- {dist_correction: 1.2487466, dist_correction_x: 1.2929747, dist_correction_y: 1.3438803,
focal_distance: 5.0, focal_slope: 0.89999998, horiz_offset_correction: -0.025999999,
laser_id: 33, min_intensity: 35.0, rot_correction: -0.07241159183553281, vert_correction: -0.39021216204755743,
vert_offset_correction: 0.10859233}
- {dist_correction: 1.5016498000000003, dist_correction_x: 1.5384890999999998, dist_correction_y: 1.5506186,
focal_distance: 4.5, focal_slope: 1.0, horiz_offset_correction: 0.025999999, laser_id: 34,
min_intensity: 20.0, rot_correction: 0.08292710807634829, vert_correction: -0.2010672181773803,
vert_offset_correction: 0.12148494}
- {dist_correction: 1.2495708, dist_correction_x: 1.2891127, dist_correction_y: 1.2943669,
focal_distance: 11.0, focal_slope: 1.3, horiz_offset_correction: -0.025999999, laser_id: 35,
min_intensity: 25.0, rot_correction: 0.14006506182829093, vert_correction: -0.19103771853737994,
vert_offset_correction: 0.12213274}
- {dist_correction: 1.2674536, dist_correction_x: 1.3298663, dist_correction_y: 1.3577469,
focal_distance: 6.0, focal_slope: 0.89999998, horiz_offset_correction: 0.025999999,
laser_id: 36, min_intensity: 35.0, rot_correction: -0.012004346320883118, vert_correction: -0.3819670695815035,
vert_offset_correction: 0.10918932}
- {dist_correction: 1.2481956, dist_correction_x: 1.28627, dist_correction_y: 1.29235,
focal_distance: 14.5, focal_slope: 1.5, horiz_offset_correction: -0.025999999, laser_id: 37,
min_intensity: 30.0, rot_correction: 0.04832190474636683, vert_correction: -0.3718940414299584,
vert_offset_correction: 0.10991334}
- {dist_correction: 1.4516722, dist_correction_x: 1.4842308, dist_correction_y: 1.4868384000000001,
focal_distance: 4.0, focal_slope: 1.1, horiz_offset_correction: 0.025999999, laser_id: 38,
min_intensity: 55.0, rot_correction: -0.03583078923869515, vert_correction: -0.4336284663746853,
vert_offset_correction: 0.1053787}
- {dist_correction: 1.3843003999999999, dist_correction_x: 1.4010727, dist_correction_y: 1.4332015999999999,
focal_distance: 6.5, focal_slope: 1.3, horiz_offset_correction: -0.025999999, laser_id: 39,
min_intensity: 40.0, rot_correction: 0.026883486237381612, vert_correction: -0.4261966798867682,
vert_offset_correction: 0.10593759000000001}
- {dist_correction: 1.244738, dist_correction_x: 1.3131859000000001, dist_correction_y: 1.354245,
focal_distance: 6.5, focal_slope: 1.0, horiz_offset_correction: 0.025999999, laser_id: 40,
min_intensity: 25.0, rot_correction: 0.1076316048478218, vert_correction: -0.3640637439139335,
vert_offset_correction: 0.11047223}
- {dist_correction: 1.3284543, dist_correction_x: 1.3295518000000002, dist_correction_y: 1.3809489,
focal_distance: 12.5, focal_slope: 1.7, horiz_offset_correction: -0.025999999, laser_id: 41,
min_intensity: 50.0, rot_correction: 0.1679293847080498, vert_correction: -0.3511493721000192,
vert_offset_correction: 0.11138678}
- {dist_correction: 1.4055542, dist_correction_x: 1.4426663, dist_correction_y: 1.430847,
focal_distance: 1.5, focal_slope: 1.1, horiz_offset_correction: 0.025999999, laser_id: 42,
min_intensity: 10.0, rot_correction: 0.0861156692854385, vert_correction: -0.4163231777753111,
vert_offset_correction: 0.10667431000000001}
- {dist_correction: 1.3529747, dist_correction_x: 1.3834917999999998, dist_correction_y: 1.4029074,
focal_distance: 6.0, focal_slope: 1.2, horiz_offset_correction: -0.025999999, laser_id: 43,
min_intensity: 35.0, rot_correction: 0.15024020221305323, vert_correction: -0.4046365927302973,
vert_offset_correction: 0.10753805}
- {dist_correction: 1.2407380000000001, dist_correction_x: 1.3171521000000002, dist_correction_y: 1.2836400000000001,
focal_distance: 15.0, focal_slope: 1.6, horiz_offset_correction: 0.025999999, laser_id: 44,
max_intensity: 220.0, rot_correction: -0.12998527227122358, vert_correction: -0.28892197890806653,
vert_offset_correction: 0.11568009}
- {dist_correction: 1.5288051999999999, dist_correction_x: 1.5904514, dist_correction_y: 1.6288455,
focal_distance: 10.0, focal_slope: 0.89999998, horiz_offset_correction: -0.025999999,
laser_id: 45, rot_correction: -0.07009281894983248, vert_correction: -0.28120381879648226,
vert_offset_correction: 0.11620087}
- {dist_correction: 1.5423979, dist_correction_x: 1.5919412, dist_correction_y: 1.610177,
focal_distance: 13.0, focal_slope: 1.7, horiz_offset_correction: 0.025999999, laser_id: 46,
rot_correction: -0.1533711640661691, vert_correction: -0.34156398894148127, vert_offset_correction: 0.11205999}
- {dist_correction: 1.3086252999999999, dist_correction_x: 1.3737134, dist_correction_y: 1.4177727,
focal_distance: 5.5, focal_slope: 0.89999998, horiz_offset_correction: -0.025999999,
laser_id: 47, rot_correction: -0.0927890927600715, vert_correction: -0.3348332488542128,
vert_offset_correction: 0.11252997}
- {dist_correction: 1.3405330000000002, dist_correction_x: 1.4512436, dist_correction_y: 1.4471467999999998,
focal_distance: 13.5, focal_slope: 1.0, horiz_offset_correction: 0.025999999, laser_id: 48,
rot_correction: -0.012004348415278218, vert_correction: -0.2738300470529015, vert_offset_correction: 0.11669625}
- {dist_correction: 1.2994545, dist_correction_x: 1.3971343999999999, dist_correction_y: 1.36849,
focal_distance: 14.0, focal_slope: 1.0, horiz_offset_correction: -0.025999999, laser_id: 49,
rot_correction: 0.047471358677980184, vert_correction: -0.2649030020882158, vert_offset_correction: 0.11729325}
- {dist_correction: 1.4499762999999999, dist_correction_x: 1.5111346, dist_correction_y: 1.542395,
focal_distance: 13.0, focal_slope: 1.2, horiz_offset_correction: 0.025999999, laser_id: 50,
rot_correction: -0.03378136079915033, vert_correction: -0.32678797913421975, vert_offset_correction: 0.11308886}
- {dist_correction: 1.3516956, dist_correction_x: 1.4231836999999998, dist_correction_y: 1.4301146,
focal_distance: 13.0, focal_slope: 1.1, horiz_offset_correction: -0.025999999, laser_id: 51,
rot_correction: 0.025334358173250228, vert_correction: -0.3179609589889659, vert_offset_correction: 0.11369856}
- {dist_correction: 1.2374236, dist_correction_x: 1.308008, dist_correction_y: 1.3549429000000002,
focal_distance: 5.0, focal_slope: 0.89999998, horiz_offset_correction: 0.025999999,
laser_id: 52, rot_correction: 0.10481975724981128, vert_correction: -0.25478428121685354,
vert_offset_correction: 0.11796646000000001}
- {dist_correction: 1.3730562000000002, dist_correction_x: 1.403678, dist_correction_y: 1.4347415000000001,
focal_distance: 13.0, focal_slope: 1.4, horiz_offset_correction: -0.025999999, laser_id: 53,
rot_correction: 0.16311715242247551, vert_correction: -0.24576616497179882, vert_offset_correction: 0.11856346000000001}
- {dist_correction: 1.4445888, dist_correction_x: 1.5025624, dist_correction_y: 1.5189749000000001,
focal_distance: 10.0, focal_slope: 1.0, horiz_offset_correction: 0.025999999, laser_id: 54,
rot_correction: 0.08384971878954978, vert_correction: -0.31000962288931516, vert_offset_correction: 0.11424474999999999}
- {dist_correction: 1.3861449, dist_correction_x: 1.4228815000000001, dist_correction_y: 1.4620186000000002,
focal_distance: 15.0, focal_slope: 1.6, horiz_offset_correction: -0.025999999, laser_id: 55,
rot_correction: 0.14374613400834294, vert_correction: -0.2986601307360315, vert_offset_correction: 0.11501958000000001}
- {dist_correction: 1.4635341, dist_correction_x: 1.5232283000000002, dist_correction_y: 1.5063837000000002,
focal_distance: 13.0, focal_slope: 1.3, horiz_offset_correction: 0.025999999, laser_id: 56,
rot_correction: -0.12741928396895377, vert_correction: -0.18393445537456576, vert_offset_correction: 0.12259002000000001}
- {dist_correction: 1.3715826000000002, dist_correction_x: 1.4186972, dist_correction_y: 1.4328435,
focal_distance: 3.5, focal_slope: 1.0, horiz_offset_correction: -0.025999999, laser_id: 57,
rot_correction: -0.06853129555735342, vert_correction: -0.1744342722087932, vert_offset_correction: 0.12319972}
- {dist_correction: 1.4644831999999999, dist_correction_x: 1.5095984000000002, dist_correction_y: 1.5149265,
focal_distance: 11.0, focal_slope: 1.4, horiz_offset_correction: 0.025999999, laser_id: 58,
rot_correction: -0.1497316045423758, vert_correction: -0.23400086557751998, vert_offset_correction: 0.11933828}
- {dist_correction: 1.3074548, dist_correction_x: 1.3521214000000001, dist_correction_y: 1.3830151000000002,
focal_distance: 5.0, focal_slope: 0.89999998, horiz_offset_correction: -0.025999999,
laser_id: 59, rot_correction: -0.08973572126418226, vert_correction: -0.22644383426247983,
vert_offset_correction: 0.11983367}
- {dist_correction: 1.4378391, dist_correction_x: 1.4799687000000001, dist_correction_y: 1.4889211,
focal_distance: 5.0, focal_slope: 1.1, horiz_offset_correction: 0.025999999, laser_id: 60,
rot_correction: -0.011751946229237658, vert_correction: -0.1678843098347878, vert_offset_correction: 0.12361888}
- {dist_correction: 1.3585466, dist_correction_x: 1.4135242, dist_correction_y: 1.4170488,
focal_distance: 2.0, focal_slope: 0.89999998, horiz_offset_correction: -0.025999999,
laser_id: 61, rot_correction: 0.04489272721060892, vert_correction: -0.158331168143522,
vert_offset_correction: 0.12422858}
- {dist_correction: 1.4478067, dist_correction_x: 1.5442529, dist_correction_y: 1.5512207,
focal_distance: 10.0, focal_slope: 1.0, horiz_offset_correction: 0.025999999, laser_id: 62,
rot_correction: -0.0340408982402389, vert_correction: -0.21671681763514258, vert_offset_correction: 0.12046877}
- {dist_correction: 1.4329738, dist_correction_x: 1.4817114, dist_correction_y: 1.4954124,
focal_distance: 9.0, focal_slope: 0.80000001, horiz_offset_correction: -0.025999999,
laser_id: 63, rot_correction: 0.024857907722065305, vert_correction: -0.2106649408137298,
vert_offset_correction: 0.12086253}
num_lasers: 64
distance_resolution: 0.002
@@ -0,0 +1,227 @@
lasers:
- {dist_correction: 1.4139490000000001, dist_correction_x: 1.4198446999999998, dist_correction_y: 1.4058145,
focal_distance: 10.5, focal_slope: 1.85, horiz_offset_correction: 0.025999999, laser_id: 0,
min_intensity: 5, rot_correction: -0.07648247457737148, vert_correction: -0.1261818455292898,
vert_offset_correction: 0.21569468}
- {dist_correction: 1.5094685, dist_correction_x: 1.5403023, dist_correction_y: 1.5012577999999999,
focal_distance: 15.0, focal_slope: 1.2, horiz_offset_correction: -0.025999999, laser_id: 1,
min_intensity: 10, rot_correction: -0.03932070772308096, vert_correction: -0.11953745909742221,
vert_offset_correction: 0.21520962000000002}
- {dist_correction: 1.4579400999999999, dist_correction_x: 1.4846666, dist_correction_y: 1.4228239,
focal_distance: 24.0, focal_slope: 1.05, horiz_offset_correction: 0.025999999, laser_id: 2,
min_intensity: 30, rot_correction: 0.06005350008746038, vert_correction: 0.00356118725906175,
vert_offset_correction: 0.20631704}
- {dist_correction: 1.5046124, dist_correction_x: 1.5335535999999999, dist_correction_y: 1.5401996,
focal_distance: 14.5, focal_slope: 1.7, horiz_offset_correction: -0.025999999, laser_id: 3,
min_intensity: 10, rot_correction: 0.09919490315516696, vert_correction: 0.010306535403103584,
vert_offset_correction: 0.20583200000000001}
- {dist_correction: 1.4370993, dist_correction_x: 1.4714845, dist_correction_y: 1.4524646,
focal_distance: 15.0, focal_slope: 0.40000001, horiz_offset_correction: 0.025999999,
laser_id: 4, min_intensity: 30, rot_correction: -0.00095355016485159, vert_correction: -0.1144967440141401,
vert_offset_correction: 0.21484217000000003}
- {dist_correction: 1.3536626999999999, dist_correction_x: 1.3909094, dist_correction_y: 1.3700326999999999,
focal_distance: 17.0, focal_slope: 1.45, horiz_offset_correction: -0.025999999,
laser_id: 5, min_intensity: 30, rot_correction: 0.03824387099052699, vert_correction: -0.10803612329921503,
vert_offset_correction: 0.21437181}
- {dist_correction: 1.4117873, dist_correction_x: 1.4350795, dist_correction_y: 1.3829624999999999,
focal_distance: 10.5, focal_slope: 1.0, horiz_offset_correction: 0.025999999, laser_id: 6,
min_intensity: 10, rot_correction: -0.015297255529962315, vert_correction: -0.14944538101702426,
vert_offset_correction: 0.21739968999999998}
- {dist_correction: 1.4269646, dist_correction_x: 1.451161, dist_correction_y: 1.4328421,
focal_distance: 14.0, focal_slope: 1.3, horiz_offset_correction: -0.025999999, laser_id: 7,
min_intensity: 10, rot_correction: 0.024255809272700053, vert_correction: -0.14344353231329066,
vert_offset_correction: 0.21695873}
- {dist_correction: 1.3808284000000002, dist_correction_x: 1.421472, dist_correction_y: 1.3838283000000002,
focal_distance: 15.0, focal_slope: 0.94999999, horiz_offset_correction: 0.025999999,
laser_id: 8, min_intensity: 30, rot_correction: 0.07354442571180776, vert_correction: -0.10278016723125998,
vert_offset_correction: 0.21398966000000003}
- {dist_correction: 1.3644336000000001, dist_correction_x: 1.3931616, dist_correction_y: 1.3852122,
focal_distance: 12.5, focal_slope: 1.95, horiz_offset_correction: -0.025999999,
laser_id: 9, min_intensity: 10, rot_correction: 0.11317857886058363, vert_correction: -0.09569590023202451,
vert_offset_correction: 0.21347521}
- {dist_correction: 1.4102663000000002, dist_correction_x: 1.4163402, dist_correction_y: 1.3592377,
focal_distance: 12.5, focal_slope: 1.95, horiz_offset_correction: 0.025999999, laser_id: 10,
min_intensity: 10, rot_correction: 0.05954228616823424, vert_correction: -0.1386345201601863,
vert_offset_correction: 0.21660597}
- {dist_correction: 1.5019737000000002, dist_correction_x: 1.532475, dist_correction_y: 1.5237663000000001,
focal_distance: 13.0, focal_slope: 1.9, horiz_offset_correction: -0.025999999, laser_id: 11,
min_intensity: 10, rot_correction: 0.09906092120980835, vert_correction: -0.13181073657049397,
vert_offset_correction: 0.21610622}
- {dist_correction: 1.4399905000000002, dist_correction_x: 1.4887962, dist_correction_y: 1.4455237,
focal_distance: 14.5, focal_slope: 1.7, horiz_offset_correction: 0.025999999, laser_id: 12,
max_intensity: 235, rot_correction: -0.07574798243226695, vert_correction: -0.054438932963427306,
vert_offset_correction: 0.21049141}
- {dist_correction: 1.5207593, dist_correction_x: 1.5401453, dist_correction_y: 1.5190082,
focal_distance: 20.5, focal_slope: 1.25, horiz_offset_correction: -0.025999999,
laser_id: 13, max_intensity: 240, rot_correction: -0.037047761947550245, vert_correction: -0.048730533448148504,
vert_offset_correction: 0.21007986}
- {dist_correction: 1.4746239, dist_correction_x: 1.5300989999999999, dist_correction_y: 1.4663734,
focal_distance: 12.5, focal_slope: 1.9, horiz_offset_correction: 0.025999999, laser_id: 14,
max_intensity: 245, rot_correction: -0.0895955468906376, vert_correction: -0.08961595328025192,
vert_offset_correction: 0.21303425}
- {dist_correction: 1.4697629, dist_correction_x: 1.5051735, dist_correction_y: 1.4558601,
focal_distance: 19.5, focal_slope: 0.94999999, horiz_offset_correction: -0.025999999,
laser_id: 15, max_intensity: 245, rot_correction: -0.05072966149865084, vert_correction: -0.0839353306800186,
vert_offset_correction: 0.21262267999999998}
- {dist_correction: 1.4143376, dist_correction_x: 1.4432597000000003, dist_correction_y: 1.4038483,
focal_distance: 24.0, focal_slope: 0.69999999, horiz_offset_correction: 0.025999999,
laser_id: 16, max_intensity: 245, rot_correction: -0.001864320564407547, vert_correction: -0.043427018903405855,
vert_offset_correction: 0.20969770000000001}
- {dist_correction: 1.4815961, dist_correction_x: 1.5173615, dist_correction_y: 1.4871606,
focal_distance: 14.5, focal_slope: 1.65, horiz_offset_correction: -0.025999999,
laser_id: 17, rot_correction: 0.03747852840556422, vert_correction: -0.03648801216715539,
vert_offset_correction: 0.20919794}
- {dist_correction: 1.420331, dist_correction_x: 1.4755219, dist_correction_y: 1.3919118000000001,
focal_distance: 17.5, focal_slope: 1.4, horiz_offset_correction: 0.025999999, laser_id: 18,
rot_correction: -0.015194972429011364, vert_correction: -0.07906187922560139, vert_offset_correction: 0.21226994000000002}
- {dist_correction: 1.4900717, dist_correction_x: 1.5143349000000002, dist_correction_y: 1.4829907,
focal_distance: 24.0, focal_slope: 1.25, horiz_offset_correction: -0.025999999,
laser_id: 19, rot_correction: 0.02391977928648433, vert_correction: -0.07255814015150577,
vert_offset_correction: 0.21179958}
- {dist_correction: 1.4823865, dist_correction_x: 1.5357741999999999, dist_correction_y: 1.4956403,
focal_distance: 24.0, focal_slope: 1.1, horiz_offset_correction: 0.025999999, laser_id: 20,
rot_correction: 0.07264374331532833, vert_correction: -0.031587736747464255, vert_offset_correction: 0.20884519999999998}
- {dist_correction: 1.5553201, dist_correction_x: 1.5698593, dist_correction_y: 1.5624425,
focal_distance: 15.5, focal_slope: 1.55, horiz_offset_correction: -0.025999999,
laser_id: 21, rot_correction: 0.11143265968730214, vert_correction: -0.025460288914769372,
vert_offset_correction: 0.20840424}
- {dist_correction: 1.4437845999999999, dist_correction_x: 1.4909378000000002, dist_correction_y: 1.4347861,
focal_distance: 20.5, focal_slope: 1.2, horiz_offset_correction: 0.025999999, laser_id: 22,
rot_correction: 0.05942554283989759, vert_correction: -0.06665878416276627, vert_offset_correction: 0.21137333000000003}
- {dist_correction: 1.4939513, dist_correction_x: 1.5194868, dist_correction_y: 1.5106346,
focal_distance: 14.5, focal_slope: 1.65, horiz_offset_correction: -0.025999999,
laser_id: 23, rot_correction: 0.09797042203986979, vert_correction: -0.06055112836378901,
vert_offset_correction: 0.21093236999999998}
- {dist_correction: 1.4521244999999998, dist_correction_x: 1.4884882, dist_correction_y: 1.4649333,
focal_distance: 11.5, focal_slope: 2.0, horiz_offset_correction: 0.025999999, laser_id: 24,
rot_correction: -0.07658879305408597, vert_correction: 0.015620435355027301, vert_offset_correction: 0.20544985000000002}
- {dist_correction: 1.5351622, dist_correction_x: 1.524973, dist_correction_y: 1.5029565,
focal_distance: 18.5, focal_slope: 1.25, horiz_offset_correction: -0.025999999,
laser_id: 25, rot_correction: -0.0379098725675606, vert_correction: 0.022567997346205196,
vert_offset_correction: 0.20495010000000002}
- {dist_correction: 1.5321327, dist_correction_x: 1.5833431999999998, dist_correction_y: 1.5359726,
focal_distance: 13.0, focal_slope: 1.9, horiz_offset_correction: 0.025999999, laser_id: 26,
rot_correction: -0.0904730670226138, vert_correction: -0.019943931467746017, vert_offset_correction: 0.20800737000000002}
- {dist_correction: 1.5166023000000002, dist_correction_x: 1.4874829, dist_correction_y: 1.4625635,
focal_distance: 21.5, focal_slope: 1.1, horiz_offset_correction: -0.025999999, laser_id: 27,
rot_correction: -0.051308328902808065, vert_correction: -0.013200099491225388, vert_offset_correction: 0.20752234000000003}
- {dist_correction: 1.4549194, dist_correction_x: 1.4688664, dist_correction_y: 1.4194371000000001,
focal_distance: 13.5, focal_slope: 1.83, horiz_offset_correction: 0.025999999, laser_id: 28,
rot_correction: -0.0019143155208309244, vert_correction: 0.027266617424120905, vert_offset_correction: 0.20461203000000003}
- {dist_correction: 1.5617532, dist_correction_x: 1.5887217999999999, dist_correction_y: 1.5643922000000001,
focal_distance: 18.5, focal_slope: 1.35, horiz_offset_correction: -0.025999999,
laser_id: 29, rot_correction: 0.03681404490741569, vert_correction: 0.03421014630846329,
vert_offset_correction: 0.20411228}
- {dist_correction: 1.5132924, dist_correction_x: 1.5661812000000002, dist_correction_y: 1.5102689,
focal_distance: 18.5, focal_slope: 1.35, horiz_offset_correction: 0.025999999, laser_id: 30,
rot_correction: -0.015542064486559148, vert_correction: -0.007885903531460533, vert_offset_correction: 0.20714018}
- {dist_correction: 1.5638524, dist_correction_x: 1.5621136000000002, dist_correction_y: 1.5383017,
focal_distance: 21.5, focal_slope: 1.15, horiz_offset_correction: -0.025999999,
laser_id: 31, rot_correction: 0.023284423588222334, vert_correction: -0.0015491891506552067,
vert_offset_correction: 0.20668451000000002}
- {dist_correction: 1.3077792, dist_correction_x: 1.3433452, dist_correction_y: 1.2840973,
focal_distance: 10.5, focal_slope: 2.0, horiz_offset_correction: 0.025999999, laser_id: 32,
rot_correction: -0.1278634161583795, vert_correction: -0.39021216204755743, vert_offset_correction: 0.15970787}
- {dist_correction: 1.4303885, dist_correction_x: 1.4429931999999999, dist_correction_y: 1.4607234,
focal_distance: 0.25, focal_slope: 1.0, horiz_offset_correction: -0.025999999, laser_id: 33,
rot_correction: -0.066528586091226, vert_correction: -0.38355018793281753, vert_offset_correction: 0.15922519}
- {dist_correction: 1.3746819, dist_correction_x: 1.3873923, dist_correction_y: 1.4089924999999999,
focal_distance: 0.25, focal_slope: 1.0, horiz_offset_correction: 0.025999999, laser_id: 34,
rot_correction: 0.08854290740283328, vert_correction: -0.197138848550284, vert_offset_correction: 0.14656122}
- {dist_correction: 1.3814778, dist_correction_x: 1.3932765, dist_correction_y: 1.4301869,
focal_distance: 11.0, focal_slope: 2.0, horiz_offset_correction: -0.025999999, laser_id: 35,
rot_correction: 0.14547956884148489, vert_correction: -0.18768579625563228, vert_offset_correction: 0.14595152}
- {dist_correction: 1.4313307, dist_correction_x: 1.4734517, dist_correction_y: 1.4390849000000001,
focal_distance: 9.5, focal_slope: 1.85, horiz_offset_correction: 0.025999999, laser_id: 36,
rot_correction: -0.005071588212420635, vert_correction: -0.3750836655445631, vert_offset_correction: 0.15861549}
- {dist_correction: 1.3414835, dist_correction_x: 1.3820609, dist_correction_y: 1.355589,
focal_distance: 9.5, focal_slope: 1.4, horiz_offset_correction: -0.025999999, laser_id: 37,
rot_correction: 0.05427589303135225, vert_correction: -0.36762882325722723, vert_offset_correction: 0.15808201}
- {dist_correction: 1.4895827, dist_correction_x: 1.5283238000000001, dist_correction_y: 1.4803529,
focal_distance: 9.0, focal_slope: 1.65, horiz_offset_correction: 0.025999999, laser_id: 38,
rot_correction: -0.028143856558087547, vert_correction: -0.4285668719175616, vert_offset_correction: 0.16254044}
- {dist_correction: 1.3727733000000002, dist_correction_x: 1.3623596, dist_correction_y: 1.392661,
focal_distance: 0.25, focal_slope: 1.15, horiz_offset_correction: -0.025999999,
laser_id: 39, rot_correction: 0.03172272051181349, vert_correction: -0.4214410765541042,
vert_offset_correction: 0.16200695}
- {dist_correction: 1.4348983999999998, dist_correction_x: 1.4775407000000003, dist_correction_y: 1.4712174999999998,
focal_distance: 0.25, focal_slope: 0.92000002, horiz_offset_correction: 0.025999999,
laser_id: 40, rot_correction: 0.11411698480351568, vert_correction: -0.3565455112681652,
vert_offset_correction: 0.15729448}
- {dist_correction: 1.335618, dist_correction_x: 1.3519691, dist_correction_y: 1.3315152000000001,
focal_distance: 11.200000000000001, focal_slope: 2.0, horiz_offset_correction: -0.025999999,
laser_id: 41, rot_correction: 0.1735498527902839, vert_correction: -0.34717860842539194,
vert_offset_correction: 0.15663397}
- {dist_correction: 1.4905824, dist_correction_x: 1.488313, dist_correction_y: 1.4948479000000001,
focal_distance: 0.25, focal_slope: 1.1, horiz_offset_correction: 0.025999999, laser_id: 42,
rot_correction: 0.09564756333839054, vert_correction: -0.4110102035460227, vert_offset_correction: 0.16123213}
- {dist_correction: 1.3288423, dist_correction_x: 1.3409723, dist_correction_y: 1.3440451,
focal_distance: 10.0, focal_slope: 1.95, horiz_offset_correction: -0.025999999,
laser_id: 43, rot_correction: 0.15538288292189534, vert_correction: -0.40083030888437793,
vert_offset_correction: 0.16048269}
- {dist_correction: 1.3771290999999999, dist_correction_x: 1.3773239000000002, dist_correction_y: 1.3497290000000002,
focal_distance: 11.5, focal_slope: 2.0, horiz_offset_correction: 0.025999999, laser_id: 44,
rot_correction: -0.12413605610123538, vert_correction: -0.2840315837972709, vert_offset_correction: 0.15228986}
- {dist_correction: 1.3367807, dist_correction_x: 1.370152, dist_correction_y: 1.370934,
focal_distance: 0.25, focal_slope: 0.44999999, horiz_offset_correction: -0.025999999,
laser_id: 45, rot_correction: -0.06413447432303407, vert_correction: -0.27761533458791926,
vert_offset_correction: 0.15185799}
- {dist_correction: 1.4788651, dist_correction_x: 1.5014308, dist_correction_y: 1.4727454,
focal_distance: 11.5, focal_slope: 2.0, horiz_offset_correction: 0.025999999, laser_id: 46,
rot_correction: -0.14872602785785152, vert_correction: -0.3359268721635124, vert_offset_correction: 0.15584644}
- {dist_correction: 1.3220766000000002, dist_correction_x: 1.3654865, dist_correction_y: 1.3739757000000001,
focal_distance: 0.25, focal_slope: 0.94999999, horiz_offset_correction: -0.025999999,
laser_id: 47, rot_correction: -0.08707280959256145, vert_correction: -0.33026751989087316,
vert_offset_correction: 0.15545268}
- {dist_correction: 1.4612433999999999, dist_correction_x: 1.5250436, dist_correction_y: 1.4817635999999998,
focal_distance: 13.0, focal_slope: 1.0, horiz_offset_correction: 0.025999999, laser_id: 48,
rot_correction: -0.006799911150716457, vert_correction: -0.26851710773019805, vert_offset_correction: 0.15124829}
- {dist_correction: 1.3407353000000002, dist_correction_x: 1.3478844, dist_correction_y: 1.3154279,
focal_distance: 13.5, focal_slope: 1.8, horiz_offset_correction: -0.025999999, laser_id: 49,
rot_correction: 0.05242808851765633, vert_correction: -0.26051854302098837, vert_offset_correction: 0.1507148}
- {dist_correction: 1.3465115, dist_correction_x: 1.3874431999999999, dist_correction_y: 1.3508052000000002,
focal_distance: 12.0, focal_slope: 1.85, horiz_offset_correction: 0.025999999, laser_id: 50,
rot_correction: -0.028383715411859876, vert_correction: -0.3216451745070007, vert_offset_correction: 0.15485568000000002}
- {dist_correction: 1.3629696999999998, dist_correction_x: 1.4037315000000001, dist_correction_y: 1.3869237,
focal_distance: 12.0, focal_slope: 1.1, horiz_offset_correction: -0.025999999, laser_id: 51,
rot_correction: 0.031843273893907245, vert_correction: -0.3135280670349956, vert_offset_correction: 0.15429679000000002}
- {dist_correction: 1.4472754, dist_correction_x: 1.4817390000000001, dist_correction_y: 1.4782272,
focal_distance: 2.0, focal_slope: 1.0, horiz_offset_correction: 0.025999999, laser_id: 52,
rot_correction: 0.10955275158734502, vert_correction: -0.24941678290173272, vert_offset_correction: 0.14997807999999999}
- {dist_correction: 1.3800671, dist_correction_x: 1.3796414, dist_correction_y: 1.3943782,
focal_distance: 11.200000000000001, focal_slope: 2.0, horiz_offset_correction: -0.025999999,
laser_id: 53, rot_correction: 0.16876716543828738, vert_correction: -0.2409525119882134,
vert_offset_correction: 0.14941919}
- {dist_correction: 1.5190169, dist_correction_x: 1.5619051, dist_correction_y: 1.5511705,
focal_distance: 2.5, focal_slope: 1.05, horiz_offset_correction: 0.025999999, laser_id: 54,
rot_correction: 0.09037283276367176, vert_correction: -0.30313513748485243, vert_offset_correction: 0.15358547}
- {dist_correction: 1.3803656000000002, dist_correction_x: 1.3960698, dist_correction_y: 1.386106,
focal_distance: 12.5, focal_slope: 1.9, horiz_offset_correction: -0.025999999, laser_id: 55,
rot_correction: 0.14871534295217081, vert_correction: -0.29323634555253386, vert_offset_correction: 0.15291226}
- {dist_correction: 1.5827696, dist_correction_x: 1.6050609, dist_correction_y: 1.5844797,
focal_distance: 10.0, focal_slope: 1.95, horiz_offset_correction: 0.025999999, laser_id: 56,
rot_correction: -0.12100867217308608, vert_correction: -0.17760463486977288, vert_offset_correction: 0.14530372}
- {dist_correction: 1.3843919, dist_correction_x: 1.3915251000000002, dist_correction_y: 1.4156927,
focal_distance: 0.25, focal_slope: 0.94999999, horiz_offset_correction: -0.025999999,
laser_id: 57, rot_correction: -0.06431965899265843, vert_correction: -0.17006926832673774,
vert_offset_correction: 0.14482104}
- {dist_correction: 1.5491273, dist_correction_x: 1.5298964000000002, dist_correction_y: 1.5107637,
focal_distance: 11.5, focal_slope: 2.0, horiz_offset_correction: 0.025999999, laser_id: 58,
rot_correction: -0.14486168214370612, vert_correction: -0.22974121500510264, vert_offset_correction: 0.14868247}
- {dist_correction: 1.3646004, dist_correction_x: 1.3803583000000001, dist_correction_y: 1.4061511,
focal_distance: 0.25, focal_slope: 1.0, horiz_offset_correction: -0.025999999, laser_id: 59,
rot_correction: -0.0852480451703211, vert_correction: -0.22391891879349718, vert_offset_correction: 0.14830141}
- {dist_correction: 1.5239935, dist_correction_x: 1.560786, dist_correction_y: 1.5632524,
focal_distance: 5.0, focal_slope: 1.15, horiz_offset_correction: 0.025999999, laser_id: 60,
rot_correction: -0.005967226432828876, vert_correction: -0.16231529056824404, vert_offset_correction: 0.14432566}
- {dist_correction: 1.4112029000000001, dist_correction_x: 1.4223886, dist_correction_y: 1.4542918,
focal_distance: 2.5, focal_slope: 1.05, horiz_offset_correction: -0.025999999, laser_id: 61,
rot_correction: 0.050600613599087636, vert_correction: -0.15314424682880032, vert_offset_correction: 0.14374136}
- {dist_correction: 1.5013637, dist_correction_x: 1.5208610999999999, dist_correction_y: 1.5006433000000001,
focal_distance: 16.5, focal_slope: 1.25, horiz_offset_correction: 0.025999999, laser_id: 62,
rot_correction: -0.027436902217920986, vert_correction: -0.21457119711920336, vert_offset_correction: 0.14769171}
- {dist_correction: 1.4423058, dist_correction_x: 1.4454633000000001, dist_correction_y: 1.4321198000000002,
focal_distance: 9.0, focal_slope: 1.45, horiz_offset_correction: -0.025999999, laser_id: 63,
rot_correction: 0.0290479702718764, vert_correction: -0.2079266762969834, vert_offset_correction: 0.14725984}
num_lasers: 64
distance_resolution: 0.002
@@ -0,0 +1,259 @@
# University of Texas HDL-64E calibration parameters
lasers:
- {dist_correction: 0.100000001490116, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 0, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0698131695389748, two_pt_correction_available: false, vert_correction: -0.124932751059532,
vert_offset_correction: 0}
- {dist_correction: 0.280000001192093, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 1, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0392699092626572, two_pt_correction_available: false, vert_correction: -0.118993431329727,
vert_offset_correction: 0}
- {dist_correction: 0.319999992847443, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 2, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0698131695389748, two_pt_correction_available: false, vert_correction: 0.0055470340885222,
vert_offset_correction: 0}
- {dist_correction: 0.230000004172325, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 3, max_intensity: 255, min_intensity: 0,
rot_correction: 0.104719758033752, two_pt_correction_available: false, vert_correction: 0.0114863449707627,
vert_offset_correction: 0}
- {dist_correction: 0.0700000002980232, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 4, max_intensity: 255, min_intensity: 0,
rot_correction: 0.013962633907795, two_pt_correction_available: false, vert_correction: -0.113056324422359,
vert_offset_correction: 0}
- {dist_correction: 0.0900000035762787, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 5, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0392699092626572, two_pt_correction_available: false, vert_correction: -0.107121199369431,
vert_offset_correction: 0}
- {dist_correction: 0.119999997317791, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 6, max_intensity: 255, min_intensity: 0,
rot_correction: 0, two_pt_correction_available: false, vert_correction: -0.148716226220131,
vert_offset_correction: 0}
- {dist_correction: 0.200000002980232, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 7, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0226892791688442, two_pt_correction_available: false, vert_correction: -0.142765983939171,
vert_offset_correction: 0}
- {dist_correction: 0.129999995231628, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 8, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0820304751396179, two_pt_correction_available: false, vert_correction: -0.101187855005264,
vert_offset_correction: 0}
- {dist_correction: 0.159999996423721, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 9, max_intensity: 255, min_intensity: 0,
rot_correction: 0.113446399569511, two_pt_correction_available: false, vert_correction: -0.0952560678124428,
vert_offset_correction: 0}
- {dist_correction: 0.159999996423721, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 10, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0698131695389748, two_pt_correction_available: false, vert_correction: -0.136818811297417,
vert_offset_correction: 0}
- {dist_correction: 0.159999996423721, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 11, max_intensity: 255, min_intensity: 0,
rot_correction: 0.104719758033752, two_pt_correction_available: false, vert_correction: -0.130874469876289,
vert_offset_correction: 0}
- {dist_correction: 0.129999995231628, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 12, max_intensity: 255, min_intensity: 0,
rot_correction: -0.068067841231823, two_pt_correction_available: false, vert_correction: -0.05375986546278,
vert_offset_correction: 0}
- {dist_correction: 0.200000002980232, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 13, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0349065847694874, two_pt_correction_available: false, vert_correction: -0.0478330813348293,
vert_offset_correction: 0}
- {dist_correction: 0.170000001788139, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 14, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0837758108973503, two_pt_correction_available: false, vert_correction: -0.0893256440758705,
vert_offset_correction: 0}
- {dist_correction: 0.239999994635582, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 15, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0479965545237064, two_pt_correction_available: false, vert_correction: -0.0833963677287102,
vert_offset_correction: 0}
- {dist_correction: 0.180000007152557, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 16, max_intensity: 255, min_intensity: 0,
rot_correction: 0.00872664619237185, two_pt_correction_available: false, vert_correction: -0.0419059917330742,
vert_offset_correction: 0}
- {dist_correction: 0.0599999986588955, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 17, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0392699092626572, two_pt_correction_available: false, vert_correction: -0.035978376865387,
vert_offset_correction: 0}
- {dist_correction: 0.140000000596046, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 18, max_intensity: 255, min_intensity: 0,
rot_correction: 0, two_pt_correction_available: false, vert_correction: -0.0774680152535439,
vert_offset_correction: 0}
- {dist_correction: 0.150000005960464, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 19, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0305432621389627, two_pt_correction_available: false, vert_correction: -0.0715404152870178,
vert_offset_correction: 0}
- {dist_correction: 0.219999998807907, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 20, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0855211317539215, two_pt_correction_available: false, vert_correction: -0.0300500374287367,
vert_offset_correction: 0}
- {dist_correction: 0.140000000596046, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 21, max_intensity: 255, min_intensity: 0,
rot_correction: 0.109083078801632, two_pt_correction_available: false, vert_correction: -0.024120757356286,
vert_offset_correction: 0}
- {dist_correction: 0.0799999982118607, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 22, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0698131695389748, two_pt_correction_available: false, vert_correction: -0.0656133219599724,
vert_offset_correction: 0}
- {dist_correction: 0.159999996423721, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 23, max_intensity: 255, min_intensity: 0,
rot_correction: 0.104719758033752, two_pt_correction_available: false, vert_correction: -0.0596865378320217,
vert_offset_correction: 0}
- {dist_correction: 0.119999997317791, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 24, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0610865242779255, two_pt_correction_available: false, vert_correction: 0.0174280721694231,
vert_offset_correction: 0}
- {dist_correction: 0.219999998807907, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 25, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0349065847694874, two_pt_correction_available: false, vert_correction: 0.0233724191784859,
vert_offset_correction: 0}
- {dist_correction: 0.159999996423721, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 26, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0785398185253143, two_pt_correction_available: false, vert_correction: -0.0181903336197138,
vert_offset_correction: 0}
- {dist_correction: 0.259999990463257, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 27, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0471238903701305, two_pt_correction_available: false, vert_correction: -0.0122585473582149,
vert_offset_correction: 0}
- {dist_correction: 0.140000000596046, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 28, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0104719763621688, two_pt_correction_available: false, vert_correction: 0.0293195936828852,
vert_offset_correction: 0}
- {dist_correction: 0.219999998807907, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 29, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0349065847694874, two_pt_correction_available: false, vert_correction: 0.0352698266506195,
vert_offset_correction: 0}
- {dist_correction: 0.209999993443489, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 30, max_intensity: 255, min_intensity: 0,
rot_correction: -0.00436332309618592, two_pt_correction_available: false, vert_correction: -0.00632520206272602,
vert_offset_correction: 0}
- {dist_correction: 0.140000000596046, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 31, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0296705979853868, two_pt_correction_available: false, vert_correction: -0.000390077300835401,
vert_offset_correction: 0}
- {dist_correction: 0.119999997317791, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 32, max_intensity: 255, min_intensity: 0,
rot_correction: -0.122173048555851, two_pt_correction_available: false, vert_correction: -0.396850973367691,
vert_offset_correction: 0}
- {dist_correction: 0.0199999995529652, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 33, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0610865242779255, two_pt_correction_available: false, vert_correction: -0.387918144464493,
vert_offset_correction: 0}
- {dist_correction: 0.100000001490116, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 34, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0959931090474129, two_pt_correction_available: false, vert_correction: -0.200955957174301,
vert_offset_correction: 0}
- {dist_correction: 0.230000004172325, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 35, max_intensity: 255, min_intensity: 0,
rot_correction: 0.148352980613708, two_pt_correction_available: false, vert_correction: -0.192023113369942,
vert_offset_correction: 0}
- {dist_correction: 0.170000001788139, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 36, max_intensity: 255, min_intensity: 0,
rot_correction: -0.00872664619237185, two_pt_correction_available: false, vert_correction: -0.378992766141891,
vert_offset_correction: 0}
- {dist_correction: 0.150000005960464, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 37, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0610865242779255, two_pt_correction_available: false, vert_correction: -0.370074152946472,
vert_offset_correction: 0}
- {dist_correction: 0.0500000007450581, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 38, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0174532923847437, two_pt_correction_available: false, vert_correction: -0.43128889799118,
vert_offset_correction: 0}
- {dist_correction: 0.270000010728836, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 39, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0349065847694874, two_pt_correction_available: false, vert_correction: -0.423701733350754,
vert_offset_correction: 0}
- {dist_correction: 0.180000007152557, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 40, max_intensity: 255, min_intensity: 0,
rot_correction: 0.122173048555851, two_pt_correction_available: false, vert_correction: -0.361161530017853,
vert_offset_correction: 0}
- {dist_correction: 0.189999997615814, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 41, max_intensity: 255, min_intensity: 0,
rot_correction: 0.174532920122147, two_pt_correction_available: false, vert_correction: -0.352254241704941,
vert_offset_correction: 0}
- {dist_correction: 0.100000001490116, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 42, max_intensity: 255, min_intensity: 0,
rot_correction: 0.104719758033752, two_pt_correction_available: false, vert_correction: -0.414742022752762,
vert_offset_correction: 0}
- {dist_correction: 0.200000002980232, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 43, max_intensity: 255, min_intensity: 0,
rot_correction: 0.165806278586388, two_pt_correction_available: false, vert_correction: -0.405792057514191,
vert_offset_correction: 0}
- {dist_correction: 0.219999998807907, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 44, max_intensity: 255, min_intensity: 0,
rot_correction: -0.113446399569511, two_pt_correction_available: false, vert_correction: -0.28999200463295,
vert_offset_correction: 0}
- {dist_correction: 0.200000002980232, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 45, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0567231997847557, two_pt_correction_available: false, vert_correction: -0.281101644039154,
vert_offset_correction: 0}
- {dist_correction: 0.150000005960464, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 46, max_intensity: 255, min_intensity: 0,
rot_correction: -0.13962633907795, two_pt_correction_available: false, vert_correction: -0.343351542949677,
vert_offset_correction: 0}
- {dist_correction: 0.219999998807907, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 47, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0872664600610733, two_pt_correction_available: false, vert_correction: -0.334452718496323,
vert_offset_correction: 0}
- {dist_correction: 0.0599999986588955, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 48, max_intensity: 255, min_intensity: 0,
rot_correction: 0, two_pt_correction_available: false, vert_correction: -0.272210210561752,
vert_offset_correction: 0}
- {dist_correction: 0.129999995231628, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 49, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0558505356311798, two_pt_correction_available: false, vert_correction: -0.26331701874733,
vert_offset_correction: 0}
- {dist_correction: 0.00999999977648258, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 50, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0174532923847437, two_pt_correction_available: false, vert_correction: -0.323895305395126,
vert_offset_correction: 0}
- {dist_correction: 0.150000005960464, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 51, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0349065847694874, two_pt_correction_available: false, vert_correction: -0.316663861274719,
vert_offset_correction: 0}
- {dist_correction: 0.200000002980232, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 52, max_intensity: 255, min_intensity: 0,
rot_correction: 0.122173048555851, two_pt_correction_available: false, vert_correction: -0.254421383142471,
vert_offset_correction: 0}
- {dist_correction: 0.239999994635582, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 53, max_intensity: 255, min_intensity: 0,
rot_correction: 0.165806278586388, two_pt_correction_available: false, vert_correction: -0.245522528886795,
vert_offset_correction: 0}
- {dist_correction: 0.180000007152557, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 54, max_intensity: 255, min_intensity: 0,
rot_correction: 0.104719758033752, two_pt_correction_available: false, vert_correction: -0.307772427797318,
vert_offset_correction: 0}
- {dist_correction: 0.219999998807907, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 55, max_intensity: 255, min_intensity: 0,
rot_correction: 0.157079637050629, two_pt_correction_available: false, vert_correction: -0.298882067203522,
vert_offset_correction: 0}
- {dist_correction: 0.140000000596046, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 56, max_intensity: 255, min_intensity: 0,
rot_correction: -0.104719758033752, two_pt_correction_available: false, vert_correction: -0.183082059025764,
vert_offset_correction: 0}
- {dist_correction: 0.319999992847443, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 57, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0610865242779255, two_pt_correction_available: false, vert_correction: -0.17413204908371,
vert_offset_correction: 0}
- {dist_correction: 0.200000002980232, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 58, max_intensity: 255, min_intensity: 0,
rot_correction: -0.13962633907795, two_pt_correction_available: false, vert_correction: -0.236619830131531,
vert_offset_correction: 0}
- {dist_correction: 0.25, dist_correction_x: 0, dist_correction_y: 0, focal_distance: 0,
focal_slope: 0, laser_id: 59, max_intensity: 255, min_intensity: 0, rot_correction: -0.0785398185253143,
two_pt_correction_available: false, vert_correction: -0.22771255671978, vert_offset_correction: 0}
- {dist_correction: 0.170000001788139, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 60, max_intensity: 255, min_intensity: 0,
rot_correction: 0, two_pt_correction_available: false, vert_correction: -0.16517236828804,
vert_offset_correction: 0}
- {dist_correction: 0.230000004172325, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 61, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0436332300305367, two_pt_correction_available: false, vert_correction: -0.156202226877213,
vert_offset_correction: 0}
- {dist_correction: 0.150000005960464, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 62, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0174532923847437, two_pt_correction_available: false, vert_correction: -0.218799933791161,
vert_offset_correction: 0}
- {dist_correction: 0.230000004172325, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 63, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0314159244298935, two_pt_correction_available: false, vert_correction: -0.209881335496902,
vert_offset_correction: 0}
num_lasers: 64
distance_resolution: 0.002
@@ -0,0 +1,51 @@
lasers:
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 0, rot_correction: 0.0,
vert_correction: -0.17453292519943295, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 1, rot_correction: 0.0,
vert_correction: 0.011635528346628864, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 2, rot_correction: 0.0,
vert_correction: -0.15126186850617523, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 3, rot_correction: 0.0,
vert_correction: 0.03490658503988659, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 4, rot_correction: 0.0,
vert_correction: -0.1279908118129175, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 5, rot_correction: 0.0,
vert_correction: 0.05817764173314432, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 6, rot_correction: 0.0,
vert_correction: -0.10471975511965977, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 7, rot_correction: 0.0,
vert_correction: 0.08144869842640205, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 8, rot_correction: 0.0,
vert_correction: -0.08144869842640205, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 9, rot_correction: 0.0,
vert_correction: 0.10471975511965977, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 10, rot_correction: 0.0,
vert_correction: -0.05817764173314432, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 11, rot_correction: 0.0,
vert_correction: 0.1279908118129175, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 12, rot_correction: 0.0,
vert_correction: -0.03490658503988659, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 13, rot_correction: 0.0,
vert_correction: 0.15126186850617523, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 14, rot_correction: 0.0,
vert_correction: -0.011635528346628864, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 15, rot_correction: 0.0,
vert_correction: 0.17453292519943295, vert_offset_correction: 0.0}
num_lasers: 16
distance_resolution: 0.002
@@ -0,0 +1,51 @@
lasers:
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 0, rot_correction: 0.0,
vert_correction: -0.2617993877991494, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 1, rot_correction: 0.0,
vert_correction: 0.017453292519943295, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 2, rot_correction: 0.0,
vert_correction: -0.22689280275926285, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 3, rot_correction: 0.0,
vert_correction: 0.05235987755982989, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 4, rot_correction: 0.0,
vert_correction: -0.19198621771937624, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 5, rot_correction: 0.0,
vert_correction: 0.08726646259971647, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 6, rot_correction: 0.0,
vert_correction: -0.15707963267948966, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 7, rot_correction: 0.0,
vert_correction: 0.12217304763960307, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 8, rot_correction: 0.0,
vert_correction: -0.12217304763960307, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 9, rot_correction: 0.0,
vert_correction: 0.15707963267948966, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 10, rot_correction: 0.0,
vert_correction: -0.08726646259971647, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 11, rot_correction: 0.0,
vert_correction: 0.19198621771937624, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 12, rot_correction: 0.0,
vert_correction: -0.05235987755982989, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 13, rot_correction: 0.0,
vert_correction: 0.22689280275926285, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 14, rot_correction: 0.0,
vert_correction: -0.017453292519943295, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 15, rot_correction: 0.0,
vert_correction: 0.2617993877991494, vert_offset_correction: 0.0}
num_lasers: 16
distance_resolution: 0.002
@@ -0,0 +1,99 @@
lasers:
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 0, rot_correction: -0.024434609527920613,
vert_correction: -0.4363323129985824, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 1, rot_correction: 0.07330382858376185,
vert_correction: -0.017453292519943295, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 2, rot_correction: -0.024434609527920613,
vert_correction: -0.029094638630745476, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 3, rot_correction: 0.024434609527920613,
vert_correction: -0.2729520417193932, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 4, rot_correction: -0.024434609527920613,
vert_correction: -0.19739673840055869, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 5, rot_correction: 0.024434609527920613,
vert_correction: 0.0, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 6, rot_correction: -0.07330382858376185,
vert_correction: -0.011641346110802179, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 7, rot_correction: 0.024434609527920613,
vert_correction: -0.15433946575385857, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 8, rot_correction: -0.024434609527920613,
vert_correction: -0.12660618393966866, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 9, rot_correction: 0.07330382858376185,
vert_correction: 0.005811946409141118, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 10, rot_correction: -0.024434609527920613,
vert_correction: -0.005811946409141118, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 11, rot_correction: 0.024434609527920613,
vert_correction: -0.10730284241261137, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 12, rot_correction: -0.07330382858376185,
vert_correction: -0.0930784090088576, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 13, rot_correction: 0.024434609527920613,
vert_correction: 0.02326523892908441, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 14, rot_correction: -0.07330382858376185,
vert_correction: 0.011641346110802179, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 15, rot_correction: 0.024434609527920613,
vert_correction: -0.06981317007977318, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 16, rot_correction: -0.024434609527920613,
vert_correction: -0.08145451619057535, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 17, rot_correction: 0.07330382858376185,
vert_correction: 0.029094638630745476, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 18, rot_correction: -0.024434609527920613,
vert_correction: 0.017453292519943295, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 19, rot_correction: 0.07330382858376185,
vert_correction: -0.06400122367063206, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 20, rot_correction: -0.07330382858376185,
vert_correction: -0.058171823968971005, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 21, rot_correction: 0.024434609527920613,
vert_correction: 0.058171823968971005, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 22, rot_correction: -0.024434609527920613,
vert_correction: 0.04071853144902771, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 23, rot_correction: 0.024434609527920613,
vert_correction: -0.04654793115068877, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 24, rot_correction: -0.024434609527920613,
vert_correction: -0.05235987755982989, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 25, rot_correction: 0.024434609527920613,
vert_correction: 0.12217304763960307, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 26, rot_correction: -0.024434609527920613,
vert_correction: 0.08145451619057535, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 27, rot_correction: 0.07330382858376185,
vert_correction: -0.04071853144902771, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 28, rot_correction: -0.07330382858376185,
vert_correction: -0.03490658503988659, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 29, rot_correction: 0.024434609527920613,
vert_correction: 0.2617993877991494, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 30, rot_correction: -0.024434609527920613,
vert_correction: 0.18034487160857407, vert_offset_correction: 0.0}
- {dist_correction: 0.0, dist_correction_x: 0.0, dist_correction_y: 0.0, focal_distance: 0.0,
focal_slope: 0.0, horiz_offset_correction: 0.0, laser_id: 31, rot_correction: 0.024434609527920613,
vert_correction: -0.02326523892908441, vert_offset_correction: 0.0}
num_lasers: 32
distance_resolution: 0.004
@@ -0,0 +1,78 @@
Background\ ColorB=0
Background\ ColorG=0
Background\ ColorR=0
Camera\ Config=0.384797 3.10041 41.6639 0 0 0
Camera\ Type=rviz::OrbitViewController
Fixed\ Frame=/velodyne
Grid.Alpha=0.5
Grid.Cell\ Size=1
Grid.ColorB=0.5
Grid.ColorG=0.5
Grid.ColorR=0.5
Grid.Enabled=1
Grid.Line\ Style=0
Grid.Line\ Width=0.03
Grid.Normal\ Cell\ Count=0
Grid.OffsetX=0
Grid.OffsetY=0
Grid.OffsetZ=0
Grid.Plane=0
Grid.Plane\ Cell\ Count=50
Grid.Reference\ Frame=<Fixed Frame>
Property\ Grid\ Splitter=751,78
Property\ Grid\ State=expanded=.Global Options,Grid.Enabled,Velodyne Cloud.Enabled;splitterratio=0.5
QMainWindow=000000ff00000000fd00000003000000000000011d0000038ffc0200000001fb000000100044006900730070006c006100790073010000001d0000038f000000ee00ffffff00000001000001300000038ffc0200000003fb0000001e0054006f006f006c002000500072006f0070006500720074006900650073010000001d0000011f0000006700fffffffb0000000a00560069006500770073010000014200000145000000bb00fffffffb0000001200530065006c0065006300740069006f006e010000028d0000011f0000006700ffffff00000003000005d10000003efc0100000001fb0000000800540069006d00650100000000000005d1000002bf00ffffff000003780000038f00000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
TF.All\ Enabled=1
TF.Enabled=1
TF.Frame\ Timeout=15
TF.Marker\ Scale=1
TF.Show\ Arrows=1
TF.Show\ Axes=1
TF.Show\ Names=1
TF.Update\ Interval=0
Target\ Frame=<Fixed Frame>
Tool\ 2D\ Nav\ GoalTopic=move_base_simple/goal
Tool\ 2D\ Pose\ EstimateTopic=initialpose
Velodyne\ Cloud..AxisColorAutocompute\ Value\ Bounds=1
Velodyne\ Cloud..AxisColorAxis=2
Velodyne\ Cloud..AxisColorMax\ Value=10
Velodyne\ Cloud..AxisColorMin\ Value=-10
Velodyne\ Cloud..AxisColorUse\ Fixed\ Frame=1
Velodyne\ Cloud..FlatColorColorB=1
Velodyne\ Cloud..FlatColorColorG=1
Velodyne\ Cloud..FlatColorColorR=1
Velodyne\ Cloud..IntensityAutocompute\ Intensity\ Bounds=1
Velodyne\ Cloud..IntensityChannel\ Name=intensity
Velodyne\ Cloud..IntensityMax\ ColorB=1
Velodyne\ Cloud..IntensityMax\ ColorG=0.776471
Velodyne\ Cloud..IntensityMax\ ColorR=0.796078
Velodyne\ Cloud..IntensityMax\ Intensity=255
Velodyne\ Cloud..IntensityMin\ ColorB=1
Velodyne\ Cloud..IntensityMin\ ColorG=0.0823529
Velodyne\ Cloud..IntensityMin\ ColorR=0.141176
Velodyne\ Cloud..IntensityMin\ Intensity=95
Velodyne\ Cloud..IntensityUse\ full\ RGB\ spectrum=0
Velodyne\ Cloud.Alpha=1
Velodyne\ Cloud.Billboard\ Size=0.1
Velodyne\ Cloud.Color\ Transformer=Intensity
Velodyne\ Cloud.Decay\ Time=0
Velodyne\ Cloud.Enabled=1
Velodyne\ Cloud.Position\ Transformer=XYZ
Velodyne\ Cloud.Queue\ Size=10
Velodyne\ Cloud.Selectable=1
Velodyne\ Cloud.Style=0
Velodyne\ Cloud.Topic=/velodyne_points
[Display0]
ClassName=rviz::GridDisplay
Name=Grid
[Display1]
ClassName=rviz::TFDisplay
Name=TF
[Display2]
ClassName=rviz::PointCloud2Display
Name=Velodyne Cloud
[Window]
Height=1045
Width=1505
X=-8
Y=-29
@@ -0,0 +1,209 @@
#!/usr/bin/python
# Software License Agreement (BSD License)
#
# Copyright (C) 2012, Austin Robot Technology
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of Austin Robot Technology, Inc. nor the names
# of its contributors may be used to endorse or promote products
# derived from this software without specific prior written
# permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# Revision $Id$
"""
Generate YAML calibration file from Velodyne db.xml.
The input data provided by the manufacturer are in degrees and
centimeters. The YAML file uses radians and meters, following ROS
standards [REP-0103].
"""
from __future__ import print_function
import math
import optparse
import os
import sys
from xml.etree import ElementTree
import yaml
# parse the command line
usage = """usage: %prog infile.xml [outfile.yaml]
Default output file is input file with .yaml suffix."""
parser = optparse.OptionParser(usage=usage)
options, args = parser.parse_args()
if len(args) < 1:
parser.error('XML file name missing')
sys.exit(9)
xmlFile = args[0]
if len(args) >= 2:
yamlFile = args[1]
else:
yamlFile, ext = os.path.splitext(xmlFile)
yamlFile += '.yaml'
print('converting "' + xmlFile + '" to "' + yamlFile + '"')
calibrationGood = True
def xmlError(msg):
'handle XML calibration error'
global calibrationGood
calibrationGood = False
print('gen_calibration.py: ' + msg)
db = None
try:
db = ElementTree.parse(xmlFile)
except IOError:
xmlError('unable to read ' + xmlFile)
except ElementTree.ParseError:
xmlError('XML parse failed for ' + xmlFile)
if not calibrationGood:
sys.exit(2)
# create a dictionary to hold all relevant calibration values
calibration = {'num_lasers': 0, 'lasers': [], 'distance_resolution': 0.2}
cm2meters = 0.01 # convert centimeters to meters
def addLaserCalibration(laser_num, key, val):
'Define key and corresponding value for laser_num'
global calibration
if laser_num < len(calibration['lasers']):
calibration['lasers'][laser_num][key] = val
else:
calibration['lasers'].append({key: val})
# add enabled flags
num_enabled = 0
enabled_lasers = []
enabled = db.find('DB/enabled_')
if enabled == None:
print('no enabled tags found: assuming all 64 enabled')
num_enabled = 64
enabled_lasers = [True for i in xrange(num_enabled)]
else:
index = 0
for el in enabled:
if el.tag == 'item':
this_enabled = int(el.text) != 0
enabled_lasers.append(this_enabled)
index += 1
if this_enabled:
num_enabled += 1
calibration['num_lasers'] = num_enabled
print(str(num_enabled) + ' lasers')
# add distance resolution (cm)
distLSB = db.find('DB/distLSB_')
if distLSB != None:
calibration['distance_resolution'] = float(distLSB.text) * cm2meters
# add minimum laser intensities
minIntensities = db.find('DB/minIntensity_')
if minIntensities != None:
index = 0
for el in minIntensities:
if el.tag == 'item':
if enabled_lasers[index]:
value = int(el.text)
if value != 0:
addLaserCalibration(index, 'min_intensity', value)
index += 1
# add maximum laser intensities
maxIntensities = db.find('DB/maxIntensity_')
if maxIntensities != None:
index = 0
for el in maxIntensities:
if el.tag == 'item':
if enabled_lasers[index]:
value = int(el.text)
if value != 255:
addLaserCalibration(index, 'max_intensity', value)
index += 1
# add calibration information for each laser
for el in db.find('DB/points_'):
if el.tag == 'item':
for px in el:
for field in px:
if field.tag == 'id_':
index = int(field.text)
if not enabled_lasers[index]:
break # skip this laser, it is not enabled
addLaserCalibration(index, 'laser_id', index)
if field.tag == 'rotCorrection_':
addLaserCalibration(index, 'rot_correction',
math.radians(float(field.text)))
elif field.tag == 'vertCorrection_':
addLaserCalibration(index, 'vert_correction',
math.radians(float(field.text)))
elif field.tag == 'distCorrection_':
addLaserCalibration(index, 'dist_correction',
float(field.text) * cm2meters)
elif field.tag == 'distCorrectionX_':
addLaserCalibration(index, 'dist_correction_x',
float(field.text) * cm2meters)
elif field.tag == 'distCorrectionY_':
addLaserCalibration(index, 'dist_correction_y',
float(field.text) * cm2meters)
elif field.tag == 'vertOffsetCorrection_':
addLaserCalibration(index, 'vert_offset_correction',
float(field.text) * cm2meters)
elif field.tag == 'horizOffsetCorrection_':
addLaserCalibration(index, 'horiz_offset_correction',
float(field.text) * cm2meters)
elif field.tag == 'focalDistance_':
addLaserCalibration(index, 'focal_distance',
float(field.text) * cm2meters)
elif field.tag == 'focalSlope_':
addLaserCalibration(index, 'focal_slope', float(field.text))
# validate input data
if calibration['num_lasers'] <= 0:
xmlError('no lasers defined')
elif calibration['num_lasers'] != num_enabled:
xmlError('inconsistent number of lasers defined')
# TODO: make sure all required fields are present.
# (Which ones are required?)
if calibrationGood:
# write calibration data to YAML file
f = open(yamlFile, 'w')
try:
yaml.dump(calibration, f)
finally:
f.close()
@@ -0,0 +1,31 @@
add_executable(cloud_node cloud_node.cc convert.cc pointcloudXYZIR.cc organized_cloudXYZIR.cc)
add_dependencies(cloud_node ${${PROJECT_NAME}_EXPORTED_TARGETS})
target_link_libraries(cloud_node velodyne_rawdata
${catkin_LIBRARIES} ${YAML_CPP_LIBRARIES})
install(TARGETS cloud_node
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
add_library(cloud_nodelet cloud_nodelet.cc convert.cc pointcloudXYZIR.cc organized_cloudXYZIR.cc)
add_dependencies(cloud_nodelet ${${PROJECT_NAME}_EXPORTED_TARGETS})
target_link_libraries(cloud_nodelet velodyne_rawdata
${catkin_LIBRARIES} ${YAML_CPP_LIBRARIES})
install(TARGETS cloud_nodelet
RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION})
add_executable(transform_node transform_node.cc transform.cc pointcloudXYZIR.cc organized_cloudXYZIR.cc)
add_dependencies(transform_node ${${PROJECT_NAME}_EXPORTED_TARGETS})
target_link_libraries(transform_node velodyne_rawdata
${catkin_LIBRARIES} ${YAML_CPP_LIBRARIES})
install(TARGETS transform_node
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
add_library(transform_nodelet transform_nodelet.cc transform.cc pointcloudXYZIR.cc organized_cloudXYZIR.cc)
add_dependencies(transform_nodelet ${${PROJECT_NAME}_EXPORTED_TARGETS})
target_link_libraries(transform_nodelet velodyne_rawdata
${catkin_LIBRARIES} ${YAML_CPP_LIBRARIES})
install(TARGETS transform_nodelet
RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION})
@@ -0,0 +1,31 @@
/*
* Copyright (C) 2012 Austin Robot Technology, Jack O'Quin
* License: Modified BSD Software License Agreement
*
* $Id$
*/
/** \file
This ROS node converts raw Velodyne LIDAR packets to PointCloud2.
*/
#include <ros/ros.h>
#include "velodyne_pointcloud/convert.h"
/** Main node entry point. */
int main(int argc, char **argv)
{
ros::init(argc, argv, "cloud_node");
ros::NodeHandle node;
ros::NodeHandle priv_nh("~");
// create conversion class, which subscribes to raw data
velodyne_pointcloud::Convert conv(node, priv_nh);
// handle callbacks until shut down
ros::spin();
return 0;
}
@@ -0,0 +1,48 @@
/*
* Copyright (C) 2012 Austin Robot Technology, Jack O'Quin
* License: Modified BSD Software License Agreement
*
* $Id$
*/
/** @file
This ROS nodelet converts raw Velodyne 3D LIDAR packets to a
PointCloud2.
*/
#include <ros/ros.h>
#include <pluginlib/class_list_macros.h>
#include <nodelet/nodelet.h>
#include "velodyne_pointcloud/convert.h"
namespace velodyne_pointcloud
{
class CloudNodelet: public nodelet::Nodelet
{
public:
CloudNodelet() {}
~CloudNodelet() {}
private:
virtual void onInit();
boost::shared_ptr<Convert> conv_;
};
/** @brief Nodelet initialization. */
void CloudNodelet::onInit()
{
conv_.reset(new Convert(getNodeHandle(), getPrivateNodeHandle(), getName()));
}
} // namespace velodyne_pointcloud
// Register this plugin with pluginlib. Names must match nodelets.xml.
//
// parameters: class type, base class type
PLUGINLIB_EXPORT_CLASS(velodyne_pointcloud::CloudNodelet, nodelet::Nodelet)
@@ -0,0 +1,150 @@
/*
* Copyright (C) 2009, 2010 Austin Robot Technology, Jack O'Quin
* Copyright (C) 2011 Jesse Vera
* Copyright (C) 2012 Austin Robot Technology, Jack O'Quin
* License: Modified BSD Software License Agreement
*
* $Id$
*/
/** @file
This class converts raw Velodyne 3D LIDAR packets to PointCloud2.
*/
#include "velodyne_pointcloud/convert.h"
#include <velodyne_pointcloud/pointcloudXYZIR.h>
#include <velodyne_pointcloud/organized_cloudXYZIR.h>
namespace velodyne_pointcloud
{
/** @brief Constructor. */
Convert::Convert(ros::NodeHandle node, ros::NodeHandle private_nh, std::string const & node_name):
data_(new velodyne_rawdata::RawData()), first_rcfg_call(true),
diagnostics_(node, private_nh, node_name)
{
// Get startup parameters
private_nh.param<std::string>("fixed_frame", config_.fixed_frame, "velodyne");
private_nh.param<std::string>("target_Frame", config_.target_frame, "velodyne");
private_nh.param<double>("min_range", config_.min_range, 10.0);
private_nh.param<double>("max_range", config_.max_range, 200.0);
private_nh.param<bool>("organize_cloud", config_.organize_cloud, false);
boost::optional<velodyne_pointcloud::Calibration> calibration = data_->setup(private_nh);
if(calibration)
{
ROS_DEBUG_STREAM("Calibration file loaded.");
config_.num_lasers = static_cast<uint16_t>(calibration.get().num_lasers);
}
else
{
ROS_ERROR_STREAM("Could not load calibration file!");
}
if(config_.organize_cloud)
{
container_ptr_ = boost::shared_ptr<OrganizedCloudXYZIR>(
new OrganizedCloudXYZIR(config_.max_range, config_.min_range,
config_.target_frame, config_.fixed_frame,
config_.num_lasers, data_->scansPerPacket()));
}
else
{
container_ptr_ = boost::shared_ptr<PointcloudXYZIR>(
new PointcloudXYZIR(config_.max_range, config_.min_range,
config_.target_frame, config_.fixed_frame,
data_->scansPerPacket()));
}
// advertise output point cloud (before subscribing to input data)
output_ =
node.advertise<sensor_msgs::PointCloud2>("velodyne_points", 10);
srv_ = boost::make_shared <dynamic_reconfigure::Server<velodyne_pointcloud::
CloudNodeConfig> > (private_nh);
dynamic_reconfigure::Server<velodyne_pointcloud::CloudNodeConfig>::
CallbackType f;
f = boost::bind (&Convert::callback, this, _1, _2);
srv_->setCallback (f);
// subscribe to VelodyneScan packets
velodyne_scan_ =
node.subscribe("velodyne_packets", 10,
&Convert::processScan, (Convert *) this,
ros::TransportHints().tcpNoDelay(true));
// Diagnostics
diagnostics_.setHardwareID("Velodyne Convert");
// Arbitrary frequencies since we don't know which RPM is used, and are only
// concerned about monitoring the frequency.
diag_min_freq_ = 2.0;
diag_max_freq_ = 20.0;
using namespace diagnostic_updater;
diag_topic_.reset(new TopicDiagnostic("velodyne_points", diagnostics_,
FrequencyStatusParam(&diag_min_freq_,
&diag_max_freq_,
0.1, 10),
TimeStampStatusParam()));
}
void Convert::callback(velodyne_pointcloud::CloudNodeConfig &config,
uint32_t level)
{
ROS_INFO("Reconfigure Request");
data_->setParameters(config.min_range, config.max_range, config.view_direction,
config.view_width);
config_.fixed_frame = config.fixed_frame;
config_.target_frame = config.target_frame;
config_.min_range = config.min_range;
config_.max_range = config.max_range;
if(first_rcfg_call || config.organize_cloud != config_.organize_cloud){
first_rcfg_call = false;
config_.organize_cloud = config.organize_cloud;
if(config_.organize_cloud) // TODO only on change
{
ROS_INFO_STREAM("Using the organized cloud format...");
container_ptr_ = boost::shared_ptr<OrganizedCloudXYZIR>(
new OrganizedCloudXYZIR(config_.max_range, config_.min_range,
config_.target_frame, config_.fixed_frame,
config_.num_lasers, data_->scansPerPacket()));
}
else
{
container_ptr_ = boost::shared_ptr<PointcloudXYZIR>(
new PointcloudXYZIR(config_.max_range, config_.min_range,
config_.target_frame, config_.fixed_frame,
data_->scansPerPacket()));
}
}
container_ptr_->configure(config_.max_range, config_.min_range, config_.fixed_frame, config_.target_frame);
}
/** @brief Callback for raw scan messages. */
void Convert::processScan(const velodyne_msgs::VelodyneScan::ConstPtr &scanMsg)
{
if (output_.getNumSubscribers() == 0) // no one listening?
return; // avoid much work
boost::lock_guard<boost::mutex> guard(reconfigure_mtx_);
// allocate a point cloud with same time and frame ID as raw data
container_ptr_->setup(scanMsg);
// process each packet provided by the driver
for (size_t i = 0; i < scanMsg->packets.size(); ++i)
{
data_->unpack(scanMsg->packets[i], *container_ptr_, scanMsg->header.stamp);
}
// publish the accumulated cloud message
diag_topic_->tick(scanMsg->header.stamp);
diagnostics_.update();
output_.publish(container_ptr_->finishCloud());
}
} // namespace velodyne_pointcloud
@@ -0,0 +1,80 @@
#include <velodyne_pointcloud/organized_cloudXYZIR.h>
namespace velodyne_pointcloud
{
OrganizedCloudXYZIR::OrganizedCloudXYZIR(
const double max_range, const double min_range,
const std::string& target_frame, const std::string& fixed_frame,
const unsigned int num_lasers, const unsigned int scans_per_block,
boost::shared_ptr<tf::TransformListener> tf_ptr)
: DataContainerBase(
max_range, min_range, target_frame, fixed_frame,
num_lasers, 0, false, scans_per_block, tf_ptr, 6,
"x", 1, sensor_msgs::PointField::FLOAT32,
"y", 1, sensor_msgs::PointField::FLOAT32,
"z", 1, sensor_msgs::PointField::FLOAT32,
"intensity", 1, sensor_msgs::PointField::FLOAT32,
"ring", 1, sensor_msgs::PointField::UINT16,
"time", 1, sensor_msgs::PointField::FLOAT32),
iter_x(cloud, "x"), iter_y(cloud, "y"), iter_z(cloud, "z"),
iter_intensity(cloud, "intensity"), iter_ring(cloud, "ring"), iter_time(cloud, "time")
{
}
void OrganizedCloudXYZIR::newLine()
{
iter_x = iter_x + config_.init_width;
iter_y = iter_y + config_.init_width;
iter_z = iter_z + config_.init_width;
iter_ring = iter_ring + config_.init_width;
iter_intensity = iter_intensity + config_.init_width;
iter_time = iter_time + config_.init_width;
++cloud.height;
}
void OrganizedCloudXYZIR::setup(const velodyne_msgs::VelodyneScan::ConstPtr& scan_msg){
DataContainerBase::setup(scan_msg);
iter_x = sensor_msgs::PointCloud2Iterator<float>(cloud, "x");
iter_y = sensor_msgs::PointCloud2Iterator<float>(cloud, "y");
iter_z = sensor_msgs::PointCloud2Iterator<float>(cloud, "z");
iter_intensity = sensor_msgs::PointCloud2Iterator<float>(cloud, "intensity");
iter_ring = sensor_msgs::PointCloud2Iterator<uint16_t >(cloud, "ring");
iter_time = sensor_msgs::PointCloud2Iterator<float >(cloud, "time");
}
void OrganizedCloudXYZIR::addPoint(float x, float y, float z,
const uint16_t ring, const uint16_t /*azimuth*/, const float distance, const float intensity, const float time)
{
/** The laser values are not ordered, the organized structure
* needs ordered neighbour points. The right order is defined
* by the laser_ring value.
* To keep the right ordering, the filtered values are set to
* NaN.
*/
if (pointInRange(distance))
{
if(config_.transform)
transformPoint(x, y, z);
*(iter_x+ring) = x;
*(iter_y+ring) = y;
*(iter_z+ring) = z;
*(iter_intensity+ring) = intensity;
*(iter_ring+ring) = ring;
*(iter_time+time) = time;
}
else
{
*(iter_x+ring) = nanf("");
*(iter_y+ring) = nanf("");
*(iter_z+ring) = nanf("");
*(iter_intensity+ring) = nanf("");
*(iter_ring+ring) = ring;
*(iter_time+time) = time;
}
}
}
@@ -0,0 +1,64 @@
#include <velodyne_pointcloud/pointcloudXYZIR.h>
namespace velodyne_pointcloud
{
PointcloudXYZIR::PointcloudXYZIR(
const double max_range, const double min_range,
const std::string& target_frame, const std::string& fixed_frame,
const unsigned int scans_per_block, boost::shared_ptr<tf::TransformListener> tf_ptr)
: DataContainerBase(
max_range, min_range, target_frame, fixed_frame,
0, 1, true, scans_per_block, tf_ptr, 6,
"x", 1, sensor_msgs::PointField::FLOAT32,
"y", 1, sensor_msgs::PointField::FLOAT32,
"z", 1, sensor_msgs::PointField::FLOAT32,
"intensity", 1, sensor_msgs::PointField::FLOAT32,
"ring", 1, sensor_msgs::PointField::UINT16,
"time", 1, sensor_msgs::PointField::FLOAT32),
iter_x(cloud, "x"), iter_y(cloud, "y"), iter_z(cloud, "z"),
iter_ring(cloud, "ring"), iter_intensity(cloud, "intensity"), iter_time(cloud, "time")
{};
void PointcloudXYZIR::setup(const velodyne_msgs::VelodyneScan::ConstPtr& scan_msg){
DataContainerBase::setup(scan_msg);
iter_x = sensor_msgs::PointCloud2Iterator<float>(cloud, "x");
iter_y = sensor_msgs::PointCloud2Iterator<float>(cloud, "y");
iter_z = sensor_msgs::PointCloud2Iterator<float>(cloud, "z");
iter_intensity = sensor_msgs::PointCloud2Iterator<float>(cloud, "intensity");
iter_ring = sensor_msgs::PointCloud2Iterator<uint16_t >(cloud, "ring");
iter_time = sensor_msgs::PointCloud2Iterator<float >(cloud, "time");
}
void PointcloudXYZIR::newLine()
{}
void PointcloudXYZIR::addPoint(float x, float y, float z, uint16_t ring, uint16_t /*azimuth*/, float distance, float intensity, float time)
{
if(!pointInRange(distance)) return;
// convert polar coordinates to Euclidean XYZ
if(config_.transform)
transformPoint(x, y, z);
*iter_x = x;
*iter_y = y;
*iter_z = z;
*iter_ring = ring;
*iter_intensity = intensity;
*iter_time = time;
++cloud.width;
++iter_x;
++iter_y;
++iter_z;
++iter_ring;
++iter_intensity;
++iter_time;
}
}
@@ -0,0 +1,158 @@
/*
* Copyright (C) 2009, 2010 Austin Robot Technology, Jack O'Quin
* Copyright (C) 2011 Jesse Vera
* Copyright (C) 2012 Austin Robot Technology, Jack O'Quin
* License: Modified BSD Software License Agreement
*
* $Id$
*/
/** @file
This class transforms raw Velodyne 3D LIDAR packets to PointCloud2
in the /map frame of reference.
@author Jack O'Quin
@author Jesse Vera
@author Sebastian Pütz
*/
#include "velodyne_pointcloud/transform.h"
#include <velodyne_pointcloud/pointcloudXYZIR.h>
#include <velodyne_pointcloud/organized_cloudXYZIR.h>
namespace velodyne_pointcloud
{
/** @brief Constructor. */
Transform::Transform(ros::NodeHandle node, ros::NodeHandle private_nh, std::string const & node_name):
tf_prefix_(tf::getPrefixParam(private_nh)),
data_(new velodyne_rawdata::RawData),
first_rcfg_call(true),
diagnostics_(node, private_nh, node_name)
{
boost::optional<velodyne_pointcloud::Calibration> calibration = data_->setup(private_nh);
if(calibration)
{
ROS_DEBUG_STREAM("Calibration file loaded.");
config_.num_lasers = static_cast<uint16_t>(calibration.get().num_lasers);
}
else
{
ROS_ERROR_STREAM("Could not load calibration file!");
}
config_.target_frame = config_.fixed_frame = "velodyne";
tf_ptr_ = boost::make_shared<tf::TransformListener>();
if(config_.organize_cloud)
{
container_ptr = boost::shared_ptr<OrganizedCloudXYZIR>(
new OrganizedCloudXYZIR(config_.max_range, config_.min_range, config_.target_frame, config_.fixed_frame,
config_.num_lasers, data_->scansPerPacket(), tf_ptr_));
}
else
{
container_ptr = boost::shared_ptr<PointcloudXYZIR>(
new PointcloudXYZIR(config_.max_range, config_.min_range,
config_.target_frame, config_.fixed_frame,
data_->scansPerPacket(), tf_ptr_));
}
// advertise output point cloud (before subscribing to input data)
output_ =
node.advertise<sensor_msgs::PointCloud2>("velodyne_points", 10);
srv_ = boost::make_shared<dynamic_reconfigure::Server<TransformNodeCfg>> (private_nh);
dynamic_reconfigure::Server<TransformNodeCfg>::CallbackType f;
f = boost::bind (&Transform::reconfigure_callback, this, _1, _2);
srv_->setCallback (f);
// subscribe to VelodyneScan packets using transform filter
velodyne_scan_.subscribe(node, "velodyne_packets", 10);
tf_filter_ptr_ = boost::shared_ptr<tf::MessageFilter<velodyne_msgs::VelodyneScan> >(
new tf::MessageFilter<velodyne_msgs::VelodyneScan>(velodyne_scan_, *tf_ptr_, config_.target_frame, 10));
tf_filter_ptr_->registerCallback(boost::bind(&Transform::processScan, this, _1));
private_nh.param<std::string>("fixed_frame", config_.fixed_frame, "odom");
// Diagnostics
diagnostics_.setHardwareID("Velodyne Transform");
// Arbitrary frequencies since we don't know which RPM is used, and are only
// concerned about monitoring the frequency.
diag_min_freq_ = 2.0;
diag_max_freq_ = 20.0;
using namespace diagnostic_updater;
diag_topic_.reset(new TopicDiagnostic("velodyne_points", diagnostics_,
FrequencyStatusParam(&diag_min_freq_,
&diag_max_freq_,
0.1, 10),
TimeStampStatusParam()));
}
void Transform::reconfigure_callback(
velodyne_pointcloud::TransformNodeConfig &config, uint32_t level)
{
ROS_INFO_STREAM("Reconfigure request.");
data_->setParameters(config.min_range, config.max_range,
config.view_direction, config.view_width);
config_.target_frame = tf::resolve(tf_prefix_, config.frame_id);
ROS_INFO_STREAM("Target frame ID now: " << config_.target_frame);
config_.min_range = config.min_range;
config_.max_range = config.max_range;
boost::lock_guard<boost::mutex> guard(reconfigure_mtx_);
if(first_rcfg_call || config.organize_cloud != config_.organize_cloud){
first_rcfg_call = false;
config_.organize_cloud = config.organize_cloud;
if(config_.organize_cloud)
{
ROS_INFO_STREAM("Using the organized cloud format...");
container_ptr = boost::shared_ptr<OrganizedCloudXYZIR>(
new OrganizedCloudXYZIR(config_.max_range, config_.min_range,
config_.target_frame, config_.fixed_frame,
config_.num_lasers, data_->scansPerPacket()));
}
else
{
container_ptr = boost::shared_ptr<PointcloudXYZIR>(
new PointcloudXYZIR(config_.max_range, config_.min_range,
config_.target_frame, config_.fixed_frame,
data_->scansPerPacket()));
}
}
container_ptr->configure(config_.max_range, config_.min_range, config_.fixed_frame, config_.target_frame);
}
/** @brief Callback for raw scan messages.
*
* @pre TF message filter has already waited until the transform to
* the configured @c frame_id can succeed.
*/
void
Transform::processScan(const velodyne_msgs::VelodyneScan::ConstPtr &scanMsg)
{
if (output_.getNumSubscribers() == 0) // no one listening?
return; // avoid much work
boost::lock_guard<boost::mutex> guard(reconfigure_mtx_);
// allocate a point cloud with same time and frame ID as raw data
container_ptr->setup(scanMsg);
// process each packet provided by the driver
for (size_t i = 0; i < scanMsg->packets.size(); ++i)
{
container_ptr->computeTransformation(scanMsg->packets[i].stamp);
data_->unpack(scanMsg->packets[i], *container_ptr, scanMsg->header.stamp);
}
// publish the accumulated cloud message
output_.publish(container_ptr->finishCloud());
diag_topic_->tick(scanMsg->header.stamp);
diagnostics_.update();
}
} // namespace velodyne_pointcloud
@@ -0,0 +1,31 @@
/*
* Copyright (C) 2012 Austin Robot Technology, Jack O'Quin
* License: Modified BSD Software License Agreement
*
* $Id$
*/
/** \file
This ROS node transforms raw Velodyne LIDAR packets to PointCloud2
in the /map frame of reference.
*/
#include <ros/ros.h>
#include "velodyne_pointcloud/transform.h"
/** Main node entry point. */
int main(int argc, char **argv)
{
ros::init(argc, argv, "transform_node");
// create conversion class, which subscribes to raw data
velodyne_pointcloud::Transform transform(ros::NodeHandle(),
ros::NodeHandle("~"));
// handle callbacks until shut down
ros::spin();
return 0;
}
@@ -0,0 +1,48 @@
/*
* Copyright (C) 2012 Austin Robot Technology, Jack O'Quin
* License: Modified BSD Software License Agreement
*
* $Id$
*/
/** @file
This ROS nodelet transforms raw Velodyne 3D LIDAR packets to a
PointCloud2 in the /map frame.
*/
#include <ros/ros.h>
#include <pluginlib/class_list_macros.h>
#include <nodelet/nodelet.h>
#include "velodyne_pointcloud/transform.h"
namespace velodyne_pointcloud
{
class TransformNodelet: public nodelet::Nodelet
{
public:
TransformNodelet() {}
~TransformNodelet() {}
private:
virtual void onInit();
boost::shared_ptr<Transform> tf_;
};
/** @brief Nodelet initialization. */
void TransformNodelet::onInit()
{
tf_.reset(new Transform(getNodeHandle(), getPrivateNodeHandle(), getName()));
}
} // namespace velodyne_pointcloud
// Register this plugin with pluginlib. Names must match nodelets.xml.
//
// parameters: class type, base class type
PLUGINLIB_EXPORT_CLASS(velodyne_pointcloud::TransformNodelet, nodelet::Nodelet)
@@ -0,0 +1,8 @@
add_library(velodyne_rawdata rawdata.cc calibration.cc)
target_link_libraries(velodyne_rawdata
${catkin_LIBRARIES}
${YAML_CPP_LIBRARIES})
install(TARGETS velodyne_rawdata
RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION})
@@ -0,0 +1,283 @@
/**
* \file calibration.cc
* \brief
*
* \author Piyush Khandelwal (piyushk@cs.utexas.edu)
* Copyright (C) 2012, Austin Robot Technology,
* The University of Texas at Austin
*
* License: Modified BSD License
*
* $ Id: 02/14/2012 11:36:36 AM piyushk $
*/
#include <iostream>
#include <fstream>
#include <string>
#include <cmath>
#include <limits>
#include <yaml-cpp/yaml.h>
#ifdef HAVE_NEW_YAMLCPP
namespace YAML {
// The >> operator disappeared in yaml-cpp 0.5, so this function is
// added to provide support for code written under the yaml-cpp 0.3 API.
template<typename T>
void operator >> (const YAML::Node& node, T& i) {
i = node.as<T>();
}
} /* YAML */
#endif // HAVE_NEW_YAMLCPP
#include <ros/ros.h>
#include <velodyne_pointcloud/calibration.h>
namespace velodyne_pointcloud
{
const std::string NUM_LASERS = "num_lasers";
const std::string DISTANCE_RESOLUTION = "distance_resolution";
const std::string LASERS = "lasers";
const std::string LASER_ID = "laser_id";
const std::string ROT_CORRECTION = "rot_correction";
const std::string VERT_CORRECTION = "vert_correction";
const std::string DIST_CORRECTION = "dist_correction";
const std::string TWO_PT_CORRECTION_AVAILABLE =
"two_pt_correction_available";
const std::string DIST_CORRECTION_X = "dist_correction_x";
const std::string DIST_CORRECTION_Y = "dist_correction_y";
const std::string VERT_OFFSET_CORRECTION = "vert_offset_correction";
const std::string HORIZ_OFFSET_CORRECTION = "horiz_offset_correction";
const std::string MAX_INTENSITY = "max_intensity";
const std::string MIN_INTENSITY = "min_intensity";
const std::string FOCAL_DISTANCE = "focal_distance";
const std::string FOCAL_SLOPE = "focal_slope";
/** Read calibration for a single laser. */
void operator >> (const YAML::Node& node,
std::pair<int, LaserCorrection>& correction)
{
node[LASER_ID] >> correction.first;
node[ROT_CORRECTION] >> correction.second.rot_correction;
node[VERT_CORRECTION] >> correction.second.vert_correction;
node[DIST_CORRECTION] >> correction.second.dist_correction;
#ifdef HAVE_NEW_YAMLCPP
if (node[TWO_PT_CORRECTION_AVAILABLE])
node[TWO_PT_CORRECTION_AVAILABLE] >>
correction.second.two_pt_correction_available;
#else
if (const YAML::Node *pName = node.FindValue(TWO_PT_CORRECTION_AVAILABLE))
*pName >> correction.second.two_pt_correction_available;
#endif
else
correction.second.two_pt_correction_available = false;
node[DIST_CORRECTION_X] >> correction.second.dist_correction_x;
node[DIST_CORRECTION_Y] >> correction.second.dist_correction_y;
node[VERT_OFFSET_CORRECTION] >> correction.second.vert_offset_correction;
#ifdef HAVE_NEW_YAMLCPP
if (node[HORIZ_OFFSET_CORRECTION])
node[HORIZ_OFFSET_CORRECTION] >>
correction.second.horiz_offset_correction;
#else
if (const YAML::Node *pName = node.FindValue(HORIZ_OFFSET_CORRECTION))
*pName >> correction.second.horiz_offset_correction;
#endif
else
correction.second.horiz_offset_correction = 0;
const YAML::Node * max_intensity_node = NULL;
#ifdef HAVE_NEW_YAMLCPP
if (node[MAX_INTENSITY]) {
const YAML::Node max_intensity_node_ref = node[MAX_INTENSITY];
max_intensity_node = &max_intensity_node_ref;
}
#else
if (const YAML::Node *pName = node.FindValue(MAX_INTENSITY))
max_intensity_node = pName;
#endif
if (max_intensity_node) {
float max_intensity_float;
*max_intensity_node >> max_intensity_float;
correction.second.max_intensity = floor(max_intensity_float);
}
else {
correction.second.max_intensity = 255;
}
const YAML::Node * min_intensity_node = NULL;
#ifdef HAVE_NEW_YAMLCPP
if (node[MIN_INTENSITY]) {
const YAML::Node min_intensity_node_ref = node[MIN_INTENSITY];
min_intensity_node = &min_intensity_node_ref;
}
#else
if (const YAML::Node *pName = node.FindValue(MIN_INTENSITY))
min_intensity_node = pName;
#endif
if (min_intensity_node) {
float min_intensity_float;
*min_intensity_node >> min_intensity_float;
correction.second.min_intensity = floor(min_intensity_float);
}
else {
correction.second.min_intensity = 0;
}
node[FOCAL_DISTANCE] >> correction.second.focal_distance;
node[FOCAL_SLOPE] >> correction.second.focal_slope;
// Calculate cached values
correction.second.cos_rot_correction =
cosf(correction.second.rot_correction);
correction.second.sin_rot_correction =
sinf(correction.second.rot_correction);
correction.second.cos_vert_correction =
cosf(correction.second.vert_correction);
correction.second.sin_vert_correction =
sinf(correction.second.vert_correction);
correction.second.laser_ring = 0; // clear initially (set later)
}
/** Read entire calibration file. */
void operator >> (const YAML::Node& node, Calibration& calibration)
{
int num_lasers;
node[NUM_LASERS] >> num_lasers;
float distance_resolution_m;
node[DISTANCE_RESOLUTION] >> distance_resolution_m;
const YAML::Node& lasers = node[LASERS];
calibration.laser_corrections.clear();
calibration.num_lasers = num_lasers;
calibration.distance_resolution_m = distance_resolution_m;
calibration.laser_corrections.resize(num_lasers);
for (int i = 0; i < num_lasers; i++) {
std::pair<int, LaserCorrection> correction;
lasers[i] >> correction;
const int index = correction.first;
if( index >= calibration.laser_corrections.size() )
{
calibration.laser_corrections.resize( index+1 );
}
calibration.laser_corrections[index] = (correction.second);
calibration.laser_corrections_map.insert(correction);
}
// For each laser ring, find the next-smallest vertical angle.
//
// This implementation is simple, but not efficient. That is OK,
// since it only runs while starting up.
double next_angle = -std::numeric_limits<double>::infinity();
for (int ring = 0; ring < num_lasers; ++ring) {
// find minimum remaining vertical offset correction
double min_seen = std::numeric_limits<double>::infinity();
int next_index = num_lasers;
for (int j = 0; j < num_lasers; ++j) {
double angle = calibration.laser_corrections[j].vert_correction;
if (next_angle < angle && angle < min_seen) {
min_seen = angle;
next_index = j;
}
}
if (next_index < num_lasers) { // anything found in this ring?
// store this ring number with its corresponding laser number
calibration.laser_corrections[next_index].laser_ring = ring;
next_angle = min_seen;
if (calibration.ros_info) {
ROS_INFO("laser_ring[%2u] = %2u, angle = %+.6f",
next_index, ring, next_angle);
}
}
}
}
YAML::Emitter& operator << (YAML::Emitter& out,
const std::pair<int, LaserCorrection> correction)
{
out << YAML::BeginMap;
out << YAML::Key << LASER_ID << YAML::Value << correction.first;
out << YAML::Key << ROT_CORRECTION <<
YAML::Value << correction.second.rot_correction;
out << YAML::Key << VERT_CORRECTION <<
YAML::Value << correction.second.vert_correction;
out << YAML::Key << DIST_CORRECTION <<
YAML::Value << correction.second.dist_correction;
out << YAML::Key << TWO_PT_CORRECTION_AVAILABLE <<
YAML::Value << correction.second.two_pt_correction_available;
out << YAML::Key << DIST_CORRECTION_X <<
YAML::Value << correction.second.dist_correction_x;
out << YAML::Key << DIST_CORRECTION_Y <<
YAML::Value << correction.second.dist_correction_y;
out << YAML::Key << VERT_OFFSET_CORRECTION <<
YAML::Value << correction.second.vert_offset_correction;
out << YAML::Key << HORIZ_OFFSET_CORRECTION <<
YAML::Value << correction.second.horiz_offset_correction;
out << YAML::Key << MAX_INTENSITY <<
YAML::Value << correction.second.max_intensity;
out << YAML::Key << MIN_INTENSITY <<
YAML::Value << correction.second.min_intensity;
out << YAML::Key << FOCAL_DISTANCE <<
YAML::Value << correction.second.focal_distance;
out << YAML::Key << FOCAL_SLOPE <<
YAML::Value << correction.second.focal_slope;
out << YAML::EndMap;
return out;
}
YAML::Emitter& operator <<
(YAML::Emitter& out, const Calibration& calibration)
{
out << YAML::BeginMap;
out << YAML::Key << NUM_LASERS <<
YAML::Value << calibration.laser_corrections.size();
out << YAML::Key << DISTANCE_RESOLUTION <<
YAML::Value << calibration.distance_resolution_m;
out << YAML::Key << LASERS << YAML::Value << YAML::BeginSeq;
for (std::map<int, LaserCorrection>::const_iterator
it = calibration.laser_corrections_map.begin();
it != calibration.laser_corrections_map.end(); it++)
{
out << *it;
}
out << YAML::EndSeq;
out << YAML::EndMap;
return out;
}
void Calibration::read(const std::string& calibration_file) {
std::ifstream fin(calibration_file.c_str());
if (!fin.is_open()) {
initialized = false;
return;
}
initialized = true;
try {
YAML::Node doc;
#ifdef HAVE_NEW_YAMLCPP
fin.close();
doc = YAML::LoadFile(calibration_file);
#else
YAML::Parser parser(fin);
parser.GetNextDocument(doc);
#endif
doc >> *this;
} catch (YAML::Exception &e) {
std::cerr << "YAML Exception: " << e.what() << std::endl;
initialized = false;
}
fin.close();
}
void Calibration::write(const std::string& calibration_file) {
std::ofstream fout(calibration_file.c_str());
YAML::Emitter out;
out << *this;
fout << out.c_str();
fout.close();
}
} /* velodyne_pointcloud */
@@ -0,0 +1,620 @@
/*
* Copyright (C) 2007 Austin Robot Technology, Patrick Beeson
* Copyright (C) 2009, 2010, 2012 Austin Robot Technology, Jack O'Quin
* Copyright (C) 2019, Kaarta Inc, Shawn Hanna
*
* License: Modified BSD Software License Agreement
*
* $Id$
*/
/**
* @file
*
* Velodyne 3D LIDAR data accessor class implementation.
*
* Class for unpacking raw Velodyne LIDAR packets into useful
* formats.
*
* Derived classes accept raw Velodyne data for either single packets
* or entire rotations, and provide it in various formats for either
* on-line or off-line processing.
*
* @author Patrick Beeson
* @author Jack O'Quin
* @author Shawn Hanna
*
* HDL-64E S2 calibration support provided by Nick Hillier
*/
#include <fstream>
#include <math.h>
#include <ros/ros.h>
#include <ros/package.h>
#include <angles/angles.h>
#include <velodyne_pointcloud/rawdata.h>
namespace velodyne_rawdata
{
inline float SQR(float val) { return val*val; }
////////////////////////////////////////////////////////////////////////
//
// RawData base class implementation
//
////////////////////////////////////////////////////////////////////////
RawData::RawData() {}
/** Update parameters: conversions and update */
void RawData::setParameters(double min_range,
double max_range,
double view_direction,
double view_width)
{
config_.min_range = min_range;
config_.max_range = max_range;
//converting angle parameters into the velodyne reference (rad)
config_.tmp_min_angle = view_direction + view_width/2;
config_.tmp_max_angle = view_direction - view_width/2;
//computing positive modulo to keep theses angles into [0;2*M_PI]
config_.tmp_min_angle = fmod(fmod(config_.tmp_min_angle,2*M_PI) + 2*M_PI,2*M_PI);
config_.tmp_max_angle = fmod(fmod(config_.tmp_max_angle,2*M_PI) + 2*M_PI,2*M_PI);
//converting into the hardware velodyne ref (negative yaml and degrees)
//adding 0.5 perfomrs a centered double to int conversion
config_.min_angle = 100 * (2*M_PI - config_.tmp_min_angle) * 180 / M_PI + 0.5;
config_.max_angle = 100 * (2*M_PI - config_.tmp_max_angle) * 180 / M_PI + 0.5;
if (config_.min_angle == config_.max_angle)
{
//avoid returning empty cloud if min_angle = max_angle
config_.min_angle = 0;
config_.max_angle = 36000;
}
}
int RawData::scansPerPacket() const
{
if( calibration_.num_lasers == 16)
{
return BLOCKS_PER_PACKET * VLP16_FIRINGS_PER_BLOCK *
VLP16_SCANS_PER_FIRING;
}
else{
return BLOCKS_PER_PACKET * SCANS_PER_BLOCK;
}
}
/**
* Build a timing table for each block/firing. Stores in timing_offsets vector
*/
bool RawData::buildTimings(){
// vlp16
if (config_.model == "VLP16"){
// timing table calculation, from velodyne user manual
timing_offsets.resize(12);
for (size_t i=0; i < timing_offsets.size(); ++i){
timing_offsets[i].resize(32);
}
// constants
double full_firing_cycle = 55.296 * 1e-6; // seconds
double single_firing = 2.304 * 1e-6; // seconds
double dataBlockIndex, dataPointIndex;
bool dual_mode = false;
// compute timing offsets
for (size_t x = 0; x < timing_offsets.size(); ++x){
for (size_t y = 0; y < timing_offsets[x].size(); ++y){
if (dual_mode){
dataBlockIndex = (x - (x % 2)) + (y / 16);
}
else{
dataBlockIndex = (x * 2) + (y / 16);
}
dataPointIndex = y % 16;
//timing_offsets[block][firing]
timing_offsets[x][y] = (full_firing_cycle * dataBlockIndex) + (single_firing * dataPointIndex);
}
}
}
// vlp32
else if (config_.model == "32C"){
// timing table calculation, from velodyne user manual
timing_offsets.resize(12);
for (size_t i=0; i < timing_offsets.size(); ++i){
timing_offsets[i].resize(32);
}
// constants
double full_firing_cycle = 55.296 * 1e-6; // seconds
double single_firing = 2.304 * 1e-6; // seconds
double dataBlockIndex, dataPointIndex;
bool dual_mode = false;
// compute timing offsets
for (size_t x = 0; x < timing_offsets.size(); ++x){
for (size_t y = 0; y < timing_offsets[x].size(); ++y){
if (dual_mode){
dataBlockIndex = x / 2;
}
else{
dataBlockIndex = x;
}
dataPointIndex = y / 2;
timing_offsets[x][y] = (full_firing_cycle * dataBlockIndex) + (single_firing * dataPointIndex);
}
}
}
// hdl32
else if (config_.model == "32E"){
// timing table calculation, from velodyne user manual
timing_offsets.resize(12);
for (size_t i=0; i < timing_offsets.size(); ++i){
timing_offsets[i].resize(32);
}
// constants
double full_firing_cycle = 46.080 * 1e-6; // seconds
double single_firing = 1.152 * 1e-6; // seconds
double dataBlockIndex, dataPointIndex;
bool dual_mode = false;
// compute timing offsets
for (size_t x = 0; x < timing_offsets.size(); ++x){
for (size_t y = 0; y < timing_offsets[x].size(); ++y){
if (dual_mode){
dataBlockIndex = x / 2;
}
else{
dataBlockIndex = x;
}
dataPointIndex = y / 2;
timing_offsets[x][y] = (full_firing_cycle * dataBlockIndex) + (single_firing * dataPointIndex);
}
}
}
else{
timing_offsets.clear();
ROS_WARN("Timings not supported for model %s", config_.model.c_str());
}
if (timing_offsets.size()){
// ROS_INFO("VELODYNE TIMING TABLE:");
for (size_t x = 0; x < timing_offsets.size(); ++x){
for (size_t y = 0; y < timing_offsets[x].size(); ++y){
printf("%04.3f ", timing_offsets[x][y] * 1e6);
}
printf("\n");
}
return true;
}
else{
ROS_WARN("NO TIMING OFFSETS CALCULATED. ARE YOU USING A SUPPORTED VELODYNE SENSOR?");
}
return false;
}
/** Set up for on-line operation. */
boost::optional<velodyne_pointcloud::Calibration> RawData::setup(ros::NodeHandle private_nh)
{
private_nh.param("model", config_.model, std::string("64E"));
buildTimings();
// get path to angles.config file for this device
if (!private_nh.getParam("calibration", config_.calibrationFile))
{
ROS_ERROR_STREAM("No calibration angles specified! Using test values!");
// have to use something: grab unit test version as a default
std::string pkgPath = ros::package::getPath("velodyne_pointcloud");
config_.calibrationFile = pkgPath + "/params/64e_utexas.yaml";
}
ROS_INFO_STREAM("correction angles: " << config_.calibrationFile);
calibration_.read(config_.calibrationFile);
if (!calibration_.initialized) {
ROS_ERROR_STREAM("Unable to open calibration file: " <<
config_.calibrationFile);
return boost::none;
}
ROS_INFO_STREAM("Number of lasers: " << calibration_.num_lasers << ".");
// Set up cached values for sin and cos of all the possible headings
for (uint16_t rot_index = 0; rot_index < ROTATION_MAX_UNITS; ++rot_index) {
float rotation = angles::from_degrees(ROTATION_RESOLUTION * rot_index);
cos_rot_table_[rot_index] = cosf(rotation);
sin_rot_table_[rot_index] = sinf(rotation);
}
return calibration_;
}
/** Set up for offline operation */
int RawData::setupOffline(std::string calibration_file, double max_range_, double min_range_)
{
config_.max_range = max_range_;
config_.min_range = min_range_;
ROS_INFO_STREAM("data ranges to publish: ["
<< config_.min_range << ", "
<< config_.max_range << "]");
config_.calibrationFile = calibration_file;
ROS_INFO_STREAM("correction angles: " << config_.calibrationFile);
calibration_.read(config_.calibrationFile);
if (!calibration_.initialized) {
ROS_ERROR_STREAM("Unable to open calibration file: " << config_.calibrationFile);
return -1;
}
// Set up cached values for sin and cos of all the possible headings
for (uint16_t rot_index = 0; rot_index < ROTATION_MAX_UNITS; ++rot_index) {
float rotation = angles::from_degrees(ROTATION_RESOLUTION * rot_index);
cos_rot_table_[rot_index] = cosf(rotation);
sin_rot_table_[rot_index] = sinf(rotation);
}
return 0;
}
/** @brief convert raw packet to point cloud
*
* @param pkt raw packet to unpack
* @param pc shared pointer to point cloud (points are appended)
*/
void RawData::unpack(const velodyne_msgs::VelodynePacket &pkt, DataContainerBase& data, const ros::Time& scan_start_time)
{
using velodyne_pointcloud::LaserCorrection;
ROS_DEBUG_STREAM("Received packet, time: " << pkt.stamp);
/** special parsing for the VLP16 **/
if (calibration_.num_lasers == 16)
{
unpack_vlp16(pkt, data, scan_start_time);
return;
}
float time_diff_start_to_this_packet = (pkt.stamp - scan_start_time).toSec();
const raw_packet_t *raw = (const raw_packet_t *) &pkt.data[0];
for (int i = 0; i < BLOCKS_PER_PACKET; i++) {
// upper bank lasers are numbered [0..31]
// NOTE: this is a change from the old velodyne_common implementation
int bank_origin = 0;
if (raw->blocks[i].header == LOWER_BANK) {
// lower bank lasers are [32..63]
bank_origin = 32;
}
for (int j = 0, k = 0; j < SCANS_PER_BLOCK; j++, k += RAW_SCAN_SIZE) {
float x, y, z;
float intensity;
const uint8_t laser_number = j + bank_origin;
float time = 0;
const LaserCorrection &corrections = calibration_.laser_corrections[laser_number];
/** Position Calculation */
const raw_block_t &block = raw->blocks[i];
union two_bytes tmp;
tmp.bytes[0] = block.data[k];
tmp.bytes[1] = block.data[k+1];
/*condition added to avoid calculating points which are not
in the interesting defined area (min_angle < area < max_angle)*/
if ((block.rotation >= config_.min_angle
&& block.rotation <= config_.max_angle
&& config_.min_angle < config_.max_angle)
||(config_.min_angle > config_.max_angle
&& (raw->blocks[i].rotation <= config_.max_angle
|| raw->blocks[i].rotation >= config_.min_angle))){
if (timing_offsets.size())
{
time = timing_offsets[i][j] + time_diff_start_to_this_packet;
}
if (tmp.uint == 0) // no valid laser beam return
{
// call to addPoint is still required since output could be organized
data.addPoint(nanf(""), nanf(""), nanf(""), corrections.laser_ring, raw->blocks[i].rotation, nanf(""), nanf(""), time);
continue;
}
float distance = tmp.uint * calibration_.distance_resolution_m;
distance += corrections.dist_correction;
float cos_vert_angle = corrections.cos_vert_correction;
float sin_vert_angle = corrections.sin_vert_correction;
float cos_rot_correction = corrections.cos_rot_correction;
float sin_rot_correction = corrections.sin_rot_correction;
// cos(a-b) = cos(a)*cos(b) + sin(a)*sin(b)
// sin(a-b) = sin(a)*cos(b) - cos(a)*sin(b)
float cos_rot_angle =
cos_rot_table_[block.rotation] * cos_rot_correction +
sin_rot_table_[block.rotation] * sin_rot_correction;
float sin_rot_angle =
sin_rot_table_[block.rotation] * cos_rot_correction -
cos_rot_table_[block.rotation] * sin_rot_correction;
float horiz_offset = corrections.horiz_offset_correction;
float vert_offset = corrections.vert_offset_correction;
// Compute the distance in the xy plane (w/o accounting for rotation)
/**the new term of 'vert_offset * sin_vert_angle'
* was added to the expression due to the mathemathical
* model we used.
*/
float xy_distance = distance * cos_vert_angle - vert_offset * sin_vert_angle;
// Calculate temporal X, use absolute value.
float xx = xy_distance * sin_rot_angle - horiz_offset * cos_rot_angle;
// Calculate temporal Y, use absolute value
float yy = xy_distance * cos_rot_angle + horiz_offset * sin_rot_angle;
if (xx < 0) xx=-xx;
if (yy < 0) yy=-yy;
// Get 2points calibration values,Linear interpolation to get distance
// correction for X and Y, that means distance correction use
// different value at different distance
float distance_corr_x = 0;
float distance_corr_y = 0;
if (corrections.two_pt_correction_available) {
distance_corr_x =
(corrections.dist_correction - corrections.dist_correction_x)
* (xx - 2.4) / (25.04 - 2.4)
+ corrections.dist_correction_x;
distance_corr_x -= corrections.dist_correction;
distance_corr_y =
(corrections.dist_correction - corrections.dist_correction_y)
* (yy - 1.93) / (25.04 - 1.93)
+ corrections.dist_correction_y;
distance_corr_y -= corrections.dist_correction;
}
float distance_x = distance + distance_corr_x;
/**the new term of 'vert_offset * sin_vert_angle'
* was added to the expression due to the mathemathical
* model we used.
*/
xy_distance = distance_x * cos_vert_angle - vert_offset * sin_vert_angle ;
///the expression wiht '-' is proved to be better than the one with '+'
x = xy_distance * sin_rot_angle - horiz_offset * cos_rot_angle;
float distance_y = distance + distance_corr_y;
xy_distance = distance_y * cos_vert_angle - vert_offset * sin_vert_angle ;
/**the new term of 'vert_offset * sin_vert_angle'
* was added to the expression due to the mathemathical
* model we used.
*/
y = xy_distance * cos_rot_angle + horiz_offset * sin_rot_angle;
// Using distance_y is not symmetric, but the velodyne manual
// does this.
/**the new term of 'vert_offset * cos_vert_angle'
* was added to the expression due to the mathemathical
* model we used.
*/
z = distance_y * sin_vert_angle + vert_offset*cos_vert_angle;
/** Use standard ROS coordinate system (right-hand rule) */
float x_coord = y;
float y_coord = -x;
float z_coord = z;
/** Intensity Calculation */
float min_intensity = corrections.min_intensity;
float max_intensity = corrections.max_intensity;
intensity = raw->blocks[i].data[k+2];
float focal_offset = 256
* (1 - corrections.focal_distance / 13100)
* (1 - corrections.focal_distance / 13100);
float focal_slope = corrections.focal_slope;
intensity += focal_slope * (std::abs(focal_offset - 256 *
SQR(1 - static_cast<float>(tmp.uint)/65535)));
intensity = (intensity < min_intensity) ? min_intensity : intensity;
intensity = (intensity > max_intensity) ? max_intensity : intensity;
data.addPoint(x_coord, y_coord, z_coord, corrections.laser_ring, raw->blocks[i].rotation, distance, intensity, time);
}
}
data.newLine();
}
}
/** @brief convert raw VLP16 packet to point cloud
*
* @param pkt raw packet to unpack
* @param pc shared pointer to point cloud (points are appended)
*/
void RawData::unpack_vlp16(const velodyne_msgs::VelodynePacket &pkt, DataContainerBase& data, const ros::Time& scan_start_time)
{
float azimuth;
float azimuth_diff;
int raw_azimuth_diff;
float last_azimuth_diff=0;
float azimuth_corrected_f;
int azimuth_corrected;
float x, y, z;
float intensity;
float time_diff_start_to_this_packet = (pkt.stamp - scan_start_time).toSec();
const raw_packet_t *raw = (const raw_packet_t *) &pkt.data[0];
for (int block = 0; block < BLOCKS_PER_PACKET; block++) {
// ignore packets with mangled or otherwise different contents
if (UPPER_BANK != raw->blocks[block].header) {
// Do not flood the log with messages, only issue at most one
// of these warnings per minute.
ROS_WARN_STREAM_THROTTLE(60, "skipping invalid VLP-16 packet: block "
<< block << " header value is "
<< raw->blocks[block].header);
return; // bad packet: skip the rest
}
// Calculate difference between current and next block's azimuth angle.
azimuth = (float)(raw->blocks[block].rotation);
if (block < (BLOCKS_PER_PACKET-1)){
raw_azimuth_diff = raw->blocks[block+1].rotation - raw->blocks[block].rotation;
azimuth_diff = (float)((36000 + raw_azimuth_diff)%36000);
// some packets contain an angle overflow where azimuth_diff < 0
if(raw_azimuth_diff < 0)//raw->blocks[block+1].rotation - raw->blocks[block].rotation < 0)
{
ROS_WARN_STREAM_THROTTLE(60, "Packet containing angle overflow, first angle: " << raw->blocks[block].rotation << " second angle: " << raw->blocks[block+1].rotation);
// if last_azimuth_diff was not zero, we can assume that the velodyne's speed did not change very much and use the same difference
if(last_azimuth_diff > 0){
azimuth_diff = last_azimuth_diff;
}
// otherwise we are not able to use this data
// TODO: we might just not use the second 16 firings
else{
continue;
}
}
last_azimuth_diff = azimuth_diff;
}else{
azimuth_diff = last_azimuth_diff;
}
for (int firing=0, k=0; firing < VLP16_FIRINGS_PER_BLOCK; firing++){
for (int dsr=0; dsr < VLP16_SCANS_PER_FIRING; dsr++, k+=RAW_SCAN_SIZE){
velodyne_pointcloud::LaserCorrection &corrections = calibration_.laser_corrections[dsr];
/** Position Calculation */
union two_bytes tmp;
tmp.bytes[0] = raw->blocks[block].data[k];
tmp.bytes[1] = raw->blocks[block].data[k+1];
/** correct for the laser rotation as a function of timing during the firings **/
azimuth_corrected_f = azimuth + (azimuth_diff * ((dsr*VLP16_DSR_TOFFSET) + (firing*VLP16_FIRING_TOFFSET)) / VLP16_BLOCK_TDURATION);
azimuth_corrected = ((int)round(azimuth_corrected_f)) % 36000;
/*condition added to avoid calculating points which are not
in the interesting defined area (min_angle < area < max_angle)*/
if ((azimuth_corrected >= config_.min_angle
&& azimuth_corrected <= config_.max_angle
&& config_.min_angle < config_.max_angle)
||(config_.min_angle > config_.max_angle
&& (azimuth_corrected <= config_.max_angle
|| azimuth_corrected >= config_.min_angle))){
// convert polar coordinates to Euclidean XYZ
float distance = tmp.uint * calibration_.distance_resolution_m;
distance += corrections.dist_correction;
float cos_vert_angle = corrections.cos_vert_correction;
float sin_vert_angle = corrections.sin_vert_correction;
float cos_rot_correction = corrections.cos_rot_correction;
float sin_rot_correction = corrections.sin_rot_correction;
// cos(a-b) = cos(a)*cos(b) + sin(a)*sin(b)
// sin(a-b) = sin(a)*cos(b) - cos(a)*sin(b)
float cos_rot_angle =
cos_rot_table_[azimuth_corrected] * cos_rot_correction +
sin_rot_table_[azimuth_corrected] * sin_rot_correction;
float sin_rot_angle =
sin_rot_table_[azimuth_corrected] * cos_rot_correction -
cos_rot_table_[azimuth_corrected] * sin_rot_correction;
float horiz_offset = corrections.horiz_offset_correction;
float vert_offset = corrections.vert_offset_correction;
// Compute the distance in the xy plane (w/o accounting for rotation)
/**the new term of 'vert_offset * sin_vert_angle'
* was added to the expression due to the mathemathical
* model we used.
*/
float xy_distance = distance * cos_vert_angle - vert_offset * sin_vert_angle;
// Calculate temporal X, use absolute value.
float xx = xy_distance * sin_rot_angle - horiz_offset * cos_rot_angle;
// Calculate temporal Y, use absolute value
float yy = xy_distance * cos_rot_angle + horiz_offset * sin_rot_angle;
if (xx < 0) xx=-xx;
if (yy < 0) yy=-yy;
// Get 2points calibration values,Linear interpolation to get distance
// correction for X and Y, that means distance correction use
// different value at different distance
float distance_corr_x = 0;
float distance_corr_y = 0;
if (corrections.two_pt_correction_available) {
distance_corr_x =
(corrections.dist_correction - corrections.dist_correction_x)
* (xx - 2.4) / (25.04 - 2.4)
+ corrections.dist_correction_x;
distance_corr_x -= corrections.dist_correction;
distance_corr_y =
(corrections.dist_correction - corrections.dist_correction_y)
* (yy - 1.93) / (25.04 - 1.93)
+ corrections.dist_correction_y;
distance_corr_y -= corrections.dist_correction;
}
float distance_x = distance + distance_corr_x;
/**the new term of 'vert_offset * sin_vert_angle'
* was added to the expression due to the mathemathical
* model we used.
*/
xy_distance = distance_x * cos_vert_angle - vert_offset * sin_vert_angle ;
x = xy_distance * sin_rot_angle - horiz_offset * cos_rot_angle;
float distance_y = distance + distance_corr_y;
/**the new term of 'vert_offset * sin_vert_angle'
* was added to the expression due to the mathemathical
* model we used.
*/
xy_distance = distance_y * cos_vert_angle - vert_offset * sin_vert_angle ;
y = xy_distance * cos_rot_angle + horiz_offset * sin_rot_angle;
// Using distance_y is not symmetric, but the velodyne manual
// does this.
/**the new term of 'vert_offset * cos_vert_angle'
* was added to the expression due to the mathemathical
* model we used.
*/
z = distance_y * sin_vert_angle + vert_offset*cos_vert_angle;
/** Use standard ROS coordinate system (right-hand rule) */
float x_coord = y;
float y_coord = -x;
float z_coord = z;
/** Intensity Calculation */
float min_intensity = corrections.min_intensity;
float max_intensity = corrections.max_intensity;
intensity = raw->blocks[block].data[k+2];
float focal_offset = 256 * SQR(1 - corrections.focal_distance / 13100);
float focal_slope = corrections.focal_slope;
intensity += focal_slope * (std::abs(focal_offset - 256 *
SQR(1 - tmp.uint/65535)));
intensity = (intensity < min_intensity) ? min_intensity : intensity;
intensity = (intensity > max_intensity) ? max_intensity : intensity;
float time = 0;
if (timing_offsets.size())
time = timing_offsets[block][firing * 16 + dsr] + time_diff_start_to_this_packet;
data.addPoint(x_coord, y_coord, z_coord, corrections.laser_ring, azimuth_corrected, distance, intensity, time);
}
}
data.newLine();
}
}
}
} // namespace velodyne_rawdata
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,52 @@
### Unit tests
#
# Only configured when CATKIN_ENABLE_TESTING is true.
# these dependencies are only needed for unit testing
find_package(roslaunch REQUIRED)
find_package(rostest REQUIRED)
find_package(tf2_ros REQUIRED)
# C++ gtests
catkin_add_gtest(test_calibration test_calibration.cpp)
add_dependencies(test_calibration ${catkin_EXPORTED_TARGETS})
target_link_libraries(test_calibration velodyne_rawdata ${catkin_LIBRARIES})
# Download packet capture (PCAP) files containing test data.
# Store them in devel-space, so rostest can easily find them.
catkin_download_test_data(
${PROJECT_NAME}_tests_class.pcap
http://download.ros.org/data/velodyne/class.pcap
DESTINATION ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_SHARE_DESTINATION}/tests
MD5 65808d25772101358a3719b451b3d015)
catkin_download_test_data(
${PROJECT_NAME}_tests_32e.pcap
http://download.ros.org/data/velodyne/32e.pcap
DESTINATION ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_SHARE_DESTINATION}/tests
MD5 e41d02aac34f0967c03a5597e1d554a9)
catkin_download_test_data(
${PROJECT_NAME}_tests_64e_s2.1-300-sztaki.pcap
http://download.ros.org/data/velodyne/64e_s2.1-300-sztaki.pcap
DESTINATION ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_SHARE_DESTINATION}/tests
MD5 176c900ffb698f9b948a13e281ffc1a2)
catkin_download_test_data(
${PROJECT_NAME}_tests_vlp16.pcap
http://download.ros.org/data/velodyne/vlp16.pcap
DESTINATION ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_SHARE_DESTINATION}/tests
MD5 f45c2bb1d7ee358274e423ea3b66fd73)
# run rostests
add_rostest(cloud_node_hz.test)
add_rostest(cloud_nodelet_hz.test)
add_rostest(cloud_node_32e_hz.test)
add_rostest(cloud_nodelet_32e_hz.test)
add_rostest(cloud_node_64e_s2.1_hz.test)
add_rostest(cloud_nodelet_64e_s2.1_hz.test)
add_rostest(cloud_node_vlp16_hz.test)
add_rostest(cloud_nodelet_vlp16_hz.test)
add_rostest(transform_node_hz.test)
add_rostest(transform_nodelet_hz.test)
add_rostest(two_nodelet_managers.test)
# parse check all the launch/*.launch files
roslaunch_add_file_check(../launch)
@@ -0,0 +1,835 @@
num_lasers: 64
distance_resolution: 0.002
lasers:
- laser_id: 0
rot_correction: -0.122173048555851
vert_correction: -0.401850968599319
dist_correction: 0.119999997317791
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 1
rot_correction: -0.0610865242779255
vert_correction: -0.39391815662384
dist_correction: 0.0199999995529652
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 2
rot_correction: 0.0959931090474129
vert_correction: -0.200955957174301
dist_correction: 0.100000001490116
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 3
rot_correction: 0.148352980613708
vert_correction: -0.188023120164871
dist_correction: 0.230000004172325
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 4
rot_correction: -0.00872664619237185
vert_correction: -0.384992778301239
dist_correction: 0.170000001788139
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 5
rot_correction: 0.0610865242779255
vert_correction: -0.379074156284332
dist_correction: 0.150000005960464
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 6
rot_correction: -0.0174532923847437
vert_correction: -0.445288896560669
dist_correction: 0.0500000007450581
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 7
rot_correction: 0.0349065847694874
vert_correction: -0.43470174074173
dist_correction: 0.270000010728836
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 8
rot_correction: 0.122173048555851
vert_correction: -0.3671615421772
dist_correction: 0.180000007152557
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 9
rot_correction: 0.174532920122147
vert_correction: -0.357254236936569
dist_correction: 0.189999997615814
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 10
rot_correction: 0.104719758033752
vert_correction: -0.423742026090622
dist_correction: 0.100000001490116
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 11
rot_correction: 0.165806278586388
vert_correction: -0.414792060852051
dist_correction: 0.200000002980232
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 12
rot_correction: -0.113446399569511
vert_correction: -0.288992017507553
dist_correction: 0.219999998807907
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 13
rot_correction: -0.0567231997847557
vert_correction: -0.28310164809227
dist_correction: 0.200000002980232
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 14
rot_correction: -0.13962633907795
vert_correction: -0.347351551055908
dist_correction: 0.150000005960464
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 15
rot_correction: -0.0872664600610733
vert_correction: -0.332452714443207
dist_correction: 0.219999998807907
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 16
rot_correction: 0
vert_correction: -0.274210214614868
dist_correction: 0.0599999986588955
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 17
rot_correction: 0.0558505356311798
vert_correction: -0.266317009925842
dist_correction: 0.129999995231628
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 18
rot_correction: -0.0174532923847437
vert_correction: -0.331895291805267
dist_correction: 0.00999999977648258
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 19
rot_correction: 0.0349065847694874
vert_correction: -0.323663860559464
dist_correction: 0.150000005960464
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 20
rot_correction: 0.122173048555851
vert_correction: -0.256421387195587
dist_correction: 0.200000002980232
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 21
rot_correction: 0.165806278586388
vert_correction: -0.244522526860237
dist_correction: 0.239999994635582
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 22
rot_correction: 0.104719758033752
vert_correction: -0.31077241897583
dist_correction: 0.180000007152557
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 23
rot_correction: 0.157079637050629
vert_correction: -0.302882075309753
dist_correction: 0.219999998807907
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 24
rot_correction: -0.104719758033752
vert_correction: -0.180082052946091
dist_correction: 0.140000000596046
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 25
rot_correction: -0.0610865242779255
vert_correction: -0.172132045030594
dist_correction: 0.319999992847443
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 26
rot_correction: -0.13962633907795
vert_correction: -0.235619828104973
dist_correction: 0.200000002980232
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 27
rot_correction: -0.0785398185253143
vert_correction: -0.228712558746338
dist_correction: 0.25
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 28
rot_correction: 0
vert_correction: -0.16517236828804
dist_correction: 0.170000001788139
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 29
rot_correction: 0.0436332300305367
vert_correction: -0.154202222824097
dist_correction: 0.230000004172325
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 30
rot_correction: -0.0174532923847437
vert_correction: -0.219799935817719
dist_correction: 0.150000005960464
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 31
rot_correction: 0.0314159244298935
vert_correction: -0.21088133752346
dist_correction: 0.230000004172325
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 32
rot_correction: -0.0698131695389748
vert_correction: -0.121932752430439
dist_correction: 0.100000001490116
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 33
rot_correction: -0.0392699092626572
vert_correction: -0.113993428647518
dist_correction: 0.280000001192093
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 34
rot_correction: 0.0698131695389748
vert_correction: 0.0055470340885222
dist_correction: 0.319999992847443
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 35
rot_correction: 0.104719758033752
vert_correction: 0.0114863449707627
dist_correction: 0.230000004172325
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 36
rot_correction: 0.013962633907795
vert_correction: -0.109056323766708
dist_correction: 0.0700000002980232
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 37
rot_correction: 0.0392699092626572
vert_correction: -0.104121200740337
dist_correction: 0.0900000035762787
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 38
rot_correction: 0
vert_correction: -0.14471623301506
dist_correction: 0.119999997317791
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 39
rot_correction: 0.0226892791688442
vert_correction: -0.1387659907341
dist_correction: 0.200000002980232
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 40
rot_correction: 0.0820304751396179
vert_correction: -0.0981878563761711
dist_correction: 0.129999995231628
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 41
rot_correction: 0.113446399569511
vert_correction: -0.0952560678124428
dist_correction: 0.159999996423721
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 42
rot_correction: 0.0698131695389748
vert_correction: -0.132818818092346
dist_correction: 0.159999996423721
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 43
rot_correction: 0.104719758033752
vert_correction: -0.127874463796616
dist_correction: 0.159999996423721
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 44
rot_correction: -0.068067841231823
vert_correction: -0.05375986546278
dist_correction: 0.129999995231628
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 45
rot_correction: -0.0349065847694874
vert_correction: -0.0478330813348293
dist_correction: 0.200000002980232
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 46
rot_correction: -0.0837758108973503
vert_correction: -0.0893256440758705
dist_correction: 0.170000001788139
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 47
rot_correction: -0.0479965545237064
vert_correction: -0.0833963677287102
dist_correction: 0.239999994635582
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 48
rot_correction: 0.00872664619237185
vert_correction: -0.0419059917330742
dist_correction: 0.180000007152557
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 49
rot_correction: 0.0392699092626572
vert_correction: -0.035978376865387
dist_correction: 0.0599999986588955
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 50
rot_correction: 0
vert_correction: -0.0774680152535439
dist_correction: 0.140000000596046
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 51
rot_correction: 0.0305432621389627
vert_correction: -0.0715404152870178
dist_correction: 0.150000005960464
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 52
rot_correction: 0.0855211317539215
vert_correction: -0.0300500374287367
dist_correction: 0.219999998807907
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 53
rot_correction: 0.109083078801632
vert_correction: -0.024120757356286
dist_correction: 0.140000000596046
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 54
rot_correction: 0.0698131695389748
vert_correction: -0.0656133219599724
dist_correction: 0.0799999982118607
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 55
rot_correction: 0.104719758033752
vert_correction: -0.0596865378320217
dist_correction: 0.159999996423721
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 56
rot_correction: -0.0610865242779255
vert_correction: 0.0174280721694231
dist_correction: 0.119999997317791
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 57
rot_correction: -0.0349065847694874
vert_correction: 0.0233724191784859
dist_correction: 0.219999998807907
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 58
rot_correction: -0.0785398185253143
vert_correction: -0.0181903336197138
dist_correction: 0.159999996423721
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 59
rot_correction: -0.0471238903701305
vert_correction: -0.0122585473582149
dist_correction: 0.259999990463257
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 60
rot_correction: 0.0104719763621688
vert_correction: 0.0293195936828852
dist_correction: 0.140000000596046
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 61
rot_correction: 0.0349065847694874
vert_correction: 0.0352698266506195
dist_correction: 0.219999998807907
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 62
rot_correction: -0.00436332309618592
vert_correction: -0.00632520206272602
dist_correction: 0.209999993443489
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
- laser_id: 63
rot_correction: 0.0296705979853868
vert_correction: -0.000390077300835401
dist_correction: 0.140000000596046
two_pt_correction_available: false
dist_correction_x: 0
dist_correction_y: 0
vert_offset_correction: 0
vert_offset_correction: 0
max_intensity: 255
min_intensity: 0
focal_distance: 0
focal_slope: 0
@@ -0,0 +1,258 @@
lasers:
- {dist_correction: 0.100000001490116, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 0, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0698131695389748, two_pt_correction_available: false, vert_correction: -0.124932751059532,
vert_offset_correction: 0}
- {dist_correction: 0.280000001192093, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 1, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0392699092626572, two_pt_correction_available: false, vert_correction: -0.118993431329727,
vert_offset_correction: 0}
- {dist_correction: 0.319999992847443, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 2, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0698131695389748, two_pt_correction_available: false, vert_correction: 0.0055470340885222,
vert_offset_correction: 0}
- {dist_correction: 0.230000004172325, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 3, max_intensity: 255, min_intensity: 0,
rot_correction: 0.104719758033752, two_pt_correction_available: false, vert_correction: 0.0114863449707627,
vert_offset_correction: 0}
- {dist_correction: 0.0700000002980232, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 4, max_intensity: 255, min_intensity: 0,
rot_correction: 0.013962633907795, two_pt_correction_available: false, vert_correction: -0.113056324422359,
vert_offset_correction: 0}
- {dist_correction: 0.0900000035762787, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 5, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0392699092626572, two_pt_correction_available: false, vert_correction: -0.107121199369431,
vert_offset_correction: 0}
- {dist_correction: 0.119999997317791, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 6, max_intensity: 255, min_intensity: 0,
rot_correction: 0, two_pt_correction_available: false, vert_correction: -0.148716226220131,
vert_offset_correction: 0}
- {dist_correction: 0.200000002980232, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 7, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0226892791688442, two_pt_correction_available: false, vert_correction: -0.142765983939171,
vert_offset_correction: 0}
- {dist_correction: 0.129999995231628, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 8, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0820304751396179, two_pt_correction_available: false, vert_correction: -0.101187855005264,
vert_offset_correction: 0}
- {dist_correction: 0.159999996423721, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 9, max_intensity: 255, min_intensity: 0,
rot_correction: 0.113446399569511, two_pt_correction_available: false, vert_correction: -0.0952560678124428,
vert_offset_correction: 0}
- {dist_correction: 0.159999996423721, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 10, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0698131695389748, two_pt_correction_available: false, vert_correction: -0.136818811297417,
vert_offset_correction: 0}
- {dist_correction: 0.159999996423721, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 11, max_intensity: 255, min_intensity: 0,
rot_correction: 0.104719758033752, two_pt_correction_available: false, vert_correction: -0.130874469876289,
vert_offset_correction: 0}
- {dist_correction: 0.129999995231628, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 12, max_intensity: 255, min_intensity: 0,
rot_correction: -0.068067841231823, two_pt_correction_available: false, vert_correction: -0.05375986546278,
vert_offset_correction: 0}
- {dist_correction: 0.200000002980232, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 13, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0349065847694874, two_pt_correction_available: false, vert_correction: -0.0478330813348293,
vert_offset_correction: 0}
- {dist_correction: 0.170000001788139, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 14, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0837758108973503, two_pt_correction_available: false, vert_correction: -0.0893256440758705,
vert_offset_correction: 0}
- {dist_correction: 0.239999994635582, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 15, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0479965545237064, two_pt_correction_available: false, vert_correction: -0.0833963677287102,
vert_offset_correction: 0}
- {dist_correction: 0.180000007152557, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 16, max_intensity: 255, min_intensity: 0,
rot_correction: 0.00872664619237185, two_pt_correction_available: false, vert_correction: -0.0419059917330742,
vert_offset_correction: 0}
- {dist_correction: 0.0599999986588955, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 17, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0392699092626572, two_pt_correction_available: false, vert_correction: -0.035978376865387,
vert_offset_correction: 0}
- {dist_correction: 0.140000000596046, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 18, max_intensity: 255, min_intensity: 0,
rot_correction: 0, two_pt_correction_available: false, vert_correction: -0.0774680152535439,
vert_offset_correction: 0}
- {dist_correction: 0.150000005960464, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 19, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0305432621389627, two_pt_correction_available: false, vert_correction: -0.0715404152870178,
vert_offset_correction: 0}
- {dist_correction: 0.219999998807907, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 20, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0855211317539215, two_pt_correction_available: false, vert_correction: -0.0300500374287367,
vert_offset_correction: 0}
- {dist_correction: 0.140000000596046, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 21, max_intensity: 255, min_intensity: 0,
rot_correction: 0.109083078801632, two_pt_correction_available: false, vert_correction: -0.024120757356286,
vert_offset_correction: 0}
- {dist_correction: 0.0799999982118607, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 22, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0698131695389748, two_pt_correction_available: false, vert_correction: -0.0656133219599724,
vert_offset_correction: 0}
- {dist_correction: 0.159999996423721, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 23, max_intensity: 255, min_intensity: 0,
rot_correction: 0.104719758033752, two_pt_correction_available: false, vert_correction: -0.0596865378320217,
vert_offset_correction: 0}
- {dist_correction: 0.119999997317791, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 24, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0610865242779255, two_pt_correction_available: false, vert_correction: 0.0174280721694231,
vert_offset_correction: 0}
- {dist_correction: 0.219999998807907, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 25, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0349065847694874, two_pt_correction_available: false, vert_correction: 0.0233724191784859,
vert_offset_correction: 0}
- {dist_correction: 0.159999996423721, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 26, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0785398185253143, two_pt_correction_available: false, vert_correction: -0.0181903336197138,
vert_offset_correction: 0}
- {dist_correction: 0.259999990463257, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 27, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0471238903701305, two_pt_correction_available: false, vert_correction: -0.0122585473582149,
vert_offset_correction: 0}
- {dist_correction: 0.140000000596046, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 28, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0104719763621688, two_pt_correction_available: false, vert_correction: 0.0293195936828852,
vert_offset_correction: 0}
- {dist_correction: 0.219999998807907, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 29, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0349065847694874, two_pt_correction_available: false, vert_correction: 0.0352698266506195,
vert_offset_correction: 0}
- {dist_correction: 0.209999993443489, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 30, max_intensity: 255, min_intensity: 0,
rot_correction: -0.00436332309618592, two_pt_correction_available: false, vert_correction: -0.00632520206272602,
vert_offset_correction: 0}
- {dist_correction: 0.140000000596046, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 31, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0296705979853868, two_pt_correction_available: false, vert_correction: -0.000390077300835401,
vert_offset_correction: 0}
- {dist_correction: 0.119999997317791, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 32, max_intensity: 255, min_intensity: 0,
rot_correction: -0.122173048555851, two_pt_correction_available: false, vert_correction: -0.396850973367691,
vert_offset_correction: 0}
- {dist_correction: 0.0199999995529652, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 33, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0610865242779255, two_pt_correction_available: false, vert_correction: -0.387918144464493,
vert_offset_correction: 0}
- {dist_correction: 0.100000001490116, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 34, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0959931090474129, two_pt_correction_available: false, vert_correction: -0.200955957174301,
vert_offset_correction: 0}
- {dist_correction: 0.230000004172325, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 35, max_intensity: 255, min_intensity: 0,
rot_correction: 0.148352980613708, two_pt_correction_available: false, vert_correction: -0.192023113369942,
vert_offset_correction: 0}
- {dist_correction: 0.170000001788139, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 36, max_intensity: 255, min_intensity: 0,
rot_correction: -0.00872664619237185, two_pt_correction_available: false, vert_correction: -0.378992766141891,
vert_offset_correction: 0}
- {dist_correction: 0.150000005960464, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 37, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0610865242779255, two_pt_correction_available: false, vert_correction: -0.370074152946472,
vert_offset_correction: 0}
- {dist_correction: 0.0500000007450581, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 38, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0174532923847437, two_pt_correction_available: false, vert_correction: -0.43128889799118,
vert_offset_correction: 0}
- {dist_correction: 0.270000010728836, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 39, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0349065847694874, two_pt_correction_available: false, vert_correction: -0.423701733350754,
vert_offset_correction: 0}
- {dist_correction: 0.180000007152557, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 40, max_intensity: 255, min_intensity: 0,
rot_correction: 0.122173048555851, two_pt_correction_available: false, vert_correction: -0.361161530017853,
vert_offset_correction: 0}
- {dist_correction: 0.189999997615814, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 41, max_intensity: 255, min_intensity: 0,
rot_correction: 0.174532920122147, two_pt_correction_available: false, vert_correction: -0.352254241704941,
vert_offset_correction: 0}
- {dist_correction: 0.100000001490116, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 42, max_intensity: 255, min_intensity: 0,
rot_correction: 0.104719758033752, two_pt_correction_available: false, vert_correction: -0.414742022752762,
vert_offset_correction: 0}
- {dist_correction: 0.200000002980232, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 43, max_intensity: 255, min_intensity: 0,
rot_correction: 0.165806278586388, two_pt_correction_available: false, vert_correction: -0.405792057514191,
vert_offset_correction: 0}
- {dist_correction: 0.219999998807907, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 44, max_intensity: 255, min_intensity: 0,
rot_correction: -0.113446399569511, two_pt_correction_available: false, vert_correction: -0.28999200463295,
vert_offset_correction: 0}
- {dist_correction: 0.200000002980232, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 45, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0567231997847557, two_pt_correction_available: false, vert_correction: -0.281101644039154,
vert_offset_correction: 0}
- {dist_correction: 0.150000005960464, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 46, max_intensity: 255, min_intensity: 0,
rot_correction: -0.13962633907795, two_pt_correction_available: false, vert_correction: -0.343351542949677,
vert_offset_correction: 0}
- {dist_correction: 0.219999998807907, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 47, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0872664600610733, two_pt_correction_available: false, vert_correction: -0.334452718496323,
vert_offset_correction: 0}
- {dist_correction: 0.0599999986588955, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 48, max_intensity: 255, min_intensity: 0,
rot_correction: 0, two_pt_correction_available: false, vert_correction: -0.272210210561752,
vert_offset_correction: 0}
- {dist_correction: 0.129999995231628, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 49, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0558505356311798, two_pt_correction_available: false, vert_correction: -0.26331701874733,
vert_offset_correction: 0}
- {dist_correction: 0.00999999977648258, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 50, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0174532923847437, two_pt_correction_available: false, vert_correction: -0.323895305395126,
vert_offset_correction: 0}
- {dist_correction: 0.150000005960464, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 51, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0349065847694874, two_pt_correction_available: false, vert_correction: -0.316663861274719,
vert_offset_correction: 0}
- {dist_correction: 0.200000002980232, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 52, max_intensity: 255, min_intensity: 0,
rot_correction: 0.122173048555851, two_pt_correction_available: false, vert_correction: -0.254421383142471,
vert_offset_correction: 0}
- {dist_correction: 0.239999994635582, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 53, max_intensity: 255, min_intensity: 0,
rot_correction: 0.165806278586388, two_pt_correction_available: false, vert_correction: -0.245522528886795,
vert_offset_correction: 0}
- {dist_correction: 0.180000007152557, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 54, max_intensity: 255, min_intensity: 0,
rot_correction: 0.104719758033752, two_pt_correction_available: false, vert_correction: -0.307772427797318,
vert_offset_correction: 0}
- {dist_correction: 0.219999998807907, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 55, max_intensity: 255, min_intensity: 0,
rot_correction: 0.157079637050629, two_pt_correction_available: false, vert_correction: -0.298882067203522,
vert_offset_correction: 0}
- {dist_correction: 0.140000000596046, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 56, max_intensity: 255, min_intensity: 0,
rot_correction: -0.104719758033752, two_pt_correction_available: false, vert_correction: -0.183082059025764,
vert_offset_correction: 0}
- {dist_correction: 0.319999992847443, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 57, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0610865242779255, two_pt_correction_available: false, vert_correction: -0.17413204908371,
vert_offset_correction: 0}
- {dist_correction: 0.200000002980232, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 58, max_intensity: 255, min_intensity: 0,
rot_correction: -0.13962633907795, two_pt_correction_available: false, vert_correction: -0.236619830131531,
vert_offset_correction: 0}
- {dist_correction: 0.25, dist_correction_x: 0, dist_correction_y: 0, focal_distance: 0,
focal_slope: 0, laser_id: 59, max_intensity: 255, min_intensity: 0, rot_correction: -0.0785398185253143,
two_pt_correction_available: false, vert_correction: -0.22771255671978, vert_offset_correction: 0}
- {dist_correction: 0.170000001788139, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 60, max_intensity: 255, min_intensity: 0,
rot_correction: 0, two_pt_correction_available: false, vert_correction: -0.16517236828804,
vert_offset_correction: 0}
- {dist_correction: 0.230000004172325, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 61, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0436332300305367, two_pt_correction_available: false, vert_correction: -0.156202226877213,
vert_offset_correction: 0}
- {dist_correction: 0.150000005960464, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 62, max_intensity: 255, min_intensity: 0,
rot_correction: -0.0174532923847437, two_pt_correction_available: false, vert_correction: -0.218799933791161,
vert_offset_correction: 0}
- {dist_correction: 0.230000004172325, dist_correction_x: 0, dist_correction_y: 0,
focal_distance: 0, focal_slope: 0, laser_id: 63, max_intensity: 255, min_intensity: 0,
rot_correction: 0.0314159244298935, two_pt_correction_available: false, vert_correction: -0.209881335496902,
vert_offset_correction: 0}
num_lasers: 64
distance_resolution: 0.002
@@ -0,0 +1,28 @@
<!-- -*- mode: XML -*- -->
<!-- rostest of reading Velodyne 32E PCAP files -->
<launch>
<!-- start driver with example PCAP file -->
<node pkg="velodyne_driver" type="velodyne_node" name="velodyne_node">
<param name="model" value="32E"/>
<param name="pcap" value="$(find velodyne_pointcloud)/tests/32e.pcap"/>
</node>
<!-- start cloud node with test calibration file -->
<node pkg="velodyne_pointcloud" type="cloud_node" name="cloud_node">
<param name="calibration"
value="$(find velodyne_pointcloud)/params/32db.yaml"/>
</node>
<!-- verify PointCloud2 publication rate -->
<test test-name="cloud_node_32e_hz_test" pkg="rostest"
type="hztest" name="hztest_cloud_node_32e" >
<param name="hz" value="10.0" />
<param name="hzerror" value="3.0" />
<param name="test_duration" value="5.0" />
<param name="topic" value="velodyne_points" />
<param name="wait_time" value="2.0" />
</test>
</launch>
@@ -0,0 +1,29 @@
<!-- -*- mode: XML -*- -->
<!-- rostest of reading Velodyne 64E S2.1 PCAP files -->
<launch>
<!-- start driver with example PCAP file -->
<node pkg="velodyne_driver" type="velodyne_node" name="velodyne_node">
<param name="model" value="64E_S2.1"/>
<param name="pcap" value="$(find velodyne_pointcloud)/tests/64e_s2.1-300-sztaki.pcap"/>
<param name="rpm" value="300"/>
</node>
<!-- start cloud node with test calibration file -->
<node pkg="velodyne_pointcloud" type="cloud_node" name="cloud_node">
<param name="calibration"
value="$(find velodyne_pointcloud)/params/64e_s2.1-sztaki.yaml"/>
</node>
<!-- verify PointCloud2 publication rate -->
<test test-name="cloud_node_64e_s21_hz_test" pkg="rostest"
type="hztest" name="hztest_cloud_node_64e_s21" >
<param name="hz" value="5.0" />
<param name="hzerror" value="2.0" />
<param name="test_duration" value="5.0" />
<param name="topic" value="velodyne_points" />
<param name="wait_time" value="2.0" />
</test>
</launch>
@@ -0,0 +1,27 @@
<!-- -*- mode: XML -*- -->
<!-- rostest of reading Velodyne 64E PCAP files -->
<launch>
<!-- start driver with example PCAP file -->
<node pkg="velodyne_driver" type="velodyne_node" name="velodyne_node">
<param name="pcap" value="$(find velodyne_pointcloud)/tests/class.pcap"/>
</node>
<!-- start cloud node with test calibration file -->
<node pkg="velodyne_pointcloud" type="cloud_node" name="cloud_node">
<param name="calibration"
value="$(find velodyne_pointcloud)/params/64e_utexas.yaml"/>
</node>
<!-- verify PointCloud2 publication rate -->
<test test-name="cloud_node_hz_test" pkg="rostest"
type="hztest" name="hztest_cloud_node_64e" >
<param name="hz" value="10.0" />
<param name="hzerror" value="3.0" />
<param name="test_duration" value="5.0" />
<param name="topic" value="velodyne_points" />
<param name="wait_time" value="2.0" />
</test>
</launch>
@@ -0,0 +1,28 @@
<!-- -*- mode: XML -*- -->
<!-- rostest of reading Velodyne VLP16 PCAP files -->
<launch>
<!-- start driver with example PCAP file -->
<node pkg="velodyne_driver" type="velodyne_node" name="velodyne_node">
<param name="model" value="VLP16"/>
<param name="pcap" value="$(find velodyne_pointcloud)/tests/vlp16.pcap"/>
</node>
<!-- start cloud node with test calibration file -->
<node pkg="velodyne_pointcloud" type="cloud_node" name="cloud_node">
<param name="calibration"
value="$(find velodyne_pointcloud)/params/VLP16db.yaml"/>
</node>
<!-- verify PointCloud2 publication rate -->
<test test-name="cloud_node_vlp16_hz_test" pkg="rostest"
type="hztest" name="hztest_cloud_node_vlp16">
<param name="hz" value="10.0" />
<param name="hzerror" value="3.0" />
<param name="test_duration" value="5.0" />
<param name="topic" value="velodyne_points" />
<param name="wait_time" value="2.0" />
</test>
</launch>
@@ -0,0 +1,22 @@
<!-- -*- mode: XML -*- -->
<!-- rostest of publishing a PointCloud from PCAP data. -->
<launch>
<!-- start nodelet manager, driver and cloud nodelets -->
<include file="$(find velodyne_pointcloud)/launch/32e_points.launch">
<arg name="frame_id" value="test_frame"/>
<arg name="pcap" value="$(find velodyne_pointcloud)/tests/32e.pcap"/>
</include>
<!-- verify PointCloud2 publication rate -->
<test test-name="cloud_nodelet_32e_hz_test" pkg="rostest"
type="hztest" name="hztest_cloud_nodelet_32e" >
<param name="hz" value="10.0" />
<param name="hzerror" value="3.0" />
<param name="test_duration" value="5.0" />
<param name="topic" value="velodyne_points" />
<param name="wait_time" value="2.0" />
</test>
</launch>
@@ -0,0 +1,29 @@
<!-- -*- mode: XML -*- -->
<!-- rostest of publishing a PointCloud from 64E S2.1 PCAP data. -->
<launch>
<!-- start nodelet manager and driver nodelets -->
<include file="$(find velodyne_driver)/launch/nodelet_manager.launch">
<arg name="model" value="64E_S2.1"/>
<arg name="pcap" value="$(find velodyne_pointcloud)/tests/64e_s2.1-300-sztaki.pcap"/>
<arg name="rpm" value="300"/>
</include>
<!-- start cloud nodelet using test calibration file -->
<include file="$(find velodyne_pointcloud)/launch/cloud_nodelet.launch">
<arg name="calibration"
value="$(find velodyne_pointcloud)/params/64e_s2.1-sztaki.yaml"/>
</include>
<!-- verify PointCloud2 publication rate -->
<test test-name="cloud_nodelet_64e_s21_hz_test" pkg="rostest"
type="hztest" name="hztest_cloud_nodelet_64e_s21" >
<param name="hz" value="5.0" />
<param name="hzerror" value="1.0" />
<param name="test_duration" value="5.0" />
<param name="topic" value="velodyne_points" />
<param name="wait_time" value="2.0" />
</test>
</launch>
@@ -0,0 +1,32 @@
<!-- -*- mode: XML -*- -->
<!-- rostest of publishing a PointCloud from PCAP data.
Uses rostest, because a running roscore is required.
$Id$
-->
<launch>
<!-- start nodelet manager and driver nodelets -->
<include file="$(find velodyne_driver)/launch/nodelet_manager.launch">
<arg name="pcap" value="$(find velodyne_pointcloud)/tests/class.pcap"/>
</include>
<!-- start cloud nodelet using test calibration file -->
<include file="$(find velodyne_pointcloud)/launch/cloud_nodelet.launch">
<arg name="calibration"
value="$(find velodyne_pointcloud)/params/64e_utexas.yaml"/>
</include>
<!-- verify PointCloud2 publication rate -->
<test test-name="cloud_nodelet_hz_test" pkg="rostest"
type="hztest" name="hztest_cloud_nodelet_64e" >
<param name="hz" value="10.0" />
<param name="hzerror" value="3.0" />
<param name="test_duration" value="5.0" />
<param name="topic" value="velodyne_points" />
<param name="wait_time" value="2.0" />
</test>
</launch>
@@ -0,0 +1,22 @@
<!-- -*- mode: XML -*- -->
<!-- rostest of publishing a PointCloud from PCAP data. -->
<launch>
<!-- start nodelet manager, driver and cloud nodelets -->
<include file="$(find velodyne_pointcloud)/launch/VLP16_points.launch">
<arg name="frame_id" value="test_frame"/>
<arg name="pcap" value="$(find velodyne_pointcloud)/tests/vlp16.pcap"/>
</include>
<!-- verify PointCloud2 publication rate -->
<test test-name="cloud_nodelet_vlp16_hz_test" pkg="rostest"
type="hztest" name="hztest_cloud_nodelet_vlp16" >
<param name="hz" value="10.0" />
<param name="hzerror" value="3.0" />
<param name="test_duration" value="5.0" />
<param name="topic" value="velodyne_points" />
<param name="wait_time" value="2.0" />
</test>
</launch>
@@ -0,0 +1,240 @@
# test data from an HDL-64E S2 containing float min_intensity values
# causes issue #84 failure
lasers:
- {dist_correction: 1.1897507, dist_correction_x: 1.2184412, dist_correction_y: 1.1993269,
focal_distance: 22.5, focal_slope: 1.1, horiz_offset_correction: 0.025999999, laser_id: 0,
min_intensity: 40.0, rot_correction: -0.08193448173487379, vert_correction: -0.12118950050089745,
vert_offset_correction: 0.21533014000000003}
- {dist_correction: 1.4128801999999998, dist_correction_x: 1.4313695000000002, dist_correction_y: 1.4312958,
focal_distance: 24.0, focal_slope: 0.80000001, horiz_offset_correction: -0.025999999,
laser_id: 1, min_intensity: 40.0, rot_correction: -0.04631400641637322, vert_correction: -0.1154246814722187,
vert_offset_correction: 0.21490976}
- {dist_correction: 1.352054, dist_correction_x: 1.3625516, dist_correction_y: 1.3604144,
focal_distance: 22.0, focal_slope: 1.15, horiz_offset_correction: 0.025999999, laser_id: 2,
min_intensity: 40.0, rot_correction: 0.05367805144003262, vert_correction: 0.007649359057937743,
vert_offset_correction: 0.20602308000000003}
- {dist_correction: 1.3877103, dist_correction_x: 1.4052618000000001, dist_correction_y: 1.4102048999999999,
focal_distance: 21.0, focal_slope: 1.2, horiz_offset_correction: -0.025999999, laser_id: 3,
min_intensity: 20.0, rot_correction: 0.09201863985105889, vert_correction: 0.01508908679395137,
vert_offset_correction: 0.20548805000000003}
- {dist_correction: 1.2740263, dist_correction_x: 1.2988675, dist_correction_y: 1.2487833000000002,
focal_distance: 24.0, focal_slope: 1.4, horiz_offset_correction: 0.025999999, laser_id: 4,
min_intensity: 10.0, rot_correction: -0.007693320585669901, vert_correction: -0.1102984033676868,
vert_offset_correction: 0.21453644000000002}
- {dist_correction: 1.2418116000000001, dist_correction_x: 1.252481, dist_correction_y: 1.2255676,
focal_distance: 24.0, focal_slope: 1.38, horiz_offset_correction: -0.025999999,
laser_id: 5, min_intensity: 28.0, rot_correction: 0.032006458688310216, vert_correction: -0.10399361088436754,
vert_offset_correction: 0.21407784}
- {dist_correction: 1.3176793, dist_correction_x: 1.3353647000000002, dist_correction_y: 1.3361707999999999,
focal_distance: 24.0, focal_slope: 1.2, horiz_offset_correction: 0.025999999, laser_id: 6,
min_intensity: 40.0, rot_correction: -0.021861479338351635, vert_correction: -0.14544533071754853,
vert_offset_correction: 0.21710571}
- {dist_correction: 1.3708466000000001, dist_correction_x: 1.3905527000000002, dist_correction_y: 1.3970328,
focal_distance: 24.0, focal_slope: 0.89999998, horiz_offset_correction: -0.025999999,
laser_id: 7, min_intensity: 40.0, rot_correction: 0.01761759781572604, vert_correction: -0.139035509555832,
vert_offset_correction: 0.21663536}
- {dist_correction: 1.2544352, dist_correction_x: 1.2857481000000002, dist_correction_y: 1.2282503,
focal_distance: 24.0, focal_slope: 1.22, horiz_offset_correction: 0.025999999, laser_id: 8,
min_intensity: 40.0, rot_correction: 0.06658719948349573, vert_correction: -0.09889517252673422,
vert_offset_correction: 0.21370745}
- {dist_correction: 1.3738158999999999, dist_correction_x: 1.3938158000000003, dist_correction_y: 1.3844524000000002,
focal_distance: 24.0, focal_slope: 1.15, horiz_offset_correction: -0.025999999,
laser_id: 9, min_intensity: 40.0, rot_correction: 0.10588806804896926, vert_correction: -0.09225143361201914,
vert_offset_correction: 0.21322533}
- {dist_correction: 1.3156921, dist_correction_x: 1.3354019, dist_correction_y: 1.2833449,
focal_distance: 24.0, focal_slope: 1.3200001, horiz_offset_correction: 0.025999999,
laser_id: 10, min_intensity: 40.0, rot_correction: 0.052778260906800954, vert_correction: -0.134421316289823,
vert_offset_correction: 0.2162973}
- {dist_correction: 1.3696194, dist_correction_x: 1.3846521, dist_correction_y: 1.3639107000000001,
focal_distance: 20.0, focal_slope: 1.25, horiz_offset_correction: -0.025999999,
laser_id: 11, min_intensity: 40.0, rot_correction: 0.09284370411236641, vert_correction: -0.12714737563412706,
vert_offset_correction: 0.21576523000000003}
- {dist_correction: 1.2275657, dist_correction_x: 1.2543072, dist_correction_y: 1.2294422,
focal_distance: 24.0, focal_slope: 1.0700001, horiz_offset_correction: 0.025999999,
laser_id: 12, min_intensity: 40.0, rot_correction: -0.08319450648038783, vert_correction: -0.0502394945048745,
vert_offset_correction: 0.21018864}
- {dist_correction: 1.3757889, dist_correction_x: 1.3849341999999998, dist_correction_y: 1.3686421000000002,
focal_distance: 24.0, focal_slope: 1.4, horiz_offset_correction: -0.025999999, laser_id: 13,
min_intensity: 40.0, rot_correction: -0.04344974309026683, vert_correction: -0.04379427282993976,
vert_offset_correction: 0.20972416}
- {dist_correction: 1.3319664, dist_correction_x: 1.3705452, dist_correction_y: 1.3209669,
focal_distance: 24.0, focal_slope: 1.05, horiz_offset_correction: 0.025999999, laser_id: 14,
min_intensity: 40.0, rot_correction: -0.09661677957860802, vert_correction: -0.08535601123784947,
vert_offset_correction: 0.21272558}
- {dist_correction: 1.3714989, dist_correction_x: 1.3624129999999999, dist_correction_y: 1.3403807,
focal_distance: 24.0, focal_slope: 1.4, horiz_offset_correction: -0.025999999, laser_id: 15,
min_intensity: 40.0, rot_correction: -0.056929933194385184, vert_correction: -0.07898063589425029,
vert_offset_correction: 0.21226404}
- {dist_correction: 1.2595838000000001, dist_correction_x: 1.2785926, dist_correction_y: 1.2370594,
focal_distance: 24.0, focal_slope: 1.4, horiz_offset_correction: 0.025999999, laser_id: 16,
min_intensity: 40.0, rot_correction: -0.008102055927068873, vert_correction: -0.03910078576535417,
vert_offset_correction: 0.20938608}
- {dist_correction: 1.3786241000000001, dist_correction_x: 1.3948055, dist_correction_y: 1.3862044,
focal_distance: 24.0, focal_slope: 1.4, horiz_offset_correction: -0.025999999, laser_id: 17,
min_intensity: 40.0, rot_correction: 0.03149012048240021, vert_correction: -0.03191447983673011,
vert_offset_correction: 0.20886870999999999}
- {dist_correction: 1.3628464, dist_correction_x: 1.3785178, dist_correction_y: 1.3152992000000001,
focal_distance: 20.5, focal_slope: 1.2, horiz_offset_correction: 0.025999999, laser_id: 18,
min_intensity: 10.0, rot_correction: -0.021944024685324706, vert_correction: -0.07495714058693254,
vert_offset_correction: 0.21197302}
- {dist_correction: 1.394641, dist_correction_x: 1.3899173999999999, dist_correction_y: 1.370442,
focal_distance: 24.0, focal_slope: 1.4, horiz_offset_correction: -0.025999999, laser_id: 19,
min_intensity: 10.0, rot_correction: 0.01766883719190609, vert_correction: -0.06771695808962866,
vert_offset_correction: 0.21144976000000001}
- {dist_correction: 1.2123122, dist_correction_x: 1.2413981, dist_correction_y: 1.2070784,
focal_distance: 23.5, focal_slope: 1.1, horiz_offset_correction: 0.025999999, laser_id: 20,
min_intensity: 5.0, rot_correction: 0.06651143299533739, vert_correction: -0.027462144914892576,
vert_offset_correction: 0.20854828000000003}
- {dist_correction: 1.2599731, dist_correction_x: 1.2764229, dist_correction_y: 1.2986679,
focal_distance: 21.0, focal_slope: 1.2, horiz_offset_correction: -0.025999999, laser_id: 21,
min_intensity: 5.0, rot_correction: 0.10511566735251142, vert_correction: -0.020434314882349612,
vert_offset_correction: 0.20804264}
- {dist_correction: 1.3053941, dist_correction_x: 1.3411044, dist_correction_y: 1.2835222,
focal_distance: 24.0, focal_slope: 1.42, horiz_offset_correction: 0.025999999, laser_id: 22,
min_intensity: 30.0, rot_correction: 0.052657269447064954, vert_correction: -0.06262826041455072,
vert_offset_correction: 0.21108229}
- {dist_correction: 1.2550185, dist_correction_x: 1.2702521, dist_correction_y: 1.2836005000000001,
focal_distance: 24.0, focal_slope: 1.4, horiz_offset_correction: -0.025999999, laser_id: 23,
min_intensity: 40.0, rot_correction: 0.09175727679557273, vert_correction: -0.05606926072567847,
vert_offset_correction: 0.21060900000000002}
- {dist_correction: 1.2748341, dist_correction_x: 1.3196121, dist_correction_y: 1.2784751,
focal_distance: 20.5, focal_slope: 1.25, horiz_offset_correction: 0.025999999, laser_id: 24,
min_intensity: 10.0, rot_correction: -0.08344753035270795, vert_correction: 0.020524792750772996,
vert_offset_correction: 0.20509708000000001}
- {dist_correction: 1.3777713, dist_correction_x: 1.3645123000000001, dist_correction_y: 1.3802203,
focal_distance: 24.0, focal_slope: 1.3, horiz_offset_correction: -0.025999999, laser_id: 25,
max_intensity: 230.0, rot_correction: -0.04351660490858147, vert_correction: 0.02702150163864157,
vert_offset_correction: 0.20462966999999999}
- {dist_correction: 1.3718602000000002, dist_correction_x: 1.4046102999999999, dist_correction_y: 1.3834868,
focal_distance: 19.0, focal_slope: 1.35, horiz_offset_correction: 0.025999999, laser_id: 26,
max_intensity: 245.0, rot_correction: -0.09689230074498635, vert_correction: -0.014916840599137901,
vert_offset_correction: 0.2076458}
- {dist_correction: 1.3833778, dist_correction_x: 1.375231, dist_correction_y: 1.3606032,
focal_distance: 24.0, focal_slope: 1.4, horiz_offset_correction: -0.025999999, laser_id: 27,
max_intensity: 240.0, rot_correction: -0.057451870416535586, vert_correction: -0.00817206789015045,
vert_offset_correction: 0.20716073999999998}
- {dist_correction: 1.2951183000000002, dist_correction_x: 1.3258408, dist_correction_y: 1.2997318999999998,
focal_distance: 24.0, focal_slope: 1.4, horiz_offset_correction: 0.025999999, laser_id: 28,
max_intensity: 240.0, rot_correction: -0.008271954654038412, vert_correction: 0.032168250709970085,
vert_offset_correction: 0.20425926}
- {dist_correction: 1.4026823, dist_correction_x: 1.4151775000000002, dist_correction_y: 1.4065117,
focal_distance: 24.0, focal_slope: 1.05, horiz_offset_correction: -0.025999999,
laser_id: 29, rot_correction: 0.03059445241686176, vert_correction: 0.03821143404637868,
vert_offset_correction: 0.2038242}
- {dist_correction: 1.3756502000000002, dist_correction_x: 1.3986545000000001, dist_correction_y: 1.3567966000000002,
focal_distance: 24.0, focal_slope: 1.37, horiz_offset_correction: 0.025999999, laser_id: 30,
rot_correction: -0.022168507188386963, vert_correction: -0.003020972948984465, vert_offset_correction: 0.20679033000000002}
- {dist_correction: 1.4303774999999999, dist_correction_x: 1.4219699000000001, dist_correction_y: 1.4110721000000002,
focal_distance: 24.0, focal_slope: 1.38, horiz_offset_correction: -0.025999999,
laser_id: 31, rot_correction: 0.017020332183059567, vert_correction: 0.0032341127317709376,
vert_offset_correction: 0.20634056}
- {dist_correction: 1.2299187999999999, dist_correction_x: 1.221242, dist_correction_y: 1.159202,
focal_distance: 12.8, focal_slope: 2.0, horiz_offset_correction: 0.025999999, laser_id: 32,
rot_correction: -0.13428924897065386, vert_correction: -0.3917846862503118, vert_offset_correction: 0.15982219}
- {dist_correction: 1.3144859, dist_correction_x: 1.3336081, dist_correction_y: 1.3461792,
focal_distance: 0.25, focal_slope: 1.02, horiz_offset_correction: -0.025999999,
laser_id: 33, rot_correction: -0.07421947892390637, vert_correction: -0.3836205247016729,
vert_offset_correction: 0.15923027}
- {dist_correction: 1.2725937999999999, dist_correction_x: 1.2842772, dist_correction_y: 1.3025389,
focal_distance: 0.25, focal_slope: 0.94999999, horiz_offset_correction: 0.025999999,
laser_id: 34, rot_correction: 0.08138446391038806, vert_correction: -0.1992609420279063,
vert_offset_correction: 0.14669841}
- {dist_correction: 1.3357777, dist_correction_x: 1.3343283, dist_correction_y: 1.3631558000000001,
focal_distance: 9.0, focal_slope: 1.5, horiz_offset_correction: -0.025999999, laser_id: 35,
rot_correction: 0.1383208914749199, vert_correction: -0.18701489169116567, vert_offset_correction: 0.14590834}
- {dist_correction: 1.1742934, dist_correction_x: 1.2244499, dist_correction_y: 1.1818057,
focal_distance: 10.8, focal_slope: 1.38, horiz_offset_correction: 0.025999999, laser_id: 36,
rot_correction: -0.013445351586919306, vert_correction: -0.37738235143590226, vert_offset_correction: 0.15878062}
- {dist_correction: 1.090762, dist_correction_x: 1.1042352, dist_correction_y: 1.0975322,
focal_distance: 12.5, focal_slope: 1.55, horiz_offset_correction: -0.025999999,
laser_id: 37, rot_correction: 0.04734804593033903, vert_correction: -0.3673083633532685,
vert_offset_correction: 0.15805914}
- {dist_correction: 1.2801097, dist_correction_x: 1.2734876, dist_correction_y: 1.2697346,
focal_distance: 6.0, focal_slope: 1.1, horiz_offset_correction: 0.025999999, laser_id: 38,
rot_correction: -0.03680020095578886, vert_correction: -0.4294796616630621, vert_offset_correction: 0.16260902000000002}
- {dist_correction: 1.2865338, dist_correction_x: 1.2686511, dist_correction_y: 1.29416,
focal_distance: 0.25, focal_slope: 1.0, horiz_offset_correction: -0.025999999, laser_id: 39,
rot_correction: 0.025992554995433074, vert_correction: -0.42099842614921335, vert_offset_correction: 0.16197392000000002}
- {dist_correction: 1.2932777, dist_correction_x: 1.3400191000000001, dist_correction_y: 1.3263618,
focal_distance: 0.25, focal_slope: 1.02, horiz_offset_correction: 0.025999999, laser_id: 40,
rot_correction: 0.10601307725664336, vert_correction: -0.3565455112681652, vert_offset_correction: 0.15729448}
- {dist_correction: 1.2614787, dist_correction_x: 1.2626826, dist_correction_y: 1.267609,
focal_distance: 8.5, focal_slope: 1.65, horiz_offset_correction: -0.025999999, laser_id: 41,
rot_correction: 0.16733068965072595, vert_correction: -0.3479014190818128, vert_offset_correction: 0.15668478}
- {dist_correction: 1.2428966, dist_correction_x: 1.2460679000000001, dist_correction_y: 1.2397518,
focal_distance: 0.25, focal_slope: 1.2, horiz_offset_correction: 0.025999999, laser_id: 42,
rot_correction: 0.08594727468321833, vert_correction: -0.4110102035460227, vert_offset_correction: 0.16123213}
- {dist_correction: 1.3061783, dist_correction_x: 1.2655383, dist_correction_y: 1.2857359,
focal_distance: 10.0, focal_slope: 1.6799999, horiz_offset_correction: -0.025999999,
laser_id: 43, rot_correction: 0.1464050331680134, vert_correction: -0.4015579191962419,
vert_offset_correction: 0.16053604}
- {dist_correction: 1.2317036000000001, dist_correction_x: 1.2393882, dist_correction_y: 1.2123593,
focal_distance: 12.5, focal_slope: 2.0, horiz_offset_correction: 0.025999999, laser_id: 44,
rot_correction: -0.13261467013054762, vert_correction: -0.2838808920696538, vert_offset_correction: 0.1522797}
- {dist_correction: 1.2567677000000002, dist_correction_x: 1.2904861, dist_correction_y: 1.2915567,
focal_distance: 0.25, focal_slope: 0.47999999, horiz_offset_correction: -0.025999999,
laser_id: 45, rot_correction: -0.07009130400404175, vert_correction: -0.276291415083819,
vert_offset_correction: 0.15176907}
- {dist_correction: 1.2793438000000001, dist_correction_x: 1.2915629999999998, dist_correction_y: 1.2718159,
focal_distance: 12.0, focal_slope: 2.0, horiz_offset_correction: 0.025999999, laser_id: 46,
rot_correction: -0.15533259824081613, vert_correction: -0.33574467724289675, vert_offset_correction: 0.15583374}
- {dist_correction: 1.2330788, dist_correction_x: 1.2624972, dist_correction_y: 1.2636649,
focal_distance: 2.0, focal_slope: 0.89999998, horiz_offset_correction: -0.025999999,
laser_id: 47, rot_correction: -0.09347288483573485, vert_correction: -0.3300846093852642,
vert_offset_correction: 0.15543998}
- {dist_correction: 1.1445625, dist_correction_x: 1.2045525000000001, dist_correction_y: 1.1558383,
focal_distance: 23.2, focal_slope: 0.75, horiz_offset_correction: 0.025999999, laser_id: 48,
rot_correction: -0.014086204897792162, vert_correction: -0.2692770589931014, vert_offset_correction: 0.15129910000000002}
- {dist_correction: 1.2741866, dist_correction_x: 1.2946111, dist_correction_y: 1.2808211,
focal_distance: 18.0, focal_slope: 0.92000002, horiz_offset_correction: -0.025999999,
laser_id: 49, rot_correction: 0.04602459591980752, vert_correction: -0.25952585210233153,
vert_offset_correction: 0.15064875}
- {dist_correction: 1.2584636, dist_correction_x: 1.2985907, dist_correction_y: 1.2481342,
focal_distance: 15.8, focal_slope: 1.28, horiz_offset_correction: 0.025999999, laser_id: 50,
rot_correction: -0.035928232716163244, vert_correction: -0.3234839312338543, vert_offset_correction: 0.1549827}
- {dist_correction: 1.1207238, dist_correction_x: 1.1458776000000002, dist_correction_y: 1.1290197000000002,
focal_distance: 18.0, focal_slope: 0.89999998, horiz_offset_correction: -0.025999999,
laser_id: 51, rot_correction: 0.025398581053735863, vert_correction: -0.3141198558244693,
vert_offset_correction: 0.15433743}
- {dist_correction: 1.3357715, dist_correction_x: 1.3748308, dist_correction_y: 1.3750087,
focal_distance: 2.2, focal_slope: 0.64999998, horiz_offset_correction: 0.025999999,
laser_id: 52, rot_correction: 0.10206324357040601, vert_correction: -0.2503763474711867,
vert_offset_correction: 0.15004159}
- {dist_correction: 1.2831325000000002, dist_correction_x: 1.2906917000000002, dist_correction_y: 1.3047183000000002,
focal_distance: 8.2, focal_slope: 1.65, horiz_offset_correction: -0.025999999, laser_id: 53,
rot_correction: 0.16118048446991431, vert_correction: -0.2388694789792507, vert_offset_correction: 0.14928201}
- {dist_correction: 1.4319325, dist_correction_x: 1.470513, dist_correction_y: 1.4623492,
focal_distance: 6.0, focal_slope: 0.51999998, horiz_offset_correction: 0.025999999,
laser_id: 54, rot_correction: 0.08241589764778065, vert_correction: -0.30499605989320633,
vert_offset_correction: 0.15371249}
- {dist_correction: 1.2852434, dist_correction_x: 1.2985229, dist_correction_y: 1.271758,
focal_distance: 12.5, focal_slope: 2.0, horiz_offset_correction: -0.025999999, laser_id: 55,
rot_correction: 0.142266131454566, vert_correction: -0.2947717466020984, vert_offset_correction: 0.15301642}
- {dist_correction: 1.4007397000000001, dist_correction_x: 1.4001398, dist_correction_y: 1.3912132,
focal_distance: 8.5, focal_slope: 1.7, horiz_offset_correction: 0.025999999, laser_id: 56,
rot_correction: -0.12786652808043583, vert_correction: -0.17641617036891985, vert_offset_correction: 0.14522751}
- {dist_correction: 1.2880724000000001, dist_correction_x: 1.3014014, dist_correction_y: 1.3205367000000001,
focal_distance: 0.25, focal_slope: 1.2, horiz_offset_correction: -0.025999999, laser_id: 57,
rot_correction: -0.07017803115990259, vert_correction: -0.17070459784506095, vert_offset_correction: 0.14486169000000002}
- {dist_correction: 1.4760434, dist_correction_x: 1.4308182, dist_correction_y: 1.4627808,
focal_distance: 11.5, focal_slope: 2.0, horiz_offset_correction: 0.025999999, laser_id: 58,
rot_correction: -0.15113763829712393, vert_correction: -0.2281125435603116, vert_offset_correction: 0.14857577}
- {dist_correction: 1.303936, dist_correction_x: 1.3230009, dist_correction_y: 1.3335196,
focal_distance: 0.25, focal_slope: 0.64999998, horiz_offset_correction: -0.025999999,
laser_id: 59, rot_correction: -0.0918767934520908, vert_correction: -0.2232191988430801,
vert_offset_correction: 0.14825568}
- {dist_correction: 1.3472046, dist_correction_x: 1.3541069, dist_correction_y: 1.3651146,
focal_distance: 3.5, focal_slope: 1.38, horiz_offset_correction: 0.025999999, laser_id: 60,
rot_correction: -0.013572408240338915, vert_correction: -0.16291245497181386, vert_offset_correction: 0.14436376}
- {dist_correction: 1.3001047000000001, dist_correction_x: 1.3096320000000001, dist_correction_y: 1.3519560000000002,
focal_distance: 3.5, focal_slope: 1.35, horiz_offset_correction: -0.025999999, laser_id: 61,
rot_correction: 0.04349449333228796, vert_correction: -0.1540625535600664, vert_offset_correction: 0.14379979}
- {dist_correction: 1.2880972, dist_correction_x: 1.2842999000000002, dist_correction_y: 1.2916876,
focal_distance: 12.0, focal_slope: 1.35, horiz_offset_correction: 0.025999999, laser_id: 62,
rot_correction: -0.03466167345792974, vert_correction: -0.21484439350701803, vert_offset_correction: 0.14770949}
- {dist_correction: 1.3186316, dist_correction_x: 1.3250179, dist_correction_y: 1.3431560999999999,
focal_distance: 10.5, focal_slope: 0.60000002, horiz_offset_correction: -0.025999999,
laser_id: 63, rot_correction: 0.02351688573662471, vert_correction: -0.20683046990039078,
vert_offset_correction: 0.14718871}
num_lasers: 64
distance_resolution: 0.002
@@ -0,0 +1,23 @@
<!-- -*- mode: XML -*- -->
<!-- define transforms for testing static vehicle sensors -->
<launch>
<!-- publish /vehicle -> /velodyne transform -->
<node pkg="tf2_ros" type="static_transform_publisher"
name="vehicle_velodyne_tf"
args="0.393 0.278 2.4 -0.02155 0.0164 0.00621 vehicle velodyne" />
<!-- publish identity /odom -> /vehicle transform
(for viewing sensor data for a static vehicle) -->
<node pkg="tf2_ros" type="static_transform_publisher"
name="vehicle_is_odom"
args="0 0 0 0 0 0 odom vehicle" />
<!-- publish identity /map -> /odom transform
(for viewing sensor data for a static vehicle) -->
<node pkg="tf2_ros" type="static_transform_publisher"
name="map_to_odom"
args="0 0 0 0 0 0 map odom" />
</launch>
@@ -0,0 +1,195 @@
// Copyright (C) 2012, 2019 Austin Robot Technology, Jack O'Quin, Joshua Whitley
// All rights reserved.
//
// Software License Agreement (BSD License 2.0)
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
// * Neither the name of {copyright_holder} nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
#include <gtest/gtest.h>
#include <ros/package.h>
#include <velodyne_pointcloud/calibration.h>
#include <string>
using namespace velodyne_pointcloud; // NOLINT
// global test data
std::string g_package_name("velodyne_pointcloud");
std::string g_package_path;
void init_global_data(void)
{
g_package_path = ros::package::getPath(g_package_name);
}
///////////////////////////////////////////////////////////////
// Test cases
///////////////////////////////////////////////////////////////
TEST(Calibration, missing_file)
{
Calibration calibration(false);
calibration.read("./no_such_file.yaml");
EXPECT_FALSE(calibration.initialized);
}
TEST(Calibration, vlp16)
{
Calibration calibration(g_package_path + "/params/VLP16db.yaml", false);
EXPECT_TRUE(calibration.initialized);
ASSERT_EQ(calibration.num_lasers, 16);
// check some values for the first laser:
LaserCorrection laser = calibration.laser_corrections[0];
EXPECT_FALSE(laser.two_pt_correction_available);
EXPECT_FLOAT_EQ(laser.vert_correction, -0.2617993877991494);
EXPECT_FLOAT_EQ(laser.horiz_offset_correction, 0.0);
EXPECT_EQ(laser.max_intensity, 255);
EXPECT_EQ(laser.min_intensity, 0);
// check similar values for the last laser:
laser = calibration.laser_corrections[15];
EXPECT_FALSE(laser.two_pt_correction_available);
EXPECT_FLOAT_EQ(laser.vert_correction, 0.2617993877991494);
EXPECT_FLOAT_EQ(laser.horiz_offset_correction, 0.0);
EXPECT_EQ(laser.max_intensity, 255);
EXPECT_EQ(laser.min_intensity, 0);
}
TEST(Calibration, hdl32e)
{
Calibration calibration(g_package_path + "/params/32db.yaml", false);
EXPECT_TRUE(calibration.initialized);
ASSERT_EQ(calibration.num_lasers, 32);
// check some values for the first laser:
LaserCorrection laser = calibration.laser_corrections[0];
EXPECT_FALSE(laser.two_pt_correction_available);
EXPECT_FLOAT_EQ(laser.vert_correction, -0.5352924815866609);
EXPECT_FLOAT_EQ(laser.horiz_offset_correction, 0.0);
EXPECT_EQ(laser.max_intensity, 255);
EXPECT_EQ(laser.min_intensity, 0);
// check similar values for the last laser:
laser = calibration.laser_corrections[31];
EXPECT_FALSE(laser.two_pt_correction_available);
EXPECT_FLOAT_EQ(laser.vert_correction, 0.18622663118779495);
EXPECT_FLOAT_EQ(laser.horiz_offset_correction, 0.0);
EXPECT_EQ(laser.max_intensity, 255);
EXPECT_EQ(laser.min_intensity, 0);
}
TEST(Calibration, hdl64e)
{
Calibration calibration(g_package_path + "/params/64e_utexas.yaml", false);
EXPECT_TRUE(calibration.initialized);
ASSERT_EQ(calibration.num_lasers, 64);
// check some values for the first laser:
LaserCorrection laser = calibration.laser_corrections[0];
EXPECT_FALSE(laser.two_pt_correction_available);
EXPECT_FLOAT_EQ(laser.vert_correction, -0.124932751059532);
EXPECT_FLOAT_EQ(laser.horiz_offset_correction, 0.0);
EXPECT_EQ(laser.max_intensity, 255);
EXPECT_EQ(laser.min_intensity, 0);
// check similar values for the last laser:
laser = calibration.laser_corrections[63];
EXPECT_FALSE(laser.two_pt_correction_available);
EXPECT_FLOAT_EQ(laser.vert_correction, -0.209881335496902);
EXPECT_FLOAT_EQ(laser.horiz_offset_correction, 0.0);
EXPECT_EQ(laser.max_intensity, 255);
EXPECT_EQ(laser.min_intensity, 0);
}
TEST(Calibration, hdl64e_s21)
{
Calibration calibration(g_package_path + "/params/64e_s2.1-sztaki.yaml",
false);
EXPECT_TRUE(calibration.initialized);
ASSERT_EQ(calibration.num_lasers, 64);
// check some values for the first laser:
LaserCorrection laser = calibration.laser_corrections[0];
EXPECT_FALSE(laser.two_pt_correction_available);
EXPECT_FLOAT_EQ(laser.vert_correction, -0.15304134919741974);
EXPECT_FLOAT_EQ(laser.horiz_offset_correction, 0.025999999);
EXPECT_EQ(laser.max_intensity, 235);
EXPECT_EQ(laser.min_intensity, 30);
// check similar values for the last laser:
laser = calibration.laser_corrections[63];
EXPECT_FALSE(laser.two_pt_correction_available);
EXPECT_FLOAT_EQ(laser.vert_correction, -0.2106649408137298);
EXPECT_FLOAT_EQ(laser.horiz_offset_correction, -0.025999999);
EXPECT_EQ(laser.max_intensity, 255);
EXPECT_EQ(laser.min_intensity, 0);
}
TEST(Calibration, hdl64e_s2_float_intensities)
{
Calibration calibration(g_package_path +
"/tests/issue_84_float_intensities.yaml",
false);
EXPECT_TRUE(calibration.initialized);
ASSERT_EQ(calibration.num_lasers, 64);
// check some values for the first laser:
LaserCorrection laser = calibration.laser_corrections[0];
EXPECT_FALSE(laser.two_pt_correction_available);
EXPECT_FLOAT_EQ(laser.vert_correction, -0.12118950050089745);
EXPECT_FLOAT_EQ(laser.horiz_offset_correction, 0.025999999);
EXPECT_EQ(laser.max_intensity, 255);
EXPECT_EQ(laser.min_intensity, 40);
// check similar values for laser 26:
laser = calibration.laser_corrections[26];
EXPECT_FALSE(laser.two_pt_correction_available);
EXPECT_FLOAT_EQ(laser.vert_correction, -0.014916840599137901);
EXPECT_FLOAT_EQ(laser.horiz_offset_correction, 0.025999999);
EXPECT_EQ(laser.max_intensity, 245);
EXPECT_EQ(laser.min_intensity, 0);
// check similar values for the last laser:
laser = calibration.laser_corrections[63];
EXPECT_FALSE(laser.two_pt_correction_available);
EXPECT_FLOAT_EQ(laser.vert_correction, -0.20683046990039078);
EXPECT_FLOAT_EQ(laser.horiz_offset_correction, -0.025999999);
EXPECT_EQ(laser.max_intensity, 255);
EXPECT_EQ(laser.min_intensity, 0);
}
// Run all the tests that were declared with TEST()
int main(int argc, char **argv)
{
testing::InitGoogleTest(&argc, argv);
init_global_data();
return RUN_ALL_TESTS();
}
@@ -0,0 +1,906 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="4">
<DB class_id="0" tracking_level="1" version="0" object_id="_0">
<points_ class_id="7" tracking_level="0" version="0">
<count>64</count>
<item_version>1</item_version>
<item class_id="8" tracking_level="0" version="1">
<px class_id="9" tracking_level="1" version="1" object_id="_1">
<id_>0</id_>
<rotCorrection_>-5.3328056</rotCorrection_>
<vertCorrection_>-7.2988362</vertCorrection_>
<distCorrection_>111</distCorrection_>
<distCorrectionX_>118</distCorrectionX_>
<distCorrectionY_>118</distCorrectionY_>
<vertOffsetCorrection_>19.736338</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_2">
<id_>1</id_>
<rotCorrection_>-3.2344019</rotCorrection_>
<vertCorrection_>-6.9644198</vertCorrection_>
<distCorrection_>146</distCorrection_>
<distCorrectionX_>149</distCorrectionX_>
<distCorrectionY_>151</distCorrectionY_>
<vertOffsetCorrection_>19.778963</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_3">
<id_>2</id_>
<rotCorrection_>2.4376695</rotCorrection_>
<vertCorrection_>0.250889</vertCorrection_>
<distCorrection_>131.76823</distCorrection_>
<distCorrectionX_>136</distCorrectionX_>
<distCorrectionY_>136</distCorrectionY_>
<vertOffsetCorrection_>20.688799</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_4">
<id_>3</id_>
<rotCorrection_>4.7373252</rotCorrection_>
<vertCorrection_>0.55538797</vertCorrection_>
<distCorrection_>138.12656</distCorrection_>
<distCorrectionX_>142</distCorrectionX_>
<distCorrectionY_>144</distCorrectionY_>
<vertOffsetCorrection_>20.727015</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_5">
<id_>4</id_>
<rotCorrection_>-1.0502493</rotCorrection_>
<vertCorrection_>-6.6410818</vertCorrection_>
<distCorrection_>119</distCorrection_>
<distCorrectionX_>127</distCorrectionX_>
<distCorrectionY_>128</distCorrectionY_>
<vertOffsetCorrection_>19.82012</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_6">
<id_>5</id_>
<rotCorrection_>1.2386309</rotCorrection_>
<vertCorrection_>-6.2594609</vertCorrection_>
<distCorrection_>135</distCorrection_>
<distCorrectionX_>140</distCorrectionX_>
<distCorrectionY_>144</distCorrectionY_>
<vertOffsetCorrection_>19.868624</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_7">
<id_>6</id_>
<rotCorrection_>-1.8405367</rotCorrection_>
<vertCorrection_>-8.6656351</vertCorrection_>
<distCorrection_>132</distCorrection_>
<distCorrectionX_>135</distCorrectionX_>
<distCorrectionY_>137</distCorrectionY_>
<vertOffsetCorrection_>19.561426</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_8">
<id_>7</id_>
<rotCorrection_>0.4511103</rotCorrection_>
<vertCorrection_>-8.3104696</vertCorrection_>
<distCorrection_>145</distCorrection_>
<distCorrectionX_>145</distCorrectionX_>
<distCorrectionY_>149</distCorrectionY_>
<vertOffsetCorrection_>19.606993</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_9">
<id_>8</id_>
<rotCorrection_>3.2611551</rotCorrection_>
<vertCorrection_>-5.9352221</vertCorrection_>
<distCorrection_>116</distCorrection_>
<distCorrectionX_>122</distCorrectionX_>
<distCorrectionY_>121</distCorrectionY_>
<vertOffsetCorrection_>19.909781</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_10">
<id_>9</id_>
<rotCorrection_>5.4685535</rotCorrection_>
<vertCorrection_>-5.587399</vertCorrection_>
<distCorrection_>133.99889</distCorrection_>
<distCorrectionX_>140</distCorrectionX_>
<distCorrectionY_>142</distCorrectionY_>
<vertOffsetCorrection_>19.953875</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_11">
<id_>10</id_>
<rotCorrection_>2.4743285</rotCorrection_>
<vertCorrection_>-7.9891219</vertCorrection_>
<distCorrection_>117</distCorrection_>
<distCorrectionX_>125</distCorrectionX_>
<distCorrectionY_>123</distCorrectionY_>
<vertOffsetCorrection_>19.648148</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_12">
<id_>11</id_>
<rotCorrection_>4.7189918</rotCorrection_>
<vertCorrection_>-7.644258</vertCorrection_>
<distCorrection_>145</distCorrection_>
<distCorrectionX_>146</distCorrectionX_>
<distCorrectionY_>151</distCorrectionY_>
<vertOffsetCorrection_>19.692244</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_13">
<id_>12</id_>
<rotCorrection_>-5.3511744</rotCorrection_>
<vertCorrection_>-3.2475569</vertCorrection_>
<distCorrection_>118.71672</distCorrection_>
<distCorrectionX_>124</distCorrectionX_>
<distCorrectionY_>123</distCorrectionY_>
<vertOffsetCorrection_>20.249313</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_14">
<id_>13</id_>
<rotCorrection_>-3.1158857</rotCorrection_>
<vertCorrection_>-2.850472</vertCorrection_>
<distCorrection_>142.90839</distCorrection_>
<distCorrectionX_>148</distCorrectionX_>
<distCorrectionY_>149</distCorrectionY_>
<vertOffsetCorrection_>20.29929</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_15">
<id_>14</id_>
<rotCorrection_>-6.1270261</rotCorrection_>
<vertCorrection_>-5.204318</vertCorrection_>
<distCorrection_>120</distCorrection_>
<distCorrectionX_>127</distCorrectionX_>
<distCorrectionY_>124</distCorrectionY_>
<vertOffsetCorrection_>20.00238</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_16">
<id_>15</id_>
<rotCorrection_>-3.852011</rotCorrection_>
<vertCorrection_>-4.9137921</vertCorrection_>
<distCorrection_>137</distCorrection_>
<distCorrectionX_>144</distCorrectionX_>
<distCorrectionY_>144</distCorrectionY_>
<vertOffsetCorrection_>20.039125</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_17">
<id_>16</id_>
<rotCorrection_>-1.1109436</rotCorrection_>
<vertCorrection_>-2.4998751</vertCorrection_>
<distCorrection_>101.71324</distCorrection_>
<distCorrectionX_>111</distCorrectionX_>
<distCorrectionY_>109</distCorrectionY_>
<vertOffsetCorrection_>20.343384</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_18">
<id_>17</id_>
<rotCorrection_>1.1519098</rotCorrection_>
<vertCorrection_>-2.184176</vertCorrection_>
<distCorrection_>145.31258</distCorrection_>
<distCorrectionX_>153</distCorrectionX_>
<distCorrectionY_>157</distCorrectionY_>
<vertOffsetCorrection_>20.38307</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_19">
<id_>18</id_>
<rotCorrection_>-1.8682934</rotCorrection_>
<vertCorrection_>-4.5764661</vertCorrection_>
<distCorrection_>130</distCorrection_>
<distCorrectionX_>135</distCorrectionX_>
<distCorrectionY_>134</distCorrectionY_>
<vertOffsetCorrection_>20.081753</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_20">
<id_>19</id_>
<rotCorrection_>0.43604341</rotCorrection_>
<vertCorrection_>-4.2038751</vertCorrection_>
<distCorrection_>147</distCorrection_>
<distCorrectionX_>149</distCorrectionX_>
<distCorrectionY_>152</distCorrectionY_>
<vertOffsetCorrection_>20.128786</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_21">
<id_>20</id_>
<rotCorrection_>3.1763444</rotCorrection_>
<vertCorrection_>-1.798143</vertCorrection_>
<distCorrection_>115.82812</distCorrection_>
<distCorrectionX_>124</distCorrectionX_>
<distCorrectionY_>123</distCorrectionY_>
<vertOffsetCorrection_>20.431576</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_22">
<id_>21</id_>
<rotCorrection_>5.4284201</rotCorrection_>
<vertCorrection_>-1.49388</vertCorrection_>
<distCorrection_>146</distCorrection_>
<distCorrectionX_>152</distCorrectionX_>
<distCorrectionY_>154</distCorrectionY_>
<vertOffsetCorrection_>20.469791</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_23">
<id_>22</id_>
<rotCorrection_>2.4024715</rotCorrection_>
<vertCorrection_>-1.877563</vertCorrection_>
<distCorrection_>129.29713</distCorrection_>
<distCorrectionX_>137</distCorrectionX_>
<distCorrectionY_>136</distCorrectionY_>
<vertOffsetCorrection_>20.169943</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_24">
<id_>23</id_>
<rotCorrection_>4.6698937</rotCorrection_>
<vertCorrection_>-3.492661</vertCorrection_>
<distCorrection_>157.97737</distCorrection_>
<distCorrectionX_>162</distCorrectionX_>
<distCorrectionY_>165</distCorrectionY_>
<vertOffsetCorrection_>20.218447</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_25">
<id_>24</id_>
<rotCorrection_>-5.3977456</rotCorrection_>
<vertCorrection_>0.88327599</vertCorrection_>
<distCorrection_>124.12312</distCorrection_>
<distCorrectionX_>132</distCorrectionX_>
<distCorrectionY_>129</distCorrectionY_>
<vertOffsetCorrection_>20.768169</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_26">
<id_>25</id_>
<rotCorrection_>-3.1504908</rotCorrection_>
<vertCorrection_>1.234519</vertCorrection_>
<distCorrection_>128</distCorrection_>
<distCorrectionX_>135</distCorrectionX_>
<distCorrectionY_>138</distCorrectionY_>
<vertOffsetCorrection_>20.812265</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_27">
<id_>26</id_>
<rotCorrection_>-6.1759849</rotCorrection_>
<vertCorrection_>-1.177825</vertCorrection_>
<distCorrection_>133</distCorrection_>
<distCorrectionX_>140</distCorrectionX_>
<distCorrectionY_>139</distCorrectionY_>
<vertOffsetCorrection_>20.509478</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_28">
<id_>27</id_>
<rotCorrection_>-3.8819003</rotCorrection_>
<vertCorrection_>-0.86169797</vertCorrection_>
<distCorrection_>130</distCorrection_>
<distCorrectionX_>135</distCorrectionX_>
<distCorrectionY_>134</distCorrectionY_>
<vertOffsetCorrection_>20.549164</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_29">
<id_>28</id_>
<rotCorrection_>-1.1136208</rotCorrection_>
<vertCorrection_>1.585669</vertCorrection_>
<distCorrection_>131</distCorrection_>
<distCorrectionX_>137</distCorrectionX_>
<distCorrectionY_>137</distCorrectionY_>
<vertOffsetCorrection_>20.856361</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_30">
<id_>29</id_>
<rotCorrection_>1.0969903</rotCorrection_>
<vertCorrection_>1.925001</vertCorrection_>
<distCorrection_>131</distCorrection_>
<distCorrectionX_>139</distCorrectionX_>
<distCorrectionY_>142</distCorrectionY_>
<vertOffsetCorrection_>20.898987</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_31">
<id_>30</id_>
<rotCorrection_>-1.9088749</rotCorrection_>
<vertCorrection_>-0.486963</vertCorrection_>
<distCorrection_>138.48773</distCorrection_>
<distCorrectionX_>145</distCorrectionX_>
<distCorrectionY_>143</distCorrectionY_>
<vertOffsetCorrection_>20.596197</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_32">
<id_>31</id_>
<rotCorrection_>0.36758029</rotCorrection_>
<vertCorrection_>-0.123898</vertCorrection_>
<distCorrection_>137.21994</distCorrection_>
<distCorrectionX_>143</distCorrectionX_>
<distCorrectionY_>145</distCorrectionY_>
<vertOffsetCorrection_>20.641764</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_33">
<id_>32</id_>
<rotCorrection_>-8.3386211</rotCorrection_>
<vertCorrection_>-22.597513</vertCorrection_>
<distCorrection_>117</distCorrection_>
<distCorrectionX_>124</distCorrectionX_>
<distCorrectionY_>125</distCorrectionY_>
<vertOffsetCorrection_>10.828748</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_34">
<id_>33</id_>
<rotCorrection_>-4.7629819</rotCorrection_>
<vertCorrection_>-22.397568</vertCorrection_>
<distCorrection_>100</distCorrection_>
<distCorrectionX_>109</distCorrectionX_>
<distCorrectionY_>110</distCorrectionY_>
<vertOffsetCorrection_>10.854152</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_35">
<id_>34</id_>
<rotCorrection_>4.1516571</rotCorrection_>
<vertCorrection_>-11.576517</vertCorrection_>
<distCorrection_>130</distCorrection_>
<distCorrectionX_>128</distCorrectionX_>
<distCorrectionY_>130</distCorrectionY_>
<vertOffsetCorrection_>12.142142</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_36">
<id_>35</id_>
<rotCorrection_>7.3577185</rotCorrection_>
<vertCorrection_>-10.877901</vertCorrection_>
<distCorrection_>102</distCorrection_>
<distCorrectionX_>108</distCorrectionX_>
<distCorrectionY_>109</distCorrectionY_>
<vertOffsetCorrection_>12.220895</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_37">
<id_>36</id_>
<rotCorrection_>-1.2630961</rotCorrection_>
<vertCorrection_>-21.935509</vertCorrection_>
<distCorrection_>106</distCorrection_>
<distCorrectionX_>112</distCorrectionX_>
<distCorrectionY_>113</distCorrectionY_>
<vertOffsetCorrection_>10.912581</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_38">
<id_>37</id_>
<rotCorrection_>2.1595552</rotCorrection_>
<vertCorrection_>-21.409546</vertCorrection_>
<distCorrection_>91</distCorrection_>
<distCorrectionX_>100</distCorrectionX_>
<distCorrectionY_>101</distCorrectionY_>
<vertOffsetCorrection_>10.978632</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_39">
<id_>38</id_>
<rotCorrection_>-2.6141083</rotCorrection_>
<vertCorrection_>-25.066507</vertCorrection_>
<distCorrection_>127</distCorrection_>
<distCorrectionX_>126</distCorrectionX_>
<distCorrectionY_>126</distCorrectionY_>
<vertOffsetCorrection_>10.508655</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_40">
<id_>39</id_>
<rotCorrection_>0.95595688</rotCorrection_>
<vertCorrection_>-24.458101</vertCorrection_>
<distCorrection_>95</distCorrection_>
<distCorrectionX_>99</distCorrectionX_>
<distCorrectionY_>102</distCorrectionY_>
<vertOffsetCorrection_>10.588678</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_41">
<id_>40</id_>
<rotCorrection_>5.5369682</rotCorrection_>
<vertCorrection_>-20.777454</vertCorrection_>
<distCorrection_>106</distCorrection_>
<distCorrectionX_>114</distCorrectionX_>
<distCorrectionY_>114</distCorrectionY_>
<vertOffsetCorrection_>11.057385</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_42">
<id_>41</id_>
<rotCorrection_>8.9712191</rotCorrection_>
<vertCorrection_>-20.243195</vertCorrection_>
<distCorrection_>97</distCorrection_>
<distCorrectionX_>104</distCorrectionX_>
<distCorrectionY_>105</distCorrectionY_>
<vertOffsetCorrection_>11.123436</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_43">
<id_>42</id_>
<rotCorrection_>4.4757471</rotCorrection_>
<vertCorrection_>-23.863358</vertCorrection_>
<distCorrection_>115</distCorrection_>
<distCorrectionX_>118</distCorrectionX_>
<distCorrectionY_>120</distCorrectionY_>
<vertOffsetCorrection_>10.666161</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_44">
<id_>43</id_>
<rotCorrection_>7.8848143</rotCorrection_>
<vertCorrection_>-23.352007</vertCorrection_>
<distCorrection_>92</distCorrection_>
<distCorrectionX_>95</distCorrectionX_>
<distCorrectionY_>100</distCorrectionY_>
<vertOffsetCorrection_>10.732212</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_45">
<id_>44</id_>
<rotCorrection_>-8.0466499</rotCorrection_>
<vertCorrection_>-16.629311</vertCorrection_>
<distCorrection_>135</distCorrection_>
<distCorrectionX_>135</distCorrectionX_>
<distCorrectionY_>137</distCorrectionY_>
<vertOffsetCorrection_>11.559117</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_46">
<id_>45</id_>
<rotCorrection_>-4.595552</rotCorrection_>
<vertCorrection_>-16.230633</vertCorrection_>
<distCorrection_>108</distCorrection_>
<distCorrectionX_>112</distCorrectionX_>
<distCorrectionY_>115</distCorrectionY_>
<vertOffsetCorrection_>11.606115</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_47">
<id_>46</id_>
<rotCorrection_>-9.3918352</rotCorrection_>
<vertCorrection_>-19.788239</vertCorrection_>
<distCorrection_>135</distCorrection_>
<distCorrectionX_>135</distCorrectionX_>
<distCorrectionY_>138</distCorrectionY_>
<vertOffsetCorrection_>11.179325</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_48">
<id_>47</id_>
<rotCorrection_>-5.9566336</rotCorrection_>
<vertCorrection_>-19.21587</vertCorrection_>
<distCorrection_>98</distCorrection_>
<distCorrectionX_>105</distCorrectionX_>
<distCorrectionY_>108</distCorrectionY_>
<vertOffsetCorrection_>11.249186</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_49">
<id_>48</id_>
<rotCorrection_>-1.3779737</rotCorrection_>
<vertCorrection_>-15.754419</vertCorrection_>
<distCorrection_>116</distCorrection_>
<distCorrectionX_>120</distCorrectionX_>
<distCorrectionY_>123</distCorrectionY_>
<vertOffsetCorrection_>11.662004</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_50">
<id_>49</id_>
<rotCorrection_>2.0754263</rotCorrection_>
<vertCorrection_>-15.166914</vertCorrection_>
<distCorrection_>105</distCorrection_>
<distCorrectionX_>110</distCorrectionX_>
<distCorrectionY_>110</distCorrectionY_>
<vertOffsetCorrection_>11.730595</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_51">
<id_>50</id_>
<rotCorrection_>-2.5654242</rotCorrection_>
<vertCorrection_>-18.828558</vertCorrection_>
<distCorrection_>138</distCorrection_>
<distCorrectionX_>133</distCorrectionX_>
<distCorrectionY_>134.53442</distCorrectionY_>
<vertOffsetCorrection_>11.296184</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_52">
<id_>51</id_>
<rotCorrection_>0.87227631</rotCorrection_>
<vertCorrection_>-18.312876</vertCorrection_>
<distCorrection_>105</distCorrection_>
<distCorrectionX_>110</distCorrectionX_>
<distCorrectionY_>111</distCorrectionY_>
<vertOffsetCorrection_>11.358424</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_53">
<id_>52</id_>
<rotCorrection_>5.2989287</rotCorrection_>
<vertCorrection_>-14.641928</vertCorrection_>
<distCorrection_>123</distCorrection_>
<distCorrectionX_>125</distCorrectionX_>
<distCorrectionY_>126</distCorrectionY_>
<vertOffsetCorrection_>11.791565</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_54">
<id_>53</id_>
<rotCorrection_>8.7970304</rotCorrection_>
<vertCorrection_>-14.048302</vertCorrection_>
<distCorrection_>86</distCorrection_>
<distCorrectionX_>90</distCorrectionX_>
<distCorrectionY_>95</distCorrectionY_>
<vertOffsetCorrection_>11.860156</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_55">
<id_>54</id_>
<rotCorrection_>4.1742177</rotCorrection_>
<vertCorrection_>-17.687857</vertCorrection_>
<distCorrection_>135</distCorrection_>
<distCorrectionX_>135</distCorrectionX_>
<distCorrectionY_>133.33524</distCorrectionY_>
<vertOffsetCorrection_>11.433367</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_56">
<id_>55</id_>
<rotCorrection_>7.5869775</rotCorrection_>
<vertCorrection_>-17.16544</vertCorrection_>
<distCorrection_>92</distCorrection_>
<distCorrectionX_>98</distCorrectionX_>
<distCorrectionY_>100</distCorrectionY_>
<vertOffsetCorrection_>11.495607</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_57">
<id_>56</id_>
<rotCorrection_>-7.8831077</rotCorrection_>
<vertCorrection_>-10.436752</vertCorrection_>
<distCorrection_>121</distCorrection_>
<distCorrectionX_>126</distCorrectionX_>
<distCorrectionY_>128</distCorrectionY_>
<vertOffsetCorrection_>12.270433</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_58">
<id_>57</id_>
<rotCorrection_>-4.5919614</rotCorrection_>
<vertCorrection_>-10.085198</vertCorrection_>
<distCorrection_>103</distCorrection_>
<distCorrectionX_>106</distCorrectionX_>
<distCorrectionY_>108</distCorrectionY_>
<vertOffsetCorrection_>12.30981</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_59">
<id_>58</id_>
<rotCorrection_>-9.1805763</rotCorrection_>
<vertCorrection_>-13.484814</vertCorrection_>
<distCorrection_>146</distCorrection_>
<distCorrectionX_>142</distCorrectionX_>
<distCorrectionY_>145</distCorrectionY_>
<vertOffsetCorrection_>11.924937</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_60">
<id_>59</id_>
<rotCorrection_>-5.7835727</rotCorrection_>
<vertCorrection_>-13.107666</vertCorrection_>
<distCorrection_>99</distCorrection_>
<distCorrectionX_>106</distCorrectionX_>
<distCorrectionY_>106</distCorrectionY_>
<vertOffsetCorrection_>11.968124</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_61">
<id_>60</id_>
<rotCorrection_>-1.2335371</rotCorrection_>
<vertCorrection_>-9.5621262</vertCorrection_>
<distCorrection_>123</distCorrection_>
<distCorrectionX_>127</distCorrectionX_>
<distCorrectionY_>128</distCorrectionY_>
<vertOffsetCorrection_>12.368239</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_62">
<id_>61</id_>
<rotCorrection_>1.9424959</rotCorrection_>
<vertCorrection_>-9.0374413</vertCorrection_>
<distCorrection_>106</distCorrection_>
<distCorrectionX_>108</distCorrectionX_>
<distCorrectionY_>111</distCorrectionY_>
<vertOffsetCorrection_>12.426669</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_63">
<id_>62</id_>
<rotCorrection_>-2.5727935</rotCorrection_>
<vertCorrection_>-12.651329</vertCorrection_>
<distCorrection_>134</distCorrection_>
<distCorrectionX_>135</distCorrectionX_>
<distCorrectionY_>134</distCorrectionY_>
<vertOffsetCorrection_>12.020203</vertOffsetCorrection_>
<horizOffsetCorrection_>2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
<item>
<px class_id_reference="9" object_id="_64">
<id_>63</id_>
<rotCorrection_>0.81118912</rotCorrection_>
<vertCorrection_>-12.115005</vertCorrection_>
<distCorrection_>104</distCorrection_>
<distCorrectionX_>107</distCorrectionX_>
<distCorrectionY_>112</distCorrectionY_>
<vertOffsetCorrection_>12.081173</vertOffsetCorrection_>
<horizOffsetCorrection_>-2.5999999</horizOffsetCorrection_>
<focalDistance_>0</focalDistance_>
<focalSlope_>0</focalSlope_>
</px>
</item>
</points_>
</DB>
</boost_serialization>
@@ -0,0 +1,33 @@
<!-- -*- mode: XML -*- -->
<!-- rostest of publishing a transformed PointCloud from PCAP data. -->
<launch>
<!-- define transforms for static vehicle -->
<include file="$(find velodyne_pointcloud)/tests/static_vehicle_tf.launch" />
<!-- start driver with example PCAP file -->
<node pkg="velodyne_driver" type="velodyne_node" name="velodyne_node">
<param name="pcap" value="$(find velodyne_pointcloud)/tests/class.pcap"/>
</node>
<!-- start transform node with test calibration file -->
<node pkg="velodyne_pointcloud" type="transform_node" name="transform_node">
<param name="calibration"
value="$(find velodyne_pointcloud)/tests/angles.yaml"/>
</node>
<!-- Verify PointCloud2 publication rate. Unfortunately,
transformed clouds run very slowly, they spend too much time
waiting for the /velodyne to /map transform to be available.
-->
<test test-name="transform_node_hz_test" pkg="rostest"
type="hztest" name="hztest_transform_node_64e" >
<param name="hz" value="10.0" />
<param name="hzerror" value="7.0" />
<param name="test_duration" value="5.0" />
<param name="topic" value="velodyne_points" />
<param name="wait_time" value="2.0" />
</test>
</launch>
@@ -0,0 +1,33 @@
<!-- -*- mode: XML -*- -->
<!-- rostest of publishing a transformed PointCloud from PCAP data. -->
<launch>
<!-- define transforms for static vehicle -->
<include file="$(find velodyne_pointcloud)/tests/static_vehicle_tf.launch" />
<!-- start nodelet manager and driver nodelets -->
<include file="$(find velodyne_driver)/launch/nodelet_manager.launch">
<arg name="pcap" value="$(find velodyne_pointcloud)/tests/class.pcap"/>
</include>
<!-- start transform nodelet -->
<include file="$(find velodyne_pointcloud)/launch/transform_nodelet.launch">
<arg name="calibration"
value="$(find velodyne_pointcloud)/params/64e_utexas.yaml"/>
</include>
<!-- Verify PointCloud2 publication rate. Unfortunately,
transformed clouds run very slowly, they spend too much time
waiting for the /velodyne to /map transform to be available.
-->
<test test-name="transform_nodelet_hz_test" pkg="rostest"
type="hztest" name="hztest_transform_nodelet_64e" >
<param name="hz" value="10.0" />
<param name="hzerror" value="7.0" />
<param name="test_duration" value="5.0" />
<param name="topic" value="velodyne_points" />
<param name="wait_time" value="2.0" />
</test>
</launch>
@@ -0,0 +1,48 @@
<!-- -*- mode: XML -*- -->
<!-- rostest of publishing using two different nodelet managers. -->
<launch>
<!-- use separate namespaces for each device and its nodelet manager -->
<group ns="hdl32e">
<!-- start nodelet manager, driver and cloud nodelets -->
<include file="$(find velodyne_pointcloud)/launch/32e_points.launch">
<arg name="frame_id" value="hdl32e"/>
<arg name="pcap" value="$(find velodyne_pointcloud)/tests/32e.pcap"/>
</include>
<!-- verify PointCloud2 publication rate -->
<test test-name="multi_nodelet_32e_test" pkg="rostest"
type="hztest" name="hztest_multi_nodelet_32e" >
<param name="hz" value="10.0" />
<param name="hzerror" value="3.0" />
<param name="test_duration" value="5.0" />
<param name="topic" value="/hdl32e/velodyne_points" />
<param name="wait_time" value="2.0" />
</test>
</group>
<group ns="vlp16">
<!-- start nodelet manager, driver and cloud nodelets -->
<include file="$(find velodyne_pointcloud)/launch/VLP16_points.launch">
<arg name="frame_id" value="vlp16"/>
<arg name="pcap" value="$(find velodyne_pointcloud)/tests/vlp16.pcap"/>
</include>
<!-- verify PointCloud2 publication rate -->
<test test-name="multi_nodelet_vlp16_test" pkg="rostest"
type="hztest" name="hztest_multi_nodelet_vlp16" >
<param name="hz" value="10.0" />
<param name="hzerror" value="3.0" />
<param name="test_duration" value="5.0" />
<param name="topic" value="/vlp16/velodyne_points" />
<param name="wait_time" value="2.0" />
</test>
</group>
</launch>