専門実験2023ロボット制御Ⅰ:第2週 実習1 ARマーカを用いたピック&プレース
education
概要
- OpenManipulator-XによるARマーカをつかったピック&プレースの実習。
使用製品
- OpenManipulator-X
- WebCamera(Logicool)
開発環境
使用するパッケージ
- 以下のパッケージを使用するが,既に実験で使用するUSB Linuxにはインストール済み.
- OpenManipulator-X関連
- ar_track_alvar (非公式Noetic-devel)
- Noeticだと公式でbranchやaptでリリースしていない (2021年12月時点)
- 現時点で非公式で有志がNoetic用に変更したパッケージを利用
- usb_cam
実行方法
ARマーカのピック&プレース
- 画像のように、積み木にARマーカを貼る。
- 安全のためARマーカを貼った積み木は、別の積み木に載せる。エンドエフェクタ(ロボットハンド)が台座に衝突することを防ぐため。衝突しそうになったら,ロボットをすぐ止めること.

- ターミナル(端末)を3つ開く.
- 1つ目のターミナル
- 次のコマンドをターミナルに打ち込みMoveitを起動する。
sudo chmod 777 /dev/ttyUSB0
roslaunch open_manipulator_controllers joint_trajectory_controller.launch sim:=false
- カメラとARマーカ認識プログラムを起動する。起動すると端末にdepricated pixel for format used, …..とワーニングが出っぱなしになるが気にしない.
roslaunch experiment camera_bringup.launch
- ARマーカを一つだけカメラから見える位置に置く.プログラムが複数のARマーカに対応していないので,他のARマーカはカメラから見えない位置に置く.RVizを見えるようにすると,画面にARマーカの姿勢(位置と向き)を認識していることがわかる.ARマーカを移動するとそれに追従して,RViz上の姿勢も変化する.
- トラブルシューティング
- ARマーカを認識しない場合は恐らくカメラのデバイス番号が違うので変更する.カメラのデバイス番号は次のコマンドで確認する.
- video4がない場合は,~/catkin_ws/src/experiment/launch/camera_bringup.lauchの5行目を次のようにvideo2に変更する.
<arg name=”camera_device” default=”/dev/video2” />
- 次のコマンドを実行する.ARマーカを貼りつけた積み木をピック&プレースしたら成功.ただし,姿勢の精度はあまり高くない.
roscd experiment/script
python3 ar_picking_demo.py
サンプルプログラム
- ARマーカのサンプルプログラム1(マーカ指定なし)
-
概要:ARマーカを貼った物体をピッキングするサンプルプログラム。ARマーカを貼った物体が複数ある場合は、カメラからもっとも遠い物体をピッキングする。
-
ダウンロード:ar_picking_demo.pyは実験のノートPCに入っているが、前回実施した班がこれを改変しているのでうまく動かない場合があるので、ar_picking_demo.pyをダウンロードして次のディレクトリ(フォルダ)の中にダウンロードする。ダウンロードする場所が違うと実行できないので注意。
- /home/ubuntu/catkin_ws/src/open_manipulator/open_manipulator_controller/scripts
- https://github.com/demulab/Professional_Experiment/blob/main/ar_picking_demo.py
- ARマーカのサンプルプログラム2(マーカ指定)
- 概要:本サンプルプログラムでは38行目でマーカのID(番号)として7を指定し、それをピッキングする。マーカのIDはRvizで見るとマーカにar_marker_番号と表示される。その番号がIDとなる。
- ダウンロード:ar_multipicking_demo.pyは実験のノートPCに入っているが、前回実施した班がこれを改変しているのでうまく動かない場合があるので、ar_multipicking_demo.pyをダウンロードして、次のディレクトリ(フォルダ)の中にダウンロードする。ダウンロードする場所が違うと実行できないので注意。/home/ubuntu/catkin_ws/src/open_manipulator/open_manipulator_controller/scripts複数のマーカ対応:サンプルプログラムはidを指定した1個のマーカをピッキングするだけなので、複数のマーカをピッキングするプログラムは、このサンプルプログラムをもとに作成して欲しい。
- https://github.com/demulab/Professional_Experiment/blob/main/ar_multipicking_demo.py
印刷用マーカ
- https://e-learn01.mars.kanazawa-it.ac.jp/moodle/mod/resource/view.php?id=37352
以下は付録で実習1には直接関係がないので,教員から指示があれば読む.
付録
補足情報なのでウェブカメラのキャリブレーションをする必要はありません.本当は実習に入れたいのですが,時間の関係で割愛しました.
①OpenManipulator-X座標軸
ROSの座標軸では赤,緑,青の順にx,y,zに対応している。

以下の画像は、OpenManipulator-Xのエンドエフェクタ座標軸。

②ウェブカメラのキャリブレーション
目的
ar_track_alvarを使用する場合,カメラのイメージトピック(/camera_raw), 内部パラメータトピック(/camera_info)が必要となる.webカメラ(Logicool)をROSで扱う場合,内部パラメータトピック(/camera_info)の値が欠損している.つまり,内部パラメータを自分たちでキャリブレーションを通して情報付与する必要がある
手順
1. キャリブレーションパッケージのインストール
sudo apt install -y ros-noetic-camera-calibration
sudo apt install -y ros-noetic-image-proc
2. チェッカーボードの印刷
- チェッカーボードを保存してA4で印刷する.
- チェックの交点が8×6個,一辺が0.025mの格子が描画された紙だったらOK
(OpenManipulator No.10機体には既に,私が印刷したチェッカーボードを置いてある)
3. 測定
sudo chmod +x /dev/videoxxx
rosrun usb_cam usb_cam_node _video_devide:=/dev/videoxxx
rosrun camera_calibration camearcalibrator.py --size 8x6 --square 0.025 image:=/yyy
3つ目のターミナルを実行したら下の写真のようなウィンドウが開きます
チェッカーボードを色々な見せ方で見せて測定を行ってください
- 上手くキャリブレーションさせるコツ
- 様々な距離で撮る
- 画角隅々まで撮る
- チェッカーボードを斜め等にして撮る
ウィンドウ右にある青い「CALIBRATE」が押せるようになったら測定は十分となり,ボタンを押すとキャリブレーションの計算が始まります
この計算は数分かかります
4. 測定結果と取り出し
/tmp/calibrationdata.tar.gzに 3. の測定結果が保存されています
以下の操作で解答及びファイルのリネームをします
tar -xvzf /tmp/calibrationdata.tar.gz
mv ost.yaml camera.yaml
camera.yamlを開き,以下のように修正します
camera_name: narrow_stereo # この行を
camera_name: camera # このように修正
camera.yamlを/experiment/config/に保存する。
③ARマーカの印刷
3.0cmのマーカを生成する。
rosrun ar_track_alvar createMarker -s 3.0 -p
④プロキシ設定
.bashrc
export http_proxy="http://wwwproxy.kanazawa-it.ac.jp:8080"
export https_proxy="http://wwwproxy.kanazawa-it.ac.jp:8080"
/etc/apt/apt.conf
Acquire::http::Proxy "http://wwwproxy.kanazawa-it.ac.jp:8080";
Acquire::https::Proxy "http://wwwproxy.kanazawa-it.ac.jp:8080";
以上
").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1
").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0
タイトルとURLをコピーしました
コメント