【问题标题】:Custom controller dies when launched in global launch file自定义控制器在全局启动文件中启动时死亡
【发布时间】:2017-06-05 16:07:40
【问题描述】:

我有一个自定义机器人,由不同的节点和控制器组成,它们组织在子包中:

.
├── project
│   ├── launch
├── project_description
│   └── urdf
├── project_hardware
│   ├── config
│   ├── launch
├── project_logic
│   ├── launch
├── project_networking
└── project_vision

我按照通常的 ROS 方法(即自定义接口、句柄、控制器、消息)实现了一个自定义 LedController 来控制我的硬件上的一些 LED。

当我启动位于project_hardwarehardware.launch 时,控制器工作正常(即通过相应主题将LED 设置为给定值)。

但是,当我使用位于不同子包中的全局启动文件 robot.launch 启动所有内容时,LedController 会死掉(并且还会杀死 controller_manager,这反过来会杀死我的所有其他控制器)只叫project

当我将 Led 部分从 hardware.xml 移动到单独的文件 (led.launch) 并首先启动 robot.launch 然后 led.launch 一切正常。当我在robot.launch 中包含led.launch(见下文)时,它不起作用。

由于工作和不工作之间的区别只是包含led.launch 或通过roslaunch 手动启动它,因此我没有调试想法。我感谢任何提示我进一步调试步骤并最终解决我的问题的提示。如果您需要更多信息,请告诉我。

我的hardware.launch

<launch>
  <arg name="nodelet_manager" default="nodelet_manager" />
  <node name="$(arg nodelet_manager)" pkg="nodelet" type="nodelet" args="manager" />

  <param name="robot_description" command="$(find xacro)/xacro.py '$(find project_description)/urdf/ccs_robot.xacro'" />

  <include file="$(find project_hardware)/launch/hardware.xml">
    <arg name="nodelet_manager" value="$(arg nodelet_manager)" />
  </include>
</launch>

我的hardware.xmlLedController

<launch>
  <arg name="nodelet_manager" />
  <rosparam file="$(find project_hardware)/config/drive_controller.yaml" />
  <node name="drive_controller_spawner" pkg="controller_manager" type="spawner" args="drive_controller --shutdown-timeout 2" />
  <node name="driver" pkg="nodelet" type="nodelet" args="load project/RobotNodelet $(arg nodelet_manager)" >
    <param name="rate" value="100" />
    <param name="ros_hw_velocity_conversion_factor" value="5.615" />
    <param name="ros_hw_led_max_value" value="64" />
  </node>

  <rosparam file="$(find project_hardware)/config/distance_sensor_controller.yaml" />
  <node name="distance_sensor_controller_spawner" pkg="controller_manager" type="spawner" args="distance_sensor_controller --shutdown-timeout 2" />
  <rosparam file="$(find project_hardware)/config/led_controller.yaml" />
  <node name="led_controller_spawner" pkg="controller_manager" type="spawner" args="led_controller --shutdown-timeout 2" />
</launch>

我的robot.launch

<launch>
  <arg name="nodelet_manager" default="nodelet_manager" />
  <node name="$(arg nodelet_manager)" pkg="nodelet" type="nodelet" args="manager" />

  <param name="robot_description" command="$(find xacro)/xacro.py '$(find project_description)/urdf/ccs_robot.xacro'" />
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"/>

  <include file="$(find project_vision)/launch/feature_extraction.xml">
    <arg name="nodelet_manager" value="$(arg nodelet_manager)" />
  </include>
  <include file="$(find project_logic)/launch/demo_app.xml" />
  <include file="$(find project_logic)/launch/logic.xml">
    <arg name="nodelet_manager" value="$(arg nodelet_manager)" />
  </include>
  <include file="$(find project_hardware)/launch/hardware.xml">
    <arg name="nodelet_manager" value="$(arg nodelet_manager)" />
  </include>
  <!--<include file="$(find project_hardware)/launch/led.launch" />-->
  <include file="$(find project_networking)/launch/monitoring.launch" />
</launch>

我的hardware.xml 没有LedController

<launch>
  <arg name="nodelet_manager" />
  <rosparam file="$(find project_hardware)/config/drive_controller.yaml" />
  <node name="drive_controller_spawner" pkg="controller_manager" type="spawner" args="drive_controller --shutdown-timeout 2" />
  <node name="driver" pkg="nodelet" type="nodelet" args="load project/RobotNodelet $(arg nodelet_manager)" >
    <param name="rate" value="100" />
    <param name="ros_hw_led_max_value" value="64" />
  </node>

  <rosparam file="$(find project_hardware)/config/distance_sensor_controller.yaml" />
  <node name="distance_sensor_controller_spawner" pkg="controller_manager" type="spawner" args="distance_sensor_controller --shutdown-timeout 2" />
</launch>

我的led.launch 包含从hardware.xml 移出的Led 部分:

<launch>
  <rosparam file="$(find project_hardware)/config/led_controller.yaml" />
  <node name="led_controller_spawner" pkg="controller_manager" type="spawner" args="led_controller --shutdown-timeout 2" />
</launch>

【问题讨论】:

    标签: controller config ros robotics robot


    【解决方案1】:

    基于启动文件,一切似乎都很好,但我认为你在编写节点时的错误是你用相同的值初始化了 2 个不同代码的节点,当 1 启动时,停止另一个代码,所以一切都会中断(但是不确定没有看到错误)。

    您可以尝试将ros::init_options::AnonymousName 添加到您的node.init 并重试。

    【讨论】:

    • 感谢您的回答。我会试试的。
    最近更新 更多