KotlinでROSノードを
書いてみた
2015/10/04 ROS勉強会
@iwata_n
@iwata_n いわたん
ros歴2ヶ月くらい
- ROS本を読んだぐらい
ロードバイクとボルダリング
Message
このノードをKotlinで作った!
今日伝えたい事
ROSノードをKotlinで書く方法
What s Kotlin?
Why Kotlin?
Kotlinを知ってる人!
まぁそうなりますよね
What's Kotlin?
Javaと同じ仮想マシン上で動くけど、
Javaより安全
Javaより簡潔
Javaと同等に速い
らしい
あとAndroidのアプリも書けるらしい
Kotlin言語は、ジェットブレインズ社の研究所のひとつ、ロシア連邦
レニングラード州都のサンクトペテルブルクで生まれた。
ジェットブレインズ社は Java、Ruby、Python などのプログラミン
グ言語による開発環境などを開発して販売してきた。Kotlin言語は同
社が経験を活かしてJava言語をもっと簡潔、安全になるように改良し
た産業利用向け汎用言語として、2011年7月20日に発表された。
オペーレーティング・システムによらずJava仮想マシン上で動く。
Java言語が書かれたプログラムと同じほど速くコンパイルされ同じほ
ど速く動作するとしている。
Java言語に望まれている機能であっても互換性を保つために実現でき
ていない機能や、将来のJava言語の仕様で実現が予定されている機能
から、有用と思う機能を採用した。また、Java仮想マシンで動く点で
似ているスクリプト言語 Groovy や関数型プログラミング言語色の強
い Scala から、機能や簡易記法(糖衣構文)を採用した。
2012年2月14日、Kotlin はApacheライセンス バージョン2.0に基づ
詳しくはWebで!
KotlinがJavaと同じ仮想マシン上で動く
↓
それならRosJavaで動くんじゃね?
↓
じゃぁ確かめよう
Why Kotlin?
技術的な話
手順
1. RosJavaを入れる
2. RosJavaのプロジェクトを作る
3. build.gradleにkotlin関係のコードを追記する
4. kotlinでコードを書く
5. ビルド
RosJavaのインストール
http://qiita.com/iwata-n@github/items/
989bed3acc21ffb28521
$ mkdir -p /ros/myjava/src
$ cd /ros/myjava/src
$ source /opt/ros/indigo/setup.bash
$ catkin_init_workspace
$ cd ..
$ catkin_make
catkinのワークスペース作成
ROS本のP42∼の作業内容と同じです
パッケージの作成
$ cd /ros/myjava/src
$ catkin_create_rosjava_pkg <Package>
ROS本のP44∼の作業に相当します。
ただ、rosjavaでパッケージを作成するので、
コマンドが違います。
<Package>はお好きな名前で。
パッケージの作成
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を実行結果
プロジェクトを作成
$ 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ファイル等の必要なファイルを生成してくれる
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() + """);
}
});
}
}
ビルド
$ 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で直接ビルドした方が速い
実行
$ cd src/<Package>/sample/build/install/sample/bin
$ ./sample com.github.rosjava.kotlin.sample.Listener
rosjavaは
ここまでで手順でOK
Kotlin化
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みたいなもの
(他にも色々機能はありますが)
追加その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'
}
}
追加その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
この2つを追記すれば
Kotlinで書ける
kotlinでコードを書く
• IntelliJ IDEAを使うとプラグインでJava→Kotlinが
簡単に出来る
• IntelliJはPythonでも便利なIDEなのでオススメ
• Javaのファイルを開いて自動変換するだけ
• http://kotlinlang.org/docs/tutorials/kotlin-android.html
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
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
ビルド
$ 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と全く同じ。
実行
これまたRosJavaと全く同じ。
$ cd src/<Package>/sample/build/install/sample/bin
$ ./sample com.github.rosjava.kotlin.sample.Listener
手順おさらい
1. RosJavaを入れる
2. プロジェクトを作る
3. build.gradleにkotlin関係のコードを追記する
4. kotlinでコードを書く
5. ビルド
RosJavaと一緒
RosJavaと一緒
Kotlin化
• コードは少し簡潔になった
• Null安全で実行中にぬるぽで突然死が無い
• ノードの突然死回避→普通のExceptionでは死ぬ
• IntelliJ IDEAとROSの相性がいい事に気がつく
But…
But…
• Pythonと比べると実行までに時間がかかる
• サンプルのビルドに11秒ほど
• ハッカソンなど時間が無い時にはストレスに
まとめ
まとめ
👀Kotlinでのノード実装の方法を紹介
📗RosJavaでもROS本の知識が生きる
😖短期の開発で静的型言語は大変
😃型チェックとNullセーフは安心
おしまい
リンク
• 写真素材ぱくたそ
• 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

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