【机器人学】机器人开源项目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();
	};
}

 

posted @ 2021-03-08 01:16  gpeng832  阅读(36)  评论(0编辑  收藏  举报  来源