Category: наука

Category was added automatically. Read all entries about "наука".

Doc

Самодельный "холодный потолок" - дополнение

О том, насколько полипропиленовые трубы по теплоотдаче проигрывают металлическим, сколько сейчас мощности уходит на прокачку воды, и какое гидравлическое сопротивление этой системы должно быть "в теории", т.е сильно ли мне навредили эти сужения?

Collapse )

В общем, ясно, что ничего не ясно :)

Если в эти выходные снова будет жарко, возможно, продолжу эксперимент.
QuatCore

Алг. ближ. дист, вычисление масштаба

Вот знал, что имеющийся код, который предполагался универсальным и для ближней дистанции, и для дальней, всё же придётся причесать. Вон, с креном обнаружилось переполнение при работе с полметра (минимально возможной дистанции). Это мы поправили. Следующая на очереди - процедура "вычленения" масштаба из матрицы масштаба и ракурсов.

Старый код:
	;Состояние регистров к этому моменту:
	;X=AfTransf,
	;Y=QuatY,
	;Z=Matrix,
	;i=j=k=Inv=0,
	;C=Acc=Txx
	FindScale	proc
	;1. Вычисляем величины |X-Z| (т.е |Txx - Tyy| ) и |2Y| (например, |Txy+Tyx|, хотя можно 2|Txy| или 2 |Tyx| )
	;важно, что в данный момент Inv=0
				[SP]		0	;манхэттенская метрика, сумма модулей (метрика городских кварталов)
				[SP+1]		0	;чебышевская, максимум от модулей 
				;текущее значение будем хранить в регистре C - дешево и сердито!
				i		1
				j		3					
		@@loop:		Acc		[X+i]	;+Tyx (i=1), -Tyy (i=0)
				PM		[X+i^j]	;Txy (i=1), Txx (i=0)   ;поменяли местами чтобы проверить модуль
				Inv		1		;уже можно! Так что на следующей итерации будет "-"
				[Y+i]		0		;очистим две компоненты кватерниона
				ABS		Acc		;|Txy+Tyx| (i=1), |Txx-Tyy| (i=0)
				C		Acc		;сохранили это значение
				ADD		[SP]	
				[SP]		Acc	;обновили манхэттенскую
				Acc		C
				SUB		[SP+1]
				JL		@@skipCheb ;лучше подошел бы JGE и поменять местами C и [SP+1]. Разница при нуле-на 1 больше операций.
				[SP+1]		C	;обновили Чебышевскую					
		@@skipCheb:	iLOOP		@@loop
	;теперь в [SP] лежит манхэттенская метрика, а в [SP+1] - чебышевская
	;осталось посчитать выражение целиком - сумму Txx+Tyy с весом 1/2, а эти - с весами 0,332 и 0,168
	;или сначала всё сложить - а потом поделить пополам...
	;можно, если ввести команду UDIV2 - беззнаковое деление
	;по сути, SHR1 
	
	;кстати, у нас до сих пор j=3 :)
	;i=k=0
				Acc		[X+i]	;добавили Txx
				ADD		[X+i^j]	;и Tyy
	;теперь наши метрики берём с весами	
				C		[SP]
				FMA		11010	;ManhW
				C		[SP+1]
				FMA		21758	;ChebW
				
	;ага, сделали
	;продемонстрируем результат
				JO		@@endLoop
		@@shl1:		ADD		Acc
				j++		0
				JNO		@@shl1		
	;ага, сделали
		@@endLoop:	DIV2		UAC ;получается отрицательное значение от -16384 до -1 (число -1 при "делении на 2" так и останется -1)
				SUB		32767 ;вычитает 32767, что даст отрицательное значение от -49151 до -32766. Но в UAC отобразится от 16385 до 32768.
				;если теперь найти обратную величину, это должно получиться в диапазоне 32768..65532
				;а если мы вычтем ещё половинку, может выйти от 16384 до 32768, и диапазон 32768..65536.
				;так что ну её нахрен, эту половинку?
				;или можем уже на этапе Ньютона этот случай проверить.
				DIV2S		1 ;это для нужд округления. 					
				[SP]		UAC							
	FindScale	endp


Содержание регистров к началу процедуры претерпели изменения, но уже не столь серьёзные. А ещё мы решили, что без команды ijk некуда, поэтому можно её здесь применить и немножко сэкономить.

И ещё одна вещь: в [SP+1] у нас до сих пор лежит число, позволяющее отличить "ближнюю дистанцию" от "дальней". В первом случае там лежит пятёрка (т.е точки от 0 до 5), во втором - тройка (т.е от 0 до 3). Не затереть бы его ненароком!

Collapse )

Компилируется всё это дело (алг. ближ дистанции) в 191 слово кода (382 байта). Возможно, здесь я чуть перемудрил с нахождением масштаба, можно львиную долю этого кода выполнить с незначительным снижением точности. Это когда появится алгоритм сопровождения, надо будет основательную отработку устроить, смотреть, удаётся ли "втянуться" в сопровождение с различных ракурсов и различных масштабов, или происходит срыв.

А сначала хоть этот кусок надо потестировать...
QuatCore neuro CPU

Нейросетевой процессор на Воронежской ПЛИС!

Всё я какие-то устаревшие решения пытаюсь применять для этого ВидеоИзмерителя Параметров Сближения. 16-битный одноядерный процессор, ассемблер, связанные списки (обычные, не блокчейн) - никто сейчас так не делает! То, что неделю назад поразвлекался с теорией оптимального обнаружения, БИХ-фильтрами и иже с ними - не сильно лучше, этим методам лет 60 как минимум :)

Пора уже вспомнить, что на дворе 2021 год - и сделать обнаружение точек на основе нейросети!
IMG20210401204530.jpg

Причём взять не какой-то там дряхлый персептрон, а самую нынче модную технологию - свёрточные нейросети (Convolutional Neural Networks, CNN), а если точнее - трёхслойную структуру, где первый слой отвечает за распознавание горизонтальных признаков, второй слой - за вертикальные признаки, а третий слой непосредственно обнаруживает пятна, т.е когда один из нейронов "вспыхивает", это означает: в этом месте у нас пятно, в смысле, мишень!

Если делать это "в лоб" на компьютере, то даже довольно мощные персоналки могут задуматься всерьёз и надолго. Но ПЛИС - совсем другое дело, и такая сеть может быть выполнена на Воронежской ПЛИС 5576ХС4Т, и работать в реальном времени (25 кадров в секунду 1024х720) при тактовой частоте 25 МГц :)

Collapse )
Doc

Более тяжёлые тела падают быстрее!

Увидел не так давно видео от Flammable Maths с таким заголовком, и подумал поначалу - он опять нас троллит. Это немецкий препод математики (насколько я знаю), и чувство юмора у него очень специфическое, особенно любит над инженерами издеваться, дескать e=π=3, cos(x) = 1, sin(x) = x.

Но нет, всё корректно: в безвоздушном пространстве, согласно законам Ньютона, тяжёлые тела действительно будут падать быстрее!

Быстренько изложу своими словами. Есть объект массой m и Земля массой M. На объект со стороны Земли действует сила



И согласно 2-му закону Ньютона она придаёт ему ускорение:



Тут можно вставить несколько страниц дискуссии, почему "инерционная масса" (слева) оказалась равна "гравитационной массе" (справа) и причём тут Эйнштейн, но сейчас мы о другом. Сокращаем их с чистой совестью, и получаем:



Ускорение зависит лишь от массы Земли и расстояния до неё, и не зависит от массы самого объекта, что как бы говорит все тела падают одинаково.

Вот только мы кое-чего забыли!

Collapse )
Sidious

USB Blaster ловит наводку!

Наконец-то нашёл "виновника", почему у меня макет иногда в перезагрузку уходит! Недавно я думал на перегрев стабилизатора 7805, и даже поставил его на небольшой теплоотвод. Но дело было не в нём...

Записал небольшое видео по этому поводу.



И "текстовая расшифровка" под катом, кому так удобнее. Оно не вполне совпадает, но смысл примерно тот же.

Collapse )

Есть что-то в "намеренном" применении не самых качественных приборов и кабелей. Это позволяет гораздо быстрее наткнуться на всевозможные "пограничные случаи", которые в противном случае возникли бы уже "в полевых условиях", где и стресса больше, и ответственности, и дедлайн отчётливо вырисовывается, и так много поменялось в сравнении с "родной лабораторией", что не понятно, за что хвататься! Так что китайский блок питания (ну, немного доработанный, чтобы не убить всё скопом), преобразователь USB-RS485 за 200 рублей без клеммы экрана (только A и B) и гальванической развязки, неэкранированные шлейфы - это наше всё :) Правда, до нового года я могу опять не успеть приборчик запустить, разве что до старого. Или произойдёт рождественское чудо, и может тогда я уверую!
Sidious

"Ремонт" лазерного дальномера Bosch PLR15

Этим девайсом пользовался довольно активно на даче и вообще при всяческих ремонтах.

Теперь уже думал, что у меня есть всё необходимое для проверки своего макета ВИПС, даже купил "коврики для резки", по англицки "cutting mat", потому что любой уважающий себя прибор без мата настроить нереально! Идея была, что сначала я ставлю дальномер:
IMG20201118165456.jpg

и устанавливаю мишень ближней дистанции на нужном расстоянии на штативе. По красной точке дальномера устанавливаю его не только по дальности, но и по углам и поперечным осям (влево-вправо и вверх-вниз), но пока ещё приблизительно.

Потом убираю дальномер и ставлю нивелир, так, чтобы вертикальный луч лёг аккурат по центральной линии:


Мишени ближней дистанции не хватает только плоского зеркала посередине, на котором будет изображено "перекрестие" - начало системы координат, связанной с ней. Двигая мишень на штативе, совмещаем лазерный крест с нарисованным перекрестием - и тем самым добиваемся нулевых "активных углов" (тангаж и курс). А потом наблюдаем за отражённым от зеркала "зайчиком" в виде того же креста - он должен вернуться ровно туда, откуда вышел - это обеспечит правильные "пассивные углы" (также тангаж и курс). Останется ещё приложить к мишени строительный уровень - и убедиться в её горизонтальности (а также убедиться в горизонтальности стола, на котором стоит коврик для резки и, собственно, прибор) - и это обеспечит нам нулевой крен.

Всё, теперь мы знаем, что ДОЛЖЕН показать прибор! Осталось поставить прибор своей передней кромкой по "нижней линии" коврика (относительно которой мы меряли дальность с помощью дальномера), включить его - и смотреть, что он показывает. Таким способом можно будет сначала его отъюстировать, а в дальнейшем - продемонстрировать получаемую точность. Причём можно будет затем подвигать прибор по клеткам или по размеченным углам - и убедиться, что показания меняются соответствующе, без необходимости раз за разом снова всё вымерять лазерами.

Конечно, метрологи будут плакать кровавыми слезами, для них придётся заменить нивелир на автоколлимационный теодолит, причём у нас его по-моему вообще нет в наличии, надо будет покупать, обязательно поверенный, внесённый в регистр измерительных средств, а это всё недёшево. ЗА СВОИ я этого делать не буду :)

Но мне сейчас просто самому увидеть, какие точности приборчик сможет обеспечить, тут и такого "колхоза" хватит.

И всё бы хорошо - но вслед за нивелиром приказал долго жить и дальномер! Последний раз я им пользовался - всё было нормально, а тут включаю - лазер не горит, горят нули, на единственную кнопку HOLD он не реагирует, и даже когда закрываешь рычажок, он не выключается, а ещё показывает эти нули некоторое время!

Уже думал - придётся сдавать в ремонт, и скорее всего за деньги, т.к приборчик бытовой, самый дешёвый, вряд ли у него длинный гарантийный срок. К счастью, проблема оказалась до смешного простой!

Collapse )

QuatCore: улучшаем программу аффинного алгоритма

Чтобы было, на чём отлаживать новый компилятор, сразу хочу переписать программу аффинного алгоритма (наша самая крупная программа для QuatCore на данный момент), с учётом новых возможностей, которые представит модуль "непосредственных значений" QuatCoreImm.

К примеру, первые 3 строчки кода:
	SP		StackAdr
	NOP		0		;избежать Write Hazard: только здесь в SP запишется новое значение!
	SP		[SP]


Можно заменить одной:
	SP		Stack


Ещё и выкинуть из сегмента данных строку
StackAdr	dw	Stack	;адрес стека (он недоступен напрямую!)


Мелочь, а приятно. Таких мест не так уж много, но кое-чего есть...

Collapse )

Раньше эта программа занимала 189 слов данных и 204 слова кода, теперь на 5 слов данных и на 5 слов кода меньше. Не так уж много. Такова уж специфика этой "вычислительной части" - там мы практически всё время работаем с массивами, и поэтому один раз инициализировать базовые регистры и затем обращаться через хитрючие адреса типа [X+2i+k] выходит очень эффективно. "Одиночных констант", как мы видим, раз-два и обчёлся. Потому и жил себе спокойно со старым модулем Imm.

Но в обработке изображений их, похоже, будет куда больше: это и ширина и высота картинки (на первых порах 1024х720), и пороговое значение яркости, и константы для видеопроцессора, задающие кадровые и строчные синхроимпульсы, и куча другого... Да и с доступом к памяти мы, похоже, стояли на пределе - ещё усложнения - и добираться до некоторых значений стало бы совсем туго.
QuatCore

Долбаные карточки

Вгоняют меня в уныние, тянут меня на дно (как и положено КИНГСТОНАМ), не работают заразы, причём две карты, что у меня есть, не работают ПО-РАЗНОМУ!



Collapse )

UPD. Настолько задолбался, что ПРИНЦИП НЕОПРЕДЕЛЁННОСТИ Герцена-Чернышевского обозвал ПАРАДОКСОМ. И сегодня же мучительно вспоминал, чьим именем называется парадокс, что с ростом степени многочлена интерполировать им становится всё хуже и хуже - он скачет между точками как угорелый. Оказывается, это ФЕНОМЕН Рунге! Это тот, который Рунге-Кутта.

Poll #2099255 Парадокс Герцена-Чернышевского

Вину возьму на себя. Но ЧТО ДЕЛАТЬ?

Домучать SD-карту по SPI
1(10.0%)
Закупиться других MicroSD
0(0.0%)
Освоить "родной" интерфейс SD
4(40.0%)
Поставить статическую память и не мучаться!
5(50.0%)
QuatCore

QuatCore: финал аффинного алгоритма!

Пора завершать это безобразие: мы нашли самую отдалённую точку, отсортировали против часовой стрелки все остальные, нашли матрицу аффинного преобразования, вычленили из неё крен (и построили кватернион), посчитали масштаб, и осталось превратить этот масштаб в вектор параллельного переноса, который вместе с кватернионом полностью выражает взаимное положение двух объектов.

На это уйдёт ещё 19 слов кода, львиная доля - на обращение масштаба методом Ньютона, и 3 слова (матерных) - на обработку ровно одного нехорошего случая, когда ответ выходит за диапазон. Ещё пришлось 2 строчки перенести из прошлой процедуру в эту.



Collapse )

За нами должок - посмотреть "особый случай", для которого мы знаем 3 слова...

И залить это безобразие на ПЛИС, не забыв сделать какой-никакой I/O...
QuatCore

О преобразовании к научному формату ("к плавающей точке")

Пусть у нас есть целое число, к примеру, в 6 десятичных разрядов, и мы хотим превратить его в научную запись с 2 значащими разрядами.

Скажем, число 35 превратится в 3,5×101, а число 123 - в 1,2×102.

Мы пытаемся формализовать такое преобразование. Записываем все 6 разрядов числа, даже если там нули:

000035

Изначально мы присваиваем порядок ("экспоненту") e=5. А далее, сдвигаем число влево по одному разряду, и попутно вычитаем по единичке из e, пока в старшем разряде не появится ненулевая цифра:

000350, e=4,
003500, e=3,
035000, e=2,
350000, e=1. Вот оно!

И остаётся округлить число до двух значащих разрядов, взять два старших разряда - и операция завершена.

Но есть здесь одна небольшая подлянка...

Collapse )