diff --git a/src/elephant_robotics/agv_pro_bringup/launch/agv_pro_bringup.launch.py b/src/elephant_robotics/agv_pro_bringup/launch/agv_pro_bringup.launch.py index 4ba335d..5c2e841 100644 --- a/src/elephant_robotics/agv_pro_bringup/launch/agv_pro_bringup.launch.py +++ b/src/elephant_robotics/agv_pro_bringup/launch/agv_pro_bringup.launch.py @@ -36,7 +36,7 @@ def generate_launch_description(): urdf_file = os.path.join( get_package_share_directory('agv_pro_description'), 'urdf', - 'agv_pro.urdf' + 'agv_pro.urdf.xacro' ) # Pass both namespace and port_name into the xacro processor so that the @@ -117,9 +117,12 @@ def generate_launch_description(): output='screen', ) - # mecanum_drive_controller subscribes to ~/reference (TwistStamped). - # --controller-ros-args remaps it to /cmd_vel so nav2 and teleop work - # without extra flags (teleop still needs stamped:=true). + # mecanum_drive_controller subscribes to ~/reference (TwistStamped). Remap it + # to the standard /cmd_vel so nav2 and teleop work without extra flags + # (teleop still needs stamped:=true). + # NOTE: the remap key MUST be the private name '~/reference' — a bare + # 'reference:=/cmd_vel' is silently ignored and the controller stays on + # /mecanum_drive_controller/reference. # Delayed slightly so controller_manager is ready before spawning. mecanum_drive_controller_spawner = TimerAction( period=2.0, @@ -130,29 +133,13 @@ def generate_launch_description(): arguments=[ 'mecanum_drive_controller', '--controller-manager', 'controller_manager', - '--controller-ros-args', '-r reference:=/cmd_vel', + '--controller-ros-args', '-r ~/reference:=/cmd_vel', ], output='screen', ) ] ) - # Relay /cmd_vel (TwistStamped) → /mecanum_drive_controller/reference. - # This bridges the standard nav2/teleop topic to the controller's - # internal subscription, which ros2_control does not remap at load time. - # lazy:=false ensures the subscription exists before any publisher appears. - cmd_vel_relay = Node( - package='topic_tools', - executable='relay', - name='cmd_vel_relay', - parameters=[{ - 'input_topic': '/cmd_vel', - 'output_topic': '/mecanum_drive_controller/reference', - 'lazy': False, - }], - output='screen', - ) - lidar_launchs = [ include_lidar('lslidar_driver', 'lsn10p_launch.py', enable_lidar, lidar_type, 'n10p'), include_lidar('agv_pro_bringup', 'MID360_launch.py', enable_lidar, lidar_type, 'mid360'), @@ -170,7 +157,6 @@ def generate_launch_description(): robot_state_pub, joint_state_broadcaster_spawner, mecanum_drive_controller_spawner, - cmd_vel_relay, *lidar_launchs, ] ) \ No newline at end of file diff --git a/src/elephant_robotics/agv_pro_bringup/package.xml b/src/elephant_robotics/agv_pro_bringup/package.xml index 31f0492..da70e8c 100644 --- a/src/elephant_robotics/agv_pro_bringup/package.xml +++ b/src/elephant_robotics/agv_pro_bringup/package.xml @@ -12,7 +12,6 @@ controller_manager mecanum_drive_controller joint_state_broadcaster - topic_tools agv_pro_hardware agv_pro_description rviz2 diff --git a/src/elephant_robotics/agv_pro_description/launch/agv_pro_display.launch.py b/src/elephant_robotics/agv_pro_description/launch/agv_pro_display.launch.py index 7e6ff4e..b653e32 100644 --- a/src/elephant_robotics/agv_pro_description/launch/agv_pro_display.launch.py +++ b/src/elephant_robotics/agv_pro_description/launch/agv_pro_display.launch.py @@ -20,7 +20,7 @@ def generate_launch_description(): urdf_file = os.path.join( get_package_share_directory('agv_pro_description'), 'urdf', - 'agv_pro.urdf' + 'agv_pro.urdf.xacro' ) robot_description_content = Command([ diff --git a/src/elephant_robotics/agv_pro_description/urdf/agv_pro.gazebo.xacro b/src/elephant_robotics/agv_pro_description/urdf/agv_pro.gazebo.xacro new file mode 100644 index 0000000..25aa39b --- /dev/null +++ b/src/elephant_robotics/agv_pro_description/urdf/agv_pro.gazebo.xacro @@ -0,0 +1,41 @@ + + + + + + + + + + 0.8 + 0.8 + 100000.0 + 1.0 + + + 0.1 0.1 0.1 1 + 0.1 0.1 0.1 1 + 0.1 0.1 0.1 1 + + + + + + + + + + + + + + ${controllers_file} + + + + diff --git a/src/elephant_robotics/agv_pro_description/urdf/agv_pro.ros2_control.xacro b/src/elephant_robotics/agv_pro_description/urdf/agv_pro.ros2_control.xacro new file mode 100644 index 0000000..6ffdfbd --- /dev/null +++ b/src/elephant_robotics/agv_pro_description/urdf/agv_pro.ros2_control.xacro @@ -0,0 +1,59 @@ + + + + + + + + + gz_ros2_control/GazeboSimSystem + + + agv_pro_hardware/AgvProHardwareInterface + ${port_name} + 0.072 + 0.172 + 0.180 + + ${namespace}left_front_wheel_joint + ${namespace}left_rear_wheel_joint + ${namespace}right_front_wheel_joint + ${namespace}right_rear_wheel_joint + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/elephant_robotics/agv_pro_description/urdf/agv_pro.urdf b/src/elephant_robotics/agv_pro_description/urdf/agv_pro.urdf.xacro old mode 100755 new mode 100644 similarity index 71% rename from src/elephant_robotics/agv_pro_description/urdf/agv_pro.urdf rename to src/elephant_robotics/agv_pro_description/urdf/agv_pro.urdf.xacro index 67a9359..f481bfc --- a/src/elephant_robotics/agv_pro_description/urdf/agv_pro.urdf +++ b/src/elephant_robotics/agv_pro_description/urdf/agv_pro.urdf.xacro @@ -1,279 +1,255 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - agv_pro_hardware/AgvProHardwareInterface - $(arg port_name) - 0.072 - 0.172 - 0.180 - - ${namespace}left_front_wheel_joint - ${namespace}left_rear_wheel_joint - ${namespace}right_front_wheel_joint - ${namespace}right_rear_wheel_joint - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/elephant_robotics/agv_pro_gazebo/CMakeLists.txt b/src/elephant_robotics/agv_pro_gazebo/CMakeLists.txt index 50de585..0340b14 100644 --- a/src/elephant_robotics/agv_pro_gazebo/CMakeLists.txt +++ b/src/elephant_robotics/agv_pro_gazebo/CMakeLists.txt @@ -7,14 +7,13 @@ endif() # find dependencies find_package(ament_cmake REQUIRED) -find_package(urdf REQUIRED) if(BUILD_TESTING) find_package(ament_lint_auto REQUIRED) ament_lint_auto_find_test_dependencies() endif() -install(DIRECTORY meshes urdf launch rviz config worlds +install(DIRECTORY meshes launch rviz config worlds DESTINATION share/${PROJECT_NAME} ) diff --git a/src/elephant_robotics/agv_pro_gazebo/config/agv_control.yaml b/src/elephant_robotics/agv_pro_gazebo/config/agv_control.yaml index 867cc69..83ce34c 100644 --- a/src/elephant_robotics/agv_pro_gazebo/config/agv_control.yaml +++ b/src/elephant_robotics/agv_pro_gazebo/config/agv_control.yaml @@ -1,6 +1,6 @@ controller_manager: ros__parameters: - update_rate: 100 # 控制器更新频率 (Hz) + update_rate: 50 # 控制器更新频率 (Hz) — matches the physical robot (ESP32 auto-report rate) use_sim_time: true # 使用仿真时间 # 定义关节状态广播器 @@ -11,29 +11,36 @@ controller_manager: mecanum_drive_controller: type: mecanum_drive_controller/MecanumDriveController -# 麦克纳姆四轮驱动控制器配置 +# ───────────────────────────────────────────────────────────────────────────── +# Mecanum drive controller — kept IN SYNC with the physical robot config at +# agv_pro_bringup/config/ros2_controllers.yaml. Only the hardware plugin differs +# (gz_ros2_control/GazeboSimSystem here vs agv_pro_hardware/AgvProHardwareInterface +# on the real robot); the controller parameters are identical. +# +# NOTE: The URDF joint names do not match the physical wheel positions due to a +# naming inconsistency in the shared robot model. The controller compensates via +# the front/rear/left/right command-joint mapping below: +# +# Physical position │ URDF joint name +# ──────────────────┼──────────────────────────── +# front-left (FL) │ left_front_wheel_joint ✓ +# front-right (FR) │ left_rear_wheel_joint ← physically front-right +# rear-left (RL) │ right_front_wheel_joint ← physically rear-left +# rear-right (RR) │ right_rear_wheel_joint ✓ +# ───────────────────────────────────────────────────────────────────────────── mecanum_drive_controller: ros__parameters: - reference_timeout: 0.5 + front_left_wheel_command_joint_name: left_front_wheel_joint + front_right_wheel_command_joint_name: left_rear_wheel_joint + rear_left_wheel_command_joint_name: right_front_wheel_joint + rear_right_wheel_command_joint_name: right_rear_wheel_joint - # 命令关节 (velocity command interface) - front_left_wheel_command_joint_name: left_front_wheel_joint - front_right_wheel_command_joint_name: right_front_wheel_joint - rear_left_wheel_command_joint_name: left_rear_wheel_joint - rear_right_wheel_command_joint_name: right_rear_wheel_joint - - kinematics: - base_frame_offset: - x: 0.0 - y: 0.0 - theta: 0.0 - wheels_radius: 0.05 # 轮子半径 - # lx + ly : 底盘中心到轮子在 X 与 Y 方向投影之和 - sum_of_robot_center_projection_on_X_Y_axis: 0.35 - - base_frame_id: base_link - odom_frame_id: odom + odom_frame_id: odom + base_frame_id: base_footprint enable_odom_tf: true - pose_covariance_diagonal: [0.001, 0.001, 99999.0, 99999.0, 99999.0, 0.03] - twist_covariance_diagonal: [0.001, 0.001, 99999.0, 99999.0, 99999.0, 0.03] + kinematics: + wheels_radius: 0.072 # 轮子半径 (wheel centre height above ground) + # sum_of_robot_center_projection_on_X_Y_axis = lx + ly (0.172 + 0.180) + sum_of_robot_center_projection_on_X_Y_axis: 0.352 + diff --git a/src/elephant_robotics/agv_pro_gazebo/launch/agv_pro.launch.py b/src/elephant_robotics/agv_pro_gazebo/launch/agv_pro.launch.py deleted file mode 100644 index c6f0060..0000000 --- a/src/elephant_robotics/agv_pro_gazebo/launch/agv_pro.launch.py +++ /dev/null @@ -1,40 +0,0 @@ -import os - -from ament_index_python.packages import get_package_share_directory - -from launch import LaunchDescription -from launch.substitutions import LaunchConfiguration -from launch.actions import DeclareLaunchArgument -from launch_ros.actions import Node - -import xacro - - -def generate_launch_description(): - - # Check if we're told to use sim time - use_sim_time = LaunchConfiguration('use_sim_time') - - # Process the URDF file - pkg_path = os.path.join(get_package_share_directory('agv_pro_gazebo')) - xacro_file = os.path.join(pkg_path,'urdf','agv_pro.xacro') - robot_description_config = xacro.process_file(xacro_file) - - # Create a robot_state_publisher node - params = {'robot_description': robot_description_config.toxml(), 'use_sim_time': use_sim_time} - node_robot_state_publisher = Node( - package='robot_state_publisher', - executable='robot_state_publisher', - output='screen', - parameters=[params] - ) - - # Launch! - return LaunchDescription([ - DeclareLaunchArgument( - 'use_sim_time', - default_value='false', - description='Use sim time if true'), - - node_robot_state_publisher - ]) diff --git a/src/elephant_robotics/agv_pro_gazebo/launch/agv_pro_display.launch.py b/src/elephant_robotics/agv_pro_gazebo/launch/agv_pro_display.launch.py deleted file mode 100644 index 34ade83..0000000 --- a/src/elephant_robotics/agv_pro_gazebo/launch/agv_pro_display.launch.py +++ /dev/null @@ -1,48 +0,0 @@ -import os -from launch import LaunchDescription -from launch_ros.actions import Node -from launch.conditions import IfCondition -from launch.substitutions import LaunchConfiguration -from ament_index_python.packages import get_package_share_directory - -def generate_launch_description(): - - use_rviz = LaunchConfiguration('use_rviz', default='true') - rviz_config_dir = os.path.join( - get_package_share_directory('agv_pro_gazebo'), - 'rviz', - 'agvpro_display.rviz') - - urdf_file = os.path.join( - get_package_share_directory('agv_pro_gazebo'), - 'urdf', - 'agv_pro.urdf' - ) - - with open(urdf_file, 'r') as file: - robot_description_content = file.read() - - return LaunchDescription([ - - Node( - package='joint_state_publisher', - executable='joint_state_publisher', - name='joint_state_publisher' - ), - - Node( - package='robot_state_publisher', - executable='robot_state_publisher', - name='robot_state_publisher', - parameters=[{'robot_description': robot_description_content}] - ), - - Node( - package='rviz2', - executable='rviz2', - name='rviz2', - arguments=['-d', rviz_config_dir], - condition=IfCondition(use_rviz), - output='screen') - - ]) diff --git a/src/elephant_robotics/agv_pro_gazebo/launch/agv_pro_gazebo.launch.py b/src/elephant_robotics/agv_pro_gazebo/launch/agv_pro_gazebo.launch.py index e6c01f6..41b1f45 100644 --- a/src/elephant_robotics/agv_pro_gazebo/launch/agv_pro_gazebo.launch.py +++ b/src/elephant_robotics/agv_pro_gazebo/launch/agv_pro_gazebo.launch.py @@ -4,12 +4,18 @@ from launch.actions import ( IncludeLaunchDescription, DeclareLaunchArgument, RegisterEventHandler, + SetEnvironmentVariable, TimerAction, ) from launch.conditions import IfCondition from launch.event_handlers import OnProcessExit from launch.launch_description_sources import PythonLaunchDescriptionSource -from launch.substitutions import Command, LaunchConfiguration, PythonExpression +from launch.substitutions import ( + Command, + EnvironmentVariable, + LaunchConfiguration, + PythonExpression, +) from launch_ros.actions import Node from launch_ros.parameter_descriptions import ParameterValue from ament_index_python.packages import get_package_share_directory @@ -17,9 +23,12 @@ from ament_index_python.packages import get_package_share_directory def generate_launch_description(): pkg_gazebo = get_package_share_directory('agv_pro_gazebo') + pkg_description = get_package_share_directory('agv_pro_description') pkg_ros_gz_sim = get_package_share_directory('ros_gz_sim') - xacro_file = os.path.join(pkg_gazebo, 'urdf', 'agv_pro.xacro') + # Shared robot description (agv_pro_description) built for simulation. + xacro_file = os.path.join(pkg_description, 'urdf', 'agv_pro.urdf.xacro') + controllers_file = os.path.join(pkg_gazebo, 'config', 'agv_control.yaml') world_file = os.path.join(pkg_gazebo, 'worlds', 'empty.world') rviz_config = os.path.join(pkg_gazebo, 'rviz', 'agvpro_display.rviz') @@ -29,11 +38,29 @@ def generate_launch_description(): robot_description = { 'robot_description': ParameterValue( - Command(['xacro ', xacro_file]), value_type=str + Command([ + 'xacro ', xacro_file, + ' sim:=true', + ' controllers_file:=', controllers_file, + ]), + value_type=str, ), 'use_sim_time': use_sim_time, } + # Let gz-sim resolve the package:// mesh URIs in the shared description. + # URDF->SDF conversion rewrites package://agv_pro_description/... to + # model://agv_pro_description/..., which gz finds by searching + # GZ_SIM_RESOURCE_PATH for a directory named 'agv_pro_description'. + gz_resource_path = SetEnvironmentVariable( + name='GZ_SIM_RESOURCE_PATH', + value=[ + os.path.dirname(pkg_description), + ':', + EnvironmentVariable('GZ_SIM_RESOURCE_PATH', default_value=''), + ], + ) + # Start gz-sim (Gazebo Harmonic) with the world. # '-s' (server only) is added when headless:=true. gz_args = PythonExpression([ @@ -88,12 +115,17 @@ def generate_launch_description(): output='screen', ) + # Remap the controller's reference topic (~/reference) to the standard + # /cmd_vel so teleop and nav2 (which publish geometry_msgs/TwistStamped) + # drive the robot directly. NOTE: the remap key must be the private name + # '~/reference' — a bare 'reference:=/cmd_vel' is silently ignored. mecanum_drive_controller_spawner = Node( package='controller_manager', executable='spawner', arguments=[ 'mecanum_drive_controller', '--controller-manager', '/controller_manager', + '--controller-ros-args', '-r ~/reference:=/cmd_vel', ], output='screen', ) @@ -124,6 +156,7 @@ def generate_launch_description(): default_value='false', description='Run gz-sim without the GUI (server only)', ), + gz_resource_path, gz_sim, robot_state_publisher, clock_bridge, diff --git a/src/elephant_robotics/agv_pro_gazebo/launch/teleop_launch.py b/src/elephant_robotics/agv_pro_gazebo/launch/teleop_launch.py index 7df0262..4e81646 100644 --- a/src/elephant_robotics/agv_pro_gazebo/launch/teleop_launch.py +++ b/src/elephant_robotics/agv_pro_gazebo/launch/teleop_launch.py @@ -13,12 +13,12 @@ def generate_launch_description(): prefix='xterm -e', # 或 'gnome-terminal --' 替换为你的终端命令 # mecanum_drive_controller expects a stamped reference; teleop must # publish geometry_msgs/TwistStamped with a fresh timestamp. + # It publishes on the standard /cmd_vel topic, which the sim launch + # feeds to the controller (spawner remap + cmd_vel_relay), mirroring + # the physical robot. parameters=[{ 'stamped': True, 'frame_id': 'base_link', }], - remappings=[ - ('/cmd_vel', '/mecanum_drive_controller/reference'), - ] ) ]) diff --git a/src/elephant_robotics/agv_pro_gazebo/launch/test.launch.py b/src/elephant_robotics/agv_pro_gazebo/launch/test.launch.py deleted file mode 100644 index 3c417e5..0000000 --- a/src/elephant_robotics/agv_pro_gazebo/launch/test.launch.py +++ /dev/null @@ -1,35 +0,0 @@ -import os -from launch import LaunchDescription -from launch.actions import IncludeLaunchDescription -from launch.launch_description_sources import PythonLaunchDescriptionSource -from launch_ros.actions import Node -from launch.substitutions import Command -from ament_index_python.packages import get_package_share_directory - -def generate_launch_description(): - pkg_dir = get_package_share_directory('agv_pro_description') - xacro_file = os.path.join(pkg_dir, 'urdf', 'minimal_robot.xacro') - world_file = os.path.join(pkg_dir, 'worlds', 'empty.world') - - robot_description = {'robot_description': Command(['xacro ', xacro_file])} - - return LaunchDescription([ - IncludeLaunchDescription( - PythonLaunchDescriptionSource( - os.path.join(get_package_share_directory('gazebo_ros'), 'launch', 'gazebo.launch.py') - ), - launch_arguments={'world': world_file}.items() - ), - Node( - package='robot_state_publisher', - executable='robot_state_publisher', - parameters=[robot_description], - output='screen' - ), - Node( - package='gazebo_ros', - executable='spawn_entity.py', - arguments=['-topic', 'robot_description', '-entity', 'minimal_bot'], - output='screen' - ) - ]) diff --git a/src/elephant_robotics/agv_pro_gazebo/package.xml b/src/elephant_robotics/agv_pro_gazebo/package.xml index 70c0819..57e4ec0 100644 --- a/src/elephant_robotics/agv_pro_gazebo/package.xml +++ b/src/elephant_robotics/agv_pro_gazebo/package.xml @@ -13,6 +13,8 @@ xacro + + agv_pro_description ros_gz_sim ros_gz_bridge diff --git a/src/elephant_robotics/agv_pro_gazebo/urdf/agv_pro.xacro b/src/elephant_robotics/agv_pro_gazebo/urdf/agv_pro.xacro deleted file mode 100644 index e72d45e..0000000 --- a/src/elephant_robotics/agv_pro_gazebo/urdf/agv_pro.xacro +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/elephant_robotics/agv_pro_gazebo/urdf/minimal_robot.xacro b/src/elephant_robotics/agv_pro_gazebo/urdf/minimal_robot.xacro deleted file mode 100644 index 87be2db..0000000 --- a/src/elephant_robotics/agv_pro_gazebo/urdf/minimal_robot.xacro +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gazebo/White - 1.0 - 1.0 - 100000.0 - 1.0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/elephant_robotics/agv_pro_gazebo/urdf/parts/gazebo_control_plugin.xacro b/src/elephant_robotics/agv_pro_gazebo/urdf/parts/gazebo_control_plugin.xacro deleted file mode 100644 index 893141e..0000000 --- a/src/elephant_robotics/agv_pro_gazebo/urdf/parts/gazebo_control_plugin.xacro +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - cmd_vel:=/cmd_vel - odom:=/odom - - - - front_left_wheel_joint - front_right_wheel_joint - rear_left_wheel_joint - rear_right_wheel_joint - 0.1 - 0.36 - - 20 - cmd_vel - odom - odom - base_footprint - true - - - - diff --git a/src/elephant_robotics/agv_pro_gazebo/urdf/parts/wheel_macro.xacro b/src/elephant_robotics/agv_pro_gazebo/urdf/parts/wheel_macro.xacro deleted file mode 100644 index a5559dd..0000000 --- a/src/elephant_robotics/agv_pro_gazebo/urdf/parts/wheel_macro.xacro +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - transmission_interface/SimpleTransmission - - hardware_interface/velocity - - - 1 - hardware_interface/velocity - - - - - 0.8 - 0.8 - 100000.0 - 1.0 - - - 0.1 0.1 0.1 1 - 0.1 0.1 0.1 1 - 0.1 0.1 0.1 1 - - - - - - diff --git a/src/elephant_robotics/agv_pro_gazebo/urdf/ros2_controller.xacro b/src/elephant_robotics/agv_pro_gazebo/urdf/ros2_controller.xacro deleted file mode 100644 index 553763b..0000000 --- a/src/elephant_robotics/agv_pro_gazebo/urdf/ros2_controller.xacro +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - gz_ros2_control/GazeboSimSystem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $(find agv_pro_gazebo)/config/agv_control.yaml - - - -