control toolbox pid not working
I am using pid class of control toolbox. But the output power computer from this is not comming correctly:
#include <medicbot_control/medicbot_hw_interface.h>
#include <exception>
#include <algorithm>
#include <iostream>
#include <bits/stdc++.h>
#include <boost/algorithm/string.hpp>
namespace rrbot_control
{
std::string to_format(const int number,int decPlace) {
std::stringstream ss;
ss << std::setw(decPlace) << std::setfill('0') << number;
return ss.str();
}
RRBotHWInterface::RRBotHWInterface(ros::NodeHandle &nh, urdf::Model *urdf_model)
: ros_control_boilerplate::GenericHWInterface(nh, urdf_model)
{
ROS_INFO_NAMED("rrbot_hw_interface", "RRBotHWInterface Ready.");
pid1.initPid(6.0, 1.0, 2.0, 0.3, -0.3);
pid2.initPid(6.0, 1.0, 2.0, 0.3, -0.3);
time = ros::Time::now();
Setup();
}
void RRBotHWInterface::read(ros::Duration &elapsed_time)
{
const char* enc_ticks = Read();
std::vector<std::string> result;
boost::split(result, enc_ticks, boost::is_any_of(","));
for (int joint_id = 0; joint_id < result.size(); joint_id++) {
joint_velocity_[joint_id] = atof(result[joint_id].c_str());
joint_position_[joint_id] += joint_velocity_[joint_id] * elapsed_time.toSec();
}
}
void RRBotHWInterface::write(ros::Duration &elapsed_time)
{
// Safety
enforceLimits(elapsed_time);
// ----------------------------------------------------
// ----------------------------------------------------
// ----------------------------------------------------
//
// FILL IN YOUR WRITE COMMAND TO USB/ETHERNET/ETHERCAT/SERIAL ETC HERE
//
// FOR A EASY SIMULATION EXAMPLE, OR FOR CODE TO CALCULATE
// VELOCITY FROM POSITION WITH SMOOTHING, SEE
// sim_hw_interface.cpp IN THIS PACKAGE
//
// DUMMY PASS-THROUGH CODE
int joint1_out_pow = pid1.updatePid(joint_velocity_command_[0]-joint_velocity_[0], elapsed_time);
int joint2_out_pow = pid2.updatePid(joint_velocity_command_[1]-joint_velocity_[1], elapsed_time);
std::cout<<"joint="<<joint1_out_pow<<"\t"<<joint2_out_pow<<std::endl;
std::string data = std::to_string(joint1_out_pow)+","+std::to_string(joint2_out_pow);
while(data.length()<8) {
data.push_back(',');
}
const char *res = data.c_str();
if(data.length()==8) {
Write(res);
std::cout<<"Sent data:"<<res<<std::endl;
usleep(10000);
}
// END DUMMY CODE
//
// ----------------------------------------------------
// ----------------------------------------------------
// ----------------------------------------------------
}
i'm using ubuntu 20, ros noetic. Here i'm following this api and example.
Asked by dinesh on 2020-10-20 02:07:37 UTC
Comments
Seeing as this class (and its siblings) is being used by many, many people worldwide every day, my first assumption would not be that the "control toolbox pid [is] not working", but there is something wrong with the way you're trying to use it.
Asked by gvdhoorn on 2020-10-20 02:51:03 UTC
so what is the correct way to use it? and which function updatePid() or calculateCommand() is the one to calculate output power/velocity?
Asked by dinesh on 2020-10-20 03:23:21 UTC