找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3010|回复: 1
打印 上一主题 下一主题
收起左侧

ROS的一个网络通信接口源程序

[复制链接]
跳转到指定楼层
楼主
ROS的一个网络通信接口程序

源程序如下:
  1. #include "header/map_exchange.h"
  2. net_ui::net_ui()
  3. {
  4.         conn_id=0;
  5.                         sock_srv = socket(AF_INET,SOCK_STREAM, 0);
  6.                         memset(&server_addr, 0, sizeof(server_addr));
  7.                         server_addr.sin_family = AF_INET;
  8.                         server_addr.sin_port = htons(12307);
  9.                         server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  10.                         if(bind(sock_srv,(struct sockaddr *)&server_addr,sizeof(server_addr))==-1)
  11.                         {
  12.                                 perror("Binding:");
  13.                                 exit(1);
  14.                         }
  15.                         if(listen(sock_srv,QUEUE) == -1)
  16.                         {
  17.                         perror("Listen");
  18.                                 exit(1);
  19.                         }
  20.                         //申明所有Publisher
  21.                         map_pub = n.advertise<nav_msgs::OccupancyGrid>("env_map", 1,true);
  22.                         //申明所有Subscriber
  23.                         map_sub = n.subscribe<nav_msgs::OccupancyGrid>("map",1,&net_ui::map_Callback,this);
  24.                         std_clk = n.subscribe<std_msgs::String>("CORE_clk",1,&net_ui::clk_Callback,this);
  25.                         server_waitforclient=n.subscribe<std_msgs::Float64>("ui_deadcycle",1,& net_ui::deadcycle_Callback,this);
  26.                         std_msgs::Float64 id;
  27.                         ros::Publisher ui_server_pub = n.advertise<std_msgs::Float64>("ui_deadcycle", 1);
  28.                         ui_server_pub.publish(id);
  29. }
  30. net_ui::~net_ui()
  31. {
  32.         close(sock_srv);
  33. }
  34. void net_ui::Connect()
  35. {
  36.         if(conn_id>=QUEUE) return;
  37.         conn_id++;
  38.         printf("正在等待用户连接\n");
  39.         conn[conn_id]= accept(sock_srv, (struct sockaddr*)&client_addr, &length);
  40.         printf("第%d名用户连接!!!\n",conn_id);
  41. }
  42. void  net_ui::deadcycle_Callback(const std_msgs::Float64::ConstPtr& msg)
  43. {
  44.         ros::Rate r(10);
  45.         while(n.ok())
  46.         {
  47.                 Connect();
  48.                 r.sleep();
  49.         }
  50. }
  51. int  net_ui::Download()
  52. {
  53.         char recvBuf[16];
  54.         int re=recv(conn[conn_id-1],recvBuf ,16,0);
  55.         if(recvBuf[0]==0x0a&&recvBuf[15]==0x0d)
  56.         {
  57.                 switch(recvBuf[1])
  58.                 {
  59.                 case 0x01:
  60.                 {
  61.                         char buf[6];
  62.                         buf[1]=m_map.info.height/256;buf[2]=m_map.info.height%256;
  63.                         buf[3]=m_map.info.width/256;buf[4]=m_map.info.width%256;
  64.                         buf[0]=0xff;buf[5]=0xff;
  65.                         Upload(buf,6);
  66.                         break;
  67.                 }
  68.                 case 0x02:
  69.                 {

  70.                 }
  71.                 }
  72.         }
  73. }
  74. void net_ui::Upload(char *a,int len)
  75. {
  76.         send(conn[conn_id-1],a,len,0);
  77. }
  78. void net_ui::map_Callback(const nav_msgs::OccupancyGrid::ConstPtr& msg)
  79. {
  80.         m_map.info.height=msg->info.height;
  81.         m_map.info.width=msg->info.width;
  82.         m_map.info.resolution=msg->info.resolution;
  83.         m_map.info.origin.position.x=m_map.info.width*m_map.info.resolution;
  84.         m_map.info.origin.position.y=m_map.info.height*m_map.info.resolution;
  85.         double map_time=(msg->info.map_load_time.toSec());
  86.         for(int i=0;i<m_map.info.height ;i++)
  87.         {
  88.                 for(int j=0;j<m_map.info.width;j++)
  89.                 {
  90.                         if (map_occupy[i][j]<0) map_occupy[i][j]='X';
  91.                         else map_occupy[i][j]=(msg->data[i*m_map.info.width +j])/10+'0';
  92.                 }
  93.         }
  94.         Map_saver();
  95. }
  96. void net_ui::clk_Callback(const std_msgs::String::ConstPtr& msg)
  97. {

  98. }
  99. int net_ui::Map_saver()
  100. {
  101.         printf("收到地图长:%d,宽:%d  \n",m_map.info.height,m_map.info.width);
  102.         printf("等待写入地图...\n");
  103.         FILE *fp;
  104.         fp = fopen("/home/exbot/AGV/src/cfg/maps/map.map","wb");
  105.         if(fp==NULL) {printf("连接磁盘时出现错误!\n");return 1;}
  106.         fprintf(fp,"%d %d %f\n",m_map.info.width,m_map.info.height,m_map.info.resolution);
  107.         for(int i=0;i<m_map.info.height;i++) fprintf(fp,"%s\n",map_occupy[i]);
  108.         fclose(fp);
  109.         printf("写入地图完成!\n");
  110.         return 0;
  111. }
  112. int net_ui::Map_loader()
  113. {
  114.         FILE *fp;
  115.         printf("等待读取地图...\n");
  116.         fp = fopen("/home/exbot/AGV/src/cfg/maps/map.map","rb");
  117.         if(fp==NULL) {printf("连接磁盘时出现错误!\n");return 1;}
  118.         fscanf(fp,"%d %d %f\n",&m_map.info.width,&m_map.info.height,&m_map.info.resolution);
  119.         printf("磁盘内地图长:%d,宽:%d 分辨率:%f \n",m_map.info.height,m_map.info.width,m_map.info.resolution);
  120.           m_map.info.origin.position.x = 0.0;
  121.           m_map.info.origin.position.y = 0.0;
  122.           m_map.header.frame_id = "map";
  123.           m_map.info.map_load_time = ros::Time::now();
  124.           m_map.header.stamp = ros::Time::now();
  125.         for(int i=0;i<m_map.info.height;i++)
  126.         {
  127.                 fscanf(fp,"%s",map_occupy[i]);
  128.         }

  129.         for(int i=0;i<m_map.info.height ;i++)
  130.         {
  131.                 for(int j=0;j<m_map.info.width;j++)
  132.                 {
  133.                         if(map_occupy[i][j]=='X') map_occupy[i][j]=-1;
  134.                         else map_occupy[i][j]=(map_occupy[i][j]-'0')*10;
  135.                 }
  136.         }
  137.         //发布地图消息
  138.         m_map.data.resize((long)m_map.info.width*m_map.info.height);
  139.         for(long i=0;i<((long)m_map.info.width*m_map.info.height);i++) m_map.data[i]=(int)(map_occupy[i/m_map.info.width][i%m_map.info.width]);
  140.         fclose(fp);
  141.         map_pub.publish(m_map);
  142.         printf("地图已经发布!\n");
  143.         return 0;
  144. }
  145. /**************************************                       MAIN                        ************************************/
  146. int main(int argc, char** argv)
  147. {
  148.         ros::init(argc, argv, "map_exchanger");
  149.         ros::AsyncSpinner spinner(2);
  150.         spinner.start();
  151.         net_ui map_exchanger;
  152.         ros::Rate r(0.3);
  153.         map_exchanger.Map_loader();
  154.         while(map_exchanger.n.ok())
  155.         {
  156.                 //map_exchanger.Map_loader();
  157.                         r.sleep();
  158.         }
  159.         return 0;
  160. }
复制代码

所有资料51hei提供下载:
ui.zip (11.3 KB, 下载次数: 14)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:468431 发表于 2020-9-16 20:29 | 只看该作者
谢谢楼主,可是怎么用呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表