ROS CallBack 함수와 spinOnce()의 트리거링 메커니즘과 메시지 큐의 이해

ROS 구독자 콜백 함수의 트리거 조건

spinOnce() 함수로 looping을 하면 구독자의 콜백 함수가 호출되는데, 이때 구독한 메시지 큐의 크기를 확인하게 되는데 이때
구독자의 메시지 큐의 크기가 n이라면 n개의 콜백이 발생하게 된다. 실행.

ROS 메시지 큐 이해

주로 다음과 같은 상황으로 나누어집니다.

구독자의 메시지 큐가 1인 경우

하위 측의 메시지 큐 크기는 1이고 콜백 함수는 항상 최신 데이터만 가져옵니다.

구독자의 메시지 큐가 10(>1)인 경우

하위 측의 메시지 큐 크기는 10이고 콜백 함수는 캐시에서 수신된 모든 데이터를 순차적으로 읽기 위해 10번 트리거됩니다. 메시지 큐가 충분히 크면 게시된 데이터의 프레임을 놓치지 않습니다. 펍 쪽..

게시자의 메시지 대기열이 1인 경우

게시 측의 메시지 대기열 크기는 1입니다. 각 게시는 이 주기의 최신 데이터만 게시합니다.

게시자의 메시지 대기열이 10(>1)인 경우

publish게시자의 메시지 큐 크기가 1보다 크면 까다로울 것입니다. 먼저 함수의 메커니즘에 대해 이야기해야 합니다 . 게시자가 publish함수를 호출하면 시스템은 메시지가 실제로 전송될 때까지 차단되지 않지만 메시지를 보냅니다. msg는 큐(이 큐는 게시자의 메시지 큐입니다)에 저장된 후 즉시 반환됩니다. 메시지가 실제로 전송되는 시기를 결정하는 것은 ros에 달려 있습니다. 다음 코드를 고려해보세요.

#include <ros/ros.h>
#include <std_msgs/UInt32.h>

int main(int argc, char** argv) {
  ros::init(argc, argv, "pub_node");
  ros::NodeHandle n;
  // ros::Publisher chatter_pub = n.advertise<std_msgs::UInt32>("chatter", 1);
  ros::Publisher chatter_pub = n.advertise<std_msgs::UInt32>("chatter", 20);
  ros::Rate loop_rate(10);
  while (ros::ok()) {
    static int count = 0;
    static std_msgs::UInt32 msg;
    msg.data = count;
    for (int i = 0; i < 10; ++i) {
      chatter_pub.publish(msg);
    }
    loop_rate.sleep();
    ++count;
  }
  return 0;
}

코드의 for 루프를 확인하세요. for 루프는 게시 작업을 10번 수행합니다. 직관적으로 여러분은 while 루프 주기에서 이 게시자가 메시지를 10번 게시했다고 생각할 것입니다. 그러나 방금 말한 내용에 따르면 함수는 메시지가 publish실제로 전송될 때까지 차단하지 않지만 이 메시지를 게시 큐에 저장합니다. 따라서 게시 큐가 1과 같이 매우 짧은 경우 while 루프 주기가 10개의 게시 작업을 수행하지 않을 가능성이 매우 높습니다(단지 2개만). 내 컴퓨터)), ros가 실제로 메시지를 보내기 전에 큐에 있는 이전 메시지가 새 메시지에 의해 푸시되기 때문입니다. 그러나 게시 대기열을 20으로 설정하면 while 루프 주기는 실제로 10개의 게시 작업을 실행합니다. 왜냐하면 대기열의 크기가 for 루프의 10배보다 큰 20이기 때문입니다. 따라서 오래된 메시지는 압축되지 않습니다. 밖으로.

따라서 게시자 메시지 큐가 충분히 크면 전송해야 하는 데이터 프레임이 누락되지 않습니다.

Supongo que te gusta

Origin blog.csdn.net/zmhzmhzm/article/details/129756448
Recomendado
Clasificación