#matlab #collision-detection #bulletphysics #bullet
Вопрос:
Я пытаюсь использовать физическую библиотеку Bullet в MATLAB. Мне нужно выполнить обнаружение столкновений, и поэтому я хочу использовать алгоритм GJK. В MATLAB можно скомпилировать так называемую функцию MEX. С помощью функции MEX можно вызывать свои собственные программы на C или C из командной строки MATLAB, как если бы они были встроенными функциями. Моя проблема в том, что библиотека Bullet очень большая, с большим количеством файлов, функцией заголовка и так далее, и я действительно не знаком с программированием. Я искал более простые реализации и нашел:
https://github.com/ElsevierSoftwareX/SOFTX_2018_38
Это GJK, написанный на C-коде с файлом, который получает нужную функцию MEX. Этот файл выглядит так:
% CLEAR ALL VARIABLES
clearvars
% SELECT OPTIMISATION FLAG - FASTER BUT NOT SUITABLE FOR DEBUGGING
if 0
optflug = '-g'; %#ok<*UNRCH>
else
optflug = '-O';
end
% SELECT SILET COMPILATION MODE.
if 1
silflag = '-silent';
else
silflag = '-v';
end
% TRY COMPILING MEX FILE
fprintf('Compiling mex function... ')
try
mex('../lib/src/openGJK.c',... % Source of openGJK
'-largeArrayDims', ... % Support large arrays
optflug, ... % Compiler flag for debug/optimisation
'-I../lib/include',... % Folder to header files
'-outdir', pwd,... % Ouput directory for writing mex function
'-output', 'openGJK',... % Name of ouput mex file
'-DMATLABDOESMEXSTUFF',... % Define variable for mex function in source files
silflag ) % Silent/verbose flag
% File compiled without errors. Return path and name of mex file
fprintf('completed!n')
fprintf('The following mex file has been generated:')
fprintf('t%sn',[pwd,filesep,'openGJK.',mexext])
catch
% Build failed, refer to documentation
fprintf('nn ERROR DETECTED! Mex file cannot be compiled.n')
fprintf('tFor more information, see ')
fprintf('<a href="http://www.mathworks.com/help/matlab/ref/mex.html">this documentation page</a>.nn')
return
end
Поэтому я попытался сделать то же самое с библиотекой Bullet, но я даже не знаю, какой исходный файл использовать. Я попробовал ‘btBulletCollisionAll.cpp» в папке «src». Но, как я уже сказал, я не очень хорошо знаком с C , и мне интересно, почему существует только много заголовочных файлов. Также мне нужно сообщить MATLAB, где находятся файлы заголовков и как их связать.
Так что в принципе я просто хочу вызвать функцию в MATLAB, как это:
dist = GJK(shapeA,shapeB);
Вот хранилище пуль:
https://github.com/bulletphysics/bullet3
Большое спасибо за вашу помощь
Дополнение: Я не использую SOFTX_2018_38, потому что мне также нужен алгоритм EPA, и я думаю, что библиотека Bullet является эффективной и надежной реализацией.
Комментарии:
1. Вы не можете просто скомпилировать библиотеку, необходимо выполнить некоторые настройки. Все объясняется в документации
2. Эй, обчардон, я знаю, что не могу скомпилировать всю библиотеку сразу. Но было бы полезно знать, какой исходный файл я должен скомпилировать и какие файлы заголовков мне нужно связать для этого, чтобы получить такую функцию:
[dist,simplex] = GJK(shapeA, shapeB)
иpenetrationDepth = EPA(shapeA, shapeB, simplex)
Ответ №1:
Насколько я знаю, файл .mex определяет одну функцию MATLAB. Библиотека, на которую вы указали, похоже, является библиотекой python, поэтому я бы посоветовал вам ознакомиться с руководством по быстрому запуску (88 страниц), использовать его на python, а затем подумать о переносе в MATLAB.
Похоже, вы можете запускать библиотеки python непосредственно в MATLAB
О python, это настолько хорошо освещенная тема, что я не буду пытаться написать здесь что-либо еще, есть множество учебных пособий, которые вы можете найти с помощью быстрого поиска.
Комментарии:
1. Привет @Боб, спасибо за ваш быстрый ответ. Мне было интересно, что оригинал «bulletphysics.org» веб-сайт передает вам tp «pybullet.org». Поэтому я немного сбит с толку, потому что документ, а также краткое руководство по началу работы говорят мне, что он написан на C . Также GitHub показывает, что около 80 процентов кода на C
2. Он написан на C , но для интерфейса python. Вы могли бы перевести весь интерфейс, но это не очень хорошая идея делать это до того, как вы очень хорошо поймете API. Если вы понимаете API, я думаю, вы будете рады сделать свое приложение на python. И даже если вам нужна MATLAB, вы можете создать пользовательский интерфейс из слоя python вместо слоя C . Отказ от ответственности: Я не знаю библиотеку, я даю только общие советы.
3. а, ладно. Я попытался установить pybullet, но у меня ничего не вышло. Похоже, что мне нужен «пип», и я получаю ошибку. Я действительно большой любитель в этих вещах и не знаю, что делать. Я должен работать с MATLAB (работаю над своей бакалаврской диссертацией, поэтому я должен использовать MATLAB). Я даже не знаю, можно ли подключить Python к MATLAB. Но я знаю, что могу использовать функции, реализованные с помощью C , потому что я видел статьи, в которых они их используют. Тем не менее спасибо вам за вашу помощь.
4. Если вы настаиваете, вы можете создать исходный файл C MEX . От вас не должно требоваться использовать какой-либо конкретный инструмент в университете, он предназначен для того, чтобы открывать возможности, а не закрывать их. Но, как я уже сказал, вы создадите функцию только с помощью файла MEX. Удачи тебе в этом.