OpenNI Subscription [closed]
This is a fairly simple problem which I'm pretty sure would have been answered somewhere but can't find the solution.
One of my nodes subscribes to the Kinect OpenNI driver node's (roslaunch openni_launch openni.launch
) rgb and depth topics. More often than not, when I call SIGINT on the subscribing node and restart it, the OpenNI node fails to publish any more topics. Sometimes I am given a TF transform error (require a lookup into the past) and sometimes not. Is this due to not 'flusing' the subscribed topics or something not mentioned in the tutorials?
EDIT: I am using ros fuerte on a Ubuntu 12.04 system
EDIT: After waiting it out for a while after not publishing I get this error
terminate called after throwing an instance of 'openni_wrapper::OpenNIException'
what(): virtual void openni_wrapper::OpenNIDevice::startImageStream() @ /tmp/buildd/ros-fuerte-openni-camera-1.8.0/debian/ros-fuerte-openni-camera/opt/ros/fuerte/stacks/openni_camera/src/openni_device.cpp @ 224 : starting image stream failed. Reason: Xiron OS got an event timeout!
[camera_nodelet_manager-2] process has died [pid 7029, exit code -6, cmd /opt/ros/fuerte/stacks/nodelet_core/nodelet/bin/nodelet manager __name:=camera_nodelet_manager __log:=/home/oliver/.ros/log/d2dbb3fa-0861-11e2-a3ba-002219ebc74e/camera_nodelet_manager-2.log].
log file: /home/oliver/.ros/log/d2dbb3fa-0861-11e2-a3ba-002219ebc74e/camera_nodelet_manager-2*.log
It's a blob tracker but I've omitted the blob tracking code (doesn't affect the subscription issue), so here is my callback
void ImageCb(const sensor_msgs::ImageConstPtr &msg)
{
cv_bridge::CvImagePtr cv_ptr;
try
{
cv_ptr = cv_bridge::toCvCopy(msg, enc::BGR8);
}
catch (cv_bridge::Exception& e)
{
ROS_ERROR("cv_bridge exception: %s", e.what());
return;
}
IplImage *imageBGR,*imageHSV,temp;
imageBGR = cvCreateImage( size , IPL_DEPTH_8U, 3);
imageHSV = cvCreateImage( size , IPL_DEPTH_8U, 3);
temp = (cv_ptr->image.operator IplImage());
imageBGR = cvCloneImage( &temp );
cvCvtColor(imageBGR, imageHSV, CV_BGR2HSV); //takes up memory?
cvSetMouseCallback( ORIGINAL, my_mouse_callback, (void*) imageHSV );
if (drawing_box_){
cvSetImageROI( imageBGR, box );
cvXorS( imageBGR, cvScalarAll(255), imageBGR, 0 );
cvResetImageROI( imageBGR );
}
//call blob tracker for each blob
/*
for (unsigned ci = 0; ci < blob_tracker.size() ; ci++){
blob_tracker[ci]->ImageFilter(imageHSV);
imageBGR = ShowROI(blob_tracker[ci], imageBGR);
}*/
cvShowImage(ORIGINAL, imageBGR);
cvWaitKey(30);
cvReleaseImage( &imageBGR );
cvReleaseImage( &imageHSV );
}
and the main function
int main(int argc, char ** argv)
{
//ros initialisations
ros::init(argc, argv, "image_converter");
ros::NodeHandle main_nh_;
ros::Rate loop_rate(20);
cvNamedWindow(ORIGINAL, CV_WINDOW_AUTOSIZE);
image_transport::ImageTransport main_it_(main_nh_);
image_transport::Subscriber main_image_sub_ = main_it_.subscribe("/camera/rgb/image_color", 1, &ImageCb);
blob_tracker.resize(0);
cout << "Click the RGB image to track a colour blob" << endl << endl;
while (ros::ok()){
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
We could be more helpful if you tell us what versions of Operative System and ROS distribution you are using. OpenNI is being kind of unstable right now in ROS Fuerte.
updated that information
Are you using your own mechanism to catch the SIGINT or is that just a standard ROS node? Maybe you could provide a code so we could run it overhere.
standard ROS node to my understanding. Got an error message this time, and updated more information
On a related topic, what is this 'nodelet' thing? When I instantiate new blob tracker's the nodelet cpu usage skyrockets
what happens when you use the command line tool to subscribe to a topic of the openni_launch node more than one time? (e.g. $rostopic hz /camera/depth_registered/points )
can subscribe to more than one at a time, but when you un-subscribe, then re-subscribe, the error happens again.
I have kind of the same issue under electric & ubuntu 11.10 too. I have the feeling that it could be something with the EMI which disconnects trhe device from the USB-Hub after closing it once...