ROS・Unity・ロボット・ドローン姿勢制御に関わるクォータニオン

オイラー角による回転行列の表現

coordinate
coordinate

物体を座標系とともにx軸、y軸、z軸まわりの順にそれぞれ角度ϕ、θ、ψだけ回転させたときに、物体の位置の変換を表す回転行列は、

euler_angle
euler_angle

と表される。 3つの角度ϕ、θ、ψ をオイラー角と呼ぶ。

しかし、以下のイラストのとおり、オイラー角による姿勢制御の弱点(Gimbal lock)があり、例えば西方向のY軸を90度傾けると、X軸とZ軸が同軸となってしまい、姿勢制御が困難となる。

ジンバルロック
ジンバルロック

このジンバルロックを解消するのがクォータニオンの出番です。

クォータニオンによる回転の表現

ROSではクォータニオンのq=(x,y,z,w)を虚数形式でq=ix+jy+kzq=ix+jy+kz+Wと表します。原点を通す回転軸を表す単位ベクトルa=(ax,ay,az)で、この回転軸から物体軸の回転角度がθの場合は、クォータニオンは(x,y,z,w)=(ax*sin(θ/2), ay*sin(θ/2), az*sin(θ/2),cos(θ/2))となります。

以下の例では、平坦地面にて辺長1mの正方形に沿って自律移動ロボット(クローラ)に走行させて動作を確認します。

from geometry_msgs.msg import Pose, PoseWithCovarianceStamped, Point, Quaternion, Twist  
...
locations['square_vertex_1'] = pose = Pose(Point(1.0,0.0,0.0), Quaternion(0.0,0.0,0.0,1.0))
locations['square_vertex_2'] = pose = Pose(Point(0.0,1.0,0.0), Quaternion(0.0,0.0,0.707,0.707))
locations['square_vertex_3'] = pose = Pose(Point(0.0,1.0,0.0), Quaternion(0.0,0.0,0.707,0.707))
locations['square_vertex_4'] = pose = Pose(Point(0.0,1.0,0.0), Quaternion(0.0,0.0,0.707,0.707))
...

クォータニオン~オイラー角へ変換

geometry_msgs::Quaternion orientation = msg->pose.pose.orientation;    
tf::Matrix3x3 mat(tf::Quaternion(orientation.x, orientation.y, orientation.z, orientation.w));    
double yaw, pitch, roll;    
mat.getEulerYPR(yaw, pitch, roll);

オイラー角~クォータニオンへ変換

tf::Quaternion q;
q.setRPY(Out_X, Out_Y, Out_Z);
sensor_msgs::Imu imu_data;
imu_data.orientation.x=q[0];
imu_data.orientation.y=q[1];
imu_data.orientation.z=q[2];
imu_data.orientation.w=q[3];

以上です。

研究開発・検証試作に提案するロボット翔・電子部品ストアロボット、センサ、通信モジュールが品揃えています。どうぞご利用下さい

3DR Pixhawk Mini フライトコントローラー キット

3DR Pixhawk Mini フライトコントローラー キット
3DR Pixhawk Mini フライトコントローラー キット

概要

3DR Pixhawk Mini Autopilot & Micro M8N GPS コンパス付き & PM06 PDBボードのフライトコントローラーキットです。3DR Pixhawk MiniオートパイロットはPixhawkの次世代進化バージョンです。 元のPixhawkのサイズの約1/3で、より強力なプロセッサとセンサーを備えています。PPX4オープンハードウェアプロジェクトに基づいており、PX4フライトスタック用に最適化されています。

主な仕様

メイン・プロセッサ

・STM32F427 Rev 3

IOプロセッサ

・STM32F103

センサ

・Accel / Gyro / Mag:MPU9250
・Accel / Gyro:ICM20608
・気圧計:MS5611

電圧定格

・パワーモジュール出力:4.1~5.5V
・最大入力電圧:45V(10S LiPo)
・最大電流検出:90A
・USB電源入力:4.1~5.5V
・サーボレール入力:0~10V

サイズ・重量

・38x43x12mm
・15.8g

GPSモジュール

・GNSS受信機:ublox Neo-M8N
・コンパスHMC5983
・重量:22.4g
・サイズ:37x37x12mm

インタフェース

・1×UARTシリアルポート
・Spektrum DSM / DSM2 / DSM-X?衛星対応
・フタバSBUS?対応
・PPM合計信号入力
・I2C
・CAN
・ADC
・内蔵マイクロUSBポート

販売サイト

3DR Pixhawk Mini フライトコントローラー キット

以上です。

研究開発・検証試作に提案するロボット翔・電子部品ストアロボット、センサ、通信モジュールが品揃えています。どうぞご利用下さい

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

研究開発・検証試作に提案するロボット翔・電子部品ストアロボット、センサ、通信モジュールが品揃えています。どうぞご利用下さい

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

研究開発・検証試作に提案するロボット翔・電子部品ストアロボット、センサ、通信モジュールが品揃えています。どうぞご利用下さい

16m、薄型、ROS対応レーザスキャナ YDLIDAR G4

YDLIDAR_G4
YDLIDAR_G4

SLAM LIDAR-YDLIDAR G4の主なスペックは以下のとおり

・寸法 72mm(直径) x 41mm(厚さ)
・検出方法 360度回転式・三角法
・検出距離 max 16m
・サンプリング周波数 max 9kHz
・回転周波数 max 12Hz
・環境光 2kLux
・ROS対応

YDLIDAR G4 vs RPLIDAR A2M8 主なスペック比較

仕様 YDLIDAR G4 RPLIDAR A2M8
メカニズム 360度モータ回転式 360度モータ回転式
計測法 三角法 三角法
ROS対応
寸法 Φ72mm x H42mm Φ76mm x H41mm
本体重さ 214g 200g
最大起動電流 550mA 1500mA
定格電圧電流 5V450mA 5V500mA
検知距離 0.1~16m 0.15~12m
回転周波数 5Hz~12Hz 5Hz~15Hz
レンジ周波数 4kHz~9kHz 2kHz~8kHz
距離精度 <0.5mm(0.10~2.0m)、距離の1%以下(2.0m~16m)   0.5mm(0.10~1.5m)、距離の1%以下(1.5m~12m)  
角度精度 0.3度(回転周波数7Hz) 0.45~1.35度
規模応用例   あり、EAI Robot あり、Slamtec Robot

自律移動ロボットベースのために開発したEAI YDLIDAR G4

YDLIDAR G4 タッチスクリーンへの活用


・詳細&商品リンク YDLIDAR G4 | ロボット翔-電子部品ストア

研究開発・検証試作に提案するロボット翔・電子部品ストアロボット、センサ、通信モジュールが品揃えています。どうぞご利用下さい