gpt4 book ai didi

controller - 自定义 Controller 在全局启动文件中启动时死亡

转载 作者:行者123 更新时间:2023-12-02 13:14:26 25 4
gpt4 key购买 nike

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

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

我实现了一个自定义 LedController 来按照通常的 ROS 方法(即自定义界面、 handle 、 Controller 、消息)控制硬件上的一些 Led。

当我启动位于 project_hardware 中的 hardware.launch 时, Controller 工作正常(即通过相应主题将 LED 设置为给定值)。

但是,当我使用全局启动文件启动所有内容时,LedController死掉了(并且还杀死了controller_manager,而controller_manager又杀死了我所有其他 Controller ) >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.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>

最佳答案

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

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

关于controller - 自定义 Controller 在全局启动文件中启动时死亡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44373075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com