unassert - encourage reliable programming by writing assertions in productionTakuto Wada
unassert - Encourage Design by Contract (DbC) by writing assertions in production code, and compiling them away from release.
Takuto Wada
2015/11/07 @nodefest Tokkyo 2015
セル生産方式におけるロボットの活用には様々な問題があるが,その一つとして 3 体以上の物体の組み立てが挙げられる.一般に,複数物体を同時に組み立てる際は,対象の部品をそれぞれロボットアームまたは治具でそれぞれ独立に保持することで組み立てを遂行すると考えられる.ただし,この方法ではロボットアームや治具を部品数と同じ数だけ必要とし,部品数が多いほどコスト面や設置スペースの関係で無駄が多くなる.この課題に対して音𣷓らは組み立て対象物に働く接触力等の解析により,治具等で固定されていない対象物が組み立て作業中に運動しにくい状態となる条件を求めた.すなわち,環境中の非把持対象物のロバスト性を考慮して,組み立て作業条件を検討している.本研究ではこの方策に基づいて,複数物体の組み立て作業を単腕マニピュレータで実行することを目的とする.このとき,対象物のロバスト性を考慮することで,仮組状態の複数物体を同時に扱う手法を提案する.作業対象としてパイプジョイントの組み立てを挙げ,簡易な道具を用いることで単腕マニピュレータで複数物体を同時に把持できることを示す.さらに,作業成功率の向上のために RGB-D カメラを用いた物体の位置検出に基づくロボット制御及び動作計画を実装する.
This paper discusses assembly operations using a single manipulator and a parallel gripper to simultaneously
grasp multiple objects and hold the group of temporarily assembled objects. Multiple robots and jigs generally operate
assembly tasks by constraining the target objects mechanically or geometrically to prevent them from moving. It is
necessary to analyze the physical interaction between the objects for such constraints to achieve the tasks with a single
gripper. In this paper, we focus on assembling pipe joints as an example and discuss constraining the motion of the
objects. Our demonstration shows that a simple tool can facilitate holding multiple objects with a single gripper.
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matchingharmonylab
公開URL:https://arxiv.org/pdf/2404.19174
出典:Guilherme Potje, Felipe Cadar, Andre Araujo, Renato Martins, Erickson R. ascimento: XFeat: Accelerated Features for Lightweight Image Matching, Proceedings of the 2024 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR) (2023)
概要:リソース効率に優れた特徴点マッチングのための軽量なアーキテクチャ「XFeat(Accelerated Features)」を提案します。手法は、局所的な特徴点の検出、抽出、マッチングのための畳み込みニューラルネットワークの基本的な設計を再検討します。特に、リソースが限られたデバイス向けに迅速かつ堅牢なアルゴリズムが必要とされるため、解像度を可能な限り高く保ちながら、ネットワークのチャネル数を制限します。さらに、スパース下でのマッチングを選択できる設計となっており、ナビゲーションやARなどのアプリケーションに適しています。XFeatは、高速かつ同等以上の精度を実現し、一般的なラップトップのCPU上でリアルタイムで動作します。
19. WITH CommentTree
(comment_id, bug_id, parent_id, author, comment, depth)
AS (
SELECT *, 0 AS depth FROM Comments
WHERE parent_id IS NULL
UNION ALL
SELECT c.*, ct.depth+1 AS depth FROM CommentTree ct
JOIN Comments c ON ct.comment_id = c.parent_id
)
SELECT * FROM CommentTree WHERE bug_id = 1234;
アンチパターンを用いても良い場合
共通テーブル式(CTE:common table expression)
を使って再帰クエリを書ける場合
53. CREATE TABLE Bugs (
bug_id SERIAL PRIMARY KEY,
date_reported DATE NOT NULL,
summary VARCHAR(80) NOT NULL,
status VARCHAR(10) NOT NULL,
hours NUMERIC(9,2),
INDEX (bug_id),
INDEX (summary),
INDEX (hours),
INDEX (bug_id, date_reported, status)
);
インデックスショットガン(闇雲インデックス)
闇雲にインデックスを定義してしまう
57. CREATE TABLE Bugs (
bug_id SERIAL PRIMARY KEY,
-- 他の列. . .
assigned_to BIGINT UNSIGNED NOT NULL,
hours NUMERIC(9,2) NOT NULL,
FOREIGN KEY (assigned_to) REFERENCES Accounts(account_id)
);
INSERT INTO Bugs (assigned_to, hours) VALUES (-1, -1);
SELECT AVG( hours ) AS average_hours_per_bug FROM Bugs
WHERE hours <> -1;
フィア・オブ・ジ・アンノウン(恐怖のunknown)
NULLを嫌う → おかしなことに
58. 解決策: NULL を一意な値として使う
SELECT * FROM Bugs WHERE assigned_to IS NULL;
SELECT * FROM Bugs WHERE assigned_to IS NOT NULL;
SELECT * FROM Bugs WHERE assigned_to IS NULL OR
assigned_to <> 1;
SELECT * FROM Bugs WHERE assigned_to IS DISTINCT FROM 1;
IS DISTINCT FROM なら
プリペアドステートメント
にも使える!
59. SELECT p.product_id,
MAX(b.date_reported) AS latest,
b.bug_id
FROM Bugs b INNER JOIN BugsProducts p USING (bug_id)
GROUP BY p.product_id;
アンビギュアスグループ(曖昧なグループ)
MAX(date_reported)のbug_idが
返るとは限らない
60. 解決策: 曖昧でない列を使う
SELECT m.product_id, m.latest, MAX(b1.bug_id) AS
latest_bug_id
FROM Bugs b1 INNER JOIN
(SELECT product_id, MAX(date_reported) AS latest
FROM Bugs b2 INNER JOIN BugsProducts USING (bug_id)
GROUP BY product_id) m
ON b1.date_reported = m.latest
GROUP BY m.product_id, m.latest;
相関サブクエリ
導出テーブル
JOIN の使用
などの手段がある
(例は導出テーブル)
61. SELECT * FROM Bugs ORDER BY RAND() LIMIT 1;
ランダムセレクション
非決定性を持つ式によって
ソートを行ってしまう
62. 解決策: 特定の順番に依存しない
SELECT b1.*
FROM Bugs AS b1
INNER JOIN (
SELECT CEIL(RAND() * (SELECT MAX(bug_id) FROM
Bugs)) AS bug_id
) AS b2 ON b1.bug_id >= b2.bug_id
ORDER BY b1.bug_id
LIMIT 1;
様々なテクニック
(例は欠番の穴の後にある番号を取得するSQL)
63. SELECT * FROM Bugs
WHERE description LIKE '%one%';
プアマンズ・サーチエンジン(貧者のサーチエンジン)
あいまい検索に
パターンマッチ述語を使用してしまう
65. SELECT p.product_id,
COUNT(f.bug_id) AS count_fixed,
COUNT(o.bug_id) AS count_open
FROM BugsProducts p
INNER JOIN Bugs f ON p.bug_id = f.bug_id AND f.status = 'FIXED'
INNER JOIN BugsProducts p2 USING (product_id)
INNER JOIN Bugs o ON p2.bug_id = o.bug_id AND o.status = 'OPEN'
WHERE p.product_id = 1
GROUP BY p.product_id;
スパゲッティクエリ
複雑な問題をワンステップで解決
しようとする
66. 解決策: 分割統治を行う
(SELECT p.product_id, 'FIXED' AS status, COUNT(f.bug_id) AS bug_count
FROM BugsProducts p
LEFT OUTER JOIN Bugs f ON p.bug_id = f.bug_id AND f.status = 'FIXED'
WHERE p.product_id = 1
GROUP BY p.product_id)
UNION ALL
(SELECT p.product_id, 'OPEN' AS status, COUNT(o.bug_id) AS bug_count
FROM BugsProducts p
LEFT OUTER JOIN Bugs o ON p.bug_id = o.bug_id AND o.status = 'OPEN'
WHERE p.product_id = 1
GROUP BY p.product_id)
ORDER BY bug_count DESC;
ワンステップずつ解く
必要なら UNION 等
67. SELECT * FROM Bugs;
インプリシットカラム(暗黙の列)
タイプ数を減らしたい欲望に負ける
→不要な列まで取得したり、定義変更
がバグの元になる