この難しさを加味した上でSLAMを実現するため、簡単な方法を下記に示します。
- 初期の自己位置を決定
- 現在時刻t=0での環境地図を作成
- 時刻t+1での自己位置を推定
- 時刻tでの環境地図を基に推定した自己位置を修正
- 時刻t+1での環境位置を測定
- 時刻tで作成した環境地図を更新
- 2から6を繰り返す
この方法では、まず自分の初期位置を中心として地図を作成します。
そして、自己位置推定→環境地図作成→自己位置推定→環境地図作成→・・・、と繰り返してSLAMを実現しています。
import threading
import serial
connected = False
port = 'COM4'
baud = 9600
serial_port = serial.Serial(port, baud, timeout=0)
def handle_data(data):
print(data)
def read_from_port(ser):
while not connected:
#serin = ser.read()
connected = True
while True:
print("test")
reading = ser.readline().decode()
handle_data(reading)
thread = threading.Thread(target=read_from_port, args=(serial_port,))
thread.start()
import logging
logging.basicConfig(filename='example.log',level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')
import logging
logger = logging.getLogger(__name__)
fmt = "%(asctime)s %(levelname)s %(name)s :%(message)s"
logging.basicConfig(level=logging.DEBUG, format=fmt)
# logging.root.handlers[0].setFormatter(logging.Formatter(fmt=fmt))
logger.info("hello")
logger.info("bye")
2016-10-10 19:49:50,692 INFO __main__ :hello
2016-10-10 19:49:50,693 INFO __main__ :bye
gcc-arm-none-eabi-5_4-2016q3
。# 解压到指定目录
$ cd your_toolchain_path/
$ tar -xvf gcc-arm-none-eabi-5_4-2016q3-20160926-mac.tar.bz2
# 验证版本
$ cd your_toolchain_path/gcc-arm-none-eabi-5_4-2016q3/bin/
$ ./arm-none-eabi-gcc --version
make
和 rm
。还好这个世界上有一些非常可爱的人,他们“创造了一个东西,然后分享出来,让大家都能用 ”,这就是我们将需要用到的开源项目 GNU ARM Eclipse Windows Build Tools 。make
和 rm
等命令行工具。Next
,安装完毕,为其添加环境变量:# 验证是否配置正确
> make --version
nRF5_SDK_12.2.0_f012efa
。# 解压到指定目录
$ tar -xvf nRF5_SDK_12.2.0_f012efa.zip -C ./your_sdk_path/
修改 Makefile.posix
(在 Windows 下对应的是Makefile.windows
) 文件,配置成前面 GCC ARM Embedded 的路径:# macOS & Linux 对应 Makefile.posix 文件;Windows 对应 Makefile.windows 文件
GNU_INSTALL_ROOT := your_toolchain_path/gcc-arm-none-eabi/gcc-arm-none-eabi-5_4-2016q3
GNU_VERSION := 5.4.1
GNU_PREFIX := arm-none-eabi
可以编译官方的示例验证是否正常工作:$ cd nRF5_SDK_12.2.0_f012efa/examples/peripheral/blinky/pca10040/blank/armgcc/
$ make
# 如果安装失败,可以安装高版本的 Python 2.7.x 试试
$ pip install --pre -U pyocd
$ git clone https://github.com/YS-Beacon/ys-beacon-blinky.git
$ cd ys-beacon-blinky
# 将 YS-Beacon 连接到 PC
$ make flash
一切顺利的话,板子上的 RGB LED 将按照一定规律闪烁:SELECT * FROM users INTO OUTFILE '/tmp/users.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"';
git checkout -b feature_branch_name
git push -u origin feature_branch_name
git checkout <branch>
command.
- <?php
- // JSON形式のテキストを生成する
- $json = <<< JSON_DOC
- [
- {"name":"Google", "url":"https://www.google.co.jp/"},
- {"name":"Yahoo!", "url":"http://www.yahoo.co.jp/"}
- ]
- JSON_DOC;
- // JSON用のヘッダを定義して出力
- header("Content-Type: text/javascript; charset=utf-8");
- echo $json;
- exit();
- ?>
- <?php
- $json = array(
- array('name'=>'Google', 'url'=>'https://www.google.co.jp/'),
- array('name'=>'Yahoo!', 'url'=>'http://www.yahoo.co.jp/'),
- );
- header("Content-Type: text/javascript; charset=utf-8");
- echo json_encode($json); // 配列をJSON形式に変換してくれる
- exit();
- ?>
- var myajax = function (options) {
- options = options ? options : {};
- this.isloader = false;
- this.request = false;
- this.url = options.url;
- this.params = options.params ? options.params : null;
- this.error = typeof options.error == 'function' ? options.error : function (data) { return false; };
- this.loaded = typeof options.loaded == 'function' ? options.loaded : function (data) { return false; };
- };
- myajax.prototype = {
- load : function () {
- if (this.getRequest()) {
- this.sendRequest();
- }
- },
- getRequest : function () { // 通信のリクエスト
- if (!this.url || this.isloader) return false;
- if (window.ActiveXObject) { // XMLHttpRequest未実装ブラウザ
- try { // MSXML2以降用
- this.request = new ActiveXObject('Msxml2.XMLHTTP');
- } catch (e) { // 旧MSXML用
- try {
- this.request = new ActiveXObject('Microsoft.XMLHTTP');
- } catch (e2) {
- this.request = false;
- }
- }
- } else if (window.XMLHttpRequest) { // XMLHttpRequest実装ブラウザ
- this.request = new XMLHttpRequest();
- } else {
- this.request = false;
- }
- return this.request ? true : false;
- },
- sendRequest : function () { // リクエストの送信
- var t = this;
- if (!t.request) return false;
- t.isloader = true; // 通信判定(重複通信を防ぐ)
- t.request.open('POST', t.url, true); // 初期化
- t.request.onreadystatechange = function () { // 進行状況の確認
- if (this.readyState == 4) { // 通信完了
- switch (this.status) {
- case 200 : // 成功
- var obj = eval(this.responseText); // オブジェクトに変換
- t.loaded(obj);
- break;
- default : // 失敗
- t.error(this.statusText);
- break;
- }
- t.isloader = false;
- t.request = false;
- }
- };
- t.request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); // ヘッダ設定
- t.request.send(t.setParameter()); // 送信
- },
- setParameter : function () { // 送信パラメータの設定
- if (!this.params) return null;
- var result = '';
- for (var key in this.params) {
- var value = this.params[key];
- result += (result ? '&' : '') + key + '=' + encodeURIComponent(value);
- }
- return result ? result : null;
- }
- };
- <body>
- <!-- bodyタグより下に記述 -->
- </body>
- <script type="text/javascript">
- //<![CDATA[
- var ma = new myajax({ // myajaxオブジェクトを生成
- url : '/ajax/json.php',
- params : {},
- error : function (data) {
- console.log(data);
- },
- loaded : function (data) {
- console.log(data[0].name); // 出力結果:Google
- }
- });
- document.body.onload = ma.load(); // 通信実行
- //]]>
- </script>