SPRESENSEのNuttX上でuClibc++を使用したC++アプリケーションを動かす

SPRESENSEのNuttX上でuClibc++を使用したC++アプリケーションを動かす

概要

nuttx/libxx の中に基本的なC++の機能を提供するためのライブラリは付属していますが,STLがカバーしている iostreamvector 等の機能を利用したプログラムは,そのままではコンパイルできません. この記事では,軽量なSTL互換ライブラリであるuClibc++をSPRESENSEのNuttXに組み込み,C++の標準ライブラリを利用できるようにする方法を紹介します.

バージョン等

  • SPRESENSE SDK v1.0.1
  • NuttX: git(33597a8)

Read More

Share Comments

SPRESENSE SDKをArch Linuxにセットアップする

SPRESENSE SDKをArch Linuxにセットアップする

概要

Arch Linuxは推奨のUbuntuとは異なりローリング・リリースを採用しているため,想定環境とのバージョンの不一致によって若干手順が異なります.

基本手順

セットアップの基本的な手順はここにしたがいます. apt-get 等は適宜読み替えて pacman 等でパッケージをインストールします.

Spresense SDK チュートリアル - Spresense - Sony Developer World

異なるポイント・失敗したポイント

kconfig-frontendsのビルドの段階で,以下のようなエラーが出ます.

In file included from yconf.c:234:
hconf.gperf:141:1: error: conflicting types for 'kconf_id_lookup'
hconf.gperf:12:31: note: previous declaration of 'kconf_id_lookup' was here
static const struct kconf_id *kconf_id_lookup(register const char *str, register unsigned int len);
^~~~~~~~~~~~~~~
make[3]: *** [Makefile:456: libkconfig_parser_la-yconf.lo] Error 1
make[2]: *** [Makefile:350: all] Error 2
make[1]: *** [Makefile:334: all-recursive] Error 1
make: *** [Makefile:385: all-recursive] Error 1

これはESP32向けNuttXにおいてすでに確認されている現象です.

こちらにしたがって, libs/parser/hconf.c の163行目を以下のように変更します.

-kconf_id_lookup (register const char *str, register size_t len)
+kconf_id_lookup (register const char *str, register unsigned int len)

その他

バージョンアップ等で変更点があれば更新していきます.

Share Comments

SPRESENSE SDKでArduinoを使わずにとりあえずLチカする

SPRESENSE SDKでArduinoを使わずにとりあえずLチカする

概要

Arduino IDEとかいうぬるま湯に浸かりたくない人や,SPRESENSE SDKを使って自作のアプリケーションをCやC++で書いてみたい人向けの記事です. Arduino信者はお帰りください.

今回は,最も基本的な例としてLチカとシェルへの文字列の出力を扱います.

この記事では,SDKのインストールができているという前提で進めます.
参考→ SPRESENSE SDKをArch Linuxにセットアップする

Read More

Share Comments

ハフ変換で求めた2直線の交点

ハフ変換で求めた2直線の交点

概要

画像の中の直線を検出する古典的な方法として,ハフ変換が有名です. ハフ空間上の点は直線の式に相当するものになります.

たとえば,上のような写真の中から四角形の物体の頂点を取り出したい場合,ハフ空間上の点から求めた直線の式を連立して,直線どうしの交点を求める必要があります. とても簡単なことなのですが,巷の記事ではわざわざ $y=ax+b$ の形に直してから解いていたり,数値的に交点が求められていたりして若干微妙に感じるポイントがあります. いちいち解説している記事が見当たらない割によく使うため,書くことにします.

ハフ空間上で表示された直線

ハフ空間上の点 $(\rho, \theta)$ は,つぎの直線を表すものになっています. $$ \rho = x \cos\theta + y \sin\theta $$

$y=ax+b$ にせずに交点を求める

いま,$(\rho_1, \theta_1),\ (\rho_2, \theta_2)$ で表現される2本の直線を考えます. これらが交点をもつということは, $$ \rho_1 = x \cos\theta_1 + y \sin\theta_1\\ \rho_2 = x \cos\theta_2 + y \sin\theta_2 $$ の両方が同一の $(x,y)$ に対して成り立つということなので, $$ \begin{bmatrix} \cos\theta_1 & \sin\theta_1\\ \cos\theta_2 & \sin\theta_2 \end{bmatrix} \begin{bmatrix} x\\ y \end{bmatrix} = \begin{bmatrix} \rho_1\\ \rho_2 \end{bmatrix} $$ と書けます. これを単純に $(x,y)$ について解くことで, $$ \begin{bmatrix} x\\ y \end{bmatrix} = \begin{bmatrix} \cos\theta_1 & \sin\theta_1\\ \cos\theta_2 & \sin\theta_2 \end{bmatrix}^{-1} \begin{bmatrix} \rho_1\\ \rho_2 \end{bmatrix} $$ と計算できます.

ただし,傾きが同一の2直線に対しては行列部分が特異となり,この方法は使用できません. この場合はそもそも交点をもたないので,行列式の値の大きさを確認する例外処理を入れると良いでしょう.

線形代数に祈りを.

Share Comments

MATLABのタブ補完機能をコードから利用する

MATLABのタブ補完機能をコードから利用する

概要

MATLABデスクトップのタブ補完機能は便利に作られています. たとえば,コマンドウィンドウに

>> load

と入力した後にTABキーを押すと,現在見えるパス上のディレクトリやファイルをリスト表示してくれます. また,

>> matl

まで入力してTABを押すと,matlab までが確定して入力され,その後に続く関数や変数の候補が表示されます.

最近わたしはVimのPythonプラグインを書いていて,その上でMATLABエンジンを動かして遊んでいます. この補完機能をうまく利用してVim上でMATLABの賢い補完ができないだろうかと考え,やってみたのがこの記事の内容です.

ドキュメント化されていない機能なので,今後のバージョンアップ等で使用できなくなる可能性があることを注意しておきます.

Read More

Share Comments