我遇到了c ++继承的麻烦,我找不到错误。我有一个实现简单的独轮车运动模型的类。
namespace kinematics{
class Unicycle{
// state variables
geometry_msgs::Pose2D _state; ///< position of the robot
// robot parameters
float _max_linear_vel; ///< maximum linear velocity, saturation
float _b; ///< output point offset
// integration variables
float _int_step; ///< integration step
protected:
void _updateOdometry(float dv, float tr);
void _ioLinearization(float vx, float vy, double &d, double &t);
public:
Unicycle();
Unicycle(float is, float b, float vmax, geometry_msgs::Pose2D initS);
};
}
由于差分驱动器运动模型是单轮脚踏车的扩展,我想使用继承来实现。
#include "unicycle/Unicycle.h"
class DiffDrive: public kinematics::Unicycle {
//robot parameters
float _wheel_radius; ///< wheel radius
float _wheel_separation; ///< distance between wheels
void _wheelSpeed(float dv, float tr, float &rs, float &ls);
public:
DiffDrive();
DiffDrive(float wr, float ws, geometry_msgs::Pose2D initS,
float ts, float vmax, float b);
};
我用这种方式写了构造函数
DiffDrive::DiffDrive(float wr,
float ws,
geometry_msgs::Pose2D initS,
float ts,
float vmax,
float b)
:Unicycle(ts,b,vmax,initS), _wheel_radius{wr}, _wheel_separation{ws}{
}
但是当我使用函数_wheelSpeed()
时void DiffDrive::_wheelSpeed(float dv, float tr, float &rs, float &ls){
ls = dv - _wheel_separation*tr/2.f;
ls = ls/_wheel_radius;
rs = _wheel_separation*tr/_wheel_radius + ls;
std::cout << "PARS: " << _wheel_separation << " - " << _wheel_radius << std::endl;
std::cout << "WHEELS: " << rs << " - " << ls << std::endl;
}
_wheel_separation和_wheel_radius的值与预期值不同:
PARS:-179014 - 4.58631e-41
即使使用以下值调用构造函数:
wheel_radius = 0.02;
wheel_sep = 0.04;
_diff_drive = new DiffDrive(wheel_radius,wheel_sep,update_period,vel_max,offset);
请帮助我了解我的代码有什么问题。
答案 0 :(得分:0)
查看继承和组成之间的差异 想一想: 差动驱动器是独轮车还是差动驱动器是独轮车的一部分? 以这种方式,没有任何继承更有意义:
周期是基类
Unicycle是派生类
三轮车是另一个派生类。
差速驱动器是独轮车的一部分。
我认为如果设计是正确的,其余部分将自动落实到位。您获得的值看起来像未初始化的值或已被销毁的对象的值(再次未初始化的值。)
答案 1 :(得分:0)
我弄清楚出了什么问题。我记得在Java中允许从另一个构造函数调用构造函数,以便隐藏一些参数并避免重写整个初始化。例如:
constructor1(par 1, par2){
par3 = 0;
constructor2(par1,par2,par3);
}
我不确定这是否正确,但这就是我的想法。 因此,我按以下方式实现了我的构造函数
DiffDrive::DiffDrive(const float wr,
const float ws,
float ts,
float vmax,
float b):Unicycle(ts,b,vmax){
geometry_msgs::Pose2d initS;
initS.x = 0;
initS.y = 0;
initS.theta = 0;
DiffDrive(wr,ws,initS,ts,vmax,b);
}
不幸的是,这在C ++中是不合法的,它返回了外部构造函数实例化的结果,忽略了内部构造函数。 如果我没有把这个构造函数放在上一个问题中,我很抱歉,但我只是忘了它。我是我的错。 感谢您的帮助,抱歉浪费您的时间。