ROS Coding.1.Robot Simulation အတြက္ Robot Model အား စတင္တည္ေဆာက္ျခင္း
ros နဲ႕ ပတ္သက္တဲ့ အေၾကာင္းအရာေတြကိုေတာ့ သူ႕ရဲ႕ official page မွာ ဖတ္နိုင္သလို ဒီလင့္မွာ မွာလည္း ဖတ္နိုင္ပါတယ္။ ဒါကိုေတာ့ all users အားလံုးဖတ္နိုင္ေအာင္ ေရးသားထားေပးတာ ျဖစ္ပါတယ္။
လက္ေတြ႕အျပင္မွာ robot တစ္ရုပ္ကို တည္ေဆာက္ျပီး စမ္းသပ္ျခင္းသည္ ပို၍ စိတ္ဝင္စားစရာေကာင္းျပီး လက္ေတြ႕စမ္းသပ္တဲ့မွဳေပၚမွလည္း အက်ိဳးနဲ႕ အျပစ္မ်ားစြာကို သိရွိရမွာျဖစ္ပါတယ္။ တခ်ိဳ႕ေသာ error မ်ားဟာ လက္ေတြ႕လုပ္မွပဲ ေပၚတတ္ပါတယ္။ သို႕ေသာ္လည္း robot ကို ေလ့လာသူတိုင္းအေနနဲ႕ေတာ့ တကယ့္ robot တစ္ရုပ္ကို လက္ေတြ႕တည္ေဆာက္ဖို႕ဆိုတာက အေတာ္ေလး ေငြကုန္ေၾကးက်ျဖစ္ေစပါတယ္။ ဒီအတြက္ကိုေတာ့ robot operating system မွာ virtual environment နဲ႕ virtual robot တစ္ခုကို တည္ေဆာက္ျပီး simulation ျပဳလုပ္လို႕ရေအာင္ ဖန္တီးေပးထားပါတယ္။ virtual robot ကိုလည္း မိမိမွာ အျပင္မွာ ရွိတဲ့ robot ကို visualization ျပဳလုပ္ဖို႕ရာအတြက္လည္း အသံုးျပဳနိုင္ပါတယ္။ သည့္အတြက္ေၾကာင့္ virtual robot တစ္ခုကုိေတာ့ မျဖစ္မေနတည္ေဆာက္ဖို႕ လိုအပ္ပါတယ္။
Robot ကို တည္ေဆာက္ဖို႕ရာအတြက္ ROS မွာ Unified Robot Description Format (URDF) ကို အသံုးျပီး ၄င္းကို XML tags ေတြနဲ႕ ဖြဲ႕စည္းထားပါတယ္။ robot model တစ္ခုကို တည္ေဆာက္ဖို႕ရန္အတြက္ အရင္ဆံုး ros package တစ္ခုကို စတင္ျပဳလုပ္ဖို႕လိုပါတယ္။ ros package ကို မတည္ေဆာက္ခင္မွာ ros နဲ႕ အလုပ္လုပ္မယ့္ working directory ကို ေအာက္ပါ command ေတြအတိုင္း တည္ေဆာက္ပါမယ္။ ဒီရဲ႕ working directory ထဲမွာပဲ project အတြက္လိုတဲ့ ဖုိင္ေတြ အားလံုးကို တည္ေဆာက္သြားမွာ ျဖစ္ပါတယ္။
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace
$ echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
ဒီ command ေတြ အားလံုး run ျပီးသြားတဲ့ အခ်ိန္မွာ /home/ ဆိုတဲ့ directory ထဲမွာ catkin_ws ဆိုတဲ့ ဖိုင္တစ္ခုေပၚလာပါလိမ့္မယ္။ catkin_ws ထဲမွာေတာ့ CMakeLists.txt ဆိုတဲ့ txt ဖိုင္တစ္ခုပဲ ေပၚေနမွာ ျဖစ္ပါတယ္။ catkin_ws ထဲမွာ build နဲ႕ devel ဆိုတဲ့ file ၂ ခုလိုပါေသးတယ္။ ဒီထဲမွာ ကၽြန္ေတာ္တို႕ ရဲ႕ executable files ေတြကို အဲ့မွာသြားျပီး တည္ေဆာက္မွာျဖစ္ပါတယ္။ catkin_ws ကို ေအာက္ပါ command ေတြနဲ႕ build လုပ္လိုက္ဖို႕ လိုပါတယ္။
$ cd ~/catkin_ws/
$ catkin_make
$ source devel/setup.bash
catkin_make ဆိုတာကေတာ့ build လုပ္လိုက္တာပဲ ျဖစ္ပါတယ္။ ကၽြန္ေတာ္တို႕ package မွာ တစ္ခုခု ေျပာင္းလဲတိုင္း catkin_ws ထဲကိုသြားျပီး build လုပ္ေပးဖို႕ လိုအပ္ပါတယ္။
ဒါေတြျပီးသြားရင္ေတာ့ ros package တစ္ခုကို တည္ေဆာက္ပါမယ္။ ros package ကို ေအာက္ပါ command ေတြအတိုင္း တည္ေဆာက္ပါမယ္။
$ cd catkin_ws
$ cd src
$ catkin_create_pkg myrobot1 std_msgs rospy roscpp
cd catkin_ws နဲ႕ cd src ကေတာ့ ros workspace ရွိတဲ့ directory ကို သြားလိုက္တာပဲ ျဖစ္ပါတယ္။ ျပီးမွ catkin_create_pkg နဲ႕ myrobot1 ဆိုတဲ့ ကြ်န္ေတာ္တို႕ရဲ႕ robot ကို model လုပ္မယ့္ package ကိုတည္ေဆာက္လိုက္ပါတယ္။
$ ls myrobot1
နဲ႕ ၾကည့္လိုက္ရင္ ေအာက္ပါ ဖိုင္ေတြကိုေတြရမွာ ျဖစ္ပါတယ္။
include src CMakeLists.txt package.xml
ဒီမွာ urdf ဆုိတဲ့ folder တစ္ခုကို ထပ္တည္ေဆာက္ပါမယ္။ အဲ့ဒီ folder ထဲမွာ myrobot1.urdf ဆိုတဲ့ urdf document တစ္ခုကို ျပဳလုပ္ျပီး myrobot1.urdf ထဲမွာ ေအာက္ပါ link ထဲက code ေတြ အတိုင္းေရးထည့္ပါမယ္။
<?xml version="1.0"?>
<robot name="myrobot">
<link name="base_link">
<visual>
<geometry>
<box size="0.3 0.2 0.1"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0 0.05"/>
<material name="white">
<color rgba="1 1 1 1"/>
</material>
</visual>
</link>
<link name="wheel_1">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 1.5" xyz="0.1 0.1 0"/>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<joint name="base_to_wheel1" type="fixed">
<parent link="base_link"/>
<child link="wheel_1"/>
<origin xyz="0 0 0"/>
</joint>
<link name="wheel_2">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 1.5" xyz="-0.1 0.1 0"/>
<material name="black"/>
</visual>
</link>
<joint name="base_to_wheel2" type="fixed">
<parent link="base_link"/>
<child link="wheel_2"/>
<origin xyz="0 0 0"/>
</joint>
<link name="wheel_3">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 1.5" xyz="0.1 -0.1 0"/>
<material name="black"/>
</visual>
</link>
<joint name="base_to_wheel3" type="fixed">
<parent link="base_link"/>
<child link="wheel_3"/>
<origin xyz="0 0 0"/>
</joint>
<link name="wheel_4">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 1.5" xyz="-0.1 -0.1 0"/>
<material name="black"/>
</visual>
</link>
<joint name="base_to_wheel4" type="fixed">
<parent link="base_link"/>
<child link="wheel_4"/>
<origin xyz="0 0 0"/>
</joint>
</robot>
အားလံုးေရးထည့္ျပီးျပီ ဆိုတာနဲ႕ ကၽြန္ေတာ္တို႕ ေရးထားတာ မွန္မမွန္ဆိုတာကို ေအာက္ပါအတိုင္း စစ္ၾကည့္ပါမယ္။
$ cd catkin_ws
$ cd src
$ cd myrobot1
$ cd urdf
urdf ဖိုင္ထဲ ေရာက္ေအာင္ ဒီလိုတစ္ဆင့္ခ်င္းသြားနိုင္သလို ေအာက္ပါ command နဲ႕လည္း တစ္ခါတည္းသြားနိုင္ပါေသးတယ္။
$ roscd myrobot1/urdf
$ check_urdf myrobot1.urdf
ဆိုျပီး စစ္လိုက္ပါမယ္။ မွန္ရင္ ေအာက္ပါအတိုင္းေပၚလာပါလိမ့္မယ္။
robot name is: myrobot1
------------- Successfully Parsed XML ---------------------
robot Link: base_link has 4 child (red)
child(1): wheel_1
child(2): wheel_2
child(3): wheel_3
child(4): wheel_4
urdf ဖိုင္ထဲမွာ ဘာေတြေရးထားတယ္ဆိုတာေတာ့ ေနာက္အခန္းေတြမွာ ဆက္လက္ရွင္းျပပါမယ္။