Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

KotlinでROSノードを書いてみた

1,800 views

Published on

2015/10/04 ROS勉強会

Published in: Software
  • Be the first to comment

KotlinでROSノードを書いてみた

  1. 1. KotlinでROSノードを 書いてみた 2015/10/04 ROS勉強会 @iwata_n
  2. 2. @iwata_n いわたん ros歴2ヶ月くらい - ROS本を読んだぐらい ロードバイクとボルダリング
  3. 3. Message このノードをKotlinで作った!
  4. 4. 今日伝えたい事 ROSノードをKotlinで書く方法
  5. 5. What s Kotlin? Why Kotlin?
  6. 6. Kotlinを知ってる人!
  7. 7. まぁそうなりますよね
  8. 8. What's Kotlin? Javaと同じ仮想マシン上で動くけど、 Javaより安全 Javaより簡潔 Javaと同等に速い らしい あとAndroidのアプリも書けるらしい
  9. 9. Kotlin言語は、ジェットブレインズ社の研究所のひとつ、ロシア連邦 レニングラード州都のサンクトペテルブルクで生まれた。 ジェットブレインズ社は Java、Ruby、Python などのプログラミン グ言語による開発環境などを開発して販売してきた。Kotlin言語は同 社が経験を活かしてJava言語をもっと簡潔、安全になるように改良し た産業利用向け汎用言語として、2011年7月20日に発表された。 オペーレーティング・システムによらずJava仮想マシン上で動く。 Java言語が書かれたプログラムと同じほど速くコンパイルされ同じほ ど速く動作するとしている。 Java言語に望まれている機能であっても互換性を保つために実現でき ていない機能や、将来のJava言語の仕様で実現が予定されている機能 から、有用と思う機能を採用した。また、Java仮想マシンで動く点で 似ているスクリプト言語 Groovy や関数型プログラミング言語色の強 い Scala から、機能や簡易記法(糖衣構文)を採用した。 2012年2月14日、Kotlin はApacheライセンス バージョン2.0に基づ 詳しくはWebで!
  10. 10. KotlinがJavaと同じ仮想マシン上で動く ↓ それならRosJavaで動くんじゃね? ↓ じゃぁ確かめよう Why Kotlin?
  11. 11. 技術的な話
  12. 12. 手順 1. RosJavaを入れる 2. RosJavaのプロジェクトを作る 3. build.gradleにkotlin関係のコードを追記する 4. kotlinでコードを書く 5. ビルド
  13. 13. RosJavaのインストール http://qiita.com/iwata-n@github/items/ 989bed3acc21ffb28521
  14. 14. $ mkdir -p /ros/myjava/src $ cd /ros/myjava/src $ source /opt/ros/indigo/setup.bash $ catkin_init_workspace $ cd .. $ catkin_make catkinのワークスペース作成 ROS本のP42∼の作業内容と同じです
  15. 15. パッケージの作成 $ cd /ros/myjava/src $ catkin_create_rosjava_pkg <Package> ROS本のP44∼の作業に相当します。 ただ、rosjavaでパッケージを作成するので、 コマンドが違います。 <Package>はお好きな名前で。
  16. 16. パッケージの作成 Created repo file: /home/ros/ros/myjava/src/kotlin/settings.gradle Created repo file: /home/ros/ros/myjava/src/kotlin/build.gradle Created repo file: /home/ros/ros/myjava/src/kotlin/CMakeLists.txt Created repo file: /home/ros/ros/myjava/src/kotlin/package.xml Creating gradle wrapper: /opt/ros/indigo/lib/python2.7/dist-packages/ rosjava_build_tools/gradle/gradlew -p /home/ros/ros/myjava/src/kotlin wrapper :wrapper BUILD SUCCESSFUL Total time: 7.033 secs catkin_create_rosjava_pkgを実行結果
  17. 17. プロジェクトを作成 $ cd /ros/myjava/src/kotlin/ $ catkin_create_rosjava_project sample Creating rosjava project Name : sample File : build.gradle File : settings.gradle File : Talker.java File : Listener.java File : CMakeLists.txt (gradle task update) gradleやjavaファイル等の必要なファイルを生成してくれる
  18. 18. package com.github.rosjava.kotlin.sample; /* 略 */ public class Listener extends AbstractNodeMain { @Override public GraphName getDefaultNodeName() { return GraphName.of("rosjava/listener"); } @Override public void onStart(ConnectedNode connectedNode) { final Log log = connectedNode.getLog(); Subscriber<std_msgs.String> subscriber = connectedNode.newSubscriber("chatter", std_msgs.String._TYPE); subscriber.addMessageListener(new MessageListener<std_msgs.String>() { @Override public void onNewMessage(std_msgs.String message) { log.info("I heard: "" + message.getData() + """); } }); } }
  19. 19. ビルド $ cd /ros/myjava $ catkin_make Base path: /home/ros/ros/myjava # ... 省略 #### Running command: "make -j8 -l8" in "/home/ros/ros/myjava/build" #### Scanning dependencies of target gradle-iwatan [100%] Gradling tasks for kotlin Uploading: com/github/rosjava/kotlin/sample/0.1.0/sample-0.1.0.jar to repository remote at file:/home/ros/ros/myjava/devel/share/maven Transferring 4K from remote Uploaded 4K [100%] Built target gradle-kotlin catkinでビルドが出来るが、gradleで直接ビルドした方が速い
  20. 20. 実行 $ cd src/<Package>/sample/build/install/sample/bin $ ./sample com.github.rosjava.kotlin.sample.Listener
  21. 21. rosjavaは ここまでで手順でOK
  22. 22. Kotlin化
  23. 23. build.gradleを編集 apply plugin: 'application' mainClassName = 'org.ros.RosRun' dependencies { compile 'org.ros.rosjava_core:rosjava:[0.2,0.3)' } roskotlin/src/<Package>/sample/build.gradle gradleとはざっくり言うとMakefileみたいなもの (他にも色々機能はありますが)
  24. 24. 追加その1 apply plugin: kotlin" buildscript { repositories { mavenCentral() maven { url 'http://oss.sonatype.org/content/repositories/snapshots' } } dependencies { classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:0.1-SNAPSHOT' } }
  25. 25. 追加その2 sourceSets { deploy } repositories { mavenCentral() maven { url 'http://oss.sonatype.org/content/repositories/snapshots' } } dependencies { compile 'com.google.guava:guava:12.0' compile 'org.jetbrains.kotlin:kotlin-stdlib:0.1-SNAPSHOT' deployCompile 'com.google.guava:guava:12.0' testCompile 'org.testng:testng:6.8' } test.testClassesDir = project.tasks.compileTestKotlin.destinationDir
  26. 26. この2つを追記すれば Kotlinで書ける
  27. 27. kotlinでコードを書く • IntelliJ IDEAを使うとプラグインでJava→Kotlinが 簡単に出来る • IntelliJはPythonでも便利なIDEなのでオススメ • Javaのファイルを開いて自動変換するだけ • http://kotlinlang.org/docs/tutorials/kotlin-android.html
  28. 28. package com.github.rosjava.kotlin.sample; /* 略 */ public class Listener extends AbstractNodeMain { @Override public GraphName getDefaultNodeName() { return GraphName.of("rosjava/listener"); } @Override public void onStart(ConnectedNode connectedNode) { final Log log = connectedNode.getLog(); Subscriber<std_msgs.String> subscriber = connectedNode.newSubscriber("chatter", std_msgs.String._TYPE); subscriber.addMessageListener(new MessageListener<std_msgs.String>() { @Override public void onNewMessage(std_msgs.String message) { log.info("I heard: "" + message.getData() + """); } }); Java
  29. 29. package com.github.rosjava.kotlin.sample /* 略 */ public class Listener() : AbstractNodeMain() { override public fun getDefaultNodeName(): GraphName = GraphName.of("rosjava/listener") override public fun onStart(connectedNode: ConnectedNode) { val log = connectedNode.getLog() val subscriber = connectedNode.newSubscriber<std_msgs.String>("chatter", std_msgs.String._TYPE) subscriber.addMessageListener { message -> log.info("Kotlin heard: "" + message.getData() + """) } } } Kotlin
  30. 30. ビルド $ cd /ros/myjava $ catkin_make Base path: /home/ros/ros/myjava # ... 省略 #### Running command: "make -j8 -l8" in "/home/ros/ros/myjava/build" #### Scanning dependencies of target gradle-kotlin [100%] Gradling tasks for kotlin Uploading: com/github/rosjava/kotlin/sample/0.1.0/sample-0.1.0.jar to repository remote at file:/home/ros/ros/myjava/devel/share/maven Transferring 4K from remote Uploaded 4K [100%] Built target gradle-kotlin RosJavaと全く同じ。
  31. 31. 実行 これまたRosJavaと全く同じ。 $ cd src/<Package>/sample/build/install/sample/bin $ ./sample com.github.rosjava.kotlin.sample.Listener
  32. 32. 手順おさらい 1. RosJavaを入れる 2. プロジェクトを作る 3. build.gradleにkotlin関係のコードを追記する 4. kotlinでコードを書く 5. ビルド RosJavaと一緒 RosJavaと一緒
  33. 33. Kotlin化 • コードは少し簡潔になった • Null安全で実行中にぬるぽで突然死が無い • ノードの突然死回避→普通のExceptionでは死ぬ • IntelliJ IDEAとROSの相性がいい事に気がつく
  34. 34. But…
  35. 35. But… • Pythonと比べると実行までに時間がかかる • サンプルのビルドに11秒ほど • ハッカソンなど時間が無い時にはストレスに
  36. 36. まとめ
  37. 37. まとめ 👀Kotlinでのノード実装の方法を紹介 📗RosJavaでもROS本の知識が生きる 😖短期の開発で静的型言語は大変 😃型チェックとNullセーフは安心
  38. 38. おしまい
  39. 39. リンク • 写真素材ぱくたそ • https://www.pakutaso.com • RosJavaを入れた記録 • http://qiita.com/iwata-n@github/items/989bed3acc21ffb28521 • KotlinでROSのノードを書く • http://qiita.com/iwata-n@github/items/30eefa47326fb5b0ef77 • 今日のコード+αのGithub • https://github.com/iwata-n/roskotlin • KotlinのGithub • https://github.com/JetBrains/kotlin-examples/blob/master/ gradle/hello-world/build.gradle

×