更新: 実際に operator[] を this->operator[] に置き換えるだけで、最終的なエラーが修正されました。
更新 2: logic_error が修正されました! _P エラーだけが残っています。(UNOや他のボードではなく、DUEにのみ表示されます...)
更新 3: temp マトリックスの名前を _Pt に変更するとうまくいきましたが、予約済みのマクロだったのでしょうか?
新しいエラー:
Arduino: 1.6.1 (Mac OS X), Board: "Arduino Due (Programming Port)"
/Users/zackbright/Documents/Arduino/libraries/StandardCplusplus-master/func_exception.cpp: In function 'void std::__throw_bad_alloc()':
/Users/zackbright/Documents/Arduino/libraries/StandardCplusplus-master/func_exception.cpp:30:18: error: exception handling disabled, use -fexceptions to enable
throw bad_alloc();
^
Error compiling.
-fexceptions を使用する必要があるようです...
このレポートには、[ファイル] > [設定] で [コンパイル中に詳細出力を表示] を有効にすると、より多くの情報が含まれます。
ここにはたくさんありますが、これに対する良い答えを得るために私がすべきことは、すべてを与えることです.
OSX上のarduino DUEにArduino 1.6.1を使用。
このライブラリを使用して std 名前空間 ' https://github.com/maniacbug/StandardCplusplus/ 'を取得します
そして、これはコンパイルに問題があるライブラリです: ' http://kalman.sourceforge.net/index.php '
フィルタ ライブラリをこの形式に移動して、arduino で使用できるようにしました。ヘッダー ファイルが見つからずに、少なくともインクルードを実行できるようになりました。
ご覧のとおり、ファイルの名前を .h ヘッダーに変更し (これが実際にどの程度必要かはわかりません)、フォルダーの名前を .cpp および .h と同じタイトルに変更し、もちろん、含まれているすべてのファイルを参照するように編集する必要がありました。ファイルの違い: 例
#include "kalman/ekfilter.hpp"
//the "kalman/" is because these used to be in a separate include folder
代わりにこれです:
#include "ekfilter.h"
だから、今、コンパイルしようとすると:
#include <StandardCplusplus.h>
#include <ekfilter.h>
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
以下に示すように、この混乱したエラーが発生します。
この StandardCplusplus ライブラリは std:: 名前空間を処理する必要があり、そのコードベースの実装で表面上は間違っていると思われるものは何もないため、最初のエラーは本当に気が狂います。
私が見たところ、_P に続くほとんどのものは、最初のエラーが _P 変数を kmatrix.h で定義されている行列としてキャストできないという問題です。奇妙なことに、これは解決策を示している可能性があります。これらのエラーは、Arduino UNO 用にコンパイルすると表示されません。
最後のエラーのペアは、正直なところ、それが何を意味するのかさえわかりません。
Arduino: 1.6.1 (Mac OS X), Board: "Arduino Due (Programming Port)"
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/kvector.h:37:0 から、/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter.h:33 から、TestKalmanLibrary.ino から含まれるファイル: 2:
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ktypes.h:74:48: エラー: '{' トークンの前にクラス名が必要です
struct KalmanError : public std::logic_error { ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ktypes.h: コンストラクター 'Kalman::KalmanError::KalmanError(const string&)': /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ktypes.h: 82:9: エラー:
クラス 'Kalman::KalmanError' には 'logic_error' という名前のフィールドがありません
: logic_error(message) {} ^
/Users/insertnamehere/Documents/Arduino/libraries/StandardCplusplus-master/cctype:19:0 からインクルードされたファイルで、/Users/insertnamehere/Documents/Arduino/libraries/StandardCplusplus-master/istream:21 から、/Users/insertnamehere から/Documents/Arduino/libraries/StandardCplusplus-master/iostream:27、/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/kvector.h:35 から、/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter から.h:33、TestKalmanLibrary.ino:2 から: /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter.h: グローバル スコープ:
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter.h:807:20:
エラー: 数値定数の前に unqualified-id が必要です
mutable Matrix _P; //!< Temporary matrix. ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter.h:817:0 からインクルードされたファイルで、TestKalmanLibrary.ino:2 から: /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h: Inメンバ関数 'void Kalman::EKFilter::init(Kalman::EKFilter::Vector&, Kalman::EKFilter::Matrix&)':
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:196:8: エラー:
'16' のメンバー 'swap' の要求は、非クラス型 'int' です
_P.swap(P_); ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h: メンバー関数内 'const Matrix& Kalman::EKFilter::calculateP() const': /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl. h:435:10: エラー: 非クラス型 'int' の '16' のメンバー 'resize' の要求
_P.resize(n, n); // keep this resize ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:439:15: エラー: 式は関数として使用できません
_P(i,i) = U(i,i); ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:443:17: エラー: 式は関数として使用できません
_P(i,j) = U(i,j)*U(j,j); ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:444:17: エラー: 式は関数として使用できません
_P(i,i) += U(i,j)*_P(i,j); ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:444:35: エラー: 式は関数として使用できません
_P(i,i) += U(i,j)*_P(i,j); ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:447:19: エラー: 式は関数として使用できません
_P(i,j) += U(i,k)*U(j,k)*U(k,k); ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:450:17: エラー: 式は関数として使用できません
_P(j,i) = _P(i,j); ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:450:27: エラー: 式は関数として使用できません
_P(j,i) = _P(i,j); ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h: メンバー関数内 'virtual void Kalman::EKFilter::sizeUpdate()': /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h :572:26: エラー: 式は関数として使用できません
U(i,j) = _P(i,j); ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:583:10: エラー: '16' のメンバー 'resize' のリクエストです。これは非クラス型 'int' です
_P.resize(n, nn); ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:586:17: エラー: 式は関数として使用できません
_P(i,j) = U(i,j); ^
/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/kvector.h:34:0 から、/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter.h:33 から、TestKalmanLibrary.ino から含まれるファイル: 2: /Users/insertnamehere/Documents/Arduino/libraries/StandardCplusplus-master/string: 'std::basic_string::size_type std::basic_string::find_first_not_of(const std::basic_string&, std::basic_string:: size_type) const [with Ch = char; Tr = std::char_traits; A = std::アロケータ; std::basic_string::size_type = unsigned int]': /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/kvector_impl.h:66:42: ここから必要 /Users/insertnamehere/Documents/Arduino/libraries/StandardCplusplus- master/string:518:64: 注: 依存ベース 'std::vector >' の宣言
if( Tr::eq(str[j], operator[](i)) ){ ^
/Users/insertnamehere/Documents/Arduino/libraries/StandardCplusplus-master/string:518:64: 注: 代わりに 'this->operator[]' を使用してください コンパイル中にエラーが発生しました。
ここで修正することはたくさんありますが、これはすべて、ライブラリが既にフォーマットされている方法に関するいくつかの問題を修正した後のものです。
「/boards.txt」コンパイル設定に -fpermissive を追加する必要がありました
彼らのコードにはコンパイルできない奇妙な実装がありました。私はこれを変更しました:
// These are explicitly GNU C++ specific.
// This is the exception class we report -- "GNUCC++\0".
const _Unwind_Exception_Class __gxx_exception_class
= ((((((((_Unwind_Exception_Class) 'G'
<< 8 | (_Unwind_Exception_Class) 'N')
<< 8 | (_Unwind_Exception_Class) 'U')
<< 8 | (_Unwind_Exception_Class) 'C')
<< 8 | (_Unwind_Exception_Class) 'C')
<< 8 | (_Unwind_Exception_Class) '+')
<< 8 | (_Unwind_Exception_Class) '+')
<< 8 | (_Unwind_Exception_Class) '\0');
これに:
const _Unwind_Exception_Class __gxx_exception_class = "GNUCC++\0";