最近在写一个发布里程的节点的时候遇到了,发布了消息,在ros却没有对应话题情况。通过rostopic list 和 rosnode info 节点名 命令查看,均没有对应话题,大致代码如下:
class Estimator
{
private:
ros::NodeHandle nh;
ros::Publisher vo_pub;
public:
Estimator(){vo_pub = nh.advertise<nav_msgs::Odometry>("vo", 1);}
void publish()
{
nav_msgs::Odometry vo_odom;
... ...
vo_pub.publish(vo_odom);
}
}
int main(int argc, char **argv)
{
//创建
ros::init(argc, argv, "slam");
ros::NodeHandle nh;
ros::Rate r(10);
while (ros::ok())
{
Estimator e;
e.publish();
ros::spinOnce();
r.sleep();
}
}
后来想了一下,发现是在循环中定义Estimator对象时,类的成员nh并被正确初始化。
解决方案一:
class Estimator
{
private:
ros::NodeHandle nh;
ros::Publishe vo_pub;
public:
Estimator(){vo_pub = nh.advertise<nav_msgs::Odometry>("vo", 1);}
void publish()
{
nav_msgs::Odometry vo_odom;
... ...
vo_pub.publish(vo_odom);
}
}
int main(int argc, char **argv)
{
//创建
ros::init(argc, argv, "slam");
ros::NodeHandle nh;
ros::Rate r(10);
Estimator e;
while (ros::ok())
{
e.publish();
ros::spinOnce();
r.sleep();
}
}
这个方案适用于可以在循环外定义类的实例的情况,有些时候我们就想在循环里定义一个实例,应该怎么办呢?可以采用下面的方案。
解决方案二:
class Estimator
{
private:
public:
Estimator(){}
nav_msgs::Odometry vo()
{
nav_msgs::Odometry vo_odom;
... ...
return vo_odom);
}
}
int main(int argc, char **argv)
{
//创建
ros::init(argc, argv, "slam");
ros::NodeHandle nh;
ros::Publisher vo_pub = nh.advertise<nav_msgs::Odometry>("vo", 1);
ros::Rate r(10);
while (ros::ok())
{
Estimator e;
nav_msgs::Odometry vo_odom = e.vo();
vo_pub.publish(vo_odom);
ros::spinOnce();
r.sleep();
}
}
这种办法,感觉比较麻烦。如果有啥好的办法,欢迎指教啊!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)