برای دریافت داده های لیزر در ROS شما باید با استفاده از متود کالبک موجود دیتاها را دریافت و سپس متناسب با روشی مانع را پیدا کنید. ابتدایی ترین راه برای تشخیص مانع این است که با کمک یک حلقه که بر روی تمام مقادیر آرایه موجود حرکت می کند، بررسی شود تا فاصله ای که لیزر میدهد از بیشترین فاصله ی سنسور، کمتر است و یا خیر. در صورتی که فاصله کمتر باشد پس مانعی دیده شده است. عموما موانع با روش های مختلفی تشخیص داده شده و دسته بندی می شوند. برای تشخیص مانع بر اساس الگوریتم های پیشرفته می توانید به مقالات متعددی که وجود دارند رجوع نمایید.(برای نمونه اینجا).
پ.ن : تاپیک SCAN شامل اطلاعات مربوط به حسگر لیزری است. یکی از این اطلاعات آرایه از فاصله ها هست. هر مقدار از این آرایه فاصله ربات تا مانع است که متناسب با یک زاویه است. در صورتیکه مانعی نباشد این مقدار INF (بیشترین فاصله ای که سنسور تشخیص می دهد) است.
ROS_INFO(“Stange gefunden here mit Abstand:%f”, scan->ranges[i]);
Abstand = scan->ranges[i];
}
}
}
و من فکر می کردم که دارم فاصله و زاویه رو درست تشخیص میدم. اما استاد من گفت که این غلطه. و i نمی تونه صفر باشه (که درست هم میگه یه مقدار مینیموم داره که البته بعد از publish شدن node به من کلا همون عدد صفر رو میده) ولی من الان هر کاری می کنم نمی تونم این قسمت کد رو بنویسم. ممنون میشم اگه بتونین من رو بیشتر راهنمایی بکنین
حسگرهای لیزری معمولا محیط را ۹۰، ۱۸۰، ۲۷۰ و ۳۶۰ درجه با رزولوشن های مختلف ۱ درجه، ۰٫۵ درجه و ۰٫۲۵ درجه پویش می کنند. حسگر شما از کدام یک این انواع است؟
مقدار i زاویه نیست!!! مثلا در صورتی که شما لیزر اسکنری داشته باشد که ۱۸۰ درجه از محیط را با رزولوشن ۰٫۲۵ درجه پویش کند در این صورت آرایه ای با طول ۷۲۰ خواهید داشت و فاصله در زاویه ی ۱۸۰ درجه به صورت ranges[719] تعیین می شود.
در رابطه با این صحبتتون ” i نمی تونه صفر باشه ” باید عرض کنم که i می تواند صفر باشد چون اولین عضو ارایه را مشخص می کند، با توجه به تعریفی که در پیام مربوط به لیزر وجود دارد، زاویه شروع لیزر برابر است با angle_min که برابر با ranges[0] است. اطلاعات بیشتر در رابطه با پیام لیزر اسکنر را می توانید در اینجا مشاهده کنید
همچنین در فایل پیوست یک نمونه کالبک برای مثال شما اماده شده است.
فریدون جعفری
سلام وقت بخیر
برای دریافت داده های لیزر در ROS شما باید با استفاده از متود کالبک موجود دیتاها را دریافت و سپس متناسب با روشی مانع را پیدا کنید. ابتدایی ترین راه برای تشخیص مانع این است که با کمک یک حلقه که بر روی تمام مقادیر آرایه موجود حرکت می کند، بررسی شود تا فاصله ای که لیزر میدهد از بیشترین فاصله ی سنسور، کمتر است و یا خیر. در صورتی که فاصله کمتر باشد پس مانعی دیده شده است. عموما موانع با روش های مختلفی تشخیص داده شده و دسته بندی می شوند. برای تشخیص مانع بر اساس الگوریتم های پیشرفته می توانید به مقالات متعددی که وجود دارند رجوع نمایید.(برای نمونه اینجا).
پ.ن : تاپیک SCAN شامل اطلاعات مربوط به حسگر لیزری است. یکی از این اطلاعات آرایه از فاصله ها هست. هر مقدار از این آرایه فاصله ربات تا مانع است که متناسب با یک زاویه است. در صورتیکه مانعی نباشد این مقدار INF (بیشترین فاصله ای که سنسور تشخیص می دهد) است.
موفق باشید.
Marjan
واقعا ممنونم از جوابتون. البته تا اینجاشو می دونستم. اینهایی که شما فرمودین جزو موضوعات مهم هستش. کد من بصورت زیره:
void chatterCallback(const sensor_msgs::LaserScan::ConstPtr& scan)
{
//ROS_INFO(“here we are: chatterCallback……”);
for(int i = 0; i<scan->ranges.size(); i++)
{
if(scan->ranges[i] < scan->range_max)
{
ROS_INFO(“Stange gefunden here in Winkel:%d”, i);
phi = i;
ROS_INFO(“Stange gefunden here mit Abstand:%f”, scan->ranges[i]);
Abstand = scan->ranges[i];
}
}
}
و من فکر می کردم که دارم فاصله و زاویه رو درست تشخیص میدم. اما استاد من گفت که این غلطه. و i نمی تونه صفر باشه (که درست هم میگه یه مقدار مینیموم داره که البته بعد از publish شدن node به من کلا همون عدد صفر رو میده) ولی من الان هر کاری می کنم نمی تونم این قسمت کد رو بنویسم. ممنون میشم اگه بتونین من رو بیشتر راهنمایی بکنین
فریدون جعفری
سلام وقتتون بخیر
حسگرهای لیزری معمولا محیط را ۹۰، ۱۸۰، ۲۷۰ و ۳۶۰ درجه با رزولوشن های مختلف ۱ درجه، ۰٫۵ درجه و ۰٫۲۵ درجه پویش می کنند. حسگر شما از کدام یک این انواع است؟
مقدار i زاویه نیست!!! مثلا در صورتی که شما لیزر اسکنری داشته باشد که ۱۸۰ درجه از محیط را با رزولوشن ۰٫۲۵ درجه پویش کند در این صورت آرایه ای با طول ۷۲۰ خواهید داشت و فاصله در زاویه ی ۱۸۰ درجه به صورت ranges[719] تعیین می شود.
در رابطه با این صحبتتون ” i نمی تونه صفر باشه ” باید عرض کنم که i می تواند صفر باشد چون اولین عضو ارایه را مشخص می کند، با توجه به تعریفی که در پیام مربوط به لیزر وجود دارد، زاویه شروع لیزر برابر است با angle_min که برابر با ranges[0] است. اطلاعات بیشتر در رابطه با پیام لیزر اسکنر را می توانید در اینجا مشاهده کنید
همچنین در فایل پیوست یک نمونه کالبک برای مثال شما اماده شده است.
دانلود فایل پیوست