Full Code of ART-Robot-Release/racecar for AI

master d304e2498627 cached
521 files
73.7 MB
648.3k tokens
215 symbols
1 requests
Download .txt
Showing preview only (2,146K chars total). Download the full file or copy to clipboard to get everything.
Repository: ART-Robot-Release/racecar
Branch: master
Commit: d304e2498627
Files: 521
Total size: 73.7 MB

Directory structure:
gitextract_j53mpcyy/

├── .catkin_workspace
├── README.md
├── install.sh
└── src/
    ├── art_driver/
    │   ├── CMakeLists.txt
    │   ├── README
    │   ├── include/
    │   │   └── art_racecar_driver.h
    │   ├── lib/
    │   │   └── libart_driver.a
    │   ├── package.xml
    │   └── src/
    │       └── art_racecar.cpp
    ├── art_imu/
    │   ├── CMakeLists.txt
    │   ├── launch/
    │   │   ├── imu.launch
    │   │   ├── imu_test.launch
    │   │   └── rviz.launch
    │   ├── package.xml
    │   ├── rviz/
    │   │   └── imu.rviz
    │   └── src/
    │       └── art_imu.cc
    ├── art_racecar/
    │   ├── CMakeLists.txt
    │   ├── README.md
    │   ├── art_rviz.sh
    │   ├── cfg/
    │   │   └── imu.cfg
    │   ├── launch/
    │   │   ├── Run_car.launch
    │   │   ├── Run_gmapping.launch
    │   │   ├── amcl_nav.launch
    │   │   ├── car.launch
    │   │   ├── includes/
    │   │   │   ├── amcl.launch.xml
    │   │   │   ├── art_car_tf.launch.xml
    │   │   │   ├── default_mapping.launch.xml
    │   │   │   ├── ls01g.launch.xml
    │   │   │   ├── rf2o.launch.xml
    │   │   │   └── rplidar.launch.xml
    │   │   ├── ls01g_lidar.launch
    │   │   ├── rviz.launch
    │   │   └── teleop_joy.launch
    │   ├── map/
    │   │   ├── mymap.yaml
    │   │   └── test.yaml
    │   ├── package.xml
    │   ├── param/
    │   │   ├── base_global_planner_params.yaml
    │   │   ├── dwa_local_planner_params.yaml
    │   │   ├── ekf_params.yaml
    │   │   ├── global_costmap_params.yaml
    │   │   ├── local_costmap_params.yaml
    │   │   └── move_base_params.yaml
    │   ├── rviz/
    │   │   ├── amcl.rviz
    │   │   ├── gmapping.rviz
    │   │   └── test_laser.rviz
    │   ├── save_map.sh
    │   ├── src/
    │   │   ├── ESC_calibration.py
    │   │   ├── PID.h
    │   │   ├── art_car_controller.cpp
    │   │   ├── art_car_controller.hpp
    │   │   ├── lib/
    │   │   │   └── libart_controller.a
    │   │   ├── racecar_joy.py
    │   │   └── racecar_teleop.py
    │   ├── ssh.sh
    │   └── udev/
    │       ├── README
    │       ├── art_init.sh
    │       ├── car.rules
    │       ├── imu.rules
    │       └── laser.rules
    ├── ls01g/
    │   ├── CMakeLists.txt
    │   ├── Y.txt
    │   ├── launch/
    │   │   ├── ls01g.launch
    │   │   ├── rviz.launch
    │   │   ├── rviz.rviz
    │   │   ├── talker2.launch
    │   │   ├── talker_shell.launch
    │   │   ├── test.launch
    │   │   └── test_ls01g.launch
    │   ├── package.xml
    │   ├── rviz/
    │   │   ├── kobuki_rviz_viewer.rviz
    │   │   └── slam.rviz
    │   ├── scripts/
    │   │   ├── LS01A.py
    │   │   ├── create_udev_rules.sh
    │   │   ├── delete_udev_rules.sh
    │   │   └── laser.rules
    │   ├── slam_launch/
    │   │   ├── gmapping.launch
    │   │   ├── hectormapping.launch
    │   │   ├── karto.launch
    │   │   ├── karto_mapper_params.yaml
    │   │   └── viewer_rviz.launch
    │   └── src/
    │       ├── main.cpp
    │       ├── uart_driver.cpp
    │       └── uart_driver.h
    ├── navigation_tutorials/
    │   ├── README.md
    │   ├── laser_scan_publisher_tutorial/
    │   │   ├── CMakeLists.txt
    │   │   ├── package.xml
    │   │   └── src/
    │   │       └── laser_scan_publisher.cpp
    │   ├── navigation_stage/
    │   │   ├── CMakeLists.txt
    │   │   ├── launch/
    │   │   │   ├── move_base_amcl_10cm.launch
    │   │   │   ├── move_base_amcl_2.5cm.launch
    │   │   │   ├── move_base_amcl_5cm.launch
    │   │   │   ├── move_base_fake_localization_10cm.launch
    │   │   │   ├── move_base_fake_localization_2.5cm.launch
    │   │   │   ├── move_base_fake_localization_5cm.launch
    │   │   │   ├── move_base_gmapping_5cm.launch
    │   │   │   └── move_base_multi_robot.launch
    │   │   ├── move_base_config/
    │   │   │   ├── amcl_node.xml
    │   │   │   ├── base_local_planner_params.yaml
    │   │   │   ├── costmap_common_params.yaml
    │   │   │   ├── dwa_local_planner_params.yaml
    │   │   │   ├── global_costmap_params.yaml
    │   │   │   ├── local_costmap_params.yaml
    │   │   │   ├── move_base.xml
    │   │   │   └── slam_gmapping.xml
    │   │   ├── multi_robot.rviz
    │   │   ├── package.xml
    │   │   ├── single_robot.rviz
    │   │   └── stage_config/
    │   │       ├── maps/
    │   │       │   ├── willow-full-0.025.pgm
    │   │       │   ├── willow-full-0.05.pgm
    │   │       │   └── willow-full.pgm
    │   │       └── worlds/
    │   │           ├── willow-pr2-2.5cm.world
    │   │           ├── willow-pr2-5cm.world
    │   │           ├── willow-pr2-multi.world
    │   │           └── willow-pr2.world
    │   ├── navigation_tutorials/
    │   │   ├── CMakeLists.txt
    │   │   └── package.xml
    │   ├── odometry_publisher_tutorial/
    │   │   ├── CMakeLists.txt
    │   │   ├── package.xml
    │   │   └── src/
    │   │       └── odometry_publisher.cpp
    │   ├── point_cloud_publisher_tutorial/
    │   │   ├── CMakeLists.txt
    │   │   ├── package.xml
    │   │   └── src/
    │   │       └── point_cloud_publisher.cpp
    │   ├── robot_setup_tf_tutorial/
    │   │   ├── CMakeLists.txt
    │   │   ├── manifest.xml
    │   │   ├── package.xml
    │   │   └── src/
    │   │       ├── tf_broadcaster.cpp
    │   │       └── tf_listener.cpp
    │   ├── roomba_stage/
    │   │   ├── CMakeLists.txt
    │   │   ├── manifest.xml
    │   │   ├── maps/
    │   │   │   ├── lse_arena.pgm
    │   │   │   └── lse_arena.yaml
    │   │   ├── move_base_lse_arena.launch
    │   │   ├── package.xml
    │   │   ├── params/
    │   │   │   ├── amcl_roomba.launch
    │   │   │   ├── base_local_planner_params.yaml
    │   │   │   ├── costmap_common_params.yaml
    │   │   │   ├── global_costmap_params.yaml
    │   │   │   ├── local_costmap_params.yaml
    │   │   │   └── local_costmap_params_2.yaml
    │   │   ├── roomba_lse_arena.world
    │   │   └── roomba_stage.rviz
    │   └── simple_navigation_goals_tutorial/
    │       ├── CMakeLists.txt
    │       ├── package.xml
    │       └── src/
    │           └── simple_navigation_goals.cpp
    ├── rf2o_laser_odometry/
    │   ├── CMakeLists.txt
    │   ├── LICENSE
    │   ├── README.md
    │   ├── cmake-build-debug/
    │   │   ├── CATKIN_IGNORE
    │   │   ├── CMakeCache.txt
    │   │   ├── CMakeFiles/
    │   │   │   ├── 3.9.6/
    │   │   │   │   ├── CMakeCCompiler.cmake
    │   │   │   │   ├── CMakeCXXCompiler.cmake
    │   │   │   │   ├── CMakeSystem.cmake
    │   │   │   │   ├── CompilerIdC/
    │   │   │   │   │   ├── CMakeCCompilerId.c
    │   │   │   │   │   └── a.out
    │   │   │   │   └── CompilerIdCXX/
    │   │   │   │       ├── CMakeCXXCompilerId.cpp
    │   │   │   │       └── a.out
    │   │   │   ├── CMakeDirectoryInformation.cmake
    │   │   │   ├── CMakeError.log
    │   │   │   ├── CMakeOutput.log
    │   │   │   ├── CMakeRuleHashes.txt
    │   │   │   ├── Makefile.cmake
    │   │   │   ├── Makefile2
    │   │   │   ├── Progress/
    │   │   │   │   ├── 2
    │   │   │   │   └── count.txt
    │   │   │   ├── TargetDirectories.txt
    │   │   │   ├── actionlib_generate_messages_cpp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── actionlib_generate_messages_eus.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── actionlib_generate_messages_lisp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── actionlib_generate_messages_nodejs.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── actionlib_generate_messages_py.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── actionlib_msgs_generate_messages_cpp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── actionlib_msgs_generate_messages_eus.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── actionlib_msgs_generate_messages_lisp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── actionlib_msgs_generate_messages_nodejs.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── actionlib_msgs_generate_messages_py.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── clean_test_results.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── clion-environment.txt
    │   │   │   ├── clion-log.txt
    │   │   │   ├── cmake.check_cache
    │   │   │   ├── download_extra_data.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── doxygen.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── feature_tests.c
    │   │   │   ├── feature_tests.cxx
    │   │   │   ├── geometry_msgs_generate_messages_cpp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── geometry_msgs_generate_messages_eus.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── geometry_msgs_generate_messages_lisp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── geometry_msgs_generate_messages_nodejs.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── geometry_msgs_generate_messages_py.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── nav_msgs_generate_messages_cpp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── nav_msgs_generate_messages_eus.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── nav_msgs_generate_messages_lisp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── nav_msgs_generate_messages_nodejs.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── nav_msgs_generate_messages_py.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── progress.marks
    │   │   │   ├── rf2o_laser_odometry_node.dir/
    │   │   │   │   ├── CXX.includecache
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   ├── depend.internal
    │   │   │   │   ├── depend.make
    │   │   │   │   ├── flags.make
    │   │   │   │   ├── link.txt
    │   │   │   │   ├── progress.make
    │   │   │   │   └── src/
    │   │   │   │       └── CLaserOdometry2D.cpp.o
    │   │   │   ├── roscpp_generate_messages_cpp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── roscpp_generate_messages_eus.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── roscpp_generate_messages_lisp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── roscpp_generate_messages_nodejs.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── roscpp_generate_messages_py.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── rosgraph_msgs_generate_messages_cpp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── rosgraph_msgs_generate_messages_eus.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── rosgraph_msgs_generate_messages_lisp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── rosgraph_msgs_generate_messages_nodejs.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── rosgraph_msgs_generate_messages_py.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── run_tests.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── sensor_msgs_generate_messages_cpp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── sensor_msgs_generate_messages_eus.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── sensor_msgs_generate_messages_lisp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── sensor_msgs_generate_messages_nodejs.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── sensor_msgs_generate_messages_py.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── std_msgs_generate_messages_cpp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── std_msgs_generate_messages_eus.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── std_msgs_generate_messages_lisp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── std_msgs_generate_messages_nodejs.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── std_msgs_generate_messages_py.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── tests.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── tf2_msgs_generate_messages_cpp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── tf2_msgs_generate_messages_eus.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── tf2_msgs_generate_messages_lisp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── tf2_msgs_generate_messages_nodejs.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── tf2_msgs_generate_messages_py.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── tf_generate_messages_cpp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── tf_generate_messages_eus.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── tf_generate_messages_lisp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── tf_generate_messages_nodejs.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   └── tf_generate_messages_py.dir/
    │   │   │       ├── DependInfo.cmake
    │   │   │       ├── build.make
    │   │   │       ├── cmake_clean.cmake
    │   │   │       └── progress.make
    │   │   ├── CTestTestfile.cmake
    │   │   ├── Makefile
    │   │   ├── catkin/
    │   │   │   └── catkin_generated/
    │   │   │       └── version/
    │   │   │           └── package.cmake
    │   │   ├── catkin_generated/
    │   │   │   ├── env_cached.sh
    │   │   │   ├── generate_cached_setup.py
    │   │   │   ├── installspace/
    │   │   │   │   ├── .rosinstall
    │   │   │   │   ├── _setup_util.py
    │   │   │   │   ├── env.sh
    │   │   │   │   ├── rf2o_laser_odometry.pc
    │   │   │   │   ├── rf2o_laser_odometryConfig-version.cmake
    │   │   │   │   ├── rf2o_laser_odometryConfig.cmake
    │   │   │   │   ├── setup.bash
    │   │   │   │   ├── setup.sh
    │   │   │   │   └── setup.zsh
    │   │   │   ├── ordered_paths.cmake
    │   │   │   ├── package.cmake
    │   │   │   ├── pkg.develspace.context.pc.py
    │   │   │   ├── pkg.installspace.context.pc.py
    │   │   │   ├── setup_cached.sh
    │   │   │   └── stamps/
    │   │   │       └── rf2o_laser_odometry/
    │   │   │           ├── _setup_util.py.stamp
    │   │   │           ├── interrogate_setup_dot_py.py.stamp
    │   │   │           ├── package.xml.stamp
    │   │   │           └── pkg.pc.em.stamp
    │   │   ├── cmake_install.cmake
    │   │   ├── devel/
    │   │   │   ├── .catkin
    │   │   │   ├── .rosinstall
    │   │   │   ├── _setup_util.py
    │   │   │   ├── env.sh
    │   │   │   ├── lib/
    │   │   │   │   └── pkgconfig/
    │   │   │   │       └── rf2o_laser_odometry.pc
    │   │   │   ├── setup.bash
    │   │   │   ├── setup.sh
    │   │   │   ├── setup.zsh
    │   │   │   └── share/
    │   │   │       └── rf2o_laser_odometry/
    │   │   │           └── cmake/
    │   │   │               ├── rf2o_laser_odometryConfig-version.cmake
    │   │   │               └── rf2o_laser_odometryConfig.cmake
    │   │   └── rf2o_laser_odometry.cbp
    │   ├── include/
    │   │   └── rf2o_laser_odometry/
    │   │       └── CLaserOdometry2D.h
    │   ├── launch/
    │   │   └── rf2o_laser_odometry.launch
    │   ├── package.xml
    │   └── src/
    │       └── CLaserOdometry2D.cpp
    └── robot_localization/
        ├── CHANGELOG.rst
        ├── CMakeLists.txt
        ├── LICENSE
        ├── README.md
        ├── doc/
        │   ├── .templates/
        │   │   └── full_globaltoc.html
        │   ├── Makefile
        │   ├── conf.py
        │   ├── configuring_robot_localization.rst
        │   ├── index.rst
        │   ├── integrating_gps.rst
        │   ├── manifest.yaml
        │   ├── migrating_from_robot_pose_ekf.rst
        │   ├── navsat_transform_node.rst
        │   ├── preparing_sensor_data.rst
        │   └── state_estimation_nodes.rst
        ├── include/
        │   └── robot_localization/
        │       ├── ekf.h
        │       ├── filter_base.h
        │       ├── filter_common.h
        │       ├── filter_utilities.h
        │       ├── navsat_conversions.h
        │       ├── navsat_transform.h
        │       ├── robot_localization_estimator.h
        │       ├── ros_filter.h
        │       ├── ros_filter_types.h
        │       ├── ros_filter_utilities.h
        │       ├── ros_robot_localization_listener.h
        │       └── ukf.h
        ├── launch/
        │   ├── dual_ekf_navsat_example.launch
        │   ├── ekf_template.launch
        │   ├── navsat_transform_template.launch
        │   └── ukf_template.launch
        ├── package.xml
        ├── params/
        │   ├── dual_ekf_navsat_example.yaml
        │   ├── ekf_template.yaml
        │   ├── navsat_transform_template.yaml
        │   └── ukf_template.yaml
        ├── rosdoc.yaml
        ├── src/
        │   ├── ekf.cpp
        │   ├── ekf_localization_node.cpp
        │   ├── filter_base.cpp
        │   ├── filter_utilities.cpp
        │   ├── navsat_transform.cpp
        │   ├── navsat_transform_node.cpp
        │   ├── robot_localization_estimator.cpp
        │   ├── robot_localization_listener_node.cpp
        │   ├── ros_filter.cpp
        │   ├── ros_filter_utilities.cpp
        │   ├── ros_robot_localization_listener.cpp
        │   ├── ukf.cpp
        │   └── ukf_localization_node.cpp
        ├── srv/
        │   ├── GetState.srv
        │   ├── SetDatum.srv
        │   └── SetPose.srv
        └── test/
            ├── record_all_stats.sh
            ├── stat_recorder.sh
            ├── test1.bag
            ├── test2.bag
            ├── test3.bag
            ├── test_ekf.cpp
            ├── test_ekf.test
            ├── test_ekf_localization_node_bag1.test
            ├── test_ekf_localization_node_bag2.test
            ├── test_ekf_localization_node_bag3.test
            ├── test_ekf_localization_node_interfaces.cpp
            ├── test_ekf_localization_node_interfaces.test
            ├── test_filter_base.cpp
            ├── test_filter_base_diagnostics_timestamps.cpp
            ├── test_filter_base_diagnostics_timestamps.test
            ├── test_localization_node_bag_pose_tester.cpp
            ├── test_robot_localization_estimator.cpp
            ├── test_robot_localization_estimator.test
            ├── test_ros_robot_localization_listener.cpp
            ├── test_ros_robot_localization_listener.test
            ├── test_ros_robot_localization_listener_publisher.cpp
            ├── test_ukf.cpp
            ├── test_ukf.test
            ├── test_ukf_localization_node_bag1.test
            ├── test_ukf_localization_node_bag2.test
            ├── test_ukf_localization_node_bag3.test
            ├── test_ukf_localization_node_interfaces.cpp
            └── test_ukf_localization_node_interfaces.test

================================================
FILE CONTENTS
================================================

================================================
FILE: .catkin_workspace
================================================
# This file currently only serves to mark the location of a catkin workspace for tool integration


================================================
FILE: README.md
================================================
# art_racecar  
# art-racecar V1.0  2019.01.30   
# art-racecar V1.1  2019.07.17 完善手柄遥控功能   

ROS racecar  
************************安装************************  
cd  ~/  
git clone https://github.com/ART-Robot-Release/racecar  
cd racecar  
./install.sh  
配置小车串口udev:  
cd  ~/racecar/src/art_racecar/udev  
sudo  bash art_init.sh  
sudo reboot  
**********************建立地图**********************  
先安装电脑用户名和主机名配置主从机  
a) 运行车  
roslaunch art_racecar Run_car.launch  
b) 3.3运行gmapping  
roslaunch art_racecar Run_gmapping.launch  
c) 3.4运行键盘控制  
rosrun art_racecar racecar_teleop.py  
或者手柄遥控  
roslaunch art_racecar teleop_joy.launch  
d) 3.5.本地电脑打开rviz  
本地电脑打开:  
source  工作空间  
source art_racecar/art_rviz.sh  
roslaunch art_racecar rviz.launch  
e) 3.6 建立地图  
键盘控制建立地图,按键如下:  
U	I 	O  
J	K	L  
M	, 	.  
加减速为W,S.  
手柄控制:  
L侧方向键:上下为加速减速,左右为转向幅度大小调节  
R侧摇杆:控制小车运动  
f) 保存地图(地图直接保存在小车上)  
在art_racecar文件夹下执行:bash save_map.sh  
地图保存在art_racecar/map/mymap.pgm  
检查无误后,修改mymap.pgm替换为test.pgm  

************************导航************************  
a) SSH连接小车(Ubuntu系统为例)sz为小车用户名  
ssh sz@192.168.5.101  
b) 运行车  
roslaunch art_racecar Run_car.launch  
c) 运行AMCL  
roslaunch art_racecar amcl_nav.launch  
d) .本地电脑打开rviz  
本地电脑打开:  
source  工作空间  
source art_racecar/art_rviz.sh  
roslaunch art_racecar rviz.launch  
e) 4.5 开始导航   
在RVIZ中设定初始坐标,设定目标位置,开始导航  
*********************软件接口***********************  
1.启动底盘  
	启动底盘需要启动rosserial_python节点。  
	设置参考art_racecar/launch/Run_car.launch  
2.发布地盘控制指令:  
	通过发布Twist消息控制底盘。  
	线速度:twist.linear.x,这里的线速度范围为500~2500(对应PWM脉冲为0.5ms~2.5ms),1500为静止,1500-2500为正向速度,500-1500为反向速度。  
	角速度:twist.angular.x,这里角度范围为0~180度,90度为中间值,90-180度左转,0-90度右转。  
3.里程计数据:  
	里程计采用激光雷达和IMU数据融合的里程计。  
	需要先启动IMU节点和雷达节点,参考art_racecar/launch/Run_car.launch  
	然后启动rf2o节点,用rf2o生成激光里程计,参考art_racecar/launch/includes/rf2o.launch.xml  
	再启动robot_localization用EKF融合里程计信息,参考art_racecar/launch/Run_gmapping.launch  
	


											
											# Steven Zhang
											# 2019.01.30
	


================================================
FILE: install.sh
================================================
#!/bin/bash

# Varibles
rosversion="kinetic"
# Install the ros

if [ `id -u` == 0 ]; then
	echo "Don't running this use root(sudo)."
	exit 0
fi

echo "Start to install the ros, http://wiki.ros.org/$rosversion/Installation/Ubuntu"
echo "Update the software list"
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
sudo apt-get update

echo "Install the ros from apt" 
sudo apt-get install ros-$rosversion-desktop-full -y
sudo rosdep init
rosdep update

echo "Setup the ROS environment variables"
echo -e "if [ -f /opt/ros/kinetic/setup.bash ]; then\n\tsource /opt/ros/kinetic/setup.bash\nfi" >> ~/.bashrc
echo "source ~/racecar/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc

echo "Install the rosinstall"
sudo apt-get install python-rosinstall -y

echo "Install the ssh"
sudo apt-get install ssh -y

echo "Install the ntpdate"
sudo apt-get install ntpdate -y

echo "Install the chrony"
sudo apt-get install chrony -y

# Install the dependecies for the project 
echo "Start to config for the project"

#echo "Install the python dependecies"
#sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy python-nose -y

#echo "Install the eigen3"
#sudo apt install libeigen3-dev -y

#echo "Install the nlopt"
#sudo apt install libnlopt* -y



echo "Install the ROS package for art_racecar"
sudo apt-get install ros-$rosversion-joy -y
sudo apt-get install ros-$rosversion-move-base -y
sudo apt-get install ros-$rosversion-mrpt* -y
sudo apt-get install ros-$rosversion-geographic-msgs -y
sudo apt-get install ros-$rosversion-map-server -y
sudo apt-get install ros-$rosversion-gmapping -y
sudo apt-get install ros-$rosversion-amcl -y
sudo apt-get install ros-$rosversion-rviz-imu-plugin -y
sudo apt-get install ros-$rosversion-dwa-local-planner -y

echo "--Finish"


================================================
FILE: src/art_driver/CMakeLists.txt
================================================
# Created by Steven Zhang on 18-12-29.
# art racecar

cmake_minimum_required(VERSION 2.8.3)
project(art_driver)

## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)

## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
)

## System dependencies are found with CMake's conventions
# find_package(Boost REQUIRED COMPONENTS system)


## Uncomment this if the package has a setup.py. This macro ensures
## modules and global scripts declared therein get installed
## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html
# catkin_python_setup()

################################################
## Declare ROS messages, services and actions ##
################################################

## To declare and build messages, services or actions from within this
## package, follow these steps:
## * Let MSG_DEP_SET be the set of packages whose message types you use in
##   your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...).
## * In the file package.xml:
##   * add a build_depend tag for "message_generation"
##   * add a build_depend and a run_depend tag for each package in MSG_DEP_SET
##   * If MSG_DEP_SET isn't empty the following dependency has been pulled in
##     but can be declared for certainty nonetheless:
##     * add a run_depend tag for "message_runtime"
## * In this file (CMakeLists.txt):
##   * add "message_generation" and every package in MSG_DEP_SET to
##     find_package(catkin REQUIRED COMPONENTS ...)
##   * add "message_runtime" and every package in MSG_DEP_SET to
##     catkin_package(CATKIN_DEPENDS ...)
##   * uncomment the add_*_files sections below as needed
##     and list every .msg/.srv/.action file to be processed
##   * uncomment the generate_messages entry below
##   * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...)

## Generate messages in the 'msg' folder
# add_message_files(
#   FILES
#   Message1.msg
#   Message2.msg
# )

## Generate services in the 'srv' folder
# add_service_files(
#   FILES
#   Service1.srv
#   Service2.srv
# )

## Generate actions in the 'action' folder
# add_action_files(
#   FILES
#   Action1.action
#   Action2.action
# )

## Generate added messages and services with any dependencies listed here
# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )

################################################
## Declare ROS dynamic reconfigure parameters ##
################################################

## To declare and build dynamic reconfigure parameters within this
## package, follow these steps:
## * In the file package.xml:
##   * add a build_depend and a run_depend tag for "dynamic_reconfigure"
## * In this file (CMakeLists.txt):
##   * add "dynamic_reconfigure" to
##     find_package(catkin REQUIRED COMPONENTS ...)
##   * uncomment the "generate_dynamic_reconfigure_options" section below
##     and list every .cfg file to be processed

## Generate dynamic reconfigure parameters in the 'cfg' folder
# generate_dynamic_reconfigure_options(
#   cfg/DynReconf1.cfg
#   cfg/DynReconf2.cfg
# )

###################################
## catkin specific configuration ##
###################################
## The catkin_package macro generates cmake config files for your package
## Declare things to be passed to dependent projects
## INCLUDE_DIRS: uncomment this if your package contains header files
## LIBRARIES: libraries you create in this project that dependent projects also need
## CATKIN_DEPENDS: catkin_packages dependent projects also need
## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES art_driver
#  CATKIN_DEPENDS roscpp rospy std_msgs
#  DEPENDS system_lib
   CATKIN_DEPENDS roscpp rospy std_msgs
)

###########
## Build ##
###########

## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
   include
   ${catkin_INCLUDE_DIRS}
)




## Add cmake target dependencies of the library
## as an example, code may need to be generated before libraries
## either from message generation or dynamic reconfigure
# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

## Declare a C++ executable
## With catkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
 add_executable(${PROJECT_NAME}_node src/art_racecar.cpp
         include/art_racecar_driver.h
         )

## Rename C++ executable without prefix
## The above recommended prefix causes long target names, the following renames the
## target back to the shorter version for ease of user use
## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")



## Add cmake target dependencies of the executable
## same as for the library above
# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

## Specify libraries to link a library or executable target against


#find_library(./lib libart_driver.a)





#link_directories(./lib/libart_driver.a)
 target_link_libraries(${PROJECT_NAME}_node
   ${catkin_LIBRARIES}
   ${PROJECT_SOURCE_DIR}/lib/libart_driver.a
   
 )

#target_link_libraries(${PROJECT_NAME}_node
#
#        ${CMAKE_SOURCE_DIR}/lib/libart_driver.a -lm -ldl
#
 #       )

#############
## Install ##
#############

# all install targets should use catkin DESTINATION variables
# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html

## Mark executable scripts (Python etc.) for installation
## in contrast to setup.py, you can choose the destination
# install(PROGRAMS
#   scripts/my_python_script
#   DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )

## Mark executables and/or libraries for installation
# install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_node
#   ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
#   LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
#   RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )

## Mark cpp header files for installation
# install(DIRECTORY include/${PROJECT_NAME}/
#   DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
#   FILES_MATCHING PATTERN "*.h"
#   PATTERN ".svn" EXCLUDE
# )

## Mark other files for installation (e.g. launch and bag files, etc.)
# install(FILES
#   # myfile1
#   # myfile2
#   DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
# )

#############
## Testing ##
#############

## Add gtest based cpp test target and link libraries
# catkin_add_gtest(${PROJECT_NAME}-test test/test_art_driver.cpp)
# if(TARGET ${PROJECT_NAME}-test)
#   target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})
# endif()

## Add folders to be run by python nosetests
# catkin_add_nosetests(test)


================================================
FILE: src/art_driver/README
================================================
/*******************************************************************/
/***************art_driverr*****************************************/
/*******************************************************************/
这是art racecar的底层驱动例程
这个历程订阅/car/cmd_vel的twist的消息,发送给底层单片机
具体可以参考art_racecar.cpp
使用send_cmd()函数向单片机发送指令,函数参数分别为电机PWM和舵机PWM.
PWM范围为500-2500us.


/*********************************************北京钢铁侠科技 **********/
/*********************************************Steven Zhang ***********/
/*********************************************2018.12.29**************/


================================================
FILE: src/art_driver/include/art_racecar_driver.h
================================================

//
// Created by Steven Zhang on 18-12-14.
// art racecar
//

#ifndef ART_RACECAR_DRIVER
#define ART_RACECAR_DRIVER
#include <stdint.h>
#include <unistd.h>

#if defined(__cplusplus)
extern "C" {
#endif




int Open_Serial_Dev(char *dev);

int art_racecar_init(int speed,char *dev);//设置波特率和串口设备


unsigned char send_cmd(uint16_t motor_pwm,uint16_t servo_pwm);//发送指令(电机PWM,舵机PWM),单位为us.







#if defined(__cplusplus)
}
#endif
#endif


================================================
FILE: src/art_driver/package.xml
================================================
<?xml version="1.0"?>
<package format="2">
  <name>art_driver</name>
  <version>0.1.0</version>
  <description>The art_car package</description>

  <!-- One maintainer tag required, multiple allowed, one person per tag -->
  <!-- Example:  -->
  <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
  <maintainer email="zhangnan@artrobot.com">zn</maintainer>


  <!-- One license tag required, multiple allowed, one license per tag -->
  <!-- Commonly used license strings: -->
  <!--   BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
  <license>TODO</license>


  <!-- Url tags are optional, but multiple are allowed, one per tag -->
  <!-- Optional attribute type can be: website, bugtracker, or repository -->
  <!-- Example: -->
  <!-- <url type="website">http://wiki.ros.org/art_driver</url> -->


  <!-- Author tags are optional, multiple are allowed, one per tag -->
  <!-- Authors do not have to be maintainers, but could be -->
  <!-- Example: -->
  <!-- <author email="jane.doe@example.com">Jane Doe</author> -->


  <!-- The *depend tags are used to specify dependencies -->
  <!-- Dependencies can be catkin packages or system dependencies -->
  <!-- Examples: -->
  <!-- Use depend as a shortcut for packages that are both build and exec dependencies -->
  <!--   <depend>roscpp</depend> -->
  <!--   Note that this is equivalent to the following: -->
  <!--   <build_depend>roscpp</build_depend> -->
  <!--   <exec_depend>roscpp</exec_depend> -->
  <!-- Use build_depend for packages you need at compile time: -->
  <!--   <build_depend>message_generation</build_depend> -->
  <!-- Use build_export_depend for packages you need in order to build against this package: -->
  <!--   <build_export_depend>message_generation</build_export_depend> -->
  <!-- Use buildtool_depend for build tool packages: -->
  <!--   <buildtool_depend>catkin</buildtool_depend> -->
  <!-- Use exec_depend for packages you need at runtime: -->
  <!--   <exec_depend>message_runtime</exec_depend> -->
  <!-- Use test_depend for packages you need only for testing: -->
  <!--   <test_depend>gtest</test_depend> -->
  <!-- Use doc_depend for packages you need only for building documentation: -->
  <!--   <doc_depend>doxygen</doc_depend> -->
  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>
  <build_export_depend>roscpp</build_export_depend>
  <build_export_depend>rospy</build_export_depend>
  <build_export_depend>std_msgs</build_export_depend>
  <exec_depend>roscpp</exec_depend>
  <exec_depend>rospy</exec_depend>
  <exec_depend>std_msgs</exec_depend>


  <!-- The export tag contains other, unspecified, tags -->
  <export>
    <!-- Other tools can request additional information be placed here -->

  </export>
</package>


================================================
FILE: src/art_driver/src/art_racecar.cpp
================================================
//
// Created by Steven Zhang on 18-12-14.
// art racecar
//

#include "../include/art_racecar_driver.h"
#include <ros/ros.h>
#include <ros/package.h>
#include <geometry_msgs/Twist.h>

void TwistCallback(const geometry_msgs::Twist& twist)
{
    double angle;
    //ROS_INFO("x= %f", twist.linear.x);
    //ROS_INFO("z= %f", twist.angular.z);
    angle = 2500.0 - twist.angular.z * 2000.0 / 180.0;
    //ROS_INFO("angle= %d",uint16_t(angle));
    send_cmd(uint16_t(twist.linear.x),uint16_t(angle));
}

int main(int argc, char** argv)
{
    char data[] = "/dev/car";
    art_racecar_init(38400,data);
    ros::init(argc, argv, "art_driver");
    ros::NodeHandle n;

    ros::Subscriber sub = n.subscribe("/car/cmd_vel",1,TwistCallback);



    ros::spin();

}

================================================
FILE: src/art_imu/CMakeLists.txt
================================================
cmake_minimum_required(VERSION 2.8.3)
project(art_imu)


add_definitions(-std=c++11)
find_package(catkin REQUIRED roscpp sensor_msgs tf cmake_modules)

find_package(catkin REQUIRED COMPONENTS)


include_directories(${catkin_INCLUDE_DIRS})

find_package(Eigen REQUIRED)

catkin_package(
)

add_executable(art_imu
  src/art_imu.cc
)

target_link_libraries(art_imu
  ${catkin_LIBRARIES}
)


================================================
FILE: src/art_imu/launch/imu.launch
================================================
<?xml version="1.0"?>
<launch>
  <node pkg="art_imu"
        name="imu"
        type="art_imu"
        output="screen">
    <param name="port" value="/dev/imu"/>
    

    <param name="model" value="art_imu_02a"/>
    <param name="baud" value="115200"/>

  </node>

</launch>


================================================
FILE: src/art_imu/launch/imu_test.launch
================================================
<?xml version="1.0"?>
<launch>
  <node pkg="art_imu"
        name="imu"
        type="art_imu"
        output="screen">
    <param name="port" value="/dev/ttyUSB0"/>
    

    <param name="model" value="art_imu_02a"/>
    <param name="baud" value="115200"/>

  </node>

</launch>


================================================
FILE: src/art_imu/launch/rviz.launch
================================================
<?xml version="1.0"?>

<launch>
    <arg name="use_rviz" default="true" />

   

    <!-- Rviz -->
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find art_imu)/rviz/imu.rviz" if="$(arg use_rviz)" />
</launch>


================================================
FILE: src/art_imu/package.xml
================================================
<?xml version="1.0"?>
<package>
  <name>art_imu</name>
  <version>0.1.0</version>
  <description>The art_imu package</description>
  <maintainer email="zhangnan@artrobot.com">Steven Zhang</maintainer>

  <author>Steven Zhang</author>
  <license>BSD</license>
  <buildtool_depend>catkin</buildtool_depend>
  <buildtool_depend>roscpp</buildtool_depend>
  <buildtool_depend>sensor_msgs</buildtool_depend>
  <buildtool_depend>tf</buildtool_depend>
  <buildtool_depend>cmake_modules</buildtool_depend>

  <run_depend>catkin</run_depend>
  <run_depend>roscpp</run_depend>
  <run_depend>sensor_msgs</run_depend>
  <run_depend>tf</run_depend>
  <export>
  </export>
</package>


================================================
FILE: src/art_imu/rviz/imu.rviz
================================================
Panels:
  - Class: rviz/Displays
    Help Height: 78
    Name: Displays
    Property Tree Widget:
      Expanded:
        - /Global Options1
        - /Imu1
        - /Imu1/Box properties1
        - /Imu1/Axes properties1
        - /Imu1/Acceleration properties1
      Splitter Ratio: 0.5
    Tree Height: 655
  - Class: rviz/Selection
    Name: Selection
  - Class: rviz/Tool Properties
    Expanded:
      - /2D Pose Estimate1
      - /2D Nav Goal1
      - /Publish Point1
    Name: Tool Properties
    Splitter Ratio: 0.588679016
  - Class: rviz/Views
    Expanded:
      - /Current View1
    Name: Views
    Splitter Ratio: 0.5
  - Class: rviz/Time
    Experimental: false
    Name: Time
    SyncMode: 0
    SyncSource: ""
Visualization Manager:
  Class: ""
  Displays:
    - Alpha: 0.5
      Cell Size: 1
      Class: rviz/Grid
      Color: 160; 160; 164
      Enabled: true
      Line Style:
        Line Width: 0.0299999993
        Value: Lines
      Name: Grid
      Normal Cell Count: 0
      Offset:
        X: 0
        Y: 0
        Z: 0
      Plane: XY
      Plane Cell Count: 10
      Reference Frame: <Fixed Frame>
      Value: true
    - Alpha: 1
      Autocompute Intensity Bounds: true
      Autocompute Value Bounds:
        Max Value: 10
        Min Value: -10
        Value: true
      Axis: Z
      Channel Name: intensity
      Class: rviz/LaserScan
      Color: 255; 255; 255
      Color Transformer: Intensity
      Decay Time: 0
      Enabled: true
      Invert Rainbow: false
      Max Color: 255; 255; 255
      Max Intensity: 2666
      Min Color: 0; 0; 0
      Min Intensity: 2
      Name: LaserScan
      Position Transformer: XYZ
      Queue Size: 10
      Selectable: true
      Size (Pixels): 3
      Size (m): 0.0500000007
      Style: Flat Squares
      Topic: /scan
      Unreliable: false
      Use Fixed Frame: true
      Use rainbow: true
      Value: true
    - Class: rviz/TF
      Enabled: true
      Frame Timeout: 15
      Frames:
        All Enabled: true
      Marker Scale: 1
      Name: TF
      Show Arrows: true
      Show Axes: true
      Show Names: true
      Tree:
        {}
      Update Interval: 0
      Value: true
    - Acceleration properties:
        Acc. vector alpha: 1
        Acc. vector color: 255; 0; 0
        Acc. vector scale: 1
        Derotate acceleration: true
        Enable acceleration: false
      Axes properties:
        Axes scale: 2
        Enable axes: true
      Box properties:
        Box alpha: 1
        Box color: 255; 0; 0
        Enable box: true
        x_scale: 0.400000006
        y_scale: 0.300000012
        z_scale: 0.300000012
      Class: rviz_imu_plugin/Imu
      Enabled: true
      Name: Imu
      Topic: /imu_data
      Unreliable: false
      Value: true
      fixed_frame_orientation: true
  Enabled: true
  Global Options:
    Background Color: 48; 48; 48
    Default Light: true
    Fixed Frame: IMU_link
    Frame Rate: 30
  Name: root
  Tools:
    - Class: rviz/Interact
      Hide Inactive Objects: true
    - Class: rviz/MoveCamera
    - Class: rviz/Select
    - Class: rviz/FocusCamera
    - Class: rviz/Measure
    - Class: rviz/SetInitialPose
      Topic: /initialpose
    - Class: rviz/SetGoal
      Topic: /move_base_simple/goal
    - Class: rviz/PublishPoint
      Single click: true
      Topic: /clicked_point
  Value: true
  Views:
    Current:
      Class: rviz/Orbit
      Distance: 19.7761364
      Enable Stereo Rendering:
        Stereo Eye Separation: 0.0599999987
        Stereo Focal Distance: 1
        Swap Stereo Eyes: false
        Value: false
      Focal Point:
        X: 1.2478348
        Y: -3.33640909
        Z: 0.00110054587
      Focal Shape Fixed Size: true
      Focal Shape Size: 0.0500000007
      Invert Z Axis: false
      Name: Current View
      Near Clip Distance: 0.00999999978
      Pitch: 1.56979632
      Target Frame: <Fixed Frame>
      Value: Orbit (rviz)
      Yaw: 3.04539394
    Saved: ~
Window Geometry:
  Displays:
    collapsed: false
  Height: 936
  Hide Left Dock: false
  Hide Right Dock: true
  QMainWindow State: 000000ff00000000fd00000004000000000000016a0000031efc020000000bfb0000001200530065006c0065006300740069006f006e00000001e10000009b0000006100fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c00610079007301000000280000031e000000d700fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261fb0000000c00430061006d00650072006100000001d1000000b50000000000000000fb0000000a0049006d0061006700650000000000ffffffff0000000000000000fb0000000a0049006d00610067006501000002ab00000113000000000000000000000001000001a30000025efc0200000004fb0000000a0049006d00610067006500000000280000025e0000000000000000fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a0056006900650077007300000000280000025e000000ad00fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000005160000003efc0100000002fb0000000800540069006d00650100000000000005160000030000fffffffb0000000800540069006d00650100000000000004500000000000000000000003a60000031e00000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
  Selection:
    collapsed: false
  Time:
    collapsed: false
  Tool Properties:
    collapsed: false
  Views:
    collapsed: false
  Width: 1302
  X: 538
  Y: 105


================================================
FILE: src/art_imu/src/art_imu.cc
================================================
#include <deque>
#include <ros/ros.h>
#include <sensor_msgs/Imu.h>
#include <sensor_msgs/MagneticField.h>
#include <sensor_msgs/NavSatFix.h>
#include <tf/tf.h>
#include <eigen3/Eigen/Geometry> 
#include <chrono>
#include <locale>
#include <tuple>
#include <algorithm>
#include <iostream>
#include <string>
#include <sstream>
#include <stdexcept>
#include <boost/assert.hpp>
#include <boost/asio.hpp>
#include <boost/asio/serial_port.hpp>

extern "C" {
#include <fcntl.h>
#include <getopt.h>
#include <poll.h>
#include <time.h>
#include <errno.h>
#include <termios.h>
#include <sys/ioctl.h>
#include <assert.h>
#include <unistd.h> //  close
#include <string.h> //  strerror
}


using namespace std;

static int data_length = 81;


boost::asio::serial_port* serial_port = 0;
static const uint8_t stop[6] = {0xA5, 0x5A, 0x04, 0x02, 0x06, 0xAA};
static const uint8_t mode[6] = {0xA5, 0x5A, 0x04, 0x01, 0x05, 0xAA};
static uint8_t data_raw[200];
static std::vector<uint8_t> buffer_;
static std::deque<uint8_t> queue_;
static std::string name, frame_id;
static sensor_msgs::Imu msg;
static sensor_msgs::MagneticField msg_mag;
static sensor_msgs::NavSatFix msg_gps;
static int fd_ = -1;
static ros::Publisher pub, pub_mag, pub_gps;
static uint8_t tmp[81];

static float d2f_acc(uint8_t a[2])
{
    int16_t acc = a[0];
    acc = (acc << 8) | a[1];
    return ((float) acc) / 16384.0f;
}

static float d2f_gyro(uint8_t a[2])
{
    int16_t acc = a[0];
    acc = (acc << 8) | a[1];
    return ((float) acc) / 32.8f;
}

static float d2f_mag(uint8_t a[2])
{
    int16_t acc = a[0];
    acc = (acc << 8) | a[1];
    return ((float) acc) / 1.0f;
}

static float d2f_euler(uint8_t a[2])
{
    int16_t acc = a[0];
    acc = (acc << 8) | a[1];
    return ((float) acc) / 10.0f;
}


static double d2f_latlon(uint8_t a[4])
{
    int64_t high = a[0];
    high = (high << 8) | a[1];

    int64_t low = a[2];
    low = (low << 8) | a[3];
    return (double)((high << 8) | low);
}

static double d2f_gpsvel(uint8_t a[2])
{
    int16_t acc = a[0];
    acc = (acc << 8) | a[1];
    return ((float) acc) / 10.0f;
}

static float d2ieee754(uint8_t a[4])
{
    union fnum {
        float f_val;
        uint8_t d_val[4];
    } f;

    memcpy(f.d_val, a, 4);
    return f.f_val;
}


int uart_set(int fd, int baude, int c_flow, int bits, char parity, int stop)
{
    struct termios options;
 
    if(tcgetattr(fd, &options) < 0)
    {
        perror("tcgetattr error");
        return -1;
    }

    cfsetispeed(&options,B115200);
    cfsetospeed(&options,B115200);

    options.c_cflag |= CLOCAL;
    options.c_cflag |= CREAD;

    switch(c_flow)
    {
        case 0:
            options.c_cflag &= ~CRTSCTS;
            break;
        case 1:
            options.c_cflag |= CRTSCTS;
            break;
        case 2:
            options.c_cflag |= IXON|IXOFF|IXANY;
            break;
        default:
            fprintf(stderr,"Unkown c_flow!\n");
            return -1;
    }

    switch(bits)
    {
        case 5:
            options.c_cflag &= ~CSIZE;
            options.c_cflag |= CS5;
            break;
        case 6:
            options.c_cflag &= ~CSIZE;
            options.c_cflag |= CS6;
            break;
        case 7:
            options.c_cflag &= ~CSIZE;
            options.c_cflag |= CS7;
            break;
        case 8:
            options.c_cflag &= ~CSIZE;
            options.c_cflag |= CS8;
            break;
        default:
            fprintf(stderr,"Unkown bits!\n");
            return -1;
    }

    switch(parity)
    {
        case 'n':
        case 'N':
            options.c_cflag &= ~PARENB;
            options.c_cflag &= ~INPCK;
            break;

        case 's':
        case 'S':
            options.c_cflag &= ~PARENB;
            options.c_cflag &= ~CSTOPB;
            break;

        case 'o':
        case 'O':
            options.c_cflag |= PARENB;
            options.c_cflag |= PARODD;
            options.c_cflag |= INPCK;
            options.c_cflag |= ISTRIP;
            break;

        case 'e':
        case 'E':
            options.c_cflag |= PARENB;
            options.c_cflag &= ~PARODD;
            options.c_cflag |= INPCK;
            options.c_cflag |= ISTRIP;
            break;
        default:
            fprintf(stderr,"Unkown parity!\n");
            return -1;
    }

    switch(stop)
    {
        case 1:
            options.c_cflag &= ~CSTOPB;
            break;
        case 2:
            options.c_cflag |= CSTOPB;
            break;
        default:
            fprintf(stderr,"Unkown stop!\n");
            return -1;
    }

    options.c_oflag &= ~OPOST;
    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
    options.c_cc[VTIME] = 0;
    options.c_cc[VMIN] = 1;

    tcflush(fd,TCIFLUSH);

    if(tcsetattr(fd,TCSANOW,&options) < 0)
    {
        perror("tcsetattr failed");
        return -1;
    }

    return 0;

}


int main(int argc, char** argv)
{
    ros::init(argc, argv, "imu");
    ros::NodeHandle n("~");

    name = ros::this_node::getName();

    std::string port;
    if (n.hasParam("port"))
    n.getParam("port", port);
    else
    {
        ROS_ERROR("%s: must provide a port", name.c_str());
        return -1;
    }

    std::string model;
    if (n.hasParam("model"))
    n.getParam("model", model);
    else
    {
        ROS_ERROR("%s: must provide a model name", name.c_str());
        return -1;
    }


    ROS_WARN("Model set to %s", model.c_str());

    int baud;
    if (n.hasParam("baud"))
    n.getParam("baud", baud);
    else
    {
        ROS_ERROR("%s: must provide a baudrate", name.c_str());
        return -1;
    }



    ROS_WARN("Baudrate set to %d", baud);
  
    n.param("frame_id", frame_id, string("IMU_link"));

    double delay;
    n.param("delay", delay, 0.0);

    boost::asio::io_service io_service;
    serial_port = new boost::asio::serial_port(io_service);
    try
    {
        serial_port->open(port);
    }
    catch (boost::system::system_error &error)
    {
        ROS_ERROR("%s: Failed to open port %s with error %s",
                name.c_str(), port.c_str(), error.what());
        return -1;
    }

    if (!serial_port->is_open())
    {
        ROS_ERROR("%s: failed to open serial port %s",
                name.c_str(), port.c_str());
        return -1;
    }

    typedef boost::asio::serial_port_base sb;

    sb::baud_rate baud_option(baud);
     sb::flow_control flow_control(sb::flow_control::none);
    sb::parity parity(sb::parity::none);
    sb::stop_bits stop_bits(sb::stop_bits::one);

    serial_port->set_option(baud_option);
    serial_port->set_option(flow_control);
    serial_port->set_option(parity);
    serial_port->set_option(stop_bits);

    const char *path = port.c_str();
    fd_ = open(path, O_RDWR);
    if(fd_ < 0)
    {
        ROS_ERROR("Port Error!: %s", path);
        return -1;
    }

    int kk = 0;
    double vyaw_sum = 0;
    double vyaw_bias = 0;
    pub = n.advertise<sensor_msgs::Imu>("/imu_data", 1);
    pub_mag = n.advertise<sensor_msgs::MagneticField>("mag", 1);
    pub_gps = n.advertise<sensor_msgs::NavSatFix>("gps", 1);


	if(model == "art_imu_02a")
    {
       write(fd_, stop, 6);
       usleep(1000 * 1000);
       write(fd_, mode, 6);
       usleep(1000 * 1000);
       data_length = 40;
   	}


    ROS_WARN("Streaming Data...");
    while (n.ok())
    {
        read(fd_, tmp, sizeof(uint8_t) * data_length);
        memcpy(data_raw, tmp, sizeof(uint8_t) * data_length);

        bool found = false;
        for(kk = 0; kk < data_length - 1; ++kk)
        {
            	  
            if(model == "art_imu_02a" && data_raw[kk] == 0xA5 && data_raw[kk + 1] == 0x5A)
            {
                unsigned char *data = data_raw + kk;

                uint8_t data_length = data[2];

                uint32_t checksum = 0;
                for(int i = 0; i < data_length - 1  ; ++i)
                {
                    checksum += (uint32_t) data[i+2];
                }

                uint16_t check = checksum % 256;
                uint16_t check_true = data[data_length+1];

                if (check != check_true)
                {
                    printf("check error,please wait\n");
                    continue;
                }

                Eigen::Vector3d ea0((-vyaw_bias-d2f_euler(data + 3)) * M_PI / 180.0,
                                 0,
                                  0);
                Eigen::Matrix3d R;
                R = Eigen::AngleAxisd(ea0[0], ::Eigen::Vector3d::UnitZ())
                  * Eigen::AngleAxisd(ea0[1], ::Eigen::Vector3d::UnitY())
                  * Eigen::AngleAxisd(ea0[2], ::Eigen::Vector3d::UnitX());
                Eigen::Quaterniond q;
                q = R;
                msg.orientation.w = (double)q.w();
                msg.orientation.x = (double)q.x();
                msg.orientation.y = (double)q.y();
                msg.orientation.z = (double)q.z();

                msg.header.stamp = ros::Time::now();
                msg.header.frame_id = frame_id;
                msg.angular_velocity.x = d2f_gyro(data + 15);
                msg.angular_velocity.y = d2f_gyro(data + 17);
                msg.angular_velocity.z = d2f_gyro(data + 19);
                msg.linear_acceleration.x = d2f_acc(data + 9) * 9.81;
                msg.linear_acceleration.y = d2f_acc(data + 11) * 9.81;
                msg.linear_acceleration.z = d2f_acc(data + 13) * 9.81;
                pub.publish(msg);

                msg_mag.magnetic_field.x = d2f_mag(data + 21);
                msg_mag.magnetic_field.y = d2f_mag(data + 23);
                msg_mag.magnetic_field.z = d2f_mag(data + 25);
                msg_mag.header.stamp = msg.header.stamp;
                msg_mag.header.frame_id = msg.header.frame_id;
                pub_mag.publish(msg_mag);

                found = true;
            }
        }
    }

    // Stop continous and close device
    ROS_WARN("Wait 0.1s");
    ros::Duration(0.1).sleep();
    ::close(fd_);

    return 0;
}


================================================
FILE: src/art_racecar/CMakeLists.txt
================================================
cmake_minimum_required(VERSION 2.8.3)
project(art_racecar)

## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)

## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
  geometry_msgs
  sensor_msgs
  joy
  move_base
  tf
  roscpp
  rospy
  std_msgs
  visualization_msgs
  dynamic_reconfigure
)

generate_dynamic_reconfigure_options(cfg/imu.cfg)

#catkin_package(DEPENDS CATKIN DEPENDS dynamic_reconfigure)
## System dependencies are found with CMake's conventions
# find_package(Boost REQUIRED COMPONENTS system)


## Uncomment this if the package has a setup.py. This macro ensures
## modules and global scripts declared therein get installed
## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html
# catkin_python_setup()

################################################
## Declare ROS messages, services and actions ##
################################################

## To declare and build messages, services or actions from within this
## package, follow these steps:
## * Let MSG_DEP_SET be the set of packages whose message types you use in
##   your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...).
## * In the file package.xml:
##   * add a build_depend tag for "message_generation"
##   * add a build_depend and a run_depend tag for each package in MSG_DEP_SET
##   * If MSG_DEP_SET isn't empty the following dependency has been pulled in
##     but can be declared for certainty nonetheless:
##     * add a run_depend tag for "message_runtime"
## * In this file (CMakeLists.txt):
##   * add "message_generation" and every package in MSG_DEP_SET to
##     find_package(catkin REQUIRED COMPONENTS ...)
##   * add "message_runtime" and every package in MSG_DEP_SET to
##     catkin_package(CATKIN_DEPENDS ...)
##   * uncomment the add_*_files sections below as needed
##     and list every .msg/.srv/.action file to be processed
##   * uncomment the generate_messages entry below
##   * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...)

## Generate messages in the 'msg' folder
# add_message_files(
#   FILES
#   Message1.msg
#   Message2.msg
# )

## Generate services in the 'srv' folder
# add_service_files(
#   FILES
#   Service1.srv
#   Service2.srv
# )

## Generate actions in the 'action' folder
# add_action_files(
#   FILES
#   Action1.action
#   Action2.action
# )

## Generate added messages and services with any dependencies listed here
# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )

################################################
## Declare ROS dynamic reconfigure parameters ##
################################################

## To declare and build dynamic reconfigure parameters within this
## package, follow these steps:
## * In the file package.xml:
##   * add a build_depend and a run_depend tag for "dynamic_reconfigure"
## * In this file (CMakeLists.txt):
##   * add "dynamic_reconfigure" to
##     find_package(catkin REQUIRED COMPONENTS ...)
##   * uncomment the "generate_dynamic_reconfigure_options" section below
##     and list every .cfg file to be processed

## Generate dynamic reconfigure parameters in the 'cfg' folder
# generate_dynamic_reconfigure_options(
#   cfg/DynReconf1.cfg
#   cfg/DynReconf2.cfg
# )

###################################
## catkin specific configuration ##
###################################
## The catkin_package macro generates cmake config files for your package
## Declare things to be passed to dependent projects
## INCLUDE_DIRS: uncomment this if your package contains header files
## LIBRARIES: libraries you create in this project that dependent projects also need
## CATKIN_DEPENDS: catkin_packages dependent projects also need
## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES art_racecar
  CATKIN_DEPENDS roscpp rospy std_msgs
#  DEPENDS system_lib
)

###########
## Build ##
###########

## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
 include
  ${catkin_INCLUDE_DIRS}
)

## Declare a C++ library
# add_library(${PROJECT_NAME}
#   src/${PROJECT_NAME}/art_racecar.cpp
# )

## Add cmake target dependencies of the library
## as an example, code may need to be generated before libraries
## either from message generation or dynamic reconfigure
# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

## Declare a C++ executable
## With catkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
# add_executable(${PROJECT_NAME}_node src/art_racecar_node.cpp)

## Rename C++ executable without prefix
## The above recommended prefix causes long target names, the following renames the
## target back to the shorter version for ease of user use
## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")

## Add cmake target dependencies of the executable
## same as for the library above
# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

## Specify libraries to link a library or executable target against
# target_link_libraries(${PROJECT_NAME}_node
#   ${catkin_LIBRARIES}
# )

#############
## Install ##
#############

# all install targets should use catkin DESTINATION variables
# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html

## Mark executable scripts (Python etc.) for installation
## in contrast to setup.py, you can choose the destination
# install(PROGRAMS
#   scripts/my_python_script
#   DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )

## Mark executables and/or libraries for installation
# install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_node
#   ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
#   LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
#   RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )

## Mark cpp header files for installation
# install(DIRECTORY include/${PROJECT_NAME}/
#   DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
#   FILES_MATCHING PATTERN "*.h"
#   PATTERN ".svn" EXCLUDE
# )

## Mark other files for installation (e.g. launch and bag files, etc.)
# install(FILES
#   # myfile1
#   # myfile2
#   DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
# )

#############
## Testing ##
#############

## Add gtest based cpp test target and link libraries
# catkin_add_gtest(${PROJECT_NAME}-test test/test_art_racecar.cpp)
# if(TARGET ${PROJECT_NAME}-test)
#   target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})
# endif()

## Add folders to be run by python nosetests
# catkin_add_nosetests(test)
install(DIRECTORY launch
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
)

install(DIRECTORY src
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
)




add_executable(art_car_controller 
	src/art_car_controller.cpp 
	src/art_car_controller.hpp
	src/PID.h
)
target_link_libraries(art_car_controller 
	${catkin_LIBRARIES}
	${PROJECT_SOURCE_DIR}/src/lib/libart_controller.a
)
#add_dependencies(art_car_controller art_car_generate_messages_cpp)










================================================
FILE: src/art_racecar/README.md
================================================
# art_racecar  
# art-racecar V1.0  2019.01.30   
# art-racecar V1.1  2019.07.17 完善手柄遥控功能   

ROS racecar  
************************安装************************  
cd  ~/  
git clone https://github.com/ART-Robot-Release/racecar  
cd racecar  
./install.sh  
配置小车串口udev:  
cd  ~/racecar/src/art_racecar/udev  
sudo  bash art_init.sh  
sudo reboot  
**********************建立地图**********************  
先安装电脑用户名和主机名配置主从机  
a) 运行车  
roslaunch art_racecar Run_car.launch  
b) 3.3运行gmapping  
roslaunch art_racecar Run_gmapping.launch  
c) 3.4运行键盘控制  
rosrun art_racecar racecar_teleop.py  
或者手柄遥控  
roslaunch art_racecar teleop_joy.launch  
d) 3.5.本地电脑打开rviz  
本地电脑打开:  
source  工作空间  
source art_racecar/art_rviz.sh  
roslaunch art_racecar rviz.launch  
e) 3.6 建立地图  
键盘控制建立地图,按键如下:  
U	I 	O  
J	K	L  
M	, 	.  
加减速为W,S.  
手柄控制:  
L侧方向键:上下为加速减速,左右为转向幅度大小调节  
R侧摇杆:控制小车运动  
f) 保存地图(地图直接保存在小车上)  
在art_racecar文件夹下执行:bash save_map.sh  
地图保存在art_racecar/map/mymap.pgm  
检查无误后,修改mymap.pgm替换为test.pgm  

************************导航************************  
a) SSH连接小车(Ubuntu系统为例)sz为小车用户名  
ssh sz@192.168.5.101  
b) 运行车  
roslaunch art_racecar Run_car.launch  
c) 运行AMCL  
roslaunch art_racecar amcl_nav.launch  
d) .本地电脑打开rviz  
本地电脑打开:  
source  工作空间  
source art_racecar/art_rviz.sh  
roslaunch art_racecar rviz.launch  
e) 4.5 开始导航   
在RVIZ中设定初始坐标,设定目标位置,开始导航  
*********************软件接口***********************  
1.启动底盘  
	启动底盘需要启动rosserial_python节点。  
	设置参考art_racecar/launch/Run_car.launch  
2.发布地盘控制指令:  
	通过发布Twist消息控制底盘。  
	线速度:twist.linear.x,这里的线速度范围为500~2500(对应PWM脉冲为0.5ms~2.5ms),1500为静止,1500-2500为正向速度,500-1500为反向速度。  
	角速度:twist.angular.x,这里角度范围为0~180度,90度为中间值,90-180度左转,0-90度右转。  
3.里程计数据:  
	里程计采用激光雷达和IMU数据融合的里程计。  
	需要先启动IMU节点和雷达节点,参考art_racecar/launch/Run_car.launch  
	然后启动rf2o节点,用rf2o生成激光里程计,参考art_racecar/launch/includes/rf2o.launch.xml  
	再启动robot_localization用EKF融合里程计信息,参考art_racecar/launch/Run_gmapping.launch  
	


											
											# Steven Zhang
											# 2019.01.30
	


================================================
FILE: src/art_racecar/art_rviz.sh
================================================
#!/bin/bash

#for open rviz and set ROS master ip
#Steven.Zhang
#2018.03.09

function get_ip_address { ifconfig | fgrep -v 127.0.0.1 | fgrep 'Mask:255.255.255.0' | egrep -o 'addr:[^ ]*' | fgrep '.8.'| sed 's/^.*://'; }        

#export ROS_IP=$(get_ip_address) 
export ROS_IP=`hostname -I`
export ROS_MASTER_URI=http://192.168.5.101:11311

##source ../devel/setup.bash
#rosrun rviz rviz 


================================================
FILE: src/art_racecar/cfg/imu.cfg
================================================
#!/usr/bin/env python
PACKAGE = "art_racecar"

from dynamic_reconfigure.parameter_generator_catkin import *

gen = ParameterGenerator()
gen.add("yaw_calibration", double_t, 0, "Yaw Calibration", 0, -10, 10)

exit(gen.generate(PACKAGE, "art_racecar", "imu"))


================================================
FILE: src/art_racecar/launch/Run_car.launch
================================================
<?xml version="1.0"?>

<launch>
    <master auto="start"/>

    <!-- TF setting -->
    <include file="$(find art_racecar)/launch/includes/art_car_tf.launch.xml" />

    <!-- SENSOR DEVICE -->
    <!-- second startup ls01g lidar -->
    <include file="$(find art_racecar)/launch/ls01g_lidar.launch"/>
    <!-- IMU -->
    <include file="$(find art_imu)/launch/imu.launch" />
    <!-- Car -->
    <node pkg="art_driver" type="art_driver_node" name="art_driver_node"/>

	
      <!-- Rviz -->
    <!--node pkg="rviz" type="rviz" name="rviz" args="-d $(find art_racecar)/launch/rviz/gmapping.rviz" if="$(arg use_rviz)"/-->

</launch>



================================================
FILE: src/art_racecar/launch/Run_gmapping.launch
================================================
<?xml version="1.0"?>

<launch>

    <arg name="use_rviz" default="false" />

    <!-- ODOMETRY -->
    <!--rf2o_Laser_Odometry-->
    <include file="$(find art_racecar)/launch/includes/rf2o.launch.xml" />

     <!-- Robot_Localization -->
    <node pkg="robot_localization" type="ekf_localization_node" name="ekf_se" clear_params="true">
        <rosparam command="load" file="$(find art_racecar)/param/ekf_params.yaml" />
    </node>

    <!-- gmapping -->
    <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">
        <remap from="scan" to="scan"/>
        <param name="map_update_interval" value="2.5"/>
        <param name="maxUrange" value="16.0"/>
        <param name="sigma" value="0.05"/>
        <param name="kernelSize" value="1"/>
        <param name="lstep" value="0.05"/>
        <param name="astep" value="0.05"/>
        <param name="iterations" value="5"/>
        <param name="lsigma" value="0.075"/>
        <param name="ogain" value="3.0"/>
        <param name="lskip" value="0"/>
        <param name="srr" value="0.1"/>
        <param name="srt" value="0.2"/>
        <param name="str" value="0.1"/>
        <param name="stt" value="0.2"/>
        <param name="linearUpdate" value="0.10"/>
        <param name="angularUpdate" value="0.25"/>
        <param name="temporalUpdate" value="1.0"/>
        <param name="resampleThreshold" value="0.25"/>
        <param name="particles" value="30"/>
        <param name="xmin" value="-100.0"/>
        <param name="ymin" value="-100.0"/>
        <param name="xmax" value="100.0"/>
        <param name="ymax" value="100.0"/>
        <param name="delta" value="0.05"/>
        <param name="llsamplerange" value="0.01"/>
        <param name="llsamplestep" value="0.01"/>
        <param name="lasamplerange" value="0.005"/>
        <param name="lasamplestep" value="0.005"/>
        <param name="odom_frame" value="odom"/>
        <param name="base_frame" value="base_footprint"/>
    </node>

    <!-- Rviz -->
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find art_racecar)/rviz/gmapping.rviz" if="$(arg use_rviz)"/>

</launch>



================================================
FILE: src/art_racecar/launch/amcl_nav.launch
================================================
<?xml version="1.0"?>

<launch>
    <arg name="use_rviz" default="false" />

    <!-- for amcl -->    
    <arg name="init_x" default="0.0" />
    <arg name="init_y" default="0.0" />
    <arg name="init_a" default="0.0" />

    <!-- Map server -->
    <node name="map_server" pkg="map_server" type="map_server" args="$(find art_racecar)/map/test.yaml"/>

   

    <!-- ODOMETRY -->
    <!--rf2o_Laser_Odometry-->
    <include file="$(find art_racecar)/launch/includes/rf2o.launch.xml" />
    <!-- Robot_Localization -->
    <node pkg="robot_localization" type="ekf_localization_node" name="ekf_se" clear_params="true">
        <rosparam command="load" file="$(find art_racecar)/param/ekf_params.yaml" />
    </node>

    <!-- Localization -->
    <!-- AMCL -->
    <include file="$(find art_racecar)/launch/includes/amcl.launch.xml">
        <arg name="init_x" value="$(arg init_x)"/>
        <arg name="init_y" value="$(arg init_y)"/>
        <arg name="init_a" value="$(arg init_a)"/>
    </include>

    <!-- Navstack -->
    <node pkg="move_base" type="move_base" respawn="false" name="move_base">
        <!-- local planner -->
         <!--
        <param name="base_global_planner" value="global_planner/GlobalPlanner"/>  
         -->
        <param name="base_global_planner" value="navfn/NavfnROS"/>  
        <param name="base_local_planner" value="dwa_local_planner/DWAPlannerROS"/>  
        

        <rosparam file="$(find art_racecar)/param/dwa_local_planner_params.yaml" command="load"/>
        <!-- costmap layers -->    
        <rosparam file="$(find art_racecar)/param/local_costmap_params.yaml" command="load"/>
        <rosparam file="$(find art_racecar)/param/global_costmap_params.yaml" command="load"/> 
        <!-- move_base params -->
        <rosparam file="$(find art_racecar)/param/base_global_planner_params.yaml" command="load"/>
        <rosparam file="$(find art_racecar)/param/move_base_params.yaml" command="load"/>
        <remap from="/odom" to="/odometry/filtered"/>

       
    </node>

    <!-- L1 controller -->  
    <node pkg="art_racecar" type="art_car_controller" respawn="false" name="art_car_controller" output="screen">       
        <!-- L1 -->
        <param name="Vcmd" value="1.5" /> <!-- speed of car m/s -->        
        <!-- ESC -->
        <param name="baseSpeed" value="1565"/> <!-- pwm for motor constant speed, 1500: stop --> 
 

        <!-- Servo -->
        <param name="baseAngle" value="90.0"/> <!-- the middle pos of servo, for tt02: 87, for hsp: ? -->
        <param name="AngleGain" value="-3.0"/> <!-- for tt02: >0, for hsp: <0 -->	
        <param name="GasGain" value="1.0"/>

        <!-- remap from="/odometry/filtered" to="odom" / --> 
        <remap from="/move_base_node/NavfnROS/plan" to="/move_base/NavfnROS/plan" /> 
    </node>

    <!-- Rviz -->
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find art_racecar)/rviz/amcl.rviz" if="$(arg use_rviz)" />
</launch>


================================================
FILE: src/art_racecar/launch/car.launch
================================================
<?xml version="1.0"?>

<launch>
    <master auto="start"/>

    <!-- TF setting -->
    <include file="$(find art_racecar)/launch/includes/art_car_tf.launch.xml" />

    <!-- Car -->
    <node pkg="art_driver" type="art_driver_node" name="art_driver_node"/>
  

	
      <!-- Rviz -->
    <!--node pkg="rviz" type="rviz" name="rviz" args="-d $(find art_racecar)/launch/rviz/gmapping.rviz" if="$(arg use_rviz)"/-->

</launch>



================================================
FILE: src/art_racecar/launch/includes/amcl.launch.xml
================================================
<?xml version="1.0"?>

<launch>
    <arg name="init_x" default="0" />
    <arg name="init_y" default="0" />
    <arg name="init_a" default="0" />

    <node pkg="amcl" type="amcl" name="amcl" output="screen">
        <!-- Publish scans from best pose at a max of 10 Hz -->
        <param name="transform_tolerance" value="0.2" />
        <param name="gui_publish_rate" value="30.0"/>
        <param name="laser_max_beams" value="30"/>
        <param name="min_particles" value="100"/>
        <param name="max_particles" value="5000"/>
        <param name="kld_err" value="0.01"/>
        <param name="kld_z" value="0.99"/>
        <!-- translation std dev, m -->
        <param name="odom_alpha1" value="0.2"/>
        <param name="odom_alpha2" value="0.2"/>
        <param name="odom_alpha3" value="0.8"/>
        <param name="odom_alpha4" value="0.2"/>
        <param name="laser_z_hit" value="0.5"/>
        <param name="laser_z_short" value="0.05"/>
        <param name="laser_z_max" value="0.05"/>
        <param name="laser_z_rand" value="0.5"/>
        <param name="laser_sigma_hit" value="0.2"/>
        <param name="laser_lambda_short" value="0.1"/>
        <param name="laser_lambda_short" value="0.1"/>
        <param name="laser_model_type" value="likelihood_field"/>

        <!-- <param name="laser_model_type" value="beam"/> -->
        <param name="laser_likelihood_max_dist" value="2.0"/>
        <param name="update_min_d" value="0.1"/>
        <param name="update_min_a" value="0.1"/>
        <param name="resample_interval" value="2"/>
        <param name="transform_tolerance" value="0.1"/>
        <param name="recovery_alpha_slow" value="0.0"/>
        <param name="recovery_alpha_fast" value="0.1"/>

        <param name="use_map_topic" value="true"/>
        <param name="first_map_only" value="true"/>
        <param name="tf_broadcast" value="true"/>

        <param name="odom_frame_id" value="odom"/>
        <param name="global_frame_id" value="map"/>
        <param name="base_frame_id" value="base_footprint"/>
        <param name="odom_model_type" value="diff"/>

        <param name="initial_pose_x" value="$(arg init_x)"/>
        <param name="initial_pose_y" value="$(arg init_y)"/>
        <param name="initial_pose_a" value="$(arg init_a)"/>
        <param name="initial_cov_xx" value="0.25" />
        <param name="initial_cov_yy" value="0.25" />
        <param name="initial_cov_aa" value="0.2" />
    </node>
</launch>


================================================
FILE: src/art_racecar/launch/includes/art_car_tf.launch.xml
================================================
<launch>
    <node pkg="tf" type="static_transform_publisher" name="base_footprint2base_link" args="0.0 0.0 0.15 0.0 0.0 0.0 /base_footprint /base_link 10"/>
    <node pkg="tf" type="static_transform_publisher" name="base_link2laser_link" args=" 0.07 0.0 0.0 0.0 0.0 0.0 /base_link /laser 10"/>
    <node pkg="tf" type="static_transform_publisher" name="base_link2imu" args="0.1653 0.0 0.0 0.0 0.0 0.0 /base_link /IMU_link 10"/>
</launch>


================================================
FILE: src/art_racecar/launch/includes/default_mapping.launch.xml
================================================
<?xml version="1.0"?>

<launch>
    <arg name="tf_map_scanmatch_transform_frame_name" default="scanmatcher_frame"/>
    <arg name="base_frame" default="base_footprint"/>
    <arg name="odom_frame" default="nav"/>
    <arg name="pub_map_odom_transform" default="true"/>
    <arg name="scan_subscriber_queue_size" default="5"/>
    <arg name="scan_topic" default="scan"/>
    <arg name="map_size" default="2048"/>

    <node pkg="hector_mapping" type="hector_mapping" name="hector_mapping" output="screen">
        <!-- Frame names -->
        <param name="map_frame" value="map" />
        <param name="base_frame" value="$(arg base_frame)" />
        <param name="odom_frame" value="$(arg odom_frame)" />

        <!-- Tf use -->
        <param name="use_tf_scan_transformation" value="true"/>
        <param name="use_tf_pose_start_estimate" value="false"/>
        <param name="pub_map_odom_transform" value="$(arg pub_map_odom_transform)"/>

        <!-- Map size / start point -->
        <param name="map_resolution" value="0.050"/>
        <param name="map_size" value="$(arg map_size)"/>
        <param name="map_start_x" value="0.5"/>
        <param name="map_start_y" value="0.5" />
        <param name="map_multi_res_levels" value="2" />

        <!-- Map update parameters -->
        <param name="update_factor_free" value="0.4"/>
        <param name="update_factor_occupied" value="0.9" />    
        <param name="map_update_distance_thresh" value="0.4"/>
        <param name="map_update_angle_thresh" value="0.06" />
        <param name="laser_z_min_value" value = "-1.0" />
        <param name="laser_z_max_value" value = "1.0" />

        <!-- Advertising config --> 
        <param name="advertise_map_service" value="true"/>

        <param name="scan_subscriber_queue_size" value="$(arg scan_subscriber_queue_size)"/>
        <param name="scan_topic" value="$(arg scan_topic)"/>

        <!-- Debug parameters -->
        <!--
          <param name="output_timing" value="false"/>
          <param name="pub_drawings" value="true"/>
          <param name="pub_debug_output" value="true"/>
        -->
        <param name="tf_map_scanmatch_transform_frame_name" value="$(arg tf_map_scanmatch_transform_frame_name)" />
    </node>

    <node pkg="tf" type="static_transform_publisher" name="map_nav_broadcaster" args="0 0 0 0 0 0 map nav 100"/>
</launch>
  
  


================================================
FILE: src/art_racecar/launch/includes/ls01g.launch.xml
================================================

<launch>
	<arg name="inverted" default="false" />
    <node name="ls01g" pkg="ls01g" type="ls01g" output="screen">
  		<param name="scan_topic" value="scan"/>         #设置激光数据topic名称
  	  <param name="laser_link" value="base_laser_link"/>     #激光坐标
  	  <param name="serial_port" value="/dev/laser"/>  #雷达连接的串口
      <param name="zero_as_max" value="false"/>        # 设置为true探测不到区域会变成最大值
      <param name="min_as_zero" value="false"/>        # true:探测不到区域为0,false:探测不到区域为inf
		  <param name="angle_disable_min" value="-1"/>    # 角度制,从angle_disable_min到angle_disable_max之前的值为0
		  <param name="angle_disable_max" value="-1"/>
      <param name="inverted" value="$(arg inverted)"/>           # 如果0度方向在串口线的方向上设置为true 
      
    </node>
    <!--<node name="rviz" pkg="rviz" type="rviz" args="-d $(find ls01g)/launch/rviz.rviz"/>-->
</launch>


================================================
FILE: src/art_racecar/launch/includes/rf2o.launch.xml
================================================
<!-- 
  This node presents a fast and precise method to estimate the planar motion of a lidar
  from consecutive range scans. It is very useful for the estimation of the robot odometry from
  2D laser range measurements.
  
  Requirements:
  - 2D laser scan, publishing sensor_msgs::LaserScan
  - TF transform from the laser to the robot base
-->

<launch>

    <node pkg="rf2o_laser_odometry" type="rf2o_laser_odometry_node" name="rf2o_laser_odometry" >
        <param name="laser_scan_topic" value="scan"/>        <!-- topic where the lidar scans are being published -->
        <param name="base_frame_id" value="base_footprint"/>            <!-- frame_id (tf) of the mobile robot base. A tf transform from the laser_frame to the base_frame is mandatory -->
        <param name="odom_topic" value="odom_rf2o" />              # topic where tu publish the odometry estimations
        <param name="publish_tf" value="true" />                   # wheter or not to publish the tf::transform (base->odom)
        <param name="odom_frame_id" value="odom" />                <!-- frame_id (tf) to publish the odometry estimations -->
        <param name="freq" value="20.0"/>   
        <param name="verbose" value="true" />                                  <!-- Execution frequency. See "Planar Odometry from a Radial Laser Scanner. A Range Flow-based Approach. ICRA'16"-->
    </node>

</launch>


================================================
FILE: src/art_racecar/launch/includes/rplidar.launch.xml
================================================
<launch>
    <node name="rplidarNode"          pkg="rplidar_ros"  type="rplidarNode" output="screen">
        <param name="serial_port"         type="string" value="/dev/rplidar"/>  
        <param name="serial_baudrate"     type="int"    value="115200"/>
        <param name="frame_id"            type="string" value="laser"/>
        <param name="inverted"            type="bool"   value="false"/>
        <param name="angle_compensate"    type="bool"   value="true"/>
    </node>
</launch>


================================================
FILE: src/art_racecar/launch/ls01g_lidar.launch
================================================
<?xml version="1.0"?>

<launch>
    <arg name="inverted" default="false" />
    <node name="ls01g" pkg="ls01g" type="ls01g" output="screen">
        <param name="scan_topic" value="scan"/>         #设置激光数据topic名称
        <param name="laser_link" value="laser"/>     #激光坐标
        <param name="serial_port" value="/dev/laser"/>  #雷达连接的串口
        <param name="zero_as_max" value="false"/>        # 设置为true探测不到区域会变成最大值
        <param name="min_as_zero" value="false"/>        # true:探测不到区域为0,false:探测不到区域为inf
        <param name="angle_disable_min" value="-1"/>    # 角度制,从angle_disable_min到angle_disable_max之前的值为0
        <param name="angle_disable_max" value="-1"/>
        <param name="inverted" value="$(arg inverted)"/>           # 如果0度方向在串口线的方向上设置为true 
    </node>
    <!--<node name="rviz" pkg="rviz" type="rviz" args="-d $(find art_racecar)/launch/rviz.rviz"/>-->
</launch>


================================================
FILE: src/art_racecar/launch/rviz.launch
================================================
<?xml version="1.0"?>

<launch>
    <arg name="use_rviz" default="true" />

   

    <!-- Rviz -->
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find art_racecar)/rviz/amcl.rviz" if="$(arg use_rviz)" />
</launch>


================================================
FILE: src/art_racecar/launch/teleop_joy.launch
================================================
<?xml version="1.0"?>

<launch>

    <node name="joy_node" pkg="joy" type="joy_node" />
    <node name="racecar_joy" pkg="art_racecar" type="racecar_joy.py" output="screen" />
        
   
    <!--<node name="rviz" pkg="rviz" type="rviz" args="-d $(find art_racecar)/launch/rviz.rviz"/>-->
</launch>


================================================
FILE: src/art_racecar/map/mymap.yaml
================================================
image: /home/art/racecar/src/art_racecar/map/mymap.pgm
resolution: 0.050000
origin: [-100.000000, -100.000000, 0.000000]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.196



================================================
FILE: src/art_racecar/map/test.yaml
================================================
image: test.pgm
resolution: 0.050000
origin: [-100.000000, -100.000000, 0.000000]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.196



================================================
FILE: src/art_racecar/package.xml
================================================
<?xml version="1.0"?>
<package format="2">
  <name>art_racecar</name>
  <version>0.1.0</version>
  <description>The art_racecar package</description>

  <!-- One maintainer tag required, multiple allowed, one person per tag -->
  <!-- Example:  -->
  <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
  <maintainer email="zhangnan@artrobot.com">Steven Zhang</maintainer>


  <!-- One license tag required, multiple allowed, one license per tag -->
  <!-- Commonly used license strings: -->
  <!--   BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
  <license>TODO</license>


  <!-- Url tags are optional, but multiple are allowed, one per tag -->
  <!-- Optional attribute type can be: website, bugtracker, or repository -->
  <!-- Example: -->
  <!-- <url type="website">http://wiki.ros.org/art_racecar</url> -->


  <!-- Author tags are optional, multiple are allowed, one per tag -->
  <!-- Authors do not have to be maintainers, but could be -->
  <!-- Example: -->
  <!-- <author email="jane.doe@example.com">Jane Doe</author> -->


  <!-- The *depend tags are used to specify dependencies -->
  <!-- Dependencies can be catkin packages or system dependencies -->
  <!-- Examples: -->
  <!-- Use depend as a shortcut for packages that are both build and exec dependencies -->
  <!--   <depend>roscpp</depend> -->
  <!--   Note that this is equivalent to the following: -->
  <!--   <build_depend>roscpp</build_depend> -->
  <!--   <exec_depend>roscpp</exec_depend> -->
  <!-- Use build_depend for packages you need at compile time: -->
  <!--   <build_depend>message_generation</build_depend> -->
  <!-- Use build_export_depend for packages you need in order to build against this package: -->
  <!--   <build_export_depend>message_generation</build_export_depend> -->
  <!-- Use buildtool_depend for build tool packages: -->
  <!--   <buildtool_depend>catkin</buildtool_depend> -->
  <!-- Use exec_depend for packages you need at runtime: -->
  <!--   <exec_depend>message_runtime</exec_depend> -->
  <!-- Use test_depend for packages you need only for testing: -->
  <!--   <test_depend>gtest</test_depend> -->
  <!-- Use doc_depend for packages you need only for building documentation: -->
  <!--   <doc_depend>doxygen</doc_depend> -->
  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>geometry_msgs</build_depend>
  <build_depend>joy</build_depend>
  <build_depend>move_base</build_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>
  <build_depend>visualization_msgs</build_depend>
  <build_depend>tf</build_depend> 
  <build_depend>sensor_msgs</build_depend>
  <build_depend>python-serial</build_depend>
  <build_depend>dynamic_reconfigure</build_depend>


  <exec_depend>geometry_msgs</exec_depend>
  <exec_depend>move_base</exec_depend>
  <exec_depend>joy</exec_depend>
  <exec_depend>roscpp</exec_depend>
  <exec_depend>rospy</exec_depend>
  <exec_depend>std_msgs</exec_depend>
  <exec_depend>visualization_msgs</exec_depend>
  <exec_depend>tf</exec_depend> 
  <exec_depend>tf</exec_depend>
  <exec_depend>sensor_msgs</exec_depend>
  <exec_depend>python-serial</exec_depend>   
  <exec_depend>dynamic_reconfigure</exec_depend>




  <!-- The export tag contains other, unspecified, tags -->
  <export>
    <!-- Other tools can request additional information be placed here -->

  </export>
</package>


================================================
FILE: src/art_racecar/param/base_global_planner_params.yaml
================================================
GlobalPlanner:
    allow_unknown: false
#    default_tolerance: 0.5      #路径规划器目标点的公差范围
#   visualize_potential: true   #指定是否通过可视化PointCloud2计算的潜在区域
#    use_dijkstra: true          #如果为ture,则使用dijkstra算法。 否则使用A *算法
#    use_quadratic: true         #二次逼近
#    use_grid_path: true         #如果为true,沿着栅格边界创建路径。 否则,使用梯度下降的方法。
#    old_navfn_behavior: true    #如果你想要global_planner准确反映navfn的行为,此项设置为true。

#    lethal_cost: 25
#    neutral_cost: 50
#    cost_factor: 3
#    publish_potential: True


NavfnROS:
    allow_unknown: false


================================================
FILE: src/art_racecar/param/dwa_local_planner_params.yaml
================================================
DWAPlannerROS: 

  acc_lim_th: 0.1
  acc_lim_x: 0.5
  acc_lim_y: 0.0 


  max_vel_x: 0.5
  min_vel_x: 0.0 

  max_vel_y: 0.0 
  min_vel_y: 0.0

  max_trans_vel: 0.5
  min_trans_vel: 0.1
  max_rot_vel: 0.2
  min_rot_vel: 0.0

  sim_time: 1.5

  sim_granularity: 0.025

  goal_distance_bias: 30.0
  path_distance_bias: 20.0 
  occdist_scale: 0.01
  forward_point_distance: 0.5
  stop_time_buffer: 0.2 
#######
  scaling_speed: 0.5
#######
  max_scaling_factor: 0.2 
  oscillation_reset_dist: 0.05 
   
  #
  vx_samples: 20
  vy_samples: 0 
  vtheta_samples: 10
  
  rot_stopped_vel: 0.01 
  trans_stopped_vel: 0.01
  #
  xy_goal_tolerance: 0.2 
  yaw_goal_tolerance: 0.1 
  latch_xy_goal_tolerance: true #如果目标误差被锁定,若机器人达到目标XY位置,它将旋转到位,即使误差没有达到,也会做旋转 


================================================
FILE: src/art_racecar/param/ekf_params.yaml
================================================

frequency: 30
sensor_timeout: 0.025
two_d_mode: true
transform_time_offset: 0.0001
transform_timeout: 0.025
print_diagnostics: true
debug: false

# Defaults to "robot_localization_debug.txt" if unspecified. Please specify the full path.
debug_out_file: /path/to/debug/file.txt

# Whether to broadcast the transformation over the /tf topic. Defaults to true if unspecified.
publish_tf: true

# Whether to publish the acceleration state. Defaults to false if unspecified.
publish_acceleration: true

map_frame: /map              # Defaults to "map" if unspecified
odom_frame: /odom            # Defaults to "odom" if unspecified
base_link_frame: /base_footprint  # Defaults to "base_link" if unspecified
world_frame: /odom           # Defaults to the value of odom_frame if unspecified

# The filter accepts an arbitrary number of inputs from each input message type (nav_msgs/Odometry,
# geometry_msgs/PoseWithCovarianceStamped, geometry_msgs/TwistWithCovarianceStamped,
# sensor_msgs/Imu). To add an input, simply append the next number in the sequence to its "base" name, e.g., odom0,
# odom1, twist0, twist1, imu0, imu1, imu2, etc. The value should be the topic name. These parameters obviously have no
# default values, and must be specified.
odom0: /rf2o_laser_odometry/odom

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

# If you have high-frequency data or are running with a low frequency parameter value, then you may want to increase
# the size of the subscription queue so that more measurements are fused.
odom0_queue_size: 5

# [ADVANCED] Large messages in ROS can exhibit strange behavior when they arrive at a high frequency. This is a result
# of Nagle's algorithm. This option tells the ROS subscriber to use the tcpNoDelay option, which disables Nagle's
# algorithm.
odom0_nodelay: true

# [ADVANCED] When measuring one pose variable with two sensors, a situation can arise in which both sensors under-
# report their covariances. This can lead to the filter rapidly jumping back and forth between each measurement as they
# arrive. In these cases, it often makes sense to (a) correct the measurement covariances, or (b) if velocity is also
# measured by one of the sensors, let one sensor measure pose, and the other velocity. However, doing (a) or (b) isn't
# always feasible, and so we expose the differential parameter. When differential mode is enabled, all absolute pose
# data is converted to velocity data by differentiating the absolute pose measurements. These velocities are then
# integrated as usual. NOTE: this only applies to sensors that provide pose measurements; setting differential to true
# for twist measurements has no effect.
odom0_differential: true

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

# [ADVANCED] If your data is subject to outliers, use these threshold settings, expressed as Mahalanobis distances, to
# control how far away from the current vehicle state a sensor measurement is permitted to be. Each defaults to
# numeric_limits<double>::max() if unspecified. It is strongly recommended that these parameters be removed if not
# required. Data is specified at the level of pose and twist variables, rather than for each variable in isolation.
# For messages that have both pose and twist data, the parameter specifies to which part of the message we are applying
# the thresholds. 
odom0_pose_rejection_threshold: 8
odom0_twist_rejection_threshold: 0.75

imu0: /imu_data
imu0_config: [false, false, false,
              false, false, true,
              false, false, false,
              false,  false,  false,
              false,  false,  false]
imu0_nodelay: false
imu0_differential: false
imu0_relative: true
imu0_queue_size: 8
imu0_pose_rejection_threshold: 0.8                 # Note the difference in parameter names
imu0_twist_rejection_threshold: 0.8                #
imu0_linear_acceleration_rejection_threshold: 0.8  #

# [ADVANCED] Some IMUs automatically remove acceleration due to gravity, and others don't. If yours doesn't, please set
# this to true, and *make sure* your data conforms to REP-103, specifically, that the data is in ENU frame.
imu0_remove_gravitational_acceleration: true


# [ADVANCED] The process noise covariance matrix can be dgit@192.168.1.102:zhangnan/art_racecar.gitifficult to tune, and can vary for each application, so it is
# exposed as a configuration parameter. This matrix represents the noise we add to the total error after each
# prediction step. The better the omnidirectional motion model matches your system, the smaller these values can be.
# However, if users find that a given variable is slow to converge, one approach is to increase the
# process_noise_covariance diagonal value for the variable in question, which will cause the filter's predicted error
# to be larger, which will cause the filter to trust the incoming measurement more during correction. The values are
# ordered as x, y, z, roll, pitch, yaw, vx, vy, vz, vroll, vpitch, vyaw, ax, ay, az. Defaults to the matrix below if
# unspecified.
process_noise_covariance: [0.01, 0,    0,    0,    0,    0,    0,     0,     0,    0,    0,    0,    0,    0,    0,
                           0,    0.01, 0,    0,    0,    0,    0,     0,     0,    0,    0,    0,    0,    0,    0,
                           0,    0,    0.01, 0,    0,    0,    0,     0,     0,    0,    0,    0,    0,    0,    0,
                           0,    0,    0,    0.03, 0,    0,    0,     0,     0,    0,    0,    0,    0,    0,    0,
                           0,    0,    0,    0,    0.03, 0,    0,     0,     0,    0,    0,    0,    0,    0,    0,
                           0,    0,    0,    0,    0,    0.5,  0,     0,     0,    0,    0,    0,    0,    0,    0,
                           0,    0,    0,    0,    0,    0,    0.5,   0,     0,    0,    0,    0,    0,    0,    0,
                           0,    0,    0,    0,    0,    0,    0,     0.025, 0,    0,    0,    0,    0,    0,    0,
                           0,    0,    0,    0,    0,    0,    0,     0,     0.04, 0,    0,    0,    0,    0,    0,
                           0,    0,    0,    0,    0,    0,    0,     0,     0,    0.01, 0,    0,    0,    0,    0,
                           0,    0,    0,    0,    0,    0,    0,     0,     0,    0,    0.01, 0,    0,    0,    0,
                           0,    0,    0,    0,    0,    0,    0,     0,     0,    0,    0,    0.08, 0,    0,    0,
                           0,    0,    0,    0,    0,    0,    0,     0,     0,    0,    0,    0,    0.05, 0,    0,
                           0,    0,    0,    0,    0,    0,    0,     0,     0,    0,    0,    0,    0,    0.01, 0,
                           0,    0,    0,    0,    0,    0,    0,     0,     0,    0,    0,    0,    0,    0,    0.015]

# [ADVANCED] This represents the initial value for the state estimate error covariance matrix. Setting a diagonal
# value (variance) to a large value will result in rapid convergence for initial measurements of the variable in
# question. Users should take care not to use large values for variables that will not be measured directly. The values
# are ordered as x, y, z, roll, pitch, yaw, vx, vy, vz, vroll, vpitch, vyaw, ax, ay, az. Defaults to the matrix below
#if unspecified.
initial_estimate_covariance: [1e-9, 0,    0,    0,    0,    0,    0,    0,    0,    0,     0,     0,     0,    0,    0,
                              0,    1e-9, 0,    0,    0,    0,    0,    0,    0,    0,     0,     0,     0,    0,    0,
                              0,    0,    1e-9, 0,    0,    0,    0,    0,    0,    0,     0,     0,     0,    0,    0,
                              0,    0,    0,    1e-9, 0,    0,    0,    0,    0,    0,     0,     0,     0,    0,    0,
                              0,    0,    0,    0,    1e-9, 0,    0,    0,    0,    0,     0,     0,     0,    0,    0,
                              0,    0,    0,    0,    0,    1e-9, 0,    0,    0,    0,     0,     0,     0,    0,    0,
                              0,    0,    0,    0,    0,    0,    1e-9, 0,    0,    0,     0,     0,     0,    0,    0,
                              0,    0,    0,    0,    0,    0,    0,    1e-9, 0,    0,     0,     0,     0,    0,    0,
                              0,    0,    0,    0,    0,    0,    0,    0,    1e-9, 0,     0,     0,     0,    0,    0,
                              0,    0,    0,    0,    0,    0,    0,    0,    0,    1e-9,  0,     0,     0,    0,    0,
                              0,    0,    0,    0,    0,    0,    0,    0,    0,    0,     1e-9,  0,     0,    0,    0,
                              0,    0,    0,    0,    0,    0,    0,    0,    0,    0,     0,     1e-9,  0,    0,    0,
                              0,    0,    0,    0,    0,    0,    0,    0,    0,    0,     0,     0,     1e-9, 0,    0,
                              0,    0,    0,    0,    0,    0,    0,    0,    0,    0,     0,     0,     0,    1e-9, 0,
                              0,    0,    0,    0,    0,    0,    0,    0,    0,    0,     0,     0,     0,    0,    1e-9]



================================================
FILE: src/art_racecar/param/global_costmap_params.yaml
================================================
global_costmap:
    footprint: [[-0.305, -0.18], [-0.305, 0.18], [0.305, 0.18], [0.305, -0.18]]
    footprint_padding: 0.01
    transform_tolerance: 0.5
    update_frequency: 10.0
    publish_frequency: 10.0

    global_frame: /map
    robot_base_frame: /base_footprint
    resolution: 0.10

    rolling_window: true
    width: 10.0
    height: 10.0
    track_unknown_space: false

    plugins: 
        - {name: static,    type: "costmap_2d::StaticLayer"}            
        - {name: sensor,    type: "costmap_2d::ObstacleLayer"}
        - {name: inflation, type: "costmap_2d::InflationLayer"}

    static:        
        map_topic: /map 
        subscribe_to_updates: true

    sensor:
        observation_sources: laser_scan_sensor
        laser_scan_sensor: {sensor_frame: laser, data_type: LaserScan, topic: scan, marking: true, clearing: true}

    inflation:
        inflation_radius: 0.1
        cost_scaling_factor: 8.0



================================================
FILE: src/art_racecar/param/local_costmap_params.yaml
================================================
local_costmap:
    footprint: [[-0.305, -0.18], [-0.305, 0.18], [0.305, 0.18], [0.305, -0.18]]
    footprint_padding: 0.01
    transform_tolerance: 0.5
    update_frequency: 10.0
    publish_frequency: 10.0

    global_frame: /odom
    robot_base_frame: /base_footprint
    resolution: 0.10
    static_map: true

    rolling_window: true
    width: 10.0
    height: 10.0
    resolution: 0.05

    track_unknown_space: false

    plugins:            
        - {name: sensor,    type: "costmap_2d::ObstacleLayer"}
        - {name: inflation, type: "costmap_2d::InflationLayer"}

    sensor:
        observation_sources: laser_scan_sensor
        laser_scan_sensor: {sensor_frame: laser, data_type: LaserScan, topic: scan, marking: true, clearing: true}

    inflation:
        inflation_radius: 0.1
        cost_scaling_factor: 8.0


================================================
FILE: src/art_racecar/param/move_base_params.yaml
================================================
# Move base node parameters. For full documentation of the parameters in this file, please see
#
#  http://www.ros.org/wiki/move_base
#
shutdown_costmaps: false

controller_frequency: 10.0
controller_patience: 3.0

planner_frequency: 10.0
planner_patience: 5.0

oscillation_timeout: 10.0
oscillation_distance: 0.2

clearing_rotation_allowed: false


================================================
FILE: src/art_racecar/rviz/amcl.rviz
================================================
Panels:
  - Class: rviz/Displays
    Help Height: 78
    Name: Displays
    Property Tree Widget:
      Expanded:
        - /Global Options1
        - /Imu1/Box properties1
      Splitter Ratio: 0.5
    Tree Height: 528
  - Class: rviz/Selection
    Name: Selection
  - Class: rviz/Tool Properties
    Expanded:
      - /2D Pose Estimate1
      - /2D Nav Goal1
      - /Publish Point1
    Name: Tool Properties
    Splitter Ratio: 0.588679016
  - Class: rviz/Views
    Expanded:
      - /Current View1
    Name: Views
    Splitter Ratio: 0.5
  - Class: rviz/Time
    Experimental: false
    Name: Time
    SyncMode: 0
    SyncSource: LaserScan
Visualization Manager:
  Class: ""
  Displays:
    - Alpha: 0.5
      Cell Size: 1
      Class: rviz/Grid
      Color: 160; 160; 164
      Enabled: true
      Line Style:
        Line Width: 0.0299999993
        Value: Lines
      Name: Grid
      Normal Cell Count: 0
      Offset:
        X: 0
        Y: 0
        Z: 0
      Plane: XY
      Plane Cell Count: 100
      Reference Frame: <Fixed Frame>
      Value: true
    - Alpha: 0.699999988
      Class: rviz/Map
      Color Scheme: map
      Draw Behind: false
      Enabled: true
      Name: Map
      Topic: /map
      Unreliable: false
      Use Timestamp: false
      Value: true
    - Alpha: 0.200000003
      Class: rviz/Map
      Color Scheme: costmap
      Draw Behind: false
      Enabled: true
      Name: global_costmap
      Topic: /move_base/global_costmap/costmap
      Unreliable: false
      Use Timestamp: false
      Value: true
    - Alpha: 1
      Autocompute Intensity Bounds: true
      Autocompute Value Bounds:
        Max Value: 10
        Min Value: -10
        Value: true
      Axis: Z
      Channel Name: intensity
      Class: rviz/LaserScan
      Color: 255; 255; 255
      Color Transformer: Intensity
      Decay Time: 0
      Enabled: true
      Invert Rainbow: false
      Max Color: 255; 255; 255
      Max Intensity: 402
      Min Color: 0; 0; 0
      Min Intensity: 2
      Name: LaserScan
      Position Transformer: XYZ
      Queue Size: 10
      Selectable: true
      Size (Pixels): 3
      Size (m): 0.0500000007
      Style: Flat Squares
      Topic: /scan
      Unreliable: false
      Use Fixed Frame: true
      Use rainbow: true
      Value: true
    - Class: rviz/TF
      Enabled: true
      Frame Timeout: 15
      Frames:
        All Enabled: true
        IMU_link:
          Value: true
        base_footprint:
          Value: true
        base_link:
          Value: true
        laser:
          Value: true
        map:
          Value: true
        odom:
          Value: true
      Marker Scale: 1
      Name: TF
      Show Arrows: true
      Show Axes: true
      Show Names: true
      Tree:
        map:
          odom:
            base_footprint:
              base_link:
                IMU_link:
                  {}
                laser:
                  {}
      Update Interval: 0
      Value: true
    - Alpha: 1
      Buffer Length: 1
      Class: rviz/Path
      Color: 25; 255; 0
      Enabled: true
      Head Diameter: 0.300000012
      Head Length: 0.200000003
      Length: 0.300000012
      Line Style: Lines
      Line Width: 0.0299999993
      Name: Path
      Offset:
        X: 0
        Y: 0
        Z: 0
      Pose Color: 255; 85; 255
      Pose Style: None
      Radius: 0.0299999993
      Shaft Diameter: 0.100000001
      Shaft Length: 0.100000001
      Topic: /move_base/NavfnROS/plan
      Unreliable: true
      Value: true
    - Angle Tolerance: 0.100000001
      Class: rviz/Odometry
      Covariance:
        Orientation:
          Alpha: 0.5
          Color: 255; 255; 127
          Color Style: Unique
          Frame: Local
          Offset: 1
          Scale: 1
          Value: true
        Position:
          Alpha: 0.300000012
          Color: 204; 51; 204
          Scale: 1
          Value: true
        Value: false
      Enabled: true
      Keep: 100
      Name: Odometry
      Position Tolerance: 0.100000001
      Shape:
        Alpha: 1
        Axes Length: 1
        Axes Radius: 0.100000001
        Color: 255; 25; 0
        Head Length: 0.300000012
        Head Radius: 0.100000001
        Shaft Length: 0.100000001
        Shaft Radius: 0.0199999996
        Value: Arrow
      Topic: /odometry/filtered
      Unreliable: false
      Value: true
    - Acceleration properties:
        Acc. vector alpha: 1
        Acc. vector color: 255; 0; 0
        Acc. vector scale: 1
        Derotate acceleration: true
        Enable acceleration: false
      Axes properties:
        Axes scale: 1
        Enable axes: true
      Box properties:
        Box alpha: 1
        Box color: 255; 0; 0
        Enable box: false
        x_scale: 0.400000006
        y_scale: 0.300000012
        z_scale: 0.300000012
      Class: rviz_imu_plugin/Imu
      Enabled: false
      Name: Imu
      Topic: /imu_data
      Unreliable: false
      Value: false
      fixed_frame_orientation: true
  Enabled: true
  Global Options:
    Background Color: 48; 48; 48
    Default Light: true
    Fixed Frame: map
    Frame Rate: 30
  Name: root
  Tools:
    - Class: rviz/Interact
      Hide Inactive Objects: true
    - Class: rviz/MoveCamera
    - Class: rviz/Select
    - Class: rviz/FocusCamera
    - Class: rviz/Measure
    - Class: rviz/SetInitialPose
      Topic: /initialpose
    - Class: rviz/SetGoal
      Topic: /move_base_simple/goal
    - Class: rviz/PublishPoint
      Single click: true
      Topic: /clicked_point
  Value: true
  Views:
    Current:
      Class: rviz/Orbit
      Distance: 17.7873268
      Enable Stereo Rendering:
        Stereo Eye Separation: 0.0599999987
        Stereo Focal Distance: 1
        Swap Stereo Eyes: false
        Value: false
      Focal Point:
        X: 1.2478348
        Y: -3.33640909
        Z: 0.00110054587
      Focal Shape Fixed Size: true
      Focal Shape Size: 0.0500000007
      Invert Z Axis: false
      Name: Current View
      Near Clip Distance: 0.00999999978
      Pitch: 1.56979632
      Target Frame: <Fixed Frame>
      Value: Orbit (rviz)
      Yaw: 2.95539427
    Saved: ~
Window Geometry:
  Displays:
    collapsed: false
  Height: 809
  Hide Left Dock: false
  Hide Right Dock: true
  QMainWindow State: 000000ff00000000fd00000004000000000000016a0000029ffc020000000bfb0000001200530065006c0065006300740069006f006e00000001e10000009b0000006100fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c00610079007301000000280000029f000000d700fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261fb0000000c00430061006d00650072006100000001d1000000b50000000000000000fb0000000a0049006d0061006700650000000000ffffffff0000000000000000fb0000000a0049006d00610067006501000002ab00000113000000000000000000000001000001a30000025efc0200000004fb0000000a0049006d00610067006500000000280000025e0000000000000000fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a0056006900650077007300000000280000025e000000ad00fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000005160000003efc0100000002fb0000000800540069006d00650100000000000005160000030000fffffffb0000000800540069006d00650100000000000004500000000000000000000003a60000029f00000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
  Selection:
    collapsed: false
  Time:
    collapsed: false
  Tool Properties:
    collapsed: false
  Views:
    collapsed: false
  Width: 1302
  X: 519
  Y: 235


================================================
FILE: src/art_racecar/rviz/gmapping.rviz
================================================
Panels:
  - Class: rviz/Displays
    Help Height: 78
    Name: Displays
    Property Tree Widget:
      Expanded:
        - /Global Options1
        - /Status1
        - /ekf_odom1/Shape1
        - /rf2o_odom1/Shape1
      Splitter Ratio: 0.5
    Tree Height: 775
  - Class: rviz/Selection
    Name: Selection
  - Class: rviz/Tool Properties
    Expanded:
      - /2D Pose Estimate1
      - /2D Nav Goal1
      - /Publish Point1
    Name: Tool Properties
    Splitter Ratio: 0.588679016
  - Class: rviz/Views
    Expanded:
      - /Current View1
    Name: Views
    Splitter Ratio: 0.5
  - Class: rviz/Time
    Experimental: false
    Name: Time
    SyncMode: 0
    SyncSource: LaserScan
Visualization Manager:
  Class: ""
  Displays:
    - Alpha: 0.5
      Cell Size: 1
      Class: rviz/Grid
      Color: 160; 160; 164
      Enabled: true
      Line Style:
        Line Width: 0.0299999993
        Value: Lines
      Name: Grid
      Normal Cell Count: 0
      Offset:
        X: 0
        Y: 0
        Z: 0
      Plane: XY
      Plane Cell Count: 10
      Reference Frame: <Fixed Frame>
      Value: true
    - Class: rviz/TF
      Enabled: true
      Frame Timeout: 15
      Frames:
        All Enabled: true
        IMU_link:
          Value: true
        base_footprint:
          Value: true
        base_link:
          Value: true
        laser:
          Value: true
        map:
          Value: true
        odom:
          Value: true
      Marker Scale: 1
      Name: TF
      Show Arrows: true
      Show Axes: true
      Show Names: true
      Tree:
        map:
          odom:
            base_footprint:
              base_link:
                IMU_link:
                  {}
                laser:
                  {}
      Update Interval: 0
      Value: true
    - Alpha: 1
      Autocompute Intensity Bounds: true
      Autocompute Value Bounds:
        Max Value: 10
        Min Value: -10
        Value: true
      Axis: Z
      Channel Name: intensity
      Class: rviz/LaserScan
      Color: 255; 255; 255
      Color Transformer: Intensity
      Decay Time: 0
      Enabled: true
      Invert Rainbow: false
      Max Color: 255; 255; 255
      Max Intensity: 2390
      Min Color: 0; 0; 0
      Min Intensity: 3
      Name: LaserScan
      Position Transformer: XYZ
      Queue Size: 10
      Selectable: true
      Size (Pixels): 3
      Size (m): 0.0500000007
      Style: Flat Squares
      Topic: /scan
      Unreliable: false
      Use Fixed Frame: true
      Use rainbow: true
      Value: true
    - Alpha: 0.699999988
      Class: rviz/Map
      Color Scheme: map
      Draw Behind: false
      Enabled: true
      Name: Map
      Topic: /map
      Unreliable: false
      Use Timestamp: false
      Value: true
    - Alpha: 1
      Buffer Length: 1
      Class: rviz/Path
      Color: 25; 255; 0
      Enabled: true
      Head Diameter: 0.300000012
      Head Length: 0.200000003
      Length: 0.300000012
      Line Style: Lines
      Line Width: 0.0299999993
      Name: Path
      Offset:
        X: 0
        Y: 0
        Z: 0
      Pose Color: 255; 85; 255
      Pose Style: None
      Radius: 0.0299999993
      Shaft Diameter: 0.100000001
      Shaft Length: 0.100000001
      Topic: /move_base/TrajectoryPlannerROS/global_plan
      Unreliable: false
      Value: true
    - Angle Tolerance: 0.100000001
      Class: rviz/Odometry
      Covariance:
        Orientation:
          Alpha: 0.5
          Color: 255; 255; 127
          Color Style: Unique
          Frame: Local
          Offset: 1
          Scale: 1
          Value: true
        Position:
          Alpha: 0.300000012
          Color: 204; 51; 204
          Scale: 1
          Value: true
        Value: false
      Enabled: true
      Keep: 500
      Name: ekf_odom
      Position Tolerance: 0.100000001
      Shape:
        Alpha: 1
        Axes Length: 1
        Axes Radius: 0.100000001
        Color: 0; 0; 255
        Head Length: 0.300000012
        Head Radius: 0.100000001
        Shaft Length: 0.200000003
        Shaft Radius: 0.0500000007
        Value: Arrow
      Topic: /odometry/filtered
      Unreliable: false
      Value: true
    - Angle Tolerance: 0.100000001
      Class: rviz/Odometry
      Covariance:
        Orientation:
          Alpha: 0.5
          Color: 255; 255; 127
          Color Style: Unique
          Frame: Local
          Offset: 1
          Scale: 1
          Value: true
        Position:
          Alpha: 0.300000012
          Color: 204; 51; 204
          Scale: 1
          Value: true
        Value: false
      Enabled: true
      Keep: 500
      Name: rf2o_odom
      Position Tolerance: 0.100000001
      Shape:
        Alpha: 1
        Axes Length: 1
        Axes Radius: 0.100000001
        Color: 255; 25; 0
        Head Length: 0.300000012
        Head Radius: 0.100000001
        Shaft Length: 0.200000003
        Shaft Radius: 0.0500000007
        Value: Arrow
      Topic: /rf2o_laser_odometry/odom
      Unreliable: false
      Value: true
  Enabled: true
  Global Options:
    Background Color: 48; 48; 48
    Default Light: true
    Fixed Frame: map
    Frame Rate: 30
  Name: root
  Tools:
    - Class: rviz/Interact
      Hide Inactive Objects: true
    - Class: rviz/MoveCamera
    - Class: rviz/Select
    - Class: rviz/FocusCamera
    - Class: rviz/Measure
    - Class: rviz/SetInitialPose
      Topic: /initialpose
    - Class: rviz/SetGoal
      Topic: /move_base_simple/goal
    - Class: rviz/PublishPoint
      Single click: true
      Topic: /clicked_point
  Value: true
  Views:
    Current:
      Class: rviz/Orbit
      Distance: 17.5254555
      Enable Stereo Rendering:
        Stereo Eye Separation: 0.0599999987
        Stereo Focal Distance: 1
        Swap Stereo Eyes: false
        Value: false
      Focal Point:
        X: 0.00508546829
        Y: -0.0301897526
        Z: 0.0989120007
      Focal Shape Fixed Size: true
      Focal Shape Size: 0.0500000007
      Invert Z Axis: false
      Name: Current View
      Near Clip Distance: 0.00999999978
      Pitch: 0.3878344
      Target Frame: <Fixed Frame>
      Value: Orbit (rviz)
      Yaw: 5.83341122
    Saved: ~
Window Geometry:
  Displays:
    collapsed: false
  Height: 1056
  Hide Left Dock: false
  Hide Right Dock: false
  QMainWindow State: 000000ff00000000fd00000004000000000000016a00000396fc0200000009fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000006100fffffffb0000001e0054006f006f006c002000500072006f0070006500720074006900650073020000019b000001b500000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000002800000396000000d700fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261fb0000000c00430061006d00650072006100000001d1000000b5000000000000000000000001000001a30000025efc0200000004fb0000000a0049006d00610067006500000000280000025e0000000000000000fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a0056006900650077007300000000280000025e000000ad00fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e100000197000000030000073f0000003efc0100000002fb0000000800540069006d006501000000000000073f0000030000fffffffb0000000800540069006d00650100000000000004500000000000000000000005cf0000039600000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
  Selection:
    collapsed: false
  Time:
    collapsed: false
  Tool Properties:
    collapsed: false
  Views:
    collapsed: false
  Width: 1855
  X: 65
  Y: 24


================================================
FILE: src/art_racecar/rviz/test_laser.rviz
================================================
Panels:
  - Class: rviz/Displays
    Help Height: 78
    Name: Displays
    Property Tree Widget:
      Expanded:
        - /Global Options1
        - /Status1
        - /Grid1
        - /LaserScan1
        - /Axes1
        - /Axes1/Status1
        - /TF1/Frames1
      Splitter Ratio: 0.5
    Tree Height: 490
  - Class: rviz/Selection
    Name: Selection
  - Class: rviz/Tool Properties
    Expanded:
      - /2D Pose Estimate1
      - /2D Nav Goal1
      - /Publish Point1
    Name: Tool Properties
    Splitter Ratio: 0.588679016
  - Class: rviz/Views
    Expanded:
      - /Current View1
    Name: Views
    Splitter Ratio: 0.5
  - Class: rviz/Time
    Experimental: false
    Name: Time
    SyncMode: 0
    SyncSource: LaserScan
Visualization Manager:
  Class: ""
  Displays:
    - Alpha: 0.5
      Cell Size: 1
      Class: rviz/Grid
      Color: 160; 160; 164
      Enabled: true
      Line Style:
        Line Width: 0.0299999993
        Value: Lines
      Name: Grid
      Normal Cell Count: 0
      Offset:
        X: 0
        Y: 0
        Z: 0
      Plane: XY
      Plane Cell Count: 26
      Reference Frame: <Fixed Frame>
      Value: true
    - Alpha: 1
      Autocompute Intensity Bounds: true
      Autocompute Value Bounds:
        Max Value: 10
        Min Value: -10
        Value: true
      Axis: Z
      Channel Name: intensity
      Class: rviz/LaserScan
      Color: 255; 255; 255
      Color Transformer: Intensity
      Decay Time: 0
      Enabled: true
      Invert Rainbow: false
      Max Color: 255; 255; 255
      Max Intensity: 2319
      Min Color: 0; 0; 0
      Min Intensity: 2
      Name: LaserScan
      Position Transformer: XYZ
      Queue Size: 10
      Selectable: true
      Size (Pixels): 3
      Size (m): 0.00999999978
      Style: Points
      Topic: /scan
      Unreliable: false
      Use Fixed Frame: true
      Use rainbow: true
      Value: true
    - Class: rviz/Axes
      Enabled: true
      Length: 0.5
      Name: Axes
      Radius: 0.0500000007
      Reference Frame: <Fixed Frame>
      Value: true
    - Class: rviz/TF
      Enabled: true
      Frame Timeout: 15
      Frames:
        All Enabled: true
      Marker Scale: 1
      Name: TF
      Show Arrows: true
      Show Axes: true
      Show Names: true
      Tree:
        {}
      Update Interval: 1
      Value: true
  Enabled: true
  Global Options:
    Background Color: 48; 48; 48
    Default Light: true
    Fixed Frame: laser
    Frame Rate: 30
  Name: root
  Tools:
    - Class: rviz/Interact
      Hide Inactive Objects: true
    - Class: rviz/MoveCamera
    - Class: rviz/Select
    - Class: rviz/FocusCamera
    - Class: rviz/Measure
    - Class: rviz/SetInitialPose
      Topic: /initialpose
    - Class: rviz/SetGoal
      Topic: /move_base_simple/goal
    - Class: rviz/PublishPoint
      Single click: true
      Topic: /clicked_point
  Value: true
  Views:
    Current:
      Class: rviz/Orbit
      Distance: 10.5115833
      Enable Stereo Rendering:
        Stereo Eye Separation: 0.0599999987
        Stereo Focal Distance: 1
        Swap Stereo Eyes: false
        Value: false
      Focal Point:
        X: 0
        Y: 0
        Z: 0
      Focal Shape Fixed Size: true
      Focal Shape Size: 0.0500000007
      Invert Z Axis: false
      Name: Current View
      Near Clip Distance: 0.00999999978
      Pitch: 1.06979573
      Target Frame: <Fixed Frame>
      Value: Orbit (rviz)
      Yaw: 2.66859388
    Saved: ~
Window Geometry:
  Displays:
    collapsed: false
  Height: 773
  Hide Left Dock: false
  Hide Right Dock: false
  QMainWindow State: 000000ff00000000fd00000004000000000000017000000279fc0200000008fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000006100fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000002800000279000000d700fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261000000010000010f00000279fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073010000002800000279000000ad00fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e100000197000000030000054300000040fc0100000002fb0000000800540069006d00650100000000000005430000030000fffffffb0000000800540069006d00650100000000000004500000000000000000000002b80000027900000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
  Selection:
    collapsed: false
  Time:
    collapsed: false
  Tool Properties:
    collapsed: false
  Views:
    collapsed: false
  Width: 1347
  X: 152
  Y: 136


================================================
FILE: src/art_racecar/save_map.sh
================================================
#!/bin/bash

rosrun map_server map_saver -f  ~/racecar/src/art_racecar/map/mymap

================================================
FILE: src/art_racecar/src/ESC_calibration.py
================================================
#!/usr/bin/env python

import rospy

from geometry_msgs.msg import Twist

import sys, select, termios, tty
import time

msg = ""


def getKey():
    tty.setraw(sys.stdin.fileno())
    rlist, _, _ = select.select([sys.stdin], [], [], 0.1)
    if rlist:
        key = sys.stdin.read(1)
    else:
        key = ''

    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)
    return key


def vels(speed,turn):
    return "currently:\tspeed %s\tturn %s " % (speed,turn)

if __name__=="__main__":
    settings = termios.tcgetattr(sys.stdin)
    
    rospy.init_node('racecar_teleop')
    pub = rospy.Publisher('~/car/cmd_vel', Twist, queue_size=5)


    run = 0

    try:
        while(1):
            key = getKey()
            twist = Twist()
            if key == '1':
            	twist.linear.x = 1500; twist.linear.y = 0; twist.linear.z = 0
                twist.angular.x = 0; twist.angular.y = 0; twist.angular.z = 90
                print "vel = 0"
            elif key == '2':
            	twist.linear.x = 2000; twist.linear.y = 0; twist.linear.z = 0
                twist.angular.x = 0; twist.angular.y = 0; twist.angular.z = 90
                print "vel = +Max"
            elif key == '3':
            	twist.linear.x = 1000; twist.linear.y = 0; twist.linear.z = 0
                twist.angular.x = 0; twist.angular.y = 0; twist.angular.z = 90
                print "vel = -Max"
            else:
            	twist.linear.x = 1500; twist.linear.y = 0; twist.linear.z = 0
                twist.angular.x = 0; twist.angular.y = 0; twist.angular.z = 90
                print "stop"

            pub.publish(twist)
            
            

            if (key == '\x03'):   #for ctrl + c exit
                break

    except:
        print "error"

    finally:
        twist = Twist()
        twist.linear.x = speed_mid; twist.linear.y = 0; twist.linear.z = 0
        twist.angular.x = 0; twist.angular.y = 0; twist.angular.z = turn_mid
        pub.publish(twist)

    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)


================================================
FILE: src/art_racecar/src/PID.h
================================================

#ifndef PID_H
#define	PID_H

/***********************************/
typedef struct PID
{              //结构体定义
    double SetPoint;         //设定值
    double Proportion;         // Proportion 比例系数
    double  Integral;            // Integral   积分系数
    double  Derivative;          // Derivative  微分系数
    double  LastError;          // Error[-1]  前一拍误差
    double  PreError;           // Error[-2]  前两拍误差


}PID;


void PIDInit (struct PID *pp);
double PIDCal(struct PID *pp, double ThisError);




#endif




================================================
FILE: src/art_racecar/src/art_car_controller.cpp
================================================
/*
Copyright (c) 2017, ChanYuan KUO, YoRu LU,
latest editor: HaoChih, LIN
All rights reserved. (Hypha ROS Workshop)

This file is part of hypha_racecar package.

hypha_racecar is free software: you can redistribute it and/or modify
it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE as published
by the Free Software Foundation, either version 3 of the License, or
any later version.

hypha_racecar is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU LESSER GENERAL PUBLIC LICENSE for more details.

You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
along with hypha_racecar.  If not, see <http://www.gnu.org/licenses/>.
*/

#include <iostream>
#include "ros/ros.h"
#include <geometry_msgs/PoseStamped.h>
#include <geometry_msgs/Twist.h>
#include <tf/transform_listener.h>
#include <tf/transform_datatypes.h>
#include "nav_msgs/Path.h"
#include <nav_msgs/Odometry.h>
#include <visualization_msgs/Marker.h>
#include "PID.h"
#include "art_car_controller.hpp"

#define PI 3.14159265358979
int start_loop_flag = 0;
int start_speed = 1560;
extern  PID  pid_speed;

L1Controller::L1Controller()
{
    //Private parameters handler
    ros::NodeHandle pn("~");

    //Car parameter
    pn.param("L", L, 0.26);
    pn.param("Lrv", Lrv, 10.0);
    pn.param("Vcmd", Vcmd, 1.0);
    pn.param("lfw", lfw, 0.13);
    pn.param("lrv", lrv, 10.0);

    //Controller parameter
    pn.param("controller_freq", controller_freq, 20);
    pn.param("AngleGain", Angle_gain, -1.0);
    pn.param("GasGain", Gas_gain, 1.0);
    pn.param("baseSpeed", baseSpeed, 1575);
    pn.param("baseAngle", baseAngle, 90.0);

    //Publishers and Subscribers
    odom_sub = n_.subscribe("/odometry/filtered", 1, &L1Controller::odomCB, this);
    path_sub = n_.subscribe("/move_base_node/NavfnROS/plan", 1, &L1Controller::pathCB, this);
    goal_sub = n_.subscribe("/move_base_simple/goal", 1, &L1Controller::goalCB, this);
    marker_pub = n_.advertise<visualization_msgs::Marker>("car_path", 10);
    pub_ = n_.advertise<geometry_msgs::Twist>("car/cmd_vel", 1);

    //Timer
    timer1 = n_.createTimer(ros::Duration((1.0)/controller_freq), &L1Controller::controlLoopCB, this); // Duration(0.05) -> 20Hz
    timer2 = n_.createTimer(ros::Duration((0.5)/controller_freq), &L1Controller::goalReachingCB, this); // Duration(0.05) -> 20Hz

    //Init variables
    Lfw = goalRadius = getL1Distance(Vcmd);
    foundForwardPt = false;
    goal_received = false;
    goal_reached = false;
    cmd_vel.linear.x = 1500; // 1500 for stop
    cmd_vel.angular.z = baseAngle;

    //Show info
    ROS_INFO("[param] baseSpeed: %d", baseSpeed);
    ROS_INFO("[param] baseAngle: %f", baseAngle);
    ROS_INFO("[param] AngleGain: %f", Angle_gain);
    ROS_INFO("[param] Vcmd: %f", Vcmd);
    ROS_INFO("[param] Lfw: %f", Lfw);

    //Visualization Marker Settings
    initMarker();
    car_stop = 0;
}

void L1Controller::goalReachingCB(const ros::TimerEvent&)
{

    if(goal_received)
    {
        double car2goal_dist = getCar2GoalDist();
        if(car2goal_dist < goalRadius)
        {
            goal_reached = true;
            goal_received = false;
            //ROS_INFO("Goal Reached !");
            car_stop = 100;
        }
    }
}




void L1Controller::controlLoopCB(const ros::TimerEvent&)
{
    int count = 100;
    geometry_msgs::Pose carPose = odom.pose.pose;
    geometry_msgs::Twist carVel = odom.twist.twist;
    cmd_vel.linear.x = 1500;
    cmd_vel.angular.z = baseAngle;

    if(goal_received)
    {
        /*Estimate Steering Angle*/
        double eta = getEta(carPose);  
        if(foundForwardPt)
        {

            cmd_vel.angular.z = baseAngle + getSteeringAngle(eta)*Angle_gain;
            /*Estimate Gas Input*/

            if(!goal_reached)
            {
                if(start_loop_flag++ <= 10)
                {

                    double u = getGasInput(carVel.linear.x);
                    
                    cmd_vel.linear.x = start_speed + PIDCal(&pid_speed,u);



                     start_speed += 4;
                     if(cmd_vel.linear.x > baseSpeed)   cmd_vel.linear.x = baseSpeed;
                     ROS_INFO("baseSpeed = %.2f\tSteering angle = %.2f",cmd_vel.linear.x,cmd_vel.angular.z);
                }
                else
                {
                    //ROS_INFO("!goal_reached");
                    double u = getGasInput(carVel.linear.x);                   
                    cmd_vel.linear.x = baseSpeed + PIDCal(&pid_speed,u);
                    
                    ROS_INFO("Gas = %.2f\tSteering angle = %.2f",cmd_vel.linear.x,cmd_vel.angular.z);
                }  
            }

        }
    }
    if(car_stop > 0)
    {
        start_loop_flag = 0;
        if(carVel.linear.x > 0)
        {

            cmd_vel.linear.x = 1300; //反向刹车
            pub_.publish(cmd_vel);
           // for(int i=0;i<20;i++)
           // {
           //     pub_.publish(cmd_vel);
           //     sleep(0.1);
           //     ROS_INFO("cat stop cmd_vel= %f",cmd_vel.linear.x);
           // }
            
        }
        else
        {
            car_stop = 0;
            cmd_vel.linear.x = 1500;
            pub_.publish(cmd_vel);

            //ROS_INFO("cmd_vel= %f",cmd_vel.linear.x);
        }
    }
    else
    {
        pub_.publish(cmd_vel);
        car_stop = 0;
        //ROS_INFO("car run cmd_vel= %f",cmd_vel.linear.x);
    }
}


/*****************/
/* MAIN FUNCTION */
/*****************/
int main(int argc, char **argv)
{
    //Initiate ROS
    ros::init(argc, argv, "art_car_controller");
    L1Controller controller;
    controller.PID_init();
    ros::spin();
    return 0;
}


================================================
FILE: src/art_racecar/src/art_car_controller.hpp
================================================
/********************/
/* CLASS DEFINITION */
/********************/
class L1Controller
{
    public:
        L1Controller();
        void initMarker();
        bool isForwardWayPt(const geometry_msgs::Point& wayPt, const geometry_msgs::Pose& carPose);
        bool isWayPtAwayFromLfwDist(const geometry_msgs::Point& wayPt, const geometry_msgs::Point& car_pos);
        double getYawFromPose(const geometry_msgs::Pose& carPose);        
        double getEta(const geometry_msgs::Pose& carPose);
        double getCar2GoalDist();
        double getL1Distance(const double& _Vcmd);
        double getSteeringAngle(double eta);
        double getGasInput(const float& current_v);
        geometry_msgs::Point get_odom_car2WayPtVec(const geometry_msgs::Pose& carPose);
        void PID_init();

    private:
        struct PID *speed_pid;
        ros::NodeHandle n_;
        ros::Subscriber odom_sub, path_sub, goal_sub;
        ros::Publisher pub_, marker_pub;
        ros::Timer timer1, timer2;
        tf::TransformListener tf_listener;

        visualization_msgs::Marker points, line_strip, goal_circle;
        geometry_msgs::Twist cmd_vel;
        geometry_msgs::Point odom_goal_pos;
        nav_msgs::Odometry odom;
        nav_msgs::Path map_path, odom_path;

        double L, Lfw, Lrv, Vcmd, lfw, lrv, steering, u, v;
        double Gas_gain, baseAngle, Angle_gain, goalRadius;
        int controller_freq, baseSpeed;
        bool foundForwardPt, goal_received, goal_reached;
        int car_stop;

        void odomCB(const nav_msgs::Odometry::ConstPtr& odomMsg);
        void pathCB(const nav_msgs::Path::ConstPtr& pathMsg);
        void goalCB(const geometry_msgs::PoseStamped::ConstPtr& goalMsg);
        void goalReachingCB(const ros::TimerEvent&);
        void controlLoopCB(const ros::TimerEvent&);



}; // end of class



================================================
FILE: src/art_racecar/src/racecar_joy.py
================================================
#!/usr/bin/env python

import rospy

from geometry_msgs.msg import Twist
from sensor_msgs.msg import Joy

import sys, select, termios, tty
import time

msg = """

CTRL-C to quit
"""
global run
global speed_add_once,turn_add_once,speed_mid,turn_mid,control_speed,control_turn,speed_max,turn_max,speed_min,turn_min
global last_speed_add_once,last_turn_add_once



def callback(data):
    twist = Twist()   
    car_twist = Twist() 
    global speed_add_once,turn_add_once
    global last_turn_add_once,last_speed_add_once
    if (data.buttons[6] == 1 or data.buttons[7] == 1):
        twist.linear.x = 0
        twist.angular.z = 0
        print("STOP!!")
    else:
        if(data.axes[5] != 0):
            if(last_speed_add_once == 0):
                speed_add_once = speed_add_once + data.axes[5] * 0.1
            last_speed_add_once = 1
        else:
            last_speed_add_once = 0
        if(data.axes[4] != 0):
            if(last_turn_add_once == 0):
                turn_add_once = turn_add_once + data.axes[4] * 0.1
            last_turn_add_once = 1
        else:
            last_turn_add_once = 0
        if(speed_add_once > 1):
            speed_add_once = 1
        elif(speed_add_once < -1):
            speed_add_once = -1
        if(turn_add_once > 1):
            turn_add_once = 1
        elif(turn_add_once < -1):
            turn_add_once = -1
        twist.linear.x = data.axes[3] * speed_add_once
        twist.angular.z = data.axes[2] * turn_add_once
        control_speed = (data.axes[3] * (speed_max - speed_min) * speed_add_once / 2 + speed_mid)  
        if(control_speed > 1500):
            control_speed = control_speed + 30
        elif(control_speed < 1500):
	    control_speed = control_speed - 200	
        control_turn = (data.axes[2] * (turn_max - turn_min) * turn_add_once  / 2 + turn_mid) 
        #print('speed: %.2f, turn: %.2f'%(twist.linear.x,twist.angular.z))
        car_twist.linear.x = control_speed
        car_twist.angular.z = control_turn
        print('speed: %.2f, turn: %.2f'%(control_speed,control_turn))
    pub.publish(twist)
    pub_car.publish(car_twist)



def vels(speed,turn):
    return "currently:\tspeed %s\tturn %s " % (speed,turn)


def getKey():
    tty.setraw(sys.stdin.fileno())
    rlist, _, _ = select.select([sys.stdin], [], [], 0.1)
    if rlist:
        key = sys.stdin.read(1)
    else:
        key = ''

    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)
    return key


if __name__=="__main__":

    settings = termios.tcgetattr(sys.stdin)
    speed_add_once = 0.25
    turn_add_once = 0.5
    speed_max = 1600
    speed_min = 1400
    speed_mid = 1500
    turn_max = 180
    turn_min = 0
    turn_mid = (turn_max + turn_min)/2

    control_speed = speed_mid
    control_turn = turn_mid

    global pub
    rospy.init_node('racecar_joy')
    pub = rospy.Publisher('~/cmd_vel', Twist, queue_size=5)
    pub_car = rospy.Publisher('~/car/cmd_vel', Twist, queue_size=5)
    try:
       
        while(1):
            
            key = getKey()
           
            rospy.Subscriber("joy", Joy, callback)
            
            rospy.spin()
            
            if (key == '\x03'):   #for ctrl + c exit
                break 
           

    except:
        print "error"

    finally:
    	print "finally"
        twist = Twist()
        car_twist = Twist()
        twist.linear.x = 0; twist.linear.y = 0; twist.linear.z = 0
        twist.angular.x = 0; twist.angular.y = 0; twist.angular.z = 0
        pub.publish(twist)
        pub_car.publish(car_twist)

    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)


================================================
FILE: src/art_racecar/src/racecar_teleop.py
================================================
#!/usr/bin/env python

import rospy

from geometry_msgs.msg import Twist

import sys, select, termios, tty
import time

msg = """
Control Your racecar!
Reading from the keyboard  and Publishing to Twist!
---------------------------
Moving around:
   u    i    o
   j    k    l
   m    ,    .

For Holonomic mode (strafing), hold down the shift key:
---------------------------
   U    I    O
   J    K    L
   M    <    >

space key, k : force stop
w/x: shift the middle pos of throttle by +/- 5 pwm
a/d: shift the middle pos of steering by +/- 2 pwm
CTRL-C to quit
"""

moveBindings = {
        'i':(1,0),
        'o':(1,-1),
        'j':(0,1),
        'l':(0,-1),
        'u':(1,1),
        ',':(-1,0),
        '.':(-1,-1),
        'm':(-1,1),
        'I':(1,0),
        'O':(1,-1),
        'J':(0,1),
        'L':(0,-1),
        'U':(1,1),
        '<':(-1,0),
        '>':(-1,-1),
        'M':(-1,1),
           }


def getKey():
    tty.setraw(sys.stdin.fileno())
    rlist, _, _ = select.select([sys.stdin], [], [], 0.1)
    if rlist:
        key = sys.stdin.read(1)
    else:
        key = ''

    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)
    return key


def vels(speed,turn):
    return "currently:\tspeed %s\tturn %s " % (speed,turn)

if __name__=="__main__":
    settings = termios.tcgetattr(sys.stdin)
    
    rospy.init_node('racecar_teleop')
    pub = rospy.Publisher('~/car/cmd_vel', Twist, queue_size=5)

    speed_start_value = 70 
    turn_start_value = 50
    speed_mid = 1500
    turn_mid = 90
    speed_bias = 0
    turn_bias = 0
    speed_add_once = 5
    turn_add_once = 2
    control_speed = speed_mid
    control_turn = turn_mid
    speed_dir = 0
    last_speed_dir = 0
    last_turn_dir = 0
    last_control_speed = control_speed
    last_control_turn = control_turn

    run = 0

    try:
        while(1):
            key = getKey()
            twist = Twist()
            if key in moveBindings.keys():
                run = 1

                #print "key =",key
                speed_dir = moveBindings[key][0]
                if(speed_dir!=0 and speed_dir + last_speed_dir == 0):#Reverse
                    control_speed = speed_mid                 
                    last_speed_dir = speed_dir
                    control_turn = turn_mid
                    print "Reverse"
                else:
                    if(speed_dir > 0):
                        control_speed = speed_dir * (speed_start_value + speed_bias) + speed_mid 
                    elif(speed_dir < 0):
                        control_speed = speed_dir * (speed_start_value + speed_bias) + speed_mid - 140
                    else:
                        control_speed = 1500

                    control_turn = moveBindings[key][1] * (turn_start_value + turn_bias)+ turn_mid 
                    last_speed_dir = speed_dir
                   
                    #print " "
                #print "speed_dir = ",speed_dir
                #print "control_speed = ",control_speed
                #print "control_turn = ",control_turn
                last_control_speed = control_speed
                last_control_turn = control_turn
            elif key == ' ' or key == 'k' :
                speed_dir = -speed_dir #for ESC Forward/Reverse with brake mode
                control_speed = last_control_speed * speed_dir
                control_turn = turn_mid
                run = 0
            elif key == 'w' :
                speed_bias += speed_add_once              
                if(speed_bias >= 450):  
                    speed_bias = 450
                else:
                    last_control_speed = last_control_speed+speed_add_once
                run = 0
            elif key == 's' :
                speed_bias -= speed_add_once
                last_control_speed = last_control_speed-speed_add_once
                if(speed_bias <= 0):  
                    speed_bias = 0
                run = 0
            elif key == 'a' :
                turn_bias += turn_add_once
                last_control_turn = last_control_turn+turn_add_once 
                if(turn_bias >= 80):  
                    turn_bias = 80
                run = 0
            elif key == 'd' :
                turn_bias -= turn_add_once
                last_control_turn = last_control_turn-turn_add_once 
                if(turn_bias <= 0):  
                    turn_bias = 0
                run = 0
            else:
                run = 0   
            print vels(control_speed,control_turn)     
            #print "speed_dir=",speed_dir,"last_speed_dir",last_speed_dir
            if(run == 1):                      
                twist.linear.x = control_speed; twist.linear.y = 0; twist.linear.z = 0
                twist.angular.x = 0; twist.angular.y = 0; twist.angular.z = control_turn
                #print "control_speed =",control_speed
                pub.publish(twist)
            else:              
                twist.linear.x = speed_mid; twist.linear.y = 0; twist.linear.z = 0
                twist.angular.x = 0; twist.angular.y = 0; twist.angular.z = turn_mid
                pub.publish(twist)

            if (key == '\x03'):   #for ctrl + c exit
                break

    except:
        print "error"

    finally:
        twist = Twist()
        twist.linear.x = speed_mid; twist.linear.y = 0; twist.linear.z = 0
        twist.angular.x = 0; twist.angular.y = 0; twist.angular.z = turn_mid
        pub.publish(twist)

    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)


================================================
FILE: src/art_racecar/ssh.sh
================================================
#!/bin/bash

#for run artrobot
#Steven.Zhang
#2018.03.09

ssh sz@192.168.5.101





================================================
FILE: src/art_racecar/udev/README
================================================
#添加ART_Racecar的USB设备,使用如下指令:
sudo bash art_init.sh
然后重启电脑


================================================
FILE: src/art_racecar/udev/art_init.sh
================================================
#!/bin/bash
sudo cp ./car.rules /etc/udev/rules.d
sudo cp ./laser.rules /etc/udev/rules.d
sudo cp ./imu.rules /etc/udev/rules.d
#
exit 0


================================================
FILE: src/art_racecar/udev/car.rules
================================================
# set the udev rule , make the device_port be fixed by arduino
#
KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="666", SYMLINK+="car"



================================================
FILE: src/art_racecar/udev/imu.rules
================================================
# set the udev rule , make the device_port be fixed by sanchi_imu
#
KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{serial}=="0001", MODE:="666", SYMLINK+="imu"



================================================
FILE: src/art_racecar/udev/laser.rules
================================================
# set the udev rule , make the device_port be fixed by ls-lidar
#
KERNEL=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001",MODE:="0666", SYMLINK+="laser"



================================================
FILE: src/ls01g/CMakeLists.txt
================================================
cmake_minimum_required(VERSION 2.8.3)
project(ls01g)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  sensor_msgs
)


catkin_package()

include_directories(
  ${catkin_INCLUDE_DIRS}/src
)



add_executable(ls01g src/main.cpp src/uart_driver.cpp)

target_link_libraries(ls01g ${catkin_LIBRARIES})

install(TARGETS ls01g
  ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

install(DIRECTORY launch
        DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
)


================================================
FILE: src/ls01g/Y.txt
================================================
Stop the scan command:
	rostopic pub /startOrStop std_msgs/Int32 "data: 1"

Stop the motor command(Stop the motor will stop scanning):
	rostopic pub /startOrStop std_msgs/Int32 "data: 2"

Start scanning(Drive motor, and then open the scanning):
	rostopic pub /startOrStop std_msgs/Int32 "data: 4"


================================================
FILE: src/ls01g/launch/ls01g.launch
================================================
<?xml version="1.0"?>

<launch>
    <arg name="inverted" default="false" />
    <node name="ls01g" pkg="ls01g" type="ls01g" output="screen">
        <param name="scan_topic" value="scan"/>         #设置激光数据topic名称
        <param name="laser_link" value="base_laser_link"/>     #激光坐标
        <param name="serial_port" value="/dev/ttyUSB0"/>  #雷达连接的串口
        <param name="zero_as_max" value="false"/>        # 设置为true探测不到区域会变成最大值
        <param name="min_as_zero" value="false"/>        # true:探测不到区域为0,false:探测不到区域为inf
        <param name="angle_disable_min" value="-1"/>    # 角度制,从angle_disable_min到angle_disable_max之前的值为0
        <param name="angle_disable_max" value="-1"/>
        <param name="inverted" value="$(arg inverted)"/>           # 如果0度方向在串口线的方向上设置为true 
    </node>
    <!--<node name="rviz" pkg="rviz" type="rviz" args="-d $(find ls01g)/launch/rviz.rviz"/>-->
</launch>


================================================
FILE: src/ls01g/launch/rviz.launch
================================================
<launch>
  <node name="rviz" pkg="rviz" type="rviz" args="-d $(find ls01g)/launch/rviz.rviz"/>
</launch>


================================================
FILE: src/ls01g/launch/rviz.rviz
================================================
Panels:
  - Class: rviz/Displays
    Help Height: 78
    Name: Displays
    Property Tree Widget:
      Expanded:
        - /Global Options1
        - /Status1
        - /Grid1
        - /Axes1
      Splitter Ratio: 0.5
    Tree Height: 765
  - Class: rviz/Selection
    Name: Selection
  - Class: rviz/Tool Properties
    Expanded:
      - /2D Pose Estimate1
      - /2D Nav Goal1
      - /Publish Point1
    Name: Tool Properties
    Splitter Ratio: 0.588679
  - Class: rviz/Views
    Expanded:
      - /Current View1
    Name: Views
    Splitter Ratio: 0.5
  - Class: rviz/Time
    Experimental: false
    Name: Time
    SyncMode: 0
    SyncSource: LaserScan
Visualization Manager:
  Class: ""
  Displays:
    - Alpha: 0.5
      Cell Size: 1
      Class: rviz/Grid
      Color: 160; 160; 164
      Enabled: true
      Line Style:
        Line Width: 0.03
        Value: Lines
      Name: Grid
      Normal Cell Count: 0
      Offset:
        X: 0
        Y: 0
        Z: 0
      Plane: XY
      Plane Cell Count: 26
      Reference Frame: <Fixed Frame>
      Value: true
    - Alpha: 1
      Autocompute Intensity Bounds: true
      Autocompute Value Bounds:
        Max Value: 10
        Min Value: -10
        Value: true
      Axis: Z
      Channel Name: intensity
      Class: rviz/LaserScan
      Color: 255; 255; 255
      Color Transformer: Intensity
      Decay Time: 0
      Enabled: true
      Invert Rainbow: false
      Max Color: 255; 255; 255
      Max Intensity: 0
      Min Color: 0; 0; 0
      Min Intensity: 0
      Name: LaserScan
      Position Transformer: XYZ
      Queue Size: 10
      Selectable: true
      Size (Pixels): 3
      Size (m): 0.01
      Style: Points
      Topic: /scan
      Unreliable: false
      Use Fixed Frame: true
      Use rainbow: true
      Value: true
    - Class: rviz/Axes
      Enabled: true
      Length: 0.1
      Name: Axes
      Radius: 0.05
      Reference Frame: <Fixed Frame>
      Value: true
  Enabled: true
  Global Options:
    Background Color: 48; 48; 48
    Fixed Frame: laser_link
    Frame Rate: 30
  Name: root
  Tools:
    - Class: rviz/Interact
      Hide Inactive Objects: true
    - Class: rviz/MoveCamera
    - Class: rviz/Select
    - Class: rviz/FocusCamera
    - Class: rviz/Measure
    - Class: rviz/SetInitialPose
      Topic: /initialpose
    - Class: rviz/SetGoal
      Topic: /move_base_simple/goal
    - Class: rviz/PublishPoint
      Single click: true
      Topic: /clicked_point
  Value: true
  Views:
    Current:
      Class: rviz/Orbit
      Distance: 15.7352
      Enable Stereo Rendering:
        Stereo Eye Separation: 0.06
        Stereo Focal Distance: 1
        Swap Stereo Eyes: false
        Value: false
      Focal Point:
        X: 0
        Y: 0
        Z: 0
      Name: Current View
      Near Clip Distance: 0.01
      Pitch: 1.5698
      Target Frame: <Fixed Frame>
      Value: Orbit (rviz)
      Yaw: 3.14858
    Saved: ~
Window Geometry:
  Displays:
    collapsed: false
  Height: 1056
  Hide Left Dock: false
  Hide Right Dock: false
  QMainWindow State: 000000ff00000000fd00000004000000000000017000000391fc0200000008fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000006600fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000002800000391000000e200fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261000000010000010f00000391fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073010000002800000391000000b800fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e100000197000000030000078000000040fc0100000002fb0000000800540069006d00650100000000000007800000033b00fffffffb0000000800540069006d00650100000000000004500000000000000000000004f50000039100000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
  Selection:
    collapsed: false
  Time:
    collapsed: false
  Tool Properties:
    collapsed: false
  Views:
    collapsed: false
  Width: 1920
  X: 0
  Y: 24


================================================
FILE: src/ls01g/launch/talker2.launch
================================================
<launch>
    <node name="ls01g" pkg="ls01g" type="ls01g" output="screen" ns="l0" launch-prefix="gnome-terminal -e" >
  		<param name="scan_topic" value="scan"/>         #设置激光数据topic名称
  		<param name="laser_link" value="laser_link"/>     #激光坐标
  		<param name="serial_port" value="/dev/ttyUSB0"/>  #雷达连接的串口
        <param name="zero_as_max" value="false"/>
        <param name="min_as_zero" value="true"/>
		<param name="angle_disable_min" value="-1"/>
		<param name="angle_disable_max" value="-1"/>
    </node>
	
<node name="ls01g" pkg="ls01g" type="ls01g" output="screen" ns="l1" launch-prefix="gnome-terminal -e" >
  		<param name="scan_topic" value="scan"/>         #设置激光数据topic名称
  		<param name="laser_link" value="laser_link"/>     #激光坐标
  		<param name="serial_port" value="/dev/ttyUSB1"/>  #雷达连接的串口
        <param name="zero_as_max" value="false"/>
        <param name="min_as_zero" value="true"/>
		<param name="angle_disable_min" value="-1"/>
		<param name="angle_disable_max" value="-1"/>
    </node>

<node name="ls01g" pkg="ls01g" type="ls01g" output="screen" ns="l2" launch-prefix="gnome-terminal -e" >
  		<param name="scan_topic" value="scan"/>         #设置激光数据topic名称
  		<param name="laser_link" value="laser_link"/>     #激光坐标
  		<param name="serial_port" value="/dev/ttyUSB2"/>  #雷达连接的串口
        <param name="zero_as_max" value="false"/>
        <param name="min_as_zero" value="true"/>
		<param name="angle_disable_min" value="-1"/>
		<param name="angle_disable_max" value="-1"/>
    </node>

</launch>


================================================
FILE: src/ls01g/launch/talker_shell.launch
================================================
<launch>
	<param name="/talker/inverted" value="true"/>
    <include file="$(find ls01a)/launch/talker.launch">
    <!--<arg name="inverted" value="true"/>-->
  </include>
</launch>


================================================
FILE: src/ls01g/launch/test.launch
================================================
<?xml version="1.0"?>

<launch>
    <arg name="inverted" default="false" />
    <node name="ls01g" pkg="ls01g" type="ls01g" output="screen">
        <param name="scan_topic" value="scan"/>         #设置激光数据topic名称
        <param name="laser_link" value="base_laser_link"/>     #激光坐标
        <param name="serial_port" value="/dev/ttyUSB0"/>  #雷达连接的串口
        <param name="zero_as_max" value="false"/>        # 设置为true探测不到区域会变成最大值
        <param name="min_as_zero" value="false"/>        # true:探测不到区域为0,false:探测不到区域为inf
        <param name="angle_disable_min" value="-1"/>    # 角度制,从angle_disable_min到angle_disable_max之前的值为0
        <param name="angle_disable_max" value="-1"/>
        <param name="inverted" value="$(arg inverted)"/>           # 如果0度方向在串口线的方向上设置为true 
    </node>
    <!--<node name="rviz" pkg="rviz" type="rviz" args="-d $(find ls01g)/launch/rviz.rviz"/>-->
</launch>


================================================
FILE: src/ls01g/launch/test_ls01g.launch
================================================
<?xml version="1.0"?>

<launch>
  <arg name="scan_topic"  default="scan" />
  <arg name="base_frame"  default="base_footprint"/>
  <arg name="odom_frame"  default="odom"/>
  
  <arg name="inverted" default="false" />
    <node name="ls01g" pkg="ls01g" type="ls01g" output="screen">
  		<param name="scan_topic" value="scan"/>         #设置激光数据topic名称
  	    <param name="laser_link" value="base_laser_link"/>     #激光坐标
  	    <param name="serial_port" value="/dev/laser"/>  #雷达连接的串口
         <param name="zero_as_max" value="false"/>        # 设置为true探测不到区域会变成最大值
         <param name="min_as_zero" value="false"/>        # true:探测不到区域为0,false:探测不到区域为inf
		 <param name="angle_disable_min" value="-1"/>    # 角度制,从angle_disable_min到angle_disable_max之前的值为0
		 <param name="angle_disable_max" value="-1"/>
         <param name="inverted" value="$(arg inverted)"/>           # 如果0度方向在串口线的方向上设置为true 
    </node>
    <node name="rviz" pkg="rviz" type="rviz" args="-d $(find ls01g)/launch/rviz.rviz"/>
</launch>


================================================
FILE: src/ls01g/package.xml
================================================
<?xml version="1.0"?>
<package>
  <name>ls01g</name>
  <version>0.0.0</version>
  <description>The ls01g laser package</description>

  <!-- One maintainer tag required, multiple allowed, one person per tag --> 
  <!-- Example:  -->
  <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
  <maintainer email="yutong@todo.todo">yutong</maintainer>


  <!-- One license tag required, multiple allowed, one license per tag -->
  <!-- Commonly used license strings: -->
  <!--   BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
  <license>TODO</license>


  <!-- Url tags are optional, but mutiple are allowed, one per tag -->
  <!-- Optional attribute type can be: website, bugtracker, or repository -->
  <!-- Example: -->
  <!-- <url type="website">http://wiki.ros.org/talker</url> -->


  <!-- Author tags are optional, mutiple are allowed, one per tag -->
  <!-- Authors do not have to be maintianers, but could be -->
  <!-- Example: -->
  <!-- <author email="jane.doe@example.com">Jane Doe</author> -->


  <!-- The *_depend tags are used to specify dependencies -->
  <!-- Dependencies can be catkin packages or system dependencies -->
  <!-- Examples: -->
  <!-- Use build_depend for packages you need at compile time: -->
  <!--   <build_depend>message_generation</build_depend> -->
  <!-- Use buildtool_depend for build tool packages: -->
  <!--   <buildtool_depend>catkin</buildtool_depend> -->
  <!-- Use run_depend for packages you need at runtime: -->
  <!--   <run_depend>message_runtime</run_depend> -->
  <!-- Use test_depend for packages you need only for testing: -->
  <!--   <test_depend>gtest</test_depend> -->
  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>
  <run_depend>roscpp</run_depend>
  <run_depend>rospy</run_depend>
  <run_depend>std_msgs</run_depend>


  <!-- The export tag contains other, unspecified, tags -->
  <export>
    <!-- Other tools can request additional information be placed here -->

  </export>
</package>


================================================
FILE: src/ls01g/rviz/kobuki_rviz_viewer.rviz
================================================
Panels:
  - Class: rviz/Displays
    Help Height: 78
    Name: Displays
    Property Tree Widget:
      Expanded:
        - /Global Options1
        - /Status1
        - /LaserScan1
        - /Axes1
        - /Axes2
      Splitter Ratio: 0.5
    Tree Height: 727
  - Class: rviz/Selection
    Name: Selection
  - Class: rviz/Tool Properties
    Expanded:
      - /2D Pose Estimate1
      - /2D Nav Goal1
      - /Publish Point1
    Name: Tool Properties
    Splitter Ratio: 0.588679
  - Class: rviz/Views
    Expanded:
      - /Current View1
    Name: Views
    Splitter Ratio: 0.5
  - Class: rviz/Time
    Experimental: false
    Name: Time
    SyncMode: 0
    SyncSource: LaserScan
Visualization Manager:
  Class: ""
  Displays:
    - Alpha: 0.5
      Cell Size: 1
      Class: rviz/Grid
      Color: 160; 160; 164
      Enabled: true
      Line Style:
        Line Width: 0.03
        Value: Lines
      Name: Grid
      Normal Cell Count: 0
      Offset:
        X: 0
        Y: 0
        Z: 0
      Plane: XY
      Plane Cell Count: 10
      Reference Frame: <Fixed Frame>
      Value: true
    - Alpha: 1
      Autocompute Intensity Bounds: true
      Autocompute Value Bounds:
        Max Value: 10
        Min Value: -10
        Value: true
      Axis: Z
      Channel Name: intensity
      Class: rviz/LaserScan
      Color: 255; 255; 255
      Color Transformer: Intensity
      Decay Time: 0
      Enabled: true
      Invert Rainbow: false
      Max Color: 255; 255; 255
      Max Intensity: 65122
      Min Color: 0; 0; 0
      Min Intensity: 1
      Name: LaserScan
      Position Transformer: XYZ
      Queue Size: 10
      Selectable: true
      Size (Pixels): 5
      Size (m): 0.01
      Style: Points
      Topic: /scan
      Unreliable: false
      Use Fixed Frame: true
      Use rainbow: true
      Value: true
    - Class: rviz/Axes
      Enabled: true
      Length: 0.15
      Name: Axes
      Radius: 0.05
      Reference Frame: laser_link
      Value: true
    - Alpha: 0.7
      Class: rviz/Map
      Color Scheme: map
      Draw Behind: false
      Enabled: true
      Name: Map
      Topic: /map
      Unreliable: false
      Value: true
    - Class: rviz/Axes
      Enabled: true
      Length: 0.2
      Name: Axes
      Radius: 0.1
      Reference Frame: base_link
      Value: true
  Enabled: true
  Global Options:
    Background Color: 48; 48; 48
    Fixed Frame: map
    Frame Rate: 30
  Name: root
  Tools:
    - Class: rviz/Interact
      Hide Inactive Objects: true
    - Class: rviz/MoveCamera
    - Class: rviz/Select
    - Class: rviz/FocusCamera
    - Class: rviz/Measure
    - Class: rviz/SetInitialPose
      Topic: /initialpose
    - Class: rviz/SetGoal
      Topic: /move_base_simple/goal
    - Class: rviz/PublishPoint
      Single click: true
      Topic: /clicked_point
  Value: true
  Views:
    Current:
      Class: rviz/Orbit
      Distance: 30.5779
      Enable Stereo Rendering:
        Stereo Eye Separation: 0.06
        Stereo Focal Distance: 1
        Swap Stereo Eyes: false
        Value: false
      Focal Point:
        X: -10.6774
        Y: 1.87741
        Z: -0.740706
      Name: Current View
      Near Clip Distance: 0.01
      Pitch: 1.4998
      Target Frame: <Fixed Frame>
      Value: Orbit (rviz)
      Yaw: 3.14359
    Saved: ~
Window Geometry:
  Displays:
    collapsed: false
  Height: 1028
  Hide Left Dock: false
  Hide Right Dock: false
  QMainWindow State: 000000ff00000000fd0000000400000000000001820000036ffc0200000008fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000006800fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c00610079007301000000280000036f000000e600fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c0000026100000001000001170000036ffc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a0056006900650077007301000000280000036f000000be00fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e100000197000000030000073f00000044fc0100000002fb0000000800540069006d006501000000000000073f000003a700fffffffb0000000800540069006d006501000000000000045000000000000000000000049a0000036f00000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
  Selection:
    collapsed: false
  Time:
    collapsed: false
  Tool Properties:
    collapsed: false
  Views:
    collapsed: false
  Width: 1855
  X: 5
  Y: 14


================================================
FILE: src/ls01g/rviz/slam.rviz
================================================
Panels:
  - Class: rviz/Displays
    Help Height: 78
    Name: Displays
    Property Tree Widget:
      Expanded:
        - /Global Options1
        - /Status1
        - /RPLidarLaserScan1
      Splitter Ratio: 0.5
    Tree Height: 413
  - Class: rviz/Selection
    Name: Selection
  - Class: rviz/Tool Properties
    Expanded:
      - /2D Pose Estimate1
      - /2D Nav Goal1
    Name: Tool Properties
    Splitter Ratio: 0.588679
  - Class: rviz/Views
    Expanded:
      - /Current View1
    Name: Views
    Splitter Ratio: 0.5
  - Class: rviz/Time
    Experimental: false
    Name: Time
    SyncMode: 0
    SyncSource: RPLidarLaserScan
Visualization Manager:
  Class: ""
  Displays:
    - Alpha: 0.5
      Cell Size: 1
      Class: rviz/Grid
      Color: 160; 160; 164
      Enabled: true
      Line Style:
        Line Width: 0.03
        Value: Lines
      Name: Grid
      Normal Cell Count: 0
      Offset:
        X: 0
        Y: 0
        Z: 0
      Plane: XY
      Plane Cell Count: 10
      Reference Frame: <Fixed Frame>
      Value: true
    - Alpha: 1
      Autocompute Intensity Bounds: true
      Autocompute Value Bounds:
        Max Value: 0
        Min Value: 0
        Value: true
      Axis: Z
      Channel Name: intensity
      Class: rviz/LaserScan
      Color: 255; 255; 255
      Color Transformer: AxisColor
      Decay Time: 0
      Enabled: true
      Invert Rainbow: false
      Max Color: 255; 255; 255
      Max Intensity: 4096
      Min Color: 0; 0; 0
      Min Intensity: 0
      Name: RPLidarLaserScan
      Position Transformer: XYZ
      Queue Size: 1000
      Selectable: true
      Size (Pixels): 5
      Size (m): 0.03
      Style: Squares
      Topic: /scan
      Use Fixed Frame: true
      Use rainbow: true
      Value: true
    - Alpha: 0.7
      Class: rviz/Map
      Color Scheme: map
      Draw Behind: false
      Enabled: true
      Name: Map
      Topic: /map
      Value: true
  Enabled: true
  Global Options:
    Background Color: 48; 48; 48
    Fixed Frame: map
    Frame Rate: 30
  Name: root
  Tools:
    - Class: rviz/MoveCamera
    - Class: rviz/Interact
      Hide Inactive Objects: true
    - Class: rviz/Select
    - Class: rviz/SetInitialPose
      Topic: /initialpose
    - Class: rviz/SetGoal
      Topic: /move_base_simple/goal
  Value: true
  Views:
    Current:
      Class: rviz/Orbit
      Distance: 11.1184
      Enable Stereo Rendering:
        Stereo Eye Separation: 0.06
        Stereo Focal Distance: 1
        Swap Stereo Eyes: false
        Value: false
      Focal Point:
        X: -0.0344972
        Y: 0.065886
        Z: 0.148092
      Name: Current View
      Near Clip Distance: 0.01
      Pitch: 1.5698
      Target Frame: <Fixed Frame>
      Value: Orbit (rviz)
      Yaw: 5.66358
    Saved: ~
Window Geometry:
  Displays:
    collapsed: false
  Height: 626
  Hide Left Dock: false
  Hide Right Dock: false
  QMainWindow State: 000000ff00000000fd0000000400000000000001950000022cfc0200000006fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000006400fffffffb0000001e0054006f006f006c002000500072006f0070006500720074006900650073020000019b000001b500000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c00610079007301000000280000022c000000dd00fffffffb0000000a0049006d006100670065000000028d000000c60000000000000000000000010000010b00000294fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073000000003300000294000000b000fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000004a00000003efc0100000002fb0000000800540069006d00650000000000000004a0000002f600fffffffb0000000800540069006d00650100000000000004500000000000000000000003240000022c00000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
  Selection:
    collapsed: false
  Time:
    collapsed: false
  Tool Properties:
    collapsed: false
  Views:
    collapsed: false
  Width: 1215
  X: 503
  Y: 227


================================================
FILE: src/ls01g/scripts/LS01A.py
================================================
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import serial
import math
import time
from array import *
import rospy
import numpy as np
from sensor_msgs.msg import LaserScan

d2r = (2 * math.pi) / 360.0
r2d = 360.0 / (2 * math.pi)
pack_len = 1812

class ls01c:
    def __init__(self):
        # default parameters on parameter server
        self.angle_min = rospy.get_param('~/angle_min', -math.pi)
        self.angle_max = rospy.get_param('~/angle_max', math.pi)
        serial_baudrate = rospy.get_param('~/baudrate', 230400)
        serial_port = rospy.get_param('~/port', '/dev/laser')
        ScanPub = rospy.Publisher('scan', LaserScan, queue_size=5)
        ScanPub2 = rospy.Publisher('scan2', LaserScan, queue_size=5)
        angle_range1 = np.arange(0, -math.pi, math.radians(-1))
        angle_range2 = np.arange(math.pi, 0, math.radians(-1))
        self.angle_range = np.append(angle_range1, angle_range2)
        rospy.loginfo("laser is connected through port:%s and baudrate is %d" %(serial_port, serial_baudrate))
        rospy.loginfo("min angle is :%f and max angle is %f" %(self.angle_min, self.angle_max))
        rospy.on_shutdown(self.shutdown)

        header = [0xA5]
        ender = [0xE1, 0xAA, 0xBB, 0xCC, 0xDD]
        cmd_control = [0x3A]
        cmd_start = [0x2C]
        cmd_scan_continue = [0x20]
        cmd_scan_once = [0x22]
        cmd_stop = [0x21]
        cmd_stop_rot = [0x25]
        self.cmdstr_start = array("B", header + cmd_start + ender).tostring()
        self.cmdstr_control = array("B", header + cmd_control + ender).tostring()
        self.cmdstr_scan_continue = array("B", header + cmd_scan_continue + ender).tostring()
        self.cmdstr_scan_once = array("B", header + cmd_scan_once + ender).tostring()
        self.cmdstr_stop = array("B", header + cmd_stop + ender).tostring()
        self.cmdstr_stop_rot = array("B", header + cmd_stop_rot + ender).tostring()

        try:
            self.device = serial.Serial(serial_port, serial_baudrate, timeout=0.05)
            print("port opened successfully")
        except:
            print("Port failed open.\n"
                  "Are you sure device is connected correctly?\n"
                  "Please press (ctrl+c) and restart it after checked!"
                  )
            return

        time.sleep(0.2)
        #self.device.write(self.cmdstr_control)
        #time.sleep(3)
        self.device.write(self.cmdstr_start)
        time.sleep(0.2)
        #self.device.write(self.cmdstr_stop)  ## make sure no data is sending
        #time.sleep(0.2)
        self.device.write(self.cmdstr_scan_continue)
        time.sleep(5)

        rospy.loginfo("lidar is ready!")
        print self.angle_min, self.angle_max
        cnt = 0
        try:
            while not rospy.is_shutdown():
                laser_distance, laser_angle = self.resolveData()
                rospy.loginfo_throttle(30, "return data length is %d --->> "
                                           "this message appear every 30s to check driver"
                                       % len(laser_distance))
                if (cnt% 2== 0):
                    self.ls_scan_pub(ScanPub, laser_distance, laser_angle)
                else:
                    self.ls_scan_pub(ScanPub2, laser_distance, laser_angle)
                cnt += 1
                rospy.sleep(0.01)
        except:
            pass
        rospy.logwarn("keyboard interrupt---> rosnode shutdown is requested!")
        self.LaserStop()

    def LaserStop(self):
        self.device.write(self.cmdstr_stop)
        time.sleep(0.2)
        self.device.write(self.cmdstr_stop_rot)
        time.sleep(0.2)
        print('Laser is stopped to send data and thread is stopped')

    def resolveData(self):
        buffer_len = self.device.inWaiting()
        if buffer_len >= (pack_len * 3):
            print("need to empty buffer")
            self.device.read(pack_len * (buffer_len / pack_len))
        data = self.device.read(pack_len)
        cnt = 0
        while len(data) != pack_len:
            cnt += 1
            data_memst = self.device.read(pack_len - len(data))
            data = data + data_memst
            print("timeout %d times to read data from laser" % cnt)
            if cnt >= 50:
                raise IOError
        # print "go"
        if (data[0] == '\xA5') and (data[6] == '\x81'):
            # print "found"
            print ord(data[1]) / 15.0
            data_final = data[7:pack_len]
            pass
        else:
            while 1:
                data_check = self.device.read(1)
                if data_check != '\xA5':
                    continue
                else:
                    dat2 = self.device.read(6)
                    if dat2[-1] != '\x81':
                        continue
                    else:
                        data_final = self.device.read(pack_len - 7)
                        print ord(data_final[-4]), ord(data_final[-1])
                        if (data_final[-4] == '\xAA') and (data_final[-1] == '\xDD'):
                            break
                        else:
                            continue
        laser_distance = [0] * 360
        laser_angle = [0] * 360
        for i in range(360):
            laser_angle[i] = -(ord(data_final[2 + i * 5]) + ord(data_final[2 + i * 5]) * 256) / 10.0 * ((2 * math.pi) / 360.0)
            laser_distance[i] = (ord(data_final[3 + i * 5]) + ord(data_final[4 + i * 5]) * 256) / 1000.0

        return laser_distance, laser_angle

    def shutdown(self):
        # Always stop the robot when shutting down the node
        rospy.loginfo("Stopping the laser...")
        # self.dev.LaserStop()

    def ls_scan_pub(self, pub, laser_distance1, laser_angle1):
        # distance data is from -pi to pi
        laser_distance1 = np.array(laser_distance1)
        scan_msg = LaserScan()
        point_num = 360.0
        scan_msg.angle_max = self.angle_max  # LS-lidar rotates clockwise, which is disobey right-hand rules for coordinate system
        scan_msg.angle_min = self.angle_min
        scan_msg.header.frame_id = 'base_laser_link'
        scan_msg.angle_increment = 2 * math.pi / point_num
        scan_msg.range_min = 0.15
        scan_msg.range_max = 3.0
        scan_msg.header.stamp = rospy.Time.now()
        # print("begin to select")
        if (self.angle_min > 0) or (self.angle_max <= 0):
            range_part = laser_distance1[(self.angle_range >= self.angle_min) & (self.angle_range <= self.angle_max)]
            scan_msg.ranges = np.flipud(range_part)
        else:
            range_part1 = laser_distance1[(self.angle_range >= self.angle_min) & (self.angle_range <= 0)]
            range_part2 = laser_distance1[(self.angle_range <= self.angle_max) & (self.angle_range > 0)]
            p1 = np.flipud(range_part1)
            p2 = np.flipud(range_part2)
            scan_msg.ranges = np.append(p1, p2)
        scan_msg.intensities = [255] * len(laser_distance1)
        pub.publish(scan_msg)


if __name__ == '__main__':
    try:
        rospy.init_node('LeiShen_Lidar')
        rospy.loginfo("Leishen node is initialized!")
        print("Initialize node %s with Node_URI %s under namespace: %s"
              % (rospy.get_name(), rospy.get_node_uri(), rospy.get_namespace()))
        if rospy.get_namespace() != '/':
            rospy.logwarn("This node is contained under namespace %s, be careful" %rospy.get_namespace())
        ls01c = ls01c()
        try:
            rospy.spin()
            # pass
        except:
            pass
        # rospy.logwarn("keyboard interrupt---> rosnode shutdown is requested!")

    except rospy.ROSInterruptException:
        rospy.logerr("Leishen node initialization failed!")



================================================
FILE: src/ls01g/scripts/create_udev_rules.sh
================================================
#!/bin/bash

echo "remap the device serial port(ttyUSBX) to  laser"
echo "ls01g usb cp210x connection as /dev/laser , check it using the command : ls -l /dev|grep ttyUSB"
echo "start copy laser.rules to  /etc/udev/rules.d/"
echo "`rospack find ls01g`/scripts/laser.rules"
sudo cp `rospack find ls01g`/scripts/laser.rules  /etc/udev/rules.d
echo " "
echo "Restarting udev"
echo ""
sudo service udev reload
sudo service udev restart
echo "finish "


================================================
FILE: src/ls01g/scripts/delete_udev_rules.sh
================================================
#!/bin/bash

echo "delete remap the device serial port(ttyUSBX) to laser"
echo "sudo rm   /etc/udev/rules.d/laser.rules"
sudo rm   /etc/udev/rules.d/laser.rules
echo " "
echo "Restarting udev"
echo ""
sudo service udev reload
sudo service udev restart
echo "finish  delete"


================================================
FILE: src/ls01g/scripts/laser.rules
================================================
# set the udev rule , make the device_port be fixed by ls-lidar
#
KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0777", SYMLINK+="laser"



================================================
FILE: src/ls01g/slam_launch/gmapping.launch
================================================
<launch>
  <arg name="scan_topic"  default="scan" />
  <arg name="base_frame"  default="base_footprint"/>
  <arg name="odom_frame"  default="odom"/>
  <!--
<node pkg="tf" type="static_transform_publisher" name="link2_broadcaster" args="0 0 0 0 0 0 odom base_link 100" /> 
  <node pkg="tf" type="static_transform_publisher" name="laser_link_broadcaster" args="0 0 0 0 0 0 base_footprint laser_link 100" /> 
-->
  <node pkg="gmapping" type="slam_gmapping" name="simple_gmapping" output="screen">
      <!--remap from="scan" to="base_scan"/-->
	  <param name="base_frame" value="$(arg base_frame)"/>
      <param name="odom_frame" value="$(arg odom_frame)"/>
      <param name="map_update_interval" value="5.0"/>
      <param name="maxUrange" value="8.0"/>
      <param name="sigma" value="0.05"/>
      <param name="kernelSize" value="1"/>
      <param name="lstep" value="0.05"/>
      <param name="astep" value="0.05"/>
      <param name="iterations" value="5"/>
      <param name="lsigma" value="0.075"/>
      <param name="ogain" value="3.0"/>
      <param name="lskip" value="0"/>
      <param name="minimumScore" value="50"/>
      <param name="srr" value="0.1"/>
      <param name="srt" value="0.2"/>
      <param name="str" value="0.1"/>
      <param name="stt" value="0.2"/>
      <param name="linearUpdate" value="0.3"/>
      <param name="angularUpdate" value="0.4"/>
      <param name="temporalUpdate" value="3.0"/>
      <param name="resampleThreshold" value="0.5"/>
      <param name="particles" value="30"/>
      <param name="xmin" value="-5.0"/>
      <param name="ymin" value="-5.0"/>
      <param name="xmax" value="5.0"/>
      <param name="ymax" value="5.0"/>
      <param name="delta" value="0.05"/>
      <param name="llsamplerange" value="0.01"/>
      <param name="llsamplestep" value="0.01"/>
      <param name="lasamplerange" value="0.005"/>
      <param name="lasamplestep" value="0.005"/>
  </node>



</launch>


================================================
FILE: src/ls01g/slam_launch/hectormapping.launch
================================================
<?xml version="1.0"?>

<launch>


  <node pkg="tf" type="static_transform_publisher" name="laser_link_broadcaster" args="0 0 0 0 0 0 base_footprint laser_link 100" /> 

    <node pkg="hector_mapping" type="hector_mapping" name="hector_height_mapping" output="screen">
    <param name="scan_topic" value="scan" />
    <param name="base_frame" value="base_footprint" />
    <param name="odom_frame" value="base_footprint" />

    <param name="output_timing" value="false"/>
    <param name="advertise_map_service" value="true"/>
    <param name="use_tf_scan_transformation" value="true"/>
    <param name="use_tf_pose_start_estimate" value="false"/>
    <param name="pub_map_odom_transform" value="true"/>
    <param name="map_with_known_poses" value="false"/>

    <param name="map_pub_period" value="0.5"/>
    <param name="update_factor_free" value="0.45"/>

    <param name="map_update_distance_thresh" value="0.02"/>
    <param name="map_update_angle_thresh" value="0.1"/>

    <param name="map_resolution" value="0.05"/>
    <param name="map_size" value="1024"/>
    <param name="map_start_x" value="0.5"/>
    <param name="map_start_y" value="0.5"/>

  </node>



</launch>


================================================
FILE: src/ls01g/slam_launch/karto.launch
================================================

<launch>

<!--
  <node pkg="tf" type="static_transform_publisher" name="link2_broadcaster" args="0 0 0 0 0 0 odom base_link 100" /> 
-->
 <node pkg="tf" type="static_transform_publisher" name="laser_link_broadcaster" args="0 0 0 0 0 0 base_footprint laser_link 100" /> 
  <node pkg="slam_karto" type="slam_karto" name="slam_karto" output="screen">
    <remap from="scan" to="scan"/>
    <param name="odom_frame" value="odom"/>
    <param name="map_update_interval" value="5"/>
    <param name="resolution" value="0.05"/>
    <rosparam command="load" file="$(find ls01g)/slam_launch/karto_mapper_params.yaml" />
  </node>

</launch>


================================================
FILE: src/ls01g/slam_launch/karto_mapper_params.yaml
================================================
# General Parameters
use_scan_matching: true
use_scan_barycenter: true
minimum_travel_distance: 0.3 
minimum_travel_heading: 0.4  # 0.2         #in radians

scan_buffer_size: 67                       
scan_buffer_maximum_scan_distance: 20.0
link_match_minimum_response_fine: 0.15
link_scan_maximum_distance: 6         #  6

do_loop_closing: true
loop_match_minimum_chain_size: 5
loop_match_maximum_variance_coarse: 0.4    # gets squared later
loop_match_minimum_response_coarse: 0.4        # 0.6
loop_match_minimum_response_fine: 0.6

# Correlation Parameters -              Correlation Parameters
correlation_search_space_dimension: 2
correlation_search_space_resolution: 0.05
correlation_search_space_smear_deviation: 0.05

# Correlation Parameters - Loop Closure Parameters
loop_search_space_dimension: 10  # 2.8
loop_search_space_resolution: 0.1
loop_search_space_smear_deviation: 0.05
loop_search_maximum_distance: 4.0

# Scan Matcher Parameters
distance_variance_penalty: 0.3             # gets squared later
angle_variance_penalty: 0.35                # in degrees (gets converted to radians then squared)
fine_search_angle_offset: 0.00349               # in degrees (gets converted to radians)
coarse_search_angle_offset: 0.349            # in degrees (gets converted to radians)
coarse_angle_resolution: 0.0349                # in degrees (gets converted to radians)
minimum_angle_penalty: 0.9
minimum_distance_penalty: 0.5
use_response_expansion: false


================================================
FILE: src/ls01g/slam_launch/viewer_rviz.launch
================================================
<launch>
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find ls01g)/rviz/kobuki_rviz_viewer.rviz" />

</launch>


================================================
FILE: src/ls01g/src/main.cpp
================================================
#include <iostream>
#include <std_msgs/Int32.h>
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "sensor_msgs/LaserScan.h"
#include "uart_driver.h"
using namespace std;

bool is_scan_stop = false;
bool is_motor_stop = false;
bool zero_as_max = true;
bool min_as_zero = true;
bool inverted = true;
string laser_link = "laser_link";
double angle_disable_min = -1;
double angle_disable_max = -1;
io_driver driver;

void publish_scan(ros::Publisher *pub, double *dist, double *intensities, int count, ros::Time start, double scan_time)
{
	static int scan_count = 0;
	sensor_msgs::LaserScan scan_msg;
	scan_msg.header.stamp = start;
	scan_msg.header.frame_id = laser_link;
	scan_count++;
	// scan_msg.angle_min = (angle_disable_min < 0) ? 0 : angle_disable_min;
	// scan_msg.angle_max = (angle_disable_max < 0) ? 2 * M_PI : angle_disable_max;
	scan_msg.angle_min = 0.0;
	scan_msg.angle_max = 2 * M_PI;
	scan_msg.angle_increment = (scan_msg.angle_max - scan_msg.angle_min) / (double) (count - 1);
	scan_msg.scan_time = scan_time;
	scan_msg.time_increment = scan_time / (double) (count - 1);

	scan_msg.range_min = 0.1;
	scan_msg.range_max = 10.0;

	scan_msg.intensities.resize(count);
	scan_msg.ranges.resize(count);

	if (!inverted)
	{
	for (int i = count - 1; i >= 0; i--)
	{
		if((i >= angle_disable_min) && (i < angle_disable_max))		// disable angle part
		{
			if (min_as_zero)
				scan_msg.ranges[i] = 0.0;
			else
				scan_msg.ranges[i] = std::numeric_limits<float>::infinity();
		}
		else if(dist[count - i - 1] == 0.0 && zero_as_max)
			scan_msg.ranges[i] = scan_msg.range_max - 0.2;
		else if(dist[count - i - 1] == 0.0)
			if (min_as_zero)
				scan_msg.ranges[i] = 0.0;
			else
				scan_msg.ranges[i] = std::numeric_limits<float>::infinity();
		else
			scan_msg.ranges[i] = dist[count - i - 1] / 1000.0;
		scan_msg.intensities[i] = floor(intensities[count - i - 1]);
	}}
	else
	{
		for (int i = 0; i <= 179; i++)
			{
				if((i >= angle_disable_min) && (i < angle_disable_max))
				{
					if (min_as_zero)
						scan_msg.ranges[i] = 0.0;
					else
						scan_msg.ranges[i] = std::numeric_limits<float>::infinity();
				}
				else if(dist[179-i] == 0.0 && zero_as_max)
					scan_msg.ranges[i] = scan_msg.range_max - 0.2;
				else if(dist[179-i] == 0.0)
					if (min_as_zero)
						scan_msg.ranges[i] = 0.0;
					else
						scan_msg.ranges[i] = std::numeric_limits<float>::infinity();
				else
					scan_msg.ranges[i] = dist[179-i] / 1000.0;
				scan_msg.intensities[i] = floor(intensities[179-i]);
			}
		for (int i = 180; i < 360; i++)
			{
				if((i >= angle_disable_min) && (i < angle_disable_max))
				{
					if (min_as_zero)
						scan_msg.ranges[i] = 0.0;
					else
						scan_msg.ranges[i] = std::numeric_limits<float>::infinity();
				}
				else if(dist[540-i] == 0.0 && zero_as_max)
					scan_msg.ranges[i] = scan_msg.range_max - 0.2;
				else if(dist[540-i] == 0.0)
					if (min_as_zero)
						scan_msg.ranges[i] = 0.0;
					else
						scan_msg.ranges[i] = std::numeric_limits<float>::infinity();
				else
					scan_msg.ranges[i] = dist[540-i] / 1000.0;
				scan_msg.intensities[i] = floor(intensities[540-i]);
			}
	}
	pub->publish(scan_msg);
}

void startStopCB(const std_msgs::Int32ConstPtr msg)
{
	Command cmd = (Command) msg->data;
	switch (cmd)
	{
	case STOP_DATA:
		if (!is_scan_stop)
		{
			driver.StopScan(STOP_DATA);
			is_scan_stop = true;
			ROS_INFO("stop scan");
		}
		break;
	case STOP_MOTOR:
		if (!is_scan_stop)
		{
			driver.StopScan(STOP_DATA);
			is_scan_stop = true;
			ROS_INFO("stop scan");
		}
		if (!is_motor_stop)
		{
			driver.StopScan(STOP_MOTOR);
			is_motor_stop = true;
			ROS_INFO("stop motor");
		}
		break;
	case START_MOTOR_AND_SCAN:
		if (is_scan_stop)
		{
			ROS_INFO("start scan");
			int res = driver.StartScan();
			ROS_INFO("start: %d", res);
			is_scan_stop = false;
			is_motor_stop = false;
		}
		break;
	default:
		ROS_WARN("Unkonw command: %d ", cmd);
		break;
	}
}

int main(int argv, char **argc)
{
	ros::init(argv, argc, "ls01g");
	ros::NodeHandle n;
	string scan_topic = "scan";
	string port = "/dev/ttyUSB0";
	ros::param::get("~scan_topic", scan_topic);
	ros::param::get("~laser_link", laser_link);
	ros::param::get("~serial_port", port);
	ros::param::get("~angle_disable_min", angle_disable_min);
	ros::param::get("~angle_disable_max", angle_disable_max);
	ros::param::get("~zero_as_max", zero_as_max);
	ros::param::get("~min_as_zero", min_as_zero);
	ros::param::get("~inverted", inverted);
	ros::Publisher scan_pub = n.advertise<sensor_msgs::LaserScan>(scan_topic, 1000);
	ros::Subscriber stop_sub = n.subscribe<std_msgs::Int32>("startOrStop", 10, startStopCB);
	int ret;
	ret = driver.OpenSerial(port.c_str(), B230400);
	if (ret < 0)
	{
		ROS_ERROR("could not open port:%s", port.c_str());
		return 0;
	}
	else
	{
		ROS_INFO("open port:%s", port.c_str());
	}

	if (inverted)
	{
		ROS_INFO("This laser is inverted, zero degree direction is align with line");
	}

	driver.StartScan();

	ROS_INFO("Send start command successfully");

	double angle[PACKLEN + 10];
	double distance[PACKLEN + 10];
	double data[PACKLEN + 10];
	double data_intensity[PACKLEN + 10];
	double speed;
	int count = 0;

	ros::Time starts = ros::Time::now();
	ros::Time ends = ros::Time::now();
	ROS_INFO("talker....");
	while (ros::ok())
	{
		ros::spinOnce();

		if (is_scan_stop)
			continue;

		// ROS_INFO_THROTTLE(2, "talker");
		memset(data, 0, sizeof(data));
		int ret = driver.GetScanData(angle, distance, PACKLEN, &speed);
		for (int i = 0; i < ret; i++)
		{
			data[i] = distance[i];
			data_intensity[i] = angle[i];
		}
		ROS_INFO_THROTTLE(30, "ls01g works fine!");
		ends = ros::Time::now();
		float scan_duration = (ends - starts).toSec() * 1e-3;
		publish_scan(&scan_pub, data, data_intensity, ret, starts, scan_duration);
		starts = ends;
	}
	driver.StopScan(STOP_DATA);
	driver.StopScan(STOP_MOTOR);
	driver.CloseSerial();
	ROS_INFO("Keyboard Interrupt, ls01g stop!");

	return 0;
}



================================================
FILE: src/ls01g/src/uart_driver.cpp
================================================
#include "uart_driver.h"

#define NO_SCAN       0
#define START_SCAN    1
#define STOP_SCAN     2

static pthread_t id;
static int m_dFd;
static pthread_mutex_t g_tMutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t g_tConVar = PTHREAD_COND_INITIALIZER;
static double g_angle[PACKLEN];
static double g_distance[PACKLEN];
static int creatPthread = 1;
static struct basedata *g_pcurr = NULL;
static double g_speed;
static int IS360;
static int g_start_scan = NO_SCAN;
//static struct wifides pack;

#define DEBUG  0

#if DEBUG
#define ALOGI(x...)     printf( x)
#else
#define ALOGI(x...)    
#endif

static int RestartGetData(void)
{
	int wRet;
	char wificmd0[] =
	{ 0xa5, 0x3A, 0xe1, 0xaa, 0xbb, 0xcc, 0xdd };
	char wificmd1[] =
	{ 0xa5, 0x2C, 0xe1, 0xaa, 0xbb, 0xcc, 0xdd };
	char wificmd2[] =
	{ 0xa5, 0x20, 0xe1, 0xaa, 0xbb, 0xcc, 0xdd };

	ALOGI("--------start scan----------\n");

	wRet = write(m_dFd, wificmd0, 7);
		if (wRet < 0)
			return wRet;
	usleep(5000000);
	
	wRet = write(m_dFd, wificmd1, 7);
	if (wRet < 0)
		return wRet;

	usleep(3000);
	wRet = write(m_dFd, wificmd2, 7);
	if (wRet < 0)
		return wRet;

	ALOGI("-------------end------------\n");

	return 0;
}

static int Uart_parameter(unsigned char *data, double *angle, double *dist, int len)
{
	int i, j;
	unsigned char *tmp;
	rplidar_response_measurement_node_t *curr;

	ALOGI("len = %d, data[] = %02x  %d\n", len, data[len-1], IS360);
	if (data[0] == 0xA5 && data[6] == 0x81 && data[len - 1] == 0xdd)
	{
		//pthread_mutex_lock(&g_tMutex);
		//pthread_cond_signal(&g_tConVar);
		tmp = data + 7;
		g_speed = data[1] / 15.0;
		curr = (rplidar_response_measurement_node_t *) tmp;

		for (i = 7, j = 0; i < len - 4 && j < IS360; curr++, i += 5, j++)
		{
			ALOGI("%d  ", curr->sync_quality);ALOGI("%d  ", curr->angle_q6_checkbit);
			if (IS360 == 720)
			{ //720
				if (curr->angle_q6_checkbit != (j + 1) * 5)
				{
					if (curr->angle_q6_checkbit == (j + 2) * 5)
					{
						angle[j] = (j + 1) * 5 / 10.0;
						dist[j] = 0;
						j++;
						angle[j] = curr->angle_q6_checkbit / 10.0;
						dist[j] = curr->distance_q2 / 1.0;
					}
					else
					{
						break;
					}
				}
				else
				{
					angle[j] = curr->angle_q6_checkbit / 10.0;
					ALOGI("%d  \n", curr->distance_q2);
					dist[j] = curr->distance_q2 / 1.0;
				}

			}
			else if (IS360 == 360)
			{
				angle[j] = curr->angle_q6_checkbit / 10.0;
				ALOGI("%d  \n", curr->distance_q2);
				dist[j] = curr->distance_q2 / 1.0;
			}
		}ALOGI("j= %d\n", j);
		if (j >= IS360)
		{
			pthread_mutex_lock(&g_tMutex);
			pthread_cond_signal(&g_tConVar);
			j = 0;
			pthread_mutex_unlock(&g_tMutex);
		}
		return j;
	}
	else
	{
		return 0;
	}

}

static struct basedata *creatlist(void)
{
	struct basedata *head;

	head = (struct basedata *) malloc(sizeof(struct basedata));
	if (NULL == head)
		return NULL;
	head->flag = 0;
	head->start = 0;
	head->end = 0;
	head->curr = 0;
	head->next = NULL;

	return head;
}

static struct basedata *initlist(void)
{
	struct basedata *head, *p;

	head = creatlist();
	if (NULL == head)
		return NULL;
	p = creatlist();
	if (NULL == p)
	{
		free(head);
		return NULL;
	}
	head->next = p;
	p->next = head;

	return head;
}

static int InitPackageSize()
{
	if (1812 == PACKSIZE)
	{
		IS360 = 360;
	}
	else if (3611 == PACKSIZE)
	{
		IS360 = 720;
	}
	else
	{
		return -1;
	}

	return 0;
}

static void analysis(unsigned char *buf, int nRet)
{
	unsigned char tempbuffer[2048];
	int i, j;
	int clen = 0;

	if (nRet > 0)
	{
		if (!g_pcurr->start && !g_pcurr->flag)
		{
			for (i = 0; i < nRet - 6; i++)
			{
				if (buf[i] == 0xa5 && buf[i + 6] == 0x81)
				{
					break;
				}
			}ALOGI("i0 = %d\n", i);
			if (i >= nRet - 6)
			{
				memcpy(g_pcurr->data, buf + nRet - 6, 6);
				g_pcurr->flag = 1;
				g_pcurr->curr = 6;
			}
			else
			{
				memcpy(g_pcurr->data, buf + i, nRet - i);
				g_pcurr->start = 1;
				g_pcurr->flag = 1;
				g_pcurr->curr = nRet - i;
			}
		}
		else if (!g_pcurr->start && g_pcurr->flag)
		{
			memset(tempbuffer, 0, sizeof(tempbuffer));
			memcpy(tempbuffer, g_pcurr->data, g_pcurr->curr);
			memcpy(tempbuffer + g_pcurr->curr, buf, nRet);
			clen = g_pcurr->curr + nRet;
			ALOGI("clen=%d,nRet=%d\n", clen,nRet);
			g_pcurr->start = 0;
			g_pcurr->end = 0;
			g_pcurr->flag = 0;
			g_pcurr->curr = 0;
			memset(g_pcurr->data, 0, PACKSIZE);
			for (i = 0; i < clen - 6; i++)
			{
				if (tempbuffer[i] == 0xa5 && tempbuffer[i + 6] == 0x81)
				{
					break;
				}
			}ALOGI("i1=%d\n", i);
			if (i >= clen - 6)
			{
				memcpy(g_pcurr->data, tempbuffer + clen - 6, 6);
				g_pcurr->flag = 1;
				g_pcurr->curr = 6;
			}
			else
			{
				if (clen - i < PACKSIZE)
				{
					memcpy(g_pcurr->data, tempbuffer + i, clen - i);
					g_pcurr->start = 1;
					g_pcurr->flag = 1;
					g_pcurr->curr = clen - i;
				}
				else if (clen - i == PACKSIZE)
				{
					memcpy(g_pcurr->data, tempbuffer + i, clen - i);
					g_pcurr->start = 1;
					g_pcurr->flag = 1;
					g_pcurr->end = 1;
					g_pcurr->curr += clen - i;
				}
				else
				{
					if (tempbuffer[i + PACKSIZE] == 0xa5)
					{
						memcpy(g_pcurr->data, tempbuffer + i, PACKSIZE);
						g_pcurr->start = 1;
						g_pcurr->flag = 1;
						g_pcurr->end = 1;
						g_pcurr->curr = PACKSIZE;
						g_pcurr = g_pcurr->next;
						g_pcurr->start = 0;
						g_pcurr->flag = 0;
						g_pcurr->end = 0;
						g_pcurr->curr = 0;
						memset(g_pcurr->data, 0, PACKSIZE);
						memcpy(g_pcurr->data, tempbuffer + i + PACKSIZE, clen - i - PACKSIZE);
						g_pcurr->start = 0;
						g_pcurr->flag = 1;
						g_pcurr->end = 0;
						g_pcurr->curr = clen - i - PACKSIZE;
						g_pcurr = g_pcurr->next;
					}
					else
					{
						memcpy(g_pcurr->data, tempbuffer + i + 1, clen - i - 1);
						g_pcurr->start = 0;
						g_pcurr->flag = 1;
						g_pcurr->curr = clen - i - 1;
					}
				}
			}
		}
		else if (g_pcurr->start && !g_pcurr->end)
		{
			for (i = 0; i < nRet - 6; i++)
			{
				if (buf[i] == 0xa5 && buf[i + 6] == 0x81)
				{
					break;
				}
			}

			ALOGI("i2=%d,nRet=%d\n",i,nRet);
			if (i >= nRet - 6)
			{
				if (g_pcurr->curr + i < PACKSIZE)
				{
					if (g_pcurr->curr + nRet < PACKSIZE)
					{
						memcpy(g_pcurr->data + g_pcurr->curr, buf, nRet);
						g_pcurr->curr += nRet;
					}
					else if (g_pcurr->curr + nRet == PACKSIZE)
					{
						memcpy(g_pcurr->data + g_pcurr->curr, buf, nRet);
						g_pcurr->curr += nRet;
						g_pcurr->end = 1;
					}
					else
					{
						clen = PACKSIZE - g_pcurr->curr;
						if (buf[clen] == 0xa5)
						{
							memcpy(g_pcurr->data + g_pcurr->curr, buf, clen);
							g_pcurr->end = 1;
							g_pcurr->curr += clen;
							g_pcurr = g_pcurr->next;
							g_pcurr->start = 0;
							g_pcurr->end = 0;
							g_pcurr->flag = 0;
							memset(g_pcurr->data, 0, PACKSIZE);
							memcpy(g_pcurr->data, buf + clen, nRet - clen);
							g_pcurr->start = 0;
							g_pcurr->curr = nRet - clen;
							g_pcurr->end = 0;
							g_pcurr->flag = 1;
							g_pcurr = g_pcurr->next;
						}
						else
						{
							g_pcurr->start = 0;
							g_pcurr->end = 0;
							g_pcurr->flag = 0;
							memset(g_pcurr->data, 0, PACKSIZE);
							memcpy(g_pcurr->data, buf + nRet - 3, 3);
							g_pcurr->start = 0;
							g_pcurr->flag = 1;
							g_pcurr->curr = 3;
						}
					}
				} //
				else if (g_pcurr->curr + i == PACKSIZE)
				{
					if (buf[i] == 0xa5)
					{
						memcpy(g_pcurr->data + g_pcurr->curr, buf, i);
						g_pcurr->curr += i;
						g_pcurr->end = 1;
						g_pcurr = g_pcurr->next;
						g_pcurr->start = 0;
						g_pcurr->end = 0;
						g_pcurr->flag = 0;
						memset(g_pcurr->data, 0, PACKSIZE);
						memcpy(g_pcurr->data, buf + i, nRet - i);
						g_pcurr->start = 0; /* no start*/
						g_pcurr->flag = 1;
						g_pcurr->curr = nRet - i;
						g_pcurr = g_pcurr->next;
					}
					else
					{

						g_pcurr->start = 0;
						g_pcurr->end = 0;
						g_pcurr->flag = 0;
						memset(g_pcurr->data, 0, PACKSIZE);
						memcpy(g_pcurr->data, buf + nRet - 6, 6);
						g_pcurr->start = 0;
						g_pcurr->flag = 1;
						g_pcurr->curr = 6;
					}
				}
				else
				{             //(g_pcurr->curr+i > PACKSIZE)
					g_pcurr->start = 0;
					g_pcurr->end = 0;
					g_pcurr->flag = 0;
					memset(g_pcurr->data, 0, PACKSIZE);
					memcpy(g_pcurr->data, buf + nRet - 6, 6);
					g_pcurr->start = 0;
					g_pcurr->flag = 1;
					g_pcurr->curr = 6;

				}
			}
			else
			{
				if (g_pcurr->curr + i != PACKSIZE)
				{
					g_pcurr->start = 0;
					g_pcurr->end = 0;
					g_pcurr->flag = 0;
					memset(g_pcurr->data, 0, PACKSIZE);
					memcpy(g_pcurr->data, buf + i, nRet - i);
					g_pcurr->start = 1;
					g_pcurr->flag = 1;
					g_pcurr->curr = nRet - i;
				}
				else
				{
					memcpy(g_pcurr->data + g_pcurr->curr, buf, i);
					g_pcurr->start = 1;
					g_pcurr->flag = 1;
					g_pcurr->end = 1;
					g_pcurr->curr += i;
					g_pcurr = g_pcurr->next;
					memcpy(g_pcurr->data, buf + i, nRet - i);
					g_pcurr->start = 1;
					g_pcurr->flag = 1;
					g_pcurr->end = 0;
					g_pcurr->curr = nRet - i;
					g_pcurr = g_pcurr->next;
				}
			}
		}
		if (g_pcurr->start && g_pcurr->end)
		{
			//pthread_mutex_lock(&g_tMutex);
			//pthread_cond_signal(&g_tConVar);
			Uart_parameter(g_pcurr->data, g_angle, g_distance, g_pcurr->curr);
			g_pcurr->start = 0;
			g_pcurr->end = 0;
			g_pcurr->flag = 0;
			memset(g_pcurr->data, 0, PACKSIZE);
			g_pcurr = g_pcurr->next;
			//pthread_mutex_unlock(&g_tMutex);

		}
	}
}

void *Uart_creatPthread(void *data)
{

	unsigned char buf[1024];
	fd_set read_fds;
	struct timeval tm;
	int nRet;

	while (creatPthread)
	{
		FD_ZERO(&read_fds);
		FD_SET(m_dFd, &read_fds);
		tm.tv_sec = 1;
		tm.tv_usec = 0;
		nRet = select(m_dFd + 1, &read_fds, NULL, NULL, &tm);
		if (nRet < 0)
		{
			printf("select error!\n");
		}
		else if (nRet == 0)
		{
			ALOGI("select timeout!\n");
			if (START_SCAN == g_start_scan)
			{
				printf("timeout----\n");
				RestartGetData();
			}
		}
		else
		{
			if (FD_ISSET(m_dFd, &read_fds))
			{
				bzero(buf, 1024);
				nRet = read(m_dFd, buf, 1024);
				if (nRet > 0)
				{

					//ALOGI("nRet = %d\n", nRet);
					//printf("nRet = %d\n", nRet);
					analysis(buf, nRet);
					usleep(30000);

				}
			}
		}
		// usleep(30000);
	}
	return NULL;
}

int io_driver::OpenSerial(const char* port, unsigned int baudrate)
{
	int ret;
	struct termios m_stNew;
	struct termios m_stOld;

	const char* addr = port;
	const char* addr2 = port;

	m_dFd = open(addr, O_RDWR | O_NOCTTY | O_NDELAY);
	if (-1 == m_dFd)
	{
		//perror("Open Serial Port Error!\n");
		m_dFd = open(addr2, O_RDWR | O_NOCTTY | O_NDELAY);
		if (m_dFd < 0)
			return -1;
	}ALOGI("start init serial\n");
	if ((fcntl(m_dFd, F_SETFL, 0)) < 0)
	{
		perror("Fcntl F_SETFL Error!\n");
		return -1;
	}
	if (tcgetattr(m_dFd, &m_stOld) != 0)
	{
		perror("tcgetattr error!\n");
		return -1;
	}

	m_stNew = m_stOld;
	cfmakeraw(&m_stNew);		    //将终端设置为原始模式,该模式下所有的输入数据以字节为单位被处理

	//set speed
	cfsetispeed(&m_stNew, baudrate);		    //115200
	cfsetospeed(&m_stNew, baudrate);

	//set databits
	m_stNew.c_cflag |= (CLOCAL | CREAD);
	m_stNew.c_cflag &= ~CSIZE;
	m_stNew.c_cflag |= CS8;

	//set parity
	m_stNew.c_cflag &= ~PARENB;
	m_stNew.c_iflag &= ~INPCK;

	//set stopbits
	m_stNew.c_cflag &= ~CSTOPB;
	m_stNew.c_cc[VTIME] = 0;	//指定所要读取字符的最小数量
	m_stNew.c_cc[VMIN] = 1;	//指定读取第一个字符的等待时间,时间的单位为n*100ms
	//如果设置VTIME=0,则无字符输入时read()操作无限期的阻塞
	tcflush(m_dFd, TCIFLUSH);	//清空终端未完成的输入/输出请求及数据。
	if (tcsetattr(m_dFd, TCSANOW, &m_stNew) != 0)
	{
		perror("tcsetattr Error!\n");
		return -1;
	}
	g_pcurr = initlist();
	if (NULL == g_pcurr)
		return -1;
	if (InitPackageSize())
		return -1;ALOGI("finish init seria!\n");
	return m_dFd;
}

int io_driver::StartScan(void)
{

	static int scanflags = 0;
	int wRet;
	char wificmd0[] =
	{ 0xa5, 0x3A, 0xe1, 0xaa, 0xbb, 0xcc, 0xdd };
	char wificmd1[] =
	{ 0xa5, 0x2C, 0xe1, 0xaa, 0xbb, 0xcc, 0xdd };
	char wificmd2[] =
	{ 0xa5, 0x20, 0xe1, 0xaa, 0xbb, 0xcc, 0xdd };
	char wificmd3[] =
	{ 0xa5, 0x50, 0xe1, 0xaa, 0xbb, 0xcc, 0xdd };

	g_start_scan = START_SCAN;
	ALOGI("--------start scan----------\n");
//	if (scanflags == 0)
//	{
	wRet = write(m_dFd, wificmd0, 7);
		if (wRet < 0)
			return wRet;
	usleep(5000000);
	wRet = write(m_dFd, wificmd1, 7);
	if (wRet < 0)
		return wRet;
//	}
	usleep(30000);
	wRet = write(m_dFd, wificmd2, 7);
	if (wRet < 0)
		return wRet;

	usleep(30000);
	wRet = write(m_dFd, wificmd3, 7);
	if (wRet < 0)
		return wRet;
	ALOGI("-------------end------------\n");
	creatPthread = 1;
	if (scanflags == 0)
	{
		scanflags = 1;
		pthread_create(&id, NULL, Uart_creatPthread, NULL);
	}
	return wRet;

}

int io_driver::GetScanData(double *angle, double *distance, int len, double *speed)
{
	int min = 0;
	int i;
	unsigned char buffer[PACKSIZE];
	pthread_mutex_lock(&g_tMutex);
	pthread_cond_wait(&g_tConVar, &g_tMutex);
	min = len > PACKLEN ? PACKLEN : len;
	for (i = 0; i < min; i++)
	{
		angle[i] = g_angle[i];
		distance[i] = g_distance[i];
	}
	*speed = g_speed;
	pthread_mutex_unlock(&g_tMutex);

	return min;
}

int io_driver::Reset(void)
{
	char buf[] =
	{ 0xa5, 0x40, 0xe1, 0xaa, 0xbb, 0xcc, 0xdd };

	return write(m_dFd, buf, 7);
}

int io_driver::StopScan(Command cmd)
{
	//unsigned char buf[] = {LSLIDAR_CMD_BYTE, LSLIDAR_CMD_STOPSCAN, LSLIDAR_CMD_STOPSCAN_END};
	char stop_scan[] =
	{ 0xa5, 0x21, 0xe1, 0xaa, 0xbb, 0xcc, 0xdd };
	char stop_motor[] =
	{ 0xa5, 0x25, 0xe1, 0xaa, 0xbb, 0xcc, 0xdd };

	g_start_scan = STOP_SCAN;

	if (STOP_DATA == cmd)
	{
		usleep(50000);
		write(m_dFd, stop_scan, 7);
	}
	if (STOP_MOTOR == cmd)
	{
		usleep(50000);
		write(m_dFd, stop_motor, 7);
	}

	return 0;
}

void io_driver::CloseSerial(void)
{
	struct basedata *tmp;
	creatPthread = 0;
	g_start_scan = NO_SCAN;
	//sleep(2);
	pthread_join(id, NULL);

	tmp = g_pcurr;
	free(tmp);
	g_pcurr = g_pcurr->next;
	while (g_pcurr != tmp)
	{
		free(g_pcurr);
		g_pcurr = g_pcurr->next;
	}
	g_pcurr = tmp = NULL;
	close(m_dFd);
}



================================================
FILE: src/ls01g/src/uart_driver.h
================================================


#ifndef  __UART_DRIVER_H
#define  __UART_DRIVER_H

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string>
#include <string.h>
#include <termios.h>
#include <fcntl.h>
#include <sstream>


#include <semaphore.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <errno.h>
#include <malloc.h>
#include <termios.h>
#include "math.h"
#include <stdbool.h>
#include <sys/time.h>


#define PACKSIZE 1812
#define PACKLEN (PACKSIZE/5-2)

#define LSLIDAR_CMD_BYTE               0xa5
#define LSLIDAR_CMD_START              0x2c
#define LSLIDAR_CMD_STOP               0x25
#define LSLIDAR_CMD_SCAN               0x20
#define LSLIDAR_CMD_END                0xd1

#define LSLIDAR_CMD_RESET              0x40
#define LSLIDAR_CMD_RESET_END          0xe5
#define LSLIDAR_CMD_STOPSCAN           0x21
#define LSLIDAR_CMD_STOPSCAN_END       0xc6

enum Command
{
	STOP_DATA = 1, STOP_MOTOR = 2, START_MOTOR_AND_SCAN = 4
};

struct ture_data{
	int ture;
	int curr;
	unsigned char data[1024];
};


struct wifides {
    int start;
    int end;
    int flag;
    int packsize;
    int packcurr;
    unsigned char buf[1024];
};

struct basedata {
   
     int flag;
     int start;
     int end;
     int curr;
     unsigned char data[PACKSIZE];
     struct basedata *next;
};

#pragma pack(1)
typedef struct _rplidar_response_measurement_node_t {
    unsigned char    sync_quality;      
    unsigned short   angle_q6_checkbit; //角度
    unsigned short   distance_q2;       //距离
}rplidar_response_measurement_node_t;

struct scanDot {
    unsigned char   quality;
    float angle;
    float dist;
};


class  io_driver
{

public:

    int OpenSerial(const char*, unsigned int baudrate);//it means fail if return -1
    int StartScan();
    int GetScanData( double *angle, double *distance, int len, double *speed);
    int Reset(void);
    int StopScan(Command cmd);
    void CloseSerial();
};

#endif


================================================
FILE: src/navigation_tutorials/README.md
================================================
# navigation_tutorials

Tutorials about using the ROS Navigation stack.
See:

- http://wiki.ros.org/navigation_tutorials
- http://wiki.ros.org/navigation/Tutorials


================================================
FILE: src/navigation_tutorials/laser_scan_publisher_tutorial/CMakeLists.txt
================================================
cmake_minimum_required(VERSION 2.8.3)
project(laser_scan_publisher_tutorial)

# Find catkin dependencies
find_package(catkin REQUIRED COMPONENTS roscpp sensor_msgs)

# Call catkin_package
catkin_package()

# Add catkin_INCLUDE_DIRS to the include path
include_directories(${catkin_INCLUDE_DIRS})

# Build the laser_scan_publisher executable
add_executable(laser_scan_publisher src/laser_scan_publisher.cpp)
# Add a build order dependency on sensor_msgs
# This ensures that sensor_msgs' msg headers are built before your executable
if(sensor_msgs_EXPORTED_TARGETS)
  add_dependencies(laser_scan_publisher ${sensor_msgs_EXPORTED_TARGETS})
endif()
# Link against the catkin_LIBRARIES
target_link_libraries(laser_scan_publisher ${catkin_LIBRARIES})

# Mark executables and/or libraries for installation
install(TARGETS laser_scan_publisher
  ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})


================================================
FILE: src/navigation_tutorials/laser_scan_publisher_tutorial/package.xml
================================================
<?xml version="1.0"?>
<package>
  <name>laser_scan_publisher_tutorial</name>
  <version>0.2.3</version>
  <description>The laser_scan_publisher_tutorial package</description>

  <maintainer email="william@osrfoundation.org">William Woodall</maintainer>

  <license>BSD</license>

  <url type="website">http://ros.org/wiki/laser_scan_publisher_tutorial</url>
  <url type="repository">https://github.com/ros-planning/navigation_tutorials</url>
  <url type="bugtracker">https://github.com/ros-planning/navigation_tutorials/issues</url>

  <author>Eitan Marder-Eppstein</author>

  <buildtool_depend>catkin</buildtool_depend>

  <build_depend>roscpp</build_depend>
  <build_depend>sensor_msgs</build_depend>

  <run_depend>roscpp</run_depend>
  <run_depend>sensor_msgs</run_depend>

</package>

================================================
FILE: src/navigation_tutorials/laser_scan_publisher_tutorial/src/laser_scan_publisher.cpp
================================================
/*********************************************************************
*
* Software License Agreement (BSD License)
*
*  Copyright (c) 2009, Willow Garage, Inc.
*  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 Willow Garage, 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.
*
* Author: Eitan Marder-Eppstein
*********************************************************************/
#include <ros/ros.h>
#include <sensor_msgs/LaserScan.h>

int main(int argc, char** argv){
  ros::init(argc, argv, "laser_scan_publisher");

  ros::NodeHandle n;
  ros::Publisher scan_pub = n.advertise<sensor_msgs::LaserScan>("scan", 50);

  unsigned int num_readings = 100;
  double laser_frequency = 40;
  double ranges[num_readings];
  double intensities[num_readings];

  int count = 0;
  ros::Rate r(1.0);
  while(n.ok()){
    //generate some fake data for our laser scan
    for(unsigned int i = 0; i < num_readings; ++i){
      ranges[i] = count;
      intensities[i] = 100 + count;
    }
    ros::Time scan_time = ros::Time::now();

    //populate the LaserScan message
    sensor_msgs::LaserScan scan;
    scan.header.stamp = scan_time;
    scan.header.frame_id = "laser_frame";
    scan.angle_min = -1.57;
    scan.angle_max = 1.57;
    scan.angle_increment = 3.14 / num_readings;
    scan.time_increment = (1 / laser_frequency) / (num_readings);
    scan.range_min = 0.0;
    scan.range_max = 100.0;

    scan.ranges.resize(num_readings);
    scan.intensities.resize(num_readings);
    for(unsigned int i = 0; i < num_readings; ++i){
      scan.ranges[i] = ranges[i];
      scan.intensities[i] = intensities[i];
    }

    scan_pub.publish(scan);
    ++count;
    r.sleep();
  }
}


================================================
FILE: src/navigation_tutorials/navigation_stage/CMakeLists.txt
================================================
cmake_minimum_required(VERSION 2.8.3)
project(navigation_stage)

# Find catkin
find_package(catkin REQUIRED)

catkin_package()

# Install launch files
install(DIRECTORY launch
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION})

# Install move_base_config files
install(DIRECTORY move_base_config
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION})

# Install stage_config files
install(DIRECTORY stage_config
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION})

# Install the rviz files
install(FILES multi_robot.rviz single_robot.rviz
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION})


================================================
FILE: src/navigation_tutorials/navigation_stage/launch/move_base_amcl_10cm.launch
================================================
<launch>
  <master auto="start"/>
  <param name="/use_sim_time" value="true"/>
  <include file="$(find navigation_stage)/move_base_config/move_base.xml"/>
  <node name="map_server" pkg="map_server" type="map_server" args="$(find navigation_stage)/stage_config/maps/willow-full.pgm 0.1" respawn="false" />
  <node pkg="stage_ros" type="stageros" name="stageros" args="$(find navigation_stage)/stage_config/worlds/willow-pr2.world" respawn="false">
    <param name="base_watchdog_timeout" value="0.2"/>
  </node>
  <include file="$(find navigation_stage)/move_base_config/amcl_node.xml"/>
  <node name="rviz" pkg="rviz" type="rviz" args="-d $(find navigation_stage)/single_robot.rviz" />
</launch>


================================================
FILE: src/navigation_tutorials/navigation_stage/launch/move_base_amcl_2.5cm.launch
================================================
<launch>
  <master auto="start"/>
  <param name="/use_sim_time" value="true"/>
  <include file="$(find navigation_stage)/move_base_config/move_base.xml"/>
  <node name="map_server" pkg="map_server" type="map_server" args="$(find navigation_stage)/stage_config/maps/willow-full-0.025.pgm 0.025" />
  <node pkg="stage_ros" type="stageros" name="stageros" args="$(find navigation_stage)/stage_config/worlds/willow-pr2-2.5cm.world" respawn="false" >
    <param name="base_watchdog_timeout" value="0.2"/>
  </node>
  <include file="$(find navigation_stage)/move_base_config/amcl_node.xml"/>  
  <node name="rviz" pkg="rviz" type="rviz" args="-d $(find navigation_stage)/single_robot.rviz" />
</launch>


================================================
FILE: src/navigation_tutorials/navigation_stage/launch/move_base_amcl_5cm.launch
================================================
<launch>
  <master auto="start"/>
  <param name="/use_sim_time" value="true"/>
  <include file="$(find navigation_stage)/move_base_config/move_base.xml"/>
  <node name="map_server" pkg="map_server" type="map_server" args="$(find navigation_stage)/stage_config/maps/willow-full-0.05.pgm 0.05" respawn="false" />
  <node pkg="stage_ros" type="stageros" name="stageros" args="$(find navigation_stage)/stage_config/worlds/willow-pr2-5cm.world" respawn="false" >
    <param name="base_watchdog_timeout" value="0.2"/>
  </node>
  <include file="$(find navigation_stage)/move_base_config/amcl_node.xml"/>  
  <node name="rviz" pkg="rviz" type="rviz" args="-d $(find navigation_stage)/single_robot.rviz" />
</launch>


================================================
FILE: src/navigation_tutorials/navigation_stage/launch/move_base_fake_localization_10cm.launch
================================================
<launch>
  <master auto="start"/>
  <param name="/use_sim_time" value="true"/>
  <include file="$(find navigation_stage)/move_base_config/move_base.xml"/>
  <node name="map_server" pkg="map_server" type="map_server" args="$(find navigation_stage)/stage_config/maps/willow-full.pgm 0.1" respawn="false" />
  <node pkg="stage_ros" type="stageros" name="stageros" args="$(find navigation_stage)/stage_config/worlds/willow-pr2.world" respawn="false" >
    <param name="base_watchdog_timeout" value="0.2"/>
  </node>
  <node name="fake_localization" pkg="fake_localization" type="fake_localization" respawn="false" />
  <node name="rviz" pkg="rviz" type="rviz" args="-d $(find navigation_stage)/single_robot.rviz" />
</launch>


================================================
FILE: src/navigation_tutorials/navigation_stage/launch/move_base_fake_localization_2.5cm.launch
================================================
<launch>
  <master auto="start"/>
  <param name="/use_sim_time" value="true"/>
  <include file="$(find navigation_stage)/move_base_config/move_base.xml"/>
  <node name="map_server" pkg="map_server" type="map_server" args="$(find navigation_stage)/stage_config/maps/willow-full-0.025.pgm 0.025" />
  <node pkg="stage_ros" type="stageros" name="stageros" args="$(optenv ROS_STAGE_GRAPHICS -g) $(find navigation_stage)/stage_config/worlds/willow-pr2-2.5cm.world" respawn="false" >
    <param name="base_watchdog_timeout" value="0.2"/>
  </node>
  <node name="fake_localization" pkg="fake_localization" type="fake_localization" respawn="false" />
  <node name="rviz" pkg="rviz" type="rviz" args="-d $(find navigation_stage)/single_robot.rviz" />
</launch>


================================================
FILE: src/navigation_tutorials/navigation_stage/launch/move_base_fake_localization_5cm.launch
================================================
<launch>
  <master auto="start"/>
  <param name="/use_sim_time" value="true"/>
  <include file="$(find navigation_stage)/move_base_config/move_base.xml"/>
  <node name="map_server" pkg="map_server" type="map_server" args="$(find navigation_stage)/stage_config/maps/willow-full-0.05.pgm 0.05" respawn="false" />
  <node pkg="stage_ros" type="stageros" name="stageros" args="$(find navigation_stage)/stage_config/worlds/willow-pr2-5cm.world" respawn="false" >
    <param name="base_watchdog_timeout" value="0.2"/>
  </node>
  <node name="fake_localization" pkg="fake_localization" type="fake_localization" respawn="false" />
  <node name="rviz" pkg="rviz" type="rviz" args="-d $(find navigation_stage)/single_robot.rviz" />
</launch>


================================================
FILE: src/navigation_tutorials/navigation_stage/launch/move_base_gmapping_5cm.launch
================================================
<launch>
  <master auto="start"/>
  <param name="/use_sim_time" value="true"/>
  <include file="$(find navigation_stage)/move_base_config/move_base.xml"/>
  <node pkg="stage_ros" type="stageros" name="stageros" args="$(find navigation_stage)/stage_config/worlds/willow-pr2-5cm.world" respawn="false" >
    <param name="base_watchdog_timeout" value="0.2"/>
  </node>
  <include file="$(find navigation_stage)/move_base_config/slam_gmapping.xml"/>  
  <node name="rviz" pkg="rviz" type="rviz" args="-d $(find navigation_stage)/single_robot.rviz" />
</launch>


================================================
FILE: src/navigation_tutorials/navigation_stage/launch/move_base_m
Download .txt
gitextract_j53mpcyy/

├── .catkin_workspace
├── README.md
├── install.sh
└── src/
    ├── art_driver/
    │   ├── CMakeLists.txt
    │   ├── README
    │   ├── include/
    │   │   └── art_racecar_driver.h
    │   ├── lib/
    │   │   └── libart_driver.a
    │   ├── package.xml
    │   └── src/
    │       └── art_racecar.cpp
    ├── art_imu/
    │   ├── CMakeLists.txt
    │   ├── launch/
    │   │   ├── imu.launch
    │   │   ├── imu_test.launch
    │   │   └── rviz.launch
    │   ├── package.xml
    │   ├── rviz/
    │   │   └── imu.rviz
    │   └── src/
    │       └── art_imu.cc
    ├── art_racecar/
    │   ├── CMakeLists.txt
    │   ├── README.md
    │   ├── art_rviz.sh
    │   ├── cfg/
    │   │   └── imu.cfg
    │   ├── launch/
    │   │   ├── Run_car.launch
    │   │   ├── Run_gmapping.launch
    │   │   ├── amcl_nav.launch
    │   │   ├── car.launch
    │   │   ├── includes/
    │   │   │   ├── amcl.launch.xml
    │   │   │   ├── art_car_tf.launch.xml
    │   │   │   ├── default_mapping.launch.xml
    │   │   │   ├── ls01g.launch.xml
    │   │   │   ├── rf2o.launch.xml
    │   │   │   └── rplidar.launch.xml
    │   │   ├── ls01g_lidar.launch
    │   │   ├── rviz.launch
    │   │   └── teleop_joy.launch
    │   ├── map/
    │   │   ├── mymap.yaml
    │   │   └── test.yaml
    │   ├── package.xml
    │   ├── param/
    │   │   ├── base_global_planner_params.yaml
    │   │   ├── dwa_local_planner_params.yaml
    │   │   ├── ekf_params.yaml
    │   │   ├── global_costmap_params.yaml
    │   │   ├── local_costmap_params.yaml
    │   │   └── move_base_params.yaml
    │   ├── rviz/
    │   │   ├── amcl.rviz
    │   │   ├── gmapping.rviz
    │   │   └── test_laser.rviz
    │   ├── save_map.sh
    │   ├── src/
    │   │   ├── ESC_calibration.py
    │   │   ├── PID.h
    │   │   ├── art_car_controller.cpp
    │   │   ├── art_car_controller.hpp
    │   │   ├── lib/
    │   │   │   └── libart_controller.a
    │   │   ├── racecar_joy.py
    │   │   └── racecar_teleop.py
    │   ├── ssh.sh
    │   └── udev/
    │       ├── README
    │       ├── art_init.sh
    │       ├── car.rules
    │       ├── imu.rules
    │       └── laser.rules
    ├── ls01g/
    │   ├── CMakeLists.txt
    │   ├── Y.txt
    │   ├── launch/
    │   │   ├── ls01g.launch
    │   │   ├── rviz.launch
    │   │   ├── rviz.rviz
    │   │   ├── talker2.launch
    │   │   ├── talker_shell.launch
    │   │   ├── test.launch
    │   │   └── test_ls01g.launch
    │   ├── package.xml
    │   ├── rviz/
    │   │   ├── kobuki_rviz_viewer.rviz
    │   │   └── slam.rviz
    │   ├── scripts/
    │   │   ├── LS01A.py
    │   │   ├── create_udev_rules.sh
    │   │   ├── delete_udev_rules.sh
    │   │   └── laser.rules
    │   ├── slam_launch/
    │   │   ├── gmapping.launch
    │   │   ├── hectormapping.launch
    │   │   ├── karto.launch
    │   │   ├── karto_mapper_params.yaml
    │   │   └── viewer_rviz.launch
    │   └── src/
    │       ├── main.cpp
    │       ├── uart_driver.cpp
    │       └── uart_driver.h
    ├── navigation_tutorials/
    │   ├── README.md
    │   ├── laser_scan_publisher_tutorial/
    │   │   ├── CMakeLists.txt
    │   │   ├── package.xml
    │   │   └── src/
    │   │       └── laser_scan_publisher.cpp
    │   ├── navigation_stage/
    │   │   ├── CMakeLists.txt
    │   │   ├── launch/
    │   │   │   ├── move_base_amcl_10cm.launch
    │   │   │   ├── move_base_amcl_2.5cm.launch
    │   │   │   ├── move_base_amcl_5cm.launch
    │   │   │   ├── move_base_fake_localization_10cm.launch
    │   │   │   ├── move_base_fake_localization_2.5cm.launch
    │   │   │   ├── move_base_fake_localization_5cm.launch
    │   │   │   ├── move_base_gmapping_5cm.launch
    │   │   │   └── move_base_multi_robot.launch
    │   │   ├── move_base_config/
    │   │   │   ├── amcl_node.xml
    │   │   │   ├── base_local_planner_params.yaml
    │   │   │   ├── costmap_common_params.yaml
    │   │   │   ├── dwa_local_planner_params.yaml
    │   │   │   ├── global_costmap_params.yaml
    │   │   │   ├── local_costmap_params.yaml
    │   │   │   ├── move_base.xml
    │   │   │   └── slam_gmapping.xml
    │   │   ├── multi_robot.rviz
    │   │   ├── package.xml
    │   │   ├── single_robot.rviz
    │   │   └── stage_config/
    │   │       ├── maps/
    │   │       │   ├── willow-full-0.025.pgm
    │   │       │   ├── willow-full-0.05.pgm
    │   │       │   └── willow-full.pgm
    │   │       └── worlds/
    │   │           ├── willow-pr2-2.5cm.world
    │   │           ├── willow-pr2-5cm.world
    │   │           ├── willow-pr2-multi.world
    │   │           └── willow-pr2.world
    │   ├── navigation_tutorials/
    │   │   ├── CMakeLists.txt
    │   │   └── package.xml
    │   ├── odometry_publisher_tutorial/
    │   │   ├── CMakeLists.txt
    │   │   ├── package.xml
    │   │   └── src/
    │   │       └── odometry_publisher.cpp
    │   ├── point_cloud_publisher_tutorial/
    │   │   ├── CMakeLists.txt
    │   │   ├── package.xml
    │   │   └── src/
    │   │       └── point_cloud_publisher.cpp
    │   ├── robot_setup_tf_tutorial/
    │   │   ├── CMakeLists.txt
    │   │   ├── manifest.xml
    │   │   ├── package.xml
    │   │   └── src/
    │   │       ├── tf_broadcaster.cpp
    │   │       └── tf_listener.cpp
    │   ├── roomba_stage/
    │   │   ├── CMakeLists.txt
    │   │   ├── manifest.xml
    │   │   ├── maps/
    │   │   │   ├── lse_arena.pgm
    │   │   │   └── lse_arena.yaml
    │   │   ├── move_base_lse_arena.launch
    │   │   ├── package.xml
    │   │   ├── params/
    │   │   │   ├── amcl_roomba.launch
    │   │   │   ├── base_local_planner_params.yaml
    │   │   │   ├── costmap_common_params.yaml
    │   │   │   ├── global_costmap_params.yaml
    │   │   │   ├── local_costmap_params.yaml
    │   │   │   └── local_costmap_params_2.yaml
    │   │   ├── roomba_lse_arena.world
    │   │   └── roomba_stage.rviz
    │   └── simple_navigation_goals_tutorial/
    │       ├── CMakeLists.txt
    │       ├── package.xml
    │       └── src/
    │           └── simple_navigation_goals.cpp
    ├── rf2o_laser_odometry/
    │   ├── CMakeLists.txt
    │   ├── LICENSE
    │   ├── README.md
    │   ├── cmake-build-debug/
    │   │   ├── CATKIN_IGNORE
    │   │   ├── CMakeCache.txt
    │   │   ├── CMakeFiles/
    │   │   │   ├── 3.9.6/
    │   │   │   │   ├── CMakeCCompiler.cmake
    │   │   │   │   ├── CMakeCXXCompiler.cmake
    │   │   │   │   ├── CMakeSystem.cmake
    │   │   │   │   ├── CompilerIdC/
    │   │   │   │   │   ├── CMakeCCompilerId.c
    │   │   │   │   │   └── a.out
    │   │   │   │   └── CompilerIdCXX/
    │   │   │   │       ├── CMakeCXXCompilerId.cpp
    │   │   │   │       └── a.out
    │   │   │   ├── CMakeDirectoryInformation.cmake
    │   │   │   ├── CMakeError.log
    │   │   │   ├── CMakeOutput.log
    │   │   │   ├── CMakeRuleHashes.txt
    │   │   │   ├── Makefile.cmake
    │   │   │   ├── Makefile2
    │   │   │   ├── Progress/
    │   │   │   │   ├── 2
    │   │   │   │   └── count.txt
    │   │   │   ├── TargetDirectories.txt
    │   │   │   ├── actionlib_generate_messages_cpp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── actionlib_generate_messages_eus.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── actionlib_generate_messages_lisp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── actionlib_generate_messages_nodejs.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── actionlib_generate_messages_py.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── actionlib_msgs_generate_messages_cpp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── actionlib_msgs_generate_messages_eus.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── actionlib_msgs_generate_messages_lisp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── actionlib_msgs_generate_messages_nodejs.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── actionlib_msgs_generate_messages_py.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── clean_test_results.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── clion-environment.txt
    │   │   │   ├── clion-log.txt
    │   │   │   ├── cmake.check_cache
    │   │   │   ├── download_extra_data.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── doxygen.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── feature_tests.c
    │   │   │   ├── feature_tests.cxx
    │   │   │   ├── geometry_msgs_generate_messages_cpp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── geometry_msgs_generate_messages_eus.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── geometry_msgs_generate_messages_lisp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── geometry_msgs_generate_messages_nodejs.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── geometry_msgs_generate_messages_py.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── nav_msgs_generate_messages_cpp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── nav_msgs_generate_messages_eus.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── nav_msgs_generate_messages_lisp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── nav_msgs_generate_messages_nodejs.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── nav_msgs_generate_messages_py.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── progress.marks
    │   │   │   ├── rf2o_laser_odometry_node.dir/
    │   │   │   │   ├── CXX.includecache
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   ├── depend.internal
    │   │   │   │   ├── depend.make
    │   │   │   │   ├── flags.make
    │   │   │   │   ├── link.txt
    │   │   │   │   ├── progress.make
    │   │   │   │   └── src/
    │   │   │   │       └── CLaserOdometry2D.cpp.o
    │   │   │   ├── roscpp_generate_messages_cpp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── roscpp_generate_messages_eus.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── roscpp_generate_messages_lisp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── roscpp_generate_messages_nodejs.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── roscpp_generate_messages_py.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── rosgraph_msgs_generate_messages_cpp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── rosgraph_msgs_generate_messages_eus.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── rosgraph_msgs_generate_messages_lisp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── rosgraph_msgs_generate_messages_nodejs.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── rosgraph_msgs_generate_messages_py.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── run_tests.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── sensor_msgs_generate_messages_cpp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── sensor_msgs_generate_messages_eus.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── sensor_msgs_generate_messages_lisp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── sensor_msgs_generate_messages_nodejs.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── sensor_msgs_generate_messages_py.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── std_msgs_generate_messages_cpp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── std_msgs_generate_messages_eus.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── std_msgs_generate_messages_lisp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── std_msgs_generate_messages_nodejs.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── std_msgs_generate_messages_py.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── tests.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── tf2_msgs_generate_messages_cpp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── tf2_msgs_generate_messages_eus.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── tf2_msgs_generate_messages_lisp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── tf2_msgs_generate_messages_nodejs.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── tf2_msgs_generate_messages_py.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── tf_generate_messages_cpp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── tf_generate_messages_eus.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── tf_generate_messages_lisp.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   ├── tf_generate_messages_nodejs.dir/
    │   │   │   │   ├── DependInfo.cmake
    │   │   │   │   ├── build.make
    │   │   │   │   ├── cmake_clean.cmake
    │   │   │   │   └── progress.make
    │   │   │   └── tf_generate_messages_py.dir/
    │   │   │       ├── DependInfo.cmake
    │   │   │       ├── build.make
    │   │   │       ├── cmake_clean.cmake
    │   │   │       └── progress.make
    │   │   ├── CTestTestfile.cmake
    │   │   ├── Makefile
    │   │   ├── catkin/
    │   │   │   └── catkin_generated/
    │   │   │       └── version/
    │   │   │           └── package.cmake
    │   │   ├── catkin_generated/
    │   │   │   ├── env_cached.sh
    │   │   │   ├── generate_cached_setup.py
    │   │   │   ├── installspace/
    │   │   │   │   ├── .rosinstall
    │   │   │   │   ├── _setup_util.py
    │   │   │   │   ├── env.sh
    │   │   │   │   ├── rf2o_laser_odometry.pc
    │   │   │   │   ├── rf2o_laser_odometryConfig-version.cmake
    │   │   │   │   ├── rf2o_laser_odometryConfig.cmake
    │   │   │   │   ├── setup.bash
    │   │   │   │   ├── setup.sh
    │   │   │   │   └── setup.zsh
    │   │   │   ├── ordered_paths.cmake
    │   │   │   ├── package.cmake
    │   │   │   ├── pkg.develspace.context.pc.py
    │   │   │   ├── pkg.installspace.context.pc.py
    │   │   │   ├── setup_cached.sh
    │   │   │   └── stamps/
    │   │   │       └── rf2o_laser_odometry/
    │   │   │           ├── _setup_util.py.stamp
    │   │   │           ├── interrogate_setup_dot_py.py.stamp
    │   │   │           ├── package.xml.stamp
    │   │   │           └── pkg.pc.em.stamp
    │   │   ├── cmake_install.cmake
    │   │   ├── devel/
    │   │   │   ├── .catkin
    │   │   │   ├── .rosinstall
    │   │   │   ├── _setup_util.py
    │   │   │   ├── env.sh
    │   │   │   ├── lib/
    │   │   │   │   └── pkgconfig/
    │   │   │   │       └── rf2o_laser_odometry.pc
    │   │   │   ├── setup.bash
    │   │   │   ├── setup.sh
    │   │   │   ├── setup.zsh
    │   │   │   └── share/
    │   │   │       └── rf2o_laser_odometry/
    │   │   │           └── cmake/
    │   │   │               ├── rf2o_laser_odometryConfig-version.cmake
    │   │   │               └── rf2o_laser_odometryConfig.cmake
    │   │   └── rf2o_laser_odometry.cbp
    │   ├── include/
    │   │   └── rf2o_laser_odometry/
    │   │       └── CLaserOdometry2D.h
    │   ├── launch/
    │   │   └── rf2o_laser_odometry.launch
    │   ├── package.xml
    │   └── src/
    │       └── CLaserOdometry2D.cpp
    └── robot_localization/
        ├── CHANGELOG.rst
        ├── CMakeLists.txt
        ├── LICENSE
        ├── README.md
        ├── doc/
        │   ├── .templates/
        │   │   └── full_globaltoc.html
        │   ├── Makefile
        │   ├── conf.py
        │   ├── configuring_robot_localization.rst
        │   ├── index.rst
        │   ├── integrating_gps.rst
        │   ├── manifest.yaml
        │   ├── migrating_from_robot_pose_ekf.rst
        │   ├── navsat_transform_node.rst
        │   ├── preparing_sensor_data.rst
        │   └── state_estimation_nodes.rst
        ├── include/
        │   └── robot_localization/
        │       ├── ekf.h
        │       ├── filter_base.h
        │       ├── filter_common.h
        │       ├── filter_utilities.h
        │       ├── navsat_conversions.h
        │       ├── navsat_transform.h
        │       ├── robot_localization_estimator.h
        │       ├── ros_filter.h
        │       ├── ros_filter_types.h
        │       ├── ros_filter_utilities.h
        │       ├── ros_robot_localization_listener.h
        │       └── ukf.h
        ├── launch/
        │   ├── dual_ekf_navsat_example.launch
        │   ├── ekf_template.launch
        │   ├── navsat_transform_template.launch
        │   └── ukf_template.launch
        ├── package.xml
        ├── params/
        │   ├── dual_ekf_navsat_example.yaml
        │   ├── ekf_template.yaml
        │   ├── navsat_transform_template.yaml
        │   └── ukf_template.yaml
        ├── rosdoc.yaml
        ├── src/
        │   ├── ekf.cpp
        │   ├── ekf_localization_node.cpp
        │   ├── filter_base.cpp
        │   ├── filter_utilities.cpp
        │   ├── navsat_transform.cpp
        │   ├── navsat_transform_node.cpp
        │   ├── robot_localization_estimator.cpp
        │   ├── robot_localization_listener_node.cpp
        │   ├── ros_filter.cpp
        │   ├── ros_filter_utilities.cpp
        │   ├── ros_robot_localization_listener.cpp
        │   ├── ukf.cpp
        │   └── ukf_localization_node.cpp
        ├── srv/
        │   ├── GetState.srv
        │   ├── SetDatum.srv
        │   └── SetPose.srv
        └── test/
            ├── record_all_stats.sh
            ├── stat_recorder.sh
            ├── test1.bag
            ├── test2.bag
            ├── test3.bag
            ├── test_ekf.cpp
            ├── test_ekf.test
            ├── test_ekf_localization_node_bag1.test
            ├── test_ekf_localization_node_bag2.test
            ├── test_ekf_localization_node_bag3.test
            ├── test_ekf_localization_node_interfaces.cpp
            ├── test_ekf_localization_node_interfaces.test
            ├── test_filter_base.cpp
            ├── test_filter_base_diagnostics_timestamps.cpp
            ├── test_filter_base_diagnostics_timestamps.test
            ├── test_localization_node_bag_pose_tester.cpp
            ├── test_robot_localization_estimator.cpp
            ├── test_robot_localization_estimator.test
            ├── test_ros_robot_localization_listener.cpp
            ├── test_ros_robot_localization_listener.test
            ├── test_ros_robot_localization_listener_publisher.cpp
            ├── test_ukf.cpp
            ├── test_ukf.test
            ├── test_ukf_localization_node_bag1.test
            ├── test_ukf_localization_node_bag2.test
            ├── test_ukf_localization_node_bag3.test
            ├── test_ukf_localization_node_interfaces.cpp
            └── test_ukf_localization_node_interfaces.test
Download .txt
SYMBOL INDEX (215 symbols across 61 files)

FILE: src/art_driver/src/art_racecar.cpp
  function TwistCallback (line 11) | void TwistCallback(const geometry_msgs::Twist& twist)
  function main (line 21) | int main(int argc, char** argv)

FILE: src/art_imu/src/art_imu.cc
  function d2f_acc (line 53) | static float d2f_acc(uint8_t a[2])
  function d2f_gyro (line 60) | static float d2f_gyro(uint8_t a[2])
  function d2f_mag (line 67) | static float d2f_mag(uint8_t a[2])
  function d2f_euler (line 74) | static float d2f_euler(uint8_t a[2])
  function d2f_latlon (line 82) | static double d2f_latlon(uint8_t a[4])
  function d2f_gpsvel (line 92) | static double d2f_gpsvel(uint8_t a[2])
  function d2ieee754 (line 99) | static float d2ieee754(uint8_t a[4])
  function uart_set (line 111) | int uart_set(int fd, int baude, int c_flow, int bits, char parity, int s...
  function main (line 231) | int main(int argc, char** argv)

FILE: src/art_racecar/src/ESC_calibration.py
  function getKey (line 13) | def getKey():
  function vels (line 25) | def vels(speed,turn):

FILE: src/art_racecar/src/PID.h
  type PID (line 6) | typedef struct PID
  type PID (line 19) | struct PID
  type PID (line 20) | struct PID

FILE: src/art_racecar/src/art_car_controller.cpp
  function main (line 190) | int main(int argc, char **argv)

FILE: src/art_racecar/src/art_car_controller.hpp
  class L1Controller (line 4) | class L1Controller
    type PID (line 21) | struct PID

FILE: src/art_racecar/src/racecar_joy.py
  function callback (line 21) | def callback(data):
  function vels (line 68) | def vels(speed,turn):
  function getKey (line 72) | def getKey():

FILE: src/art_racecar/src/racecar_teleop.py
  function getKey (line 51) | def getKey():
  function vels (line 63) | def vels(speed,turn):

FILE: src/ls01g/scripts/LS01A.py
  class ls01c (line 16) | class ls01c:
    method __init__ (line 17) | def __init__(self):
    method LaserStop (line 87) | def LaserStop(self):
    method resolveData (line 94) | def resolveData(self):
    method shutdown (line 138) | def shutdown(self):
    method ls_scan_pub (line 143) | def ls_scan_pub(self, pub, laser_distance1, laser_angle1):

FILE: src/ls01g/src/main.cpp
  function publish_scan (line 19) | void publish_scan(ros::Publisher *pub, double *dist, double *intensities...
  function startStopCB (line 108) | void startStopCB(const std_msgs::Int32ConstPtr msg)
  function main (line 151) | int main(int argv, char **argc)

FILE: src/ls01g/src/uart_driver.cpp
  type basedata (line 14) | struct basedata
  function RestartGetData (line 28) | static int RestartGetData(void)
  function Uart_parameter (line 59) | static int Uart_parameter(unsigned char *data, double *angle, double *di...
  type basedata (line 125) | struct basedata
  type basedata (line 127) | struct basedata
  type basedata (line 129) | struct basedata
  type basedata (line 129) | struct basedata
  type basedata (line 141) | struct basedata
  type basedata (line 143) | struct basedata
  function InitPackageSize (line 160) | static int InitPackageSize()
  function analysis (line 178) | static void analysis(unsigned char *buf, int nRet)
  type timeval (line 437) | struct timeval
  type termios (line 485) | struct termios
  type termios (line 486) | struct termios
  type basedata (line 644) | struct basedata

FILE: src/ls01g/src/uart_driver.h
  type Command (line 45) | enum Command
  type ture_data (line 50) | struct ture_data{
  type wifides (line 57) | struct wifides {
  type basedata (line 66) | struct basedata {
  type rplidar_response_measurement_node_t (line 77) | typedef struct _rplidar_response_measurement_node_t {
  type scanDot (line 83) | struct scanDot {
  function class (line 90) | class  io_driver

FILE: src/navigation_tutorials/laser_scan_publisher_tutorial/src/laser_scan_publisher.cpp
  function main (line 40) | int main(int argc, char** argv){

FILE: src/navigation_tutorials/odometry_publisher_tutorial/src/odometry_publisher.cpp
  function main (line 41) | int main(int argc, char** argv){

FILE: src/navigation_tutorials/point_cloud_publisher_tutorial/src/point_cloud_publisher.cpp
  function main (line 40) | int main(int argc, char** argv){

FILE: src/navigation_tutorials/robot_setup_tf_tutorial/src/tf_broadcaster.cpp
  function main (line 40) | int main(int argc, char** argv){

FILE: src/navigation_tutorials/robot_setup_tf_tutorial/src/tf_listener.cpp
  function transformPoint (line 41) | void transformPoint(const tf::TransformListener& listener){
  function main (line 67) | int main(int argc, char** argv){

FILE: src/navigation_tutorials/simple_navigation_goals_tutorial/src/simple_navigation_goals.cpp
  function spinThread (line 49) | void spinThread(){
  function main (line 53) | int main(int argc, char** argv){

FILE: src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/3.9.6/CompilerIdC/CMakeCCompilerId.c
  function main (line 539) | void main() {}

FILE: src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/3.9.6/CompilerIdCXX/CMakeCXXCompilerId.cpp
  function main (line 519) | int main(int argc, char* argv[])

FILE: src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/feature_tests.c
  function main (line 34) | int main(int argc, char** argv) { (void)argv; return features[argc]; }

FILE: src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/feature_tests.cxx
  function main (line 405) | int main(int argc, char** argv) { (void)argv; return features[argc]; }

FILE: src/rf2o_laser_odometry/cmake-build-debug/catkin_generated/installspace/_setup_util.py
  function rollback_env_variables (line 62) | def rollback_env_variables(environ, env_var_subfolders):
  function _rollback_env_variable (line 83) | def _rollback_env_variable(environ, name, subfolders):
  function _get_workspaces (line 114) | def _get_workspaces(environ, include_fuerte=False, include_non_existing=...
  function prepend_env_variables (line 129) | def prepend_env_variables(environ, env_var_subfolders, workspaces):
  function _prefix_env_variable (line 149) | def _prefix_env_variable(environ, name, paths, subfolders):
  function assignment (line 175) | def assignment(key, value):
  function comment (line 182) | def comment(msg):
  function prepend (line 189) | def prepend(environ, key, prefix):
  function find_env_hooks (line 198) | def find_env_hooks(environ, cmake_prefix_path):
  function _parse_arguments (line 250) | def _parse_arguments(args=None):

FILE: src/rf2o_laser_odometry/cmake-build-debug/devel/_setup_util.py
  function rollback_env_variables (line 62) | def rollback_env_variables(environ, env_var_subfolders):
  function _rollback_env_variable (line 83) | def _rollback_env_variable(environ, name, subfolders):
  function _get_workspaces (line 114) | def _get_workspaces(environ, include_fuerte=False, include_non_existing=...
  function prepend_env_variables (line 129) | def prepend_env_variables(environ, env_var_subfolders, workspaces):
  function _prefix_env_variable (line 149) | def _prefix_env_variable(environ, name, paths, subfolders):
  function assignment (line 175) | def assignment(key, value):
  function comment (line 182) | def comment(msg):
  function prepend (line 189) | def prepend(environ, key, prefix):
  function find_env_hooks (line 198) | def find_env_hooks(environ, cmake_prefix_path):
  function _parse_arguments (line 250) | def _parse_arguments(args=None):

FILE: src/rf2o_laser_odometry/include/rf2o_laser_odometry/CLaserOdometry2D.h
  function class (line 58) | class CLaserOdometry2D

FILE: src/rf2o_laser_odometry/src/CLaserOdometry2D.cpp
  function main (line 1077) | int main(int argc, char** argv)

FILE: src/robot_localization/include/robot_localization/ekf.h
  function namespace (line 43) | namespace RobotLocalization

FILE: src/robot_localization/include/robot_localization/filter_base.h
  function namespace (line 52) | namespace RobotLocalization
  type boost (line 110) | typedef boost::shared_ptr<Measurement> MeasurementPtr;
  type FilterState (line 118) | struct FilterState

FILE: src/robot_localization/include/robot_localization/filter_common.h
  function namespace (line 36) | namespace RobotLocalization

FILE: src/robot_localization/include/robot_localization/filter_utilities.h
  function namespace (line 51) | namespace RobotLocalization

FILE: src/robot_localization/include/robot_localization/navsat_conversions.h
  function namespace (line 57) | namespace RobotLocalization

FILE: src/robot_localization/include/robot_localization/navsat_transform.h
  function namespace (line 53) | namespace RobotLocalization

FILE: src/robot_localization/include/robot_localization/robot_localization_estimator.h
  function namespace (line 45) | namespace RobotLocalization
  function namespace (line 86) | namespace EstimatorResults
  type EstimatorResults (line 98) | typedef EstimatorResults::EstimatorResult EstimatorResult;
  function namespace (line 100) | namespace FilterTypes
  type FilterTypes (line 109) | typedef FilterTypes::FilterType FilterType;
  function class (line 116) | class RobotLocalizationEstimator

FILE: src/robot_localization/include/robot_localization/ros_filter.h
  function namespace (line 73) | namespace RobotLocalization

FILE: src/robot_localization/include/robot_localization/ros_filter_types.h
  function namespace (line 40) | namespace RobotLocalization

FILE: src/robot_localization/include/robot_localization/ros_filter_utilities.h
  function namespace (line 55) | namespace RobotLocalization

FILE: src/robot_localization/include/robot_localization/ros_robot_localization_listener.h
  function namespace (line 47) | namespace RobotLocalization

FILE: src/robot_localization/include/robot_localization/ukf.h
  function namespace (line 43) | namespace RobotLocalization

FILE: src/robot_localization/src/ekf.cpp
  type RobotLocalization (line 43) | namespace RobotLocalization

FILE: src/robot_localization/src/ekf_localization_node.cpp
  function main (line 37) | int main(int argc, char **argv)

FILE: src/robot_localization/src/filter_base.cpp
  type RobotLocalization (line 42) | namespace RobotLocalization

FILE: src/robot_localization/src/filter_utilities.cpp
  type RobotLocalization (line 104) | namespace RobotLocalization
    type FilterUtilities (line 107) | namespace FilterUtilities
      function appendPrefix (line 109) | void appendPrefix(std::string tfPrefix, std::string &frameId)
      function clampRotation (line 129) | double clampRotation(double rotation)

FILE: src/robot_localization/src/navsat_transform.cpp
  type RobotLocalization (line 44) | namespace RobotLocalization

FILE: src/robot_localization/src/navsat_transform_node.cpp
  function main (line 37) | int main(int argc, char **argv)

FILE: src/robot_localization/src/robot_localization_estimator.cpp
  type RobotLocalization (line 39) | namespace RobotLocalization
    function EstimatorResult (line 87) | EstimatorResult RobotLocalizationEstimator::getState(const double time,

FILE: src/robot_localization/src/robot_localization_listener_node.cpp
  type RobotLocalization (line 38) | namespace RobotLocalization
    class RobotLocalizationListenerNode (line 41) | class RobotLocalizationListenerNode
      method RobotLocalizationListenerNode (line 44) | RobotLocalizationListenerNode()
      method getService (line 49) | std::string getService()
      method getStateCallback (line 59) | bool getStateCallback(robot_localization::GetState::Request  &req,
  function main (line 88) | int main(int argc, char **argv)

FILE: src/robot_localization/src/ros_filter.cpp
  type RobotLocalization (line 47) | namespace RobotLocalization
  class RobotLocalization::RosFilter<RobotLocalization::Ekf> (line 3146) | class RobotLocalization::RosFilter<RobotLocalization::Ekf>
  class RobotLocalization::RosFilter<RobotLocalization::Ukf> (line 3147) | class RobotLocalization::RosFilter<RobotLocalization::Ukf>

FILE: src/robot_localization/src/ros_filter_utilities.cpp
  type RobotLocalization (line 82) | namespace RobotLocalization
    type RosFilterUtilities (line 84) | namespace RosFilterUtilities
      function getYaw (line 87) | double getYaw(const tf2::Quaternion quat)
      function lookupTransformSafe (line 98) | bool lookupTransformSafe(const tf2_ros::Buffer &buffer,
      function lookupTransformSafe (line 157) | bool lookupTransformSafe(const tf2_ros::Buffer &buffer,
      function quatToRPY (line 167) | void quatToRPY(const tf2::Quaternion &quat, double &roll, double &pi...
      function stateToTF (line 173) | void stateToTF(const Eigen::VectorXd &state, tf2::Transform &stateTF)
      function TFtoState (line 186) | void TFtoState(const tf2::Transform &stateTF, Eigen::VectorXd &state)

FILE: src/robot_localization/src/ros_robot_localization_listener.cpp
  type RobotLocalization (line 48) | namespace RobotLocalization
    function FilterType (line 51) | FilterType filterTypeFromString(const std::string& filter_type_str)
    function findAncestorRecursiveYAML (line 257) | bool findAncestorRecursiveYAML(YAML::Node& tree, const std::string& so...
    function findAncestor (line 277) | bool findAncestor(const tf2_ros::Buffer& buffer, const std::string& so...

FILE: src/robot_localization/src/ukf.cpp
  type RobotLocalization (line 49) | namespace RobotLocalization

FILE: src/robot_localization/src/ukf_localization_node.cpp
  function main (line 39) | int main(int argc, char **argv)

FILE: src/robot_localization/test/test_ekf.cpp
  class RosEkfPassThrough (line 44) | class RosEkfPassThrough : public RosEkf
    method RosEkfPassThrough (line 47) | RosEkfPassThrough()
    method Ekf (line 51) | Ekf &getFilter()
  function TEST (line 57) | TEST(EkfTest, Measurements)
  function main (line 129) | int main(int argc, char **argv)

FILE: src/robot_localization/test/test_ekf_localization_node_interfaces.cpp
  function resetFilter (line 51) | void resetFilter()
  function filterCallback (line 88) | void filterCallback(const nav_msgs::OdometryConstPtr &msg)
  function TEST (line 94) | TEST(InterfacesTest, OdomPoseBasicIO)
  function TEST (line 138) | TEST(InterfacesTest, OdomTwistBasicIO)
  function TEST (line 303) | TEST(InterfacesTest, PoseBasicIO)
  function TEST (line 349) | TEST(InterfacesTest, TwistBasicIO)
  function TEST (line 513) | TEST(InterfacesTest, ImuPoseBasicIO)
  function TEST (line 590) | TEST(InterfacesTest, ImuTwistBasicIO)
  function TEST (line 722) | TEST(InterfacesTest, ImuAccBasicIO)
  function TEST (line 804) | TEST(InterfacesTest, OdomDifferentialIO)
  function TEST (line 882) | TEST(InterfacesTest, PoseDifferentialIO)
  function TEST (line 960) | TEST(InterfacesTest, ImuDifferentialIO)
  function main (line 1064) | int main(int argc, char **argv)

FILE: src/robot_localization/test/test_filter_base.cpp
  type RobotLocalization (line 47) | namespace RobotLocalization
    class FilterDerived (line 50) | class FilterDerived : public FilterBase
      method FilterDerived (line 55) | FilterDerived() : val(0) { }
      method correct (line 57) | void correct(const Measurement &measurement)
      method predict (line 69) | void predict(const double refTime, const double delta)
    class FilterDerived2 (line 75) | class FilterDerived2 : public FilterBase
      method FilterDerived2 (line 78) | FilterDerived2() { }
      method correct (line 80) | void correct(const Measurement &measurement)
      method predict (line 84) | void predict(const double refTime, const double delta)
      method processMeasurement (line 88) | void processMeasurement(const Measurement &measurement)
  function TEST (line 96) | TEST(FilterBaseTest, MeasurementStruct)
  function TEST (line 120) | TEST(FilterBaseTest, DerivedFilterGetSet)
  function TEST (line 166) | TEST(FilterBaseTest, MeasurementProcessing)
  function main (line 212) | int main(int argc, char **argv)

FILE: src/robot_localization/test/test_filter_base_diagnostics_timestamps.cpp
  type RobotLocalization (line 50) | namespace RobotLocalization
    function getValidPose (line 57) | geometry_msgs::PoseWithCovarianceStamped getValidPose()
    function getValidTwist (line 70) | geometry_msgs::TwistWithCovarianceStamped getValidTwist()
    function getValidImu (line 82) | sensor_msgs::Imu getValidImu()
    function getValidOdometry (line 96) | nav_msgs::Odometry getValidOdometry()
    class DiagnosticsHelper (line 113) | class DiagnosticsHelper
      method DiagnosticsHelper (line 132) | DiagnosticsHelper()
      method diagnosticCallback (line 153) | void diagnosticCallback(const diagnostic_msgs::DiagnosticArrayPtr &msg)
      method publishMessages (line 158) | void publishMessages(ros::Time t)
      method setPose (line 177) | void setPose(ros::Time t)
  function TEST (line 192) | TEST(FilterBaseDiagnosticsTest, EmptyTimestamps)
  function TEST (line 266) | TEST(FilterBaseDiagnosticsTest, TimestampsBeforeSetPose)
  function TEST (line 338) | TEST(FilterBaseDiagnosticsTest, TimestampsBeforePrevious)
  function main (line 424) | int main(int argc, char **argv)

FILE: src/robot_localization/test/test_localization_node_bag_pose_tester.cpp
  function filterCallback (line 44) | void filterCallback(const nav_msgs::OdometryConstPtr &msg)
  function TEST (line 49) | TEST(BagTest, PoseCheck)
  function main (line 99) | int main(int argc, char **argv)

FILE: src/robot_localization/test/test_robot_localization_estimator.cpp
  function TEST (line 40) | TEST(RLETest, StateBuffer)
  function main (line 163) | int main(int argc, char **argv)

FILE: src/robot_localization/test/test_ros_robot_localization_listener.cpp
  function TEST (line 45) | TEST(LocalizationListenerTest, testGetStateOfBaseLink)
  function TEST (line 70) | TEST(LocalizationListenerTest, GetStateOfRelatedFrame)
  function main (line 119) | int main(int argc, char **argv)

FILE: src/robot_localization/test/test_ros_robot_localization_listener_publisher.cpp
  function main (line 41) | int main(int argc, char **argv)

FILE: src/robot_localization/test/test_ukf.cpp
  class RosUkfPassThrough (line 44) | class RosUkfPassThrough : public RosUkf
    method RosUkfPassThrough (line 47) | explicit RosUkfPassThrough(std::vector<double> &args) : RosUkf(args)
    method Ukf (line 51) | Ukf &getFilter()
  function TEST (line 57) | TEST(UkfTest, Measurements)
  function main (line 135) | int main(int argc, char **argv)

FILE: src/robot_localization/test/test_ukf_localization_node_interfaces.cpp
  function resetFilter (line 52) | void resetFilter()
  function filterCallback (line 89) | void filterCallback(const nav_msgs::OdometryConstPtr &msg)
  function TEST (line 95) | TEST(InterfacesTest, OdomPoseBasicIO)
  function TEST (line 139) | TEST(InterfacesTest, OdomTwistBasicIO)
  function TEST (line 304) | TEST(InterfacesTest, PoseBasicIO)
  function TEST (line 350) | TEST(InterfacesTest, TwistBasicIO)
  function TEST (line 514) | TEST(InterfacesTest, ImuPoseBasicIO)
  function TEST (line 591) | TEST(InterfacesTest, ImuTwistBasicIO)
  function TEST (line 723) | TEST(InterfacesTest, ImuAccBasicIO)
  function TEST (line 805) | TEST(InterfacesTest, OdomDifferentialIO)
  function TEST (line 883) | TEST(InterfacesTest, PoseDifferentialIO)
  function TEST (line 961) | TEST(InterfacesTest, ImuDifferentialIO)
  function main (line 1065) | int main(int argc, char **argv)
Condensed preview — 521 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,181K chars).
[
  {
    "path": ".catkin_workspace",
    "chars": 98,
    "preview": "# This file currently only serves to mark the location of a catkin workspace for tool integration\n"
  },
  {
    "path": "README.md",
    "chars": 2067,
    "preview": "# art_racecar  \r\n# art-racecar V1.0  2019.01.30   \r\n# art-racecar V1.1  2019.07.17 完善手柄遥控功能   \r\n\r\nROS racecar  \r\n*******"
  },
  {
    "path": "install.sh",
    "chars": 2033,
    "preview": "#!/bin/bash\n\n# Varibles\nrosversion=\"kinetic\"\n# Install the ros\n\nif [ `id -u` == 0 ]; then\n\techo \"Don't running this use "
  },
  {
    "path": "src/art_driver/CMakeLists.txt",
    "chars": 7066,
    "preview": "# Created by Steven Zhang on 18-12-29.\n# art racecar\n\ncmake_minimum_required(VERSION 2.8.3)\nproject(art_driver)\n\n## Comp"
  },
  {
    "path": "src/art_driver/README",
    "chars": 563,
    "preview": "/*******************************************************************/\n/***************art_driverr***********************"
  },
  {
    "path": "src/art_driver/include/art_racecar_driver.h",
    "chars": 434,
    "preview": "\n//\n// Created by Steven Zhang on 18-12-14.\n// art racecar\n//\n\n#ifndef ART_RACECAR_DRIVER\n#define ART_RACECAR_DRIVER\n#in"
  },
  {
    "path": "src/art_driver/package.xml",
    "chars": 2871,
    "preview": "<?xml version=\"1.0\"?>\n<package format=\"2\">\n  <name>art_driver</name>\n  <version>0.1.0</version>\n  <description>The art_c"
  },
  {
    "path": "src/art_driver/src/art_racecar.cpp",
    "chars": 757,
    "preview": "//\n// Created by Steven Zhang on 18-12-14.\n// art racecar\n//\n\n#include \"../include/art_racecar_driver.h\"\n#include <ros/r"
  },
  {
    "path": "src/art_imu/CMakeLists.txt",
    "chars": 386,
    "preview": "cmake_minimum_required(VERSION 2.8.3)\nproject(art_imu)\n\n\nadd_definitions(-std=c++11)\nfind_package(catkin REQUIRED roscpp"
  },
  {
    "path": "src/art_imu/launch/imu.launch",
    "chars": 276,
    "preview": "<?xml version=\"1.0\"?>\n<launch>\n  <node pkg=\"art_imu\"\n        name=\"imu\"\n        type=\"art_imu\"\n        output=\"screen\">\n"
  },
  {
    "path": "src/art_imu/launch/imu_test.launch",
    "chars": 280,
    "preview": "<?xml version=\"1.0\"?>\n<launch>\n  <node pkg=\"art_imu\"\n        name=\"imu\"\n        type=\"art_imu\"\n        output=\"screen\">\n"
  },
  {
    "path": "src/art_imu/launch/rviz.launch",
    "chars": 218,
    "preview": "<?xml version=\"1.0\"?>\n\n<launch>\n    <arg name=\"use_rviz\" default=\"true\" />\n\n   \n\n    <!-- Rviz -->\n    <node pkg=\"rviz\" "
  },
  {
    "path": "src/art_imu/package.xml",
    "chars": 669,
    "preview": "<?xml version=\"1.0\"?>\n<package>\n  <name>art_imu</name>\n  <version>0.1.0</version>\n  <description>The art_imu package</de"
  },
  {
    "path": "src/art_imu/rviz/imu.rviz",
    "chars": 5953,
    "preview": "Panels:\n  - Class: rviz/Displays\n    Help Height: 78\n    Name: Displays\n    Property Tree Widget:\n      Expanded:\n      "
  },
  {
    "path": "src/art_imu/src/art_imu.cc",
    "chars": 9999,
    "preview": "#include <deque>\n#include <ros/ros.h>\n#include <sensor_msgs/Imu.h>\n#include <sensor_msgs/MagneticField.h>\n#include <sens"
  },
  {
    "path": "src/art_racecar/CMakeLists.txt",
    "chars": 7435,
    "preview": "cmake_minimum_required(VERSION 2.8.3)\nproject(art_racecar)\n\n## Compile as C++11, supported in ROS Kinetic and newer\n# ad"
  },
  {
    "path": "src/art_racecar/README.md",
    "chars": 2067,
    "preview": "# art_racecar  \r\n# art-racecar V1.0  2019.01.30   \r\n# art-racecar V1.1  2019.07.17 完善手柄遥控功能   \r\n\r\nROS racecar  \r\n*******"
  },
  {
    "path": "src/art_racecar/art_rviz.sh",
    "chars": 388,
    "preview": "#!/bin/bash\n\n#for open rviz and set ROS master ip\n#Steven.Zhang\n#2018.03.09\n\nfunction get_ip_address { ifconfig | fgrep "
  },
  {
    "path": "src/art_racecar/cfg/imu.cfg",
    "chars": 258,
    "preview": "#!/usr/bin/env python\nPACKAGE = \"art_racecar\"\n\nfrom dynamic_reconfigure.parameter_generator_catkin import *\n\ngen = Param"
  },
  {
    "path": "src/art_racecar/launch/Run_car.launch",
    "chars": 631,
    "preview": "<?xml version=\"1.0\"?>\n\n<launch>\n    <master auto=\"start\"/>\n\n    <!-- TF setting -->\n    <include file=\"$(find art_raceca"
  },
  {
    "path": "src/art_racecar/launch/Run_gmapping.launch",
    "chars": 2130,
    "preview": "<?xml version=\"1.0\"?>\n\n<launch>\n\n    <arg name=\"use_rviz\" default=\"false\" />\n\n    <!-- ODOMETRY -->\n    <!--rf2o_Laser_O"
  },
  {
    "path": "src/art_racecar/launch/amcl_nav.launch",
    "chars": 2958,
    "preview": "<?xml version=\"1.0\"?>\n\n<launch>\n    <arg name=\"use_rviz\" default=\"false\" />\n\n    <!-- for amcl -->    \n    <arg name=\"in"
  },
  {
    "path": "src/art_racecar/launch/car.launch",
    "chars": 425,
    "preview": "<?xml version=\"1.0\"?>\n\n<launch>\n    <master auto=\"start\"/>\n\n    <!-- TF setting -->\n    <include file=\"$(find art_raceca"
  },
  {
    "path": "src/art_racecar/launch/includes/amcl.launch.xml",
    "chars": 2461,
    "preview": "<?xml version=\"1.0\"?>\n\n<launch>\n    <arg name=\"init_x\" default=\"0\" />\n    <arg name=\"init_y\" default=\"0\" />\n    <arg nam"
  },
  {
    "path": "src/art_racecar/launch/includes/art_car_tf.launch.xml",
    "chars": 439,
    "preview": "<launch>\n    <node pkg=\"tf\" type=\"static_transform_publisher\" name=\"base_footprint2base_link\" args=\"0.0 0.0 0.15 0.0 0.0"
  },
  {
    "path": "src/art_racecar/launch/includes/default_mapping.launch.xml",
    "chars": 2379,
    "preview": "<?xml version=\"1.0\"?>\n\n<launch>\n    <arg name=\"tf_map_scanmatch_transform_frame_name\" default=\"scanmatcher_frame\"/>\n    "
  },
  {
    "path": "src/art_racecar/launch/includes/ls01g.launch.xml",
    "chars": 840,
    "preview": "\n<launch>\n\t<arg name=\"inverted\" default=\"false\" />\n    <node name=\"ls01g\" pkg=\"ls01g\" type=\"ls01g\" output=\"screen\">\n  \t\t"
  },
  {
    "path": "src/art_racecar/launch/includes/rf2o.launch.xml",
    "chars": 1393,
    "preview": "<!-- \n  This node presents a fast and precise method to estimate the planar motion of a lidar\n  from consecutive range s"
  },
  {
    "path": "src/art_racecar/launch/includes/rplidar.launch.xml",
    "chars": 493,
    "preview": "<launch>\n    <node name=\"rplidarNode\"          pkg=\"rplidar_ros\"  type=\"rplidarNode\" output=\"screen\">\n        <param nam"
  },
  {
    "path": "src/art_racecar/launch/ls01g_lidar.launch",
    "chars": 878,
    "preview": "<?xml version=\"1.0\"?>\n\n<launch>\n    <arg name=\"inverted\" default=\"false\" />\n    <node name=\"ls01g\" pkg=\"ls01g\" type=\"ls0"
  },
  {
    "path": "src/art_racecar/launch/rviz.launch",
    "chars": 223,
    "preview": "<?xml version=\"1.0\"?>\n\n<launch>\n    <arg name=\"use_rviz\" default=\"true\" />\n\n   \n\n    <!-- Rviz -->\n    <node pkg=\"rviz\" "
  },
  {
    "path": "src/art_racecar/launch/teleop_joy.launch",
    "chars": 300,
    "preview": "<?xml version=\"1.0\"?>\n\n<launch>\n\n    <node name=\"joy_node\" pkg=\"joy\" type=\"joy_node\" />\n    <node name=\"racecar_joy\" pkg"
  },
  {
    "path": "src/art_racecar/map/mymap.yaml",
    "chars": 173,
    "preview": "image: /home/art/racecar/src/art_racecar/map/mymap.pgm\nresolution: 0.050000\norigin: [-100.000000, -100.000000, 0.000000]"
  },
  {
    "path": "src/art_racecar/map/test.yaml",
    "chars": 134,
    "preview": "image: test.pgm\nresolution: 0.050000\norigin: [-100.000000, -100.000000, 0.000000]\nnegate: 0\noccupied_thresh: 0.65\nfree_t"
  },
  {
    "path": "src/art_racecar/package.xml",
    "chars": 3443,
    "preview": "<?xml version=\"1.0\"?>\n<package format=\"2\">\n  <name>art_racecar</name>\n  <version>0.1.0</version>\n  <description>The art_"
  },
  {
    "path": "src/art_racecar/param/base_global_planner_params.yaml",
    "chars": 530,
    "preview": "GlobalPlanner:\n    allow_unknown: false\n#    default_tolerance: 0.5      #路径规划器目标点的公差范围\n#   visualize_potential: true   "
  },
  {
    "path": "src/art_racecar/param/dwa_local_planner_params.yaml",
    "chars": 749,
    "preview": "DWAPlannerROS: \n\n  acc_lim_th: 0.1\n  acc_lim_x: 0.5\n  acc_lim_y: 0.0 \n\n\n  max_vel_x: 0.5\n  min_vel_x: 0.0 \n\n  max_vel_y:"
  },
  {
    "path": "src/art_racecar/param/ekf_params.yaml",
    "chars": 10394,
    "preview": "\nfrequency: 30\nsensor_timeout: 0.025\ntwo_d_mode: true\ntransform_time_offset: 0.0001\ntransform_timeout: 0.025\nprint_diagn"
  },
  {
    "path": "src/art_racecar/param/global_costmap_params.yaml",
    "chars": 932,
    "preview": "global_costmap:\n    footprint: [[-0.305, -0.18], [-0.305, 0.18], [0.305, 0.18], [0.305, -0.18]]\n    footprint_padding: 0"
  },
  {
    "path": "src/art_racecar/param/local_costmap_params.yaml",
    "chars": 831,
    "preview": "local_costmap:\n    footprint: [[-0.305, -0.18], [-0.305, 0.18], [0.305, 0.18], [0.305, -0.18]]\n    footprint_padding: 0."
  },
  {
    "path": "src/art_racecar/param/move_base_params.yaml",
    "chars": 348,
    "preview": "# Move base node parameters. For full documentation of the parameters in this file, please see\n#\n#  http://www.ros.org/w"
  },
  {
    "path": "src/art_racecar/rviz/amcl.rviz",
    "chars": 8136,
    "preview": "Panels:\n  - Class: rviz/Displays\n    Help Height: 78\n    Name: Displays\n    Property Tree Widget:\n      Expanded:\n      "
  },
  {
    "path": "src/art_racecar/rviz/gmapping.rviz",
    "chars": 8038,
    "preview": "Panels:\n  - Class: rviz/Displays\n    Help Height: 78\n    Name: Displays\n    Property Tree Widget:\n      Expanded:\n      "
  },
  {
    "path": "src/art_racecar/rviz/test_laser.rviz",
    "chars": 5202,
    "preview": "Panels:\n  - Class: rviz/Displays\n    Help Height: 78\n    Name: Displays\n    Property Tree Widget:\n      Expanded:\n      "
  },
  {
    "path": "src/art_racecar/save_map.sh",
    "chars": 80,
    "preview": "#!/bin/bash\n\nrosrun map_server map_saver -f  ~/racecar/src/art_racecar/map/mymap"
  },
  {
    "path": "src/art_racecar/src/ESC_calibration.py",
    "chars": 2045,
    "preview": "#!/usr/bin/env python\n\nimport rospy\n\nfrom geometry_msgs.msg import Twist\n\nimport sys, select, termios, tty\nimport time\n\n"
  },
  {
    "path": "src/art_racecar/src/PID.h",
    "chars": 508,
    "preview": "\n#ifndef PID_H\n#define\tPID_H\n\n/***********************************/\ntypedef struct PID\n{              //结构体定义\n    doubl"
  },
  {
    "path": "src/art_racecar/src/art_car_controller.cpp",
    "chars": 5783,
    "preview": "/*\nCopyright (c) 2017, ChanYuan KUO, YoRu LU,\nlatest editor: HaoChih, LIN\nAll rights reserved. (Hypha ROS Workshop)\n\nThi"
  },
  {
    "path": "src/art_racecar/src/art_car_controller.hpp",
    "chars": 1837,
    "preview": "/********************/\n/* CLASS DEFINITION */\n/********************/\nclass L1Controller\n{\n    public:\n        L1Controll"
  },
  {
    "path": "src/art_racecar/src/racecar_joy.py",
    "chars": 3623,
    "preview": "#!/usr/bin/env python\n\nimport rospy\n\nfrom geometry_msgs.msg import Twist\nfrom sensor_msgs.msg import Joy\n\nimport sys, se"
  },
  {
    "path": "src/art_racecar/src/racecar_teleop.py",
    "chars": 5533,
    "preview": "#!/usr/bin/env python\n\nimport rospy\n\nfrom geometry_msgs.msg import Twist\n\nimport sys, select, termios, tty\nimport time\n\n"
  },
  {
    "path": "src/art_racecar/ssh.sh",
    "chars": 82,
    "preview": "#!/bin/bash\n\n#for run artrobot\n#Steven.Zhang\n#2018.03.09\n\nssh sz@192.168.5.101\n\n\n\n"
  },
  {
    "path": "src/art_racecar/udev/README",
    "chars": 58,
    "preview": "#添加ART_Racecar的USB设备,使用如下指令:\nsudo bash art_init.sh\n然后重启电脑\n"
  },
  {
    "path": "src/art_racecar/udev/art_init.sh",
    "chars": 137,
    "preview": "#!/bin/bash\nsudo cp ./car.rules /etc/udev/rules.d\nsudo cp ./laser.rules /etc/udev/rules.d\nsudo cp ./imu.rules /etc/udev/"
  },
  {
    "path": "src/art_racecar/udev/car.rules",
    "chars": 164,
    "preview": "# set the udev rule , make the device_port be fixed by arduino\n#\nKERNEL==\"ttyUSB*\", ATTRS{idVendor}==\"1a86\", ATTRS{idPro"
  },
  {
    "path": "src/art_racecar/udev/imu.rules",
    "chars": 190,
    "preview": "# set the udev rule , make the device_port be fixed by sanchi_imu\n#\nKERNEL==\"ttyUSB*\", ATTRS{idVendor}==\"10c4\", ATTRS{id"
  },
  {
    "path": "src/art_racecar/udev/laser.rules",
    "chars": 167,
    "preview": "# set the udev rule , make the device_port be fixed by ls-lidar\n#\nKERNEL==\"ttyUSB*\", ATTRS{idVendor}==\"0403\", ATTRS{idPr"
  },
  {
    "path": "src/ls01g/CMakeLists.txt",
    "chars": 595,
    "preview": "cmake_minimum_required(VERSION 2.8.3)\nproject(ls01g)\n\nfind_package(catkin REQUIRED COMPONENTS\n  roscpp\n  rospy\n  std_msg"
  },
  {
    "path": "src/ls01g/Y.txt",
    "chars": 298,
    "preview": "Stop the scan command:\n\trostopic pub /startOrStop std_msgs/Int32 \"data: 1\"\n\nStop the motor command(Stop the motor will "
  },
  {
    "path": "src/ls01g/launch/ls01g.launch",
    "chars": 884,
    "preview": "<?xml version=\"1.0\"?>\n\n<launch>\n    <arg name=\"inverted\" default=\"false\" />\n    <node name=\"ls01g\" pkg=\"ls01g\" type=\"ls0"
  },
  {
    "path": "src/ls01g/launch/rviz.launch",
    "chars": 105,
    "preview": "<launch>\n  <node name=\"rviz\" pkg=\"rviz\" type=\"rviz\" args=\"-d $(find ls01g)/launch/rviz.rviz\"/>\n</launch>\n"
  },
  {
    "path": "src/ls01g/launch/rviz.rviz",
    "chars": 4677,
    "preview": "Panels:\n  - Class: rviz/Displays\n    Help Height: 78\n    Name: Displays\n    Property Tree Widget:\n      Expanded:\n      "
  },
  {
    "path": "src/ls01g/launch/talker2.launch",
    "chars": 1524,
    "preview": "<launch>\n    <node name=\"ls01g\" pkg=\"ls01g\" type=\"ls01g\" output=\"screen\" ns=\"l0\" launch-prefix=\"gnome-terminal -e\" >\n  \t"
  },
  {
    "path": "src/ls01g/launch/talker_shell.launch",
    "chars": 182,
    "preview": "<launch>\n\t<param name=\"/talker/inverted\" value=\"true\"/>\n    <include file=\"$(find ls01a)/launch/talker.launch\">\n    <!--"
  },
  {
    "path": "src/ls01g/launch/test.launch",
    "chars": 884,
    "preview": "<?xml version=\"1.0\"?>\n\n<launch>\n    <arg name=\"inverted\" default=\"false\" />\n    <node name=\"ls01g\" pkg=\"ls01g\" type=\"ls0"
  },
  {
    "path": "src/ls01g/launch/test_ls01g.launch",
    "chars": 1003,
    "preview": "<?xml version=\"1.0\"?>\n\n<launch>\n  <arg name=\"scan_topic\"  default=\"scan\" />\n  <arg name=\"base_frame\"  default=\"base_foot"
  },
  {
    "path": "src/ls01g/package.xml",
    "chars": 2105,
    "preview": "<?xml version=\"1.0\"?>\n<package>\n  <name>ls01g</name>\n  <version>0.0.0</version>\n  <description>The ls01g laser package</"
  },
  {
    "path": "src/ls01g/rviz/kobuki_rviz_viewer.rviz",
    "chars": 5046,
    "preview": "Panels:\n  - Class: rviz/Displays\n    Help Height: 78\n    Name: Displays\n    Property Tree Widget:\n      Expanded:\n      "
  },
  {
    "path": "src/ls01g/rviz/slam.rviz",
    "chars": 4331,
    "preview": "Panels:\n  - Class: rviz/Displays\n    Help Height: 78\n    Name: Displays\n    Property Tree Widget:\n      Expanded:\n      "
  },
  {
    "path": "src/ls01g/scripts/LS01A.py",
    "chars": 7732,
    "preview": "#!/usr/bin/env python\n# -*- coding:utf-8 -*-\n\nimport serial\nimport math\nimport time\nfrom array import *\nimport rospy\nimp"
  },
  {
    "path": "src/ls01g/scripts/create_udev_rules.sh",
    "chars": 446,
    "preview": "#!/bin/bash\n\necho \"remap the device serial port(ttyUSBX) to  laser\"\necho \"ls01g usb cp210x connection as /dev/laser , ch"
  },
  {
    "path": "src/ls01g/scripts/delete_udev_rules.sh",
    "chars": 274,
    "preview": "#!/bin/bash\n\necho \"delete remap the device serial port(ttyUSBX) to laser\"\necho \"sudo rm   /etc/udev/rules.d/laser.rules\""
  },
  {
    "path": "src/ls01g/scripts/laser.rules",
    "chars": 168,
    "preview": "# set the udev rule , make the device_port be fixed by ls-lidar\n#\nKERNEL==\"ttyUSB*\", ATTRS{idVendor}==\"10c4\", ATTRS{idPr"
  },
  {
    "path": "src/ls01g/slam_launch/gmapping.launch",
    "chars": 1939,
    "preview": "<launch>\n  <arg name=\"scan_topic\"  default=\"scan\" />\n  <arg name=\"base_frame\"  default=\"base_footprint\"/>\n  <arg name=\"o"
  },
  {
    "path": "src/ls01g/slam_launch/hectormapping.launch",
    "chars": 1179,
    "preview": "<?xml version=\"1.0\"?>\n\n<launch>\n\n\n  <node pkg=\"tf\" type=\"static_transform_publisher\" name=\"laser_link_broadcaster\" args="
  },
  {
    "path": "src/ls01g/slam_launch/karto.launch",
    "chars": 633,
    "preview": "\n<launch>\n\n<!--\n  <node pkg=\"tf\" type=\"static_transform_publisher\" name=\"link2_broadcaster\" args=\"0 0 0 0 0 0 odom base_"
  },
  {
    "path": "src/ls01g/slam_launch/karto_mapper_params.yaml",
    "chars": 1463,
    "preview": "# General Parameters\nuse_scan_matching: true\nuse_scan_barycenter: true\nminimum_travel_distance: 0.3 \nminimum_travel_head"
  },
  {
    "path": "src/ls01g/slam_launch/viewer_rviz.launch",
    "chars": 117,
    "preview": "<launch>\n<node name=\"rviz\" pkg=\"rviz\" type=\"rviz\" args=\"-d $(find ls01g)/rviz/kobuki_rviz_viewer.rviz\" />\n\n</launch>\n"
  },
  {
    "path": "src/ls01g/src/main.cpp",
    "chars": 5947,
    "preview": "#include <iostream>\n#include <std_msgs/Int32.h>\n#include \"ros/ros.h\"\n#include \"std_msgs/String.h\"\n#include \"sensor_msgs/"
  },
  {
    "path": "src/ls01g/src/uart_driver.cpp",
    "chars": 13887,
    "preview": "#include \"uart_driver.h\"\n\n#define NO_SCAN       0\n#define START_SCAN    1\n#define STOP_SCAN     2\n\nstatic pthread_t id;\n"
  },
  {
    "path": "src/ls01g/src/uart_driver.h",
    "chars": 1964,
    "preview": "\n\n#ifndef  __UART_DRIVER_H\n#define  __UART_DRIVER_H\n\n#include <iostream>\n#include <stdio.h>\n#include <stdlib.h>\n#include"
  },
  {
    "path": "src/navigation_tutorials/README.md",
    "chars": 164,
    "preview": "# navigation_tutorials\n\nTutorials about using the ROS Navigation stack.\nSee:\n\n- http://wiki.ros.org/navigation_tutorials"
  },
  {
    "path": "src/navigation_tutorials/laser_scan_publisher_tutorial/CMakeLists.txt",
    "chars": 1005,
    "preview": "cmake_minimum_required(VERSION 2.8.3)\nproject(laser_scan_publisher_tutorial)\n\n# Find catkin dependencies\nfind_package(ca"
  },
  {
    "path": "src/navigation_tutorials/laser_scan_publisher_tutorial/package.xml",
    "chars": 789,
    "preview": "<?xml version=\"1.0\"?>\n<package>\n  <name>laser_scan_publisher_tutorial</name>\n  <version>0.2.3</version>\n  <description>T"
  },
  {
    "path": "src/navigation_tutorials/laser_scan_publisher_tutorial/src/laser_scan_publisher.cpp",
    "chars": 3099,
    "preview": "/*********************************************************************\n*\n* Software License Agreement (BSD License)\n*\n* "
  },
  {
    "path": "src/navigation_tutorials/navigation_stage/CMakeLists.txt",
    "chars": 585,
    "preview": "cmake_minimum_required(VERSION 2.8.3)\nproject(navigation_stage)\n\n# Find catkin\nfind_package(catkin REQUIRED)\n\ncatkin_pac"
  },
  {
    "path": "src/navigation_tutorials/navigation_stage/launch/move_base_amcl_10cm.launch",
    "chars": 696,
    "preview": "<launch>\n  <master auto=\"start\"/>\n  <param name=\"/use_sim_time\" value=\"true\"/>\n  <include file=\"$(find navigation_stage)"
  },
  {
    "path": "src/navigation_tutorials/navigation_stage/launch/move_base_amcl_2.5cm.launch",
    "chars": 697,
    "preview": "<launch>\n  <master auto=\"start\"/>\n  <param name=\"/use_sim_time\" value=\"true\"/>\n  <include file=\"$(find navigation_stage)"
  },
  {
    "path": "src/navigation_tutorials/navigation_stage/launch/move_base_amcl_5cm.launch",
    "chars": 709,
    "preview": "<launch>\n  <master auto=\"start\"/>\n  <param name=\"/use_sim_time\" value=\"true\"/>\n  <include file=\"$(find navigation_stage)"
  },
  {
    "path": "src/navigation_tutorials/navigation_stage/launch/move_base_fake_localization_10cm.launch",
    "chars": 722,
    "preview": "<launch>\n  <master auto=\"start\"/>\n  <param name=\"/use_sim_time\" value=\"true\"/>\n  <include file=\"$(find navigation_stage)"
  },
  {
    "path": "src/navigation_tutorials/navigation_stage/launch/move_base_fake_localization_2.5cm.launch",
    "chars": 752,
    "preview": "<launch>\n  <master auto=\"start\"/>\n  <param name=\"/use_sim_time\" value=\"true\"/>\n  <include file=\"$(find navigation_stage)"
  },
  {
    "path": "src/navigation_tutorials/navigation_stage/launch/move_base_fake_localization_5cm.launch",
    "chars": 732,
    "preview": "<launch>\n  <master auto=\"start\"/>\n  <param name=\"/use_sim_time\" value=\"true\"/>\n  <include file=\"$(find navigation_stage)"
  },
  {
    "path": "src/navigation_tutorials/navigation_stage/launch/move_base_gmapping_5cm.launch",
    "chars": 557,
    "preview": "<launch>\n  <master auto=\"start\"/>\n  <param name=\"/use_sim_time\" value=\"true\"/>\n  <include file=\"$(find navigation_stage)"
  },
  {
    "path": "src/navigation_tutorials/navigation_stage/launch/move_base_multi_robot.launch",
    "chars": 2977,
    "preview": "<launch>\n  <master auto=\"start\"/>\n  <param name=\"/use_sim_time\" value=\"true\"/>\n\n  <node pkg=\"map_server\" type=\"map_serve"
  },
  {
    "path": "src/navigation_tutorials/navigation_stage/move_base_config/amcl_node.xml",
    "chars": 2037,
    "preview": "<launch>\n<!-- \n  Example amcl configuration. Descriptions of parameters, as well as a full list of all amcl parameters, "
  },
  {
    "path": "src/navigation_tutorials/navigation_stage/move_base_config/base_local_planner_params.yaml",
    "chars": 1424,
    "preview": "#For full documentation of the parameters in this file, and a list of all the\n#parameters available for TrajectoryPlanne"
  },
  {
    "path": "src/navigation_tutorials/navigation_stage/move_base_config/costmap_common_params.yaml",
    "chars": 1275,
    "preview": "#This file contains common configuration options for the two costmaps used in the navigation stack for more details on t"
  },
  {
    "path": "src/navigation_tutorials/navigation_stage/move_base_config/dwa_local_planner_params.yaml",
    "chars": 830,
    "preview": "#For full documentation of the parameters in this file, and a list of all the\n#parameters available for DWAPlannerROS, p"
  },
  {
    "path": "src/navigation_tutorials/navigation_stage/move_base_config/global_costmap_params.yaml",
    "chars": 515,
    "preview": "#Independent settings for the global planner's costmap. Detailed descriptions of these parameters can be found at http:/"
  },
  {
    "path": "src/navigation_tutorials/navigation_stage/move_base_config/local_costmap_params.yaml",
    "chars": 678,
    "preview": "#Independent settings for the local planner's costmap. Detailed descriptions of these parameters can be found at http://"
  },
  {
    "path": "src/navigation_tutorials/navigation_stage/move_base_config/move_base.xml",
    "chars": 1373,
    "preview": "<launch>\n<!--\n  Example move_base configuration. Descriptions of parameters, as well as a full list of all amcl paramete"
  },
  {
    "path": "src/navigation_tutorials/navigation_stage/move_base_config/slam_gmapping.xml",
    "chars": 1430,
    "preview": "<launch>\n    <node pkg=\"gmapping\" type=\"slam_gmapping\" name=\"slam_gmapping\" output=\"screen\">\n      <remap from=\"scan\" to"
  },
  {
    "path": "src/navigation_tutorials/navigation_stage/multi_robot.rviz",
    "chars": 6342,
    "preview": "Panels:\n  - Class: rviz/Displays\n    Help Height: 78\n    Name: Displays\n    Property Tree Widget:\n      Expanded:\n      "
  },
  {
    "path": "src/navigation_tutorials/navigation_stage/package.xml",
    "chars": 891,
    "preview": "<?xml version=\"1.0\"?>\n<package>\n  <name>navigation_stage</name>\n  <version>0.2.3</version>\n  <description>\n    This pack"
  },
  {
    "path": "src/navigation_tutorials/navigation_stage/single_robot.rviz",
    "chars": 6031,
    "preview": "Panels:\n  - Class: rviz/Displays\n    Help Height: 78\n    Name: Displays\n    Property Tree Widget:\n      Expanded:\n      "
  },
  {
    "path": "src/navigation_tutorials/navigation_stage/stage_config/maps/willow-full-0.025.pgm",
    "chars": 53919,
    "preview": "P5\n# CREATOR: GIMP PNM Filter Version 1.1\n2332 1825\n255\nLZͱ|[(9ͥƫۊW͢z|Ѿ˿ͳͶcj͈X͵糿jn͋niͭ\u001eyx͞mѭnͧ&ܹͣdԭ6Ҷ+\u001f9Vޱɬ<Ꞵ)͖ꈛͶGF\u0015M͎ͳ"
  },
  {
    "path": "src/navigation_tutorials/navigation_stage/stage_config/maps/willow-full-0.05.pgm",
    "chars": 29784,
    "preview": "P5\n# CREATOR: GIMP PNM Filter Version 1.1\n1165 945\n255\nLͺ(̺͑ͳ0͡XuY\u001e5t͂L\u0001Şyyͫ&{b1xU%B͇Yͩͱ͈ͽ\\|\u0018͂K]ͿˠjR;#͡MVͱx_рwmEɌmn}Sͩ\\ݹ"
  },
  {
    "path": "src/navigation_tutorials/navigation_stage/stage_config/worlds/willow-pr2-2.5cm.world",
    "chars": 1116,
    "preview": "define block model\n(\n  size [0.500 0.500 0.750]\n  gui_nose 0\n)\n\ndefine topurg ranger\n(\n  sensor(\n    range_max 30.0\n    "
  },
  {
    "path": "src/navigation_tutorials/navigation_stage/stage_config/worlds/willow-pr2-5cm.world",
    "chars": 1109,
    "preview": "define block model\n(\n  size [0.5 0.5 0.75]\n  gui_nose 0\n)\n\ndefine topurg ranger\n(\n  sensor(\n    range_max 30.0\n    fov 2"
  },
  {
    "path": "src/navigation_tutorials/navigation_stage/stage_config/worlds/willow-pr2-multi.world",
    "chars": 1168,
    "preview": "define block model\n(\n  size [0.5 0.5 0.5]\n  gui_nose 0\n)\n\ndefine topurg ranger\n(\n  sensor(\n    range_max 30.0\n    fov 27"
  },
  {
    "path": "src/navigation_tutorials/navigation_stage/stage_config/worlds/willow-pr2.world",
    "chars": 1100,
    "preview": "define block model\n(\n  size [0.5 0.5 0.5]\n  gui_nose 0\n)\n\ndefine topurg ranger\n(\n  sensor(\n    range_max 30.0\n    fov 27"
  },
  {
    "path": "src/navigation_tutorials/navigation_tutorials/CMakeLists.txt",
    "chars": 119,
    "preview": "cmake_minimum_required(VERSION 2.8.3)\nproject(navigation_tutorials)\nfind_package(catkin REQUIRED)\ncatkin_metapackage()\n"
  },
  {
    "path": "src/navigation_tutorials/navigation_tutorials/package.xml",
    "chars": 958,
    "preview": "<package>\n  <name>navigation_tutorials</name>\n  <version>0.2.3</version>\n  <description>\n    Navigation related tutorial"
  },
  {
    "path": "src/navigation_tutorials/odometry_publisher_tutorial/CMakeLists.txt",
    "chars": 837,
    "preview": "cmake_minimum_required(VERSION 2.8.3)\nproject(odometry_publisher_tutorial)\n\nfind_package(catkin REQUIRED COMPONENTS nav_"
  },
  {
    "path": "src/navigation_tutorials/odometry_publisher_tutorial/package.xml",
    "chars": 841,
    "preview": "<?xml version=\"1.0\"?>\n<package>\n  <name>odometry_publisher_tutorial</name>\n  <version>0.2.3</version>\n  <description>The"
  },
  {
    "path": "src/navigation_tutorials/odometry_publisher_tutorial/src/odometry_publisher.cpp",
    "chars": 3996,
    "preview": "/*********************************************************************\n*\n* Software License Agreement (BSD License)\n*\n* "
  },
  {
    "path": "src/navigation_tutorials/point_cloud_publisher_tutorial/CMakeLists.txt",
    "chars": 867,
    "preview": "cmake_minimum_required(VERSION 2.8.3)\nproject(point_cloud_publisher_tutorial)\n\nfind_package(catkin REQUIRED COMPONENTS s"
  },
  {
    "path": "src/navigation_tutorials/point_cloud_publisher_tutorial/package.xml",
    "chars": 792,
    "preview": "<?xml version=\"1.0\"?>\n<package>\n  <name>point_cloud_publisher_tutorial</name>\n  <version>0.2.3</version>\n  <description>"
  },
  {
    "path": "src/navigation_tutorials/point_cloud_publisher_tutorial/src/point_cloud_publisher.cpp",
    "chars": 2811,
    "preview": "/*********************************************************************\n*\n* Software License Agreement (BSD License)\n*\n* "
  },
  {
    "path": "src/navigation_tutorials/robot_setup_tf_tutorial/CMakeLists.txt",
    "chars": 1277,
    "preview": "cmake_minimum_required(VERSION 2.8.3)\nproject(robot_setup_tf_tutorial)\n\nfind_package(catkin REQUIRED COMPONENTS geometry"
  },
  {
    "path": "src/navigation_tutorials/robot_setup_tf_tutorial/manifest.xml",
    "chars": 487,
    "preview": "<package>\n  <description brief=\"robot_setup_tf\">\n\n     robot_setup_tf\n\n  </description>\n  <author>Eitan Marder-Eppstein<"
  },
  {
    "path": "src/navigation_tutorials/robot_setup_tf_tutorial/package.xml",
    "chars": 839,
    "preview": "<?xml version=\"1.0\"?>\n<package>\n  <name>robot_setup_tf_tutorial</name>\n  <version>0.2.3</version>\n  <description>The rob"
  },
  {
    "path": "src/navigation_tutorials/robot_setup_tf_tutorial/src/tf_broadcaster.cpp",
    "chars": 2426,
    "preview": "/*********************************************************************\n*\n* Software License Agreement (BSD License)\n*\n* "
  },
  {
    "path": "src/navigation_tutorials/robot_setup_tf_tutorial/src/tf_listener.cpp",
    "chars": 3287,
    "preview": "/*********************************************************************\n*\n* Software License Agreement (BSD License)\n*\n* "
  },
  {
    "path": "src/navigation_tutorials/roomba_stage/CMakeLists.txt",
    "chars": 475,
    "preview": "cmake_minimum_required(VERSION 2.8.3)\nproject(roomba_stage)\n\n# Find catkin\nfind_package(catkin REQUIRED)\n\ncatkin_package"
  },
  {
    "path": "src/navigation_tutorials/roomba_stage/manifest.xml",
    "chars": 245,
    "preview": "<package>\n  <description brief=\"roomba_stage\">\n\n     roomba_stage\n\n  </description>\n  <author>Gonçalo Cabrita</author>\n "
  },
  {
    "path": "src/navigation_tutorials/roomba_stage/maps/lse_arena.yaml",
    "chars": 133,
    "preview": "image: lse_arena.pgm\nresolution: 0.050000\norigin: [0.000000, 0.000000, 0.000000]\nnegate: 0\noccupied_thresh: 0.65\nfree_th"
  },
  {
    "path": "src/navigation_tutorials/roomba_stage/move_base_lse_arena.launch",
    "chars": 1355,
    "preview": "<launch>\n  <master auto=\"start\"/>\n\n  <node pkg=\"stage_ros\" type=\"stageros\" name=\"stageros\" args=\"$(optenv ROS_STAGE_GRAP"
  },
  {
    "path": "src/navigation_tutorials/roomba_stage/package.xml",
    "chars": 735,
    "preview": "<?xml version=\"1.0\"?>\n<package>\n  <name>roomba_stage</name>\n  <version>0.2.3</version>\n  <description>The roomba_stage p"
  },
  {
    "path": "src/navigation_tutorials/roomba_stage/params/amcl_roomba.launch",
    "chars": 1662,
    "preview": "<launch>\n<node pkg=\"amcl\" type=\"amcl\" name=\"amcl\" args=\"scan:=/base_scan\">\n\n  <param name=\"initial_pose_x\" value=\"1.00\"/"
  },
  {
    "path": "src/navigation_tutorials/roomba_stage/params/base_local_planner_params.yaml",
    "chars": 456,
    "preview": "controller_frequency: 5.0\nTrajectoryPlannerROS:\n  max_vel_x: 0.20\n  min_vel_x: 0.10\n  max_rotational_vel: 1.5\n  min_in_p"
  },
  {
    "path": "src/navigation_tutorials/roomba_stage/params/costmap_common_params.yaml",
    "chars": 369,
    "preview": "map_type: voxel\nz_voxels: 10\nunknown_threshold: 8\n\nobstacle_range: 2.5\nraytrace_range: 3.0\nrobot_radius: 0.17\n#footprint"
  },
  {
    "path": "src/navigation_tutorials/roomba_stage/params/global_costmap_params.yaml",
    "chars": 140,
    "preview": "global_costmap:\n   global_frame: /odom\n   robot_base_frame: /base_link\n   update_frequency: 3.0\n   publish_frequency: 0."
  },
  {
    "path": "src/navigation_tutorials/roomba_stage/params/local_costmap_params.yaml",
    "chars": 215,
    "preview": "local_costmap:\n   global_frame: /odom\n   robot_base_frame: /base_link\n   update_frequency: 3.0\n   publish_frequency: 2.0"
  },
  {
    "path": "src/navigation_tutorials/roomba_stage/params/local_costmap_params_2.yaml",
    "chars": 216,
    "preview": "global_costmap:\n   global_frame: /odom\n   robot_base_frame: /base_link\n   update_frequency: 3.0\n   publish_frequency: 2."
  },
  {
    "path": "src/navigation_tutorials/roomba_stage/roomba_lse_arena.world",
    "chars": 1933,
    "preview": "# lse-roomba.world - basic world file for the roomba\n# Authors: Gonçalo Cabrita\n\ndefine hokuyo ranger\n(\n  sensor(\n      "
  },
  {
    "path": "src/navigation_tutorials/roomba_stage/roomba_stage.rviz",
    "chars": 5606,
    "preview": "Panels:\n  - Class: rviz/Displays\n    Help Height: 78\n    Name: Displays\n    Property Tree Widget:\n      Expanded:\n      "
  },
  {
    "path": "src/navigation_tutorials/simple_navigation_goals_tutorial/CMakeLists.txt",
    "chars": 873,
    "preview": "cmake_minimum_required(VERSION 2.8.3)\nproject(simple_navigation_goals_tutorial)\n\nfind_package(catkin REQUIRED COMPONENTS"
  },
  {
    "path": "src/navigation_tutorials/simple_navigation_goals_tutorial/package.xml",
    "chars": 946,
    "preview": "<?xml version=\"1.0\"?>\n<package>\n  <name>simple_navigation_goals_tutorial</name>\n  <version>0.2.3</version>\n  <descriptio"
  },
  {
    "path": "src/navigation_tutorials/simple_navigation_goals_tutorial/src/simple_navigation_goals.cpp",
    "chars": 3181,
    "preview": "/*********************************************************************\n*\n* Software License Agreement (BSD License)\n*\n* "
  },
  {
    "path": "src/rf2o_laser_odometry/CMakeLists.txt",
    "chars": 2374,
    "preview": "PROJECT(rf2o_laser_odometry)\n\nCMAKE_MINIMUM_REQUIRED(VERSION 3.3)\n# Require C++17\n\nif(${CMAKE_VERSION} VERSION_LESS \"3.8"
  },
  {
    "path": "src/rf2o_laser_odometry/LICENSE",
    "chars": 35141,
    "preview": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
  },
  {
    "path": "src/rf2o_laser_odometry/README.md",
    "chars": 1396,
    "preview": "# rf2o_laser_odometry\nEstimation of 2D odometry based on planar laser scans. Useful for mobile robots with innacurate ba"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CATKIN_IGNORE",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeCache.txt",
    "chars": 43264,
    "preview": "# This is the CMakeCache file.\n# For build in directory: /home/zn/racecar/src/rf2o_laser_odometry/cmake-build-debug\n# It"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/3.9.6/CMakeCCompiler.cmake",
    "chars": 2176,
    "preview": "set(CMAKE_C_COMPILER \"/usr/bin/cc\")\nset(CMAKE_C_COMPILER_ARG1 \"\")\nset(CMAKE_C_COMPILER_ID \"GNU\")\nset(CMAKE_C_COMPILER_VE"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/3.9.6/CMakeCXXCompiler.cmake",
    "chars": 4804,
    "preview": "set(CMAKE_CXX_COMPILER \"/usr/bin/c++\")\nset(CMAKE_CXX_COMPILER_ARG1 \"\")\nset(CMAKE_CXX_COMPILER_ID \"GNU\")\nset(CMAKE_CXX_CO"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/3.9.6/CMakeSystem.cmake",
    "chars": 402,
    "preview": "set(CMAKE_HOST_SYSTEM \"Linux-4.13.0-38-generic\")\nset(CMAKE_HOST_SYSTEM_NAME \"Linux\")\nset(CMAKE_HOST_SYSTEM_VERSION \"4.13"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/3.9.6/CompilerIdC/CMakeCCompilerId.c",
    "chars": 17086,
    "preview": "#ifdef __cplusplus\n# error \"A C++ compiler has been selected for C.\"\n#endif\n\n#if defined(__18CXX)\n# define ID_VOID_MAIN\n"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/3.9.6/CompilerIdCXX/CMakeCXXCompilerId.cpp",
    "chars": 16539,
    "preview": "/* This source file must have a .cpp extension so that all C++ compilers\n   recognize the extension without flags.  Borl"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/CMakeDirectoryInformation.cmake",
    "chars": 673,
    "preview": "# CMAKE generated file: DO NOT EDIT!\n# Generated by \"Unix Makefiles\" Generator, CMake Version 3.9\n\n# Relative path conve"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/CMakeError.log",
    "chars": 3042,
    "preview": "Determining if the pthread_create exist failed with the following output:\nChange Dir: /home/zn/racecar/src/rf2o_laser_od"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/CMakeOutput.log",
    "chars": 48642,
    "preview": "The system is: Linux - 4.13.0-38-generic - x86_64\nCompiling the C compiler identification source file \"CMakeCCompilerId."
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/CMakeRuleHashes.txt",
    "chars": 93,
    "preview": "# Hashes of file build rules.\n2c614c39f77a5e21e00ecd0f46df5d82 CMakeFiles/clean_test_results\n"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/Makefile.cmake",
    "chars": 24145,
    "preview": "# CMAKE generated file: DO NOT EDIT!\n# Generated by \"Unix Makefiles\" Generator, CMake Version 3.9\n\n# The generator used "
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/Makefile2",
    "chars": 100014,
    "preview": "# CMAKE generated file: DO NOT EDIT!\n# Generated by \"Unix Makefiles\" Generator, CMake Version 3.9\n\n# Default target exec"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/Progress/2",
    "chars": 5,
    "preview": "empty"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/Progress/count.txt",
    "chars": 2,
    "preview": "2\n"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/TargetDirectories.txt",
    "chars": 6480,
    "preview": "/home/zn/racecar/src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/install/local.dir\n/home/zn/racecar/src/rf2o_laser_"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_generate_messages_cpp.dir/DependInfo.cmake",
    "chars": 316,
    "preview": "# The set of languages for which implicit dependencies are needed:\nset(CMAKE_DEPENDS_LANGUAGES\n  )\n# The set of files fo"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_generate_messages_cpp.dir/build.make",
    "chars": 2549,
    "preview": "# CMAKE generated file: DO NOT EDIT!\n# Generated by \"Unix Makefiles\" Generator, CMake Version 3.9\n\n# Delete rule output "
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_generate_messages_cpp.dir/cmake_clean.cmake",
    "chars": 175,
    "preview": "\n# Per-language clean rules from dependency scanning.\nforeach(lang )\n  include(CMakeFiles/actionlib_generate_messages_cp"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_generate_messages_cpp.dir/progress.make",
    "chars": 1,
    "preview": "\n"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_generate_messages_eus.dir/DependInfo.cmake",
    "chars": 316,
    "preview": "# The set of languages for which implicit dependencies are needed:\nset(CMAKE_DEPENDS_LANGUAGES\n  )\n# The set of files fo"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_generate_messages_eus.dir/build.make",
    "chars": 2549,
    "preview": "# CMAKE generated file: DO NOT EDIT!\n# Generated by \"Unix Makefiles\" Generator, CMake Version 3.9\n\n# Delete rule output "
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_generate_messages_eus.dir/cmake_clean.cmake",
    "chars": 175,
    "preview": "\n# Per-language clean rules from dependency scanning.\nforeach(lang )\n  include(CMakeFiles/actionlib_generate_messages_eu"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_generate_messages_eus.dir/progress.make",
    "chars": 1,
    "preview": "\n"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_generate_messages_lisp.dir/DependInfo.cmake",
    "chars": 316,
    "preview": "# The set of languages for which implicit dependencies are needed:\nset(CMAKE_DEPENDS_LANGUAGES\n  )\n# The set of files fo"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_generate_messages_lisp.dir/build.make",
    "chars": 2563,
    "preview": "# CMAKE generated file: DO NOT EDIT!\n# Generated by \"Unix Makefiles\" Generator, CMake Version 3.9\n\n# Delete rule output "
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_generate_messages_lisp.dir/cmake_clean.cmake",
    "chars": 176,
    "preview": "\n# Per-language clean rules from dependency scanning.\nforeach(lang )\n  include(CMakeFiles/actionlib_generate_messages_li"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_generate_messages_lisp.dir/progress.make",
    "chars": 1,
    "preview": "\n"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_generate_messages_nodejs.dir/DependInfo.cmake",
    "chars": 316,
    "preview": "# The set of languages for which implicit dependencies are needed:\nset(CMAKE_DEPENDS_LANGUAGES\n  )\n# The set of files fo"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_generate_messages_nodejs.dir/build.make",
    "chars": 2591,
    "preview": "# CMAKE generated file: DO NOT EDIT!\n# Generated by \"Unix Makefiles\" Generator, CMake Version 3.9\n\n# Delete rule output "
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_generate_messages_nodejs.dir/cmake_clean.cmake",
    "chars": 178,
    "preview": "\n# Per-language clean rules from dependency scanning.\nforeach(lang )\n  include(CMakeFiles/actionlib_generate_messages_no"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_generate_messages_nodejs.dir/progress.make",
    "chars": 1,
    "preview": "\n"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_generate_messages_py.dir/DependInfo.cmake",
    "chars": 316,
    "preview": "# The set of languages for which implicit dependencies are needed:\nset(CMAKE_DEPENDS_LANGUAGES\n  )\n# The set of files fo"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_generate_messages_py.dir/build.make",
    "chars": 2535,
    "preview": "# CMAKE generated file: DO NOT EDIT!\n# Generated by \"Unix Makefiles\" Generator, CMake Version 3.9\n\n# Delete rule output "
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_generate_messages_py.dir/cmake_clean.cmake",
    "chars": 174,
    "preview": "\n# Per-language clean rules from dependency scanning.\nforeach(lang )\n  include(CMakeFiles/actionlib_generate_messages_py"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_generate_messages_py.dir/progress.make",
    "chars": 1,
    "preview": "\n"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_msgs_generate_messages_cpp.dir/DependInfo.cmake",
    "chars": 316,
    "preview": "# The set of languages for which implicit dependencies are needed:\nset(CMAKE_DEPENDS_LANGUAGES\n  )\n# The set of files fo"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_msgs_generate_messages_cpp.dir/build.make",
    "chars": 2619,
    "preview": "# CMAKE generated file: DO NOT EDIT!\n# Generated by \"Unix Makefiles\" Generator, CMake Version 3.9\n\n# Delete rule output "
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_msgs_generate_messages_cpp.dir/cmake_clean.cmake",
    "chars": 180,
    "preview": "\n# Per-language clean rules from dependency scanning.\nforeach(lang )\n  include(CMakeFiles/actionlib_msgs_generate_messag"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_msgs_generate_messages_cpp.dir/progress.make",
    "chars": 1,
    "preview": "\n"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_msgs_generate_messages_eus.dir/DependInfo.cmake",
    "chars": 316,
    "preview": "# The set of languages for which implicit dependencies are needed:\nset(CMAKE_DEPENDS_LANGUAGES\n  )\n# The set of files fo"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_msgs_generate_messages_eus.dir/build.make",
    "chars": 2619,
    "preview": "# CMAKE generated file: DO NOT EDIT!\n# Generated by \"Unix Makefiles\" Generator, CMake Version 3.9\n\n# Delete rule output "
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_msgs_generate_messages_eus.dir/cmake_clean.cmake",
    "chars": 180,
    "preview": "\n# Per-language clean rules from dependency scanning.\nforeach(lang )\n  include(CMakeFiles/actionlib_msgs_generate_messag"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_msgs_generate_messages_eus.dir/progress.make",
    "chars": 1,
    "preview": "\n"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_msgs_generate_messages_lisp.dir/DependInfo.cmake",
    "chars": 316,
    "preview": "# The set of languages for which implicit dependencies are needed:\nset(CMAKE_DEPENDS_LANGUAGES\n  )\n# The set of files fo"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_msgs_generate_messages_lisp.dir/build.make",
    "chars": 2633,
    "preview": "# CMAKE generated file: DO NOT EDIT!\n# Generated by \"Unix Makefiles\" Generator, CMake Version 3.9\n\n# Delete rule output "
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_msgs_generate_messages_lisp.dir/cmake_clean.cmake",
    "chars": 181,
    "preview": "\n# Per-language clean rules from dependency scanning.\nforeach(lang )\n  include(CMakeFiles/actionlib_msgs_generate_messag"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_msgs_generate_messages_lisp.dir/progress.make",
    "chars": 1,
    "preview": "\n"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_msgs_generate_messages_nodejs.dir/DependInfo.cmake",
    "chars": 316,
    "preview": "# The set of languages for which implicit dependencies are needed:\nset(CMAKE_DEPENDS_LANGUAGES\n  )\n# The set of files fo"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_msgs_generate_messages_nodejs.dir/build.make",
    "chars": 2661,
    "preview": "# CMAKE generated file: DO NOT EDIT!\n# Generated by \"Unix Makefiles\" Generator, CMake Version 3.9\n\n# Delete rule output "
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_msgs_generate_messages_nodejs.dir/cmake_clean.cmake",
    "chars": 183,
    "preview": "\n# Per-language clean rules from dependency scanning.\nforeach(lang )\n  include(CMakeFiles/actionlib_msgs_generate_messag"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_msgs_generate_messages_nodejs.dir/progress.make",
    "chars": 1,
    "preview": "\n"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_msgs_generate_messages_py.dir/DependInfo.cmake",
    "chars": 316,
    "preview": "# The set of languages for which implicit dependencies are needed:\nset(CMAKE_DEPENDS_LANGUAGES\n  )\n# The set of files fo"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_msgs_generate_messages_py.dir/build.make",
    "chars": 2605,
    "preview": "# CMAKE generated file: DO NOT EDIT!\n# Generated by \"Unix Makefiles\" Generator, CMake Version 3.9\n\n# Delete rule output "
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_msgs_generate_messages_py.dir/cmake_clean.cmake",
    "chars": 179,
    "preview": "\n# Per-language clean rules from dependency scanning.\nforeach(lang )\n  include(CMakeFiles/actionlib_msgs_generate_messag"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/actionlib_msgs_generate_messages_py.dir/progress.make",
    "chars": 1,
    "preview": "\n"
  },
  {
    "path": "src/rf2o_laser_odometry/cmake-build-debug/CMakeFiles/clean_test_results.dir/DependInfo.cmake",
    "chars": 316,
    "preview": "# The set of languages for which implicit dependencies are needed:\nset(CMAKE_DEPENDS_LANGUAGES\n  )\n# The set of files fo"
  }
]

// ... and 321 more files (download for full content)

About this extraction

This page contains the full source code of the ART-Robot-Release/racecar GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 521 files (73.7 MB), approximately 648.3k tokens, and a symbol index with 215 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!