нужен свежий взгляд

Ответить
Artem.spb

Activity Автор
professor
professor
Сообщения: 3391
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

нужен свежий взгляд

Сообщение Artem.spb »

господа знатоки, нужен свежий взгляд на БД.
я не могу понять, в чём разница, и почему две функции ведёт себя кардинально по-разному.
в принципе, знание и наличие NXT-модуля не требуется, хотя вопрос и связан с ним.

ситуация: есть ультразвуковой датчик, измеряющий расстояние до препятствия. есть функция, позволяющая получить с него данные.
но, проблема в том, что где-то там закралась ошибка: если датчик перестаёт видеть цель (т.е расстояние до препятствия больше полутора метров), то то функция возвращает не 255 (это для неё бесконечность), а последнее значение. например, едет робот вдоль стенки, на которую смотрит ультрасоником, пусть на расстоянии 20см. и тут стена кончается (или угол). и датчик должен выдать 255, а он выдаёт "едем стабильно, 20см".
ну баг и баг. копать будем.
в пакете версии 2012 кроме функции "Sonar_cm.vi", которая ведёт себя странно, есть функция "NXT_DistanceSensor.vi", которая делает то же самое, но без того странного глюка. О!, это же решение, надо всего лишь посмотреть, как она работает, и исправить ошибку! но не тут-то было.
проведённый эксперимент:
us-parallel.png
тут у первой функции извлечены внутренности, чтоб можно было на экран вывести успешность операции.
к контроллеру подключено два датчика, они смотрят на одно и то же препятствие, программа запускается.
в итоге на экране (после исчезновения стены):
67
255
Т

т.е. первый датчик (с первой функцией) "замёрз"

лезу внутрь функция и начинаю переставать понимать, почему так - я никак не могу найти принципиальных различий.
для того, чтоб на код могли глянуть и те, у кого нет нужного пакета, я его в картинки перевёл, плюс вынул все внутренности на поверхность. оставлял только те функции, которые вызываются в обоих вариантах.
это алгоритм работы Sonar_cm.vi
standard copy.png
в нём дважды вызывается функция i2c_sensors.vi с разными параметрам. второй вызов я не стал потрошить для экономии пространства (в последнем ряду - grab data оставлена)

теперь то же самое для NXT_DistanceSensor.vi
native copy.png
что я вижу:
1) конфигурируется датчик одной и той же функцией с одними и теми же параметрами.(не схожими, а именно одной и той же "LEGO.SetTypeAndMode.vi")
2) если это первый вызов функции, то в порт отправляется 2-41-2, ничего не читается
3) в порт отправляется 2-42 с запросом одного байта
4) в случае успешного прочтения оного, этот байт возвращается, плюс он сохраняется в массиве на случай будущих багов.
5) если же баг - вернуть последнее хорошее значение из того самого массива.

что я не упускаю? чем эти функции принципиально отличаются?
в приложении также сами vi (LV12).
Вложения
us-standart.vi
(41.37 КБ) 196 скачиваний
us-native.vi
(4.88 КБ) 172 скачивания
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5461
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 27 раз
Поблагодарили: 86 раз

Re: нужен свежий взгляд

Сообщение IvanLis »

Сложно зрительно, да еще когда не работал с этим железом.

Чисто гипотетически, с датчиком должен стоять контроллер. Возможно у него есть переключение режимов, т.е. что возвращать в случае ошибки: 255 или последнее значение.

Что касается отличий, мне сразу бросился в глаза параметр Return Length (Sonar_cm.vi = "0", а NXT_DistanceSensor.vi = "1"), что в принципе странно.
Аватара пользователя
mzu2006

Professionalism Tutorials Black
doctor
doctor
Сообщения: 2456
Зарегистрирован: 16 авг 2008, 02:12
Награды: 3
Версия LabVIEW: 7.1 10 11 12
Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
Контактная информация:

Re: нужен свежий взгляд

Сообщение mzu2006 »

Довольно непросто найти небольшие отличия в двух сложных картинках. Кроме того, в LabVIEW кое-что бывает и спрятано. Cделайте lvdiff на обе VI и напишите сюда список отличий.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3391
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: нужен свежий взгляд

Сообщение Artem.spb »

IvanLis писал(а):Чисто гипотетически, с датчиком должен стоять контроллер. Возможно у него есть переключение режимов, т.е. что возвращать в случае ошибки: 255 или последнее значение.
но настройка датчика происходит одинаково (функция LEGO.SetTypeAndMode.vi), по крайней мере я не нашёл различий

IvanLis писал(а):Что касается отличий, мне сразу бросился в глаза параметр Return Length (Sonar_cm.vi = "0", а NXT_DistanceSensor.vi = "1"), что в принципе странно.
в данном случае различий нет - в Sonar_cm.vi я вытащил наружу только первый вызов функции i2c_sensors.vi, при котором датчик настраивается на непрерывный опрос, там после записи в буфер параметров не идёт считывание (проверка перед кейсом даёт F и вариант со считыванием не отрабатывается.
при втором вызове - там где стоит комментарий "grab data" Return Length =1, там ещё раз вызывается вся эта простыня, но уже с заходом в вариант кейса, в котором идёт считывание данных

а в NXT_DistanceSensor.vi функция не пытается считывать данные после настройки, там, где коммент "firt call after..." буфер так же =0, а при втором вызове = 1
mzu2006 писал(а):Cделайте lvdiff на обе VI и напишите сюда список отличий.
lvdiff никогда не пробовал, может что не так делаю, но по инструкции
в cmd пишу:
lvdiff "C:\Program Files (x86)\National Instruments\LabVIEW 2012\vi.lib\NXT\Remote Library\Distance Sensor\NXT_DistanceSensor.vi" "C:\Program Files (x86)\National Instruments\LabVIEW 2012\vi.lib\NXT\Dual Mode Library\Sensors\Sonar_cm.vi"
открывается стандартное окно compare, но там чисто косметические сравнения, а косметика там очень сильно отличается, так что найти реальные отличия не получается.
других де сравнений данный способ мне не поведал.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3391
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: нужен свежий взгляд

Сообщение Artem.spb »

разницу нашёл и проверил в эксперименте - в работающей функции спрятана принудительная задержка 50мс.
если опрашивать датчик чаще, ему башню сносит на дальних дистанциях
Ответить

Вернуться в «Robotics»