ROS类问题:订阅者未正确修改对象C ++

时间:2017-12-13 01:26:25

标签: c++ class constructor callback ros

现在已经在墙上撞了一会儿,我几乎不好意思问社区,因为这很可能会导致我接受指针或范围的训练。

我正在使用ROS来操纵一个有两条臂的机器人;每只手臂都有一个抓手。我有一个手臂类和一个抓手类;抓手是手臂类的一员。相关代码发布在下面。

总结我的代码:抓手类具有id等成员,需要由callback函数初始化。如果在调用回调之前访问这些成员,它们将获得错误的数据。因此,该类有一个initialized_变量和相关的initialized()函数,它只是检查是否已经调用了回调(初始化在构造时设置为false,然后在回调中设置为true) 。 arm类的设计模式类似;其initialize()函数检查夹具是否已初始化。在主要功能中,在我的ros循环中,我检查以确保手臂都已初始化;如果没有,ros旋转(也称为回调),直到回调初始化夹子,允许程序继续。

总结我的问题:由于正在打印“抓取器已初始化”,因此肯定会调用抓取器的回调函数。但是,它设置的属性不会被保留,因为“成功!”没有打印。此外,打印的id为-1,由构造函数而不是回调设置的值(id为-1是不可能的)。

闻起来像一个范围或指针问题,但我似乎无法找到问题。由于回调函数修改了“this”对象,它正在修改夹子本身,并且在函数退出后应该保留该修改。

如果有人可以提供帮助,我们将非常感激。 提前谢谢。

class Gripper
{
    private: 
        int id;
        bool initialized_;
        ros::Subscriber subscriber;
        void callback(const baxter_core_msgs::EndEffectorState::ConstPtr& msg);
        void init();

    public:
        Gripper();
        Gripper(ros::NodeHandle handle); 
        bool initialized() { return this->initialized_; }
        int get_id() { return this->id; }
};

// DEFAULT CONSTRUCTOR
Gripper::Gripper()
{
    this->init();
    ...
}

// CONSTRUCTOR
Gripper::Gripper(ros::NodeHandle handle)
{
    this->init();
    this->subscriber = handle.subscribe(sub_topic, 10, &Gripper::callback, this);
    ...
}

// CALLBACK FUNCTION
// initializes gripper fields
void Gripper::callback(const baxter_core_msgs::EndEffectorState::ConstPtr& msg) 
{
    this->initialized_ = true;
    this->id = msg->id;
    ...
    if (this->initialized_) ROS_INFO("gripper initialized");
}

// INIT FUNCTION
// common code in constructors
// sets all bools to false, ints to -1
void Gripper::init() 
{
    this->initialized_ = false;
    this->id = -1;
    ...
}

class Arm
{
    public:
        Gripper gripper;
        Arm();
        Arm(ros::NodeHandle handle); 
        bool initialized() 
        { 
            if (this->gripper.initialized()) ROS_INFO("success!");
            ROS_INFO("gripper id: %d");    
            return this->gripper.initialized(); 
        };

};

// DEFAULT CONSTRUCTOR
Arm::Arm() 
{
    this->gripper = gripper();
    ...
}

// CONSTRUCTOR
Arm::Arm(ros::NodeHandle handle)
{
    this->gripper = gripper(handle); 
    ...
}

int main(int argc, char **argv)
{
    // initialize the node and create a node handle
    ros::init(argc, argv, "master_node");
    ros::NodeHandle nh;
    ros::Rate loop_rate(10);

    // make some variables for later
    Arm left_arm(nh, LEFT);
    Arm right_arm(nh, RIGHT);

    // main program content
    while (ros::ok()) 
    {
        // if everything is initialized, start doing the stuff
        if (left_arm.initialized() && right_arm.initialized()) 
        {
                ...
        }

        // spin & sleep
        ROS_INFO("spin");
        ros::spinOnce();
        loop_rate.sleep();
    }

    return 0;
}

0 个答案:

没有答案