# D.13  Rotation Shim Controller

nav2\_rotation \_shim\_controller က robot နဲ့ သူရဲ့ပတ်လမ်းကြောင်းသစ် ကြားကကွာခြားချက်ကို အကြမ်း အားဖြင့် စစ်ဆေးပေးခြင်းကို လုပ်ဆောင်ပါတယ်။&#x20;

အကယ်၍ တံခါးဘောင်လို အတွင်းနေရာမျိုးမှာဆိုရင် ၄င်သည် primary\_controller ကို taskတွေကို execute လုပ်ဆောင်ဖို့ request တင်ပေးပါတယ်။&#x20;

အကယ်၍ အပြင်ဘက်မှာဆိုရင်တော့ ဒီcontrollerက ပတ်လမ်းကြောင်းစီကို ဦးတည်ဖို့ robot ကို လှည့်လည် ပေးပါလိမ့်မယ်။  Tolerance အတ္ငင်းမှာဆိုရင်တော့ ဒီ rotation shim controller က primary controller plugin စီသို့ control\_execution ကို pass off လုပ်ဆောင်ပါလိမ့်မယ်။ robot ရဲ့ main plugin က smooth hand off လုပ်ဆောင်ချက်အတွက် ထိန်းချုပ်ဖို့ တာဝန်ယူဆောင်ပါလိမ့်မည်။&#x20;

RotationShimController က အောက်ပါလုပ်ဆောင်ချက်များအတွက် အထူးသင့်တော်ပါတယ်:&#x20;

* Robots သည် differential robot  Omnidirectional robots များကဲ့သို့ နေရာတစ်ခုမှာ လှည့်လည် နိုင်သည်။&#x20;
* &#x20;Rotate လုပ်ရန် ဦးစားပေး လမ်းကြောင်းသစ်တစ်ခု စတင်ဖို့ track လုပ်ဆောင်သောအခါ robotရဲ့ လက်ရှိ ဦးတည်ရာနေရာထက် လမ်းကြောင်းသစ်က သိသိသာသာ ကွဲပြားစွာဉီးတည်နေပါမယ် (သို့) သင့်ရဲ့  controller ကို turning လုပ်သောအခါမှာလည်း tight rotations ခက်ခဲနေတာကို တွေ့ရပါလိမ့်မည်
* &#x20;Planner အသုံးပြုမယ်ဆိုရင် ၄င်းကောင်းက non-kinematically feasible ပါ။ (ဥပမာ - NavFn, Theta\* or Smac 2D ) ။ Feasible planners များဖြစ်တဲ့ Smac Hybrid-A\* နဲ့ State Lattice တို့က တော့ robot ရဲ့ အမှန်တကယ် စတင်ဦးတည်ရာ၊ rotation မလုပ်ဖို့ လိုအပ်ချက်များကို စတင်ရှာဖွေဖို့ လုပ်ဆောင်ကြပါတယ်။

<table><thead><tr><th width="245">Name</th><th width="314">Description</th><th>Type</th><th>Default</th></tr></thead><tbody><tr><td>angular_dist_threshold</td><td>Maximum angular distance, in radians, away from the path heading to trigger rotation until within.</td><td>double</td><td>0.785</td></tr><tr><td>forward_sampling_distance</td><td>Forward distance, in meters, along path to select a sampling point to use to approximate path heading</td><td>double</td><td>0.5</td></tr><tr><td>rotate_to_heading_angular_vel</td><td>Angular rotational velocity, in rad/s, to rotate to the path heading<br></td><td>double</td><td>1.8</td></tr><tr><td>primary_controller</td><td>Internal controller plugin to use for actual control behavior after rotating to heading</td><td>string</td><td>N/A</td></tr><tr><td>max_angular_accel</td><td>Maximum angular acceleration for rotation to heading (rad/s/s)</td><td>double</td><td>3.2</td></tr><tr><td>simulate_ahead_time</td><td>Time in seconds to forward simulate a rotation command to check for collisions. If a collision is found, forwards control back to the primary controller plugin.<br></td><td>double</td><td>1</td></tr></tbody></table>

နမူနာ

```yaml
controller_server:
  ros__parameters:
    use_sim_time: True
    controller_frequency: 20.0
    min_x_velocity_threshold: 0.001
    min_y_velocity_threshold: 0.5
    min_theta_velocity_threshold: 0.001
    progress_checker_plugins: ["progress_checker"] # progress_checker_plugin: "progress_checker" For Humble and older
    goal_checker_plugins: ["goal_checker"]
    controller_plugins: ["FollowPath"]

    progress_checker:
      plugin: "nav2_controller::SimpleProgressChecker"
      required_movement_radius: 0.5
      movement_time_allowance: 10.0
    goal_checker:
      plugin: "nav2_controller::SimpleGoalChecker"
      xy_goal_tolerance: 0.25
      yaw_goal_tolerance: 0.25
      stateful: True
    FollowPath:
      plugin: "nav2_rotation_shim_controller::RotationShimController"
      primary_controller: "nav2_regulated_pure_pursuit_controller::RegulatedPurePursuitController"
      angular_dist_threshold: 0.785
      forward_sampling_distance: 0.5
      rotate_to_heading_angular_vel: 1.8
      max_angular_accel: 3.2
      simulate_ahead_time: 1.0

      # Primary controller params can be placed here below
      # ...
```
