5. ROS 소형 차 폐쇄 제어: 다 중 (동기 화) 입력 노드 단일 출력 노드 의 폐쇄 제어 구조

전편 에서 이 보 를 말 했 는데 게 으 른 사람 에 게 적합 하 다 고 생각 합 니 다. 모두 상위 기 에 놓 고 같이 하면 됩 니 다.
동기 화 는 이 송 동기 화 메커니즘 을 사용 한 글 을 참고 할 수 있다.
https://blog.csdn.net/start_from_scratch/article/details/52337689
이 위 키 와:http://wiki.ros.org/message_filters
그리고 재 미 있 는 것 은 이름 이 messagefilter s, 우리 가 흔히 말 하 는 filter 가 아 닙 니 다.
그 가 한 역할 은 여러 개의 출력 을 통일 적 으로 캐 시 한 다음 에 마지막 에 들 어 온 정 보 를 함께 현재 의 시간 에 수출 하 는 것 이다. 이것 은 정확도 에 대한 요구 가 비교적 높 은 통제 에 좋 지만 솔직히 말 하면 ROS 1 이라는 폐기물 의 주기 정확도 (저 는 아직 연구 에 깊이 들 어가 지 않 았 습 니 다. 현재 간단하게 알 고 있 는 것 은 이렇게 가볍게 뿌리 는 것 입 니 다) 입 니 다.데이터 카드 가 아무리 정확 해도 심리 적 위로 성분 이 많다 는 것 이다.그 러 니까 진짜 로... 동기 화 를 풀 었 으 면 좋 겠 어 요.
주의해 야 할 것 은 동기 화 정 보 는 반드시 시간 스탬프 가 있어 야 한 다 는 것 이다. 즉, * * Stamped 또는 그 자체 의 정보 유형 에 이런 속성 이 있어 야 한다 (물론 당신 이 쓴 이 유형 도 시간 스탬프 를 포함 하고 보통 hearder 에 있어 야 한다). 그렇지 않 으 면 잘못 보고 할 수 있다.
그럼 시작!
코드:
#include "std_msgs/String.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include 
#include 
#include 

int counter;
const double pi = 3.141592653;
double imu_test;
//       ,  ConstPtr!!!
//odom_input     ,     ,         !
void callback(const nav_msgs::OdometryConstPtr& odom_input,
              const sensor_msgs::ImuConstPtr& imu_input) {
  //       
  //         ,           ,      。
  

  ROS_INFO("odom test is: %lf ", (double)odom_input->twist.twist.linear.x);
  ROS_INFO("imu test is: %lf ", (double)imu_input->header.stamp.Time::nsec/1000000); //          
  counter++;
}

int main(int argc, char **argv) {

  ros::init(argc, argv, "sync_control_node"); //         
  ros::NodeHandle nh;                         //          
  ros::Publisher pub_;

  message_filters::Subscriber<:odometry>odom_sub(nh, "/odom",5); //  odom
  message_filters::Subscriber<:imu>imu_sub(nh, "/imu/data",5); //  imu

  pub_ = nh.advertise<:twist>("/cmd_vel", 10); //  cmd_vel
  geometry_msgs::Twist output;

  typedef message_filters::sync_policies::ApproximateTime<:odometry> MySyncPolicy; //                 

 
  // ApproximateTime takes a queue size as its constructor argument, hence
  // MySyncPolicy(10)
  //             ,                           ,    。

  message_filters::Synchronizer sync(MySyncPolicy(10), odom_sub, imu_sub);
  sync.registerCallback(boost::bind(&callback, _1, _2)); //     ,  callback     counter
  
ros::Rate loop_rate(30);
  while (nh.ok()) {

    output.angular.z = 0;
    output.linear.x = 0.1 * sin(counter * pi / 50);
    output.linear.y = 0;
    pub_.publish(output);
    ros::spinOnce();
    loop_rate.sleep();
  }
  return 0;
}

 
실수 하기 쉬 운 곳 에 주석 을 달 았 습 니 다. 그리고 한 가지 더 있 습 니 다. 바로 roboware 안에 cmakelist. txt 는 수 동 으로 물건 을 추가 해 야 합 니 다. findpackage 에 message 를 추가 해 야 합 니 다.filters
 
이렇게 됨:
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_filters
)

그리고 앞의 공사 와 마찬가지 로 역시 별로 좋 지 않 은 효과 가 있 었 습 니 다. 바로 소식 이 동기 화 되 어 만 족 스 러 웠 습 니 다.
내 가 출력 을 관찰 할 때 30Hz 로 설정 하면 30Hz 가 느껴 지지 않 고 잃 어 버 린 숫자 가 더 많아 집 니 다!!데 이 터 를 보면 실제 차이 가 많 지 않 은 것 은 20Hz 가 한 번 에 출력 을 하 는 것 이다. 만약 에 더 많이 입력 하면 더 느 릴 것 이 라 고 생각 하지 않 는 다. 다 도착 해 야 데 이 터 를 통일 적 으로 입력 해 야 하기 때문에 메시지 전송 노드 의 빈 도 를 높이 면 최종 적 인 전체 빈 도 를 올 려 야 한다. 그러나 구체 적 으로 설정 치 와 얼마나 차이 가 나 는 지 는 운 에 달 려 있 는 것 같다.
각자 좋 은 것 이 있 습 니까?

좋은 웹페이지 즐겨찾기