Robotic Knowledge
381 subscribers
242 photos
62 videos
2 files
170 links
دانش و برنامه‌نویسی برای رباتیک
Download Telegram
#کتاب
#Cpp

A Complete Guide to Standard C++ Algorithms

در این کتاب با ارزش الگوریتم‌های استانداری [منظور قسمت‌های کنترلی مانند حلقه‌ها] که در الگوریتم‌های مهندسی پیچیده برای کاربردهای مختلف استفاده می‌شوند، با مثال جمع‌آوری و ارائه شده است.

نویسنده بیان می‌کند که هرجای کد ++C شما یک حلقه ساده وجود دارد، به احتمال زیاد توسط یکی از این الگوریتم‌های استاندار می‌تواند جایگزین شود که علاوه بر سرعت بیشتر و بهینه‌تر بودن، امکان خطا را نیز کاهش میدهد.

https://github.com/HappyCerberus/book-cpp-algorithms

----------
@roboticknowledge
#Cpp
#gnuplot
#Tools

ترسیم کردن داده در زبان ++C براحتی کار مشابه در Python نیست - اونجا شما می‌تونید براحتی از کتابخانه Matplotlib استفاده کنید. برای این مساله یکی از راه حل‌ها استفاده از ابزار کامند لاینی gnu plot هست که به شکل‌های مختلف با pipe کردن دیتا توی محیط command line میتونید خروجی برنامه کامپایل شده ++C رو ترسیم کنید.
در مجموع gnu plot ابزارهای بسیار زیادی در خودش داره که توی سایتش می‌تونید ببینید.
توی تصویر هم براتون چیزی رو که برای تست باهاش ترسیم کردم رو قرار دادم.

—————
@roboticknowledge
#Cpp
#OOP

چنانچه به ++C و برنامه‌نویسی شی گرا یا Object-Oriented Programming در آن علاقه‌مند هستید، در یک تایم خالی این ویدئو را ببینید که تمام مفاهیم و ساختارهای ابتدایی و ضروری را بسیار عالی توضیح داده‌اند و با دانستن‌ و تمرین این ساختار‌های OOP می‌توانید مهارت‌های برنامه‌نویسی ++C خود را بهبود دهید.
https://www.youtube.com/watch?v=wN0x9eZLix4
—————
@roboticknowledge
👏2
#Cpp
#OOP

همواره یکی از راه‌های خیلی خوب حرفه‌ای شدن توی ++C/C دیدن و بررسی کد‌های Functional حرفه‌ای است که پایه‌ی یک محصول mass producted هستند. فیلم زیر سورس کد مهندسی معکوس شده‌ای GTA III رو بررسی می‌کنه و میشه سینتکس‌ها و معماری رایج پیاده‌سازی چنین چیزی رو حتی محدود متوجه شد.

https://www.youtube.com/watch?v=N3KhMOk_6HE

اینجا مثال صرفا بازی بود - یک بازی پیچیده - اما همین داستان توی صنعت هم هست. شما وقتی وارد یک شرکت میشید که محصول اون‌ها نرم‌افزار برای فرضا اتوماسیون یا رباتیک یا اتوموبیل خودران هست، شاید سه ماه اول درگیر درک کدهای موجود اون‌ها بشید و بعد از اون می‌بینید بصورت اتوماتیک ساختار و معماری پیشرفته اون محصول رو یاد گرفتید و طبق همون Design Pattern به کد پایه ویژگی‌ و فانکشن اضافه می‌کنید.
—————
@roboticknowledge
👍8
#Simulink #C #Cpp #Algorithm #CodeGeneration #Python
شبیه‌سازهای مطرح RL همگی از Python استفاده می‌کنند و شما یک ++C/C نویس هستید. تکلیف چیست؟

شاید برای افرادی که از Python برای کار رباتیکی خود استفاده می‌کنند و زیاد از ++C/C در کار خود استفاده نکرده‌اند، پایتون یک بهشت باشد اما برای افرادی که به ++C/C نویسی عادت دارند، نوشتن Python بصورت فراتر از یک اسکریپت ساده عذاب بزرگی خواهد بود از بس که محدودیت دارد این زبان و وقتی قدرت C بزرگ را بدانید متوجه خواهید شد - خصوصا اگر C را از Simulink تولید کنید!
حال تصویر کنید در Isaac Gym یا هر Gym دیگری ربات و محیط شما باید با اسکریپت Python شبیه‌سازی و کنترل شود — که دردناک خواهد بود برای همان دسته توسعه‌دهنگان صنعتی‌تر.
اما خیلی راحت می‌توان الگوریتم را با C نوشت (یا کد C از آن در Simulink تولید کرد) و آن را کامپایل کرد و یک کتابخانه AlgoSDK.so از آن تولید کرد. از اینجا به بعد براحتی می‌نوانید فایل so. کتابخانه C را در اسکریپت مینیمال پایتون خود صدا بزنید:
from ctypes import * #Import ctypes library
libc = CDLL("./AlgoSDK.so") #Load library

—————
@roboticknowledge
👍3👀2🫡2
Robotic Knowledge
#Simulink #C #Cpp #Algorithm #CodeGeneration #Python شبیه‌سازهای مطرح RL همگی از Python استفاده می‌کنند و شما یک ++C/C نویس هستید. تکلیف چیست؟ شاید برای افرادی که از Python برای کار رباتیکی خود استفاده می‌کنند و زیاد از ++C/C در کار خود استفاده نکرده‌اند،…
#Simulink #C #Cpp #Algorithm #CodeGeneration #Python
پایتون در توسعه و پیاده‌سازی الگوریتم کنترلی = SHIT

بسیار افراد متخصص و صاحب موقعیت در آکادمیا دیده‌ام که نمی‌دانند Code Generation چیست و چگونه باید از قابلیت‌های آن استفاده کنند — واقعا نصف عمرشان بر فنا هست حتی بیشتر! در رباتیک واقعی و هر جا که به سیستم امبدد منتهی شود، پایتون یک SHIT است — البته برای افرادی که با ++C/C پیمان قلبی دارند و می‌دانند چقدر قابل هستند!
و وقتی برای آن دسته از افراد مواردی از امکانات Code Generation ارائه می‌کنم، متوجه میشوم حسرت را در نگاهشان که وای از چه نعمتی غافل بودیم. 😎
—————
@roboticknowledge
👍2🤯1🍾1👀1
#Cpp
در ++C می‌توانید متغیرهای پیچیده را به کمک لامبدا فانکشن‌ها براحتی initialize کنید - با این ساختار:
const auto var = [&] { 
return /* some complex code here */;
}(); // call it!

یک مثال مشخص چنین است:
const int myVariable = [&] {
if (bFirstContidion)
return bSecondCondition ? computeFunc(inputParam) : 0;
else
return inputParam * 2;
}(); // call!

که بجای این روش غیربهینه می‌تواند استفاده شود:
int myVariable = 0; // this should be const...

if (bFirstCondition)
myVariable = bSecondCindition ? computeFunc(inputParam) : 0;
else
myVariable = inputParam * 2;

این روش Immediately-invoked function expression یا IIFE نام دارد (منبع). در کدهای حرفه‌ای این ساختار را اگر ببینید، اکنون دیگر درباره آن علامت سوال ندارید!
—————
@roboticknowledge
👍1
Robotic Knowledge
#Cpp در ++C می‌توانید متغیرهای پیچیده را به کمک لامبدا فانکشن‌ها براحتی initialize کنید - با این ساختار: const auto var = [&] { return /* some complex code here */; }(); // call it! یک مثال مشخص چنین است: const int myVariable = [&] { if (bFirstContidion)…
#Cpp
مثال رباتیکی آن در یکی از آموزش‌های moveit2:
// Set a target Pose
auto const target_pose = []{
geometry_msgs::msg::Pose msg;
msg.orientation.w = 1.0;
msg.position.x = 0.28;
msg.position.y = -0.2;
msg.position.z = 0.5;
return msg;
}();
move_group_interface.setPoseTarget(target_pose);

// Create a plan to that target pose
auto const [success, plan] = [&move_group_interface]{
moveit::planning_interface::MoveGroupInterface::Plan msg;
auto const ok = static_cast<bool>(move_group_interface.plan(msg));
return std::make_pair(ok, msg);
}();

متغیر target_pose و جفت [success, plan] به این زیبایی initialize شده‌اند - در نگاه اول شاید کمی سخت باشد، اما در واقع با لامبدا و IIFE خیلی ساده و تمیز شده است.
—————
@roboticknowledge
👍2
Robotic Knowledge
#Simulink #C #Cpp #Algorithm #CodeGeneration #Python شبیه‌سازهای مطرح RL همگی از Python استفاده می‌کنند و شما یک ++C/C نویس هستید. تکلیف چیست؟ شاید برای افرادی که از Python برای کار رباتیکی خود استفاده می‌کنند و زیاد از ++C/C در کار خود استفاده نکرده‌اند،…
#Cpp #C #Python
ابزار pybind11 برای تبدیل کتابخانه ++C به ماژول پایتون

قبلا درباره اینکه روش کلی فراخوانی کد C در پایتون چیست، به ماژول ctypes اشاره کرده بودیم - اما محدودیت‌هایی در استفاده از آن وجود دارد. راه حرفه‌ای‌تری که اخیرا پیدا کرده‌ام - مختص استفاده از کدهای ++C در پایتون و پشتیبان‌کننده OOP موجود در ++C - ابزار pybind11 است:
https://github.com/pybind/pybind11
—————
@roboticknowledge
#Tools
#Cpp
#AnalyticalDynamics
#OptimalControl

کتابخانه‌ای برای ++C و البته بصورت bind شده در Python وجود دارد که مسائل دینامیک چندجسمی را برای شما حل می‌کند. مدل می‌تواند براحتی بصورت URDF در ورودی تعریف شود.

این کتابخانه pinocchio نام دارد:
https://github.com/stack-of-tasks/pinocchio

همچنین این کتابخانه می‌تواند با CasADI که خود کتابخانه کنترل بهینه است نیز کار کند! فکر نکنید ربات‌های Boston Dynamics کنترل بهینه را از هیچ کامل در خود دارند بدون این ابزارها.

پیشروها با این‌ها و امثال این‌ها کارهای بزرگ می‌کنند. متاسفانه سیستم آموزشی کشور ما در قرن پیش مانده است و همین الان در بهترین دانشگاه‌های مملکت معادلات را بصورت اشتباه پیاده و غیر بهینه حل و برای جبران نتایج دست به تغییر دستی نتایج زده می‌شود! در هیچ دوره‌ای به این‌ها اشاره نمی‌کنند چون نمی‌دانند و این‌ها چیزهای مدرن هستند که تفاوت می‌سازند.
—————
@roboticknowledge
👍1🤯1