2019年7月21日星期日

SLAM Simultaneous Localization And Mapping

この難しさを加味した上でSLAMを実現するため、簡単な方法を下記に示します。
  1. 初期の自己位置を決定
  2. 現在時刻t=0での環境地図を作成
  3. 時刻t+1での自己位置を推定
  4. 時刻tでの環境地図を基に推定した自己位置を修正
  5. 時刻t+1での環境位置を測定
  6. 時刻tで作成した環境地図を更新
  7. 2から6を繰り返す
この方法では、まず自分の初期位置を中心として地図を作成します。
そして、自己位置推定→環境地図作成→自己位置推定→環境地図作成→・・・、と繰り返してSLAMを実現しています。

2019年4月3日星期三

python serial to log file

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

2018年3月9日星期五

快速构建 nRF5 SDK + ARM GCC 开发环境

https://www.jianshu.com/p/d77aeb302f6e

nRF5 应用开发的方式有挺多的,官方文档介绍的就有:
  • Keil µVision IDE,
  • IAR Embedded Workbench,
  • GCC ARM Embedded.
前两种方式优点是比较简单,很多事情 IDE 可以帮你一下搞定,但劣势也比较明显,这两个都是收费软件(如果你说可以和谐啊,那就当我没说啰...),还有就是只能在 Windows 系统下使用,跨平台基本没戏。
GCC ARM Embedded 是开源的交叉工具链,虽然配置稍微复杂一点点,但人家免费而且可以跨平台开发,无论你是使用 macOS,Windows,还是 Linux 进行开发,都完全无压力。这也是我个人非常推崇的一种方式,强烈建议大家都到这条跑道上来。
一开始我本来打算写个脚本,一条命令下去,屏幕“唰唰唰”蹦出一些“莫名其妙”的字符,最后跳出一句 “Completed successfully!”,一切轻松搞定,Perfect。这不是正好符合PM们说的“把你的用户当傻瓜”的理念吗?后来细想,我面对的人不是傻瓜,他们是比我不知道聪明多少倍的开发者,他们知道自己在干什么,这些小伎俩对他们来说简直就跟喝水一样。所以我还是老老实实还原整个构建过程,需要自动化构建的工作就留给他们,他们经常干这事的。

安装 GCC ARM Embedded

下载 GCC ARM Embedded,可以尝试最新版本,可能会出现不兼容问题,我当前使用的版本是 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

针对 Windows

Windows 对开发者来说是个比较麻烦的平台,不能原生支持一些开发工具,如我们将需要用到的两个命令行工具:makerm。还好这个世界上有一些非常可爱的人,他们“创造了一个东西,然后分享出来,让大家都能用 ”,这就是我们将需要用到的开源项目 GNU ARM Eclipse Windows Build Tools
下载并安装最新版本 GNU ARM Eclipse Windows Build Tools Release ,这个开源工具将会安装 makerm 等命令行工具。
一路 Next,安装完毕,为其添加环境变量:
# 验证是否配置正确
> make --version

安装 nRF5 SDK

下载最新版本 nRF5 SDK,nRF5 SDK 版本更新比较频繁,功能在不断扩展和改善中,可能会出现新旧 API 不兼容问题,小打小闹无所谓,搞大工程的小伙伴慎重更新。我目前使用的版本是 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

安装 pyOCD

pyOCD 是 mbed 社区为 ARM Cortex-M 系列 MCU 所提供的编程和调试服务工具。它主要基于 CMSIS DAP 接口,能为不同的厂商提供了统一的调试接口。该工具能够与 DAPLink 仿真器完美配合,低成本实现市场上价格不菲的仿真器的主要功能。
pyOCD 基于 Python,需要先安装 Python 2.7 和 pip:
安装最新稳定版本的 pyOCD:
# 如果安装失败,可以安装高版本的 Python 2.7.x 试试
$ pip install --pre -U pyocd

实战开发

如果你已经拿到 YS-Beacon HDK,一切准备就绪,可以进入实战开发了。第一个示例我已经 push 到 GitHub,可供参考:
$ git clone https://github.com/YS-Beacon/ys-beacon-blinky.git
$ cd ys-beacon-blinky

# 将 YS-Beacon 连接到 PC
$ make flash
一切顺利的话,板子上的 RGB LED 将按照一定规律闪烁:
小礼物走一走,来简书关注我


作者:造物邦
链接:https://www.jianshu.com/p/d77aeb302f6e
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

export table to csv file

 mysql -uroot -psmkslb HtipDB -e "select * from nodes_log" -B > mytable.csv


SELECT * FROM users
  INTO OUTFILE '/tmp/users.csv'
  FIELDS TERMINATED BY ','
  OPTIONALLY ENCLOSED BY '"';

2018年1月16日星期二

Push a new local branch to a remote Git repository and track it too

  1. Create a new branch:
    git checkout -b feature_branch_name
  2. Edit, add and commit your files.
  3. Push your branch to the remote repository:
    git push -u origin feature_branch_name
It's as simple as that!



You can switch branches using the git checkout <branch> command. 

2017年9月26日星期二

PHPでJSONを出力して、JavaScriptで取得する方法

http://dot-town-lab.com/laboratory/item/24


JSON(JavaScript Object Notation)というデータフォーマットを扱ってみたのでメモしておきます。
JSONは、XMLなどと同じようなテキストベースのファイル形式らしい。名前に「JavaScript」が入っているように、JavaScriptとの相性がとても良いらしいので、試しに扱ってみる事に。

PHPでJSONを出力する

JavaScriptでJSONを扱う前に、PHPで扱うJSONデータを出力しようと思います。
  1. <?php
  2. // JSON形式のテキストを生成する
  3. $json = <<< JSON_DOC
  4. [
  5. {"name":"Google", "url":"https://www.google.co.jp/"},
  6. {"name":"Yahoo!", "url":"http://www.yahoo.co.jp/"}
  7. ]
  8. JSON_DOC;
  9.  
  10. // JSON用のヘッダを定義して出力
  11. header("Content-Type: text/javascript; charset=utf-8");
  12. echo $json;
  13. exit();
  14. ?>

上の方法は、JSON形式のテキストを自分で生成してますが、PHP5.2以上からはJSONに関しての関数が用意されているので、そちらを使った方が確実です。
PHP5.1以下の場合は、PEARの「Services_JSON」を利用してください。
  1. <?php
  2. $json = array(
  3. array('name'=>'Google', 'url'=>'https://www.google.co.jp/'),
  4. array('name'=>'Yahoo!', 'url'=>'http://www.yahoo.co.jp/'),
  5. );
  6.  
  7. header("Content-Type: text/javascript; charset=utf-8");
  8. echo json_encode($json); // 配列をJSON形式に変換してくれる
  9. exit();
  10. ?>

JavaScriptでJSONデータを取得するオブジェクト

非同期通信を行う場合は、jQueryの$.ajax()を利用した方が簡単ですけど、XMLHttpRequest()を使ったコードをメモしておきます。
  1. var myajax = function (options) {
  2. options = options ? options : {};
  3.  
  4. this.isloader = false;
  5. this.request = false;
  6. this.url = options.url;
  7. this.params = options.params ? options.params : null;
  8. this.error = typeof options.error == 'function' ? options.error : function (data) { return false; };
  9. this.loaded = typeof options.loaded == 'function' ? options.loaded : function (data) { return false; };
  10. };
  11. myajax.prototype = {
  12. load : function () {
  13. if (this.getRequest()) {
  14. this.sendRequest();
  15. }
  16. },
  17. getRequest : function () { // 通信のリクエスト
  18. if (!this.url || this.isloader) return false;
  19. if (window.ActiveXObject) { // XMLHttpRequest未実装ブラウザ
  20. try { // MSXML2以降用
  21. this.request = new ActiveXObject('Msxml2.XMLHTTP');
  22. } catch (e) { // 旧MSXML用
  23. try {
  24. this.request = new ActiveXObject('Microsoft.XMLHTTP');
  25. } catch (e2) {
  26. this.request = false;
  27. }
  28. }
  29. } else if (window.XMLHttpRequest) { // XMLHttpRequest実装ブラウザ
  30. this.request = new XMLHttpRequest();
  31. } else {
  32. this.request = false;
  33. }
  34. return this.request ? true : false;
  35. },
  36. sendRequest : function () { // リクエストの送信
  37. var t = this;
  38. if (!t.request) return false;
  39. t.isloader = true; // 通信判定(重複通信を防ぐ)
  40. t.request.open('POST', t.url, true); // 初期化
  41. t.request.onreadystatechange = function () { // 進行状況の確認
  42. if (this.readyState == 4) { // 通信完了
  43. switch (this.status) {
  44. case 200 : // 成功
  45. var obj = eval(this.responseText); // オブジェクトに変換
  46. t.loaded(obj);
  47. break;
  48. default : // 失敗
  49. t.error(this.statusText);
  50. break;
  51. }
  52. t.isloader = false;
  53. t.request = false;
  54. }
  55. };
  56. t.request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); // ヘッダ設定
  57. t.request.send(t.setParameter()); // 送信
  58. },
  59. setParameter : function () { // 送信パラメータの設定
  60. if (!this.params) return null;
  61. var result = '';
  62. for (var key in this.params) {
  63. var value = this.params[key];
  64. result += (result ? '&' : '') + key + '=' + encodeURIComponent(value);
  65. }
  66. return result ? result : null;
  67. }
  68. };

非同期通信を実行する

document.body.onloadを使用した場合は、bodyタグより下に記述しないと、bodyタグが存在しません的なエラーが返されるので注意。
  1. <body>
  2. <!-- bodyタグより下に記述 -->
  3. </body>
  4.  
  5. <script type="text/javascript">
  6. //<![CDATA[
  7. var ma = new myajax({ // myajaxオブジェクトを生成
  8. url : '/ajax/json.php',
  9. params : {},
  10. error : function (data) {
  11. console.log(data);
  12. },
  13. loaded : function (data) {
  14. console.log(data[0].name); // 出力結果:Google
  15. }
  16. });
  17.  
  18. document.body.onload = ma.load(); // 通信実行
  19. //]]>
  20. </script>