栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

基于LCM(C++)的双机通信测试(linux主机+upboard)

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于LCM(C++)的双机通信测试(linux主机+upboard)

测试案例介绍 
linux主机 subscriber代码 
upboard publisher代码
1.测试案例介绍
  upboard连接路由器,linux主机连接路由器wifi,使二者处于同一局域网下
  upboard作为publisher,每隔2seconds发布一则消息,linux主机作为subscriber,接收到消息后在终端打印接受的消息。
2.linux主机subscriber代码

subscriber.cpp

#include "subscriber.h"

Subscriber::Subscriber():_lcm(getLcmUrl(255)){}

void Subscriber::subscribe(){
    _lcm.subscribe("EXAMPLE",&Subscriber::handleMessage,this); //处理回调函数
    _lcmThread = std::thread([&](){
         while(_lcm.handle() == 0) 
               if(IsExit) break;                               //获取到终止标志,退出线程
     std::cout << "goodbye !" << std::endl;
    });
}


void Subscriber::handleMessage(const lcm::ReceiveBuffer* rbuf,const std::string &chan,
				   const exlcm::example_t *msg)
{
    (void)rbuf;

    _mutex.lock(); 
	int i;
    std::cout << std::endl;
    std::cout << "i am the subscriber !" << std::endl;
    printf("Received message on channel "%s":n", chan.c_str());
    printf("  timestamp   = %lldn", (long long) msg->timestamp);
    printf("  position    = (%f, %f, %f)n", msg->position[0], msg->position[1],
    msg->position[2]);
    printf("  orientation = (%f, %f, %f, %f)n", msg->orientation[0], msg->orientation[1],
    msg->orientation[2], msg->orientation[3]);
    printf("  ranges:");
    for (i = 0; i < msg->num_ranges; i++)
    printf(" %d", msg->ranges[i]);
    printf("n");
    printf("  name        = '%s'n", msg->name.c_str());
    printf("  enabled     =   %dn", msg->enabled);
    std::cout << "looking for your next message !" << std::endl;
    std::cout << std::endl;
   _mutex.unlock(); 

    if(msg->timestamp >= 3)     IsExit = true;            //接受到终止信号
}

subscriber.h

#pragma once
#include 
#include 
#include "exlcm/example_t.hpp"
#include 
#include 
#include "utilities.h"

class Subscriber{
	public:
     Subscriber();
	~Subscriber(){};
	 void handleMessage(const lcm::ReceiveBuffer* rbuf,const std::string &chan,
				   const exlcm::example_t *msg);
     void subscribe();
     bool getIsExit() {return IsExit;}

    private:
       lcm::LCM     _lcm;
       std::thread  _lcmThread;
       std::mutex   _mutex;
       bool IsExit = false;
};

main.cpp

#include 
#include "utilities.h"
#include "subscriber.h"
#include 

int main(int argc,char** argv){
    Subscriber _s;   
 
    _s.subscribe();

    while(!_s.getIsExit());      //阻塞主线程,等待subscriber接收完毕
  
    sleep(1);                    //等待subscriber线程退出,退出主线程

    return 0;
}

Makefile

CXX = g++

#Use pkg-config to lookup the proper compiler and linker flags for LCM
CFLAGS  = "/usr/local/include/`ls /usr/local/include/lcm`"        #lcm库相关头文件
LDFLAGS =  lcm                                                    #lcm库相关动态库文件

           

all:exlcm/example_t.hpp 
    main                         

all:
	@rm -f *.o                


main:main.o subscriber.o utilities.o
	$(CXX) -o $@ $^ -l$(LDFLAGS) -lpthread

%.o:%.cpp exlcm/example_t.hpp           #生成二进制文件
	$(CXX) -I$(CFLAGS) -I. -o $@ -c $<

exlcm/%.hpp:                            #利用lcm-gen将.lcm转换为.hpp
	lcm-gen -x *.lcm


clean:
	rm -f main   
	rm -f exlcm
std::string getLcmUrl(int64_t ttl) {
  assert(ttl >= 0 && ttl <= 255);
  return "udpm://239.255.76.67:7667?ttl=" + std::to_string(ttl);
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/825737.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号