学生です。
私は複数のsubscriberを周期的かつ同時に呼び出すプログラムを書きたいと思っています。そのため最初はprogram1のようにプログラムを書いていましたが、main関数だけをprogram2のように書き換えました。fig1のプログラムではros::spin()によって、3つのsubscriberがバラバラに呼び出されていました。そこでwhile文を使って周期的に呼びだそうと思いました。しかし、program2のプログラムでもバラバラに呼び出されてしまいました。しかも、program1のプログラムでは実行されていたdepthCbの中で記述されているpublisherも実行されなくなってしまいました。どのようにプログラムを書けば複数のsubscriberを定期的かつ同時に呼び出すことができるのでしょうか。
program1#include <ros/ros.h>
...
void messageCallback(const sensor_msgs::JointState::ConstPtr& msg3)
{
...
}
void imageCb(const sensor_msgs::ImageConstPtr& msg2)
{
...
}
void depthCb( const sensor_msgs::ImageConstPtr& msg1)
{
...
ros::Publisher pub = n.advertise<PointCloud> ("points2", 1);
PointCloud::Ptr cloud (new PointCloud);
cloud->header.frame_id = "/base";
pcl_conversions::toPCL(ros::Time::now(), cloud->header.stamp);
...
cloud->points.push_back (cloud->points[0]);
pcl_conversions::toPCL(ros::Time::now(), cloud->header.stamp);
pub.publish (cloud);
}
int main( int argc, char* argv[])
{
ros::init( argc, argv, "depth_viewer" );
ros::NodeHandle n;
ros::Subscriber joint = n.subscribe("/hp3j/joint_states", 1000, messageCallback);
ros::Subscriber color = n.subscribe("/pico_flexx_link_ir/image_raw", 1000, imageCb);
ros::Subscriber depth = n.subscribe("/pico_flexx_link/depth_registered/image_raw", 3, &depthCb);
ros::spin();
return 0;
}
program2int main(argc, char* argv[])
{
ros::init( argc, argv, "depth_viewer" );
ros::NodeHandle n;
ros::Subscriber joint = n.subscribe("/hp3j/joint_states", 1000, messageCallback);
ros::Subscriber color = n.subscribe("/pico_flexx_link_ir/image_raw", 1000, imageCb);
ros::Subscriber depth = n.subscribe("/pico_flexx_link/depth_registered/image_raw", 3, &depthCb);
ros::Rate loop_rate(0.1);
while (ros::ok()) {
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}