2011/10/25(火)rosserial_arduino使い方メモ
2011/10/25 12:11
ArduinoはDuemilanoveを使用しました.Japaninoだとうまく受信できなかったりしたので,クロックが16Mhzのものじゃないと駄目なのかも.
Publisher,Subscriber
まずは基本的なPublisher,Subscriberの使い方から.#include <ros.h> #include <std_msgs/Int32MultiArray.h> void messageCb( const std_msgs::Int32MultiArray& msg); ros::NodeHandle nh; std_msgs::Int32MultiArray array_msg; ros::Subscriber<std_msgs::Int32MultiArray> s("array_sub", &messageCb); ros::Publisher p("array_pub", &array_msg); void messageCb( const std_msgs::Int32MultiArray& msg){ array_msg = msg; } void setup() { array_msg.data_length = 3; array_msg.data = (int32_t *)malloc(sizeof(int32_t)*3); array_msg.data[0] = 0; array_msg.data[1] = 0; array_msg.data[2] = 0; nh.initNode(); nh.advertise(p); nh.subscribe(s); } void loop() { p.publish(&array_msg); nh.spinOnce(); delay(10); }というスケッチをArduinoに書き込み,PCのコンソールから
$ rosrun rosserial_python serial_node.py /dev/ttyUSB0としてクライアントを起動させた後
$ rostopic pub array_sub std_msgs/Int32MultiArray [[['a',3,1]],0] [123,456,789] publishing and latching message. Press ctrl-C to terminate $ rostopiecho array_publayout: dim: - label: 4 size: 3 stride: 1 data_offset: 0 data: [123, 456, 789] ---というようにして,Publishした値がちゃんと受け取られていることが確認できます.
ServiceServer
2011/12/6追記change set 167あたりのサンプルプログラムに使い方が載っていました。
この記事を書いていた時点ではまだちゃんと実装されてなかったんですね。。。
次にServiceServerの使い方.こちらは実はよくわかってません.
#include <ros.h> #include <std_msgs/Empty.h> void myservice(const std_msgs::Empty& req, std_msgs::Empty& res ); ros::NodeHandle nh; void myservice(const std_msgs::Empty& req, std_msgs::Empty& res ) { } ros::ServiceServer<std_msgs::Empty,std_msgs::Empty> service("service", &myservice); void setup() { nh.initNode(); nh.advertiseService(service); } void loop() { nh.spinOnce(); delay(10); }このスケッチを書き込み,クライアントを起動させると期待していたServiceServerではなくSubscriverとして認識されます.
そして
$rostopic pub service std_msgs/EmptyというようにPublishするとmyservice関数の中に入った後,resをPublishしてくれているようです.
どうやってresを受け取るのかはわかりません...
Parameter
次に便利なパラメータの使い方に関して.#include <ros.h> #include <std_msgs/Float32MultiArray.h> ros::NodeHandle nh; std_msgs::Float32MultiArray data_msg; ros::Publisher data_pub("data_pub", &data_msg); void setup() { nh.initNode(); nh.advertise(data_pub); data_msg.data_length = 3; data_msg.data=(float*)malloc(sizeof(float)*3); while(!nh.connected()) { nh.spinOnce(); delay(10); } if (!nh.getParam("param_test", data_msg.data,3)){ //default values data_msg.data[0]=0; data_msg.data[1]=0; data_msg.data[2]=0; } } void loop() { data_pub.publish( &data_msg ); nh.spinOnce(); delay(10); }このスケッチを書き込んだら,クライアントを起動する前に,
$rosparam set param_test [1.23,4.56,7.89]というようにあらかじめパラメータをセットしておきます.
試しているバージョン(changeset 143)の段階ではパラメータをセットしておかないとエラーでクライアントが落ちるので注意してください.
クライアントを起動したら
$ rostopic echo data_pub layout: dim: [] data_offset: 0 data: [1.2300000190734863, 4.559999942779541, 7.8899998664855957] ---というようにパラメータがセットできていることが確認できます.
ちなみに
mbedに移植したものでも同じように使うことができます.mbedの場合だと
main() { //setup()部分をここに while(1){ //loop()部分をここに } }みたいな感じでちょっとの修正(delay()をwait_ms()にするとか)でそのまま使えます.便利!
2011/09/04(日)ArduinoでRS485通信をしてみる
2011/09/04 15:36
LTC485CN8を使ってみる
回路図
説明
LTC485CN8はDE,RE端子の状態によって送信、受信のモードを切り替えて使います。つまりマイコンは,DE,REに直結した端子をHIGHにしてから送信、LOWにしてから受信というように処理を行えばいいわけですね。
あとはまぁ別に普通のシリアル通信です。
余談となってしまうんですが,RS405CBの設定で返信ディレイ時間が用意されている理由は、送受信の切り替えに時間がかかるマイコンを使ったときに調整するためなのかなぁと思ってます。
RS405CBはFutabaのロボット用サーボの開発成果を全て盛り込んだという触れ込みだけあって、色々気が使われてる印象がありますね。
プログラムはちょっと長いので続きを読むに置いときました。
参考という名のパクリ元
RS-485の接続(爪車さん)FT232RLでRS-485通信(爪車さん)
爪車さんはシミュレータを使いこなしつつ二足歩行ロボをやってらっしゃる凄い方です。
2011/08/22(月)rosserial_arduinoをmbedへ移植
2011/08/23 02:40
そしてふらふら探してみるとRTnoのROS版みたいなものでrosserialというROSノード?があるんですね。
例によって反射的にmbedに移植してしまいましたので下に置いておきます。
まぁ自分以外にこれを求めている人がいるか甚だ疑問があるところですが……。
プログラム
rosserial_mbedrosserial_arduinoに付いてきてたexamplesごと移植したコードです。まず試したいときはこちらをインポートしてください。
ただし全てのexampleが完全に動作かどうかはチェックできてないのでご注意を。。。
なお、初期状態ではHelloWorldのexampleが実行されるようになってます。
rosserial_mbed_lib
examplesだけ取り除いたものです。
ライブラリとして使いたいときはこちらをご利用ください。
使い方
基本的にはrosserial_arduinoのチュートリアルを参考にすればオッケーだと思います。ここではとりあえず、一番基本的なところのHelloWorldの使い方だけ載っけておきます。
HelloWorld
コンソール上でroscoreとroscoreを実行して
rosrun rosserial_python serial_node.py /dev/ttyACM0とmbedの繋がっているポートを指定してserial_node.pyを実行します。
うまく繋がっていれば
rostopic echo chatterとすると、mbedからstringのデータが送られてきます。
その他は本家のチュートリアルとソースを照らし合わせながらやってみてください。
これを利用して自作ロボットをROSの枠組みで動かすとか楽しそうですよね。