2014/08/26

バイクのふるさと浜松に出展してきました

Lv_ZEROです。

前回の記事で取り上げたように、先日8/23、24に開催された「バイクのふるさと浜松2014」というイベントの一部の「ものづくり学校コーナー」に出展してきましたので報告したいと思います。

私達は静岡大学として出展し、レスキューロボットの展示や実演、小さな子供向けのレスキューロボット操縦体験を行いました。


子供向けのレスキューロボット操縦体験では、遠隔操作の体験ということで、パン・チルト機構の付いたカメラを搭載した小型ロボットをカメラ映像だけを頼りに操縦し、L字の通路(建物内を想定)のどこかに貼ってある絵(要救助者)を探し出し、帰還するという任務を行ってもらいました。

子供たちにロボットの操作方法を教えた時には、「簡単じゃん!」という声が多くありましたが、実際にカメラ映像だけで操作をしてみると、「迷った!」「どこにいるか分かんなくなった!」等の声を漏らす人がほとんどで、子供達だけでなく親御さんまで遠隔操作の難しさを理解して頂けたようで何よりです。



レスキューロボットコンテストに向け私達が製作したレスキューロボットの展示や実演では、バイクのイベントにも関わらず多くの人々が興味を示したことに驚きました。まだまだ活躍の場が少ないレスキューロボットですが、多くの人が期待しているんだと実感しました。

特に、広島で土砂災害が起きたばかりでしたので、「ああいった場所(土砂災害被災地)で活躍するレスキューロボットが出てきてほしい」との声を多く耳にしました。私もニュースで重機を使うことが出来ず、危険な中、人の手で救助活動を行っている現場を見てましたので、本当にそうだと思います。

最近、土砂災害や水害による市街地の被害を多く耳にします。私達の参加しているレスキューロボットコンテストはまさにこのような人の立ち入れない市街地での救助活動を想定したコンテストですので、これからもレスキューロボットの開発に取り組み、少しでも社会に貢献できれば嬉しいです。

2014/08/22

バイクのふるさと浜松に出展します


どうも.広報担当(仮)の「書庫」です.

本サークルは,今週末の8月23日(土)と24日(日)にバイクのふるさと浜松に出展します.本サークルはバイクとは関わりが無いのですが,イベントの一部に「ものづくり学校コーナー」があり,そちらへ出展いたします.

場所は静岡県浜松市総合産業展示館となっています.

レスキューロボットの展示や,小さな子供向けのレスキューロボット操縦体験を行う予定となっておりますので,お近くの方は是非いらしてみてはどうでしょうか?


さて,本イベントへ参加するための準備をしている様子を少しご紹介いたしましょう.



























なにやら2人で製作しているようです.これは一体何に使われるのでしょうか?
























当日掲載するポスターを作っていました.























当日活躍してくれるロボットです.出来上がるのが楽しみです.


それでは次回の更新をお楽しみに.






2014/08/11

台風の中,神戸から戻ってまいりました


本サークルの広報担当(仮)をすることとなりました「書庫」と申します.
短い期間の担当となってしまうかもしれませんが,
サークルの活動の様子を随時紹介していきたいと思っています.
皆さま,よろしくお願いいたします.

8月9日,10日はレスキューロボットコンテストの本戦が行われており,
神戸へ遠征に行っていました.台風の中,移動が大変でしたが,
なんとか無事戻ってくることができました.長い旅,お疲れ様でした.
長時間運転してくださった先輩方には大いに感謝しておきましょう.

大会の結果は後日,別の方がレポートしてくださると思うので,
今回はここまでとさせて頂きます.今後ともよろしくお願いいたします.



2014/07/08

レスコン予選突破!!

お久しぶりです。Lv_ZEROです。

先日レスキューロボットコンテスト東京予選が行われ、私達静岡大学ロボットファクトリーは「レススキューやらまいか」として出場し、ポイント枠で予選を突破することができました。

昨年度の予選会ではダミヤンを1体も救助できないという残念な結果に終わってしまったため、ダミヤンを救助しての予選突破は成長の証として、とても喜ばしく思います。

8/9,10に行われる本選に向けて、まだまだやらなければならないことは残っていますが、「レスキュー工学大賞」目指して、ベストを尽くしたいと思います。

以下、レスキューロボットコンテスト東京予選の写真

↑3号機がダミヤンを救出している所

↑1号機が家ガレキの屋根を取っている所 

↑2号機が家ガレキ内のダミヤンにアプローチしている所


2014/06/13

画像の転送例

とても単純に画像データ(ビットマップ)を直接送る例です。今回作成したクラスの使い方は次の通り :

(1) TransportableBitmapクラス
転送できるビットマップのクラス。Bitmapを指定して生成する。
var tb = new TransportableBitma(bitmap);

(2)  ReceivableBitmapクラス
受信できるビットマップのクラス。受信後にキャストしてビットマップを取得する。

var rb = new ReceivableBitmap();
// 通信が完了したことを認識した後
Bitmap bitmap = (Bitmap)rb;

今回は簡単のためエラー処理を全く行っていないが実際には、画像の変換時に行うべきである。また、受信完了時はイベントに通知できるようにしたほうが有用なため、ReceivableBitmapクラスに受信イベントを追加するとよいだろう。

サンプルの動作風景:


以下ソース:
using System;
using System.Drawing;
using System.Drawing.Imaging;

/*
 * ビットマップの転送例
 */

namespace cstest {
    class TransportableBitmap {
        public TransportableBitmap(Bitmap bitmap) {
            this.bitmap = bitmap;
        }

        public void sendTo(string host, int port, int local_port) {
            System.Net.Sockets.UdpClient udp =
                 new System.Net.Sockets.UdpClient(local_port);
           
            // ビットマップのデータ取得
            var data = (byte[])(new ImageConverter()).ConvertTo(bitmap, typeof(byte[]));

            udp.Send(data, data.Length, host, port);
           
            //UDP接続を終了
            udp.Close();
        }

        // Bitmapにキャストできるようにする
        public static explicit operator Bitmap(TransportableBitmap tb) {
            return tb.bitmap;
        }

        Bitmap bitmap;
    }

    class ReceivableBitmap {
        public ReceivableBitmap() {

        }

        public async System.Threading.Tasks.Task receive(string host, int port, int local_port) {
            System.Net.Sockets.UdpClient udp =
                 new System.Net.Sockets.UdpClient(local_port);
            // 受信の非同期待機
            var result = await udp.ReceiveAsync();
            // データを画像クラスに変換
            var image = (Image)(new ImageConverter()).ConvertFrom(result.Buffer);
            bitmap = new Bitmap(image);

            System.Console.WriteLine("受信完了");
        }

        // このクラスをBitmapにキャストできるようにする
        public static explicit operator Bitmap (ReceivableBitmap rb) {
            return rb.bitmap;
        }

        Bitmap bitmap;
    }

    public class Program {
        public static void Main() {
            Console.WriteLine("モードの選択(送信1 / 受信 2) : ");
            int mode = int.Parse(Console.ReadLine());

            if(mode == 1) {
                Console.WriteLine("送信するファイル名 : ");
                string file_name = Console.ReadLine();

                var image = (Bitmap)Image.FromFile(file_name);
                var tb = new TransportableBitmap(image);

                tb.sendTo("127.0.0.1", 2002, 2001);
            }
            else {
                Console.WriteLine("受信待機中…");
                var rb = new ReceivableBitmap();
                rb.receive("127.0.0.1", 2001, 2002);

                Console.WriteLine("受信完了後に何か押してください。");
                Console.ReadLine();

                // 画像を表示
                Form1 form1 = new Form1();
                form1.showPicture((Bitmap)rb);

                // 待機
                System.Windows.Forms.Application.Run(form1);
            }
        }
    }
}

2014/05/19

C#とLuaの連携

NLuaというスクリプト言語LuaをC#から使えるようにするプロジェクトがあります。(https://github.com/NLua/NLua)

1.目的
スクリプト言語からC#で実装したモーター制御、通信、描画、入出力処理を制御し、 複数の期待に柔軟に対応できるアプリケーションづくりを支援する。

想定する使い方はたとえば次の通り。

-- 画面に文字を描画
screen = Screen.new();
screen.textOut("sample");

-- 文字の大きさを変更
screen.setFontSize(20);

-- 描画する位置を指定
screen.setPosition(100, 100);

-- 枠を描画
screen.drawRectangle(10, 10, 100, 100);

-- ボードの生成
board = {};
board[1] = PWMBoard.new();
board[2] = RotaryEncoderBoard.new();

-- ボードへ出力
t = board[1];
t:setPosition(2, 500); -- 出力2を50%にする
t:setPosition(3, 100); -- 出力3を10%にする
t:send(); -- データを送信する

-- ボードから入力
t = board[2];
t:recieve();
screen.textOut(t:getPosition());

-- コントローラからの入力受付
function onControllerInput(status) {
if status.maru then
MessageBox.show("○が押された");
end
}

-- 1フレームごと呼び出される関数
function onFrame() {
-- 描画処理など
}

2014/04/09

遺伝的プログラミングの実装の準備

こんにちはKです。遺伝的プログラミングの基礎勉強として実装を目指すべく、展望をまとめてみました。次回制作します。

Santa Fe Trail(人工蟻の探索)問題を遺伝的プログラミングによって解いてみます。この問題は、32×32マスのなかに89個の餌があり、アリがその餌をたどって生きながらえながらすべての餌を集める経路を求めるものです。

さて、この問題の定義を確認します。人口蟻は上下左右の4方向だけ向きを変えられます。動作は、左右90度向きを変えるか、1マスだけ前進できます。また、範囲外にはいけません。人口アリにはセンサーがあり、前方1マスにエアがあるかどうか判断できます。そして、蟻には初期エネルギーがあり、向きを変える、あるいは前進するごとに1減少します。エネルギーが0になるまでにできるだけ多くの餌を見つけられるようにします。

遺伝的プログラミングでは
1. ランダムに遺伝子を生成する
2. 行動を起こし、遺伝子の適合度(誤差)を求める
3. 優秀な遺伝子だけを残したり、遺伝子中のある部分を入れ替えたり(逆位)、他の遺伝子と入れ替えたり(交叉)、突然一部分を適当に置き換えたりする(突然変異)
4. 世代数の上限に達したり、適合度が0となるような遺伝子を解とする。なければ2から繰り返す。
という操作によって解を得ます。解とは関数やアルゴリズムなどであり、遺伝的プログラミングを使って人間では把握できない解を得ます。面白いのは、解が木であるため、言い換えるとプログラムがプログラムを作ることもできるのです。つまり、遺伝的プログラミングによって抽象構文木を出力すれば、これはプログラムを出力していることになります。最も簡単な例は四則演算を出力する例ですが、これにかぎらずfor文やif文だって出力できるのです。ツリーの中身を解釈するのは人間が作るプログラムです。

遺伝子の変更について考えましょう。優秀な遺伝子を残し、優秀でない遺伝子には何らかの変更を加えて残すことを考えます。その比率はパラメータとして与えます。例えば、50個の遺伝子から優秀なものを20個、残り30個は逆位・交叉・突然変異によって変化させ、再び50個から選びます。

餌のパターンもその都度変えるのか、何回かおきに変えるのかなど決めます。その他、どれとどれを交叉させるかとか、割合はどうかとかいろいろパラメータ化します。

適合度を求めるのは問題によっては容易ではありません。ただし、その問題がどうしたら最低限解決とするかパラメータ化するのは比較的簡単です。例えば今回の例では残りの餌の数でいいでしょう。これが小さいほど優秀となります。

続いて実装について考えます。行動とは{ 左回転, 右回転, 前進 }の3通りしかありません。条件判断は{ 前が壁だったら, 前が壁だったら, 前が餌だったら }と考えてみましょう。応用的では、体力がm以上n以下ならなどいろいろ考えられますが、今回は割愛します。このような条件と行動をツリー構造に落とし入れます。このツリー自体がif文となります。

次のようなツリーを考えましょう。A => { x, y }のいみは、Aならばxをする。そうでなければyをするという意味と定義します。実際、ツリーは2分木である必要はありません。今回は条件と行動のみを考え、複雑な行動は考えないものとします。

A => { x, B => { y, z } }

これはAならばxをする。そうでなく、Bならばyをする。そうでなければzをするという意味のツリーです。

このツリー構造はこのままif文となります。そしてA, Bなどは条件に相当します。演算の場合はAやBが+とか-とかの記号になります。このへんはコンパイラと同じ構文解析でもよくある表現、すなわち抽象構文木となります。頑張ればfor文や関数も実現できます。

さて、このツリーとは別に

A => { C => { w, D => { u, v } }, v }

のようなツリーがあるとします。この2つを交叉するとは、適当な部分をそれぞれランダムに選択し、それぞれを入れ替えることです。例えばA=>Bと、A=>C=>wを入れ替えたとします。

A => { x, w }
A => { C => { B => { y, z }, D => { u, v } }, v }

こうなって新たなツリーが生まれました。逆位とは、条件の結果を入れ替えることです。適当な条件を選んで、{}の中を入れ替えます。例えばA=>Cを選んだとしたら、

A => { C => { D => { u, v }, w }, v }

となります。最後に突然変異とは、ツリー中の適当な要素を適当な要素に置換することを言います。

最終的に得られた解 = ツリーを使って実際に様々なテストケースにどれだけ対応できるか確認します。こんかいの例では、様々な餌の配置(例えば1万通り)を試し、どれだけ生き残って探索できるか試します。必要であれば残りの大量も加味した条件をつけるなりして更に強化していきます。

それでは実装をしてみます。その前に基礎的な実装に関する実験を行っておきます。想定する流れは次のとおりです。

1. ツリー構造を操作するモジュールを作る。
2. ツリーの内容に従って判断するありシミュレーターを作る。
3. 2.を用いて評価する関数を作る
4. 1.3.によって評価結果から選択、交叉、逆位、突然変異によって個体を生成する関数を作る。

モジュールに必要な機能は次のとおりです。

1. ツリーのルートとなるノードを設定/取得する
2. ツリーの要素数を取得する
3. ツリーの中のノードを一意に特定する
4. ノードの中のleft, rightを取得/設定する
5. ノードの値を取得/設定する

(実はノードの中のleft, rightは別に2つに限らず、N個にしても構いません。今回は今のところ必要が無いため放置します。実際3この配列にすれば3個固定となりますし、適当なコンテナを用意すれば可変長でN個持てます。)

一番難しいのはツリーの中の要素を一意に特定することでしょう。なぜ必要かというと、ランダムに選択するためです。そして交叉や逆位、突然変異をノードのポインタを入れ替えて実装します。

今回は、ツリー構造、特に2分木です。そして条件は左右にノードを持ちます。行動はノードを持ちません。そこで、すべてのノードはleftかrightを持ち、ノードの種類を表すNODE_TYPEを持ちます。NODE_TYPEは現状の仮定では条件と行動のみです。そしてNODE_TYPEに応じてNODE_VALUEを設けましょう。データ量の関係からポインタにしておきます。

条件である場合、その条件を表すクラスへのポインタを持つこととします。今回はConditionクラスへのポインタを持つとします。条件を実行する場合はインスタンスに対してexecute()を実行することで実現します。Conditionクラスは引数を与えず初期化します。現在の体力と向き、前にあるものだけがわかっているので、これらをexecuteに渡します。TestCaseクラスを渡すことにしましょう。

行動クラス、すなわちActionクラスはexecute()を実行することで行動します。これにもTestCaseクラスを渡してその状態が変化することで行動したとみなします。

これらから、ツリーの内容に従って判断するのは容易です。蟻の1ターンは次のとおりです。(1) ツリーのルートのCnditionクラスのインスタンスを読み出します (2) NODE_TYPEが条件なら、execute(test_case)を実行します。この結果、trueならleftノードへ、falseならrightノードへ移り、NODE_TYPEが行動になるまで再帰的に繰り返します。NODE_TYPEが行動ならexecute(test_case)を実行します。1ターンが終了したら次のターンへ移り、体力がなくなるまで繰り返します。

最終的に残った餌の数で評価し、優秀な遺伝子を選択、すべての遺伝子から交叉、逆位、突然変異をパラメータに従って実行し、再び得られたツリーの内容に従って判断します。

技術的に一番難しいのがツリーの要素を(高速に)一意に特定することですが、とりあえずleftを優先して、深さ優先の全探索によりインデックスを付けることにしましょう。n番目のノードを選択するのにO(n)時間がかかります。すなわち、右端のノードを選択するのに要素数に比例して時間がかかるということです。

木を保ったまま、より効率のよい実装にしたり、よりよい乱択方法を探したりすることで高速化されることでしょう。

ところでConditionクラスに引数を与えて初期化するとはどういうことでしょう? あるいは、Actionクラスに引数を与えて初期化するとはどういうことでしょう? これは、事前の状況を記憶することを遺伝することになります。例えば何らかのフラグfがあったとします。このフラグがどのような意味を持つにせよ、new Condition(f), new Action(f)などで生成し、executeすることでそれらのフラグが変化したとすると、フラグの伝搬ができることとなります。さらに、フラグ操作だけするNODE_TYPEを作ることにより、行動だけでない状況判断や思考を実現できます。

とりあえず次回はツリー構造を表すモジュールの実装とシミュレータ、遺伝的プログラミングの実装をしてみたいと思います。

2014/04/06

ガレキ除去機の部品製作①

こんにちは、suzutoです。

予定より遅れること約半月、ようやくガレキ除去機の本体部の設計が終わりました。
部品総数は100個以上あるため、この土日はアングル、角パイプを用いた部品の切り出しだけで終わってしまいました。

 明日は板材の切り出しを行う予定です。
来週あたりからレポートが課され始めるので、できるだけ今週中に部品の製作を終わらせようと思います。

新入生の方へ

新入生の方ははじめまして、Lv_ZEROです。

「静岡大学ロボットファクトリー」と検索するとこちらのブログの方がヒットすると思います。
新入生向けのページはhttp://www51.atwiki.jp/robot_surf/pages/45.htmlに作りましたのでご覧ください。ちなみに、こちらのブログは活動の報告などを行っていますので、興味があれば、是非、ご覧ください。(とは言っても、余り更新してないですが^^;)

2014/03/26

静大TV

こんにちは、りゅーしです。

静大TVさんの方でテクノフェスタのようすがyoutubeに上がっていたので、こちらのブログの方でも紹介しておきます。





2014/03/25

ロボットグランプリ大道芸競技に参加してきました。

Lv_ZEROです。

3/22(土)に行われた、ロボットグランプリ大道芸競技に参加してきました。

第17回 ロボットグランプリ ホームページ

ロボットグランプリ大道芸競技とは、コンピュータ制御によって芸を演じるパーフォーマンスロボットを作り、演技の独創性、楽しさ、芸術性、技術性を競う大会です。
私達、静岡大学ロボットファクトリーは毎年、優勝目指し参加しています。


今年は、ピンポン玉の瞬間移動マジックとトランプ当てマジックをするロボットを作りました。

トランプ当てマジックは下図のような構造で、トランプを1枚1枚振り分け、画像認識を行い、足りないカードを割り出すというものです。

結果としては、思った通りの動作を行うことが出来ず、賞を貰うことはできませんでしたが、製作に係った1年生にとって、ものづくりのいい経験になったかと思います。

大会間近で忙しかったため、1ヶ月振りの更新となってしまいましたが、これからはまた、ちょくちょく更新していきます。

2014/02/18

ロボット胴体の製作

nkmrです
アルミフレームでロボットの胴体を作りました


胴体の中でトランプを撮影、画像処理をしてカードを特定します

今後はここに、トランプを1枚ずつめくるアーム等を取り付けていく予定です

2014/01/29

レスコン応募書類の完成

Lv_ZEROです。

昨日になりますが、レスコンへの応募書類が完成しました。今年は、去年までと異なった形になったと思いますが、実現に向け努力していきたいと思います。
しかしながら、来週から期末試験週間が始まりますので、今は試験勉強に励みたいと思います(笑)

2014/01/21

TPIPのクラス設計案

UMLのクラス図を使って描いてみました。議論の余地が大ありですがこんなこんじ。

 機体は主にUIとTPIPとコントローラーと通信をします。

機体の通信とは、他の機体を操作するコンピュータとの通信です。通信によって、他の機体の映像が見られたり、チャットができたり、他の機体の位置情報等を取得してマップに表示できたりします。

UIは画面上のボタン等の配置などで、これはLuaスクリプトを通して外部スクリプトファイルで変更可能とします。こうすることで、機体ごとに独自の画面を簡単に作成可能となります。

 TPIPはTPIPと通信するために、UDP通信オブジェクトを持ちます。また、TPIP1/2/3との互換性を持つために、抽象クラスTPIPを用意します。また、これらは音声/画像管理オブジェクトを持ち、リアルタイム画像・音声伝達を担い、処理はサブクラスに任せて実装します。(これは可能なのか?)

この図はastahというソフトを使って描きました。とても便利なソフトで、無料版は制限が多いのですが、サークルで使う分には問題がないと思うので是非使ってみて下さいね。シーケンス図も使いやすいですよ。

2014/01/17

C++Tips2 例外でエラーハンドリング

こんばんはKです。今日はC++の例外について触れたいと思います。

例外は、その状況下で処理を継続できない、あるいは継続しても意味がない状態のことをいいます。C++では例外を処理するための機構が用意されています。これはtry-catch文と呼ばれています。

2014/01/14

ガレキ除去アーム

suzutoです。

ガレキ除去機のアームの全体像が完成しました。



とりあえず形にはしました。これからは部品の強度、干渉チェックを行うと共に、本体の設計も進めていこうと思います。

2014/01/13

C#によるMemoryMappedFileを使ったアプリケーション間通信のテスト

Lv_ZEROです。

KONDOのシリアルサーボを複数動作させるプログラムを作るつもりでしたが、シリアルサーボとPC間の通信手順はどのようなプログラムになっても変わらないため、角度の制御プログラムとサーボとの通信プログラムを切り離して作ることにしました。
そこで、制御プログラムと通信プログラムの間を取り持つために共有メモリを用いることにしました。C#ではMemoryMappedFileクラスを用いることで共有メモリを簡単に実装できます。
試しにテストプログラムを作ってみました↓(左がID、右が角度のつもりです)
今回はMemoryMappedFileの説明を載せませんが、余裕のあるときにwikiに載せようかと思います。

2014/01/09

定例会1/9

Lv_ZEROです。

本日の定例会では、冬休み中に行った活動の報告とレスキューロボットコンテストについての今後の活動について話し合いました。
また、レスキューロボットコンテストに参加するための応募書類を誰がどの部分を担当するかなどを話し合って決めました。応募書類は1月31日が期日となっており、その頃は大学の方もテスト週間となってしまいますので再来週までには推敲を重ね完成させたいと思います。

C++Tips1 スマポと所有権

Tipsシリーズは言語仕様をある程度は把握した初心者のために入門書には載っていないかもしれない事柄を取り上げて実際の製作に役立つようにまとめたものです。今回はC++のTips1回目です。スマポを取り上げ、所有権の概念を身につけましょう。

スマポは、生ポインタ――通称、生ポ――よりも使う人に優しいポインタの機能を備えたクラスです。要するに、メモリ管理の一部を手伝ってくれる機能です。

プログラマは何らかのデータをメモリに確保するときに、スタックに入れるかヒープに入れるか選択できます。C++では、関数の中で変数を宣言するとスタックに確保され、newするとヒープに確保されます。スタックに確保された変数は関数が終了したときに全て開放されます。ところがnewされたデータはdeleteするまで残り続けます。使わなくなったらdeleteしなければなりません。そうでないと、他のアプリケーションの使えるメモリが減ってしまいます……。(タスクマネージャでメモリ使用量を確認してみて!)

さて、C#だとその辺をうまくやってくれます。つまり、newしてもプログラマがdeleteしないで勝手に裏でdeleteしてくれます。この勝手にやってくれる機能をガベージコレクション(GC)というのですが、C++にはGCがありません。しかし、C++には便利なライブラリ、スマポがあります。

2014/01/08

部品製作

今日は工作センターでグランプリのロボットの部品を作りしました。
明日組み立てる予定です。

KONDO KRSサーボ 動作テスト用プログラムの動作確認

Lv_ZEROです。

先日作ったKONDO KRSサーボ 動作テスト用プログラムを実際に実行し、動作確認を行いました。
エラーもなく、しっかり動作してくれました。まぁ、公式サイトのプログラムをC#に置き換えたようなものなので動いて当然っていえば当然なんですが(笑)
今回のプログラムではサーボモーター1個しか動作させることができませんので、次は複数のサーボモーターを制御できるプログラムを作ろうと思います。

2014/01/04

KONDO KRSサーボ 動作テスト用プログラム

Lv_ZEROです。

あけましておめでとうございました。良いお年になって欲しいところです(笑)

ここの所忙しく、プログラミングを行っていなかったため、ウォームアップとしてKONDOのKRSサーボを動かすプログラムを作りました。KONDOのHPを参考にC#で記述していますが、ほぼ同じ動作をするプログラムです。今後の事を考え、サーボとの接続時にはFREEコマンドを送り、現在位置を取得し、トラックバーを現在位置に動かすようにしてます。また、サーボの現在位置を逐一監視するため、一定周期ごとにサーボに位置指令を送るようにしています。

手元にKRSサーボがないため、まだ動作確認してませんが、動作確認の後、複数のサーボを同時に、さらに外部プログラムから動かせるプログラムを作ろうかと思います。