我正在使用ROS和C ++,在从void callback()中的主题接收数据之后,我需要将这些数据传递给int main()中的变量。到目前为止我发现的是我可以使用boost共享指针来完成它,并且应该使用“带有回调作为成员函数的程序中的类”。 到目前为止我的部分代码:
double pos_z;
void callback(gazebo_msgs::LinkStates msgs_ls)
{
double pos_z = msgs_ls.pose[43].position.z
pos_z = pos_z + 1;
}
int main(int argc, char **argv)
{
ros::init(...);
ros::Nodehandle n;
ros::Subscriber ls_sub = n.subscribe("/gazebo/link_states", 10, callback);
ros::ServiceClient sls_client = n.serviceClient<gazebo_msgs::SetLinkState>("/gazebo/set_link_state");
gazebo_msgs::SetLinkState setLinkState;
while (ros::ok))
{
setLinkState.request.link_state.position.z = pos_z;
sls_client.call(setLinkState);
}
关于共享指针:这可能是boost::shared_ptr<double> a_ptr(&a, noop_delete
auto noop_delete = [](double *){}
但我真的不明白如何实现它。另外提到的回调作为成员函数的类对我来说还不清楚。示例显示使用C的实现,我不知道是否可以使用它。
谢谢你的帮助。
答案 0 :(得分:2)
你给出的建议很好:
使用“回调作为成员函数的程序中的类”
你这样做:
class SuperCoolRobot {
public:
SuperCoolRobot ():pos_z(0) {
// Note : we provide the callback (a member) + a state (this)
ls_sub = n.subscribe("/gazebo/link_states", 10, SuperCoolRobot::link_state_callback, this);
}
void link_state_callback(gazebo_msgs::LinkStates msgs_ls) {
pos_z = msgs_ls.pose[43].position.z + 1;
}
void run() {
gazebo_msgs::SetLinkState setLinkState;
while (ros::ok))
{
setLinkState.request.link_state.position.z = pos_z;
sls_client.call(setLinkState);
}
}
protected:
// state here
ros::Nodehandle n;
ros::Subscriber ls_sub;
double pos_z;
};
然后是主要的:
int main(int argc, char **argv) {
SuperCoolRobot robot;
robot.run();
}
请注意,我不知道ROS,所以我只是把你理解的代码扔掉了。当然是它。