现在已经在墙上撞了一会儿,我几乎不好意思问社区,因为这很可能会导致我接受指针或范围的训练。
我正在使用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;
}