diff --git a/src/gc_bringup/CMakeLists.txt b/src/gc_bringup/CMakeLists.txt deleted file mode 100644 index e6de6f1..0000000 --- a/src/gc_bringup/CMakeLists.txt +++ /dev/null @@ -1,29 +0,0 @@ -cmake_minimum_required(VERSION 3.5) -project(gc_bringup) - -if(NOT CMAKE_C_STANDARD) - set(CMAKE_C_STANDARD 99) -endif() - -if(NOT CMAKE_CXX_STANDARD) - set(CMAKE_CXX_STANDARD 17) -endif() - -find_package(ament_cmake REQUIRED) - -install( - DIRECTORY launch config maps rviz - DESTINATION share/${PROJECT_NAME} -) - -install(PROGRAMS - scripts/nav_goal.py - DESTINATION lib/${PROJECT_NAME} -) - -if(BUILD_TESTING) - find_package(ament_lint_auto REQUIRED) - ament_lint_auto_find_test_dependencies() -endif() - -ament_package() diff --git a/src/gc_bringup/README.md b/src/gc_bringup/README.md deleted file mode 100644 index 021d839..0000000 --- a/src/gc_bringup/README.md +++ /dev/null @@ -1,77 +0,0 @@ -# gc_bringup - -GC 机器人启动包 — 阿克曼底盘 + 激光雷达 + SLAM 建图 + AMCL 导航 - -## 📁 目录结构 - -``` -gc_bringup/ -├── launch/ -│ ├── slam_mapping.launch.py # SLAM 在线建图 -│ ├── navigation.launch.py # AMCL 定位 + Nav2 导航 -│ └── navigation_slam.launch.py # slam_toolbox 定位 + Nav2 导航 -├── config/ -│ ├── nav2_params.yaml # Nav2 参数(阿克曼配置) -│ ├── mapper_params_online_async.yaml # slam_toolbox 建图参数 -│ └── mapper_params_localization.yaml # slam_toolbox 定位参数 -├── maps/ # 地图文件存放 -├── rviz/ # RViz2 配置文件 -├── CMakeLists.txt -└── package.xml -``` - -## 🚀 使用方式 - -### 1. 编译 -```bash -cd ~/test_ws -colcon build --packages-select gc_bringup -source install/setup.bash -``` - -### 2. SLAM 建图 -启动 Gazebo + 机器人 + slam_toolbox 在线异步建图: -```bash -ros2 launch gc_bringup slam_mapping.launch.py -``` - -在 RViz 中使用 "2D Nav Goal" 工具驱动机器人探索环境建图。 - -保存地图: -```bash -ros2 run nav2_map_server map_saver_cli -f ~/test_ws/src/gc_bringup/maps/my_map -``` - -### 3. AMCL 导航(推荐) -使用建好的地图进行 AMCL 定位 + Nav2 导航: -```bash -ros2 launch gc_bringup navigation.launch.py -``` - -操作步骤: -1. 在 RViz 中使用 "2D Pose Estimate" 设置初始位姿 -2. 使用 "2D Nav Goal" 设置导航目标 - -### 4. slam_toolbox 定位导航 -使用 slam_toolbox 定位模式(需要 .posegraph 文件): -```bash -ros2 launch gc_bringup navigation_slam.launch.py -``` - -## 🔧 启动参数 - -| 参数 | 默认值 | 说明 | -|------|--------|------| -| `use_sim_time` | `true` | 使用仿真时间 | -| `use_gazebo` | `true` | 启动 Gazebo | -| `use_rviz` | `true` | 启动 RViz2 | -| `world` | `origincar_description/world/gc_world.world` | Gazebo 世界文件 | -| `map` | `gc_bringup/maps/my_map.yaml` | 导航用地图 | - -## 🤖 机器人说明 - -- **底盘类型**: 阿克曼转向 (Ackermann) -- **传感器**: 360° 激光雷达 (LiDAR)、IMU -- **控制器**: MPPI (Ackermann 运动模型) -- **规划器**: Smac Hybrid (Reeds-Shepp,支持倒车) -- **定位**: AMCL (自适应蒙特卡洛定位) 或 slam_toolbox 定位模式 diff --git a/src/gc_bringup/config/mapper_params_localization.yaml b/src/gc_bringup/config/mapper_params_localization.yaml deleted file mode 100644 index 3ff9cfd..0000000 --- a/src/gc_bringup/config/mapper_params_localization.yaml +++ /dev/null @@ -1,60 +0,0 @@ -# ============================================================================= -# slam_toolbox 定位模式参数 -# 用于在已有地图上进行定位(替代 AMCL) -# ============================================================================= -slam_toolbox: - ros__parameters: - # 基本设置 - solver_plugin: solver_plugins::CeresSolver - ceres_linear_solver: SPARSE_NORMAL_CHOLESKY - ceres_preconditioner: SCHUR_JACOBI - ceres_trust_strategy: LEVENBERG_MARQUARDT - ceres_dogleg_type: TRADITIONAL_DOGLEG - ceres_loss_function: None - - # ROS 参数 - odom_frame: odom - map_frame: map - base_frame: base_footprint - scan_topic: /scan - use_sim_time: True - mode: localization - - # 调试 - debug_logging: false - throttle_scans: 1 - transform_publish_period: 0.02 - map_update_interval: 10.0 - resolution: 0.05 - max_laser_range: 3.5 - minimum_time_interval: 0.5 - transform_timeout: 0.2 - tf_buffer_duration: 30.0 - stack_size_to_use: 40000000 - - # 定位模式不需要回环检测 - loop_search_maximum_distance: 3.0 - loop_match_minimum_chain_size: 10 - loop_match_maximum_variance_coarse: 3.0 - loop_match_minimum_response_coarse: 0.35 - loop_match_minimum_response_fine: 0.45 - - # 扫描匹配 - correlation_search_space_dimension: 0.5 - correlation_search_space_resolution: 0.01 - correlation_search_space_smear_deviation: 0.1 - - # 回环闭合 - loop_search_space_dimension: 8.0 - loop_search_space_resolution: 0.05 - loop_search_space_smear_deviation: 0.03 - - # 扫描匹配器 - distance_variance_penalty: 0.5 - angle_variance_penalty: 1.0 - fine_search_angle_offset: 0.00349 - coarse_search_angle_offset: 0.349 - coarse_angle_resolution: 0.0349 - minimum_angle_penalty: 0.9 - minimum_distance_penalty: 0.5 - use_response_expansion: true diff --git a/src/gc_bringup/config/mapper_params_online_async.yaml b/src/gc_bringup/config/mapper_params_online_async.yaml deleted file mode 100644 index 03e6cb5..0000000 --- a/src/gc_bringup/config/mapper_params_online_async.yaml +++ /dev/null @@ -1,61 +0,0 @@ -# ============================================================================= -# slam_toolbox 在线异步建图参数 -# 用于实时 SLAM 建图 -# ============================================================================= -slam_toolbox: - ros__parameters: - # 基本设置 - solver_plugin: solver_plugins::CeresSolver - ceres_linear_solver: SPARSE_NORMAL_CHOLESKY - ceres_preconditioner: SCHUR_JACOBI - ceres_trust_strategy: LEVENBERG_MARQUARDT - ceres_dogleg_type: TRADITIONAL_DOGLEG - ceres_loss_function: None - - # ROS 参数 - odom_frame: odom - map_frame: map - base_frame: base_footprint - scan_topic: /scan - use_sim_time: True - mode: mapping - - # 调试 - debug_logging: false - throttle_scans: 1 - transform_publish_period: 0.02 - map_update_interval: 5.0 - resolution: 0.05 - max_laser_range: 3.5 - minimum_time_interval: 0.5 - transform_timeout: 0.2 - tf_buffer_duration: 30.0 - stack_size_to_use: 40000000 - enable_interactive_mode: true - - # 回环检测 - loop_search_maximum_distance: 3.0 - loop_match_minimum_chain_size: 10 - loop_match_maximum_variance_coarse: 3.0 - loop_match_minimum_response_coarse: 0.35 - loop_match_minimum_response_fine: 0.45 - - # 扫描匹配 - correlation_search_space_dimension: 0.5 - correlation_search_space_resolution: 0.01 - correlation_search_space_smear_deviation: 0.1 - - # 回环闭合 - loop_search_space_dimension: 8.0 - loop_search_space_resolution: 0.05 - loop_search_space_smear_deviation: 0.03 - - # 扫描匹配器 - distance_variance_penalty: 0.5 - angle_variance_penalty: 1.0 - fine_search_angle_offset: 0.00349 - coarse_search_angle_offset: 0.349 - coarse_angle_resolution: 0.0349 - minimum_angle_penalty: 0.9 - minimum_distance_penalty: 0.5 - use_response_expansion: true diff --git a/src/gc_bringup/config/nav2_params.yaml b/src/gc_bringup/config/nav2_params.yaml deleted file mode 100644 index 72dcd79..0000000 --- a/src/gc_bringup/config/nav2_params.yaml +++ /dev/null @@ -1,411 +0,0 @@ -# ============================================================================= -# Nav2 参数 — 阿克曼底盘 + AMCL + MPPI -# ============================================================================= - -amcl: - ros__parameters: - use_sim_time: True - alpha1: 0.2 - alpha2: 0.2 - alpha3: 0.2 - alpha4: 0.2 - alpha5: 0.2 - base_frame_id: "base_footprint" - beam_skip_distance: 0.5 - beam_skip_error_threshold: 0.9 - beam_skip_threshold: 0.3 - do_beamskip: false - global_frame_id: "map" - lambda_short: 0.1 - laser_likelihood_max_dist: 2.0 - laser_max_range: 100.0 - laser_min_range: -1.0 - laser_model_type: "likelihood_field" - max_beams: 60 - max_particles: 2000 - min_particles: 500 - odom_frame_id: "odom" - pf_err: 0.05 - pf_z: 0.99 - recovery_alpha_fast: 0.0 - recovery_alpha_slow: 0.0 - resample_interval: 1 - # ★ 自动设定初始位姿 — 不设置的话 map→odom 的 TF 不会发布 - set_initial_pose: true - initial_pose: - x: 0.0 - y: 0.0 - z: 0.0 - yaw: 0.0 - robot_model_type: "nav2_amcl::DifferentialMotionModel" - save_pose_rate: 0.5 - sigma_hit: 0.2 - tf_broadcast: true - transform_tolerance: 10.0 - update_min_a: 0.2 - update_min_d: 0.25 - z_hit: 0.5 - z_max: 0.05 - z_rand: 0.5 - z_short: 0.05 - scan_topic: scan - -amcl_map_client: - ros__parameters: - use_sim_time: True - -amcl_rclcpp_node: - ros__parameters: - use_sim_time: True - -bt_navigator: - ros__parameters: - use_sim_time: True - global_frame: map - robot_base_frame: base_footprint - odom_topic: /odom - bt_loop_duration: 10 - default_server_timeout: 20 - plugin_lib_names: - - nav2_compute_path_to_pose_action_bt_node - - nav2_compute_path_through_poses_action_bt_node - - nav2_smooth_path_action_bt_node - - nav2_follow_path_action_bt_node - - nav2_spin_action_bt_node - - nav2_wait_action_bt_node - - nav2_back_up_action_bt_node - - nav2_drive_on_heading_bt_node - - nav2_clear_costmap_service_bt_node - - nav2_is_stuck_condition_bt_node - - nav2_goal_reached_condition_bt_node - - nav2_goal_updated_condition_bt_node - - nav2_globally_updated_goal_condition_bt_node - - nav2_is_path_valid_condition_bt_node - - nav2_initial_pose_received_condition_bt_node - - nav2_reinitialize_global_localization_service_bt_node - - nav2_rate_controller_bt_node - - nav2_distance_controller_bt_node - - nav2_speed_controller_bt_node - - nav2_truncate_path_action_bt_node - - nav2_truncate_path_local_action_bt_node - - nav2_goal_updater_node_bt_node - - nav2_recovery_node_bt_node - - nav2_pipeline_sequence_bt_node - - nav2_round_robin_node_bt_node - - nav2_transform_available_condition_bt_node - - nav2_time_expired_condition_bt_node - - nav2_path_expiring_timer_condition - - nav2_distance_traveled_condition_bt_node - - nav2_single_trigger_bt_node - - nav2_is_battery_low_condition_bt_node - - nav2_navigate_through_poses_action_bt_node - - nav2_navigate_to_pose_action_bt_node - - nav2_remove_passed_goals_action_bt_node - - nav2_planner_selector_bt_node - - nav2_controller_selector_bt_node - - nav2_goal_checker_selector_bt_node - - nav2_controller_cancel_bt_node - - nav2_path_longer_on_approach_bt_node - - nav2_wait_cancel_bt_node - - nav2_spin_cancel_bt_node - - nav2_back_up_cancel_bt_node - - nav2_drive_on_heading_cancel_bt_node - -bt_navigator_rclcpp_node: - ros__parameters: - use_sim_time: True - -controller_server: - ros__parameters: - use_sim_time: True - controller_frequency: 30.0 - controller_plugins: ["FollowPath"] - progress_checker: - plugin: "nav2_controller::SimpleProgressChecker" - required_movement_radius: 0.5 - movement_time_allowance: 10.0 - goal_checker: - plugin: "nav2_controller::SimpleGoalChecker" - xy_goal_tolerance: 0.25 - yaw_goal_tolerance: 0.25 - FollowPath: - plugin: "nav2_mppi_controller::MPPIController" - time_steps: 56 - model_dt: 0.05 - batch_size: 2000 - vx_std: 0.2 - vy_std: 0.0 - wz_std: 0.4 - vx_max: 0.5 - vx_min: -0.35 - vy_max: 0.0 - wz_max: 1.9 - iteration_count: 1 - temperature: 0.3 - gamma: 0.015 - motion_model: "Ackermann" - visualize: false - TrajectoryVisualizer: - trajectory_step: 5 - time_step: 3 - AckermannConstraints: - min_turning_r: 0.4 - critics: - - "ConstraintCritic" - - "CostCritic" - - "GoalCritic" - - "GoalAngleCritic" - - "PathAlignCritic" - - "PathFollowCritic" - - "PathAngleCritic" - - "PreferForwardCritic" - ConstraintCritic: - enabled: true - cost_power: 1 - cost_weight: 4.0 - GoalCritic: - enabled: true - cost_power: 1 - cost_weight: 5.0 - threshold_to_consider: 1.4 - GoalAngleCritic: - enabled: true - cost_power: 1 - cost_weight: 3.0 - threshold_to_consider: 0.5 - PreferForwardCritic: - enabled: true - cost_power: 1 - cost_weight: 5.0 - threshold_to_consider: 0.5 - CostCritic: - enabled: true - cost_power: 1 - cost_weight: 3.81 - critical_cost: 300.0 - consider_footprint: true - collision_cost: 1000000.0 - near_goal_distance: 1.0 - trajectory_point_step: 2 - PathAlignCritic: - enabled: true - cost_power: 1 - cost_weight: 14.0 - max_path_occupancy_ratio: 0.05 - trajectory_point_step: 4 - threshold_to_consider: 0.5 - offset_from_furthest: 20 - use_path_orientations: false - PathFollowCritic: - enabled: true - cost_power: 1 - cost_weight: 5.0 - offset_from_furthest: 5 - threshold_to_consider: 1.4 - PathAngleCritic: - enabled: true - cost_power: 1 - cost_weight: 2.0 - offset_from_furthest: 4 - threshold_to_consider: 0.5 - max_angle_to_furthest: 1.0 - forward_preference: true - -controller_server_rclcpp_node: - ros__parameters: - use_sim_time: True - -planner_server: - ros__parameters: - planner_plugins: ["GridBased"] - use_sim_time: True - GridBased: - plugin: "nav2_smac_planner/SmacPlannerHybrid" - downsample_costmap: false - downsampling_factor: 1 - tolerance: 0.25 - allow_unknown: true - max_iterations: 1000000 - max_on_approach_iterations: 1000 - max_planning_time: 5.0 - motion_model_for_search: "REEDS_SHEPP" - angle_quantization_bins: 72 - analytic_expansion_ratio: 3.5 - analytic_expansion_max_length: 3.0 - minimum_turning_radius: 0.40 - reverse_penalty: 2.0 - change_penalty: 0.0 - non_straight_penalty: 1.2 - cost_penalty: 2.0 - retrospective_penalty: 0.015 - lookup_table_size: 20.0 - cache_obstacle_heuristic: false - viz_expansions: false - smooth_path: True - smoother: - max_iterations: 1000 - w_smooth: 0.3 - w_data: 0.2 - tolerance: 1.0e-10 - do_refinement: true - refinement_num: 2 - -planner_server_rclcpp_node: - ros__parameters: - use_sim_time: True - -smoother_server: - ros__parameters: - use_sim_time: True - smoother_plugins: ["simple_smoother"] - simple_smoother: - plugin: "nav2_smoother::SimpleSmoother" - tolerance: 1.0e-10 - max_its: 1000 - do_refinement: True - -behavior_server: - ros__parameters: - costmap_topic: local_costmap/costmap_raw - footprint_topic: local_costmap/published_footprint - cycle_frequency: 10.0 - behavior_plugins: ["spin", "backup", "wait"] - spin: - plugin: "nav2_behaviors/Spin" - backup: - plugin: "nav2_behaviors/BackUp" - wait: - plugin: "nav2_behaviors/Wait" - global_frame: odom - robot_base_frame: base_footprint - transform_tolerance: 0.5 - use_sim_time: True - simulate_ahead_time: 2.0 - max_rotational_vel: 1.0 - min_rotational_vel: 0.4 - rotational_acc_lim: 3.2 - -behavior_server_rclcpp_node: - ros__parameters: - use_sim_time: True - -local_costmap: - local_costmap: - ros__parameters: - update_frequency: 5.0 - publish_frequency: 2.0 - transform_tolerance: 0.5 - global_frame: odom - robot_base_frame: base_footprint - use_sim_time: True - rolling_window: true - width: 3 - height: 3 - resolution: 0.05 - footprint: "[[0.14, 0.085], [0.14, -0.085], [-0.14, -0.085], [-0.14, 0.085]]" - footprint_padding: 0.02 - plugins: ["voxel_layer", "inflation_layer"] - inflation_layer: - plugin: "nav2_costmap_2d::InflationLayer" - cost_scaling_factor: 3.0 - inflation_radius: 0.55 - voxel_layer: - plugin: "nav2_costmap_2d::VoxelLayer" - enabled: True - publish_voxel_map: True - origin_z: 0.0 - z_resolution: 0.05 - z_voxels: 16 - max_obstacle_height: 2.0 - mark_threshold: 0 - observation_sources: scan - scan: - topic: /scan - max_obstacle_height: 2.0 - clearing: True - marking: True - data_type: "LaserScan" - raytrace_max_range: 3.0 - raytrace_min_range: 0.0 - obstacle_max_range: 2.5 - obstacle_min_range: 0.0 - static_layer: - map_subscribe_transient_local: True - always_send_full_costmap: True - local_costmap_client: - ros__parameters: - use_sim_time: True - local_costmap_rclcpp_node: - ros__parameters: - use_sim_time: True - -global_costmap: - global_costmap: - ros__parameters: - use_sim_time: True - transform_tolerance: 0.5 - update_frequency: 1.0 - publish_frequency: 1.0 - global_frame: map - robot_base_frame: base_footprint - footprint: "[[0.14, 0.085], [0.14, -0.085], [-0.14, -0.085], [-0.14, 0.085]]" - footprint_padding: 0.02 - resolution: 0.05 - track_unknown_space: true - plugins: ["static_layer", "obstacle_layer", "inflation_layer"] - obstacle_layer: - plugin: "nav2_costmap_2d::ObstacleLayer" - enabled: True - observation_sources: scan - scan: - topic: /scan - max_obstacle_height: 2.0 - clearing: True - marking: True - data_type: "LaserScan" - raytrace_max_range: 3.0 - raytrace_min_range: 0.0 - obstacle_max_range: 2.5 - obstacle_min_range: 0.0 - static_layer: - plugin: "nav2_costmap_2d::StaticLayer" - map_subscribe_transient_local: True - inflation_layer: - plugin: "nav2_costmap_2d::InflationLayer" - cost_scaling_factor: 3.0 - inflation_radius: 0.55 - always_send_full_costmap: True - global_costmap_client: - ros__parameters: - use_sim_time: True - global_costmap_rclcpp_node: - ros__parameters: - use_sim_time: True - -map_server: - ros__parameters: - use_sim_time: True - yaml_filename: "" - -map_saver: - ros__parameters: - use_sim_time: True - save_map_timeout: 5.0 - free_thresh_default: 0.25 - occupied_thresh_default: 0.65 - map_subscribe_transient_local: True - -robot_state_publisher: - ros__parameters: - use_sim_time: True - -waypoint_follower: - ros__parameters: - loop_rate: 20 - use_sim_time: True - stop_on_failure: false - waypoint_task_executor_plugin: "wait_at_waypoint" - wait_at_waypoint: - plugin: "nav2_waypoint_follower::WaitAtWaypoint" - enabled: True - waypoint_pause_duration: 200 diff --git a/src/gc_bringup/launch/navigation.launch.py b/src/gc_bringup/launch/navigation.launch.py deleted file mode 100644 index aa035b8..0000000 --- a/src/gc_bringup/launch/navigation.launch.py +++ /dev/null @@ -1,211 +0,0 @@ -#!/usr/bin/env python3 -# ============================================================================= -# gc_bringup — AMCL 导航模式 (直接启动 Nav2 节点) -# 启动 Gazebo + 机器人 + Nav2 (AMCL 定位) -# ============================================================================= -import os -from ament_index_python.packages import get_package_share_directory -from launch import LaunchDescription -from launch.actions import (DeclareLaunchArgument, ExecuteProcess, - TimerAction) -from launch.conditions import IfCondition -from launch.substitutions import LaunchConfiguration, Command -from launch_ros.actions import Node -from launch_ros.parameter_descriptions import ParameterValue - - -def generate_launch_description(): - bringup_dir = get_package_share_directory('gc_bringup') - origincar_dir = get_package_share_directory('origincar_description') - - # ==================== 参数 ==================== - use_sim_time = LaunchConfiguration('use_sim_time', default='true') - use_gazebo = LaunchConfiguration('use_gazebo', default='true') - use_rviz = LaunchConfiguration('use_rviz', default='false') - world = LaunchConfiguration('world', default=os.path.join( - origincar_dir, 'world', 'gc_world.world')) - map_yaml = LaunchConfiguration('map', default=os.path.join( - bringup_dir, 'maps', 'my_map.yaml')) - - declare_use_sim_time = DeclareLaunchArgument('use_sim_time', default_value='true') - declare_use_gazebo = DeclareLaunchArgument('use_gazebo', default_value='true') - declare_use_rviz = DeclareLaunchArgument('use_rviz', default_value='false') - declare_world = DeclareLaunchArgument( - 'world', default_value=os.path.join(origincar_dir, 'world', 'gc_world.world')) - declare_map = DeclareLaunchArgument( - 'map', default_value=os.path.join(bringup_dir, 'maps', 'my_map.yaml')) - - # ==================== 机器人模型 ==================== - default_model_path = os.path.join(origincar_dir, 'urdf', 'origincar.urdf') - robot_description = ParameterValue( - Command(['xacro ', default_model_path]), value_type=str) - - - # ==================== Gazebo ==================== - start_gazebo = ExecuteProcess( - condition=IfCondition(use_gazebo), - cmd=['gazebo', '--verbose', '-s', 'libgazebo_ros_init.so', - '-s', 'libgazebo_ros_factory.so', world], - output='screen') - - - - spawn_robot = Node( - condition=IfCondition(use_gazebo), - package='gazebo_ros', - executable='spawn_entity.py', - arguments=['-entity', 'mycar', '-file', default_model_path, - '-x', '0.0', '-y', '0.0', '-z', '0.1'], - output='screen') - - # ==================== TF & 机器人状态 ==================== - robot_state_publisher = Node( - package='robot_state_publisher', - executable='robot_state_publisher', - name='robot_state_publisher', - parameters=[{'robot_description': robot_description, - 'use_sim_time': True, 'publish_frequency': 30.0}], - output='screen') - - joint_state_publisher = Node( - package='joint_state_publisher', - executable='joint_state_publisher', - name='joint_state_publisher', - parameters=[{'use_sim_time': True}], output='screen') - - # ==================== Nav2 参数文件路径 ==================== - nav2_params = os.path.join(bringup_dir, 'config', 'nav2_params.yaml') - - # ==================== Map Server ==================== - map_server = Node( - package='nav2_map_server', - executable='map_server', - name='map_server', - output='screen', - parameters=[nav2_params, - {'use_sim_time': True, 'yaml_filename': map_yaml}], - ros_arguments=['-p', 'use_sim_time:=True'], - ) - - # ==================== AMCL ==================== - amcl = Node( - package='nav2_amcl', - executable='amcl', - name='amcl', - output='screen', - parameters=[nav2_params, {'use_sim_time': True}], - remappings=[('/tf', 'tf'), ('/tf_static', 'tf_static')], - ros_arguments=['-p', 'use_sim_time:=True'], - ) - - # ==================== Planner Server ==================== - planner_server = Node( - package='nav2_planner', - executable='planner_server', - name='planner_server', - output='screen', - parameters=[nav2_params, {'use_sim_time': True}], - remappings=[('/tf', 'tf'), ('/tf_static', 'tf_static')], - ros_arguments=['-p', 'use_sim_time:=True'], - ) - - # ==================== Controller Server ==================== - controller_server = Node( - package='nav2_controller', - executable='controller_server', - name='controller_server', - output='screen', - parameters=[nav2_params, {'use_sim_time': True}], - remappings=[('/tf', 'tf'), ('/tf_static', 'tf_static')], - ros_arguments=['-p', 'use_sim_time:=True'], - ) - - # ==================== Behavior Server ==================== - behavior_server = Node( - package='nav2_behaviors', - executable='behavior_server', - name='behavior_server', - output='screen', - parameters=[nav2_params, {'use_sim_time': True}], - remappings=[('/tf', 'tf'), ('/tf_static', 'tf_static')], - ros_arguments=['-p', 'use_sim_time:=True'], - ) - - - # ==================== BT Navigator ==================== - bt_navigator = Node( - package='nav2_bt_navigator', - executable='bt_navigator', - name='bt_navigator', - output='screen', - parameters=[nav2_params, {'use_sim_time': True}], - remappings=[('/tf', 'tf'), ('/tf_static', 'tf_static')], - ros_arguments=['-p', 'use_sim_time:=True'], - ) - - # ==================== Waypoint Follower ==================== - waypoint_follower = Node( - package='nav2_waypoint_follower', - executable='waypoint_follower', - name='waypoint_follower', - output='screen', - parameters=[nav2_params, {'use_sim_time': True}], - remappings=[('/tf', 'tf'), ('/tf_static', 'tf_static')], - ros_arguments=['-p', 'use_sim_time:=True'], - ) - - # ==================== Lifecycle Manager (map + amcl) ==================== - lifecycle_localization = Node( - package='nav2_lifecycle_manager', - executable='lifecycle_manager', - name='lifecycle_manager_localization', - output='screen', - parameters=[{'use_sim_time': True, 'autostart': True, - 'node_names': ['map_server', 'amcl']}], - ) - - # ==================== Lifecycle Manager (nav nodes) ==================== - lifecycle_navigation = Node( - package='nav2_lifecycle_manager', - executable='lifecycle_manager', - name='lifecycle_manager_navigation', - output='screen', - parameters=[{'use_sim_time': True, 'autostart': True, - 'node_names': ['controller_server', 'planner_server', - 'behavior_server', 'bt_navigator', - 'waypoint_follower']}], - ) - - # ==================== RViz2 (可选) ==================== - rviz_config = os.path.join(bringup_dir, 'rviz', 'navigation.rviz') - rviz_node = Node( - condition=IfCondition(use_rviz), - package='rviz2', - executable='rviz2', - name='rviz2', - arguments=['-d', rviz_config], - parameters=[{'use_sim_time': True}], - output='screen') - - # ==================== 组装 ==================== - ld = LaunchDescription() - ld.add_action(declare_use_sim_time) - ld.add_action(declare_use_gazebo) - ld.add_action(declare_use_rviz) - ld.add_action(declare_world) - ld.add_action(declare_map) - - ld.add_action(start_gazebo) - ld.add_action(TimerAction(period=5.0, actions=[spawn_robot])) - ld.add_action(robot_state_publisher) - ld.add_action(joint_state_publisher) - - ld.add_action(TimerAction(period=8.0, actions=[ - map_server, amcl, - planner_server, controller_server, behavior_server, bt_navigator, - waypoint_follower, - lifecycle_localization, lifecycle_navigation, - rviz_node, - ])) - - return ld diff --git a/src/gc_bringup/launch/navigation_slam.launch.py b/src/gc_bringup/launch/navigation_slam.launch.py deleted file mode 100644 index eff37ac..0000000 --- a/src/gc_bringup/launch/navigation_slam.launch.py +++ /dev/null @@ -1,150 +0,0 @@ -#!/usr/bin/env python3 -# ============================================================================= -# gc_bringup — slam_toolbox 定位 + 导航模式 -# 使用 slam_toolbox 定位模式替代 AMCL,适用于有 posegraph 的场景 -# ============================================================================= -import os -from ament_index_python.packages import get_package_share_directory -from launch import LaunchDescription -from launch.actions import (DeclareLaunchArgument, ExecuteProcess, - IncludeLaunchDescription, TimerAction) -from launch.conditions import IfCondition -from launch.launch_description_sources import PythonLaunchDescriptionSource -from launch.substitutions import LaunchConfiguration, Command -from launch_ros.actions import Node -from launch_ros.parameter_descriptions import ParameterValue - - -def generate_launch_description(): - # ============================ 包路径 ============================ - bringup_dir = get_package_share_directory('gc_bringup') - origincar_dir = get_package_share_directory('origincar_description') - nav2_bringup_dir = get_package_share_directory('nav2_bringup') - - # ============================ 启动参数 ============================ - use_sim_time = LaunchConfiguration('use_sim_time', default='true') - use_gazebo = LaunchConfiguration('use_gazebo', default='true') - use_rviz = LaunchConfiguration('use_rviz', default='true') - world = LaunchConfiguration('world', default=os.path.join( - origincar_dir, 'world', 'gc_world.world')) - map_yaml = LaunchConfiguration('map', default=os.path.join( - bringup_dir, 'maps', 'my_map.yaml')) - - declare_use_sim_time = DeclareLaunchArgument('use_sim_time', default_value='true') - declare_use_gazebo = DeclareLaunchArgument('use_gazebo', default_value='true') - declare_use_rviz = DeclareLaunchArgument('use_rviz', default_value='true') - declare_world = DeclareLaunchArgument( - 'world', default_value=os.path.join(origincar_dir, 'world', 'gc_world.world')) - declare_map = DeclareLaunchArgument( - 'map', default_value=os.path.join(bringup_dir, 'maps', 'my_map.yaml')) - - # ============================ 机器人模型 ============================ - default_model_path = os.path.join(origincar_dir, 'urdf', 'origincar.urdf') - robot_description = ParameterValue( - Command(['xacro ', default_model_path]), value_type=str) - - # ============================ Gazebo ============================ - start_gazebo = ExecuteProcess( - condition=IfCondition(use_gazebo), - cmd=['gazebo', '--verbose', '-s', 'libgazebo_ros_init.so', - '-s', 'libgazebo_ros_factory.so', world], - output='screen' - ) - - spawn_robot = Node( - condition=IfCondition(use_gazebo), - package='gazebo_ros', - executable='spawn_entity.py', - arguments=['-entity', 'mycar', - '-file', default_model_path, - '-x', '0.0', '-y', '0.0', '-z', '0.1'], - output='screen' - ) - - # ============================ TF & 机器人状态 ============================ - robot_state_publisher = Node( - package='robot_state_publisher', - executable='robot_state_publisher', - name='robot_state_publisher', - parameters=[{ - 'robot_description': robot_description, - 'use_sim_time': True, - 'publish_frequency': 30.0 - }], - output='screen' - ) - - joint_state_publisher = Node( - package='joint_state_publisher', - executable='joint_state_publisher', - name='joint_state_publisher', - parameters=[{'use_sim_time': True}], - output='screen' - ) - - # ============================ slam_toolbox 定位模式 ============================ - map_base_path = os.path.join(bringup_dir, 'maps', 'my_map') - slam_localization_params = os.path.join( - bringup_dir, 'config', 'mapper_params_localization.yaml') - - slam_toolbox_node = Node( - package='slam_toolbox', - executable='localization_slam_toolbox_node', - name='slam_toolbox', - output='screen', - parameters=[ - slam_localization_params, - { - 'map_file_name': map_base_path, - 'use_sim_time': True - } - ] - ) - - # ============================ Nav2 Bringup (关闭内部定位,用 slam_toolbox) ============================ - nav2_params = os.path.join(bringup_dir, 'config', 'nav2_params.yaml') - nav2_launch_path = os.path.join(nav2_bringup_dir, 'launch', 'bringup_launch.py') - - nav2_bringup = IncludeLaunchDescription( - PythonLaunchDescriptionSource(nav2_launch_path), - launch_arguments={ - 'map': map_yaml, - 'use_sim_time': use_sim_time, - 'params_file': nav2_params, - 'slam': 'False', - 'autostart': 'True', - 'use_composition': 'False', - }.items(), - ) - - # ============================ RViz2 ============================ - rviz_config = os.path.join(bringup_dir, 'rviz', 'navigation.rviz') - rviz_node = Node( - condition=IfCondition(use_rviz), - package='rviz2', - executable='rviz2', - name='rviz2', - arguments=['-d', rviz_config], - parameters=[{'use_sim_time': True}], - output='screen' - ) - - # ============================ 组装 ============================ - ld = LaunchDescription() - - ld.add_action(declare_use_sim_time) - ld.add_action(declare_use_gazebo) - ld.add_action(declare_use_rviz) - ld.add_action(declare_world) - ld.add_action(declare_map) - - ld.add_action(start_gazebo) - ld.add_action(TimerAction(period=5.0, actions=[spawn_robot])) - ld.add_action(robot_state_publisher) - ld.add_action(joint_state_publisher) - ld.add_action(TimerAction( - period=8.0, - actions=[slam_toolbox_node, nav2_bringup, rviz_node] - )) - - return ld diff --git a/src/gc_bringup/launch/slam_mapping.launch.py b/src/gc_bringup/launch/slam_mapping.launch.py deleted file mode 100644 index 2b39408..0000000 --- a/src/gc_bringup/launch/slam_mapping.launch.py +++ /dev/null @@ -1,153 +0,0 @@ -#!/usr/bin/env python3 -# ============================================================================= -# gc_bringup — SLAM 建图模式 -# 启动 Gazebo + 机器人 + slam_toolbox 在线异步建图 + RViz -# ============================================================================= -import os -from ament_index_python.packages import get_package_share_directory -from launch import LaunchDescription -from launch.actions import DeclareLaunchArgument, ExecuteProcess, TimerAction -from launch.conditions import IfCondition, UnlessCondition -from launch.substitutions import LaunchConfiguration, Command -from launch_ros.actions import Node -from launch_ros.parameter_descriptions import ParameterValue - - -def generate_launch_description(): - # ============================ 包路径 ============================ - bringup_dir = get_package_share_directory('gc_bringup') - origincar_dir = get_package_share_directory('origincar_description') - - # ============================ 启动参数 ============================ - use_sim_time = LaunchConfiguration('use_sim_time', default='true') - use_gazebo = LaunchConfiguration('use_gazebo', default='true') - use_rviz = LaunchConfiguration('use_rviz', default='false') - world = LaunchConfiguration('world', default=os.path.join( - origincar_dir, 'world', 'gc_world.world')) - - declare_use_sim_time = DeclareLaunchArgument( - 'use_sim_time', default_value='true', - description='Use simulation (Gazebo) clock if true') - declare_use_gazebo = DeclareLaunchArgument( - 'use_gazebo', default_value='true', - description='Start Gazebo simulation') - declare_use_rviz = DeclareLaunchArgument( - 'use_rviz', default_value='false', - description='Start RViz2 (set true if you need local visualization)') - declare_world = DeclareLaunchArgument( - 'world', default_value=os.path.join(origincar_dir, 'world', 'gc_world.world'), - description='Full path to Gazebo world file') - - # ============================ 机器人模型 ============================ - default_model_path = os.path.join(origincar_dir, 'urdf', 'origincar.urdf') - robot_description = ParameterValue( - Command(['xacro ', default_model_path]), value_type=str) - - # ============================ Gazebo ============================ - start_gazebo = ExecuteProcess( - condition=IfCondition(use_gazebo), - cmd=['gazebo', '--verbose', '-s', 'libgazebo_ros_init.so', - '-s', 'libgazebo_ros_factory.so', world], - output='screen' - ) - - spawn_robot = Node( - condition=IfCondition(use_gazebo), - package='gazebo_ros', - executable='spawn_entity.py', - arguments=['-entity', 'mycar', - '-file', default_model_path, - '-x', '0.0', '-y', '0.0', '-z', '0.1'], - output='screen' - ) - - # ============================ TF & 机器人状态 ============================ - robot_state_publisher = Node( - package='robot_state_publisher', - executable='robot_state_publisher', - name='robot_state_publisher', - parameters=[{ - 'robot_description': robot_description, - 'use_sim_time': True, - 'publish_frequency': 30.0 - }], - output='screen' - ) - - joint_state_publisher = Node( - package='joint_state_publisher', - executable='joint_state_publisher', - name='joint_state_publisher', - parameters=[{'use_sim_time': True}], - output='screen' - ) - - # ============================ SLAM Toolbox (在线异步建图) ============================ - slam_params_file = os.path.join( - bringup_dir, 'config', 'mapper_params_online_async.yaml') - - slam_toolbox_node = Node( - package='slam_toolbox', - executable='async_slam_toolbox_node', - name='slam_toolbox', - output='screen', - parameters=[slam_params_file, {'use_sim_time': True}], - remappings=[('/scan', '/scan')] - ) - - # ============================ RViz2 ============================ - rviz_config = os.path.join(bringup_dir, 'rviz', 'slam_mapping.rviz') - rviz_node = Node( - condition=IfCondition(use_rviz), - package='rviz2', - executable='rviz2', - name='rviz2', - arguments=['-d', rviz_config], - parameters=[{'use_sim_time': True}], - output='screen' - ) - - # ============================ 键盘遥控 (用于驱动机器人建图) ============================ - use_teleop = LaunchConfiguration('use_teleop', default='true') - declare_use_teleop = DeclareLaunchArgument( - 'use_teleop', default_value='true', - description='Start keyboard teleop for driving') - - teleop_node = Node( - condition=IfCondition(use_teleop), - package='teleop_twist_keyboard', - executable='teleop_twist_keyboard', - name='teleop_twist_keyboard', - prefix='xterm -e', - output='screen', - remappings=[('/cmd_vel', '/cmd_vel')], - parameters=[{'use_sim_time': True}] - ) - - # ============================ 组装启动描述 ============================ - ld = LaunchDescription() - - ld.add_action(declare_use_sim_time) - ld.add_action(declare_use_gazebo) - ld.add_action(declare_use_rviz) - ld.add_action(declare_world) - ld.add_action(declare_use_teleop) - - ld.add_action(start_gazebo) - - # 等 Gazebo 启动后再生成机器人 (延迟 5 秒) - ld.add_action(TimerAction( - period=5.0, - actions=[spawn_robot] - )) - - ld.add_action(robot_state_publisher) - ld.add_action(joint_state_publisher) - - # 等机器人生成后再启动 SLAM (延迟 3 秒) - ld.add_action(TimerAction( - period=8.0, - actions=[slam_toolbox_node, teleop_node, rviz_node] - )) - - return ld diff --git a/src/gc_bringup/maps/my_map.pgm b/src/gc_bringup/maps/my_map.pgm deleted file mode 100644 index 9c42b7c..0000000 Binary files a/src/gc_bringup/maps/my_map.pgm and /dev/null differ diff --git a/src/gc_bringup/maps/my_map.posegraph b/src/gc_bringup/maps/my_map.posegraph deleted file mode 100644 index 34c432a..0000000 Binary files a/src/gc_bringup/maps/my_map.posegraph and /dev/null differ diff --git a/src/gc_bringup/maps/my_map.yaml b/src/gc_bringup/maps/my_map.yaml deleted file mode 100644 index 900d49a..0000000 --- a/src/gc_bringup/maps/my_map.yaml +++ /dev/null @@ -1,7 +0,0 @@ -image: my_map.pgm -mode: trinary -resolution: 0.05 -origin: [-9.95, -8.29, 0] -negate: 0 -occupied_thresh: 0.65 -free_thresh: 0.25 \ No newline at end of file diff --git a/src/gc_bringup/package.xml b/src/gc_bringup/package.xml deleted file mode 100644 index d4e5e6f..0000000 --- a/src/gc_bringup/package.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - gc_bringup - 1.0.0 - GC Robot Bringup: SLAM mapping and AMCL navigation for Ackermann robot with LiDAR - guoch - Apache-2.0 - - ament_cmake - - gazebo_ros - robot_state_publisher - joint_state_publisher - rviz2 - nav2_bringup - slam_toolbox - origincar_description - xacro - teleop_twist_keyboard - - ament_lint_auto - ament_lint_common - - - ament_cmake - - diff --git a/src/gc_bringup/rviz/navigation.rviz b/src/gc_bringup/rviz/navigation.rviz deleted file mode 100644 index 31e17ba..0000000 --- a/src/gc_bringup/rviz/navigation.rviz +++ /dev/null @@ -1,133 +0,0 @@ -Panels: - - Class: rviz_common/Displays - Name: Displays - - Class: rviz_common/Views - Name: Views -Visualization Manager: - Class: "" - Displays: - - Alpha: 0.8 - Class: rviz_default_plugins/RobotModel - Enabled: true - Name: RobotModel - Robot Description: robot_description - Visual Enabled: true - - Class: rviz_default_plugins/TF - Enabled: true - Name: TF - Frame Timeout: 15 - Marker Scale: 0.3 - - Class: rviz_default_plugins/Map - Enabled: true - Name: Map - Topic: - Depth: 1 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /map - Update Topic: - Depth: 1 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /map_updates - Color Scheme: map - Draw Behind: true - Use Timestamp: false - - Class: rviz_default_plugins/LaserScan - Enabled: true - Name: LaserScan - Topic: - Depth: 1 - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /scan - Size (m): 0.02 - Style: Flat Squares - Decay Time: 0.3 - Color Transformer: Intensity - - Class: rviz_default_plugins/Path - Enabled: true - Name: Global Plan - Topic: - Depth: 1 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /plan - Color: 25; 255; 0 - Line Style: Dashed - - Class: rviz_default_plugins/Path - Enabled: true - Name: Local Plan - Topic: - Depth: 1 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /local_plan - Color: 255; 153; 0 - - Class: rviz_default_plugins/Path - Enabled: true - Name: Smoothed Plan - Topic: - Depth: 1 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /smoothed_plan - Color: 255; 255; 0 - - Class: rviz_default_plugins/Costmap - Enabled: true - Name: Local Costmap - Topic: - Depth: 1 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /local_costmap/costmap - Color Scheme: costmap - Draw Behind: false - - Class: rviz_default_plugins/Costmap - Enabled: false - Name: Global Costmap - Topic: - Depth: 1 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /global_costmap/costmap - Color Scheme: costmap - Draw Behind: false - - Alpha: 0.99 - Class: rviz_default_plugins/ParticleCloud - Enabled: true - Name: AMCL Particle Swarm - Topic: - Depth: 1 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /particle_cloud - Color: 255; 0; 0 - Style: Flat Squares - Enabled: true - Global Options: - Background Color: 48; 48; 48 - Fixed Frame: map - Frame Rate: 30 - Name: root - Tools: - - Class: rviz_default_plugins/Interact - - Class: rviz_default_plugins/MoveCamera - - Class: rviz_default_plugins/Select - - Class: rviz_default_plugins/SetInitialPose - Topic: - Value: /initialpose - - Class: rviz_default_plugins/SetGoal - Topic: - Value: /goal_pose - Views: - Current: - Class: rviz_default_plugins/Orbit - Distance: 5.0 - Focal Point: - X: 0.0 - Y: 0.0 - Z: 0.5 - Name: Current View - Pitch: 0.8 - Yaw: 2.8 diff --git a/src/gc_bringup/rviz/slam_mapping.rviz b/src/gc_bringup/rviz/slam_mapping.rviz deleted file mode 100644 index 7fa1a95..0000000 --- a/src/gc_bringup/rviz/slam_mapping.rviz +++ /dev/null @@ -1,84 +0,0 @@ -Panels: - - Class: rviz_common/Displays - Name: Displays - - Class: rviz_common/Views - Name: Views -Visualization Manager: - Class: "" - Displays: - - Alpha: 0.8 - Class: rviz_default_plugins/RobotModel - Enabled: true - Name: RobotModel - Robot Description: robot_description - Visual Enabled: true - - Class: rviz_default_plugins/TF - Enabled: true - Name: TF - Frame Timeout: 15 - Marker Scale: 0.3 - - Class: rviz_default_plugins/Map - Enabled: true - Name: Map - Topic: - Depth: 1 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /map - Update Topic: - Depth: 1 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /map_updates - Color Scheme: map - Draw Behind: true - Use Timestamp: false - - Class: rviz_default_plugins/LaserScan - Enabled: true - Name: LaserScan - Topic: - Depth: 1 - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /scan - Size (m): 0.02 - Style: Flat Squares - Decay Time: 0.3 - Color Transformer: Intensity - - Class: rviz_default_plugins/Path - Enabled: true - Name: Path (SLAM) - Topic: - Depth: 1 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /plan - Color: 25; 255; 0 - Line Style: Dashed - Enabled: true - Global Options: - Background Color: 48; 48; 48 - Fixed Frame: map - Frame Rate: 30 - Name: root - Tools: - - Class: rviz_default_plugins/Interact - - Class: rviz_default_plugins/MoveCamera - - Class: rviz_default_plugins/Select - - Class: rviz_default_plugins/SetInitialPose - Topic: - Value: /initialpose - - Class: rviz_default_plugins/SetGoal - Topic: - Value: /goal_pose - Views: - Current: - Class: rviz_default_plugins/Orbit - Distance: 5.0 - Focal Point: - X: 0.0 - Y: 0.0 - Z: 0.5 - Name: Current View - Pitch: 0.8 - Yaw: 2.8 diff --git a/src/gc_bringup/scripts/nav_goal.py b/src/gc_bringup/scripts/nav_goal.py deleted file mode 100644 index a0243d4..0000000 --- a/src/gc_bringup/scripts/nav_goal.py +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env python3 -""" -命令行发送导航目标点到 Nav2 - -用法: - ros2 run gc_bringup nav_goal 1.0 2.0 0.5 # 去 (1.0, 2.0), yaw=0.5 - ros2 run gc_bringup nav_goal 1.0 2.0 # 去 (1.0, 2.0), yaw=0.0 - ros2 run gc_bringup nav_goal -2.0 0.0 3.14 # 去 (-2.0, 0.0), 面朝后 - - # 或使用 topic pub - ros2 topic pub /goal_pose geometry_msgs/PoseStamped "{header: {frame_id: 'map'}, pose: {position: {x: 1.0, y: 0.0}, orientation: {z: 0.0, w: 1.0}}}" -""" - -import sys -import rclpy -from rclpy.node import Node -from geometry_msgs.msg import PoseStamped -import math - - -class GoalSender(Node): - def __init__(self): - super().__init__('goal_sender') - self.publisher = self.create_publisher(PoseStamped, '/goal_pose', 10) - - def send_goal(self, x: float, y: float, yaw: float = 0.0): - msg = PoseStamped() - msg.header.frame_id = 'map' - msg.header.stamp = self.get_clock().now().to_msg() - msg.pose.position.x = x - msg.pose.position.y = y - msg.pose.position.z = 0.0 - msg.pose.orientation.z = math.sin(yaw / 2.0) - msg.pose.orientation.w = math.cos(yaw / 2.0) - self.publisher.publish(msg) - self.get_logger().info(f'发送导航目标: x={x:.2f}, y={y:.2f}, yaw={yaw:.2f}') - - -def main(): - rclpy.init() - sender = GoalSender() - - args = sys.argv[1:] - if len(args) < 2: - print("用法: ros2 run gc_bringup nav_goal [yaw]") - print("示例: ros2 run gc_bringup nav_goal 1.0 2.0 0.5") - sys.exit(1) - - x = float(args[0]) - y = float(args[1]) - yaw = float(args[2]) if len(args) > 2 else 0.0 - - sender.send_goal(x, y, yaw) - rclpy.shutdown() - - -if __name__ == '__main__': - main() diff --git a/src/gc_navigation/package.xml b/src/gc_navigation/package.xml deleted file mode 100644 index e333e66..0000000 --- a/src/gc_navigation/package.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - gc_navigation - 0.0.0 - TODO: Package description - guoch - TODO: License declaration - - ament_copyright - ament_flake8 - ament_pep257 - python3-pytest - - - ament_python - - diff --git a/src/gc_navigation/resource/gc_navigation b/src/gc_navigation/resource/gc_navigation deleted file mode 100644 index e69de29..0000000 diff --git a/src/gc_navigation/setup.cfg b/src/gc_navigation/setup.cfg deleted file mode 100644 index 7e23bd3..0000000 --- a/src/gc_navigation/setup.cfg +++ /dev/null @@ -1,4 +0,0 @@ -[develop] -script_dir=$base/lib/gc_navigation -[install] -install_scripts=$base/lib/gc_navigation diff --git a/src/gc_navigation/setup.py b/src/gc_navigation/setup.py deleted file mode 100644 index c8d94db..0000000 --- a/src/gc_navigation/setup.py +++ /dev/null @@ -1,25 +0,0 @@ -from setuptools import find_packages, setup - -package_name = 'gc_navigation' - -setup( - name=package_name, - version='0.0.0', - packages=find_packages(exclude=['test']), - data_files=[ - ('share/ament_index/resource_index/packages', - ['resource/' + package_name]), - ('share/' + package_name, ['package.xml']), - ], - install_requires=['setuptools'], - zip_safe=True, - maintainer='guoch', - maintainer_email='guoch@todo.todo', - description='TODO: Package description', - license='TODO: License declaration', - tests_require=['pytest'], - entry_points={ - 'console_scripts': [ - ], - }, -) diff --git a/src/gc_navigation/test/test_copyright.py b/src/gc_navigation/test/test_copyright.py deleted file mode 100644 index 97a3919..0000000 --- a/src/gc_navigation/test/test_copyright.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright 2015 Open Source Robotics Foundation, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from ament_copyright.main import main -import pytest - - -# Remove the `skip` decorator once the source file(s) have a copyright header -@pytest.mark.skip(reason='No copyright header has been placed in the generated source file.') -@pytest.mark.copyright -@pytest.mark.linter -def test_copyright(): - rc = main(argv=['.', 'test']) - assert rc == 0, 'Found errors' diff --git a/src/gc_navigation/test/test_flake8.py b/src/gc_navigation/test/test_flake8.py deleted file mode 100644 index 27ee107..0000000 --- a/src/gc_navigation/test/test_flake8.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright 2017 Open Source Robotics Foundation, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from ament_flake8.main import main_with_errors -import pytest - - -@pytest.mark.flake8 -@pytest.mark.linter -def test_flake8(): - rc, errors = main_with_errors(argv=[]) - assert rc == 0, \ - 'Found %d code style errors / warnings:\n' % len(errors) + \ - '\n'.join(errors) diff --git a/src/gc_navigation/test/test_pep257.py b/src/gc_navigation/test/test_pep257.py deleted file mode 100644 index b234a38..0000000 --- a/src/gc_navigation/test/test_pep257.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright 2015 Open Source Robotics Foundation, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from ament_pep257.main import main -import pytest - - -@pytest.mark.linter -@pytest.mark.pep257 -def test_pep257(): - rc = main(argv=['.', 'test']) - assert rc == 0, 'Found code style errors / warnings' diff --git a/src/gc_navigation2_slamtoolbox/config/mapper_params_localization.yaml b/src/gc_navigation2_slamtoolbox/config/mapper_params_localization.yaml index 8d2fad5..b6356ef 100644 --- a/src/gc_navigation2_slamtoolbox/config/mapper_params_localization.yaml +++ b/src/gc_navigation2_slamtoolbox/config/mapper_params_localization.yaml @@ -15,8 +15,8 @@ slam_toolbox: mode: localization #localization # if you'd like to start localizing on bringup in a map and pose - # map_file_name: /home/guoch/test_ws/src/gc_navigation2_slamtoolbox/maps/my_map.posegraph - # map_start_pose: [0.0, 0.0, 0.0] + map_file_name: /home/guoch/test_ws/src/gc_navigation2_slamtoolbox/maps/my_map.posegraph + map_start_pose: [0.0, 0.0, 0.0] debug_logging: false throttle_scans: 1 diff --git a/src/gc_navigation2_slamtoolbox/launch/gc_nav2_with_slamtoolbox.launch.py b/src/gc_navigation2_slamtoolbox/launch/gc_nav2_with_amcl.launch.py similarity index 98% rename from src/gc_navigation2_slamtoolbox/launch/gc_nav2_with_slamtoolbox.launch.py rename to src/gc_navigation2_slamtoolbox/launch/gc_nav2_with_amcl.launch.py index cb94c4d..edf5436 100644 --- a/src/gc_navigation2_slamtoolbox/launch/gc_nav2_with_slamtoolbox.launch.py +++ b/src/gc_navigation2_slamtoolbox/launch/gc_nav2_with_amcl.launch.py @@ -26,7 +26,7 @@ def generate_launch_description(): map_yaml_path = LaunchConfiguration('map', default=os.path.join( gc_navigation_fish_dir, 'maps', 'my_map.yaml')) nav2_param_path = LaunchConfiguration('params_file', default=os.path.join( - gc_navigation_fish_dir, 'params', 'gc_navigation.yaml')) + gc_navigation_fish_dir, 'params', 'gc_navigation_amcl.yaml')) # =============================3.声明启动launch文件,传入:地图路径、是否使用仿真时间以及nav2参数文件============== nav2_bringup_launch = IncludeLaunchDescription( @@ -38,6 +38,7 @@ def generate_launch_description(): 'params_file': nav2_param_path}.items(), ) + # =============================4.Gazebo仿真设置========================================================== robot_name_in_model = 'mycar' default_model_path = os.path.join( diff --git a/src/gc_navigation2_slamtoolbox/launch/gc_nav2_with_slam.launch.py b/src/gc_navigation2_slamtoolbox/launch/gc_nav2_with_slam.launch.py new file mode 100644 index 0000000..8e6a64a --- /dev/null +++ b/src/gc_navigation2_slamtoolbox/launch/gc_nav2_with_slam.launch.py @@ -0,0 +1,113 @@ +import os +from ament_index_python.packages import get_package_share_directory +from launch import LaunchDescription +from launch.actions import IncludeLaunchDescription, DeclareLaunchArgument +from launch.launch_description_sources import PythonLaunchDescriptionSource +from launch.substitutions import LaunchConfiguration +from launch_ros.actions import Node +from launch_ros.parameter_descriptions import ParameterValue +from launch.substitutions import Command +from launch.actions import ExecuteProcess + + +def generate_launch_description(): + ld = LaunchDescription() + + # =============================1.定位到包的地址============================================================= + pkg_dir = get_package_share_directory('gc_navigation2_slamtoolbox') + nav2_bringup_dir = get_package_share_directory('nav2_bringup') + origincar_urdf_dir = get_package_share_directory('origincar_description') + + # =============================2.声明参数=============================================================== + use_sim_time = LaunchConfiguration('use_sim_time', default='true') + map_yaml_path = LaunchConfiguration('map', default=os.path.join( + pkg_dir, 'maps', 'my_map.yaml')) + nav2_param_path = LaunchConfiguration('params_file', default=os.path.join( + pkg_dir, 'params', 'gc_navigation.yaml')) + slam_params_file = os.path.join( + pkg_dir, 'config', 'mapper_params_localization.yaml') + + # =============================3.slam_toolbox 定位模式(替代 AMCL)========================================= + slam_toolbox_node = Node( + package='slam_toolbox', + executable='localization_slam_toolbox_node', + name='slam_toolbox', + output='screen', + parameters=[slam_params_file, + {'use_sim_time': True}], + # 关键:确保 slam_toolbox 作为定位器发布 map->odom 变换 + ) + + # =============================4.仅启动 nav2 navigation(不含 localization)================================= + # 因为 slam_toolbox 已经替代了 AMCL,不需要再跑 localization_launch + navigation_launch = IncludeLaunchDescription( + PythonLaunchDescriptionSource( + [nav2_bringup_dir, '/launch', '/navigation_launch.py']), + launch_arguments={ + 'use_sim_time': use_sim_time, + 'params_file': nav2_param_path}.items(), + ) + + # =============================5.map_server 单独启动(提供静态地图给 costmap)=============================== + map_server_node = Node( + package='nav2_map_server', + executable='map_server', + name='map_server', + output='screen', + parameters=[nav2_param_path, + {'yaml_filename': map_yaml_path, + 'use_sim_time': True}], + ) + + # map_server 生命周期自动管理 + map_server_lifecycle_node = Node( + package='nav2_lifecycle_manager', + executable='lifecycle_manager', + name='lifecycle_manager_map', + output='screen', + parameters=[{'use_sim_time': True, + 'autostart': True, + 'node_names': ['map_server']}], + ) + + # =============================6.Gazebo仿真设置========================================================== + robot_name_in_model = 'mycar' + default_model_path = os.path.join( + origincar_urdf_dir, "urdf", "origincar.urdf") + model = DeclareLaunchArgument( + name="model", default_value=default_model_path) + + gazebo_world_path = os.path.join(origincar_urdf_dir, 'world/test.world') + start_gazebo_cmd = ExecuteProcess( + cmd=['gazebo', '--verbose', '-s', 'libgazebo_ros_init.so', + '-s', 'libgazebo_ros_factory.so', gazebo_world_path], + output='screen') + + spawn_entity_cmd = Node( + package='gazebo_ros', + executable='spawn_entity.py', + arguments=['-entity', robot_name_in_model, + '-file', default_model_path], + output='screen' + ) + + robot_description = ParameterValue( + Command(["xacro ", LaunchConfiguration("model")]), value_type=str) + + robot_state_publisher = Node( + package="robot_state_publisher", + executable="robot_state_publisher", + parameters=[{"robot_description": robot_description, + 'use_sim_time': True, 'publish_frequency': 30.0}] + ) + + ld.add_action(model) + ld.add_action(start_gazebo_cmd) + ld.add_action(spawn_entity_cmd) + ld.add_action(robot_state_publisher) + ld.add_action(map_server_node) + ld.add_action(map_server_lifecycle_node) + ld.add_action(slam_toolbox_node) + ld.add_action(navigation_launch) + + return ld diff --git a/src/gc_navigation2_slamtoolbox/params/gc_navigation.yaml b/src/gc_navigation2_slamtoolbox/params/gc_navigation_amcl.yaml similarity index 100% rename from src/gc_navigation2_slamtoolbox/params/gc_navigation.yaml rename to src/gc_navigation2_slamtoolbox/params/gc_navigation_amcl.yaml diff --git a/src/gc_navigation/gc_navigation/__init__.py b/src/gc_navigation2_slamtoolbox/params/gc_navigation_slam.yaml similarity index 100% rename from src/gc_navigation/gc_navigation/__init__.py rename to src/gc_navigation2_slamtoolbox/params/gc_navigation_slam.yaml diff --git a/src/gc_navigation_fish/CMakeLists.txt b/src/gc_navigation_fish/CMakeLists.txt deleted file mode 100644 index 21e4ee1..0000000 --- a/src/gc_navigation_fish/CMakeLists.txt +++ /dev/null @@ -1,29 +0,0 @@ -cmake_minimum_required(VERSION 3.8) -project(gc_navigation_fish) - -if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") - add_compile_options(-Wall -Wextra -Wpedantic) -endif() - -# find dependencies -find_package(ament_cmake REQUIRED) -# uncomment the following section in order to fill in -# further dependencies manually. -# find_package( REQUIRED) -install( - DIRECTORY launch param maps - DESTINATION share/${PROJECT_NAME} -) -if(BUILD_TESTING) - find_package(ament_lint_auto REQUIRED) - # the following line skips the linter which checks for copyrights - # comment the line when a copyright and license is added to all source files - set(ament_cmake_copyright_FOUND TRUE) - # the following line skips cpplint (only works in a git repo) - # comment the line when this package is in a git repo and when - # a copyright and license is added to all source files - set(ament_cmake_cpplint_FOUND TRUE) - ament_lint_auto_find_test_dependencies() -endif() - -ament_package() diff --git a/src/gc_navigation_fish/launch/gc_navigation.launch.py b/src/gc_navigation_fish/launch/gc_navigation.launch.py deleted file mode 100644 index 8a4ff45..0000000 --- a/src/gc_navigation_fish/launch/gc_navigation.launch.py +++ /dev/null @@ -1,34 +0,0 @@ -import os -from ament_index_python.packages import get_package_share_directory -from launch import LaunchDescription -from launch.actions import IncludeLaunchDescription -from launch.launch_description_sources import PythonLaunchDescriptionSource -from launch.substitutions import LaunchConfiguration -from launch_ros.actions import Node - - -def generate_launch_description(): - # =============================1.定位到包的地址============================================================= - gc_navigation_fish_dir = get_package_share_directory( - 'gc_navigation_fish') - nav2_bringup_dir = get_package_share_directory('nav2_bringup') - - # =============================2.声明参数,获取配置文件路径=================================================== - # use_sim_time 这里要设置成true,因为gazebo是仿真环境,其时间是通过/clock话题获取,而不是系统时间 - use_sim_time = LaunchConfiguration('use_sim_time', default='true') - map_yaml_path = LaunchConfiguration('map', default=os.path.join( - gc_navigation_fish_dir, 'maps', 'my_map.yaml')) - nav2_param_path = LaunchConfiguration('params_file', default=os.path.join( - gc_navigation_fish_dir, 'param', 'gc_navigation.yaml')) - # =============================3.声明启动launch文件,传入:地图路径、是否使用仿真时间以及nav2参数文件============== - nav2_bringup_launch = IncludeLaunchDescription( - PythonLaunchDescriptionSource( - [nav2_bringup_dir, '/launch', '/bringup_launch.py']), - launch_arguments={ - 'map': map_yaml_path, - 'use_sim_time': use_sim_time, - 'params_file': nav2_param_path}.items(), - ) - - - return LaunchDescription([nav2_bringup_launch]) diff --git a/src/gc_navigation_fish/maps/my_map.data b/src/gc_navigation_fish/maps/my_map.data deleted file mode 100644 index 68c09b6..0000000 Binary files a/src/gc_navigation_fish/maps/my_map.data and /dev/null differ diff --git a/src/gc_navigation_fish/maps/my_map.pgm b/src/gc_navigation_fish/maps/my_map.pgm deleted file mode 100644 index 809a0ed..0000000 Binary files a/src/gc_navigation_fish/maps/my_map.pgm and /dev/null differ diff --git a/src/gc_navigation_fish/maps/my_map.posegraph b/src/gc_navigation_fish/maps/my_map.posegraph deleted file mode 100644 index 34c432a..0000000 Binary files a/src/gc_navigation_fish/maps/my_map.posegraph and /dev/null differ diff --git a/src/gc_navigation_fish/maps/my_map.yaml b/src/gc_navigation_fish/maps/my_map.yaml deleted file mode 100644 index 938b0ed..0000000 --- a/src/gc_navigation_fish/maps/my_map.yaml +++ /dev/null @@ -1,7 +0,0 @@ -image: map_1770592084.pgm -mode: trinary -resolution: 0.05 -origin: [-2.15, -5.81, 0] -negate: 0 -occupied_thresh: 0.65 -free_thresh: 0.25 \ No newline at end of file diff --git a/src/gc_navigation_fish/maps/test_map.pgm b/src/gc_navigation_fish/maps/test_map.pgm deleted file mode 100644 index 079a090..0000000 Binary files a/src/gc_navigation_fish/maps/test_map.pgm and /dev/null differ diff --git a/src/gc_navigation_fish/maps/test_map.yaml b/src/gc_navigation_fish/maps/test_map.yaml deleted file mode 100644 index 2d524cd..0000000 --- a/src/gc_navigation_fish/maps/test_map.yaml +++ /dev/null @@ -1,7 +0,0 @@ -image: test_map.pgm -mode: trinary -resolution: 0.05 -origin: [-2.03, -6.12, 0] -negate: 0 -occupied_thresh: 0.65 -free_thresh: 0.25 \ No newline at end of file diff --git a/src/gc_navigation_fish/package.xml b/src/gc_navigation_fish/package.xml deleted file mode 100644 index f54f961..0000000 --- a/src/gc_navigation_fish/package.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - gc_navigation_fish - 0.0.0 - TODO: Package description - guoch - TODO: License declaration - - ament_cmake - - ament_lint_auto - ament_lint_common - nav2_bringup - - ament_cmake - - diff --git a/src/gc_navigation_fish/param/gc_navigation.yaml b/src/gc_navigation_fish/param/gc_navigation.yaml deleted file mode 100644 index e24e71e..0000000 --- a/src/gc_navigation_fish/param/gc_navigation.yaml +++ /dev/null @@ -1,408 +0,0 @@ -amcl: - ros__parameters: - use_sim_time: True - alpha1: 0.2 - alpha2: 0.2 - alpha3: 0.2 - alpha4: 0.2 - alpha5: 0.2 - base_frame_id: "base_link" - beam_skip_distance: 0.5 - beam_skip_error_threshold: 0.9 - beam_skip_threshold: 0.3 - do_beamskip: false - global_frame_id: "map" # 全局坐标系 - lambda_short: 0.1 - laser_likelihood_max_dist: 2.0 - laser_max_range: 100.0 - laser_min_range: -1.0 - laser_model_type: "likelihood_field" - max_beams: 60 - max_particles: 2000 - min_particles: 500 - odom_frame_id: "odom" - pf_err: 0.05 - pf_z: 0.99 - recovery_alpha_fast: 0.0 - recovery_alpha_slow: 0.0 - resample_interval: 1 - robot_model_type: "nav2_amcl::DifferentialMotionModel" - save_pose_rate: 0.5 - sigma_hit: 0.2 - tf_broadcast: true - transform_tolerance: 10.0 - update_min_a: 0.2 - update_min_d: 0.25 - z_hit: 0.5 - z_max: 0.05 - z_rand: 0.5 - z_short: 0.05 - scan_topic: scan - -amcl_map_client: - ros__parameters: - use_sim_time: True - -amcl_rclcpp_node: - ros__parameters: - use_sim_time: True - -bt_navigator: - ros__parameters: - use_sim_time: True - global_frame: map - robot_base_frame: base_link - odom_topic: /odom - bt_loop_duration: 10 - default_server_timeout: 20 - # 'default_nav_through_poses_bt_xml' and 'default_nav_to_pose_bt_xml' are use defaults: - # nav2_bt_navigator/navigate_to_pose_w_replanning_and_recovery.xml - # nav2_bt_navigator/navigate_through_poses_w_replanning_and_recovery.xml - # They can be set here or via a RewrittenYaml remap from a parent launch file to Nav2. - plugin_lib_names: - - nav2_compute_path_to_pose_action_bt_node - - nav2_compute_path_through_poses_action_bt_node - - nav2_smooth_path_action_bt_node - - nav2_follow_path_action_bt_node - - nav2_spin_action_bt_node - - nav2_wait_action_bt_node - - nav2_back_up_action_bt_node - - nav2_drive_on_heading_bt_node - - nav2_clear_costmap_service_bt_node - - nav2_is_stuck_condition_bt_node - - nav2_goal_reached_condition_bt_node - - nav2_goal_updated_condition_bt_node - - nav2_globally_updated_goal_condition_bt_node - - nav2_is_path_valid_condition_bt_node - - nav2_initial_pose_received_condition_bt_node - - nav2_reinitialize_global_localization_service_bt_node - - nav2_rate_controller_bt_node - - nav2_distance_controller_bt_node - - nav2_speed_controller_bt_node - - nav2_truncate_path_action_bt_node - - nav2_truncate_path_local_action_bt_node - - nav2_goal_updater_node_bt_node - - nav2_recovery_node_bt_node - - nav2_pipeline_sequence_bt_node - - nav2_round_robin_node_bt_node - - nav2_transform_available_condition_bt_node - - nav2_time_expired_condition_bt_node - - nav2_path_expiring_timer_condition - - nav2_distance_traveled_condition_bt_node - - nav2_single_trigger_bt_node - - nav2_is_battery_low_condition_bt_node - - nav2_navigate_through_poses_action_bt_node - - nav2_navigate_to_pose_action_bt_node - - nav2_remove_passed_goals_action_bt_node - - nav2_planner_selector_bt_node - - nav2_controller_selector_bt_node - - nav2_goal_checker_selector_bt_node - - nav2_controller_cancel_bt_node - - nav2_path_longer_on_approach_bt_node - - nav2_wait_cancel_bt_node - - nav2_spin_cancel_bt_node - - nav2_back_up_cancel_bt_node - - nav2_drive_on_heading_cancel_bt_node - -bt_navigator_rclcpp_node: - ros__parameters: - use_sim_time: True - -controller_server: - ros__parameters: - controller_frequency: 30.0 - FollowPath: - plugin: "nav2_mppi_controller::MPPIController" - time_steps: 56 - model_dt: 0.05 - batch_size: 2000 - vx_std: 0.2 - vy_std: 0.0 - wz_std: 0.4 - vx_max: 0.5 - vx_min: -0.35 - vy_max: 0.0 - wz_max: 1.9 - iteration_count: 1 - temperature: 0.3 - gamma: 0.015 - motion_model: "Ackermann" - visualize: false - TrajectoryVisualizer: - trajectory_step: 5 - time_step: 3 - AckermannConstraints: - min_turning_r: 0.4 - critics: ["ConstraintCritic", "CostCritic", "GoalCritic", "GoalAngleCritic", "PathAlignCritic", "PathFollowCritic", "PathAngleCritic", "PreferForwardCritic"] - ConstraintCritic: - enabled: true - cost_power: 1 - cost_weight: 4.0 - GoalCritic: - enabled: true - cost_power: 1 - cost_weight: 5.0 - threshold_to_consider: 1.4 - GoalAngleCritic: - enabled: true - cost_power: 1 - cost_weight: 3.0 - threshold_to_consider: 0.5 - PreferForwardCritic: - enabled: true - cost_power: 1 - cost_weight: 5.0 - threshold_to_consider: 0.5 - # Option to replace Cost and use Obstacles instead - # ObstaclesCritic: - # enabled: true - # cost_power: 1 - # repulsion_weight: 1.5 - # critical_weight: 20.0 - # consider_footprint: false - # collision_cost: 10000.0 - # collision_margin_distance: 0.1 - # near_goal_distance: 0.5 - CostCritic: - enabled: true - cost_power: 1 - cost_weight: 3.81 - critical_cost: 300.0 - consider_footprint: true - collision_cost: 1000000.0 - near_goal_distance: 1.0 - trajectory_point_step: 2 - PathAlignCritic: - enabled: true - cost_power: 1 - cost_weight: 14.0 - max_path_occupancy_ratio: 0.05 - trajectory_point_step: 4 - threshold_to_consider: 0.5 - offset_from_furthest: 20 - use_path_orientations: false - PathFollowCritic: - enabled: true - cost_power: 1 - cost_weight: 5.0 - offset_from_furthest: 5 - threshold_to_consider: 1.4 - PathAngleCritic: - enabled: true - cost_power: 1 - cost_weight: 2.0 - offset_from_furthest: 4 - threshold_to_consider: 0.5 - max_angle_to_furthest: 1.0 - forward_preference: true - # VelocityDeadbandCritic: - # enabled: true - # cost_power: 1 - # cost_weight: 35.0 - # deadband_velocities: [0.05, 0.05, 0.05] - # TwirlingCritic: - # enabled: true - # twirling_cost_power: 1 - # twirling_cost_weight: 10.0 - -controller_server_rclcpp_node: - ros__parameters: - use_sim_time: True - -local_costmap: - local_costmap: - ros__parameters: - update_frequency: 5.0 - publish_frequency: 2.0 - global_frame: odom - robot_base_frame: base_link - use_sim_time: True - rolling_window: true - width: 3 - height: 3 - resolution: 0.05 - footprint: "[[0.14, 0.085], - [0.14, -0.085], - [-0.14, -0.085], - [-0.14, 0.085]]" - footprint_padding: 0.02 - plugins: ["voxel_layer", "inflation_layer"] - inflation_layer: - plugin: "nav2_costmap_2d::InflationLayer" - cost_scaling_factor: 3.0 - inflation_radius: 0.55 - voxel_layer: - plugin: "nav2_costmap_2d::VoxelLayer" - enabled: True - publish_voxel_map: True - origin_z: 0.0 - z_resolution: 0.05 - z_voxels: 16 - max_obstacle_height: 2.0 - mark_threshold: 0 - observation_sources: scan - scan: - topic: /scan - max_obstacle_height: 2.0 - clearing: True - marking: True - data_type: "LaserScan" - raytrace_max_range: 3.0 - raytrace_min_range: 0.0 - obstacle_max_range: 2.5 - obstacle_min_range: 0.0 - static_layer: - map_subscribe_transient_local: True - always_send_full_costmap: True - local_costmap_client: - ros__parameters: - use_sim_time: True - local_costmap_rclcpp_node: - ros__parameters: - use_sim_time: True - -global_costmap: - global_costmap: - ros__parameters: - update_frequency: 1.0 - publish_frequency: 1.0 - global_frame: map - robot_base_frame: base_link - use_sim_time: True - footprint: "[[0.14, 0.085], - [0.14, -0.085], - [-0.14, -0.085], - [-0.14, 0.085]]" - footprint_padding: 0.02 - resolution: 0.05 - track_unknown_space: true - plugins: ["static_layer", "obstacle_layer", "inflation_layer"] - obstacle_layer: - plugin: "nav2_costmap_2d::ObstacleLayer" - enabled: True - observation_sources: scan - scan: - topic: /scan - max_obstacle_height: 2.0 - clearing: True - marking: True - data_type: "LaserScan" - raytrace_max_range: 3.0 - raytrace_min_range: 0.0 - obstacle_max_range: 2.5 - obstacle_min_range: 0.0 - static_layer: - plugin: "nav2_costmap_2d::StaticLayer" - map_subscribe_transient_local: True - inflation_layer: - plugin: "nav2_costmap_2d::InflationLayer" - cost_scaling_factor: 3.0 - inflation_radius: 0.55 - always_send_full_costmap: True - global_costmap_client: - ros__parameters: - use_sim_time: True - global_costmap_rclcpp_node: - ros__parameters: - use_sim_time: True - -map_server: - ros__parameters: - use_sim_time: True - yaml_filename: "turtlebot3_world.yaml" - -map_saver: - ros__parameters: - use_sim_time: True - save_map_timeout: 5.0 - free_thresh_default: 0.25 - occupied_thresh_default: 0.65 - map_subscribe_transient_local: True - -planner_server: - ros__parameters: - planner_plugins: ["GridBased"] - use_sim_time: True - - GridBased: - plugin: "nav2_smac_planner/SmacPlannerHybrid" - downsample_costmap: false # whether or not to downsample the map - downsampling_factor: 1 # multiplier for the resolution of the costmap layer (e.g. 2 on a 5cm costmap would be 10cm) - tolerance: 0.25 # dist-to-goal heuristic cost (distance) for valid tolerance endpoints if exact goal cannot be found. - allow_unknown: true # allow traveling in unknown space - max_iterations: 1000000 # maximum total iterations to search for before failing (in case unreachable), set to -1 to disable - max_on_approach_iterations: 1000 # Maximum number of iterations after within tolerances to continue to try to find exact solution - max_planning_time: 5.0 # max time in s for planner to plan, smooth - motion_model_for_search: "REEDS_SHEPP" # or REEDS_SHEPP 可以倒车 - angle_quantization_bins: 72 # Number of angle bins for search - analytic_expansion_ratio: 3.5 # The ratio to attempt analytic expansions during search for final approach. - analytic_expansion_max_length: 3.0 # For Hybrid/Lattice nodes: The maximum length of the analytic expansion to be considered valid to prevent unsafe shortcutting - minimum_turning_radius: 0.40 # minimum turning radius in m of path / vehicle - reverse_penalty: 2.0 # Penalty to apply if motion is reversing, must be => 1 - change_penalty: 0.0 # Penalty to apply if motion is changing directions (L to R), must be >= 0 - non_straight_penalty: 1.2 # Penalty to apply if motion is non-straight, must be => 1 - cost_penalty: 2.0 # Penalty to apply to higher cost areas when adding into the obstacle map dynamic programming distance expansion heuristic. This drives the robot more towards the center of passages. A value between 1.3 - 3.5 is reasonable. - retrospective_penalty: 0.015 - lookup_table_size: 20.0 # Size of the dubin/reeds-sheep distance window to cache, in meters. - cache_obstacle_heuristic: false # Cache the obstacle map dynamic programming distance expansion heuristic between subsiquent replannings of the same goal location. Dramatically speeds up replanning performance (40x) if costmap is largely static. - viz_expansions: false # For Hybrid nodes: Whether to publish expansions on the /expansions topic as an array of poses (the orientation has no meaning). WARNING: heavy to compute and to display, for debug only as it degrades the performance. - smooth_path: True # If true, does a simple and quick smoothing post-processing to the path - - smoother: - max_iterations: 1000 - w_smooth: 0.3 - w_data: 0.2 - tolerance: 1.0e-10 - do_refinement: true - refinement_num: 2 - -planner_server_rclcpp_node: - ros__parameters: - use_sim_time: True - -smoother_server: - ros__parameters: - use_sim_time: True - smoother_plugins: ["simple_smoother"] - simple_smoother: - plugin: "nav2_smoother::SimpleSmoother" - tolerance: 1.0e-10 - max_its: 1000 - do_refinement: True - -behavior_server: - ros__parameters: - costmap_topic: local_costmap/costmap_raw - footprint_topic: local_costmap/published_footprint - cycle_frequency: 10.0 - behavior_plugins: ["spin", "backup", "drive_on_heading", "wait"] - spin: - plugin: "nav2_behaviors/Spin" - backup: - plugin: "nav2_behaviors/BackUp" - drive_on_heading: - plugin: "nav2_behaviors/DriveOnHeading" - wait: - plugin: "nav2_behaviors/Wait" - global_frame: odom - robot_base_frame: base_link - transform_tolerance: 0.1 - use_sim_time: True - simulate_ahead_time: 2.0 - max_rotational_vel: 1.0 - min_rotational_vel: 0.4 - rotational_acc_lim: 3.2 - -robot_state_publisher: - ros__parameters: - use_sim_time: True - -waypoint_follower: - ros__parameters: - loop_rate: 20 - stop_on_failure: false - waypoint_task_executor_plugin: "wait_at_waypoint" - wait_at_waypoint: - plugin: "nav2_waypoint_follower::WaitAtWaypoint" - enabled: True - waypoint_pause_duration: 200 diff --git a/src/gc_slam_toolbox_fish/CMakeLists.txt b/src/gc_slam_toolbox_fish/CMakeLists.txt deleted file mode 100644 index 262d40e..0000000 --- a/src/gc_slam_toolbox_fish/CMakeLists.txt +++ /dev/null @@ -1,29 +0,0 @@ -cmake_minimum_required(VERSION 3.8) -project(gc_slam_toolbox_fish) - -if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") - add_compile_options(-Wall -Wextra -Wpedantic) -endif() - -# find dependencies -find_package(ament_cmake REQUIRED) -# uncomment the following section in order to fill in -# further dependencies manually. -# find_package( REQUIRED) -install( - DIRECTORY config launch rviz - DESTINATION share/${PROJECT_NAME} -) -if(BUILD_TESTING) - find_package(ament_lint_auto REQUIRED) - # the following line skips the linter which checks for copyrights - # comment the line when a copyright and license is added to all source files - set(ament_cmake_copyright_FOUND TRUE) - # the following line skips cpplint (only works in a git repo) - # comment the line when this package is in a git repo and when - # a copyright and license is added to all source files - set(ament_cmake_cpplint_FOUND TRUE) - ament_lint_auto_find_test_dependencies() -endif() - -ament_package() diff --git a/src/gc_slam_toolbox_fish/config/gc_2d.lua b/src/gc_slam_toolbox_fish/config/gc_2d.lua deleted file mode 100644 index 329a2ee..0000000 --- a/src/gc_slam_toolbox_fish/config/gc_2d.lua +++ /dev/null @@ -1,63 +0,0 @@ -include "map_builder.lua" -include "trajectory_builder.lua" - -options = { - map_builder = MAP_BUILDER, - trajectory_builder = TRAJECTORY_BUILDER, - map_frame = "map", - tracking_frame = "base_link", - -- base_link改为odom,发布map到odom之间的位姿态 - published_frame = "odom", - odom_frame = "odom", - -- true改为false,不用提供里程计数据 - provide_odom_frame = false, - -- false改为true,仅发布2D位资 - publish_frame_projected_to_2d = true, - -- false改为true,使用里程计数据 - use_odometry = true, - use_nav_sat = false, - use_landmarks = false, - -- 0改为1,使用一个雷达 - num_laser_scans = 1, - -- 1改为0,不使用多波雷达 - num_multi_echo_laser_scans = 0, - -- 10改为1,1/1=1等于不分割 - num_subdivisions_per_laser_scan = 1, - num_point_clouds = 0, - lookup_transform_timeout_sec = 0.2, - submap_publish_period_sec = 0.3, - pose_publish_period_sec = 5e-3, - trajectory_publish_period_sec = 30e-3, - rangefinder_sampling_ratio = 1., - odometry_sampling_ratio = 1., - fixed_frame_pose_sampling_ratio = 1., - imu_sampling_ratio = 1., - landmarks_sampling_ratio = 1., -} - - --- false改为true,启动2D SLAM -MAP_BUILDER.use_trajectory_builder_2d = true - --- 0改成0.10,比机器人半径小的都忽略 -TRAJECTORY_BUILDER_2D.min_range = 0.10 --- 30改成3.5,限制在雷达最大扫描范围内,越小一般越精确些 -TRAJECTORY_BUILDER_2D.max_range = 3.5 --- 5改成3,传感器数据超出有效范围最大值 -TRAJECTORY_BUILDER_2D.missing_data_ray_length = 3. --- true改成false,不使用IMU数据,大家可以开启,然后对比下效果 -TRAJECTORY_BUILDER_2D.use_imu_data = false --- false改成true,使用实时回环检测来进行前端的扫描匹配 -TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true --- 1.0改成0.1,提高对运动的敏感度 -TRAJECTORY_BUILDER_2D.motion_filter.max_angle_radians = math.rad(0.1) - --- 0.55改成0.65,Fast csm的最低分数,高于此分数才进行优化。 -POSE_GRAPH.constraint_builder.min_score = 0.65 ---0.6改成0.7,全局定位最小分数,低于此分数则认为目前全局定位不准确 -POSE_GRAPH.constraint_builder.global_localization_min_score = 0.7 - --- 设置0可关闭全局SLAM --- POSE_GRAPH.optimize_every_n_nodes = 0 - -return options diff --git a/src/gc_slam_toolbox_fish/launch/catograph.launch.py b/src/gc_slam_toolbox_fish/launch/catograph.launch.py deleted file mode 100644 index ff51eec..0000000 --- a/src/gc_slam_toolbox_fish/launch/catograph.launch.py +++ /dev/null @@ -1,63 +0,0 @@ - -import os -from launch import LaunchDescription -from launch.substitutions import LaunchConfiguration -from launch_ros.actions import Node -from launch_ros.substitutions import FindPackageShare - - -def generate_launch_description(): - # 定位到功能包的地址 - pkg_share = FindPackageShare( - package='gc_slam_toolbox_fish').find('gc_slam_toolbox_fish') - - # =====================运行节点需要的配置======================================================================= - # 是否使用仿真时间,我们用gazebo,这里设置成true - use_sim_time = LaunchConfiguration('use_sim_time', default='true') - # 地图的分辨率 - resolution = LaunchConfiguration('resolution', default='0.05') - # 地图的发布周期 - publish_period_sec = LaunchConfiguration( - 'publish_period_sec', default='1.0') - # 配置文件夹路径 - configuration_directory = LaunchConfiguration( - 'configuration_directory', default=os.path.join(pkg_share, 'config')) - # 配置文件 - configuration_basename = LaunchConfiguration( - 'configuration_basename', default='gc_2d.lua') - rviz_config_dir = os.path.join(pkg_share, 'config')+"/cartographer.rviz" - print(f"rviz config in {rviz_config_dir}") - - # =====================声明三个节点,cartographer/occupancy_grid_node/rviz_node================================= - cartographer_node = Node( - package='cartographer_ros', - executable='cartographer_node', - name='cartographer_node', - output='screen', - parameters=[{'use_sim_time': use_sim_time}], - arguments=['-configuration_directory', configuration_directory, - '-configuration_basename', configuration_basename]) - - cartographer_occupancy_grid_node = Node( - package='cartographer_ros', - executable='cartographer_occupancy_grid_node', - name='cartographer_occupancy_grid_node', - output='screen', - parameters=[{'use_sim_time': use_sim_time}], - arguments=['-resolution', resolution, '-publish_period_sec', publish_period_sec]) - - rviz_node = Node( - package='rviz2', - executable='rviz2', - name='rviz2', - arguments=['-d', rviz_config_dir], - parameters=[{'use_sim_time': use_sim_time}], - output='screen') - - # ===============================================定义启动文件======================================================== - ld = LaunchDescription() - ld.add_action(cartographer_node) - ld.add_action(cartographer_occupancy_grid_node) - # ld.add_action(rviz_node) - - return ld diff --git a/src/gc_slam_toolbox_fish/package.xml b/src/gc_slam_toolbox_fish/package.xml deleted file mode 100644 index 81a27f4..0000000 --- a/src/gc_slam_toolbox_fish/package.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - gc_slam_toolbox_fish - 0.0.0 - TODO: Package description - guoch - TODO: License declaration - - ament_cmake - - ament_lint_auto - ament_lint_common - - - ament_cmake - - diff --git a/src/gc_slamtoolbox/config/nav2_costmap_2d.lua b/src/gc_slamtoolbox/config/nav2_costmap_2d.lua deleted file mode 100644 index 329a2ee..0000000 --- a/src/gc_slamtoolbox/config/nav2_costmap_2d.lua +++ /dev/null @@ -1,63 +0,0 @@ -include "map_builder.lua" -include "trajectory_builder.lua" - -options = { - map_builder = MAP_BUILDER, - trajectory_builder = TRAJECTORY_BUILDER, - map_frame = "map", - tracking_frame = "base_link", - -- base_link改为odom,发布map到odom之间的位姿态 - published_frame = "odom", - odom_frame = "odom", - -- true改为false,不用提供里程计数据 - provide_odom_frame = false, - -- false改为true,仅发布2D位资 - publish_frame_projected_to_2d = true, - -- false改为true,使用里程计数据 - use_odometry = true, - use_nav_sat = false, - use_landmarks = false, - -- 0改为1,使用一个雷达 - num_laser_scans = 1, - -- 1改为0,不使用多波雷达 - num_multi_echo_laser_scans = 0, - -- 10改为1,1/1=1等于不分割 - num_subdivisions_per_laser_scan = 1, - num_point_clouds = 0, - lookup_transform_timeout_sec = 0.2, - submap_publish_period_sec = 0.3, - pose_publish_period_sec = 5e-3, - trajectory_publish_period_sec = 30e-3, - rangefinder_sampling_ratio = 1., - odometry_sampling_ratio = 1., - fixed_frame_pose_sampling_ratio = 1., - imu_sampling_ratio = 1., - landmarks_sampling_ratio = 1., -} - - --- false改为true,启动2D SLAM -MAP_BUILDER.use_trajectory_builder_2d = true - --- 0改成0.10,比机器人半径小的都忽略 -TRAJECTORY_BUILDER_2D.min_range = 0.10 --- 30改成3.5,限制在雷达最大扫描范围内,越小一般越精确些 -TRAJECTORY_BUILDER_2D.max_range = 3.5 --- 5改成3,传感器数据超出有效范围最大值 -TRAJECTORY_BUILDER_2D.missing_data_ray_length = 3. --- true改成false,不使用IMU数据,大家可以开启,然后对比下效果 -TRAJECTORY_BUILDER_2D.use_imu_data = false --- false改成true,使用实时回环检测来进行前端的扫描匹配 -TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true --- 1.0改成0.1,提高对运动的敏感度 -TRAJECTORY_BUILDER_2D.motion_filter.max_angle_radians = math.rad(0.1) - --- 0.55改成0.65,Fast csm的最低分数,高于此分数才进行优化。 -POSE_GRAPH.constraint_builder.min_score = 0.65 ---0.6改成0.7,全局定位最小分数,低于此分数则认为目前全局定位不准确 -POSE_GRAPH.constraint_builder.global_localization_min_score = 0.7 - --- 设置0可关闭全局SLAM --- POSE_GRAPH.optimize_every_n_nodes = 0 - -return options diff --git a/src/gc_slamtoolbox/gc_slamtoolbox/__init__.py b/src/gc_slamtoolbox/gc_slamtoolbox/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/gc_slamtoolbox/launch/cartographer.launch.py b/src/gc_slamtoolbox/launch/cartographer.launch.py deleted file mode 100644 index 03fe36f..0000000 --- a/src/gc_slamtoolbox/launch/cartographer.launch.py +++ /dev/null @@ -1,63 +0,0 @@ - -import os -from launch import LaunchDescription -from launch.substitutions import LaunchConfiguration -from launch_ros.actions import Node -from launch_ros.substitutions import FindPackageShare - - -def generate_launch_description(): - # 定位到功能包的地址 - pkg_share = FindPackageShare( - package='gc_slamtoolbox').find('gc_slamtoolbox') - - # =====================运行节点需要的配置======================================================================= - # 是否使用仿真时间,我们用gazebo,这里设置成true - use_sim_time = LaunchConfiguration('use_sim_time', default='true') - # 地图的分辨率 - resolution = LaunchConfiguration('resolution', default='0.05') - # 地图的发布周期 - publish_period_sec = LaunchConfiguration( - 'publish_period_sec', default='1.0') - # 配置文件夹路径 - configuration_directory = LaunchConfiguration( - 'configuration_directory', default=os.path.join(pkg_share, 'config')) - # 配置文件 - configuration_basename = LaunchConfiguration( - 'configuration_basename', default='nav2_costmap_2d.lua') - rviz_config_dir = os.path.join(pkg_share, 'config')+"/cartographer.rviz" - print(f"rviz config in {rviz_config_dir}") - - # =====================声明三个节点,cartographer/occupancy_grid_node/rviz_node================================= - cartographer_node = Node( - package='cartographer_ros', - executable='cartographer_node', - name='cartographer_node', - output='screen', - parameters=[{'use_sim_time': use_sim_time}], - arguments=['-configuration_directory', configuration_directory, - '-configuration_basename', configuration_basename]) - - cartographer_occupancy_grid_node = Node( - package='cartographer_ros', - executable='cartographer_occupancy_grid_node', - name='cartographer_occupancy_grid_node', - output='screen', - parameters=[{'use_sim_time': use_sim_time}], - arguments=['-resolution', resolution, '-publish_period_sec', publish_period_sec]) - - rviz_node = Node( - package='rviz2', - executable='rviz2', - name='rviz2', - arguments=['-d', rviz_config_dir], - parameters=[{'use_sim_time': use_sim_time}], - output='screen') - - # ===============================================定义启动文件======================================================== - ld = LaunchDescription() - ld.add_action(cartographer_node) - ld.add_action(cartographer_occupancy_grid_node) - ld.add_action(rviz_node) - - return ld diff --git a/src/gc_slamtoolbox/package.xml b/src/gc_slamtoolbox/package.xml deleted file mode 100644 index 5577293..0000000 --- a/src/gc_slamtoolbox/package.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - gc_slamtoolbox - 0.0.0 - TODO: Package description - guoch - TODO: License declaration - - ament_copyright - ament_flake8 - ament_pep257 - python3-pytest - - - ament_python - - diff --git a/src/gc_slamtoolbox/resource/gc_slamtoolbox b/src/gc_slamtoolbox/resource/gc_slamtoolbox deleted file mode 100644 index e69de29..0000000 diff --git a/src/gc_slamtoolbox/setup.cfg b/src/gc_slamtoolbox/setup.cfg deleted file mode 100644 index 48726b1..0000000 --- a/src/gc_slamtoolbox/setup.cfg +++ /dev/null @@ -1,4 +0,0 @@ -[develop] -script_dir=$base/lib/gc_slamtoolbox -[install] -install_scripts=$base/lib/gc_slamtoolbox diff --git a/src/gc_slamtoolbox/setup.py b/src/gc_slamtoolbox/setup.py deleted file mode 100644 index f6f9055..0000000 --- a/src/gc_slamtoolbox/setup.py +++ /dev/null @@ -1,25 +0,0 @@ -from setuptools import find_packages, setup - -package_name = 'gc_slamtoolbox' - -setup( - name=package_name, - version='0.0.0', - packages=find_packages(exclude=['test']), - data_files=[ - ('share/ament_index/resource_index/packages', - ['resource/' + package_name]), - ('share/' + package_name, ['package.xml']), - ], - install_requires=['setuptools'], - zip_safe=True, - maintainer='guoch', - maintainer_email='guoch@todo.todo', - description='TODO: Package description', - license='TODO: License declaration', - tests_require=['pytest'], - entry_points={ - 'console_scripts': [ - ], - }, -) diff --git a/src/gc_slamtoolbox/test/test_copyright.py b/src/gc_slamtoolbox/test/test_copyright.py deleted file mode 100644 index 97a3919..0000000 --- a/src/gc_slamtoolbox/test/test_copyright.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright 2015 Open Source Robotics Foundation, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from ament_copyright.main import main -import pytest - - -# Remove the `skip` decorator once the source file(s) have a copyright header -@pytest.mark.skip(reason='No copyright header has been placed in the generated source file.') -@pytest.mark.copyright -@pytest.mark.linter -def test_copyright(): - rc = main(argv=['.', 'test']) - assert rc == 0, 'Found errors' diff --git a/src/gc_slamtoolbox/test/test_flake8.py b/src/gc_slamtoolbox/test/test_flake8.py deleted file mode 100644 index 27ee107..0000000 --- a/src/gc_slamtoolbox/test/test_flake8.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright 2017 Open Source Robotics Foundation, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from ament_flake8.main import main_with_errors -import pytest - - -@pytest.mark.flake8 -@pytest.mark.linter -def test_flake8(): - rc, errors = main_with_errors(argv=[]) - assert rc == 0, \ - 'Found %d code style errors / warnings:\n' % len(errors) + \ - '\n'.join(errors) diff --git a/src/gc_slamtoolbox/test/test_pep257.py b/src/gc_slamtoolbox/test/test_pep257.py deleted file mode 100644 index b234a38..0000000 --- a/src/gc_slamtoolbox/test/test_pep257.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright 2015 Open Source Robotics Foundation, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from ament_pep257.main import main -import pytest - - -@pytest.mark.linter -@pytest.mark.pep257 -def test_pep257(): - rc = main(argv=['.', 'test']) - assert rc == 0, 'Found code style errors / warnings'