2016年2月8日月曜日

C言語でログ出力用ファイルのファイル名を自動的に更新する

C言語でログファイルを書き出す時にファイル名を自動更新するプログラム.例えばlog1.txt,log2.txt,…,logn.txtという感じで.概略を述べるとファイル名を設定し,ディレクトリを開いて同じ名前があれば数字を++して同じ名前がなければファイルを開くという流れです.

printf("\nOpen Log File\n");
FILE *fp;
char fname[512];
int n=0;
DIR *dir;
struct dirent *dp;
char dp1[512];
char path[512];
strcpy(path,".");

i=0;
while(i==0){
  if((dir=opendir(path))==NULL){
    perror("opendir");
    exit(1);
  }
  n+=1;
  //out put file name+++++++
  sprintf(fname,"log_%d.txt",n);
  for(dp=readdir(dir);dp!=NULL;dp=readdir(dir)){
    sprintf(dp1,"%s",dp->d_name);
    if(strcmp(dp1,fname)==0){//fname exists
      j=1;
    }
  }
  if(j!=1){
    i=1;
  }else{
    i=0;
  }
  j=0;
  closedir(dir);
}
if((fp=fopen(fname,"w"))==NULL){
  printf("%s\n",fname);
  perror("openfile");
  exit(1);
}
printf("\nOpened Log File\n");

2016年1月30日土曜日

gnuplotの参照データ数が多く重い場合にデータを間引く

gnuplotで参照するデータ数が多過ぎて,表示の処理が重い場合がある(行数が数万行のとき).サンプリング周波数に比べサンプルデータの周波数が十分に低い場合,データを間引いて構わないだろう.gnuplotでは指定数行ごとにプロットすることが可能である.


$ p [x1:x2][y1:y2] "./data.txt" u 1:2 ev 100 w l


「ev 100」は100行毎にデータを使用する,の意味.

2016年1月23日土曜日

起動時にプログラムを自動実行してみる

ubuntuの乗ったPCを制御器としてロボットを制御する.ディスプレイは使用しないので起動スイッチを押したら自動的にログインして自動的に目的のプログラムを実行する.

前にやったときはオートログインやオートスタートはlightdm.confやautostartに記述する必要があったが,今はUIがちゃんと用意されているみたいで.

オートログインは
システム設定 -> ユーザーアカウント -> 自動ログインタブをオン

オートスタートはここで自動起動で検索して

自動起動するアプリケーションで追加をし

コマンドの参照から自動実行したいシェルスクリプトのパスを選択し追加.

以上でubuntuを起動すれば自動でログインしてプログラムを自動で実行してくれる.簡単!

自動起動するアプリケーションの設定はターミナルから
$ gnome-session-properties
で起動することも可能.
登録した内容は
~/.config/autostart/*.desktop
を参照.

2016年1月22日金曜日

シェルスクリプトと実行権限

シェルスクリプトの書き方と実行権限
■書き方

・1行目は必ず
#!/bin/sh
と書く.おまじない.(#!以降で書かれたプログラムでスクリプトを実行するという意味らしい)

・2行目以降に実行したいプログラムを一応フルパスで記述する.
/home/username/programs_dir/a.out

・echoでターミナルに文字列を表示
echo "hogehoge"

・sleepでスリープ.
sleep 3s

など.詳しくは他のサイトを参照すること(もしかしたら今後増えるかもしれないが自分で使ったコマンドしか書きません).

■実行権限
書いたシェルスクリプトtest.shを実行する時は
./test.sh
なのだが,エラーが出る.ユーザに実行権限が無いからだ.そこで
chmod u+x test.sh
で権限を変更する.

PixhawkとPCを接続する際のボーレート

自作ドローンでよく使われるPixhawk.中身の書き換えも出来るけれども,より複雑な処理をしようとなるとPCと接続する必要が出てくる.Pixhawkに乗せるファームには主にardupilotとautopilotがあるが後者のautopilotの方が拡張性が高い.serial通信でPCと接続しよう.

大抵のことは公式に書かれているのだけれど,うまくいかなかった部分がある.

前提としてPixhawkのTELEM2とPC(Ubuntu14.04)のUSBポート接続する.もちろん要serial変換(私はマルツのMFT232RLを使用している).

問題はボーレート.TELEM2を使う場合はボーレートを921600にすると書いてあるが,これではうまくいかなかった.
そこでボーレートを57600に変更したら上手くいった,というそれだけの話.

Ubuntuを電源ボタンでシャットダウン処理

Ubuntuを乗せたPCをロボット制御に使う際,マイコンであれば電源をそのまま切れば良いけれど,PCだとそれはちょっと…電源ボタンを押しての強制終了も嫌だ…ちゃんとシャットダウンしたい.ということで電源ボタンを押してシャットダウン処理したい.Ubuntuはデフォルトで電源ボタンを押せば,シャットダウン/リブートの選択,または何もしなければ60秒後にシャットダウンしてくれる.でも,サクッとシャットダウンしたい.ということで

/etc/acpi/events/powerbtn
を編集する.内容は

event=button[ /]power
action=/etc/acpi/powerbtn.sh
となっている.2行目のactionをコメントアウトして以下に修正すればOK.

event=button[ /]power
#action=/etc/acpi/powerbtn.sh
action=shutdown -h now

あとは再起動すれば適用される.

2015年8月27日木曜日

gnuplotでy軸を2軸で表示する方法

y軸を2軸表示する方法です.細かい好みの設定込みです.
line colorは赤(1)・緑(2)にするより,赤(1)・青(3)にする方が良いです(色盲の人に配慮して).

$ set ytics nomirror
$ set y2tics
$ set xlabel "{/=30 xlable}"
$ set ylabel "{/=30 ylable}"
$ set y2label "{/=30 y2label}"
$ set logscale x
$ set xrange [x1:x2]
$ set yrange [y11:y12]
$ set y2range [y21:y22]
$ p "./file.txt" u 1:2 w linespoints lt 1 lc 1 lw 4 pt 1 ps 3 title "title", "./file.txt" u 1:3 w lp lt 1 lc 3 lw 4 pt2 ps 3 title "title2" axes x1y2

タイトルの内容で重要なのは1,2行目と最後の行の最尾です.