【ROS】controller_manager卡在loading_controller

项目场景:

最近为自己的机械臂基于hardware_interface写了一个驱动,并希望接入ros_control使用moveit进行控制,但是在controller_manager加载控制器的时候停在了loading_controller上。


问题描述

在launch中导入joint_state_controller 控制器

    <node name="rf_hybrid_arm_controller_spawner" pkg="controller_manager" type="spawner" args="joint_state_controller rf_hybrid_arm_controller" respawn="false" output="screen"/>

 在驱动中进行了一个这样的循环

    ros::init(argc, argv, "rf_hybrid_arm_driver_node");
    
    RFHybridArmHW RFARM;    
    controller_manager::ControllerManager cm(&RFARM);
    ROS_INFO("Arm bring up successfully");

    // 控制循环
    ros::Rate loop_rate(RFARM.control_rate); // 控制频率为50Hz
    ros::Duration d(0.05);
    while (ros::ok())
    {
        RFARM.read();
        cm.update(ros::Time::now(), d);
        RFARM.write();
        loop_rate.sleep();
    }

    return 0;
}

这个基本就是参照ros_control的官方示例来的

hardware_interface · ros-controls/ros_control Wiki (github.com)

但是运行的时候总是会卡在loading_controller上,不会继续运行显示started_controller等,最开始我还以为别的哪里出问题了,一行一行排查了半天。


解决方案:

最后发现是在驱动的main函数里少了spin😂。

是的如果你的驱动里没有spin,那这个函数没法进行下去,因为controller_manager不知道你这表有没有加载成功控制器,所以他一直卡着。

我的驱动里确实也没有别的需要spin的地方,所以一开始就没写,不过ros官方教程里也没写,这个感觉有点被误导了,找了半天最后ros answer上找了一个老哥和我遇到的问题差不多,然后这里用了它的解决方法,在main里加一个spinner,完整的main函数如下:

How to load a controller from control_manager? - ROS Answers: Open Source Q&A Forum

int main(int argc, char** argv)
{
    ros::init(argc, argv, "rf_hybrid_arm_driver_node");
    
    RFHybridArmHW RFARM;    
    controller_manager::ControllerManager cm(&RFARM);
    ROS_INFO("Arm bring up successfully");

    // NOTE: We run the ROS loop in a separate thread as external calls such
    // as service callbacks to load controllers can block the (main) control loop
    ros::AsyncSpinner spinner(3);
    spinner.start();

    // 控制循环
    ros::Rate loop_rate(RFARM.control_rate); // 控制频率为50Hz
    ros::Duration d(0.05);
    while (ros::ok())
    {
        RFARM.read();
        cm.update(ros::Time::now(), d);
        RFARM.write();
        loop_rate.sleep();
    }

    return 0;
}

 参考资料

hardware_interface · ros-controls/ros_control Wiki (github.com)

How to load a controller from control_manager? - ROS Answers: Open Source Q&A Forum

ros_control - ROS Wiki

h@h-virtual-machine:~/aubo_ws$ ros2 launch aubo_i5_gazebo test.gazebo.launch.py [INFO] [launch]: All log files can be found below /home/h/.ros/log/2025-07-25-16-40-27-798050-h-virtual-machine-31616 [INFO] [launch]: Default logging verbosity is set to INFO [INFO] [gzserver-1]: process started with pid [31618] [INFO] [gzclient-2]: process started with pid [31620] [INFO] [robot_state_publisher-3]: process started with pid [31622] [INFO] [spawn_entity.py-4]: process started with pid [31625] [INFO] [bash-5]: process started with pid [31627] [INFO] [bash-6]: process started with pid [31629] [robot_state_publisher-3] [INFO] [1753432828.373311758] [robot_state_publisher]: got segment base_link [robot_state_publisher-3] [INFO] [1753432828.373590615] [robot_state_publisher]: got segment joint1_link [robot_state_publisher-3] [INFO] [1753432828.373603955] [robot_state_publisher]: got segment joint2_link [robot_state_publisher-3] [INFO] [1753432828.373609868] [robot_state_publisher]: got segment joint3_link [robot_state_publisher-3] [INFO] [1753432828.373615390] [robot_state_publisher]: got segment joint4_link [robot_state_publisher-3] [INFO] [1753432828.373621594] [robot_state_publisher]: got segment joint5_link [robot_state_publisher-3] [INFO] [1753432828.373627217] [robot_state_publisher]: got segment joint6_link [robot_state_publisher-3] [INFO] [1753432828.373632439] [robot_state_publisher]: got segment world [gzserver-1] Gazebo multi-robot simulator, version 11.10.2 [gzserver-1] Copyright (C) 2012 Open Source Robotics Foundation. [gzserver-1] Released under the Apache 2 License. [gzserver-1] http://gazebosim.org [gzserver-1] [spawn_entity.py-4] [INFO] [1753432828.810467358] [spawn_entity]: Spawn Entity started [spawn_entity.py-4] [INFO] [1753432828.810970088] [spawn_entity]: Loading entity published on topic robot_description [spawn_entity.py-4] [INFO] [1753432828.813452317] [spawn_entity]: Waiting for entity xml on robot_description [spawn_entity.py-4] [INFO] [1753432828.826102443] [spawn_entity]: Waiting for service /spawn_entity, timeout = 30 [spawn_entity.py-4] [INFO] [1753432828.826707322] [spawn_entity]: Waiting for service /spawn_entity [gzserver-1] [Wrn] [gazebo_ros_init.cpp:178] [gzserver-1] # # ####### ####### ### ##### ####### [gzserver-1] ## # # # # # # # # [gzserver-1] # # # # # # # # # [gzserver-1] # # # # # # # # ##### [gzserver-1] # # # # # # # # # [gzserver-1] # ## # # # # # # # [gzserver-1] # # ####### # ### ##### ####### [gzserver-1] [gzserver-1] This version of Gazebo, now called Gazebo classic, reaches end-of-life [gzserver-1] in January 2025. Users are highly encouraged to migrate to the new Gazebo [gzserver-1] using our migration guides (https://gazebosim.org/docs/latest/gazebo_classic_migration?utm_source=gazebo_ros_pkgs&utm_medium=cli) [gzserver-1] [gzserver-1] [spawn_entity.py-4] [INFO] [1753432829.333393143] [spawn_entity]: Calling service /spawn_entity [spawn_entity.py-4] [INFO] [1753432829.480578006] [spawn_entity]: Spawn status: SpawnEntity: Successfully spawned entity [aubo_i5] [gzserver-1] [INFO] [1753432829.500749762] [gazebo_ros2_control]: Loading gazebo_ros2_control plugin [gzserver-1] [INFO] [1753432829.508535522] [gazebo_ros2_control]: Starting gazebo_ros2_control plugin in namespace: / [gzserver-1] [INFO] [1753432829.508980593] [gazebo_ros2_control]: Starting gazebo_ros2_control plugin in ros 2 node: gazebo_ros2_control [gzserver-1] [INFO] [1753432829.514734750] [gazebo_ros2_control]: connected to service!! robot_state_publisher [gzserver-1] [INFO] [1753432829.516534351] [gazebo_ros2_control]: Received urdf from param server, parsing... [gzserver-1] [INFO] [1753432829.516701968] [gazebo_ros2_control]: Loading parameter files /home/h/aubo_ws/src/aubo_i5_gazebo/config/aubo_controllers.yaml [gzserver-1] [INFO] [1753432829.528429217] [gazebo_ros2_control]: Loading joint: joint1 [gzserver-1] [INFO] [1753432829.528604952] [gazebo_ros2_control]: State: [gzserver-1] [INFO] [1753432829.528626541] [gazebo_ros2_control]: position [gzserver-1] [INFO] [1753432829.528640562] [gazebo_ros2_control]: velocity [gzserver-1] [INFO] [1753432829.528652700] [gazebo_ros2_control]: Command: [gzserver-1] [INFO] [1753432829.528663805] [gazebo_ros2_control]: position [gzserver-1] [INFO] [1753432829.528951732] [gazebo_ros2_control]: Loading joint: joint2 [gzserver-1] [INFO] [1753432829.528976488] [gazebo_ros2_control]: State: [gzserver-1] [INFO] [1753432829.528982442] [gazebo_ros2_control]: position [gzserver-1] [INFO] [1753432829.528988435] [gazebo_ros2_control]: velocity [gzserver-1] [INFO] [1753432829.528993446] [gazebo_ros2_control]: Command: [gzserver-1] [INFO] [1753432829.528999069] [gazebo_ros2_control]: position [gzserver-1] [INFO] [1753432829.529311482] [gazebo_ros2_control]: Loading joint: joint3 [gzserver-1] [INFO] [1753432829.529343013] [gazebo_ros2_control]: State: [gzserver-1] [INFO] [1753432829.529350379] [gazebo_ros2_control]: position [gzserver-1] [INFO] [1753432829.529356553] [gazebo_ros2_control]: velocity [gzserver-1] [INFO] [1753432829.529361584] [gazebo_ros2_control]: Command: [gzserver-1] [INFO] [1753432829.529366966] [gazebo_ros2_control]: position [gzserver-1] [INFO] [1753432829.529472504] [gazebo_ros2_control]: Loading joint: joint4 [gzserver-1] [INFO] [1753432829.529487237] [gazebo_ros2_control]: State: [gzserver-1] [INFO] [1753432829.529493541] [gazebo_ros2_control]: position [gzserver-1] [INFO] [1753432829.529499104] [gazebo_ros2_control]: velocity [gzserver-1] [INFO] [1753432829.529504325] [gazebo_ros2_control]: Command: [gzserver-1] [INFO] [1753432829.529509237] [gazebo_ros2_control]: position [gzserver-1] [INFO] [1753432829.529592774] [gazebo_ros2_control]: Loading joint: joint5 [gzserver-1] [INFO] [1753432829.529606155] [gazebo_ros2_control]: State: [gzserver-1] [INFO] [1753432829.529611647] [gazebo_ros2_control]: position [gzserver-1] [INFO] [1753432829.529622521] [gazebo_ros2_control]: velocity [gzserver-1] [INFO] [1753432829.529627503] [gazebo_ros2_control]: Command: [gzserver-1] [INFO] [1753432829.529632624] [gazebo_ros2_control]: position [gzserver-1] [INFO] [1753432829.529713506] [gazebo_ros2_control]: Loading joint: joint6 [gzserver-1] [INFO] [1753432829.529725974] [gazebo_ros2_control]: State: [gzserver-1] [INFO] [1753432829.529731196] [gazebo_ros2_control]: position [gzserver-1] [INFO] [1753432829.529736408] [gazebo_ros2_control]: velocity [gzserver-1] [INFO] [1753432829.529741469] [gazebo_ros2_control]: Command: [gzserver-1] [INFO] [1753432829.529746540] [gazebo_ros2_control]: position [gzserver-1] [INFO] [1753432829.530061280] [resource_manager]: Initialize hardware 'aubo_i5' [gzserver-1] [INFO] [1753432829.530356153] [resource_manager]: Successful initialization of hardware 'aubo_i5' [gzserver-1] [INFO] [1753432829.530488511] [resource_manager]: 'configure' hardware 'aubo_i5' [gzserver-1] [INFO] [1753432829.530502352] [resource_manager]: Successful 'configure' of hardware 'aubo_i5' [gzserver-1] [INFO] [1753432829.530510019] [resource_manager]: 'activate' hardware 'aubo_i5' [gzserver-1] [INFO] [1753432829.530517165] [resource_manager]: Successful 'activate' of hardware 'aubo_i5' [gzserver-1] [INFO] [1753432829.530665389] [gazebo_ros2_control]: Loading controller_manager [gzserver-1] [WARN] [1753432829.556442502] [gazebo_ros2_control]: Desired controller update period (0.01 s) is slower than the gazebo simulation period (0.001 s). [gzserver-1] [INFO] [1753432829.556970229] [gazebo_ros2_control]: Loaded gazebo_ros2_control. [INFO] [spawn_entity.py-4]: process has finished cleanly [pid 31625] [gzserver-1] [INFO] [1753432833.837082732] [controller_manager]: Loading controller 'joint_state_broadcaster' [bash-5] [INFO] [1753432833.881838055] [spawner_joint_state_broadcaster]: Loaded joint_state_broadcaster [gzserver-1] [INFO] [1753432833.883853217] [controller_manager]: Configuring controller 'joint_state_broadcaster' [gzserver-1] [INFO] [1753432833.884310716] [joint_state_broadcaster]: 'joints' or 'interfaces' parameter is empty. All available state interfaces will be published [bash-5] [INFO] [1753432833.936698403] [spawner_joint_state_broadcaster]: Configured and activated joint_state_broadcaster [INFO] [bash-5]: process has finished cleanly [pid 31627] [bash-6] [INFO] [1753432836.854495432] [spawner_joint_trajectory_controller]: waiting for service /controller_manager/list_controllers to become available... [gzserver-1] [INFO] [1753432838.389211263] [controller_manager]: Loading controller 'joint_trajectory_controller' [gzserver-1] [WARN] [1753432838.416173335] [joint_trajectory_controller]: [Deprecated]: "allow_nonzero_velocity_at_trajectory_end" is set to true. The default behavior will change to false. [bash-6] [INFO] [1753432838.420001632] [spawner_joint_trajectory_controller]: Loaded joint_trajectory_controller [gzserver-1] [INFO] [1753432838.422569411] [controller_manager]: Configuring controller 'joint_trajectory_controller' [gzserver-1] [WARN] [1753432838.422762949] [joint_trajectory_controller]: 'joints' parameter is empty. [gzserver-1] [INFO] [1753432838.422781601] [joint_trajectory_controller]: No specific joint names are used for command interfaces. Using 'joints' parameter. [gzserver-1] [ERROR] [1753432838.422788326] [joint_trajectory_controller]: 'command_interfaces' parameter is empty. [gzserver-1] [ERROR] [1753432838.422801065] [controller_manager]: After configuring, controller 'joint_trajectory_controller' is in state 'unconfigured' , expected inactive. [bash-6] [ERROR] [1753432838.424266927] [spawner_joint_trajectory_controller]: Failed to configure controller [ERROR] [bash-6]: process has died [pid 31629, exit code 1, cmd 'bash -c sleep 8; $0 $@ /opt/ros/humble/lib/controller_manager/spawner joint_trajectory_controller --ros-args --params-file /tmp/launch_params_48wbwplm']. ^C[WARNING] [launch]: user interrupted with ctrl-c (SIGINT) [robot_state_publisher-3] [INFO] [1753432843.942029544] [rclcpp]: signal_handler(signum=2) [INFO] [robot_state_publisher-3]: process has finished cleanly [pid 31622] [gzserver-1] [Msg] Waiting for master. [gzserver-1] [Msg] Connected to gazebo master @ http://127.0.0.1:11345 [gzserver-1] [Msg] Publicized address: 192.168.136.131 [gzserver-1] [Msg] Loading world file [/home/h/aubo_ws/install/aubo_i5_gazebo/share/aubo_i5_gazebo/worlds/empty.world] [INFO] [gzserver-1]: process has finished cleanly [pid 31618] [gzserver-1] [gzserver-1] [ERROR] [gzclient-2]: process has died [pid 31620, exit code -2, cmd 'gzclient']. h@h-virtual-machine:~/aubo_ws$
最新发布
07-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值