ただ建築が好きな走るエンジニア、

日系某メーカーを辞めて外資系に転職。資格、建築デザイン、転職と来て今はひたすらす走ってます。2020別大2:49:13。

ラズパイに6軸ジャイロ、

2020-01-13 22:45:00 | 電気
30km走を無事終えた安堵感から
2日連続のランオフ。



いい気になって肉を食べ、
閉じこもっていたら体重が。

明日ちゃんと走れば問題ない。
ジタバタして走りに行かない。

と言うより、



こっちにハマってましたね。
セッティングと動作確認までは完了。



ラズパイに6軸ジャイロセンサーです。
多分モバイルバッテリーで動くから、
ランパンの背中のポッケに入れて
走ってみようかなと。

GARMINはすごいと思うんだけど、
何やってるかブラックボックスだから。

まずは興味本位です。

やっぱりそんなことしてるんだったら、
とにかく走れって^_^;








Comment

軽薄短小、

2020-01-10 00:02:00 | 電気



昨晩は走った後のストレッチを怠ったら
夜中にふくらはぎが攣りました。

走る前も準備運動は必要だなと思います。
屈伸など簡単で十分だと思いますが。

まぁ、攣らなくても今日はランオフか、
軽いジョグと決めてましたが。

ところで写真ですが、
今日は注文していた部品が届きました。

ラズパイも随分小さくなりました。
先日のホームカメラに使ったのは
4年前に買った初期型。

値段半分以下でWiFiを後付けする
必要もないし、

色々な興味を刺激します。

もう一つの小さな基板はさて。
もう少し進んだら、また。


Comment

冬休み3日目、電子工作の日、

2019-12-29 10:53:00 | 電気
今日は電子工作の続き。

先日作ったホームカメラ(監視カメラ)を
それとなく置物風に。

カメラが入っていた箱を再利用して
ありがちなロボット風に。

子どもたちが適当にハコちゃんとか、
ガン(眼)ちゃんとか、

さらに髪の毛まで付けられて完成。
動くものを検知するとメールで
お知らせしてくれます。

オンオフもメールで。

今日は風が強かったので
ランは早々に切り上げて
帰ってきました。







(12/28)
OISO 7C
Nike Zoom Pegasus34(670km)
[J]8km 5'08/km
VO2max=60
Total:244km/month

Comment

走れないのでラズパイで遊ぶ、

2019-12-16 00:33:35 | 電気


走れないので家に引きこもり。

埃を被ったラズパイを取り出して
Pythonのコードを試してみる。

動体検知とメール送信を組み合わせて
監視カメラ。

面白いけど気味が悪いと家族に言われました。
昔、FMワイヤレスマイクを作った時と根は同じ?

長男だけ話に付き合ってくれました。
ただ、動くものの方がいいみたいです。

と言いつつ、やっぱり走りたくなって
夕食の後にキロ6分で12kmほどジョギングしてみました。

ジョグぐらいは大丈夫な感じ。
明日の体の反応を見て徐々に。

最後に備忘録のソースコードを少し。


import os
import cv2
import os.path
import datetime
import smtplib
from email import Encoders
from email.Utils import formatdate
from email.MIMEBase import MIMEBase
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
 
#Account info
ADDRESS = "xxxx@xxxx.xx"
PASSWARD = "yyyyyyyy"
 
#SMTP server
SMTP = "smtp.xxxx.xx"
PORT = 587
 
def create_message(subject, body, mime=None, attach_file=None):

    msg = MIMEMultipart()
    msg["From"] = ADDRESS
    msg["To"] = ADDRESS
    msg["Date"] = formatdate()
    msg["Subject"] = subject
    body = MIMEText(body)
    msg.attach(body)
 
    if mime != None and attach_file != None:
        attachment = MIMEBase(mime['type'],mime['subtype'])
        file = open(attach_file['path'])
        attachment.set_payload(file.read())
        file.close()
        Encoders.encode_base64(attachment)
        msg.attach(attachment)
        attachment.add_header("Content-Disposition","attachment", filename=attach_file['name'])
 
    return msg
 
def send(msg):
    smtpobj = smtplib.SMTP(SMTP, PORT)
    smtpobj.login(ADDRESS, PASSWARD)
    smtpobj.sendmail(ADDRESS, ADDRESS, msg.as_string())
    smtpobj.close()
 
def mosaic(src):
    dst = cv2.resize(src, None, fx=0.1, fy=0.1, interpolation=cv2.INTER_NEAREST)
    return cv2.resize(dst, src.shape[:2][::-1], interpolation=cv2.INTER_NEAREST)
 
def difference(a, b):
    if(a < b):
        return b - a
    return a - b
 
def detect(frame):
    print('Motion Detected')
    cv2.imwrite('capture.jpg', frame)
    subject = "Motion Detected!!"
    body = "Motion Detected."
    mime={'type':'text', 'subtype':'comma-separated-values'}
    attach_file={'name':'capture.jpg', 'path':'./capture.jpg'}
    msg = create_message(subject, body, mime, attach_file)
    send(msg)
 
def cnt(src, keep):
    os.system('clear')
    count = 0
    for y in range(0, 24):
        for x in range(0, 32):
            target = src[y*10][x*10]    
            diff = difference(keep[y][x],target)
            if diff > 50:
                count += 1
            keep[y][x] = target
    return count
 
cap = cv2.VideoCapture(0)
cap.set(3,320) # WIDTH
cap.set(4,240) # HEIGHT
cap.set(5,30) # FPS
keep = [[0] * 32 for i in range(24)]
busy = True
count2 = 1900
while(True):
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
    mos = mosaic(gray)
    count = cnt(gray, keep)
    print('{0} {1}'.format(count,busy))
    if busy and count==0:
        busy = False
    if busy == False and count > 5:
        if count2 > 1800:
            busy = True
            detect(frame)
            count2 = 0
        else:
            count2 += 1
cap.release()
cv2.destroyAllWindows()


Comment

食洗機壊れる

2015-10-04 12:20:53 | 電気


最近、いろいろなものが壊れます。

 (壊れた順、ここ1年くらい)
 キッチンの水栓       13年・交換・5万円ぐらい
 リビングのソファ      15年・応急処置
 ヘルシオ           6年・粗大ゴミ
 トイレの止水栓       13年・修理・7千円くらい
 掃除機           20年・買い替え・1.6万円
 自動車のサイドエアバッグ   5年・交換・10万円くらい
 ...

そして一昨日、仕事中に妻から「食洗機が壊れたかも」と。

これも家を買ったときにキッチンにビルドインされていたものだから13年。
試しに動かすとしばらくしてエラー音と点滅、どうやら漏水らしい...

ウェブで見ると交換は15万円くらい。
先々月、サイドエアバッグで10万円取られたばかり。先日もトイレが壊れたし...

どうやらモードとしては、

 1)食器無理やりで上蓋閉まらず漏れた水がパンに溜まりセンサー反応
 2)ホースやパッキン系
 3)ポンプやヒーター系

3)だとお手上げ、修理で数万円、でもすぐにまた壊れそう。買い替えか?
2)はウェブにトライ例が多数。部品だけだと2160円。作業数時間。
  修理頼むと2万円くらい。
1)だと機械引き抜いてパンの水を抜くだけ。
  だけど修理を呼ぶと2)と同じコースに。

とりあえずウェブを見ながら分解してみました。漏電と漏水注意。
パンにすごい水が溜まってる。
上蓋の機構はこんなんだったんですね。これは無理して食器入れたらダダ漏れです。

とりあえず水を抜いて試運転。更なる水漏れはないようです。

今回は1)だけでおしまい。もう無理に食器は入れません。
12年の劣化は否めないのでじきに買い替えでしょうね。

住宅って設備が意外とやっかい。
10年経てばすっかり古びてしまう。
次は何が来るのかと思うと嫌になります。


Comment

とりあえずWin10

2015-07-31 01:34:08 | 電気


やっぱり、ちょっとやさしくないんだよなぁ~
Comment

MVNO

2015-04-11 12:16:21 | 電気

auからmineoにMNPしました。

auとは17年ちょっとのお付き合いだったようですが。

 

ここ2年ほどauの3Gスマホを使っていましたが、

auの3Gに対応するMVNOは存在しないので、

2月に先ずLTE、キャンペーンで一括でも割と安い機種へ

(acroHD→Z Ultra、これがバカでかい)。

そして2年縛りの切れた4月にMNPしました。

 

夫婦そろって2年間収支で約9万円のプラスのはず。

(単にauだったら9万円無駄遣いだったのを止めただけの話かも)

 

最初、MNPの手続き開始で少し戸惑いました。

結局スマホではwebからの手続きはできない?

(ezwebから何とかって書いてあるけど、多分これはガラケーの話?)

 

結局電話でMNP予約番号取得、約11分。

Q.移行先はどちらですか? A.決まってないです。

Q.日割りにならないので月末に再度でいかがですか? A.えっ?いやいいです。

Q.ポイントは、あっ使い切っていますね。 A.ええ。

Q.MNPと新規手数料で5400円ほどご負担が、 A.ええ、承知してます。

Q.機種残額は一括と分割どちらで? A.分割のままでお願いします(結局払う額は同じだから)。

・・・

こんな感じで淡々と。

 

即mineo申し込み、2日後にSim到着。

でもMNP完了手続きに必要な契約内容通知書は翌日別送で到着。

1週間ほどその書類を放置したままで、ようやく本日MNP完了。

スマホはそのままなのでまず電源切ってSim Card差し替え。

PCでMNP手続、約30分待機。

そのあと徐にスマホ電源ON、ネットなどの設定してお終い(約15分)。

 

おさいふケータイ(EdyとSuicaを使っている)は何か手続いるのかなと思ってたけど、

結局肝心の切り替え時に忘れてて切り替え完了後にあわてて確認したけど

別に何も支障ないみたいです(よかったぁ~)。

 

今のところ快適です(家ではWiFiなので)。

 

 

Comment

地球儀上でISS(国際宇宙ステーション)の位置を表示するプログラム(その6)

2014-09-09 00:04:31 | 電気

地球儀上でISS(国際宇宙ステーション)の位置を表示するプログラム(その6)


        public Bitmap sphere(int[] xll, int[] yl, double[] hsa, int iff)//平面→球面投影
        {
            Bitmap canvas1 = new Bitmap(bmp3);
            Bitmap canvas2 = new Bitmap(h, h);
            int xt, yt, kk;
            double sx, sy, ll;
            int rl = 4;
            Graphics g = Graphics.FromImage(canvas2);
            Color c;
            Pen p = new Pen(Color.FromArgb(128, Color.Red), 1);
            kk = (int)((double)keido / 360 * w);
            for (int i = 0; i < h - 1; i++)
            {
                for (int j = 0; j < h - 1; j++)
                {
                    if (x[j, i] >= 0 && x[j, i] <= h)
                    {
                        xt = x[j, i] + kk;
                        if (xt >= w)
                            xt -= w;
                        c = canvas1.GetPixel(xt, y[i]);
                    }
                    else
                    {
                        c = Color.Black;
                    }
                    int p2x = (int)(h2 + ((j - h2) * expandSize));
                    int p2y = (int)(h2 + ((i - h2) * expandSize));
                    canvas2.SetPixel(p2x, p2y, c);
                }
            }
            for (int i = 0; i < iff + 1; i++)//軌道描画
            {
                sy = ((double)yl[i] - h2) / (double)h * Math.PI;
                yt = (int)(h2 * (Math.Sin(sy) * expandSize * hsa[i] + 1));
                ll = h * Math.Cos(sy);
                if (((0 < kk && kk < w2) && (kk < xll[i] && xll[i] < kk + w2)) ||
                ((w2 <= kk) && (kk < xll[i] || xll[i] < kk - w2)))
                {
                    double xtl = xll[i] - kk;
                    sx = (xtl - h2) / (double)h * Math.PI;
                    xt = (int)(ll / 2 * Math.Sin(sx) * expandSize * hsa[i] + h2);
                    if (i == iff)
                    {
                        p = new Pen(Color.FromArgb(255, Color.AntiqueWhite), 2);
                        rl = 6;
                    }
                    g.DrawEllipse(p, xt - rl / 2, yt - rl / 2, rl, rl);
                }
            }
            g.Dispose();
            return canvas2;
        }
        //地球を回すマウスステータス
        private void pictureBox9_MouseDown_1(object sender, MouseEventArgs e)
        {
            mb2 = true;
        }
        private void pictureBox9_MouseUp_1(object sender, MouseEventArgs e)
        {
            mb = false;
            mb2 = false;
        }
        //Formの移動
        private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
            {
                mMousePoint = new Point(e.X, e.Y);
            }
        }
        private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
            {
                this.Left += e.X - mMousePoint.X;
                this.Top += e.Y - mMousePoint.Y;
            }
        }
        //FormをTop固定
        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            if (this.TopMost == false)
                this.TopMost = true;
            else
                this.TopMost = false;
        }
        //終了
        private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}


1記事あたり20000文字制限があるなんて知らなかった。

ブログってこういうソース記録には向いてないのかな。

自分でサーバーを起こした方がいいのかも知れない。

 

 

Comment

地球儀上でISS(国際宇宙ステーション)の位置を表示するプログラム(その5)

2014-09-08 23:59:51 | 電気

地球儀上でISS(国際宇宙ステーション)の位置を表示するプログラム(その5)


        public double tjdCalc(Dtime a)                  //Tjdの計算
        {
            int jm = a.Month;
            int jy = a.Year;
            if (a.Month < 3)
            {
                jy = a.Year - 1;
                jm += 12;
            }
            double jd = (int)(365.25 * jy) + (int)(jy / 400) - (int)(jy / 100)
                + (int)(30.59 * (jm - 2)) + a.Day + 1721088.5
                + (double)a.Hour / 24 + (double)a.Minute / 1440 + (double)a.Second / 86400;
            double tjd = jd - 2440000.5;
            return tjd;
        }
        private void orbital_sphere()                   //平面地図に軌道を表示する
        {
            keido = keido - 1;
            xl = mx;
            if (mb2 == true)
            {
                mx = System.Windows.Forms.Cursor.Position.X;
                if (mb == false)
                {
                    xl = mx;
                    mb = true;
                }
            }
            int dx = xl - mx;
            if (Math.Abs(dx) > 360)
                dx = 0;
            keido = keido + dx;
            if (keido >= 360)
                keido -= 360;
            if (keido < 0)
                keido += 360;
            int rkeido = keido - 90;
            if (rkeido > 180)
                rkeido -= 360;
            string rkeidoDirection = "E";
            if (rkeido < 0)
            {
                rkeidoDirection = "W";
                rkeido *= -1;
            }
            this.label2.Text = rkeido.ToString() + rkeidoDirection;

            DateTime pDateJ = DateTime.Now;             //現地日時表示
            this.label1.Text = pDateJ.ToString();
            
            DateTime crnt1 = DateTime.UtcNow;           //現在日時をTJDへ
            Dtime crnt2;
            crnt2.Year = crnt1.Year;
            crnt2.Month = crnt1.Month;
            crnt2.Day = crnt1.Day;
            crnt2.Hour = crnt1.Hour;
            crnt2.Minute = crnt1.Minute;
            crnt2.Second = crnt1.Second;
            double tjdCurrent = tjdCalc(crnt2);
            
            Bitmap canvas = new Bitmap(bmp3);           //軌道計算
            Graphics g = Graphics.FromImage(canvas);
            Pen p = new Pen(Color.FromArgb(128, Color.Red), 1);
            Font fnt = new Font("MS UI Gothic"9);
            int iff = 120;
            int[] xll = new int[iff + 1];
            int[] yl = new int[iff + 1];
            double[] hsa = new double[iff + 1];
            for (int i = 0; i < iff + 1; i++)
            {
                                                        //グリニッジ平均恒星時計算
                double tg = 24 * (0.671262 + 1.0027379094 * (tjdCurrent + (double)(iff - i) / 60 / 24));
                tg = tg % 24;
                double tl = tg + keido / 15;
                if (tl > 24)
                    tl -= 24;
                                                        //真近点離角計算
                double fai = ((tjdCurrent + (double)(iff - i) / 60 / 24 - t1.tjdep)
                    * t1.mm * 2 * Math.PI + t1.mk / 180 * Math.PI) % (Math.PI * 2);
                double eec = fai + t1.ec * Math.Sin(fai);
                double ek, de;
                do
                {
                    ek = fai + t1.ec * Math.Sin(eec);
                    de = Math.Abs(eec - ek);
                    eec = ek;
                }
                while (de > 0.000000000001);
                double tanvk = Math.Sqrt(1 - t1.ec * t1.ec) * Math.Sin(ek) / (Math.Cos(ek) - t1.ec);
                double vk = Math.Atan(tanvk);
                double vkj = Math.Cos(ek) - t1.ec;
                if (vkj < 0)
                    vk = vk + Math.PI;
                                                        //軌道位置計算
                double tt = 24 * 3600 / t1.mm;          //公転周期
                double ar = (6.67384E-11 * 5.972E+24 * tt * tt / 4 / Math.PI / Math.PI);
                ar = Math.Pow(ar, (double)1 / (double)3);       //軌道長半径
                double rk = ar * (1 - t1.ec * Math.Cos(ek));
                double xk = rk * Math.Cos(vk);
                double yk = rk * Math.Sin(vk);
                                                        //地心赤道直交座標変換
                double xs = xk * t1.sx1 - yk * t1.sx2;
                double ys = xk * t1.sy1 - yk * t1.sy2;
                double zs = xk * t1.sz1 + yk * t1.sz2;
                                                        //G系地心直交座標変換
                tg = tg / 24 * 2 * Math.PI;
                double xg = xs * Math.Cos(tg) + ys * Math.Sin(tg);
                double yg = ys * Math.Cos(tg) - xs * Math.Sin(tg);
                double zg = zs;
                                                        //G系地心直交座標から経度・緯度及び楕円体高変換
                double skeido = Math.Atan(yg / xg);
                if (xg < 0)
                    skeido = skeido + Math.PI;
                string LongitudeDirection = "E";
                double skeidox = skeido;
                if (skeido > Math.PI)
                {
                    skeido = 2 * Math.PI - skeido;
                    skeidox = -skeido;
                    LongitudeDirection = "W";
                }
                if (skeido < 0)
                {
                    skeidox = skeido;
                    skeido *= -1;
                    LongitudeDirection = "W";
                }
                double pg = Math.Sqrt(xg * xg + yg * yg);
                double sido0 = Math.Atan(zg / pg);
                double ds, sido, n;
                double ag = 6377397.155;
                double e2 = 0.006674372230614;
                do
                {
                    n = ag / Math.Sqrt(1 - e2 * e2 * Math.Sin(sido0) * Math.Sin(sido0));
                    sido = Math.Atan(zg / (pg - e2 * e2 * n * Math.Cos(sido0)));
                    ds = sido - sido0;
                    sido0 = sido;
                }
                while (ds > 0.000000000001);
                string LatitudeDirection = "N";
                double sidoy = sido;
                if (sido < 0)
                {
                    LatitudeDirection = "S";
                    sido *= -1;
                }
                double hs = pg / Math.Cos(sido);
                skeido = skeido / Math.PI * 180;
                sido = sido / Math.PI * 180;
                                                        //表示する
                xll[i] = (int)((double)canvas.Width / 2 * (1 + skeidox / Math.PI));
                yl[i] = (int)((double)canvas.Height / 2 * (1 - 2 * sidoy / Math.PI));
                hsa[i] = hs / n;
                hs -= n;
                hs /= 1000;
                int rl = 4;
                if (i == iff)
                {
                    p = new Pen(Color.FromArgb(255, Color.AntiqueWhite), 2);
                    rl = 6;
                    int cxl = xll[i];
                    int cyl = yl[i];
                    if (cxl > h + h - 180)
                        cxl = h + h - 180;
                    g.DrawString("LAT=" + sido.ToString("###") + LatitudeDirection
                        + ",LON=" + skeido.ToString("###") + LongitudeDirection
                        + ",ALT=" + hs.ToString("###KM"), fnt, Brushes.Coral, cxl, cyl + 5);
                }
                g.DrawEllipse(p, xll[i] - rl / 2, yl[i] - rl / 2, rl, rl);
            }
            fnt.Dispose();
            g.Dispose();
            this.pictureBox7.Image = canvas;
            Bitmap sphereBmp = new Bitmap(h, h);
            sphereBmp = sphere(xll, yl, hsa, iff);
            this.pictureBox9.Image = sphereBmp;
        }


次の記事へ続く。


Comment

地球儀上でISS(国際宇宙ステーション)の位置を表示するプログラム(その4)

2014-09-08 23:57:16 | 電気

地球儀上でISS(国際宇宙ステーション)の位置を表示するプログラム(その4)


        public void marble()                            //昼夜混合画像変換
        {
            //
            //
            //System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            //sw.Start();
            //
            //
            DateTime pDate = DateTime.Now;              //現在日時と季節判定
            double sDay = pDate.DayOfYear;
            double pSeason = (sDay / 365.25 - 0.72) * 2 * Math.PI;
            if (pSeason < 0)
                pSeason = pSeason + 2 * Math.PI;
            double aSeason = Math.Tan((90 - 23.4 * Math.Sin(pSeason)) / 180 * Math.PI);
            int sHur = pDate.Hour;
            int pUTC = 9;
            if (sHur < pUTC)
                sHur = sHur - pUTC;
            else
                sHur = sHur + (24 - pUTC);
            double sTime = (double)(sHur * 3600 + pDate.Minute * 60 + pDate.Second) / 24 / 3600 * 360;

            Bitmap canvas3 = new Bitmap(w, h);          //画像セット
            
            int[] yDay = new int[w - 1];                //明暗境界線計算
            for (int j = 0; j < w - 1; j++)
            {
                double yDayD = Math.Atan(aSeason * Math.Cos(((double)j
                    / (double)w * 360 + sTime - 180) / 180 * Math.PI))
                    / Math.PI * h + h2;
                yDay[j] = (int)yDayD;
            }
            Color c, c1, c2;                            //昼夜計算
            byte cR, cG, cB, cA;
            int jkk, ikk;
            int[,] DorN = new int[w, h];
            int Dsum;
            int Eve = w / 48;
            int Eve2 = (Eve + 1) * (Eve + 1);
            for (int j = 0; j < w - 1; j++)
            {
                for (int i = 0; i < h - 1; i++)
                {
                    if (pSeason < Math.PI)
                    {
                        if (i > yDay[j])
                        {
                            DorN[j, i] = 1;
                        }
                        else
                        {
                            DorN[j, i] = 0;
                        }
                    }
                    else
                    {
                        if (i > yDay[j])
                        {
                            DorN[j, i] = 0;
                        }
                        else
                        {
                            DorN[j, i] = 1;
                        }
                    }
                }
            }
            for (int j = 0; j < w - 1; j++)             //グラデーション生成
            {
                for (int i = 0; i < h - 1; i++)
                {
                    Dsum = 0;
                    for (int jk = 0; jk < Eve; jk++)
                    {
                        for (int ik = 0; ik < Eve; ik++)
                        {
                            jkk = j + jk + jk + jk + jk - Eve - Eve;
                            if (jkk < 0)
                                jkk += w;
                            else if (jkk > w - 1)
                                jkk -= w;
                            ikk = i + ik + ik + ik + ik - Eve - Eve;
                            if (ikk < 0)
                            {
                                ikk = -ikk;
                                jkk += w2;
                            }
                            else if (ikk > h - 1)
                            {
                                ikk = 2 * h - 2 - ikk;
                                jkk += w2;
                            }
                            if (jkk > w - 1)
                            {
                                jkk -= w;
                            }
                            Dsum += DorN[jkk, ikk];
                        }
                    }
                    c1 = bmp1.GetPixel(j, i);
                    c2 = bmp2.GetPixel(j, i);
                    double a2 = (double)Dsum / Eve2;
                    double a1 = 1 - a2;
                    cR = (byte)((double)c2.R * a1 + (double)c1.R * a2);
                    cG = (byte)((double)c2.G * a1 + (double)c1.G * a2);
                    cB = (byte)((double)c2.B * a1 + (double)c1.B * a2);
                    cA = (byte)((double)c2.A * a1 + (double)c1.A * a2);
                    c = Color.FromArgb(cA, cR, cG, cB);
                    bmp3.SetPixel(j, i, c);
                }
            }
            //
            //
            //sw.Stop();
            //MessageBox.Show(sw.Elapsed.ToString());
            //
            //
        }


次の記事へ続く。


Comment

地球儀上でISS(国際宇宙ステーション)の位置を表示するプログラム(その3)

2014-09-08 23:53:29 | 電気

地球儀上でISS(国際宇宙ステーション)の位置を表示するプログラム(その3)


         public Image resizeImage(Image jpg, int resizeHeight)      //画像サイズ変換
        {
            int resizeWidth = (int)(jpg.Width * ((double)resizeHeight / (double)jpg.Height));
            Bitmap resizeBmp = new Bitmap(resizeWidth, resizeHeight);
            Graphics g = Graphics.FromImage(resizeBmp);
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            g.DrawImage(jpg, 00, resizeWidth, resizeHeight);
            g.Dispose();
            return resizeBmp;
        }
        public int[] matY(int imageHeight)              //平面→球面投影座標変換Y配列
        {
            int[] ymat = new int[imageHeight - 1];

            for (int i = 0; i < imageHeight - 1; i++)
            {
                ymat[i] = (int)((double)imageHeight / Math.PI * Math.Acos(1 - 2 * i / (double)imageHeight));
            }
            return ymat;
        }
        public int[,] matX(int[] ymat, int iH)          //平面→球面投影座標変換X配列
        {
            int[,] xmat = new int[iH - 1, iH - 1];
            double f;
            for (int i = 0; i < iH - 1; i++)
            {
                for (int j = 0; j < iH - 1; j++)
                {
                    xmat[j, i] = iH + 1;
                    double ch = (double)(Math.Sqrt((i - iH / 2) * (i - iH / 2) + (j - iH / 2) * (j - iH / 2)));
                    if (ch < iH / 2)
                    {
                        f = (1 - 2 * (double)j / (double)iH) / Math.Sin((double)ymat[i] * Math.PI / (double)iH);
                        if (f > 0.99)
                            f = 0.99;
                        if (f < -1)
                            f = -1;
                        xmat[j, i] = (int)((double)iH / Math.PI * Math.Acos(f));
                    }
                }
            }
            return xmat;
        }


 次の記事へ続く。

 

Comment

地球儀上でISS(国際宇宙ステーション)の位置を表示するプログラム(その2)

2014-09-08 23:51:09 | 電気

地球儀上でISS(国際宇宙ステーション)の位置を表示するプログラム(その2)


        private void timer3_Tick(object sender, EventArgs e)    //昼夜再描画タイマー
        {
            marble();
        }
        private void timer4_Tick(object sender, EventArgs e)    //地球回転再描画タイマー
        {
            orbital_sphere();
        }
        private Bitmap makeBmp_desktop(string filename)         //ビットマップ読み込み&サイズ変換
        {
            Bitmap bmp = new Bitmap(h + h, h);
            System.Drawing.Image jpg;
            try
            {
                jpg = System.Drawing.Bitmap.FromFile(filename);
                jpg = resizeImage(jpg, h);
                bmp = new Bitmap(jpg);
                bmpGetTry = true;
            }
            catch (System.IO.FileNotFoundException)
            {
                string eMsg = "File not found";
                this.label2.Text = eMsg;
                bmpGetTry = false;
            }
            return bmp;
        }
        private Bitmap makeBmp(string url, string filename)         //ビットマップ読み込み&サイズ変換
        {
            Bitmap bmp = new Bitmap(h + h, h);
            WebClient wc = new WebClient();
            System.Drawing.Image jpg;
            Stream st2 = wc.OpenRead(url);
            jpg = new Bitmap(st2);
            jpg.Save(filename);
            jpg = resizeImage(jpg, h);
            bmp = new Bitmap(jpg);
            st2.Close();
            return bmp;
        }
        private double telDate()                        //TLE形式シリアル日時計算
        {
            DateTime pDate = DateTime.UtcNow;
            double cuday2 = pDate.DayOfYear;
            cuday2 = cuday2 + (double)(pDate.Hour * 3600 + pDate.Minute * 60 + pDate.Second) / 24 / 3600;
            double cu = (pDate.Year - 2000) * 1000 + cuday2;
            return cu;
        }
        private TLEdata ISStle(string url)              //TLEデータ読み込み
        {
            double cu = telDate();                      //現在日時設定
            WebClient wc = new WebClient();             //webからTLE読み込み・抽出
            TLEdata t;
            t = new TLEdata();
            try
            {
                Stream st = wc.OpenRead(url);
                StreamReader sr = new StreamReader(st, Encoding.GetEncoding("Shift_JIS"));
                Boolean readstatus = false;
                while (readstatus == false)
                {
                    string cText0 = sr.ReadLine();
                    if (cText0 == null)
                        readstatus = true;
                    if (cText0.Length == 7)
                    {
                        string wordPick = cText0.Substring(43);
                        if (wordPick == "ISS")
                        {
                            string cText1 = sr.ReadLine();
                            string cText2 = sr.ReadLine();
                            double ep = double.Parse(cText1.Substring(2214));
                            double incc = double.Parse(cText2.Substring(128));
                            double ra = double.Parse(cText2.Substring(218));
                            t.ec = double.Parse(cText2.Substring(307)) / 10000000;
                            double ap = double.Parse(cText2.Substring(388));
                            t.mk = double.Parse(cText2.Substring(478));
                            t.mm = double.Parse(cText2.Substring(5611));
                            if (ep > cu - 1)
                                readstatus = true;
                            incc = incc / 180 * Math.PI;
                            ra = ra / 180 * Math.PI;
                            ap = ap / 180 * Math.PI;
                                                        //JD translation for Epoch
                            Dtime epc;
                            int[] mday = { 0312831303130313130313031 };
                            epc.Year = (int)(ep / 1000) + 2000;
                            double epday2 = ep - (epc.Year - 2000) * 1000;
                            int rep = epc.Year % 4;
                            if (rep == 0)
                                mday[2] = 29;
                            epc.Month = 0;
                            epc.Day = 0;
                            int i = 0;
                            while (epday2 > 0)
                            {
                                epc.Month++;
                                epc.Day = (int)epday2;
                                epday2 = epday2 - mday[++i];
                            }
                            epday2 = epday2 + mday[i];
                            epc.Hour = (int)((epday2 - (int)epday2) * 24);
                            epc.Minute = (int)((epday2 - (int)epday2 - (double)epc.Hour / 24) * 24 * 60);
                            epc.Second = (int)((epday2 - (int)epday2 - (double)epc.Hour / 24
                                - (double)epc.Minute / 24 / 60) * 24 * 60 * 60);
                            t.tjdep = tjdCalc(epc);
                                                        //地心赤道直交座標変換用係数
                            t.sx1 = Math.Cos(ra) * Math.Cos(ap) - Math.Sin(ra) * Math.Cos(incc) * Math.Sin(ap);
                            t.sx2 = Math.Cos(ra) * Math.Sin(ap) + Math.Sin(ra) * Math.Cos(incc) * Math.Cos(ap);
                            t.sy1 = Math.Sin(ra) * Math.Cos(ap) + Math.Cos(ra) * Math.Cos(incc) * Math.Sin(ap);
                            t.sy2 = Math.Sin(ra) * Math.Sin(ap) - Math.Cos(ra) * Math.Cos(incc) * Math.Cos(ap);
                            t.sz1 = Math.Sin(incc) * Math.Sin(ap);
                            t.sz2 = Math.Sin(incc) * Math.Cos(ap);
                        }
                    }
                }
                sr.Close();
                st.Close();
            }
            catch (System.IO.FileNotFoundException)
            {
                string eMsg = "File not found";
                this.label2.Text = eMsg;
            }
            return t;
        }


次の記事へ続く。

 

Comment

地球儀上でISS(国際宇宙ステーション)の位置を表示するプログラム(その1)

2014-09-08 23:47:18 | 電気

地球儀上でISS(国際宇宙ステーション)の位置を表示するプログラム(その1)

ソースの備忘録です。


using System;                                           //My sphere with ISS orbital 2014/09/05
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Threading;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private int xl, mx;                             //マウス移動量
        private Boolean mb = false;                     //マウス状態
        private Boolean mb2 = false;                    //マウス状態
        private Boolean bmpGetTry = true;               //画像有無ステータス
        private Point mMousePoint;                      //マウス座標
        private double expandSize = 0.9;                //球体拡大率
        private int keido = 135;                        //経度初期値(日本)
        private const int h = 500;                      //画像縦サイズ
        private const int h2 = h / 2;
        private const int w = 2 * h;
        private const int w2 = h;
        private Bitmap bmp1 = new Bitmap(h + h, h);     //昼画像
        private Bitmap bmp2 = new Bitmap(h + h, h);     //夜画像
        private Bitmap bmp3 = new Bitmap(h + h, h);     //昼夜ミックス
        private int[] y = new int[h];                   //平面→球面変換配列Y
        private int[,] x = new int[h, h];               //平面→球面変換配列X
        public struct Dtime                             //Datetime同等構造体
        {
            public int Year;
            public int Month;
            public int Day;
            public int Hour;
            public int Minute;
            public int Second;
        }
        public class TLEdata                            //2行フォーマット
        {
            public double ec;                           //離心率(Eccentricity)
            public double mk;                           //平均近点角(Mean anomaly)
            public double mm;                           //平均運動(Mean motion)
            public double sx1;
            public double sx2;
            public double sy1;
            public double sy2;
            public double sz1;
            public double sz2;
            public double tjdep;                        //元期(Epoch)
        }
        private TLEdata t1;                             //ISSのTLEデータ派生クラス

        public Form1()
        {
            InitializeComponent();
            this.MouseDown += new MouseEventHandler(Form1_MouseDown);
            this.MouseMove += new MouseEventHandler(Form1_MouseMove);
            orbital_main();
        }
        private void orbital_main()
        {
                                                        //TLE読み込み(下記NASA URLから1日以内前のTLEを抽出する)
            string tle = "http://spaceflight.nasa.gov/realdata/sightings/SSapplications/Post/JavaSSOP/orbit/ISS/SVPOST.html";
            t1 = ISStle(tle);

            string loadurlname;
            string loadfilename = @"earth_noon.jpg";    //昼画像読み込み(from Desktop)
            bmp1 = makeBmp_desktop(loadfilename);
            if (bmpGetTry == false)
            {
                loadurlname                            //(from NASA;Desktopになかった場合)
                    = "http://eoimages.gsfc.nasa.gov/images/imagerecords/73000/73801/world.topo.bathy.200409.3x5400x2700.jpg";
                bmp1 = makeBmp(loadurlname, loadfilename);
            }
            loadfilename = @"earth_night.jpg";          //夜画像読み込み(from Desktop)
            bmp2 = makeBmp_desktop(loadfilename);
            if (bmpGetTry == false)
            {
                loadurlname                            //(from NASA;Desktopになかった場合)
                    = "http://eoimages.gsfc.nasa.gov/images/imagerecords/55000/55167/earth_lights_lrg.jpg";
                bmp2 = makeBmp(loadurlname, loadfilename);
            }
            y = matY(h);                                //平面→球面投影配列準備
            x = matX(y, h);
            marble();
            //タイマーセット
            timer3.Interval = 600000;                    //昼夜画像書き換え
            timer3.Start();
            timer4.Interval = 100;                      //地球回転
            timer4.Start();
        }


次の記事に続く。

Comment

ISS(国際宇宙ステーション)

2014-09-03 00:55:49 | 電気



どうしてもここまではやっておきたかった。

先日作った地球儀アプリに国際宇宙ステーション(ISS)の
現在位置表示を追加しました。

人工衛星の軌道要素は下記から直接読み込みます。

http://spaceflight.nasa.gov/realdata/sightings/SSapplications/Post/JavaSSOP/orbit/ISS/SVPOST.html

2行フォーマット(TLE)と呼ばれるもので、
これだけで大よその位置を計算することができます。

大よそと言うのは、人工衛星は頻繁に軌道修正を
行う場合もあるので。

あと計算は空気抵抗による減速項などは入れていないので、
TLEの元期1日以内でも1°程度の誤差は生じる様です。
(1°って100km近いですからね。上空400kmを飛ぶISSを
きっちり見るためには微妙な誤差です)

さすがに処理が重くなったので言語をVBからC#に切り替えました。
これだけで同じ処理が5~10倍速くなるから大したものです。
(ソースもそのうち整理して残そうと思います)

ということですっきりしたので、明日は製図の直しをします。
(先日の最終課題で立面図の間違いに気付き、少しショックです)

製図の試験終わったら秋の夜空にISSを探します。

 

ソースは次の記事で。


 


 

Comment

ロボット計画

2014-08-18 22:00:02 | 電気
私の夏休みは終わりました。
9連休もしてしまったので、
今日はぼんやり頭で会社に行ってきました。。。

日が暮れるのが早くなりました。
久しぶりに歩く川べりは涼しい風が吹いて
秋の気配です(暑いのは残暑という感じ)。



製図試験が終わって秋の夜長を迎えたら
子どもとロボットを作ろうと思っています。

その前段取りとして
先日準備したRaspberry Piのセッティングを
徐々に進めています。



最初はテレビに繋いで作業していましたが、
やはりテレビ見ながらの作業は辛く、
リモコンも没収されたままなので、

Raspberry PiをVaioで遠隔操作できるように
しました。

家庭内LANに繋がるのでVNCを入れてこんな
感じです。
(入力は良くなったけど、表示とレスポンスが今一)

先日のOpenCVプログラミングの発展でWebCamによる
画像認識とGPIOによるモーター制御で
何かできないかなと。

でもとりあえず夏休みは終わったんで、
製図に戻ります。

Comment