ضبط و بازپخش دادهها در ROS
زمانی که شما در حال اجرای یک برنامه هستید دیتاهایی در حال انتشار بین نودها است. گاهی نیاز دارید تا این دیتاها را تجزیهوتحلیل و یا از آنها در نرمافزار دیگری استفاده نمایید؛ اما نه در زمان اجرای برنامه!؟ بنابراین نیاز دارید تا دیتاها را درجایی ذخیره کنید. در ROS ابزاری وجود دارد که این امکان را در اختیار کاربران قرار میدهد تا بتوانند دیتاهای خود را ذخیره نمایند. Rosbag به شما این امکان را میدهد تا با استفاده از این ابزار، دیتاهای تاپیکها را در یک فایل با پسوند.bag ذخیره نمایید.
بهطور مثال، اگر بخواهیم تمام تایپکهای موجود در زمانی که لاکپشت در حال حرکت است را در یک فایل ذخیره نماییم. مراحل زیر را باید به ترتیب اجرا کنیم:
مرحلهی اول:
ابتدا ROS مستر را اجرا نمایید:
[sourcecode language=”plain”]
roscore
[/sourcecode]
مرحلهی دوم:
نود مربوط به نمایش لاکپشت را اجرا نمایید. در یک ترمینال جدید دستور زیر را وارد نمایید:
[sourcecode language=”plain”]
rosrun turtlesim turtlesim_node
[/sourcecode]
مرحلهی سوم:
نود مربوط به ارسال فرمان سرعت توسط صفحهکلید را در ترمینال جدید اجرا کنید.
[sourcecode language=”plain”]
rosrun turtlesim turtle_teleop_key
[/sourcecode]
خب، الآن میتوانید با باز کردن یک ترمینال جدید و واردکردن دستور rostopic list -v
لیست تمام تاپیکهایی که وجود دارند را ببینید.
در خروجی مشاهده خواهید کرد:
[sourcecode language=”plain”]
Published topics:
* /turtle1/color_sensor [turtlesim/Color] 1 publisher
* /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher
* /rosout [rosgraph_msgs/Log] 2 publishers
* /rosout_agg [rosgraph_msgs/Log] 1 publisher
* /turtle1/pose [turtlesim/Pose] 1 publisher
Subscribed topics:
* /turtle1/cmd_vel [geometry_msgs/Twist] 1 subscriber
* /rosout [rosgraph_msgs/Log] 1 subscriber
[/sourcecode]
مرحلهی چهارم:
حال میخواهیم تا دیتاها را در یک فایل ذخیره نماییم. برای این منظور از دستور زیر استفاده میکنیم:
[sourcecode language=”plain”]
mkdir ~/bagfiles
cd ~/bagfiles
rosbag record -a
[/sourcecode]
دو خط اول به ترتیب دایرکتوری bagfiles را ایجاد میکند و سپس مسیر ترمینال را در آن قرار میدهد. سپس به کمک دستور rosbag
و آپشن record –a
تمام تاپیکهای موجود در فایل ذخیره میشود.
درصورتیکه بخواهید در همین مثال تنها دیتاهای تاپیک خاص مثلاً سرعت و موقعیت را ذخیره نمایید باید از دستور زیر استفاده کنید.
[sourcecode language=”plain”]
rosbag record -O subset /turtle1/cmd_vel /turtle1/pose
[/sourcecode]
حال میخواهیم اطلاعات فایل bag ذخیرهشده خودمان را مشاهده کنیم. برای این منظور باید از دستور کلی زیر استفاده کنید:
[sourcecode language=”plain”]
rosbag info your_bagfile.bag
[/sourcecode]
اما اگر بخواهیم یک فایل bag را اجرا نماییم، از دستور زیر باید استفاده نمود:
[sourcecode language=”plain”]
rosbag play your_bagfile.bag
[/sourcecode]
در دستورات بالا بجای your_bagfile.bag
از نام فایل ذخیرهشده خود استفاده نمایید.
واردکردن rosbag در متلب
معمولاً کار با دادهها و تحلیل آنها در نرمافزار متلب آسانتر و مورد پسندتر است. در متلب این امکان وجود دارد که فایلهای ذخیره شده با پسوند.bag را فراخوانی کنیم. برای این کار به صورت زیر عمل میکنیم.
پس از اینکه دادههای مورد نظر خودتون رو در رآس تولید کردید و اونا رو در یک فایل .bag ذخیره کردید، متلب رو باز کنید و فایل خودتون رو در دایرکتوری اون قرار بدید. (اگر از ماشین مجازی برای رآس استفاده میکنید و متلب رو در ویندوز دارید، میتونید برای انتقال راحت تر فایلهاتون از آموزش اشتراک فایل بین ویندوز و ماشین مجازی استفاده کنید.)
در گام بعد با استفاده از دستور زیر فایل خودتون رو فراخوانی کنید.
[sourcecode language=”plain”]
bag = rosbag(‘your_bagfile.bag’)
[/sourcecode]
در مورد مثال خودمون در صورتی که با اجرای نودهای مربوط به شبیهساز لاکپشت مسیری رو در صفحه رسم کرده باشید و تاپیک موقعیت رو طبق دستورات بالا ذخیره کرده باشید، در متلب نیز میتوانیم این مسیر رو مشاهده کنید. پس از اینکه فایل بگ رو فراخوانی کردید باید اطلاعاتی مشابه به این در خروجی به شما نشون داده بشه.
bag =
BagSelection with properties:
FilePath: your path\...\ your_bagfile.bag'
StartTime: 1.5643e+09
EndTime: 1.5643e+09
NumMessages: 1844
AvailableTopics: [2×۳ table]
AvailableFrames: {0×۱ cell}
MessageList: [1844×۴ table]
با استفاده از دستور زیر میتوانیم یک تاپیک خاص را انتخاب کنیم.
[sourcecode language=”plain”]
bSel = select(bag,’Topic’,’/turtle1/pose’);
[/sourcecode]
در ادامه با استفاده از دستور زیر دادهها را به فرمت استراکچر ذخیره میکنیم.
[sourcecode language=”plain”]
msgStructs = readMessages(bSel,’DataFormat’,’struct’);
[/sourcecode]
دادههای هر آرایه با اشاره به آن قابل دستیابی خواهد بود.
msgStructs{1}
ans =
struct with fields:
MessageType: 'turtlesim/Pose'
X: 5.5444
Y: 5.5444
Theta: 0
LinearVelocity: 0
AngularVelocity: 0
در ادامه میتوانیم با استفاده از دستور زیر مسیر حرکتی که ربات در رآس طی کرده را در متلب رسم کنیم.
[sourcecode language=”plain”]
xPoints = cellfun(@(m) double(m.X),msgStructs);
yPoints = cellfun(@(m) double(m.Y),msgStructs);
plot(xPoints,yPoints)
[/sourcecode]
خروجی مشابه زیر خواهد بود.
مشاهده تغییرات یک داده در طول زمان
فرض کنید بخواهیم تغییرات سرعت بر حسب زمان را ببینیم. ابتدا تاپیک سرعت را انتخاب میکنیم.
[sourcecode language=”plain”]
vel = select(bag,’Topic’,’/turtle1/cmd_vel’);
[/sourcecode]
سپس داده های این تاپیک را میخوانیم.
[sourcecode language=”plain”]
vel_msg = readMessages(vel);
[/sourcecode]
سپس با استفاده از دستور زیر دادههای مورد نظر را انتخاب میکنیم. در مورد مثال حرکت لاکپشت سرعت خطی در راستای محورx و سرعت زاویهای حول محورz را انتخاب میکنیم.
[sourcecode language=”plain”]
ts = timeseries(vel, ‘Linear.X’, ‘Angular.Z’)
[/sourcecode]
برای مشاهده دادهها میتوانید از دستور زیر استفاده کنید.
[sourcecode language=”plain”]
ts.Data
[/sourcecode]
در نهایت میتوانید با استفاده از دستورPlot میتوانید تغییرات پارامترهای مورد نظر رو در طول زمان مشاهده کنید.
[sourcecode language=”plain”]
figure
plot(ts, ‘LineWidth’, 2)
[/sourcecode]