Strange behavior observed in sequential PID controllers

Issue #10 new
Vikrant Shah
created an issue

When I set up two controllers one depending on other as below. I observe that on one of my computers which is a bit resource limited, the 'pitch controller' doesn't publish the control_effort output /fins/elevator_cmd. When I run the two nodes one after another in separate launch file, the issues seems to go away.

I believe the cause might be a race situation between the two nodes when setting up the publishers & subscribers causing them to not register for some reason. Do you think this could be the cause?

<launch>
 <node name="pitch_controller" pkg="pid" type="controller" output="screen" >
    <param name="node_name" value="pitch_pid" />
    <param name="Kp" value="25.0" />
    <param name="Ki" value="0.0" />
    <param name="Kd" value="0.00" />
    <param name="upper_limit" value="+0.5" />
    <param name="lower_limit" value="-0.5" />
    <param name="windup_limit" value="0.5" />
    <param name="max_loop_frequency"      value="1000.0" />
    <param name="min_loop_frequency"      value="2.0" />
    <param name="topic_from_controller"   value="fins/elevator_cmd" />      
    <param name="topic_from_plant"        value="pitch" />      
    <param name="setpoint_topic"          value="target_pitch" />      
    <param name="angle_error"             value="true" />      
  </node>

 <node name="depth_controller" pkg="pid" type="controller" output="screen" >
    <param name="node_name" value="depth_pid" />
    <param name="Kp" value="0.1" />
    <param name="Ki" value="0.0" />
    <param name="Kd" value="0.00" />
    <param name="upper_limit" value="0.392699082" />
    <param name="lower_limit" value="-0.392699082" />
    <param name="windup_limit" value="0.15" />
    <param name="max_loop_frequency"      value="100.0" />
    <param name="min_loop_frequency"      value="2.0" />
    <param name="topic_from_controller"   value="target_pitch" />      
    <param name="topic_from_plant"        value="paro/depth" />      
    <param name="setpoint_topic"          value="target_depth" />      
    <param name="angle_error"             value="false" />      
  </node>

      <node pkg="rostopic" type="rostopic" name="topic_0" args="pub /paro/depth std_msgs/Float64 'data: 0.0' -r 10" output="screen"/>

  <node pkg="rostopic" type="rostopic" name="topic_1" args="pub /target_depth std_msgs/Float64 'data: 2.0' -r 5" output="screen"/>

    <node pkg="rostopic" type="rostopic" name="topic_2" args="pub /pitch std_msgs/Float64 'data: 0.0' -r 20" output="screen"/>

</launch>

Cheers, Vik

Comments (4)

  1. Vikrant Shah reporter

    So, the other thing I noticed is that when the PID node is not behaving correctly, when I ctrl-x out of it, it doesn't just stop cleanly. To close it, I have too ctrl-z and then kill it.

  2. Andrew J Zelenak repo owner

    Can you please checkout the new branch to see if it helps? It checks if the subscribers are initialized correctly and puts a ros::ok() in every while loop that might cause issues. Thanks Vik

    git checkout issue10

  3. Log in to comment