まず最初に断っておきますが、このプロジェクトはカザフスタンUPステーションBの「ROSロボットアーム導入チュートリアル」をベースにしており、初期段階ではそれを再現する「理論から実戦までのロボットアームのビジョン把握」を
行います。コンテンツは段階的な成果の表示と大学院生のキャリアのテクノロジーです。すべてのデータとコードはオープンソースです。そこで、ペンペンさん、もう一度再現します。私が使用しているハードウェアはそれとは異なります。UP マスターは UR5 を使用し、私の研究室は UR3 を使用しています。関連する資料 UR3CB3.12 は以下にリストされています: https://www.universal
-robots . cn/cb3/
[URcap1.05 を使用した UR3 システムの CB3.12 へのアップグレード]
ハードウェアサポート
シリアルナンバー | 名前 | 関数 |
---|---|---|
1 | UR3 ロボットアーム | すべての行動の実行者 |
2 | D435i | 死刑執行人の目 |
3 | Ubuntuディープラーニング環境 | エグゼクティブ思考の脳 |
4 | 平面掴みプラットフォーム | 実験動作環境 |
5 | 6*6 黒と白のチェッカーボード校正ボード | 手の外側のカメラアイのキャリブレーション |
6 | 3x3x3cm 3D プリントの小さな立方体 | アーティファクトアクター |
このコードは、
ROS ロボット アーム エントリ チュートリアル コード バージョン 3.0 をサポートしています。リンク: リンク
: https://pan.baidu.com/s/1KFLQXVWShG5KfroCd6eM0A=8888
抽出コード: 8888
[ROS ロボット アーム エントリ チュートリアル - スモール 5] PPT
リンク: https :/ /pan.baidu.com/s/18ierKnf8OJPPvGn8uOf1hw=8888
抽出コード: 8888
1。概要
[Autolab 初級チュートリアル] ROS ロボット入門
ロボット オペレーティング システム ROS クイック スタート チュートリアル
2. ROS の概要
2.1 ROS の概要
ROS 公式ウェブサイト: http://wiki.ros.org/
オートレイバーのアドレス: http://www.autolabor.com.cn/book/ROSTutorials/
Moveit API: https://moveit.ros.org/documentation/source-code-api/
メロディック: http://docs.ros.org/en/melodic/api/moveit_tutorials/html/index.html
2.2 ROSロボットパッケージ
ros-melodic:git クローン https://github.com/ros-industrial/universal_robot.git
ros-noetic: https://blog.csdn.net/Dawn_yc/article/details/114791755
3. ロボットの URDF モデリング
3.1 URDF の概要
URDF は ROS におけるロボットモデルの記述形式であり、ロボットの剛体の外観、物理的特性、関節の種類などの記述が含まれます。
3.2 ビューモデル
$ check_urdf xxx.urdf xxx.urdf ファイルをチェックしてエラーを見つけます
$ urdf_to_graphiz xxx.urdf
可視化のために urdf ファイルから pdf ファイルを生成します
$ roslaunch ur_description view_ur5.launch ur5 モデルを表示します
3.3 Rviz の設定と保存
roslaunch ur_description view_ur5_with_gripper.launch 展示ur5+robotiq85模型
roslaunch ur_description view_ur5.launch
rviz
rviz の保存パスは次のとおりです。universal_robot/ur_description/cfg/2222.rviz
<?xml version="1.0"?>
<launch>
<include file="$(find ur_description)/launch/ur5_upload.launch"/>
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" >
<param name="use_gui" value="true"/>
</node>
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find ur_description)/cfg/2222.rviz" required="true" />
</launch>
4. Moveit!コア機能の紹介とRvizコントロール
4.1 Moveit の紹介!
MoveIt! は、さまざまな機能を統合したロボット アーム関連のツール セット ソフトウェアです
:
Ø 運動学
Ø 動作計画
Ø 衝突チェック
Ø 3D 認識
Ø 操作
4.2 ロボット ROS パッケージのアーキテクチャ
rosrun moveit_setup_assistant moveit_setup_assistant
urdf モデルをロードして、
ジョイント間に衝突があるかどうかを確認します。
ソルバーを選択し、
基準接続と終了ソルバーを選択し、
関連する姿勢位置を設定し、
平らにしてすべてゼロ
アップ姿勢 0,-1.5708,0-1.5708,0,0
エンドグリッパーを設定する
個人情報を入力し
、いよいよモデルを作成します
モデルを直接インポートする
4.3 コンピュータの設定
moveit 構成後に、対応する Rviz デモがあります。
roslaunch ur5_moveit_config demo.launch
ランダムなターゲット位置、「計画&実行」をクリックすると、対応する位置に移動できます
障害物
グリッパーのデモを追加します
roslaunch ur5_gripper_moveit_config demo.launch
5. Gazebo は実際のロボットをシミュレートまたは制御します
ハイパーターミナル
sudo apt install terminator
5.1 Moveitとコントローラーの接続
使い方
# gazebo仿真中控制机器人
roslaunch ur_gazebo ur5.launch
roslaunch ur5_moveit_config ur5_moveit_planning_execution.launch sim:=true
roslaunch ur5_moveit_config moveit_rviz.launch config:=true
# 控制真实UR5机器人
一键启动:
roslaunch ur_planning start_ur5.launch
分开启动:
roslaunch ur_modern_driver ur5_bringup.launch
roslaunch ur5_moveit_config ur5_moveit_planning_execution.launch
roslaunch ur5_moveit_config moveit_rviz.launch config:=true
# rviz 仅作可视化显示
roslaunch ur5_moveit_config demo.launch
rosrun ur_planning moveitServer.py
5.2 ガゼボシミュレーション
5.3 実機 UR5 ロボットの制御
ワンボタンスタート:
roslaunch ur_planning start_ur5.launch
個別に開始します。
roslaunch ur_modern_driver ur5_bringup.launch
roslaunch ur5_moveit_config ur5_moveit_planning_execution.launch
roslaunch ur5_moveit_config moveit_rviz.launch config:=true
6. Moveit の基本 (Python)
6.1 Moveit! レビュー
6.2 関節腔の動き
Python に moveit_commander をインストールする
sudo apt-get update
sudo apt-get install ros-melodic-moveit-commander
# 关节规划,输入6个关节角度(单位:弧度)
def move_j(self, joint_configuration=None,a=1,v=1):
# 设置机械臂的目标位置,使用六轴的位置数据进行描述(单位:弧度)
if joint_configuration==None:
joint_configuration = [0, -1.5707, 0, -1.5707, 0, 0]
self.arm.set_max_acceleration_scaling_factor(a)
self.arm.set_max_velocity_scaling_factor(v)
self.arm.set_joint_value_target(joint_configuration)
rospy.loginfo("move_j:"+str(joint_configuration))
self.arm.go()
rospy.sleep(1)
# 空间规划,输入xyzRPY
def move_p(self, tool_configuration=None,a=1,v=1):
if tool_configuration==None:
tool_configuration = [0.3,0,0.3,0,-np.pi/2,0]
self.arm.set_max_acceleration_scaling_factor(a)
self.arm.set_max_velocity_scaling_factor(v)
target_pose = PoseStamped()
target_pose.header.frame_id = self.reference_frame
target_pose.header.stamp = rospy.Time.now()
target_pose.pose.position.x = tool_configuration[0]
target_pose.pose.position.y = tool_configuration[1]
target_pose.pose.position.z = tool_configuration[2]
q = quaternion_from_euler(tool_configuration[3],tool_configuration[4],tool_configuration[5])
target_pose.pose.orientation.x = q[0]
target_pose.pose.orientation.y = q[1]
target_pose.pose.orientation.z = q[2]
target_pose.pose.orientation.w = q[3]
self.arm.set_start_state_to_current_state()
self.arm.set_pose_target(target_pose, self.end_effector_link)
rospy.loginfo("move_p:" + str(tool_configuration))
traj = self.arm.plan()
self.arm.execute(traj)
rospy.sleep(1)
6.3 デカルト空間の運動
# 空间直线运动,输入(x,y,z,R,P,Y,x2,y2,z2,R2,...)
# 默认仅执行一个点位,可以选择传入多个点位
def move_l(self, tool_configuration,waypoints_number=1,a=0.5,v=0.5):
if tool_configuration==None:
tool_configuration = [0.3,0,0.3,0,-np.pi/2,0]
self.arm.set_max_acceleration_scaling_factor(a)
self.arm.set_max_velocity_scaling_factor(v)
# 设置路点
waypoints = []
for i in range(waypoints_number):
target_pose = PoseStamped()
target_pose.header.frame_id = self.reference_frame
target_pose.header.stamp = rospy.Time.now()
target_pose.pose.position.x = tool_configuration[6*i+0]
target_pose.pose.position.y = tool_configuration[6*i+1]
target_pose.pose.position.z = tool_configuration[6*i+2]
q = quaternion_from_euler(tool_configuration[6*i+3],tool_configuration[6*i+4],tool_configuration[6*i+5])
target_pose.pose.orientation.x = q[0]
target_pose.pose.orientation.y = q[1]
target_pose.pose.orientation.z = q[2]
target_pose.pose.orientation.w = q[3]
waypoints.append(target_pose.pose)
rospy.loginfo("move_l:" + str(tool_configuration))
self.arm.set_start_state_to_current_state()
fraction = 0.0 # 路径规划覆盖率
maxtries = 100 # 最大尝试规划次数
attempts = 0 # 已经尝试规划次数
# 设置机器臂当前的状态作为运动初始状态
self.arm.set_start_state_to_current_state()
# 尝试规划一条笛卡尔空间下的路径,依次通过所有路点
while fraction < 1.0 and attempts < maxtries:
(plan, fraction) = self.arm.compute_cartesian_path(
waypoints, # waypoint poses,路点列表
0.001, # eef_step,终端步进值
0.00, # jump_threshold,跳跃阈值
True) # avoid_collisions,避障规划
attempts += 1
if fraction == 1.0:
rospy.loginfo("Path computed successfully. Moving the arm.")
self.arm.execute(plan)
rospy.loginfo("Path execution complete.")
else:
rospy.loginfo(
"Path planning failed with only " + str(fraction) +
" success after " + str(maxtries) + " attempts.")
rospy.sleep(1)
6.4 環境との相互作用
# 在机械臂下方添加一个table,使得机械臂只能够在上半空间进行规划和运动
# 避免碰撞到下方的桌子等其他物体
def set_scene(self):
## set table
self.scene = PlanningSceneInterface()
self.scene_pub = rospy.Publisher('planning_scene', PlanningScene, queue_size=5)
self.colors = dict()
rospy.sleep(1)
table_id = 'table'
self.scene.remove_world_object(table_id)
rospy.sleep(1)
table_size = [2, 2, 0.01]
table_pose = PoseStamped()
table_pose.header.frame_id = self.reference_frame
table_pose.pose.position.x = 0.0
table_pose.pose.position.y = 0.0
table_pose.pose.position.z = -table_size[2]/2 -0.02
table_pose.pose.orientation.w = 1.0
self.scene.add_box(table_id, table_pose, table_size)
self.setColor(table_id, 0.5, 0.5, 0.5, 1.0)
self.sendColors()
7. Moveit Foundation (C++) を使用して制約付きのパス計画を実現する
8. モーションプランニング - Moveit でプランニングアルゴリズムを選択するにはどうすればよいですか?
8.1 パス計画が必要な理由
Ø 障害物回避: テーブルなどのロボットアーム近くの静的物体との衝突を回避し、 (突然近づいてくる) 人
などの動的物体との衝突を回避します
Ø タスクには運動経路に関する要件があります: 溶接などの運動学または力学制約水などが入った
カップを手に取ります。
n 経路計画の分類
Ø 検索に基づく、ダイクストラ、A*、いつでも A*、ARA*、D*
Ø サンプリングに基づく、PRM、RRT、RRT-connect、RRT*、Kinodynamic-
RRT* (力学に準拠)、いつでも RRT*、インフォームド RRT*
Ø 遺伝的アルゴリズム、アリのコロニー アルゴリズムなどのインテリジェント アルゴリズム
サンプリング ベースの経路計画アルゴリズム
Ø 基礎知識: 完全な導入: 時間が無限のときに解決策が見つかります。
Ø PRM: 1. n 点をランダムにサンプリングして形成 図 2. グラフに基づく検索
Ø RRT: ランダム ツリー、非最適解の高速検索、near クエリでは、kdtree およびその他のデータ構造を使用して、ノード
内で最も近いノードを迅速に見つけることができます。ツリー
Ø RRT-connect: 双方向に拡張された RRT、スタートとゴールから同時に展開、検索速度が比較的
速い、ros-moveit のデフォルト アルゴリズム
Ø RRT*: 2 つの改善が行われ、1 つはルールの変更です。新しいノードをツリーに接続するため、もう 1 つは
検索
8.2 経路計画アルゴリズムの選択方法
- リヴィズ
- Moveit_setup_assistant
- プログラムの中で
9. 視覚的障害物の回避
9.1 はじめに
9.2 公式デモ
Ø ラスターマップの生成に必要な点群/深度マップ入力は 1 つだけです。
$ roslaunch moveit_tutorials obstacle_avoidance_demo.launch
Ø グリッドマップから円柱状の障害物を生成可能
$ roslaunch moveit_tutorials detect_and_add_cylinder_collision_object_demo.launch
(注: このステートメントを実行するときは、前のコマンドを閉じる必要があります)
関数パッケージ:
https://github.com/ros-planning/moveit_tutorials
https://github.com/ros-planning/panda_moveit_config
9.3 実際の戦闘
roslaunch ur5_moveit_config demo_with_obstacle_avoidance.launch
主な手順
Ø 1. カメラ ros プログラムを開始します。
$ sudo apt-get install ros-melodic-realsense2-camera
$ sudo apt-get install ros-melodic-realsense2-description
$ roslaunch realsense2_camera demo_pointcloud.launch
Ø 2. moveit 設定ファイルを変更します
(1) xxx_moveit_config/config/sensors_kinect_pointcloud.yaml の point_cloud_topic を
自分のカメラの点群によって公開されるトピックに変更します
(2) または xxx_moveit_config/config/sensors_kinect_ Depthmap.yaml の image_topic を変更します
独自のカメラ深度マップによって公開されるトピックになります
Ø 3 (オプション) グリッド解像度 octomap_resolution などの視覚障害物回避パラメーターを変更します。
Ø 4 (オプション) 解像度、更新頻度などのカメラ パラメーターを変更します。
Ø 5マニピュレータのベース座標を基準としたカメラのポーズをパブリッシュします。
<node pkg="tf2_ros" type="static_transform_publisher"
name="camera_to_robot" args="0.72032458 -0.21936176 0.90925255
0.98422218 0.0969083 -0.04779138 0.14011233 camera_color_optical_frame
world" />
roslaunch ur5_moveit_config demo_with_obstacle_avoidance.launch
参考 https://blog.csdn.net/ssw_1990/article/details/104053041
参考 https://blog.csdn.net/ssw_1990/article/details/104053041
10. ROS とディープラーニング
10.1 はじめに
ROS-ムーブイット!
ROS-melodic以及之前版本Moveit!默认使用python2.7
ROS-noetic以及ROS2支持python3
ディープラーニング
ディープラーニングはpython3を使用しており、一般的にディープラーニングは仮想環境で環境を構築する必要があります
。
10.2 実戦
n ROS と Anaconda の共存
Ø 1. ROS のワンクリックインストール
$ wget http://fishros.com/install -O fishros && bash fishros
Ø 2. anacondaをインストールする
https://blog.csdn.net/KIK9973/article/details/118772450
ubuntuバージョンに対応するanacondaインストールチュートリアルをBaiduで検索してください
Ø 3. anacondaで仮想環境を作成します
conda create -n YOUR_ENV_NAME
pyhton=3.7
Ø 4. 仮想環境にrosライブラリをインストールする
$ conda activate
$ pip install rospkg/rospy
注: 仮想環境であるかどうかに関係なく、rospkg がインストールされていれば、rospy、std_msgs などのros パッケージが見つかり、トピック通信およびサービス通信を行うことができます
。
. moveit 関数をサーバーにカプセル化する (講義 6 - Moveit Basic と Python/ros サービスの通信)
$ rosrun ur_planning moveitServer.py
Ø 6. 環境内のスクリプトにクライアントを記述し、サービス通信でmoveit関数に接続する
11. ROS-Moveit に基づく 6-DOF ビジュアルキャプチャを実現
11.1 視覚的な把握
- 平面キャプチャ
Ø Cornell データセット: 1,035 RGBD 画像、8,019 ラベル
Ø Jacquard データセット: 54K RGBD 画像、110 万ラベル
Ø 古典的な平面キャプチャ アルゴリズム: GGCNN[1]、GRCNN[2]、
Swin-Transformer[3] ]
GraspNet-1Billion データセットを取得するための 6 つの自由度
11. システム枠組みの設計
n 動作計画
Ø 機能:アルゴリズムによって指定された
位置および姿勢に到達する
Ø 経路計画:現在位置
から予想位置まで
衝突のない軌道を計画する
n ハンドアイキャリブレーションØ 機能:
ロボット座標系
間の関係を取得するとカメラ座標系
Ø 効果: 現在使用可能 誤差は ±5mm 以内を達成
11.3 クロール実験
n 把握力[6] 単一物体把握実験
把握アイテムリスト:
合計 11 個: 1. リンゴ 2. バナナ 3. 懐中電灯 4. 野球 5. 靴ブラシ
6. バドミントンボックス 7. ラジオ 8. ダウンジャケットクリーナー
9. 小白い靴クリーナー 10. U ディスク 11. リモコン
11.3 クロール実験
n Graspness[6] 複雑なシーンの連続把持実験
Ø 結論: 他のアルゴリズムと比較して、把持[6] の把持姿勢予測結果はより正確;
ほとんどの小さな物体や背景と同じ色の物体でも把持を検出できます。 、堅牢性がより強力です。
Ø 既存の問題:
l 物体が「平ら」すぎて高さが低いと、把握姿勢の検出が困難
l 把握プロセス中に他の物体との衝突が発生する可能性がある