Simulator on Unity + AGX Dynamics communicating with ROS
- 油圧ショベル, クローラダンプ, ブルドーザと土砂の挙動を再現したシミュレータである
- Unityを使用する. 物理エンジンはAGX Dynamicsを使用する
- 本シミュレータを実行する場合, Unity, AGX Dynamicsライセンスが必要である
- ROSメッセージを使って本シミュレータの建設機械を制御可能である
- 本シミュレータから建設機械の情報(関節の角度など)を含んだROSメッセージを受信可能である
- ROSメッセージの送受信にROS-TCP-Connectorを使用する
- Unity:2022.3.16f1
- AGX:2.37.3.0(X64 VS2022)
- AGX (Core)
- Particles
- Granular
- Terrain
- Tracks
初回プロジェクト読み込み時に自動的に追加される.
(もしも追加されなかった場合は手動で追加すること)
- AGXUnity: 5.0.1
- ROS-TCP-Connector: 0.7.0
- URDF-Importer: 0.5.2
- UnitySensors, UnitySensorsROS: 開発版
- Unity Hubより, 本プロジェクトファイル(OperaSim-AGX)を追加
- 追加されたプロジェクトのタイトルを押し, Unity Editorで開く
- 建設機械のモデルが表示されていない場合には, プロジェクトウィンドウからAssets/Scenes/MainScene.unityをダブルクリックしてロードする
- Assets/AGXUnity/Plugins/x86_64のフォルダへAGX Dynamicsのライセンスファイルをコピー&ペースト
-
RoboticsタブからROS Settingを開き、ROS TCP Endpointで接続するPCのIPアドレスおよびポート番号を入力する
-
Playボタンを押してシミュレーションを実行
com3_rosで定義している独自のメッセージ型を使用している. メッセージ型の実装ははAssets/RosMessages/msgフォルダ内のソースコードに記載している.
ROS >> Unity
項目 | トピック名 | メッセージ型 | 備考 |
---|---|---|---|
フロント (ブーム, アーム, バケット, 旋回) 動作指令 |
/車体名/front_cmd | com3_ros/msg/JointCmd | 以下の順に指令値を格納すること 0: bucket_joint 1: arm_joint 2: boom_joint 3: swing_joint |
左右クローラへの動作指令 | /車体名/track_cmd | com3_ros/msg/JointCmd | 以下の順に指令値を格納すること 0: left_track 1: right_track |
車両中心の 並進移動速度/回転速度指令 |
/車体名/cmd_vel | Geometry_msg/msg/Twist | - |
非常停止 | /車体名/emg_stop_cmd | std_msgs/msg/Bool | true: その場で停止 |
Unity >> ROS
項目 | トピック名 | メッセージ型 | 備考 |
---|---|---|---|
各関節の角度, 角速度 | /車体名/joint_state | sensor_msgs/msg/JointState | 以下の順で情報が格納される 0: bucket_joint 1: arm_joint 2: boom_joint 3: swing_joint 4: right_track_joint 5: left_track_joint |
ローカル座標系における車両の中心姿勢 | /車体名/odom_pose | nav_msgs/msg/Odometry | - |
グローバル座標(平面直角座標)系における車両の中心姿勢 | /車体名/global_pose | nav_msgs/msg/Odometry | - |
油圧アクチュエータのメイン圧力 | /車体名/main_fluid_pressure | com3_ros/sensor_msgs/FluidPressure | 以下の順で情報が格納される 0: boom_up_main_pressure 1: boom_down_main_pressure 2: arm_crowd_main_pressure 3: arm_dump_main_pressure 4: bucket_crowd_main_pressure 5: bucket_dump_main_pressure 6: swing_right_main_pressure 7: swing_left_main_pressure 8: right_track_forward_main_prs 9: right_track_backward_main_prs 10: "left_track_forward_main_prs 11: left_track_backward_main_prs 12: attachment_a_main_pressure 13: attachment_b_main_pressure 14: assist_a_main_pressure 15: assist_b_main_pressure |
油圧アクチュエータのパイロット圧力 | /車体名/main_fluid_pressure | com3_ros/sensor_msgs/FluidPressure | 以下の順で情報が格納される 0: boom_up_pilot_pressure 1: boom_down_pilot_pressure 2: arm_crowd_pilot_pressure 3: arm_dump_pilot_pressure 4: bucket_crowd_pilot_pressure 5: bucket_dump_pilot_pressure 6: swing_right_pilot_pressure 7: swing_left_pilot_pressure 8: right_track_forward_pilot_prs 9: right_track_backward_pilot_prs 10: "left_track_forward_pilot_prs 11: left_track_backward_pilot_prs 12: attachment_a_pilot_pressure 13: attachment_b_pilot_pressure 14: assist_a_pilot_pressure 15: assist_b_pilot_pressure |
上部構造体の旋回角度 | /車体名/upper_body_rot | sensor_msggs/msg/Imu | - |
バケット内土量 | /車体名/soil_volume | std_msg/msg/Float64 | - |
ROS >> Unity
項目 | トピック名 | メッセージ型 | 備考 |
---|---|---|---|
旋回, ダンプの動作指令 | /車体名/rot_dump_cmd | com3_ros/msg/JointCmd | 以下の順で指令値を格納すること 0: rotate_joint 1: dump_joint |
左右クローラへの動作指令 | /車体名/track_cmd | com3_ros/msg/JointCmd | 以下の順で指令値を格納すること 0: right_track 1: left_track |
走行ボリュームの動作指令 | /車体名/track_volume_cmd | com3_ros/msg/JointCmd | 以下の順で指令値を格納すること 0: forward_volume 1: turn_volume それぞれのeffortに-1.0~1.0の値を設定する. |
車両中心の 並進移動速度/回転速度指令 |
/車体名/cmd_vel | Geometry_msg/msg/Twist | - |
非常停止 | /車体名/emg_stop_cmd | std_msgs/msg/Bool | true: その場で停止 |
Unity >> ROS
項目 | トピック名 | メッセージ型 | 備考 |
---|---|---|---|
各関節の角度, 角速度 | /車体名/joint_state | sensor_msgs/msg/JointState | 以下の順で情報が格納される 0: rotate_joint 1: dump_joint 2: right_track_joint 3: left_track_joint |
ローカル座標系における車両の中心姿勢 | /車体名/odom_pose | nav_msgs/msg/Odometry | - |
グローバル座標(平面直角座標)系における車両の中心姿勢 | /車体名/global_pose | nav_msgs/msg/Odometry | - |
油圧アクチュエータのメイン圧力 | /車体名/main_fluid_pressure | com3_ros/sensor_msgs/FluidPressure | - |
油圧アクチュエータのパイロット圧力 | /車体名/main_fluid_pressure | com3_ros/sensor_msgs/FluidPressure | - |
上部構造体の旋回角度 | /車体名/upper_body_rot | sensor_msggs/msg/Imu | - |
バケット内土量 | /車体名/soil_volume | std_msg/msg/Float64 | - |
ROS >> Unity
項目 | トピック名 | メッセージ型 | 備考 |
---|---|---|---|
ブレード (リフト, チルト, アングル) 動作指令 |
/車体名/blade_cmd | com3_ros/msg/JointCmd | 配列に以下の順に指令値を格納すること 0: lift_joint 1: tilt_joint 2: angle_joint |
左右クローラへの動作指令 | /車体名/track_cmd | com3_ros/msg/JointCmd | 配列に以下の順に指令値を格納すること 0: right_track 1: left_track |
車両中心の 並進移動速度/回転速度指令 |
/車体名/cmd_vel | Geometry_msg/msg/Twist | - |
非常停止 | /車体名/emg_stop_cmd | std_msgs/msg/Bool | true: その場で停止 |
Unity >> ROS
項目 | トピック名 | メッセージ型 | 備考 |
---|---|---|---|
各関節の角度, 角速度 | /車体名/joint_state | sensor_msgs/msg/JointState | 以下の順で情報が格納される 0: lift_joint 1: tilt_joint 2: angle_joint 3: right_track_joint 4: left_track_joint |
ローカル座標系における車両の中心姿勢 | /車体名/odom_pose | nav_msgs/msg/Odometry | - |
グローバル座標(平面直角座標)系における車両の中心姿勢 | /車体名/global_pose | nav_msgs/msg/Odometry | - |
油圧アクチュエータのメイン圧力 | /車体名/main_fluid_pressure | com3_ros/sensor_msgs/FluidPressure | 以下の順で情報が格納される 0: lift_up_main_pressure 1: lift_down_main_pressure 2: tilt_forward_main_pressure 3: tilt_back_main_pressure 4: angle_right_main_pressure 5: angle_left_main_pressure |
油圧アクチュエータのパイロット圧力 | /車体名/main_fluid_pressure | com3_ros/sensor_msgs/FluidPressure | 以下の順で情報が格納される 0: lift_up_pilot_pressure 1: lift_down_pilot_pressure 2: tilt_forward_pilot_pressure 3: tilt_back_pilot_pressure 4: angle_right_pilot_pressure 5: angle_left_pilot_pressure |
上部構造体の旋回角度 | /車体名/upper_body_rot | sensor_msggs/msg/Imu | - |
- Pub/Sub方式で通信
- 上記表のトピック名にある「車体名」は建設機械モデルの名称で置き換えること
- より具体的には,各建設機械モデルのルートのゲームオブジェクト名
建設機械モデルはROS通信でROSからの指令によって動作する. 指令には次の3種類がある.
Movement Control Type
項目 | 説明 |
---|---|
Actuator Command | 建設機械の各関節それぞれに対して直接動作指令を行う |
Twist Command | 建設機械の移動速度,旋回速度を指定する |
Volume Command | 建設機械の移動速度,旋回速度を比率(-1.0~1.0)で指定する |
Actuator Commandには次の3種類のオプションがある.
Control Type
項目 | 説明 |
---|---|
Position | 関節の角度の変化量を入力する |
Speed | 関節が移動する角速度を入力する |
Force | 関節が接続しているパーツに対して発生する力を入力する |
建設機械モデルがどのパターンで入力を受け取るか,各モデルのインスペクタで設定できる.
- HierarchyビューでMACHINESに配置されている建設機械モデルを選択
- ???Inputという名前のスクリプトがアタッチされていることを確認する.???には建設機械のモデル名(Excavator, Dumptruck, Bulldozer)が入る
- Movement Control Typeを選択する
- Control Typeを選択する
なお,建設機械モデルごとに下記の入力パターンに対応している. 対応しているパターンについては,具体的なトピック名も記載した.
モデル | パターン | 対応状況 | トピック名 |
---|---|---|---|
油圧ショベル | Actuator Command | 対応 | /車体名/front_cmd /車体名/track_cmd |
油圧ショベル | Twist Command | 対応 | /車体名/cmd_vel |
油圧ショベル | Volume Command | 未対応 | - |
クローラダンプ | Actuator Command | 対応 | /車体名/rot_dump_cmd /車体名/track_cmd |
クローラダンプ | Twist Command | 対応 | /車体名/cmd_vel |
クローラダンプ | Volume Command | 対応 | /車体名/track_volume_cmd |
ブルドーザ | Actuator Command | 対応 | /車体名/blade_cmd /車体名/track_cmd |
ブルドーザ | Twist Command | 対応 | /車体名/cmd_vel |
ブルドーザ | Volume Command | 未対応 | - |