ロボクメモ Robojimamemo

ロボットを研究する、ある学生のメモ。日々、勉強したことをメモ代わりに残して共有します(ROS,C++,python,linux,etc...)

xacroでRobotModelを表示したい

launchのpathを変えるだけでいろいろなRobotModelを使いたい

今までurdf内のpathの関係などは みたいにpackageの中で管理してきた。 モデルのメッシュのサイズが大きくなるにつれてgit で管理するのが難しくなってきたので、別でメッシュフォルダを用意するようにした。 そのときにPathを変更する必要があり、launchやurdfやdaeファイルなど、いろいろな場所でpathを揃えるのが面倒。

xacroでurdf内でも変数をつかえる

xacroを使うとurdfの中でも変数とかparamとか色々使えるようになるらしい。 http://wiki.ros.org/xacro

書き方などは書いてあるが、少し手間取ったのでメモ

<RobotModel_pub.launch>

<!-- -->
<launch>
<arg name="dire" default="/home/IN_urdf_and_dae_directory/" />
<arg name="urdf" default="AAA.urdf.xacro" />

<param name="RobotName" command="$(find xacro)/xacro  '$(arg dire)/$(arg urdf)' path:=$(arg dire)" />
</launch>

<HOGE.urdf.xacro>

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="RobotName">
    <xacro:arg name="path" default="/home/In_dae_file_directory"/>
    <link name="map">
        <visual name="map_visual">
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
            <geometry name="RobotName_geom">
                <mesh filename="file://$(arg path)/Robot.dae" scale="1 1 1"/>
            </geometry>
        </visual>
    </link>
</robot>

<ファイル構成>
home
-urdf/ toaru.urdf.acro
-urdf/ Robot.dae

roslaunch [your_package] RobotModel_pub.launch dire:=home/urdf/ urdf:=toaru.urdf.xacro

こんな感じでpathがlaunchだけで完結することができて色々こんがらがらない. もしくは使う目的が決まっていればlaunchの中でdefaultの値を変更してしまう。

もちろん、package内で使うときはfind packageとかを使ってもいい。 便利。

vim でメモを管理したい、 Qfixhowm

しっくりくるメモtoolは何か

普段の研究の成果や引き継ぎなど、メモを残しておきたい時にふとメモするとそのメモがどこにいったかわからなくなってしまう。 じゃあWebのメモ管理Toolを使用してみようと思って、Googl document, Google keep, Evernote, wripeと使ってきたがどうもしっくりこない。 なぜか?それはvimではないからではないかという結論になった。普段の開発やメモ書きはすべてvim でやっているのに残そうとするメモだけ、わざわざWebに移すという作業が面倒であり続かないのでは、と理由をつけてみる。

そこで、vimを用いたQfixhowmというメモ管理ツールに出会った

Qfixhowm

大きなサイトがある。使い方も詳しい。 sites.google.com
メモをリンクをつけながら管理したり、参照をつけながらメモをとったり、日記機能があったりする。 TODOや予定リストなど、必要な機能が十分あるように感じた。

1. ダウンロード、環境設定

ここのサイトを参考に設定

qiita.com

vimrcの中  
" キーマップリーダー
let QFixHowm_Key = 'g'

" howm_dirはファイルを保存したいディレクトリを設定
let howm_dir             = '<qfixhowmのホームパス(任意に設定)>'
let howm_filename        = '%Y/%m/%Y-%m-%d-%H%M%S.md'
let howm_fileencoding    = 'utf-8'
let howm_fileformat      = 'dos'

" キーコードやマッピングされたキー列が完了するのを待つ時間(ミリ秒)
set timeout timeoutlen=3000 ttimeoutlen=100
" " プレビューや絞り込みをQuickFix/ロケーションリストの両方で有効化(デフォル
" ト:2)
let QFixWin_EnableMode = 1

" QFixHowmのファイルタイプ
" 私がよくmarkdown使うので以下のように設定
let QFixHowm_FileType = 'markdown'

" タイトル記号を # に変更する(markdown使用の都合上)
let QFixHowm_Title = '#'

" QuickFixウィンドウでもプレビューや絞り込みを有効化
let QFixWin_EnableMode = 1

" QFixHowm/QFixGrepの結果表示にロケーションリストを使用する/しない
let QFix_UseLocationList = 1

set shellslash

" textwidthの再設定
au Filetype qfix_memo setlocal textwidth=0

" 休日定義ファイル
" 休日定義ファイルは qfixhowm-master 内にあります
let QFixHowm_HolidayFile = '<休日定義ファイル Sche-Hd-0000-00-00-000000.utf8 までのパス>'

" オートリンクでファイルを開く
let QFixHowm_Wiki = 1  

2.簡単な使い方

調べて、簡単につかってみた。 メモ書き

[書く系]
- 日記の作成:g,<\space>
日付のフォルダに入る

  • とりあえずメモ: g,u 毎回同じファイルが開かれる Qmem-00-hogeになる。

  • TODO 作成: g,d
    https://sites.google.com/site/fudist/Home/qfixhowm/howm-reminder
    [2019-03-07]@ 予定のテスト@の次は何日間か入れられる ex)@3 3日間
    [2019-03-07]! 締め切り 締め切りの7日前から出される ex)!10 10日間
    [2019-03-07]+ TODO 7日間で出される
    予定の確認:g,y
    Todoの確認:g,t

[見る系]
- 検索:g,s
- 日記の中でエントリを一覧表示: g,A
- 全エントリ一覧: g,ra

[リンク系 ]
- キーワードリンク
keywordで保存するとそのファイルのリンクが作成される.
home/keywordにファイルが作成されている

  • come-from リンク
    <<<これがリンクの貼り方 こうやると他のすべてのファイルの中でアンダーラインが引かれて、検索リンクになる let QFixHowm_Wiki = 1 これをONにしておくとあまり使えない。 定義元のファイルに言ってしまう。

  • go-to リンク
    >>>これがリンクの張り方 こうやるとその名前の検索が始まるcome-fromと組み合わせるといい感じになる気がする。 これがリンクの張り方

  • ペアリンクhownファイル
    作り方:g,jで現在開いてるメモの関連メモを作成する。

    保存先:<howm_dir>/pirlink/hoge.howm. "ペアリンクファイルの保存場所 let QFixHowm_PairLinkDir = 'pairlink'

  • howm link
    howm://png/test.png

f:id:shun0612:20190307234032p:plain
使用例:左がメニューWikiみたいに記事管理、左上はカレンダーメモがひも付けされてる。

もう少し細かく使い方を別記事にて説明したい。とりあえず、

便利。

ROS 画像からoccupancy grid を任意の値でpublishしたい

画像からros occupancy grid mapをpublish

既存のmap_server(http://wiki.ros.org/map_server)では画像からでは0(free), 100(occupied), -1(unknown)の3つの状態しかえらぶことができない。 将来のバージョンではグラデーションができるようになるみたいだが、すぐこの機能が欲しかったので実装してみた。

コード

img2navgrid.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import sys
import rospy
import yaml

from PIL import Image

from pyquaternion import Quaternion
#sudo pip install pyquaternion

from nav_msgs.msg import OccupancyGrid

if __name__== '__main__':

args = sys.argv
if(len(args) != 2):
print("Usage: python img2gridmap.py <yaml>")

#yaml file名
yaml_file = args[1]
with open("map_reorigin.bt.yaml", "rt") as fp:
text = fp.read()
map_info = yaml.safe_load(text)

#read img
im = np.array(Image.open(map_info['image']), dtype='int8')

print('##########image info############')
print('name: %s' % map_info["image"])
print('size: %s' % str(im.shape))
print('origin[x,y,yaw]: %s' % str(map_info["origin"]))
print('resolution: %s' % str(map_info["resolution"]))
print('################################')

# set ros node
publish_gridmap = rospy.Publisher("/map_py", OccupancyGrid, queue_size=10)
rospy.init_node("map_server_py", anonymous=True)

# set msg_info
_map = OccupancyGrid()
_map.header.stamp = rospy.Time.now()
_map.header.frame_id = "/map"
_map.info.resolution = map_info["resolution"]
_map.info.width = im.shape[1]
_map.info.height = im.shape[0]
_map.info.origin.position.x = map_info["origin"][0]
_map.info.origin.position.y = map_info["origin"][1]

rad = map_info["origin"][2]
q = Quaternion(axis=[0,0,1], angle=rad).elements
_map.info.origin.orientation.x = q[1]
_map.info.origin.orientation.y = q[2]
_map.info.origin.orientation.z = q[3]
_map.info.origin.orientation.w = q[0]

#change occupancy data
im_py = np.flip(im,0).reshape(-1,1)
_map.data = im_py

r = rospy.Rate(1)
while not rospy.is_shutdown():
publish_gridmap.publish(_map)
r.sleep()
print("publish")

使い方

python img2navgrid [yaml file]

便利

linux google driveと同期 

Ubuntu でメモの管理を一箇所でまとめてやりたい 

自分はエディタとしてVimを使用している。
メモなどをふと書こうと思った時に、端末上で書いてしまいどのPCで書いたか忘れてしまうことが多々ある。

そんなとき発見した記事
解決方法、Google Driveを同期してその中でメモを取る。

参考:
Ubuntu(他Linux)で Googleドライブ を使う方法アレコレまとめ | mogi2fruitsどっとねっと

google-drive-ocamlfuse のダウンロード

$sudo add-apt-repository ppa:alessandro-strada/ppa  
$sudo apt-get update  
$sudo apt-get install google-drive-ocamlfuse  

1. アカウント認証
$ google-drive-ocamlfuse

2. フォルダの作成、マウント

$ mkdir ~/TOARU_google_drive  
$ google-drive-ocamlfuse ~/TOARU_google_drive

こんな感じになる.

f:id:shun0612:20181128195017p:plain
ディレクトリ画面

3. 使用し終わったらアンマウント
$fusermount -u ~/TOARU_google_drive

便利

vim の検索の速度を上げる ctags

vim の定義元に飛べる

karaage.hatenadiary.jp

sudo apt install exuberant-ctags

ctags -R --extra=+f

この辺のコマンドと組み合わせる。
Ctrl + o 前の場所へ
Ctrl + i 次の場所へ

vim で clipboardが無効だけどコピーアンドペーストしたい

vim で 書いたコードを他の環境に貼り付けたい時

クリップボードを有効なものをインストールする
・再ビルド
等、いろいろあるが最近見つけた方法 xselの使用. www.mk-mode.com

1. xselのインストール
$ sudo apt install xsel

2. vimrcに書く設定

vnoremap <C-c> :w !xsel -bi<CR><CR>

こんな感じにするとCtrl-Cでコピーすることができる。

vim quickrun でpython,シェルスクリプトの開発

vim の端末で実行しながら開発

簡単なpython , シェルスクリプトを作成するとき、実行結果を確認しながら開発できる、 他にもvim の中で簡単にコマンドが実行できる。

参考:
d.hatena.ne.jp

1. インストール https://github.com/thinca/vim-quickrun .vimrcに以下を追加
NeoBundle 'thinca/vim-quickrun'

2. vimprocのインストール
時間のかかる作業をまわすときは非同期で編集をすることができるといい。 https://github.com/Shougo/vimproc.vim

3. 設定を.vimrcに書き込む
私は下の狭いwindowで結果を確認するように設定している.

let g:quickrun_config = {
\"_" : {
\ "runner" : "vimproc",
\ "runner/vimproc/updatetime" : 60,
\ "outputter/buffer/split" : "botright 8sp",
\ "outputter/buffer/close_on_empty" : 1
\ },
\}