自定义控制器在全局启动文件中启动时死亡

问题描述 投票:0回答:1

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

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

我按照通常的 ROS 方法(即自定义界面、手柄、控制器、消息)实现了自定义

LedController
来控制硬件上的一些 LED。

当我启动位于

hardware.launch
project_hardware
时,控制器工作正常(即通过相应主题将 LED 设置为给定值)。

但是,当我使用全局启动文件

LedController
(位于另一个名为
 的子包中)启动所有内容时,
controller_manager
 会死掉(并且还会杀死 
robot.launch
,进而杀死我的所有其他控制器)仅限project

当我将 Led 部分从

hardware.xml
移动到单独的文件 (
led.launch
) 并首先启动
robot.launch
,然后启动
led.launch
时,一切正常。当我将
led.launch
包含在
robot.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.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_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
包含Led部分从
hardware.xml
移动:

<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
1个回答
1
投票

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

您可以尝试将

ros::init_options::AnonymousName
添加到您的node.init 中,然后重试。

© www.soinside.com 2019 - 2024. All rights reserved.