瀏覽代碼

增加前后车位置共享

zx 2 年之前
父節點
當前提交
e89ead8c18
共有 10 個文件被更改,包括 950 次插入104 次删除
  1. 1 1
      CMakeLists.txt
  2. 39 11
      MPC/navigation.cpp
  3. 3 1
      MPC/navigation.h
  4. 11 2
      MPC/navigation_main.cpp
  5. 1 0
      MPC/navigation_main.h
  6. 407 54
      MPC/parameter.pb.cc
  7. 459 29
      MPC/parameter.pb.h
  8. 11 2
      config/navigation.prototxt
  9. 10 2
      config/navigation_main.prototxt
  10. 8 2
      parameter.proto

+ 1 - 1
CMakeLists.txt

@@ -77,7 +77,7 @@ add_executable(${PROJECT_NAME}
 # link libraries ${Boost_LIBRARY} -lpthread
 #---------------------------------------------------------------------------------------
 target_link_libraries(${PROJECT_NAME}
-		${GLOG_LIBRARIES} ${PROTOBUF_LIBRARIES}
+		${PROTOBUF_LIBRARIES}
 		libglog.a libgflags.a
 		paho-mqtt3a
 		ipopt

+ 39 - 11
MPC/navigation.cpp

@@ -11,6 +11,8 @@ Navigation::~Navigation()
   exit_=true;
   if(terminator_)
     delete terminator_;
+  if(brotherEmqx_)
+    delete brotherEmqx_;
   if(monitor_)
     delete monitor_;
   if(thread_!= nullptr)
@@ -30,13 +32,26 @@ Navigation::~Navigation()
 /*
  * 高斯函数压缩,x=3
  */
-double limit(double x,double min,double max){
+double limit_gause(double x,double min,double max){
   double r=x>=0?1.0:-1.0;
   double delta=max/1.0;
   return (max-(max-min)*exp(-x*x/(delta*delta)))*r;
 
 }
 
+double limit(double x,double min,double max){
+  double ret=x;
+  if(x>=0){
+    if(x>max) ret=max;
+    if(x<min) ret=min;
+  }else{
+    if(x<-max) ret=-max;
+    if(x>-min) ret=-min;
+  }
+  return ret;
+
+}
+
 double next_speed(double speed,double target_speed,double acc,double dt=0.1)
 {
   if(fabs(target_speed-speed)/dt<acc)
@@ -79,9 +94,21 @@ bool Navigation::Init(const Navigation_parameter& parameter)
     }
 
     terminator_->AddCallback(terminal_p.subnavcmdtopic(),Navigation::NavCmdCallback,this);
-    terminator_->AddCallback(terminal_p.subbrotherstatutopic(),Navigation::BrotherAgvStatuCallback,this);
 
   }
+
+  if(parameter.has_brother_emqx()) {
+    BrotherEmqx brotherEmqx = parameter.brother_emqx();
+    if (brotherEmqx_ == nullptr) {
+      brotherEmqx_ = new Terminator_emqx(brotherEmqx.nodeid());
+
+      if (brotherEmqx_->Connect(brotherEmqx.ip(), brotherEmqx.port()) == false) {
+        printf(" brother emqx connected failed\n");
+        return false;
+      }
+      brotherEmqx_->AddCallback(brotherEmqx.subbrotherstatutopic(), Navigation::BrotherAgvStatuCallback, this);
+    }
+  }
   inited_=true;
 
   if(pubthread_!= nullptr)
@@ -310,7 +337,7 @@ void Navigation::BrotherAgvStatuCallback(const MqttMsg& msg,void* context)
 
   NavMessage::LidarOdomStatu brother_statu;
   if(msg.toProtoMessage(brother_statu)==false) {
-    printf(" msg transform to AGVStatu failed ..!!\n");
+    std::cout<<" msg transform to AGVStatu failed,msg:"<<msg.data()<<std::endl;
     return;
   }
   //std::cout<<brother_nav.DebugString()<<std::endl<<std::endl;
@@ -414,18 +441,19 @@ bool Navigation::execute_adjust_action(const Pose2d& target,const Pose2d& target
       double dt=0.1;
       if (action == 1) {
         if (Pose2d::abs(diff).theta() > thresh.theta()) {
-          double theta = limit(diff.theta(),limit_rotate.min*M_PI/180.0,limit_rotate.max*M_PI/180.0);
+          double theta = limit_gause(diff.theta(),limit_rotate.min*M_PI/180.0,limit_rotate.max*M_PI/180.0);
           double angular=next_speed(timedA_.Get(),theta,acc_angular,dt);
-          SendMoveCmd(move_mode_,Monitor_emqx::eRotate, 0, angular);
-          std::cout<<"current:"<<timedPose_.Get()<<"  target:"<<target<<" diff:"<<diff<<std::endl;
-          printf(" Ratate | input anguar:%f,next angular:%f,target:%f\n",timedA_.Get(),angular,theta);
+          double limit_angular=limit(angular,limit_rotate.min*M_PI/180.0,limit_rotate.max*M_PI/180.0);
+
+          SendMoveCmd(move_mode_,Monitor_emqx::eRotate, 0, limit_angular);
+          printf(" Ratate | input anguar:%f,next angular:%f,down:%f diff:%f\n",timedA_.Get(),angular,limit_angular,theta);
           continue;
         }
       }
       if (action == 2) {
         if (Pose2d::abs(diff).y() > thresh.y()) {
-          double hv=limit(diff.y(),limit_h.min,limit_h.max);
-          double velocity=next_speed(timedV_.Get(),hv,acc_v,dt);
+          double hv=limit_gause(diff.y(),limit_h.min,limit_h.max);
+          double velocity=limit(next_speed(timedV_.Get(),hv,acc_v,dt),limit_h.min,limit_h.max);
           SendMoveCmd(move_mode_,Monitor_emqx::eHorizontal,velocity , 0);
           printf(" Horizontal input:%f out:%f\n",timedV_.Get(),velocity);
           continue;
@@ -433,8 +461,8 @@ bool Navigation::execute_adjust_action(const Pose2d& target,const Pose2d& target
       }
       if (action == 3) {
         if (Pose2d::abs(diff).x() > thresh.x()) {
-          double v=limit(diff.x(),limit_v.min,limit_v.max);
-          double velocity=next_speed(timedV_.Get(),v,acc_v,dt);
+          double v=limit_gause(diff.x(),limit_v.min,limit_v.max);
+          double velocity=limit(next_speed(timedV_.Get(),v,acc_v,dt),limit_v.min,limit_v.max);
           SendMoveCmd(move_mode_,Monitor_emqx::eMPC, velocity, 0);
           printf(" Vrtical input:%f,out:%f\n",timedV_.Get(),velocity);
           continue;

+ 3 - 1
MPC/navigation.h

@@ -4,6 +4,7 @@
 
 #ifndef LIO_LIVOX_CPP_MPC_NAVIGATION_H_
 #define LIO_LIVOX_CPP_MPC_NAVIGATION_H_
+#include <glog/logging.h>
 #include "../define/timedlockdata.hpp"
 #include "pose2d.h"
 #include "trajectory.h"
@@ -92,7 +93,8 @@ public:
     std::thread* pubthread_= nullptr;
     bool inited_=false;
     Monitor_emqx* monitor_= nullptr;
-    Terminator_emqx* terminator_= nullptr;
+    Terminator_emqx* terminator_= nullptr;  //本机emqx连接
+    Terminator_emqx* brotherEmqx_= nullptr;  //本机emqx连接
 
     TimedLockData<Pose2d> timedPose_;           //当前位姿
     TimedLockData<double> timedV_;              //底盘数据

+ 11 - 2
MPC/navigation_main.cpp

@@ -15,8 +15,17 @@ NavigationMain::~NavigationMain(){
 
 void NavigationMain::ResetPose(const Pose2d& pose){
   if(move_mode_==Monitor_emqx::eMain) {
-    Pose2d transform(-wheelBase_/2.0,0,0);
-    Navigation::ResetPose(pose * transform);
+    if(timedBrotherPose_.timeout()==true)
+    {
+      std::cout<<"Brother pose is timeout can not set MainAGV pose"<<std::endl;
+      return;
+    }
+    //Pose2d transform(-wheelBase_/2.0,0,0);
+    //Navigation::ResetPose(pose * transform);
+    Pose2d brother=timedBrotherPose_.Get();
+    Pose2d agv=Pose2d((pose.x()+brother.x())/2.0,(pose.y()+brother.y())/2.0,pose.theta());
+
+    Navigation::ResetPose(agv);
   }
   else
     Navigation::ResetPose(pose);

+ 1 - 0
MPC/navigation_main.h

@@ -5,6 +5,7 @@
 #ifndef NAVIGATION_NAVIGATION_MAIN_H
 #define NAVIGATION_NAVIGATION_MAIN_H
 #include "navigation.h"
+
 class NavigationMain:public Navigation {
 
 public:

+ 407 - 54
MPC/parameter.pb.cc

@@ -15,6 +15,7 @@
 // @@protoc_insertion_point(includes)
 #include <google/protobuf/port_def.inc>
 extern PROTOBUF_INTERNAL_EXPORT_parameter_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_AgvEmqx_parameter_parameter_2eproto;
+extern PROTOBUF_INTERNAL_EXPORT_parameter_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_BrotherEmqx_parameter_2eproto;
 extern PROTOBUF_INTERNAL_EXPORT_parameter_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_Emqx_parameter_parameter_2eproto;
 class AgvEmqx_parameterDefaultTypeInternal {
  public:
@@ -24,6 +25,10 @@ class Emqx_parameterDefaultTypeInternal {
  public:
   ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<Emqx_parameter> _instance;
 } _Emqx_parameter_default_instance_;
+class BrotherEmqxDefaultTypeInternal {
+ public:
+  ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<BrotherEmqx> _instance;
+} _BrotherEmqx_default_instance_;
 class Navigation_parameterDefaultTypeInternal {
  public:
   ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<Navigation_parameter> _instance;
@@ -42,6 +47,20 @@ static void InitDefaultsscc_info_AgvEmqx_parameter_parameter_2eproto() {
 ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_AgvEmqx_parameter_parameter_2eproto =
     {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_AgvEmqx_parameter_parameter_2eproto}, {}};
 
+static void InitDefaultsscc_info_BrotherEmqx_parameter_2eproto() {
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
+  {
+    void* ptr = &::_BrotherEmqx_default_instance_;
+    new (ptr) ::BrotherEmqx();
+    ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr);
+  }
+  ::BrotherEmqx::InitAsDefaultInstance();
+}
+
+::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_BrotherEmqx_parameter_2eproto =
+    {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_BrotherEmqx_parameter_2eproto}, {}};
+
 static void InitDefaultsscc_info_Emqx_parameter_parameter_2eproto() {
   GOOGLE_PROTOBUF_VERIFY_VERSION;
 
@@ -67,12 +86,13 @@ static void InitDefaultsscc_info_Navigation_parameter_parameter_2eproto() {
   ::Navigation_parameter::InitAsDefaultInstance();
 }
 
-::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<2> scc_info_Navigation_parameter_parameter_2eproto =
-    {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 2, 0, InitDefaultsscc_info_Navigation_parameter_parameter_2eproto}, {
+::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<3> scc_info_Navigation_parameter_parameter_2eproto =
+    {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 3, 0, InitDefaultsscc_info_Navigation_parameter_parameter_2eproto}, {
       &scc_info_AgvEmqx_parameter_parameter_2eproto.base,
-      &scc_info_Emqx_parameter_parameter_2eproto.base,}};
+      &scc_info_Emqx_parameter_parameter_2eproto.base,
+      &scc_info_BrotherEmqx_parameter_2eproto.base,}};
 
-static ::PROTOBUF_NAMESPACE_ID::Metadata file_level_metadata_parameter_2eproto[3];
+static ::PROTOBUF_NAMESPACE_ID::Metadata file_level_metadata_parameter_2eproto[4];
 static constexpr ::PROTOBUF_NAMESPACE_ID::EnumDescriptor const** file_level_enum_descriptors_parameter_2eproto = nullptr;
 static constexpr ::PROTOBUF_NAMESPACE_ID::ServiceDescriptor const** file_level_service_descriptors_parameter_2eproto = nullptr;
 
@@ -99,7 +119,15 @@ const ::PROTOBUF_NAMESPACE_ID::uint32 TableStruct_parameter_2eproto::offsets[] P
   PROTOBUF_FIELD_OFFSET(::Emqx_parameter, pubstatutopic_),
   PROTOBUF_FIELD_OFFSET(::Emqx_parameter, pubnavstatutopic_),
   PROTOBUF_FIELD_OFFSET(::Emqx_parameter, subnavcmdtopic_),
-  PROTOBUF_FIELD_OFFSET(::Emqx_parameter, subbrotherstatutopic_),
+  ~0u,  // no _has_bits_
+  PROTOBUF_FIELD_OFFSET(::BrotherEmqx, _internal_metadata_),
+  ~0u,  // no _extensions_
+  ~0u,  // no _oneof_case_
+  ~0u,  // no _weak_field_map_
+  PROTOBUF_FIELD_OFFSET(::BrotherEmqx, nodeid_),
+  PROTOBUF_FIELD_OFFSET(::BrotherEmqx, ip_),
+  PROTOBUF_FIELD_OFFSET(::BrotherEmqx, port_),
+  PROTOBUF_FIELD_OFFSET(::BrotherEmqx, subbrotherstatutopic_),
   ~0u,  // no _has_bits_
   PROTOBUF_FIELD_OFFSET(::Navigation_parameter, _internal_metadata_),
   ~0u,  // no _extensions_
@@ -108,16 +136,19 @@ const ::PROTOBUF_NAMESPACE_ID::uint32 TableStruct_parameter_2eproto::offsets[] P
   PROTOBUF_FIELD_OFFSET(::Navigation_parameter, main_agv_),
   PROTOBUF_FIELD_OFFSET(::Navigation_parameter, agv_emqx_),
   PROTOBUF_FIELD_OFFSET(::Navigation_parameter, terminal_emqx_),
+  PROTOBUF_FIELD_OFFSET(::Navigation_parameter, brother_emqx_),
 };
 static const ::PROTOBUF_NAMESPACE_ID::internal::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
   { 0, -1, sizeof(::AgvEmqx_parameter)},
   { 11, -1, sizeof(::Emqx_parameter)},
-  { 23, -1, sizeof(::Navigation_parameter)},
+  { 22, -1, sizeof(::BrotherEmqx)},
+  { 31, -1, sizeof(::Navigation_parameter)},
 };
 
 static ::PROTOBUF_NAMESPACE_ID::Message const * const file_default_instances[] = {
   reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::_AgvEmqx_parameter_default_instance_),
   reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::_Emqx_parameter_default_instance_),
+  reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::_BrotherEmqx_default_instance_),
   reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::_Navigation_parameter_default_instance_),
 };
 
@@ -125,29 +156,32 @@ const char descriptor_table_protodef_parameter_2eproto[] PROTOBUF_SECTION_VARIAB
   "\n\017parameter.proto\"\201\001\n\021AgvEmqx_parameter\022"
   "\016\n\006NodeId\030\001 \001(\t\022\n\n\002ip\030\002 \001(\t\022\014\n\004port\030\003 \001("
   "\005\022\025\n\rpubSpeedTopic\030\004 \001(\t\022\024\n\014subPoseTopic"
-  "\030\005 \001(\t\022\025\n\rsubSpeedTopic\030\006 \001(\t\"\241\001\n\016Emqx_p"
+  "\030\005 \001(\t\022\025\n\rsubSpeedTopic\030\006 \001(\t\"\203\001\n\016Emqx_p"
   "arameter\022\016\n\006NodeId\030\001 \001(\t\022\n\n\002ip\030\002 \001(\t\022\014\n\004"
   "port\030\003 \001(\005\022\025\n\rpubStatuTopic\030\004 \001(\t\022\030\n\020pub"
   "NavStatuTopic\030\005 \001(\t\022\026\n\016subNavCmdTopic\030\006 "
-  "\001(\t\022\034\n\024subBrotherStatuTopic\030\007 \001(\t\"v\n\024Nav"
-  "igation_parameter\022\020\n\010main_agv\030\001 \001(\010\022$\n\010A"
-  "gv_emqx\030\002 \001(\0132\022.AgvEmqx_parameter\022&\n\rTer"
-  "minal_emqx\030\003 \001(\0132\017.Emqx_parameterb\006proto"
-  "3"
+  "\001(\t\"U\n\013BrotherEmqx\022\016\n\006NodeId\030\001 \001(\t\022\n\n\002ip"
+  "\030\002 \001(\t\022\014\n\004port\030\003 \001(\005\022\034\n\024subBrotherStatuT"
+  "opic\030\004 \001(\t\"\232\001\n\024Navigation_parameter\022\020\n\010m"
+  "ain_agv\030\001 \001(\010\022$\n\010Agv_emqx\030\002 \001(\0132\022.AgvEmq"
+  "x_parameter\022&\n\rTerminal_emqx\030\003 \001(\0132\017.Emq"
+  "x_parameter\022\"\n\014brother_emqx\030\004 \001(\0132\014.Brot"
+  "herEmqxb\006proto3"
   ;
 static const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable*const descriptor_table_parameter_2eproto_deps[1] = {
 };
-static ::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase*const descriptor_table_parameter_2eproto_sccs[3] = {
+static ::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase*const descriptor_table_parameter_2eproto_sccs[4] = {
   &scc_info_AgvEmqx_parameter_parameter_2eproto.base,
+  &scc_info_BrotherEmqx_parameter_2eproto.base,
   &scc_info_Emqx_parameter_parameter_2eproto.base,
   &scc_info_Navigation_parameter_parameter_2eproto.base,
 };
 static ::PROTOBUF_NAMESPACE_ID::internal::once_flag descriptor_table_parameter_2eproto_once;
 const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_parameter_2eproto = {
-  false, false, descriptor_table_protodef_parameter_2eproto, "parameter.proto", 441,
-  &descriptor_table_parameter_2eproto_once, descriptor_table_parameter_2eproto_sccs, descriptor_table_parameter_2eproto_deps, 3, 0,
+  false, false, descriptor_table_protodef_parameter_2eproto, "parameter.proto", 535,
+  &descriptor_table_parameter_2eproto_once, descriptor_table_parameter_2eproto_sccs, descriptor_table_parameter_2eproto_deps, 4, 0,
   schemas, file_default_instances, TableStruct_parameter_2eproto::offsets,
-  file_level_metadata_parameter_2eproto, 3, file_level_enum_descriptors_parameter_2eproto, file_level_service_descriptors_parameter_2eproto,
+  file_level_metadata_parameter_2eproto, 4, file_level_enum_descriptors_parameter_2eproto, file_level_service_descriptors_parameter_2eproto,
 };
 
 // Force running AddDescriptors() at dynamic initialization time.
@@ -583,11 +617,6 @@ Emqx_parameter::Emqx_parameter(const Emqx_parameter& from)
     subnavcmdtopic_.Set(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from._internal_subnavcmdtopic(),
       GetArena());
   }
-  subbrotherstatutopic_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
-  if (!from._internal_subbrotherstatutopic().empty()) {
-    subbrotherstatutopic_.Set(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from._internal_subbrotherstatutopic(),
-      GetArena());
-  }
   port_ = from.port_;
   // @@protoc_insertion_point(copy_constructor:Emqx_parameter)
 }
@@ -599,7 +628,6 @@ void Emqx_parameter::SharedCtor() {
   pubstatutopic_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
   pubnavstatutopic_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
   subnavcmdtopic_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
-  subbrotherstatutopic_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
   port_ = 0;
 }
 
@@ -616,7 +644,6 @@ void Emqx_parameter::SharedDtor() {
   pubstatutopic_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
   pubnavstatutopic_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
   subnavcmdtopic_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
-  subbrotherstatutopic_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
 }
 
 void Emqx_parameter::ArenaDtor(void* object) {
@@ -645,7 +672,6 @@ void Emqx_parameter::Clear() {
   pubstatutopic_.ClearToEmpty(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), GetArena());
   pubnavstatutopic_.ClearToEmpty(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), GetArena());
   subnavcmdtopic_.ClearToEmpty(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), GetArena());
-  subbrotherstatutopic_.ClearToEmpty(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), GetArena());
   port_ = 0;
   _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
 }
@@ -710,15 +736,6 @@ const char* Emqx_parameter::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE
           CHK_(ptr);
         } else goto handle_unusual;
         continue;
-      // string subBrotherStatuTopic = 7;
-      case 7:
-        if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 58)) {
-          auto str = _internal_mutable_subbrotherstatutopic();
-          ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx);
-          CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "Emqx_parameter.subBrotherStatuTopic"));
-          CHK_(ptr);
-        } else goto handle_unusual;
-        continue;
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
@@ -803,16 +820,6 @@ failure:
         6, this->_internal_subnavcmdtopic(), target);
   }
 
-  // string subBrotherStatuTopic = 7;
-  if (this->subbrotherstatutopic().size() > 0) {
-    ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(
-      this->_internal_subbrotherstatutopic().data(), static_cast<int>(this->_internal_subbrotherstatutopic().length()),
-      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE,
-      "Emqx_parameter.subBrotherStatuTopic");
-    target = stream->WriteStringMaybeAliased(
-        7, this->_internal_subbrotherstatutopic(), target);
-  }
-
   if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray(
         _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream);
@@ -864,13 +871,6 @@ size_t Emqx_parameter::ByteSizeLong() const {
         this->_internal_subnavcmdtopic());
   }
 
-  // string subBrotherStatuTopic = 7;
-  if (this->subbrotherstatutopic().size() > 0) {
-    total_size += 1 +
-      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize(
-        this->_internal_subbrotherstatutopic());
-  }
-
   // int32 port = 3;
   if (this->port() != 0) {
     total_size += 1 +
@@ -924,9 +924,6 @@ void Emqx_parameter::MergeFrom(const Emqx_parameter& from) {
   if (from.subnavcmdtopic().size() > 0) {
     _internal_set_subnavcmdtopic(from._internal_subnavcmdtopic());
   }
-  if (from.subbrotherstatutopic().size() > 0) {
-    _internal_set_subbrotherstatutopic(from._internal_subbrotherstatutopic());
-  }
   if (from.port() != 0) {
     _internal_set_port(from._internal_port());
   }
@@ -958,7 +955,6 @@ void Emqx_parameter::InternalSwap(Emqx_parameter* other) {
   pubstatutopic_.Swap(&other->pubstatutopic_, &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), GetArena());
   pubnavstatutopic_.Swap(&other->pubnavstatutopic_, &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), GetArena());
   subnavcmdtopic_.Swap(&other->subnavcmdtopic_, &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), GetArena());
-  subbrotherstatutopic_.Swap(&other->subbrotherstatutopic_, &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), GetArena());
   swap(port_, other->port_);
 }
 
@@ -967,6 +963,318 @@ void Emqx_parameter::InternalSwap(Emqx_parameter* other) {
 }
 
 
+// ===================================================================
+
+void BrotherEmqx::InitAsDefaultInstance() {
+}
+class BrotherEmqx::_Internal {
+ public:
+};
+
+BrotherEmqx::BrotherEmqx(::PROTOBUF_NAMESPACE_ID::Arena* arena)
+  : ::PROTOBUF_NAMESPACE_ID::Message(arena) {
+  SharedCtor();
+  RegisterArenaDtor(arena);
+  // @@protoc_insertion_point(arena_constructor:BrotherEmqx)
+}
+BrotherEmqx::BrotherEmqx(const BrotherEmqx& from)
+  : ::PROTOBUF_NAMESPACE_ID::Message() {
+  _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
+  nodeid_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
+  if (!from._internal_nodeid().empty()) {
+    nodeid_.Set(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from._internal_nodeid(),
+      GetArena());
+  }
+  ip_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
+  if (!from._internal_ip().empty()) {
+    ip_.Set(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from._internal_ip(),
+      GetArena());
+  }
+  subbrotherstatutopic_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
+  if (!from._internal_subbrotherstatutopic().empty()) {
+    subbrotherstatutopic_.Set(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from._internal_subbrotherstatutopic(),
+      GetArena());
+  }
+  port_ = from.port_;
+  // @@protoc_insertion_point(copy_constructor:BrotherEmqx)
+}
+
+void BrotherEmqx::SharedCtor() {
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_BrotherEmqx_parameter_2eproto.base);
+  nodeid_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
+  ip_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
+  subbrotherstatutopic_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
+  port_ = 0;
+}
+
+BrotherEmqx::~BrotherEmqx() {
+  // @@protoc_insertion_point(destructor:BrotherEmqx)
+  SharedDtor();
+  _internal_metadata_.Delete<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
+}
+
+void BrotherEmqx::SharedDtor() {
+  GOOGLE_DCHECK(GetArena() == nullptr);
+  nodeid_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
+  ip_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
+  subbrotherstatutopic_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
+}
+
+void BrotherEmqx::ArenaDtor(void* object) {
+  BrotherEmqx* _this = reinterpret_cast< BrotherEmqx* >(object);
+  (void)_this;
+}
+void BrotherEmqx::RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena*) {
+}
+void BrotherEmqx::SetCachedSize(int size) const {
+  _cached_size_.Set(size);
+}
+const BrotherEmqx& BrotherEmqx::default_instance() {
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_BrotherEmqx_parameter_2eproto.base);
+  return *internal_default_instance();
+}
+
+
+void BrotherEmqx::Clear() {
+// @@protoc_insertion_point(message_clear_start:BrotherEmqx)
+  ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  nodeid_.ClearToEmpty(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), GetArena());
+  ip_.ClearToEmpty(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), GetArena());
+  subbrotherstatutopic_.ClearToEmpty(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), GetArena());
+  port_ = 0;
+  _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
+}
+
+const char* BrotherEmqx::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArena(); (void)arena;
+  while (!ctx->Done(&ptr)) {
+    ::PROTOBUF_NAMESPACE_ID::uint32 tag;
+    ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
+    CHK_(ptr);
+    switch (tag >> 3) {
+      // string NodeId = 1;
+      case 1:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) {
+          auto str = _internal_mutable_nodeid();
+          ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx);
+          CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "BrotherEmqx.NodeId"));
+          CHK_(ptr);
+        } else goto handle_unusual;
+        continue;
+      // string ip = 2;
+      case 2:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) {
+          auto str = _internal_mutable_ip();
+          ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx);
+          CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "BrotherEmqx.ip"));
+          CHK_(ptr);
+        } else goto handle_unusual;
+        continue;
+      // int32 port = 3;
+      case 3:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 24)) {
+          port_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr);
+          CHK_(ptr);
+        } else goto handle_unusual;
+        continue;
+      // string subBrotherStatuTopic = 4;
+      case 4:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 34)) {
+          auto str = _internal_mutable_subbrotherstatutopic();
+          ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx);
+          CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "BrotherEmqx.subBrotherStatuTopic"));
+          CHK_(ptr);
+        } else goto handle_unusual;
+        continue;
+      default: {
+      handle_unusual:
+        if ((tag & 7) == 4 || tag == 0) {
+          ctx->SetLastTag(tag);
+          goto success;
+        }
+        ptr = UnknownFieldParse(tag,
+            _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(),
+            ptr, ctx);
+        CHK_(ptr != nullptr);
+        continue;
+      }
+    }  // switch
+  }  // while
+success:
+  return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
+}
+
+::PROTOBUF_NAMESPACE_ID::uint8* BrotherEmqx::_InternalSerialize(
+    ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const {
+  // @@protoc_insertion_point(serialize_to_array_start:BrotherEmqx)
+  ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // string NodeId = 1;
+  if (this->nodeid().size() > 0) {
+    ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(
+      this->_internal_nodeid().data(), static_cast<int>(this->_internal_nodeid().length()),
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE,
+      "BrotherEmqx.NodeId");
+    target = stream->WriteStringMaybeAliased(
+        1, this->_internal_nodeid(), target);
+  }
+
+  // string ip = 2;
+  if (this->ip().size() > 0) {
+    ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(
+      this->_internal_ip().data(), static_cast<int>(this->_internal_ip().length()),
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE,
+      "BrotherEmqx.ip");
+    target = stream->WriteStringMaybeAliased(
+        2, this->_internal_ip(), target);
+  }
+
+  // int32 port = 3;
+  if (this->port() != 0) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt32ToArray(3, this->_internal_port(), target);
+  }
+
+  // string subBrotherStatuTopic = 4;
+  if (this->subbrotherstatutopic().size() > 0) {
+    ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(
+      this->_internal_subbrotherstatutopic().data(), static_cast<int>(this->_internal_subbrotherstatutopic().length()),
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE,
+      "BrotherEmqx.subBrotherStatuTopic");
+    target = stream->WriteStringMaybeAliased(
+        4, this->_internal_subbrotherstatutopic(), target);
+  }
+
+  if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray(
+        _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream);
+  }
+  // @@protoc_insertion_point(serialize_to_array_end:BrotherEmqx)
+  return target;
+}
+
+size_t BrotherEmqx::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:BrotherEmqx)
+  size_t total_size = 0;
+
+  ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  // string NodeId = 1;
+  if (this->nodeid().size() > 0) {
+    total_size += 1 +
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize(
+        this->_internal_nodeid());
+  }
+
+  // string ip = 2;
+  if (this->ip().size() > 0) {
+    total_size += 1 +
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize(
+        this->_internal_ip());
+  }
+
+  // string subBrotherStatuTopic = 4;
+  if (this->subbrotherstatutopic().size() > 0) {
+    total_size += 1 +
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize(
+        this->_internal_subbrotherstatutopic());
+  }
+
+  // int32 port = 3;
+  if (this->port() != 0) {
+    total_size += 1 +
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32Size(
+        this->_internal_port());
+  }
+
+  if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
+    return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize(
+        _internal_metadata_, total_size, &_cached_size_);
+  }
+  int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size);
+  SetCachedSize(cached_size);
+  return total_size;
+}
+
+void BrotherEmqx::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) {
+// @@protoc_insertion_point(generalized_merge_from_start:BrotherEmqx)
+  GOOGLE_DCHECK_NE(&from, this);
+  const BrotherEmqx* source =
+      ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<BrotherEmqx>(
+          &from);
+  if (source == nullptr) {
+  // @@protoc_insertion_point(generalized_merge_from_cast_fail:BrotherEmqx)
+    ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this);
+  } else {
+  // @@protoc_insertion_point(generalized_merge_from_cast_success:BrotherEmqx)
+    MergeFrom(*source);
+  }
+}
+
+void BrotherEmqx::MergeFrom(const BrotherEmqx& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:BrotherEmqx)
+  GOOGLE_DCHECK_NE(&from, this);
+  _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
+  ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  if (from.nodeid().size() > 0) {
+    _internal_set_nodeid(from._internal_nodeid());
+  }
+  if (from.ip().size() > 0) {
+    _internal_set_ip(from._internal_ip());
+  }
+  if (from.subbrotherstatutopic().size() > 0) {
+    _internal_set_subbrotherstatutopic(from._internal_subbrotherstatutopic());
+  }
+  if (from.port() != 0) {
+    _internal_set_port(from._internal_port());
+  }
+}
+
+void BrotherEmqx::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) {
+// @@protoc_insertion_point(generalized_copy_from_start:BrotherEmqx)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void BrotherEmqx::CopyFrom(const BrotherEmqx& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:BrotherEmqx)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool BrotherEmqx::IsInitialized() const {
+  return true;
+}
+
+void BrotherEmqx::InternalSwap(BrotherEmqx* other) {
+  using std::swap;
+  _internal_metadata_.Swap<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(&other->_internal_metadata_);
+  nodeid_.Swap(&other->nodeid_, &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), GetArena());
+  ip_.Swap(&other->ip_, &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), GetArena());
+  subbrotherstatutopic_.Swap(&other->subbrotherstatutopic_, &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), GetArena());
+  swap(port_, other->port_);
+}
+
+::PROTOBUF_NAMESPACE_ID::Metadata BrotherEmqx::GetMetadata() const {
+  return GetMetadataStatic();
+}
+
+
 // ===================================================================
 
 void Navigation_parameter::InitAsDefaultInstance() {
@@ -974,11 +1282,14 @@ void Navigation_parameter::InitAsDefaultInstance() {
       ::AgvEmqx_parameter::internal_default_instance());
   ::_Navigation_parameter_default_instance_._instance.get_mutable()->terminal_emqx_ = const_cast< ::Emqx_parameter*>(
       ::Emqx_parameter::internal_default_instance());
+  ::_Navigation_parameter_default_instance_._instance.get_mutable()->brother_emqx_ = const_cast< ::BrotherEmqx*>(
+      ::BrotherEmqx::internal_default_instance());
 }
 class Navigation_parameter::_Internal {
  public:
   static const ::AgvEmqx_parameter& agv_emqx(const Navigation_parameter* msg);
   static const ::Emqx_parameter& terminal_emqx(const Navigation_parameter* msg);
+  static const ::BrotherEmqx& brother_emqx(const Navigation_parameter* msg);
 };
 
 const ::AgvEmqx_parameter&
@@ -989,6 +1300,10 @@ const ::Emqx_parameter&
 Navigation_parameter::_Internal::terminal_emqx(const Navigation_parameter* msg) {
   return *msg->terminal_emqx_;
 }
+const ::BrotherEmqx&
+Navigation_parameter::_Internal::brother_emqx(const Navigation_parameter* msg) {
+  return *msg->brother_emqx_;
+}
 Navigation_parameter::Navigation_parameter(::PROTOBUF_NAMESPACE_ID::Arena* arena)
   : ::PROTOBUF_NAMESPACE_ID::Message(arena) {
   SharedCtor();
@@ -1008,6 +1323,11 @@ Navigation_parameter::Navigation_parameter(const Navigation_parameter& from)
   } else {
     terminal_emqx_ = nullptr;
   }
+  if (from._internal_has_brother_emqx()) {
+    brother_emqx_ = new ::BrotherEmqx(*from.brother_emqx_);
+  } else {
+    brother_emqx_ = nullptr;
+  }
   main_agv_ = from.main_agv_;
   // @@protoc_insertion_point(copy_constructor:Navigation_parameter)
 }
@@ -1029,6 +1349,7 @@ void Navigation_parameter::SharedDtor() {
   GOOGLE_DCHECK(GetArena() == nullptr);
   if (this != internal_default_instance()) delete agv_emqx_;
   if (this != internal_default_instance()) delete terminal_emqx_;
+  if (this != internal_default_instance()) delete brother_emqx_;
 }
 
 void Navigation_parameter::ArenaDtor(void* object) {
@@ -1060,6 +1381,10 @@ void Navigation_parameter::Clear() {
     delete terminal_emqx_;
   }
   terminal_emqx_ = nullptr;
+  if (GetArena() == nullptr && brother_emqx_ != nullptr) {
+    delete brother_emqx_;
+  }
+  brother_emqx_ = nullptr;
   main_agv_ = false;
   _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
 }
@@ -1093,6 +1418,13 @@ const char* Navigation_parameter::_InternalParse(const char* ptr, ::PROTOBUF_NAM
           CHK_(ptr);
         } else goto handle_unusual;
         continue;
+      // .BrotherEmqx brother_emqx = 4;
+      case 4:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 34)) {
+          ptr = ctx->ParseMessage(_internal_mutable_brother_emqx(), ptr);
+          CHK_(ptr);
+        } else goto handle_unusual;
+        continue;
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
@@ -1143,6 +1475,14 @@ failure:
         3, _Internal::terminal_emqx(this), target, stream);
   }
 
+  // .BrotherEmqx brother_emqx = 4;
+  if (this->has_brother_emqx()) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(
+        4, _Internal::brother_emqx(this), target, stream);
+  }
+
   if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray(
         _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream);
@@ -1173,6 +1513,13 @@ size_t Navigation_parameter::ByteSizeLong() const {
         *terminal_emqx_);
   }
 
+  // .BrotherEmqx brother_emqx = 4;
+  if (this->has_brother_emqx()) {
+    total_size += 1 +
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(
+        *brother_emqx_);
+  }
+
   // bool main_agv = 1;
   if (this->main_agv() != 0) {
     total_size += 1 + 1;
@@ -1215,6 +1562,9 @@ void Navigation_parameter::MergeFrom(const Navigation_parameter& from) {
   if (from.has_terminal_emqx()) {
     _internal_mutable_terminal_emqx()->::Emqx_parameter::MergeFrom(from._internal_terminal_emqx());
   }
+  if (from.has_brother_emqx()) {
+    _internal_mutable_brother_emqx()->::BrotherEmqx::MergeFrom(from._internal_brother_emqx());
+  }
   if (from.main_agv() != 0) {
     _internal_set_main_agv(from._internal_main_agv());
   }
@@ -1262,6 +1612,9 @@ template<> PROTOBUF_NOINLINE ::AgvEmqx_parameter* Arena::CreateMaybeMessage< ::A
 template<> PROTOBUF_NOINLINE ::Emqx_parameter* Arena::CreateMaybeMessage< ::Emqx_parameter >(Arena* arena) {
   return Arena::CreateMessageInternal< ::Emqx_parameter >(arena);
 }
+template<> PROTOBUF_NOINLINE ::BrotherEmqx* Arena::CreateMaybeMessage< ::BrotherEmqx >(Arena* arena) {
+  return Arena::CreateMessageInternal< ::BrotherEmqx >(arena);
+}
 template<> PROTOBUF_NOINLINE ::Navigation_parameter* Arena::CreateMaybeMessage< ::Navigation_parameter >(Arena* arena) {
   return Arena::CreateMessageInternal< ::Navigation_parameter >(arena);
 }

+ 459 - 29
MPC/parameter.pb.h

@@ -47,7 +47,7 @@ struct TableStruct_parameter_2eproto {
     PROTOBUF_SECTION_VARIABLE(protodesc_cold);
   static const ::PROTOBUF_NAMESPACE_ID::internal::AuxiliaryParseTableField aux[]
     PROTOBUF_SECTION_VARIABLE(protodesc_cold);
-  static const ::PROTOBUF_NAMESPACE_ID::internal::ParseTable schema[3]
+  static const ::PROTOBUF_NAMESPACE_ID::internal::ParseTable schema[4]
     PROTOBUF_SECTION_VARIABLE(protodesc_cold);
   static const ::PROTOBUF_NAMESPACE_ID::internal::FieldMetadata field_metadata[];
   static const ::PROTOBUF_NAMESPACE_ID::internal::SerializationTable serialization_table[];
@@ -57,6 +57,9 @@ extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table
 class AgvEmqx_parameter;
 class AgvEmqx_parameterDefaultTypeInternal;
 extern AgvEmqx_parameterDefaultTypeInternal _AgvEmqx_parameter_default_instance_;
+class BrotherEmqx;
+class BrotherEmqxDefaultTypeInternal;
+extern BrotherEmqxDefaultTypeInternal _BrotherEmqx_default_instance_;
 class Emqx_parameter;
 class Emqx_parameterDefaultTypeInternal;
 extern Emqx_parameterDefaultTypeInternal _Emqx_parameter_default_instance_;
@@ -65,6 +68,7 @@ class Navigation_parameterDefaultTypeInternal;
 extern Navigation_parameterDefaultTypeInternal _Navigation_parameter_default_instance_;
 PROTOBUF_NAMESPACE_OPEN
 template<> ::AgvEmqx_parameter* Arena::CreateMaybeMessage<::AgvEmqx_parameter>(Arena*);
+template<> ::BrotherEmqx* Arena::CreateMaybeMessage<::BrotherEmqx>(Arena*);
 template<> ::Emqx_parameter* Arena::CreateMaybeMessage<::Emqx_parameter>(Arena*);
 template<> ::Navigation_parameter* Arena::CreateMaybeMessage<::Navigation_parameter>(Arena*);
 PROTOBUF_NAMESPACE_CLOSE
@@ -416,7 +420,6 @@ class Emqx_parameter PROTOBUF_FINAL :
     kPubStatuTopicFieldNumber = 4,
     kPubNavStatuTopicFieldNumber = 5,
     kSubNavCmdTopicFieldNumber = 6,
-    kSubBrotherStatuTopicFieldNumber = 7,
     kPortFieldNumber = 3,
   };
   // string NodeId = 1;
@@ -499,7 +502,184 @@ class Emqx_parameter PROTOBUF_FINAL :
   std::string* _internal_mutable_subnavcmdtopic();
   public:
 
-  // string subBrotherStatuTopic = 7;
+  // int32 port = 3;
+  void clear_port();
+  ::PROTOBUF_NAMESPACE_ID::int32 port() const;
+  void set_port(::PROTOBUF_NAMESPACE_ID::int32 value);
+  private:
+  ::PROTOBUF_NAMESPACE_ID::int32 _internal_port() const;
+  void _internal_set_port(::PROTOBUF_NAMESPACE_ID::int32 value);
+  public:
+
+  // @@protoc_insertion_point(class_scope:Emqx_parameter)
+ private:
+  class _Internal;
+
+  template <typename T> friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper;
+  typedef void InternalArenaConstructable_;
+  typedef void DestructorSkippable_;
+  ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr nodeid_;
+  ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr ip_;
+  ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr pubstatutopic_;
+  ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr pubnavstatutopic_;
+  ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr subnavcmdtopic_;
+  ::PROTOBUF_NAMESPACE_ID::int32 port_;
+  mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_;
+  friend struct ::TableStruct_parameter_2eproto;
+};
+// -------------------------------------------------------------------
+
+class BrotherEmqx PROTOBUF_FINAL :
+    public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:BrotherEmqx) */ {
+ public:
+  inline BrotherEmqx() : BrotherEmqx(nullptr) {}
+  virtual ~BrotherEmqx();
+
+  BrotherEmqx(const BrotherEmqx& from);
+  BrotherEmqx(BrotherEmqx&& from) noexcept
+    : BrotherEmqx() {
+    *this = ::std::move(from);
+  }
+
+  inline BrotherEmqx& operator=(const BrotherEmqx& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  inline BrotherEmqx& operator=(BrotherEmqx&& from) noexcept {
+    if (GetArena() == from.GetArena()) {
+      if (this != &from) InternalSwap(&from);
+    } else {
+      CopyFrom(from);
+    }
+    return *this;
+  }
+
+  static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() {
+    return GetDescriptor();
+  }
+  static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() {
+    return GetMetadataStatic().descriptor;
+  }
+  static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() {
+    return GetMetadataStatic().reflection;
+  }
+  static const BrotherEmqx& default_instance();
+
+  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
+  static inline const BrotherEmqx* internal_default_instance() {
+    return reinterpret_cast<const BrotherEmqx*>(
+               &_BrotherEmqx_default_instance_);
+  }
+  static constexpr int kIndexInFileMessages =
+    2;
+
+  friend void swap(BrotherEmqx& a, BrotherEmqx& b) {
+    a.Swap(&b);
+  }
+  inline void Swap(BrotherEmqx* other) {
+    if (other == this) return;
+    if (GetArena() == other->GetArena()) {
+      InternalSwap(other);
+    } else {
+      ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other);
+    }
+  }
+  void UnsafeArenaSwap(BrotherEmqx* other) {
+    if (other == this) return;
+    GOOGLE_DCHECK(GetArena() == other->GetArena());
+    InternalSwap(other);
+  }
+
+  // implements Message ----------------------------------------------
+
+  inline BrotherEmqx* New() const final {
+    return CreateMaybeMessage<BrotherEmqx>(nullptr);
+  }
+
+  BrotherEmqx* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final {
+    return CreateMaybeMessage<BrotherEmqx>(arena);
+  }
+  void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final;
+  void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final;
+  void CopyFrom(const BrotherEmqx& from);
+  void MergeFrom(const BrotherEmqx& from);
+  PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final;
+  bool IsInitialized() const final;
+
+  size_t ByteSizeLong() const final;
+  const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final;
+  ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize(
+      ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final;
+  int GetCachedSize() const final { return _cached_size_.Get(); }
+
+  private:
+  inline void SharedCtor();
+  inline void SharedDtor();
+  void SetCachedSize(int size) const final;
+  void InternalSwap(BrotherEmqx* other);
+  friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
+  static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+    return "BrotherEmqx";
+  }
+  protected:
+  explicit BrotherEmqx(::PROTOBUF_NAMESPACE_ID::Arena* arena);
+  private:
+  static void ArenaDtor(void* object);
+  inline void RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena* arena);
+  public:
+
+  ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final;
+  private:
+  static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() {
+    ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_parameter_2eproto);
+    return ::descriptor_table_parameter_2eproto.file_level_metadata[kIndexInFileMessages];
+  }
+
+  public:
+
+  // nested types ----------------------------------------------------
+
+  // accessors -------------------------------------------------------
+
+  enum : int {
+    kNodeIdFieldNumber = 1,
+    kIpFieldNumber = 2,
+    kSubBrotherStatuTopicFieldNumber = 4,
+    kPortFieldNumber = 3,
+  };
+  // string NodeId = 1;
+  void clear_nodeid();
+  const std::string& nodeid() const;
+  void set_nodeid(const std::string& value);
+  void set_nodeid(std::string&& value);
+  void set_nodeid(const char* value);
+  void set_nodeid(const char* value, size_t size);
+  std::string* mutable_nodeid();
+  std::string* release_nodeid();
+  void set_allocated_nodeid(std::string* nodeid);
+  private:
+  const std::string& _internal_nodeid() const;
+  void _internal_set_nodeid(const std::string& value);
+  std::string* _internal_mutable_nodeid();
+  public:
+
+  // string ip = 2;
+  void clear_ip();
+  const std::string& ip() const;
+  void set_ip(const std::string& value);
+  void set_ip(std::string&& value);
+  void set_ip(const char* value);
+  void set_ip(const char* value, size_t size);
+  std::string* mutable_ip();
+  std::string* release_ip();
+  void set_allocated_ip(std::string* ip);
+  private:
+  const std::string& _internal_ip() const;
+  void _internal_set_ip(const std::string& value);
+  std::string* _internal_mutable_ip();
+  public:
+
+  // string subBrotherStatuTopic = 4;
   void clear_subbrotherstatutopic();
   const std::string& subbrotherstatutopic() const;
   void set_subbrotherstatutopic(const std::string& value);
@@ -524,7 +704,7 @@ class Emqx_parameter PROTOBUF_FINAL :
   void _internal_set_port(::PROTOBUF_NAMESPACE_ID::int32 value);
   public:
 
-  // @@protoc_insertion_point(class_scope:Emqx_parameter)
+  // @@protoc_insertion_point(class_scope:BrotherEmqx)
  private:
   class _Internal;
 
@@ -533,9 +713,6 @@ class Emqx_parameter PROTOBUF_FINAL :
   typedef void DestructorSkippable_;
   ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr nodeid_;
   ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr ip_;
-  ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr pubstatutopic_;
-  ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr pubnavstatutopic_;
-  ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr subnavcmdtopic_;
   ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr subbrotherstatutopic_;
   ::PROTOBUF_NAMESPACE_ID::int32 port_;
   mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_;
@@ -585,7 +762,7 @@ class Navigation_parameter PROTOBUF_FINAL :
                &_Navigation_parameter_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    2;
+    3;
 
   friend void swap(Navigation_parameter& a, Navigation_parameter& b) {
     a.Swap(&b);
@@ -658,6 +835,7 @@ class Navigation_parameter PROTOBUF_FINAL :
   enum : int {
     kAgvEmqxFieldNumber = 2,
     kTerminalEmqxFieldNumber = 3,
+    kBrotherEmqxFieldNumber = 4,
     kMainAgvFieldNumber = 1,
   };
   // .AgvEmqx_parameter Agv_emqx = 2;
@@ -696,6 +874,24 @@ class Navigation_parameter PROTOBUF_FINAL :
       ::Emqx_parameter* terminal_emqx);
   ::Emqx_parameter* unsafe_arena_release_terminal_emqx();
 
+  // .BrotherEmqx brother_emqx = 4;
+  bool has_brother_emqx() const;
+  private:
+  bool _internal_has_brother_emqx() const;
+  public:
+  void clear_brother_emqx();
+  const ::BrotherEmqx& brother_emqx() const;
+  ::BrotherEmqx* release_brother_emqx();
+  ::BrotherEmqx* mutable_brother_emqx();
+  void set_allocated_brother_emqx(::BrotherEmqx* brother_emqx);
+  private:
+  const ::BrotherEmqx& _internal_brother_emqx() const;
+  ::BrotherEmqx* _internal_mutable_brother_emqx();
+  public:
+  void unsafe_arena_set_allocated_brother_emqx(
+      ::BrotherEmqx* brother_emqx);
+  ::BrotherEmqx* unsafe_arena_release_brother_emqx();
+
   // bool main_agv = 1;
   void clear_main_agv();
   bool main_agv() const;
@@ -714,6 +910,7 @@ class Navigation_parameter PROTOBUF_FINAL :
   typedef void DestructorSkippable_;
   ::AgvEmqx_parameter* agv_emqx_;
   ::Emqx_parameter* terminal_emqx_;
+  ::BrotherEmqx* brother_emqx_;
   bool main_agv_;
   mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_;
   friend struct ::TableStruct_parameter_2eproto;
@@ -1393,58 +1590,206 @@ inline void Emqx_parameter::set_allocated_subnavcmdtopic(std::string* subnavcmdt
   // @@protoc_insertion_point(field_set_allocated:Emqx_parameter.subNavCmdTopic)
 }
 
-// string subBrotherStatuTopic = 7;
-inline void Emqx_parameter::clear_subbrotherstatutopic() {
+// -------------------------------------------------------------------
+
+// BrotherEmqx
+
+// string NodeId = 1;
+inline void BrotherEmqx::clear_nodeid() {
+  nodeid_.ClearToEmpty(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), GetArena());
+}
+inline const std::string& BrotherEmqx::nodeid() const {
+  // @@protoc_insertion_point(field_get:BrotherEmqx.NodeId)
+  return _internal_nodeid();
+}
+inline void BrotherEmqx::set_nodeid(const std::string& value) {
+  _internal_set_nodeid(value);
+  // @@protoc_insertion_point(field_set:BrotherEmqx.NodeId)
+}
+inline std::string* BrotherEmqx::mutable_nodeid() {
+  // @@protoc_insertion_point(field_mutable:BrotherEmqx.NodeId)
+  return _internal_mutable_nodeid();
+}
+inline const std::string& BrotherEmqx::_internal_nodeid() const {
+  return nodeid_.Get();
+}
+inline void BrotherEmqx::_internal_set_nodeid(const std::string& value) {
+  
+  nodeid_.Set(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value, GetArena());
+}
+inline void BrotherEmqx::set_nodeid(std::string&& value) {
+  
+  nodeid_.Set(
+    &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArena());
+  // @@protoc_insertion_point(field_set_rvalue:BrotherEmqx.NodeId)
+}
+inline void BrotherEmqx::set_nodeid(const char* value) {
+  GOOGLE_DCHECK(value != nullptr);
+  
+  nodeid_.Set(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
+              GetArena());
+  // @@protoc_insertion_point(field_set_char:BrotherEmqx.NodeId)
+}
+inline void BrotherEmqx::set_nodeid(const char* value,
+    size_t size) {
+  
+  nodeid_.Set(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(
+      reinterpret_cast<const char*>(value), size), GetArena());
+  // @@protoc_insertion_point(field_set_pointer:BrotherEmqx.NodeId)
+}
+inline std::string* BrotherEmqx::_internal_mutable_nodeid() {
+  
+  return nodeid_.Mutable(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), GetArena());
+}
+inline std::string* BrotherEmqx::release_nodeid() {
+  // @@protoc_insertion_point(field_release:BrotherEmqx.NodeId)
+  return nodeid_.Release(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), GetArena());
+}
+inline void BrotherEmqx::set_allocated_nodeid(std::string* nodeid) {
+  if (nodeid != nullptr) {
+    
+  } else {
+    
+  }
+  nodeid_.SetAllocated(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), nodeid,
+      GetArena());
+  // @@protoc_insertion_point(field_set_allocated:BrotherEmqx.NodeId)
+}
+
+// string ip = 2;
+inline void BrotherEmqx::clear_ip() {
+  ip_.ClearToEmpty(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), GetArena());
+}
+inline const std::string& BrotherEmqx::ip() const {
+  // @@protoc_insertion_point(field_get:BrotherEmqx.ip)
+  return _internal_ip();
+}
+inline void BrotherEmqx::set_ip(const std::string& value) {
+  _internal_set_ip(value);
+  // @@protoc_insertion_point(field_set:BrotherEmqx.ip)
+}
+inline std::string* BrotherEmqx::mutable_ip() {
+  // @@protoc_insertion_point(field_mutable:BrotherEmqx.ip)
+  return _internal_mutable_ip();
+}
+inline const std::string& BrotherEmqx::_internal_ip() const {
+  return ip_.Get();
+}
+inline void BrotherEmqx::_internal_set_ip(const std::string& value) {
+  
+  ip_.Set(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value, GetArena());
+}
+inline void BrotherEmqx::set_ip(std::string&& value) {
+  
+  ip_.Set(
+    &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArena());
+  // @@protoc_insertion_point(field_set_rvalue:BrotherEmqx.ip)
+}
+inline void BrotherEmqx::set_ip(const char* value) {
+  GOOGLE_DCHECK(value != nullptr);
+  
+  ip_.Set(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
+              GetArena());
+  // @@protoc_insertion_point(field_set_char:BrotherEmqx.ip)
+}
+inline void BrotherEmqx::set_ip(const char* value,
+    size_t size) {
+  
+  ip_.Set(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(
+      reinterpret_cast<const char*>(value), size), GetArena());
+  // @@protoc_insertion_point(field_set_pointer:BrotherEmqx.ip)
+}
+inline std::string* BrotherEmqx::_internal_mutable_ip() {
+  
+  return ip_.Mutable(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), GetArena());
+}
+inline std::string* BrotherEmqx::release_ip() {
+  // @@protoc_insertion_point(field_release:BrotherEmqx.ip)
+  return ip_.Release(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), GetArena());
+}
+inline void BrotherEmqx::set_allocated_ip(std::string* ip) {
+  if (ip != nullptr) {
+    
+  } else {
+    
+  }
+  ip_.SetAllocated(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ip,
+      GetArena());
+  // @@protoc_insertion_point(field_set_allocated:BrotherEmqx.ip)
+}
+
+// int32 port = 3;
+inline void BrotherEmqx::clear_port() {
+  port_ = 0;
+}
+inline ::PROTOBUF_NAMESPACE_ID::int32 BrotherEmqx::_internal_port() const {
+  return port_;
+}
+inline ::PROTOBUF_NAMESPACE_ID::int32 BrotherEmqx::port() const {
+  // @@protoc_insertion_point(field_get:BrotherEmqx.port)
+  return _internal_port();
+}
+inline void BrotherEmqx::_internal_set_port(::PROTOBUF_NAMESPACE_ID::int32 value) {
+  
+  port_ = value;
+}
+inline void BrotherEmqx::set_port(::PROTOBUF_NAMESPACE_ID::int32 value) {
+  _internal_set_port(value);
+  // @@protoc_insertion_point(field_set:BrotherEmqx.port)
+}
+
+// string subBrotherStatuTopic = 4;
+inline void BrotherEmqx::clear_subbrotherstatutopic() {
   subbrotherstatutopic_.ClearToEmpty(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), GetArena());
 }
-inline const std::string& Emqx_parameter::subbrotherstatutopic() const {
-  // @@protoc_insertion_point(field_get:Emqx_parameter.subBrotherStatuTopic)
+inline const std::string& BrotherEmqx::subbrotherstatutopic() const {
+  // @@protoc_insertion_point(field_get:BrotherEmqx.subBrotherStatuTopic)
   return _internal_subbrotherstatutopic();
 }
-inline void Emqx_parameter::set_subbrotherstatutopic(const std::string& value) {
+inline void BrotherEmqx::set_subbrotherstatutopic(const std::string& value) {
   _internal_set_subbrotherstatutopic(value);
-  // @@protoc_insertion_point(field_set:Emqx_parameter.subBrotherStatuTopic)
+  // @@protoc_insertion_point(field_set:BrotherEmqx.subBrotherStatuTopic)
 }
-inline std::string* Emqx_parameter::mutable_subbrotherstatutopic() {
-  // @@protoc_insertion_point(field_mutable:Emqx_parameter.subBrotherStatuTopic)
+inline std::string* BrotherEmqx::mutable_subbrotherstatutopic() {
+  // @@protoc_insertion_point(field_mutable:BrotherEmqx.subBrotherStatuTopic)
   return _internal_mutable_subbrotherstatutopic();
 }
-inline const std::string& Emqx_parameter::_internal_subbrotherstatutopic() const {
+inline const std::string& BrotherEmqx::_internal_subbrotherstatutopic() const {
   return subbrotherstatutopic_.Get();
 }
-inline void Emqx_parameter::_internal_set_subbrotherstatutopic(const std::string& value) {
+inline void BrotherEmqx::_internal_set_subbrotherstatutopic(const std::string& value) {
   
   subbrotherstatutopic_.Set(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value, GetArena());
 }
-inline void Emqx_parameter::set_subbrotherstatutopic(std::string&& value) {
+inline void BrotherEmqx::set_subbrotherstatutopic(std::string&& value) {
   
   subbrotherstatutopic_.Set(
     &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArena());
-  // @@protoc_insertion_point(field_set_rvalue:Emqx_parameter.subBrotherStatuTopic)
+  // @@protoc_insertion_point(field_set_rvalue:BrotherEmqx.subBrotherStatuTopic)
 }
-inline void Emqx_parameter::set_subbrotherstatutopic(const char* value) {
+inline void BrotherEmqx::set_subbrotherstatutopic(const char* value) {
   GOOGLE_DCHECK(value != nullptr);
   
   subbrotherstatutopic_.Set(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value),
               GetArena());
-  // @@protoc_insertion_point(field_set_char:Emqx_parameter.subBrotherStatuTopic)
+  // @@protoc_insertion_point(field_set_char:BrotherEmqx.subBrotherStatuTopic)
 }
-inline void Emqx_parameter::set_subbrotherstatutopic(const char* value,
+inline void BrotherEmqx::set_subbrotherstatutopic(const char* value,
     size_t size) {
   
   subbrotherstatutopic_.Set(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(
       reinterpret_cast<const char*>(value), size), GetArena());
-  // @@protoc_insertion_point(field_set_pointer:Emqx_parameter.subBrotherStatuTopic)
+  // @@protoc_insertion_point(field_set_pointer:BrotherEmqx.subBrotherStatuTopic)
 }
-inline std::string* Emqx_parameter::_internal_mutable_subbrotherstatutopic() {
+inline std::string* BrotherEmqx::_internal_mutable_subbrotherstatutopic() {
   
   return subbrotherstatutopic_.Mutable(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), GetArena());
 }
-inline std::string* Emqx_parameter::release_subbrotherstatutopic() {
-  // @@protoc_insertion_point(field_release:Emqx_parameter.subBrotherStatuTopic)
+inline std::string* BrotherEmqx::release_subbrotherstatutopic() {
+  // @@protoc_insertion_point(field_release:BrotherEmqx.subBrotherStatuTopic)
   return subbrotherstatutopic_.Release(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), GetArena());
 }
-inline void Emqx_parameter::set_allocated_subbrotherstatutopic(std::string* subbrotherstatutopic) {
+inline void BrotherEmqx::set_allocated_subbrotherstatutopic(std::string* subbrotherstatutopic) {
   if (subbrotherstatutopic != nullptr) {
     
   } else {
@@ -1452,7 +1797,7 @@ inline void Emqx_parameter::set_allocated_subbrotherstatutopic(std::string* subb
   }
   subbrotherstatutopic_.SetAllocated(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), subbrotherstatutopic,
       GetArena());
-  // @@protoc_insertion_point(field_set_allocated:Emqx_parameter.subBrotherStatuTopic)
+  // @@protoc_insertion_point(field_set_allocated:BrotherEmqx.subBrotherStatuTopic)
 }
 
 // -------------------------------------------------------------------
@@ -1645,6 +1990,89 @@ inline void Navigation_parameter::set_allocated_terminal_emqx(::Emqx_parameter*
   // @@protoc_insertion_point(field_set_allocated:Navigation_parameter.Terminal_emqx)
 }
 
+// .BrotherEmqx brother_emqx = 4;
+inline bool Navigation_parameter::_internal_has_brother_emqx() const {
+  return this != internal_default_instance() && brother_emqx_ != nullptr;
+}
+inline bool Navigation_parameter::has_brother_emqx() const {
+  return _internal_has_brother_emqx();
+}
+inline void Navigation_parameter::clear_brother_emqx() {
+  if (GetArena() == nullptr && brother_emqx_ != nullptr) {
+    delete brother_emqx_;
+  }
+  brother_emqx_ = nullptr;
+}
+inline const ::BrotherEmqx& Navigation_parameter::_internal_brother_emqx() const {
+  const ::BrotherEmqx* p = brother_emqx_;
+  return p != nullptr ? *p : *reinterpret_cast<const ::BrotherEmqx*>(
+      &::_BrotherEmqx_default_instance_);
+}
+inline const ::BrotherEmqx& Navigation_parameter::brother_emqx() const {
+  // @@protoc_insertion_point(field_get:Navigation_parameter.brother_emqx)
+  return _internal_brother_emqx();
+}
+inline void Navigation_parameter::unsafe_arena_set_allocated_brother_emqx(
+    ::BrotherEmqx* brother_emqx) {
+  if (GetArena() == nullptr) {
+    delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(brother_emqx_);
+  }
+  brother_emqx_ = brother_emqx;
+  if (brother_emqx) {
+    
+  } else {
+    
+  }
+  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:Navigation_parameter.brother_emqx)
+}
+inline ::BrotherEmqx* Navigation_parameter::release_brother_emqx() {
+  
+  ::BrotherEmqx* temp = brother_emqx_;
+  brother_emqx_ = nullptr;
+  if (GetArena() != nullptr) {
+    temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp);
+  }
+  return temp;
+}
+inline ::BrotherEmqx* Navigation_parameter::unsafe_arena_release_brother_emqx() {
+  // @@protoc_insertion_point(field_release:Navigation_parameter.brother_emqx)
+  
+  ::BrotherEmqx* temp = brother_emqx_;
+  brother_emqx_ = nullptr;
+  return temp;
+}
+inline ::BrotherEmqx* Navigation_parameter::_internal_mutable_brother_emqx() {
+  
+  if (brother_emqx_ == nullptr) {
+    auto* p = CreateMaybeMessage<::BrotherEmqx>(GetArena());
+    brother_emqx_ = p;
+  }
+  return brother_emqx_;
+}
+inline ::BrotherEmqx* Navigation_parameter::mutable_brother_emqx() {
+  // @@protoc_insertion_point(field_mutable:Navigation_parameter.brother_emqx)
+  return _internal_mutable_brother_emqx();
+}
+inline void Navigation_parameter::set_allocated_brother_emqx(::BrotherEmqx* brother_emqx) {
+  ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArena();
+  if (message_arena == nullptr) {
+    delete brother_emqx_;
+  }
+  if (brother_emqx) {
+    ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena =
+      ::PROTOBUF_NAMESPACE_ID::Arena::GetArena(brother_emqx);
+    if (message_arena != submessage_arena) {
+      brother_emqx = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage(
+          message_arena, brother_emqx, submessage_arena);
+    }
+    
+  } else {
+    
+  }
+  brother_emqx_ = brother_emqx;
+  // @@protoc_insertion_point(field_set_allocated:Navigation_parameter.brother_emqx)
+}
+
 #ifdef __GNUC__
   #pragma GCC diagnostic pop
 #endif  // __GNUC__
@@ -1652,6 +2080,8 @@ inline void Navigation_parameter::set_allocated_terminal_emqx(::Emqx_parameter*
 
 // -------------------------------------------------------------------
 
+// -------------------------------------------------------------------
+
 
 // @@protoc_insertion_point(namespace_scope)
 

+ 11 - 2
config/navigation.prototxt

@@ -3,7 +3,7 @@
 main_agv:false
 Agv_emqx
 {
-	NodeId:"agv-main"
+	NodeId:"agv-child"
 	ip:"192.168.0.71"
 	port:1883
 	pubSpeedTopic:"monitor_child/speedcmd"
@@ -13,7 +13,7 @@ Agv_emqx
 
 Terminal_emqx
 {
-	NodeId:"agv1-child-nav"
+	NodeId:"agv-child-nav"
         ip:"192.168.0.71"
         port:1883
         pubStatuTopic:"agv_child/agv_statu"
@@ -21,3 +21,12 @@ Terminal_emqx
         subNavCmdTopic:"agv_child/nav_cmd"
         subBrotherStatuTopic:"agv_main/agv_statu"
 }
+
+#连接主PLC的emqx
+brother_emqx
+{
+	NodeId:"agv-child"
+	ip:"192.168.0.70"
+	port:1883
+	subBrotherStatuTopic:"monitor_child/statu"
+}

+ 10 - 2
config/navigation_main.prototxt

@@ -12,11 +12,19 @@ Agv_emqx
 
 Terminal_emqx
 {
-	NodeId:"agv1-main-nav"
+	NodeId:"agv-main-nav"
 	ip:"192.168.0.70"
 	port:1883
 	pubStatuTopic:"agv_main/agv_statu"
 	pubNavStatuTopic:"agv_main/nav_statu"
 	subNavCmdTopic:"agv_main/nav_cmd"
-	subBrotherStatuTopic:"agv_child/agv_statu"
+}
+
+#连接后车的emqx
+brother_emqx
+{
+	NodeId:"agv-main"
+	ip:"192.168.0.71"
+	port:1883
+	subBrotherStatuTopic:"monitor_child/statu"
 }

+ 8 - 2
parameter.proto

@@ -16,8 +16,13 @@ message Emqx_parameter
     string pubStatuTopic=4;
     string pubNavStatuTopic=5;
     string subNavCmdTopic=6;
-  string subBrotherStatuTopic=7;
-
+}
+message BrotherEmqx
+{
+  string NodeId=1;
+  string ip=2;
+  int32 port=3;
+  string subBrotherStatuTopic=4;
 }
 
 message Navigation_parameter
@@ -25,5 +30,6 @@ message Navigation_parameter
   bool main_agv=1;   //是否是两车整体
   AgvEmqx_parameter Agv_emqx=2;
   Emqx_parameter Terminal_emqx=3;
+    BrotherEmqx brother_emqx=4;
 }