5. ROS 소형 차 폐쇄 제어: 다 중 (동기 화) 입력 노드 단일 출력 노드 의 폐쇄 제어 구조
3705 단어 ROS 소형 차 폐쇄 실현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 가 한 번 에 출력 을 하 는 것 이다. 만약 에 더 많이 입력 하면 더 느 릴 것 이 라 고 생각 하지 않 는 다. 다 도착 해 야 데 이 터 를 통일 적 으로 입력 해 야 하기 때문에 메시지 전송 노드 의 빈 도 를 높이 면 최종 적 인 전체 빈 도 를 올 려 야 한다. 그러나 구체 적 으로 설정 치 와 얼마나 차이 가 나 는 지 는 운 에 달 려 있 는 것 같다.
각자 좋 은 것 이 있 습 니까?
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Xillybus and ROS on Ubuntu14.04 on Zybo Part 1 : 하드웨어 빌드 ~ BOOT.bin 생성에서 zybo 기본 디자인 (직접 링크)를 다운로드하여 작업 공간에 저장합니다. C:\work_space\xillinux-eval-zybo-1.3c.zip 전개하면 다음과 같은 디렉토리 구조로 되어 있습니다. Viv...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.