roboforum.ru

Технический форум по робототехнике.

Cyclops(Циклоп) mini-ATX робот

Наше хобби — конструировать и программировать.
Демонстрация готовых роботов и устройств построенных своими руками.

Re: Cyclops(Циклоп) mini-ATX робот

Сообщение milk3d » 16 авг 2012, 05:01

Привет всем!
Недавно приступил с созданию автономной части программы для робота, ну или по крайне мере начал над ней думать.
Хочу расширить основную С++ программу каким нить скриптовым языком. У вот мои претенденты:
    Python
    JavaScript(V8)
    Lua
    Ruby
Я больше склоняюсь к JavaSctipt, так как JS довольна популярный язык программирования, и я довольно хорошо с ним знаком. Но проблема в том, что он не имеет практически ни каких модулей например как Python (включая OpenCV).
Было бы интересно выслушать ваше мнение по поводу какой язык использовать.
Спасибо
Аватара пользователя
milk3d
 
Сообщения: 25
Зарегистрирован: 20 май 2009, 00:54
Откуда: Ставрополь
прог. языки: С++, PHP, JavaScript

Re: Cyclops(Циклоп) mini-ATX робот

Сообщение =DeaD= » 16 авг 2012, 05:31

JS вроде надо сразу в аутсайдеры.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Cyclops(Циклоп) mini-ATX робот

Сообщение Angel71 » 16 авг 2012, 06:08

js очень спорный выбор. сначала я бы поставил вопрос немного иначе. зачем это всё нужно? использовать интерпретатор или аккуратненько в укромное место положить компилятор и при необходимости использовать (откомпилировал, запустил)? или поглубже копнуть в сторону динамического/метапрограммирования?
мог бы порекомендовать c#, но .net слегка коварный (как минимум проблемы с мультиплатфоренностью) и его нет в вашем списке, т.е. не факт, что с ним знакомы. а так возможности у c#/.net достаточно впечатляющие. у питона и явы насколько я знаю возможности не сильно отличаются, небольшой +- в деталях и подходах.
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: Cyclops(Циклоп) mini-ATX робот

Сообщение milk3d » 16 авг 2012, 07:57

Angel71 писал(а):сначала я бы поставил вопрос немного иначе. зачем это всё нужно?

Я ставлю перед собой задачу максимально снизить сложность и время разработки программ для робота, а так же их передачи с компьютера пользователя на робота, и их запуск. По моему мнению использование интерпретатора на роботе может дать нам все это. Например, для того что бы написать простой скрипт на JS не нужно ни каких специальных программ на компьютере пользователя, достаточно открыть блокнот. Запуск скрипта тоже не требует ни каких усилий и к тому же не даже не нужно перезагружать основную программу, что берет время. Так же меня прельщает возможность изменять программу во время ее исполнения без особого труда(ну это на будущее).

Angel71 писал(а):использовать интерпретатор или аккуратненько в укромное место положить компилятор и при необходимости использовать (откомпилировал, запустил)? или поглубже копнуть в сторону динамического/метапрограммирования?

Я забыл про это метод, думаю он может пригодиться.

=DeaD= писал(а):JS вроде надо сразу в аутсайдеры.

Какой вы считаете наиболее подходящим?
Аватара пользователя
milk3d
 
Сообщения: 25
Зарегистрирован: 20 май 2009, 00:54
Откуда: Ставрополь
прог. языки: С++, PHP, JavaScript

Re: Cyclops(Циклоп) mini-ATX робот

Сообщение =DeaD= » 16 авг 2012, 12:35

Из оставшихся - не знаю, вроде все 3 как-то в робототехнике используются. Надо смотреть уже конкретные задачи. А вот JS не видел в робототехнических проектах.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Cyclops(Циклоп) mini-ATX робот

Сообщение Angel71 » 16 авг 2012, 21:04

про снизить сложность совсем не понял :pardon: или фигня какая-то или я ещё не полностью проснулся и не проникся затеей. время разработки пардон, это в общем случае затея ни о чём. запускаю удалённый рабочий стол, запускаю студию, выбираю проект и запускаю приложение. начинаю тестировать какой-то там новый код, с чего-то там (а хоть с ик пульта) посылаю команду проехать вперёд и потом повернуть. и о ужас, при при повороте мигает не левым, а правым светодиодиком. упс. ставлю бряк, допустим на ф-и получения команд от пульта и на пульте опять клацаю повернуть. и смотрю где тупанул, при получении команд не так код распознал, в коде "мигать" перепутал левый светодиодик с правым или вообще в коде всё правильно, а это при сборке светодиодики местами поменял. что делать, что делать? не перезапускать же программу, там данных с гипотетических датчиков уже прилично накопилось. придётся в коде просто поменять левый с правым, а нужный код всего через несколько строчек. переписал пару строк, нажал f5 и любуешся, как он нужным светодиодиком мигает. силу компиляции на лету без перезапуска приложения уже чуствуете? на всякий другой пример. вот не знаете какие коды с пульта идут, вы этот пульт вообще первый раз в руки взяли. у вас в коде уже есть ф-я обработки команд с пульта, но она пустая. поставили бряк на первой строчке и клац по пультику. "зашли" в ф-ю и начинаете строчка за строчкой код писать и дебаггером командовать "а ну-ка выполни следующую строчку". посмотрели, какие коды каким кнопкам соответствуют и нужный код написали. эксепшин замаячил или компилятор код не смог переварить? вы об этом непременно узнаете и программа не вылетет - просто пока не пофиксите не сможете продолжить. и всё без всяких ненужных выводов нужных данных куда-то там в файлы или ещё куда, что бы их потом как-то просмотреть, затем переписать код, переписать его на вашего робота и т.д. а теперь вопрос с подвохом. у вас интерпретатор на роботе, а вы код ваяете на своёт ноуте, планшете или настольном компе. и каким чудным образом вы будете на этом js код отлаживать? в блокноте? аха. каждый раз смотреть, допустим логи в текстовых файлах с робота? мило. код логирования ещё нужно написать, а может так статься, что этот код в итоге будет или чуть ли не больше всего остального кода или в него будет далеко не всё записываться. не говоря уже о том, что посмотреть значения нужных переменных в определённый момент времени будет мягко говоря затруднительно. тут много вариантов, как можно всё это решить и много моментов, на которых можно лоб расшибить. а с подвохом вопрос, т.к. js js`у рознь.
:roll: к чему же это я про одновременную отладку и написание кода упоминал? :crazy: а, точно! кто сказал, что только студия может на лету текстик в код волшебно превращать или заменять один код другим? ваша программа может таким же чудным образом на лету сама себя менять или динамически подгружаемый плагинчик или вообще другое приложение. запустили на своём роботе программу, а на основной машине клиента из папочки, которая на роботе. и вуаля, сидите и правите код, а ваша софтина на роботе его как нужно переваривает.
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: Cyclops(Циклоп) mini-ATX робот

Сообщение AndreiSk » 16 авг 2012, 21:08

Дополняя предложение Angel71,
можно написать в блокноте файл c#.
А дальше откомпилировать его в памяти
и выполнить. При этом компилятор прятать не надо,
он в .net framework уже есть (в 3.5 точно есть - проверено).
Установка Visual Studio на конечной машине не требуется :wink:
Аватара пользователя
AndreiSk
 
Сообщения: 2639
Зарегистрирован: 23 апр 2009, 17:03
Откуда: Москва, Самара
прог. языки: C#

Re: Cyclops(Циклоп) mini-ATX робот

Сообщение Angel71 » 16 авг 2012, 21:55

аха, это из той же оперы. в памяти насколько я помню не компилит (создаётся временный файл на диске, просто всё немного спрятано для удобства), но это кардинально ничего не меняет. можно так:
Код: Выделить всёРазвернуть
/* 
@echo off && cls
set WinDirNet=%WinDir%\Microsoft.NET\Framework
IF EXIST "%WinDirNet%\v2.0.50727\csc.exe" set csc="%WinDirNet%\v2.0.50727\csc.exe"
IF EXIST "%WinDirNet%\v3.5\csc.exe" set csc="%WinDirNet%\v3.5\csc.exe"
IF EXIST "%WinDirNet%\v4.0.30319\csc.exe" set csc="%WinDirNet%\v4.0.30319\csc.exe"
%csc% /nologo /out:"%~0.exe" %0
"%~0.exe"
del "%~0.exe"
exit
*/

class HelloWorld
{
static void Main()
{
System.Console.WriteLine("Hello, World!\r\nI am at " + System.Environment.Version);
System.Console.ReadLine();
}
}

или так:
Код: Выделить всёРазвернуть
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using Microsoft.CSharp;

namespace ConsoleCompiler
{
   internal class Program
   {
     private static void Main(string[] args)
     {
       // Source code для компиляции
       string source =
       @"
namespace Foo
{
   public class Bar
   {
     static void Main(string[] args)
     {
       Bar.SayHello();
     }

     public static void SayHello()
     {
       System.Console.WriteLine(""Hello World"");
     }
   }
}
       ";

       // Настройки компиляции
       Dictionary<string, string> providerOptions = new Dictionary<string, string>
         {
           {"CompilerVersion", "v3.5"}
         };
       CSharpCodeProvider provider = new CSharpCodeProvider(providerOptions);

       CompilerParameters compilerParams = new CompilerParameters
         {OutputAssembly = "D:\\Foo.EXE", GenerateExecutable = true};

       // Компиляция
       CompilerResults results = provider.CompileAssemblyFromSource(compilerParams, source);

       // Выводим информацию об ошибках
       Console.WriteLine("Number of Errors: {0}", results.Errors.Count);
       foreach (CompilerError err in results.Errors)
       {
         Console.WriteLine("ERROR {0}", err.ErrorText);
       }
     }
   }
}

или чуть посложней http://www.gotdotnet.ru/blogs/olegaxenow/6520/
для динамической компиляции и генерации кода в дотнете плюшек много и эти примеры далеко не всё демонстрируют. на скорую руку делаете простенький клиент-сервер и жонглируете как хотите. хоть просто перекомпилируйте и затем перезапускайте приложение, хоть на ходу как в студии отлаживайте и изменяйте код. куда тут варианту "блокнот" тягаться с его целым вагончиком постоянных, никому не нужных телодвижений? :pardon: попыхтеть лучше один раз в самом начале, чем потом постоянно и по чуть-чуть.
ещё пример немного на другую тему. допустим гипотетически мне лень каждый раз делать тонны окошечек для конфига в новом приложении. пишу класс (для наглядности уменьшил, вырезав много буковок и сразу предупреждаю весь код дальше слегка корявый, я пока в том проекте эксперементирую)
Код: Выделить всёРазвернуть
    public class Config : INotifyPropertyChanged
    {
        public string workDir = String.Empty;
        public string workDirInFile = "path.txt";
        public string configFile = "config.xml";

        public class App : INotifyPropertyChanged
        {
            public bool launchAtWindowsStartUp = false;
            public bool showMainWindowAtStart = true;
            public string appName { get; set; }

            private bool _b1 = true;
            private bool _b2 = false;

            public bool b1
            {
                get { return _b1; }
                set
                {
                    if (_b1 != b1)
                    {
                        _b1 = value;
                        NotifyPropertyChanged("b1");
                    }
                }
            }

            public bool b2
            {
                get { return _b2; }
                set
                {
                    if (_b2 != b2)
                    {
                        _b2 = value;
                        NotifyPropertyChanged("b2");
                    }
                }
            }
.......
        }
........
    }

нужно всего-то создать один UserControl или Page или Window и в коде прописать несколько десятков или сот строчек незамысловатого кода. при/после создания экземпляра этого UserControl/Page/Window "пробежались" по полям, свойствам,... класса и добавили слева список разделов конфига, а справа при выборе раздела будет отображаться список (или не список, это как угодно наворачивать можно) параметров. для свойств (ещё есть поля, методы,...) это работает примерно так
Код: Выделить всёРазвернуть
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            PropertyInfo[] properties;
            Type myType = Core.instance.config.app.GetType();
            properties = myType.GetProperties();
            foreach (PropertyInfo pi in properties)
            {
                Type t = pi.PropertyType;
                if (t == typeof(System.Boolean))
                {
                    object o = pi.GetValue(Core.instance.config.app, null);
                    CheckBox c = new CheckBox();
                    c.IsChecked = (bool)o;
                    c.Content = pi.Name;
                    listBox1.Items.Add(c);
                }
            }
        }

если не удалил лишнего при копипасте, то будет выглядеть примерно так
1.jpg

если нужны только паблик или только приват "properties = myType.GetProperties();" меняется на что-то в таком духе "properties = myType.GetProperties(BindingFlags.Public|BindingFlags.Instance);"
в реальном приложении нужно с биндигом визуальных элементов к экземпляру класса разумеется. хотите, там же добавляете валидацию ввода в поля. всё надумано, а я слишком ленив? никто не мешает таким образом прикручивать окна настроек для плагинов к основному приложению. нужно будет только передать ссылку на объект "конфиг", а основная программа уже сама разберётся что где и как отобразить, куда в xml`ке конфига на диске добавить нужный раздел и как с ним потом работать. что можно так сгенерировать условно ограничивается только вашей фантазией и навыками. в дополнение ещё есть атрибуты, с помощью которых можно очень сильно влиять на то, что будет генерироваться. указывать заголовки или подсказки для элементов, указывать какие поля что нужно пропустить при генерации, предоставить данные для автозаполнения всяких выпадающих списков и прочего, что должно сериализоваться при сохранении конфига на диск и т.д. а всего-то нужно один раз написать код генератора. да, есть моменты, а где их нет? или можно динамическую оптимизацию сделать, как в том же коде регулярок. это и многое другое уже идёт "из коробки" :) ловкость рук и никакого мошенничества.
:oops: т.е. хочу чего-нить скриптово-интерпретируемого что бы чтот там быстро и удобно разрабатывать, расширять и непонятно как снижать сложность разработки как по мне совсем не аргумент :pardon: не штырит концепция.
п.с. хотите быстрей, легче, лучше,... ? забудьте про c++ :) основная часть проекта должна быть на питоне, яве, шарпе или других .net языков (больше приемлимых кандидатов для общего случая насколько я знаю пока нет). та часть, в которой нужна будет какая-то сверх модная оптимизация выносится в библиотеки (вот их уже хоть на ++, хоть на асме вояйте). опять же в библиотеках всякие opencv и прочий сторонний код. поступать наоборот это очень дорогое удовольствие.
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: Cyclops(Циклоп) mini-ATX робот

Сообщение AndreiSk » 17 авг 2012, 05:19

Продолжая тему поднятую тов. Angel71,
прилагаю законченный проект который компилит в памяти
какую нибудь строку для вычислений и вызывает ее на выполнение
(т.е. это калькулятор, где парсером служит компилятор C#).
Проект для студии 2008
Вместо строки можно компилить конечно любой код
и вызывать сборку на выполнение.
Вложения
TestCalc.zip
(10.71 КиБ) Скачиваний: 0
Аватара пользователя
AndreiSk
 
Сообщения: 2639
Зарегистрирован: 23 апр 2009, 17:03
Откуда: Москва, Самара
прог. языки: C#

Пред.

Вернуться в Наши проекты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13