ROS launchの自動起動について

ロボットが立ち上がった際、自動的にコマンドの待ち受け状態に入り、launchファイルのロード、開始、停止、再開、アウトなどのコマンドを受け付けて、指定されたlaunchファイルを実行することが可能な仕組みを作る必要があった。

#!/usr/bin/env python
import roslaunch
import os
import rospy
class Ros_Launch(object):
    def __init__(self, ):
        self.launchfile = ""
        self.reinitialize()
    def __del__(self,):
        self.exit()
    def load_file(self, launch_file):
        if self.is_alive():
            raise RuntimeError("you need to stop before you load another launch file")
            return False  
        self.launchfile = os.path.abspath(os.path.expanduser(launch_file))
        self.launch.parent.config = roslaunch.config.load_config_default([self.launchfile], None)
        return True
    def start(self, ):
        local_machine = roslaunch.core.local_machine()
        for n in self.launch.parent.config.nodes:
            n.machine = local_machine
        self.launch.start()
    def is_alive(self, ):
        if self.launch.parent.pm is not None and self.launch.parent.pm.is_alive() and len(self.launch.parent.pm.get_active_names())>0:
            return True
        return False
    def current_file(self, ):
        return self.launchfile
    def reinitialize(self, ):
        self.launch = roslaunch.scriptapi.ROSLaunch()
    def resume(self, launch_file):
        self.launch.stop()
        self.reinitialize()
        self.load_file(launch_file)
    def stop(self, ):
        self.launch.stop()
        self.reinitialize()
        #self.load_file(self.launchfile)
    def exit(self, ):
        self.launch.stop()

以上

3+

ロボット・ドローン部品お探しなら
ロボット翔・電子部品ストア

Zaif web オーダーツール

Zaifさんへの注文はオフィシャル画面で通らないときがあり、果たして画面がフリーズとなり、売買タイミングが失ってしまう。なので注文が板に載せるまで注文リクエストを繰り返すできるようなツールを作成した。

主な機能

1)資産、価格情報を取得する。
2)買い注文・売り注文を出す。
3)投げた注文の状況を確認する。
4)投げた注文を取り消す。

環境

python3.6 or above、Flask、zaif-client

実装手順

$git clone https://github.com/soarbear/zaif-order-tool.git
$cd zaif_order_tool
$sudo pip3 install flask
$sudo pip3 install zaif-client
$python3 app.py

→ブラウザを立ち上げて http://localhost:5000/ にアクセスしてみる。

免責事項

このツールのご利用は自己責任でお願いします。

ソースコード

ソースコードはgithubに公開済み→github

0

ロボット・ドローン部品お探しなら
ロボット翔・電子部品ストア

ccxt非同期アクセス時間についての検証

zaifさんから1 tickerと4 tickersの取得を例に検証してみる

# -*- coding: utf-8 -*-
import asyncio, os, sys
from time import time

root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.append(root + '/python')
sys.path.append('/usr/local/lib/python3.6/site-packages/ccxt')
import ccxt.async_support as ccxt

PAIRS = ['BTC/JPY', 'BCH/JPY', 'XEM/JPY', 'MONA/JPY']

async def test(exchange, pair):
    print(await exchange.fetch_ticker(pair))
    if pair == 'MONA/JPY': await exchange.close()

def main():
    zaif = ccxt.zaif({
        'apiKey': "",
        'secret': "",
        'verbose': True,
    })
    start_time = time()
    asyncio.get_event_loop().run_until_complete(test(zaif, 'BTC/JPY'))
    mid_time = time()
    [asyncio.get_event_loop().run_until_complete(test(zaif, pair)) for pair in PAIRS]
    print(f"[info]downloaded time of 1 pair :{mid_time-start_time}s")
    print(f"[info]downloaded time of 4 pairs:{time()-mid_time}s")

if __name__ == '__main__':
    main()

検証結果

4tickersと1tickerの時間はあまり変わってないので、非同期の動きが検証できたと思われる

[info]downloaded time of 1 pair :0.13094758987426758s
[info]downloaded time of 4 pairs:0.13180255889892578s

検証環境

ubuntu 14.04
python 3.6.3
cctx 1.16.11
0

ロボット・ドローン部品お探しなら
ロボット翔・電子部品ストア

Python3再帰動作検証~決定木まで

Pythonバージョン確認

C:\recurse>py -V
Python 3.6.5

再帰動作検証その1

自然数1~5の足し算

# file_name: recurse.py
def recurse_add(n):
    if n==1:
        return 1
    return n + recurse_add(n - 1)
if __name__ == '__main__':
    recurse_add(5)

Stackの様子を見てみよう、下から上の順にPush、逆のほうからPop(LIFO)

recurse_add(1)
2+recurse_add(1)
3+recurse_add(2)
4+recurse_add(3)
5+recurse_add(4)

再帰動作検証その2

フォルダーc:/recurse/直下のサブフォルダー、ファイル名を階層で表示

Pythonコード

# file_name: recurse.py
import os
FOLDER = "c:/recurse/"
def main():
    counter_recurse = 0 # 再帰counter初期化
    print_files(FOLDER, counter_recurse) # folderとsub_folerのfilesをプリントする
def print_files(folder, counter_recurse): # 再帰関数の入り口
    for f in os.listdir(folder):
        full_name = folder + f # PATHつきfile名 または folder名
        if os.path.isdir(full_name): # folderの場合
            # folder名プリント
            print(" " * 5 * counter_recurse + f + ", counter_recurse =" , counter_recurse)
            counter_recurse = counter_recurse + 1 # folder名プリント
            print_files(full_name + "/", counter_recurse) # 再帰、スタックにプッシュ、LIFOでポップ
            counter_recurse = 0 # 再帰counterリセット、再帰毎終了時に実行
        elif os.path.isfile(full_name): # fileの場合
            print(" " * 5 * counter_recurse + f) # file名プリント
if __name__ == '__main__':
    main()

確認

C:\recurse>py recurse.py
file_in_recurse.txt
folder1, counter_recurse = 0
     folder2, counter_recurse = 1
          folder3, counter_recurse = 2
               folder4, counter_recurse = 3
                    file_in_folder4.txt
folder5, counter_recurse = 0
     folder6, counter_recurse = 1
          folder7, counter_recurse = 2
               file_in_folder7.txt
recurse.py

決定木の再帰

# 葉っぱの数を取得する
def getNumLeafs(myTree):
    numLeafs = 0
    firstStr = myTree.keys()[0]
    secondDict = myTree[firstStr]
    for key in secondDict.keys():
        if type(secondDict[key]) is dict:
            numLeafs += getNumLeafs(secondDict[key])
        else:
            numLeafs += 1
    return numLeafs

# 木の深さを取得する
def getTreeDepth(myTree):
    maxDepth = 0
    firstStr = myTree.keys()[0]
    secondDict = myTree[firstStr]
    for key in secondDict.keys():
        if type(secondDict[key]) is dict:
            thisDepth = 1 + getTreeDepth(secondDict[key])
        else:
            thisDepth = 1
        if thisDepth > maxDepth:
            maxDepth = thisDepth
    return maxDepth

以上

0

ロボット・ドローン部品お探しなら
ロボット翔・電子部品ストア

Raspberry Pi B+にPython 3.5.1インストール

1、DebianとPythonの既存バージョン確認

# cat /etc/debian_version
Debian 7.6
# python -V
Python 2.7.3

2、ベースのアップグレード、約2時間かかりました。

# apt-get update
# apt-get upgrade -y</code>
# apt-get dist-upgrade</code>
# apt-get install build-essential libncursesw5-dev libgdbm-dev libc6-dev zlib1g-dev libsqlite3-dev tk-dev libssl-dev openssl libbz2-dev libreadline-dev

3、pyenvのインストール

# git clone https://github.com/yyuu/pyenv.git ~/.pyenv
# echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile
# echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile
# echo 'eval "$(pyenv init -)"' >> ~/.profile
# source ~/.profile

4、Python 3.5.1のインストール、約1時間かかりました。

# pyenv install 3.5.1

5、Python 3.5.1へ切り替え、旧バージョンもそのまま

# python -V
Python 2.7.3
# pyenv globle 3.5.1
# Python -V
Python 3.5.1

以上。

 

 

0

ロボット・ドローン部品お探しなら
ロボット翔・電子部品ストア