Рос подписчик обрабатывает старое сообщение

В настоящее время я пытаюсь передать некоторую информацию между двумя узлами ros.
Издатель, будучи узлом ros, написанным на python, публикует строку в теме, а подписчик, будучи узлом ros, написанным на cpp, имеет функцию обратного вызова, которая реагирует на сообщения, отправляемые в эту тему.

Моя проблема с функцией обратного вызова в части cpp, которая не обрабатывает недавно опубликованное сообщение, а только то, которое было отправлено непосредственно перед новым. Подписчик cpp в основном на одно сообщение отстает.

Повторение темы показывает, что сообщение, публикуемое в теме, является правильным, поэтому что-то должно быть не так в части cpp.
В настоящее время обратный вызов только печатает входящее сообщение, и ничего больше.

Абонент на стороне CPP инициализируется так:

status(nodehandle.subscribe("/status",10000,&wrapper::callback, this))

void wrapper::callback(const std_msgs::String& command)
{
ROS_ERROR_STREAM("RECEIVED a callback");
std::cout <<"Received unconverted message: "<< command.data << std::endl;
}

Я попытался изменить queue_size безрезультатно.

Я уверен, что код python публикует правильное сообщение, отлаживая его, повторяя тему.

И отправка нескольких сообщений доказывает, что сообщения, полученные на cpp-части, задерживаются на одно сообщение.

Почему я не могу прочитать последнее сообщение, опубликованное в теме?

MWE:

ros::NodeHandle nodehandle;
ros::Publisher control_cpp_to_python;
ros::Publisher control_front_to_python;
ros::Subscriber status_manual;
ros::Subscriber status_auto;
ros::Rate loop_rate;
void callback_manual(const std_msgs::String& command)
{
ROS_ERROR_STREAM("RECEIVED a callback");
std::cout <<"Received unconverted message - manuak: "<< command.data << std::endl;

if(checked == true)
{
std::cout << "Message received from correct callback - Manual" << std::endl;
checked = false;
thread_running=false;
}
else
{
checked = true;
}
}
void callback_auto(const std_msgs::String& command)
{
ROS_ERROR_STREAM("RECEIVED a callback");
std::cout <<"Received unconverted message - auto: "<< command.data << std::endl;

if(checked == true)
{
std::cout << "Message received from correct callback - Manual" << std::endl;
checked = false;
thread_running=false;
}
else
{
checked = true;
}
}

while(thread_running)
{
loop_rate.sleep();
if(!thread_running) break;
if(mode == "manual")
{
std_msgs::Int8 msg;
std::bitset<4> msg_bit;
msg_bit.set(3,1);
msg_bit.set(2,1);
msg_bit.set(1,1);
msg_bit.set(0,0);
std::cout << "Sending message in manual mode!" << std::endl;
std::cout << "Message being: "<< msg_bit << std::endl;
msg.data = int(msg_bit.to_ulong());
control_front_to_python.publish(msg);
}
if(mode == "auto")
{
std::cout << "Publishing message in auto" << std::endl;
std_msgs::Int8 msg;
msg.data = 8;
control_cpp_to_python.publish(msg);
}
ros::spinOnce();
}

Я думаю, что это настолько царапается, насколько это возможно. Я предполагаю, что проблема должна быть из-за того, что я установил thread_running в false внутри обратного вызова. Я в настоящее время исправил это checked bool как временное исправление.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]