PID control of original robot in Gazebo

asked 2022-07-10 07:01:58 -0500

Renox gravatar image

Hi, I want to speed control the robot arm by using gazebo. I wrote launch and yaml file and run, but I get error.


      <param name = "robot_description" textfile = "$(find make_robot2)/urdf/cougarbot.urdf"/>

      <include file = "$(find gazebo_ros)/launch/empty_world.launch"/>

     <node name = "spawn_urdf" pkg = "gazebo_ros" type = "spawn_model" args = "-param robot_description -urdf -model cougarbot"/>

    <rosparam file = "$(find make_robot2)/config/velocity_controllers.yaml" command = "load"/>

   <node name = "controller_spawner" pkg = "controller_manager" type = "spawner" args = "arm_controller"/>

   <node name = "robot_state_publisher" pkg = "robot_state_publisher" type = "robot_state_publisher"/>


  type: "velocity_controllers/JointTrajectoryController"
    - hip
    - shoulder
    - elbow
    - wrist
    hip: {p:10, d:1, i:1,i_clamp:1}
    shoulder: {p:10, d:1, i:1,i_clamp:1}
    elbow: {p:10, d:1, i:1,i_clamp:1}
    wrist: {p:10, d:1, i:1,i_clamp:1}


user@ubuntu:~$ roslaunch make_robot2 velocity_cougarbot.launch
... logging to /home/rentaro/.ros/log/a74e4d40-003d-11ed-b0a7-bbbf09bb464c/roslaunch-ubuntu-10877.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://ubuntu:45057/


 * /arm_controller/gains/elbow/d:0.1: None
 * /arm_controller/gains/elbow/i:1: None
 * /arm_controller/gains/elbow/p:100: None
 * /arm_controller/gains/hip/d:0.1: None
 * /arm_controller/gains/hip/i:1: None
 * /arm_controller/gains/hip/p:100: None
 * /arm_controller/gains/shoulder/d:0.1: None
 * /arm_controller/gains/shoulder/i:1: None
 * /arm_controller/gains/shoulder/p:100: None
 * /arm_controller/gains/wrist/d:0.1: None
 * /arm_controller/gains/wrist/i:1: None
 * /arm_controller/gains/wrist/p:100: None
 * /arm_controller/joints: ['hip', 'shoulder...
 * /arm_controller/type: velocity_controll...
 * /gazebo/enable_ros_network: True
 * /robot_description: <?xml version="1....
 * /rosdistro: noetic
 * /rosversion: 1.15.14
 * /use_sim_time: True

    controller_spawner (controller_manager/spawner)
    gazebo (gazebo_ros/gzserver)
    gazebo_gui (gazebo_ros/gzclient)
    robot_state_publisher (robot_state_publisher/robot_state_publisher)
    spawn_urdf (gazebo_ros/spawn_model)

auto-starting new master
process[master]: started with pid [10885]

setting /run_id to a74e4d40-003d-11ed-b0a7-bbbf09bb464c
process[rosout-1]: started with pid [10895]
started core service [/rosout]
load_parameters: unable to set parameters (last param was [/arm_controller/gains/wrist/i:1=None]): cannot marshal None unless allow_none is enabled
Traceback (most recent call last):
  File "/opt/ros/noetic/lib/python3/dist-packages/roslaunch/", line 347, in main
  File "/opt/ros/noetic/lib/python3/dist-packages/roslaunch/", line 316, in start
  File "/opt/ros/noetic/lib/python3/dist-packages/roslaunch/", line 676, in launch
  File "/opt/ros/noetic/lib/python3/dist-packages/roslaunch/", line 663, in _setup
  File "/opt/ros/noetic/lib/python3/dist-packages/roslaunch/", line 354, in _load_parameters
    r  = param_server_multi()
  File "/usr/lib/python3.8/xmlrpc/", line 879, in __call__
    return MultiCallIterator(self.__server.system.multicall(marshalled_list))
  File "/usr/lib/python3.8/xmlrpc/", line 1109, in __call__
    return self.__send(self.__name, args)
  File "/usr/lib/python3.8/xmlrpc/", line 1447, in __request
    request = dumps(params, methodname, encoding=self.__encoding,
  File "/usr/lib/python3.8/xmlrpc/", line 968 ...
edit retag flag offensive close merge delete


hip: {p:10, d:1, i:1,i_clamp:1}

try with a space between your keys and your values. So instead of p:10, p: 10.

PyYAML doesn't like it when you don't separate them with at least one space.

gvdhoorn gravatar image gvdhoorn  ( 2022-07-10 07:15:06 -0500 )edit

It looks like your controller arguments are being assigned to the None object by default. Could you instead define your gains as:

    hip: [p, d, i, i_clamp]

You can then use indexing to obtain the arguments in your code, i.e., p = gains.hip[0].

cenwerem gravatar image cenwerem  ( 2022-07-10 18:59:33 -0500 )edit

I am a beginner of programming, so I first tried the method of gvdhoorn. As a result, I get another error.


[ERROR] [1657504789.455790454, 0.308000000]: No p gain specified for pid.  Namespace: /gazebo_ros_control/pid_gains/hip
[ERROR] [1657504789.456985693, 0.308000000]: No p gain specified for pid.  Namespace: /gazebo_ros_control/pid_gains/shoulder
[ERROR] [1657504789.458574517, 0.308000000]: No p gain specified for pid.  Namespace: /gazebo_ros_control/pid_gains/elbow
[ERROR] [1657504789.459541456, 0.308000000]: No p gain specified for pid.  Namespace: /gazebo_ros_control/pid_gains/wrist
Renox gravatar image Renox  ( 2022-07-10 21:32:12 -0500 )edit