怎樣寫一個相似ROS的易用的android機器人框架(3)

怎樣寫一個相似ROS的易用的android機器人框架(3)

怎樣寫一個相似ROS的易用的android機器人框架(2)java

參考項目源碼android

咱們實現了相似ROS系統的節點註冊和消息轉發機制,在這個機制中,節點自定義的消息封裝在Bundle對象中,這樣每一個節點的 publish()都統一了,可是也有很差的,用起來就沒那麼方便,咱們更但願定義本身的消息類,將一些複雜的數據填入這個類對象中,而後發佈,如機器人馬達的數據,能夠定義:git

data class MsgMotor(@JvmField var L: Int = 0, @JvmField var R: Int = 0)

轉換成Bundle就得這麼寫app

Bundle().apply {
	putInt("L", xxx.L)
	putInt("R",xxx.R)
}

其餘節點接收到這個消息時又得反向解析一遍,很麻煩 可否簡單解決呢?框架

利用 apt 自動生成轉換類的代碼

apt能夠掃描源碼中特定的註解,並根據註解生成特定的代碼,所以咱們開發apt工具庫,而後在讓編譯腳本調用這個工具庫幫咱們生成這些轉換代碼。源碼目錄下ide

  • easyAptApi : 包含源碼和apt工具庫須要識別的註解的定義
  • easyAptProcessor: 是實現這個代碼處理過程的實現

gradle腳本中指定 **kapt **(apt的Kotlin實現)processor的設置和依賴

dependencies {
	compile project(":easyAptApi")
	//指定 apt
	kapt project(":easyAptProcessor")
}

須要轉換的類添加註解

@MessageType("")
data class MsgMotor(@JvmField var L: Int = 0, @JvmField var R: Int = 0)

而後編譯 kapt 自動在 generated 目錄下生成轉換類的源碼

public final class ConvertMsgMotor {
  public static Bundle toBundle(MsgMotor msgmotor) {
    Bundle b = new Bundle();
    try {
      b.putInt("L", msgmotor.L);
      b.putInt("R", msgmotor.R);
    } catch (Exception e) {
       e.printStackTrace();
    }
    return b;
  }

  public static MsgMotor toMsg(Bundle b) {
    MsgMotor r = new MsgMotor();
    try {
      r.L = b.getInt("L");
      r.R = b.getInt("R");
    } catch (Exception e) {
       e.printStackTrace();
    }
    return r;
  }
}

使用這個ConvertMsgMotor便可實現MsgMotor與Bundle之間的相互轉換了。函數

kapt processor 的實現過程

gradle腳本添加

dependencies {
    compile project(':easyAptApi')
    compile 'com.google.auto.service:auto-service:1.0-rc2'
    compile 'com.squareup:javapoet:1.9.0'
}

定義主類

processor的主類須要實現 AbstractProcessor接口,並添加註解 @AutoService(Processor::class) ,這是com.google.auto.service中的註解,用來生成apt插件庫工具

須要定義 resource 目錄下的 META-INF/services/javax.annotation.processing.Processor文件,填寫主類的完整包名和類名,不然編譯腳本將沒法搜索到這個插件類gradle

實現 AbstractProcessor的全部方法

  1. override fun init(processingEnv: ProcessingEnvironment) :插件初始化時調用
  2. override fun getSupportedAnnotationTypes(): Set<String> : 必須返回全部須要處理的註解的完整包名類名的集合,不然將忽略不處理
  3. override fun process(annotations: Set<TypeElement>, roundEnv: RoundEnvironment): Boolean : 真正的處理函數,可在此調用 com.squareup:javapoet 庫生成 java文件

經過Java Peot庫生成java源代碼文件

這樣,一個根據註解自動生成代碼的apt插件庫機完成了google

怎樣寫一個相似ROS的易用的android機器人框架(4)

相關文章
相關標籤/搜索