surgical-robotics-ai / surgical_robotics_challenge

Interactive Robot Assisted Suturing Simulation
55 stars 43 forks source link

PSMs don't reach commanded set-points #64

Closed kschwan closed 1 year ago

kschwan commented 1 year ago

Hi @adnanmunawar, I'm revisiting Task 2 (needle grasping and driving) as we have some students wanting to use the simulated environment in a project. I'm experiencing some issues however:

It doesn't seem like the PSM's are able to reach the commanded joint space set-points. Are they not supposed to, can it be improved, or is it an error on my part?

I attach an example where I command the robot to move to a Needle/Grasp frame. The joint space set-point is computed through surgical_robotics_challenge.kinematics.psmIK.compute_IK and published on the /CRTK/psm2/servo_jp topic (interpolating a trajectory in joint space).

The images below show the simulator view, and the commanded Needle/Grasp frame and current /CRTK/psm2/measured_cp pose.

psm2.txt has rostopic output corresponding to the state shown in the images.

I interface with the simulator via launch_crtk_interface.py and I have set add_joint_errors=False.

I use collaborative-robotics/surgical_robotics_challenge@314a4ba and WPI-AIM/ambf@18637b4.

PS. I have the same issue using velocity control.

Screenshot from 2023-03-01 10-27-20

Screenshot from 2023-03-01 10-27-38

JackHaoyingZhou commented 1 year ago

Hi @adnanmunawar and @kschwan ,

I have also found out the same issue with the latest repository.

Last year I designed a customized recorder directly recording the self._ik_solution (psm_arm.py, line#167) therefore I manage to avoid this problem. This year, I attempt to use rosbag for recording and the problem starts to come out.

In addition to the description of @kschwan, I print out the joint positions directly from servo_jp and measured_jp simultaneously. You may check the following screenshot for the information. And we can see that all the joints have minor differences between servo_jp and measured_jp. Would you mind giving some hints about how to solve this problem? Thank you!

Selection_005

adnanmunawar commented 1 year ago

Hi Kim and Jack,

You guys are correct, there is indeed a steady state error in arm's joint controller loops. This is due to the default controller gains for each joint (https://github.com/collaborative-robotics/surgical_robotics_challenge/blob/master/ADF/psm1.yaml#L697), since we don't specify the PID gains, they default to (P: 10, I: 0. D:1). Once can optimize these gains to reduce the steady-state error and here is an example of how to manually set the gains (https://github.com/WPI-AIM/ambf/blob/ambf-2.0/ambf_models/descriptions/multi-bodies/robots/blender-kuka-lbr-med.yaml#L557). One can also use the Blender addon to set the gains before generating the ADF file as shown below: Setting controller gains

Lastly, if you disable gravity by pressing the 2 key on the keyboard, the steady-state error would go to zero, but the other objects in the scene would also start floating around. We can add a per object gravity setting so that we can disable the gravity only for the links of the PSM arms and that way not have to worry about optimizing the controller gains for optimal positioning.

kschwan commented 1 year ago

Thanks Adnan, sounds good, I'll pass on the information!

adnanmunawar commented 1 year ago

Hi Guys, I have implemented the setting of per object or per model gravity in AMBF. Please see the discussion here (https://github.com/WPI-AIM/ambf/discussions/199).

Please pull the latest version of ambf and build it. Then one can set zero gravity at the model level scope of the psm1, psm2, psm3 files and the position control should be accurate.

adnanmunawar commented 1 year ago

Please checkout the commit above. Don't forget to pull the latest ambf commit and build it before trying out the SRC.

JackHaoyingZhou commented 1 year ago

Hi Adnan,

Hope all is well!

Thank you for the update! Unfortunately, I have attempted the latest version with latest AMBF. It seems that the problem has not been resolved yet.

I also print out the joint positions directly from servo_jp and measured_jp simultaneously. You may check the following screenshot for the information. And we can see that all the joints still have minor differences between servo_jp and measured_jp.

Selection_004

It may involve fine tuning the PID parameters for accurate control. Or would you mind giving some other hints which may be helpful? Thank you!

adnanmunawar commented 1 year ago

Hi Jack,

Thanks. A fews things to make sure. Did you pull and rebuild AMBF? Then did you pull the latest version of SRC? When you load the SRC, you should see messages in the console saying something like "INFO! Setting OBJECT's gravity to ...". Finally, are you sure that the commanded joint positions are not resulting in collision of the PSMs with the environment? Finally, just to make sure, have you set the joint errors to 0.0?

JackHaoyingZhou commented 1 year ago

Hi Adnan,

Thank you for the instruction!

For most of the points, I am in the same page with you, except that didn't correctly source the latest built AMBF, therefore it doesn't run as expected. In the previous running, the message "INFO! Setting OBJECT's gravity to ..." didn't show up. After fixing this problem, I tested again, and the result seems good. It has very slight errors which can be ignored in most times:

Selection_006

One more point to bring for replaying: If somebody record the topic "/ambf/env/psm1(2)/baselink/State", when they want to replay, they may need to divide the third joint (the prismatic joint) value by 10 before feeding to psm.servo_jp() command. And sometimes the gripper command may be not reliable because of some obstacles or blocking in the simulation scene. They can consider using an offset if necessary.

adnanmunawar commented 1 year ago

Hi Jack, thanks for this info. I would suggest that if you are recording the state (joint space or Cartesian space) of the PSMs, you should record them from the measured_jp topic that is available after running the launch_crtk_interface.py script. This script also launches a subscriber called servo_jp (and very soon we will add `move_jp'). Recording and publishing via these topics (interfaces) will take care of the scaling issue.

adnanmunawar commented 1 year ago

Closing this as resolved