【机器人学】机器人开源项目KDL源码学习:(10)KDL中的OOP思想---继承
C++语言的一个重要特征是可以进行面向对象的设计(OOP),而OOP的核心思想之一便是使用继承,可以定义相似的类型并对其相似关系进行建模。通过继承联系在一起的类构成一种层次关系,层次关系的根部有一个基类(base class),其它类则直接或间接地从基类继承而来,这些继承得到的类称为派生类(derived class)。
机器人轨迹规划算法中,一个很重要的问题是路径的计算,但是机器人的路径有多种,包含直线路径,圆弧路径,复合路径等等。所以在KDL中就定义了一个基类:路径(class path),和其它6个派生类:开口圆路径(Path_Circle)、组合路径(Path_Composite)、封闭圆路径(Path_Cyclic_Closed)、直线路径(Path_Line)、仅含点的路径(Path_Point)、含圆弧过渡的路径(Path_RoundedComposite)。
需注意一下基类(path)中的虚函数(virtual)很多是纯虚函数,这些是派生类中必须给出自己的定义,例如Path_Line中相应的虚函数,可看出每种路径的都需要定义并重新定义:LengthToS,PathLength,Pos,Vel,Acc,Write。
class Path
{
virtual double LengthToS(double length) = 0;
virtual double PathLength() = 0;
virtual Frame Pos(double s) const = 0;
virtual Twist Vel(double s,double sd) const = 0;
virtual Twist Acc(double s,double sd,double sdd) const = 0;
virtual void Write(std::ostream& os) = 0;
static Path* Read(std::istream& is);
virtual Path* Clone() = 0;
virtual IdentifierType getIdentifier() const=0;
virtual ~Path() {}
};
}
class Path_Line : public Path
{
Path_Line(const Frame& F_base_start,const Frame& F_base_end,RotationalInterpolation* orient,double eqradius,bool _aggregate=true);
Path_Line(const Frame& F_base_start,const Twist& twist_in_base,RotationalInterpolation* orient,double eqradius,bool _aggregate=true);
double LengthToS(double length);
virtual double PathLength();
virtual Frame Pos(double s) const;
virtual Twist Vel(double s,double sd) const ;
virtual Twist Acc(double s,double sd,double sdd) const;
virtual void Write(std::ostream& os);
virtual Path* Clone();
virtual IdentifierType getIdentifier() const {return ID_LINE;}
virtual ~Path_Line();
};
}