sailing simulator using raspberry pi

I liked the idea of the raspberry pi for many different reasons but one thing I had thought of doing previously with arduino and laptop etc was to make a cheap and cheerful sailing simulator so people learning to sail can get the hang of tacking and gybing. I have found that novices continue to get in a muddle with swapping hands and changing sides of the boat for years after starting, often to the detriment of actally learning to sail. After all these are trivial manual skills that shouldn't take up valuable time on the water!

An ideal system (as per Frank Bethwaite and others) would provide proper feedback in terms of tipping and sheet and rudder forces. However as I know that kitchen chairs with garden canes and bits of string work very well I thought a static version with just video feedback would still work ok.

I have done the development so far on a ubuntu laptop. The simulator program is very basic and is written in python with the 3d rendering being done by panda3d. Here is a youtube of the rough, un-tuned system.

http://www.youtube.com/watch?v=UAMCS8EzOmI

- The mark, hull, mast, boom, tiller and burgee are basic blender jobs
- The horizon is the inside of big blender cylinder with a 360deg picture from the top of a hill in the English Lakes wrapped round it (could be taken from the middle of your local pond)
- The sail is a set of five square egg-texture-cards (a panda3dism) which automatically rotate through four png images to give the luffing, flogging, oversheeting looks. The relevant object is loaded into view depending on the wind and sheet positions and the others hidden away
- The water is a tile-able (in three dimensions so it runs continously) egg-texture-card with 128 png images. The transparent areas allow a subsurface circle to be seen that makes the near water darker between reflections but the further away water light. This is what real water seems to do

I use the same algorithm that generated the perlin noise for the water tiles (noise.py) to create realistically fluctuating wind strength and direction.

Source here http://www.eldwick.org.uk/sites/default/files/sailsim.zip for people to mess around with it. It's 3.5 MB mainly because of all the water pictures! On the raspberry pi I might have to use 64x64x64 to reduce the memory.
Here are just the pythons (sorry about the lack of comments, I will pad it out soon):

sailsim.py

from math import pi, sin, cos, radians, degrees, atan2, hypot

from direct.showbase.ShowBase import ShowBase
from direct.task import Task
from direct.actor.Actor import Actor
from direct.interval.IntervalGlobal import Sequence
from panda3d.core import Point3
from panda3d.core import Fog
from panda3d.core import DirectionalLight
from panda3d.core import AmbientLight

from noise import Noise3D


class MyApp(ShowBase):
    def __init__(self):
        ShowBase.__init__(self)

        # Disable the camera trackball controls.
        self.disableMouse()
       
        self.tm = 0 #s
        self.dTm = 0.5 # time between each re-check of conditions
        self.lastTm = 0 #s
        self.xpos = 0 #m
        self.ypos = 0 #m
        self.tilesize = 0
        self.heading = 0 #degrees
        self.speed = 0 #m per second
        self.heel = 0 #degrees
        self.pitch = 0 #degrees
        self.sheet, self.sheetMin, self.sheetMax = 0, 5, 100 #degrees
        self.hike = 10 # abritrary scale
        self.rudder, self.rudderMin, self.rudderMax = 0, -pi/2, pi/2 #arbitrary scale
        self.sPot, self.sPotMin, self.sPotMax = 4, 0, 50 #abitrary scale would be set by calibration procedure
        self.Iturn, self.wt = 30,0.0 #rate of turn degrees/second
        self.lastXtile = -1
        self.lastYtile = -1
        self.wDirMin, self.wDirMax = 1.0, 1.25
        self.wStrMin, self.wStrMax = 3, 6

        self.sailInfo = [[1.00,2.16,3.50,4.95,6.06,6.76,7.00,6.76,6.06,4.95,3.50,1.81,0.0],[pi,0.6*pi,0.54*pi,0.58*pi,0.6*pi,0.95*pi,pi,1.05*pi,1.1*pi,1.25*pi,1.4*pi,1.45*pi,1.49*pi],[0,1,2,3,3,3,3,3,3,4,4,4,4]]
        self.rudderInfo = [[0.01, 0.03, 0.06, 0.08, 0.1, 0.11], [pi,0.52*pi,0.55*pi,0.6*pi, 0.7*pi, 0.95*pi]]
       
        self.noiseDir = Noise3D(128, 1/32.0, 5)
        self.noiseStr = Noise3D(128, 1/32.0, 5, 7)

        dlight = DirectionalLight('my dlight')
#       dlight.setShadowCaster(True,512,512)
        dlnp = render.attachNewNode(dlight)
        dlnp.setHpr(160,-30,0)
        alight = AmbientLight('alight')
        alnp = render.attachNewNode(alight)

        self.seaRoot = render.attachNewNode("Sea Root")

        for i in range(-5,6):
            for j in range(-5,6):
                sea = self.loader.loadModel("water.egg")
                sea.setScale(15, 15, 15)
                sea.reparentTo(self.seaRoot)
                if (self.tilesize == 0):
                    t1,t2 = sea.getTightBounds()
                    self.tilesize = t2.getX() - t1.getX() #sea tiles have to be square
                sea.setPos(i*self.tilesize, j*self.tilesize, 0)           

        self.subsurface = self.loader.loadModel("subsurface.egg")
        self.subsurface.setScale(50,50,50)
        self.subsurface.reparentTo(self.render)

        self.horizon = self.loader.loadModel("horizon.egg")
        self.horizon.setScale(20,20,12)
        self.horizon.setHpr(0,0,180)
        self.horizon.setPos(0,0,160)
        self.horizon.reparentTo(self.subsurface)
       
        self.hull = self.loader.loadModel("hull.egg")
        self.hull.setScale(5,5,5)
        self.hull.setHpr(180,0,0)
        self.hull.reparentTo(self.render)
        self.hull.setLight(dlnp)
        self.hull.setLight(alnp)
#       self.hull.setShaderAuto()

        self.boom = self.loader.loadModel("boom.egg")
        self.boom.setScale(0.2,0.4,0.2)
        self.boom.reparentTo(self.hull)
        self.boom.setPos(0.02,0.0,0.75)
        self.boom.setHpr(0,0,0)
        self.boom.setLight(dlnp)
        self.boom.setLight(alnp)
       
        self.sail = []
        for i in range(5):
            self.sail.append(self.loader.loadModel("sail"+str(i)+".egg"))
            self.sail[i].setScale(5,5,5)
            self.sail[i].setPos(0,2.5,2.6) # this is the correct height to be seen, put them under the water when not in use!
            self.sail[i].setHpr(90,0,0)
            self.sail[i].reparentTo(self.boom)
           
       
        self.burgee = self.loader.loadModel("burgee.egg")
        self.burgee.setScale(0.1,0.1,0.1)
        self.burgee.setPos(0.0,0.4,0.35)
        self.burgee.reparentTo(self.hull)
        self.burgee.setLight(dlnp)
       
        self.tiller = self.loader.loadModel("boom.egg")
        self.tiller.setScale(0.1,0.2,0.1)
        self.tiller.reparentTo(self.hull)
        self.tiller.setPos(0.02,2.2,0.4)
       
       
        self.mark = self.loader.loadModel("mark.egg")
        self.mark.setPos(0,150,-0.5)
        self.mark.setScale(0.7,0.7,0.7)
        self.mark.reparentTo(self.render)
        self.mark.setLight(dlnp)
        self.mark.setLight(alnp)
       
        colour = (0.6,0.6,0.9)
        expfog = Fog("Scene-wide exponential Fog object")
        expfog.setColor(*colour)
        expfog.setExpDensity(0.02)
        self.seaRoot.setFog(expfog)
        base.setBackgroundColor(*colour)

        self.accept('arrow_left', self.turnLeft)
        self.accept('arrow_right', self.turnRight)
        self.accept('arrow_up', self.goFaster)
        self.accept('arrow_down', self.goSlower)

        # Add the moveCameraTask and updateVariables procedure to the task manager.
        self.taskMgr.add(self.moveCameraTask, "MoveCameraTask")
        self.taskMgr.doMethodLater(self.dTm, self.updateVariables, "UpdateVariables")



    #motion control
    def turnLeft(self):
#       self.heading = (self.heading + 5) % 360
        if (self.rudder < self.rudderMax):
            self.rudder += 0.02
      
    def turnRight(self):
#       self.heading = (self.heading - 4.867) % 360
        if (self.rudder > self.rudderMin):
            self.rudder -= 0.02
       
    def goFaster(self):
         if (self.sPot > self.sPotMin):
            self.sPot -= 1
       
    def goSlower(self):
        if (self.sPot < self.sPotMax):
            self.sPot += 1
   
    # Define a procedure to move the camera, boat and subsurface; also retile the sea
    def moveCameraTask(self, task):
        if (self.lastTm == 0):
            self.lastTm = task.time
        angleRadians = radians(self.heading)
        self.xpos -= self.speed * sin(angleRadians) * (task.time - self.lastTm) * 3
        self.ypos += self.speed * cos(angleRadians) * (task.time - self.lastTm) * 3
        self.camera.setPos(self.xpos, self.ypos, 3)
        self.heading += self.wt * (task.time - self.lastTm)
        self.camera.setHpr(self.heading, 0, 0)
        self.subsurface.setPos(self.xpos, self.ypos, -0.1)
        self.hull.setPos(self.xpos - 12*sin(angleRadians), self.ypos + 12*cos(angleRadians), 0.0)
        self.hull.setHpr(self.heading - 180, self.pitch, self.heel)
        self.boom.setHpr(self.sheet, 0, 0)
        # check if gone over a tile boundry and refresh tiles
        newXtile = int(self.xpos/self.tilesize) * self.tilesize
        newYtile = int(self.ypos/self.tilesize) * self.tilesize
        if (newXtile != self.lastXtile or newYtile != self.lastYtile):
            xOff = -1* int(2*sin(angleRadians))
            yOff = int(2*cos(angleRadians))
            self.seaRoot.setPos(newXtile + xOff*self.tilesize, newYtile + yOff*self.tilesize, 0)
            self.lastXtile = newXtile
            self.lastYtile = newYtile
        self.lastTm = task.time
        return task.cont
   
    # manage the physics of winds and forces
    def updateVariables(self, task):
        self.tiller.setHpr(180-degrees(self.rudder),0,0)
        self.sheet = interpolate([self.sheetMin, self.sheetMax], self.sPot, self.sPotMin, self.sPotMax) * (1 if (self.sheet >= 0) else -1)
        wDir = interpolate([self.wDirMin, self.wDirMax],self.noiseDir.generate((int(self.xpos/8))%128, (int(self.ypos/8))%128, self.tm%128), -1.0, 1.0)
        wStr = interpolate([self.wStrMin, self.wStrMax],self.noiseStr.generate((int(self.xpos/8))%128, (int(self.ypos/8))%128, self.tm%128), -1.0, 1.0)
        v1 = sin(wDir - radians(self.heading))*wStr
        v2 = cos(wDir - radians(self.heading))*wStr + self.speed
        wDirRel = atan2(v1, v2)
        wStrRel = hypot(v1, v2)
        if (wDirRel > pi):
            wDirRel = wDirRel - 2*pi
        self.burgee.setHpr(degrees(wDirRel),0,0)
        if (abs(wDirRel) < abs(radians(self.sheet))): # flogging sail
            self.sheet = degrees(wDirRel)
        angAtt = wDirRel - radians(self.sheet)
        if (self.sheet > 0 and wDirRel < 0):
            angAtt += 2*pi
        if (self.sheet < 0 and wDirRel > 0):
            angAtt -= 2*pi
        if (abs(angAtt) > 3.0): #gybe
            self.sheet *= -1
        area = interpolate(self.sailInfo[0], abs(angAtt), 0, pi)
        LDangle = interpolate(self.sailInfo[1], abs(angAtt), 0, pi)
        sailEgg = int(interpolate(self.sailInfo[2], abs(angAtt), 0, pi))
        for i in range(5):
            self.sail[i].setPos(0,2.5,-20)
        self.sail[sailEgg].setPos(0,2.5,2.6)
        F = 0.5*wStrRel*wStrRel*area*cos(radians(self.heel))
        Fheel = F*sin(wDirRel - LDangle*(1 if (wDirRel > 0) else -1))
        self.heel = Fheel/10
        Fdrive = F*cos(wDirRel - LDangle*(1 if (wDirRel > 0) else -1))
#       print Fheel, Fdrive

        rWt = radians(self.wt)
#       rudderRel = atan2(self.speed, 0.5*rWt) - self.rudder
        rudderRel = atan2(1.0*rWt,self.speed) - self.rudder
        rArea = interpolate(self.rudderInfo[0], abs(rudderRel), 0, self.rudderMax)
        rLDangle = interpolate(self.rudderInfo[1], abs(rudderRel), 0, self.rudderMax)
        rF = 10*self.speed*self.speed*rArea
        rFdrag = -rF*cos(rLDangle)
        rFturn = rF*sin(rLDangle)*(1 if (rudderRel > 0) else -1)
       
        hullDrag = 2*self.speed*self.speed*(1 if (self.speed > 0) else -1)
       
        acc = (Fdrive - rFdrag - hullDrag)/100
        self.speed += acc*self.dTm
        if (self.speed < -0.5):
            self.speed = -0.5
           
        #TODO the height up the mast for turning force needs to be a static var
        wtDot = (-rFturn - 50*rWt*rWt*(1 if (rWt > 0) else -1) - Fdrive*0.25*sin(radians(self.heel)))/self.Iturn
        self.wt += degrees(wtDot*self.dTm)

#       print "rudder=%0.2f rLDangle=%0.2f rudderRel=%0.2f wt==%0.10f rFturn=%0.10f wtDot=%0.10f rArea=%0.2f" % (self.rudder,rLDangle,rudderRel, self.wt, rFturn, wtDot, rArea)
        print "speed=%0.2f LDangle=%0.2fpi cos(heel)=%0.2f F=%0.2f drive=%0.2f rudder drag=%0.2f hull drag=%0.2f wDirRel=%0.2f angAtt=%0.2f wStrRel=%0.2f" % (self.speed, LDangle/pi, cos(self.heel), F, Fdrive, rFdrag, hullDrag, degrees(wDirRel), degrees(angAtt), wStrRel)
        self.tm += self.dTm
        return task.again


def interpolate(valList, valIn, valMin, valMax):
    n = len(valList)
    val = (float)(valIn - valMin)/(valMax - valMin)*(n - 1.0)
    i = int(val)
    if (val <= 0):
        return valList[0]
    elif (val >= (n-1)):
        return valList[n-1]
    else:
        return (valList[i] + (valList[i+1] - valList[i])*(val - i))

app = MyApp()
app.run()

noise.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# code originally came from a forum:http://gamedev.stackexchange.com/questions/23625/how-do-you-generate-tileable-perlin-noise
# suggestion by boojum. I have added an extra dimension for time continuity

import random
import math

class Noise3D():
# initialize class with the grid size (inSize), frequency (inFreq) and number of octaves (octs)
    def __init__(self, inSize, inFreq, octs, seedVal=1):
        self.perm = range(256)
        random.seed(seedVal)
        random.shuffle(self.perm)
        self.perm += self.perm
        self.dirs = [(math.cos(a * 2.0 * math.pi / 256),
                 math.cos((a+85) * 2.0 * math.pi / 256),
                 math.cos((a+170) * 2.0 * math.pi / 256))
                 for a in range(256)]
        self.size = inSize
        self.freq = inFreq
        self.octs = octs
       

    def noise(self, x, y, z, per):
        def surflet(gridX, gridY, gridZ):
            distX, distY, distZ = abs(x-gridX), abs(y-gridY), abs(z-gridZ)
            polyX = 1 - 6*distX**5 + 15*distX**4 - 10*distX**3
            polyY = 1 - 6*distY**5 + 15*distY**4 - 10*distY**3
            polyZ = 1 - 6*distZ**5 + 15*distZ**4 - 10*distZ**3
            hashed = self.perm[self.perm[self.perm[int(gridX)%per] + int(gridY)%per] + int(gridZ)%per]
            grad = (x-gridX)*self.dirs[hashed][0] + (y-gridY)*self.dirs[hashed][1] + (z-gridZ)*self.dirs[hashed][2]
            return polyX * polyY * polyZ * grad
           
        intX, intY, intZ = int(x), int(y), int(z)
        return (surflet(intX+0, intY+0, intZ+0) + surflet(intX+0, intY+0, intZ+1) + surflet(intX+0, intY+1, intZ+0) +
                surflet(intX+0, intY+1, intZ+1) + surflet(intX+1, intY+0, intZ+0) + surflet(intX+1, intY+0, intZ+1) +
                surflet(intX+1, intY+1, intZ+0) + surflet(intX+1, intY+1, intZ+1))

    #return a value for noise in 3D volume (2D over time etc)
    def generate(self, x, y, z):
        val = 0
        x = x * self.freq
        y = y * self.freq
        z = z * self.freq
        per = int(self.freq * self.size)
        for o in range(self.octs):
            val += 0.5**o * self.noise(x*2**o, y*2**o, z*2**o, per*2**o)
        return val
   
"""
# this is some code to use the Noise3D to create a water surface effect i.e. has transparency to allow the dark to show through
# in the foreground. Made into a simple animated tile with Panda3D.
# Other (not commented out version!) is artificial colour for visualizing noise patterns

from PIL import Image

size = 128
freq = 1/32.0
octs = 5
   
nObj = Noise3D(size, freq, octs, 6)

#rCurve = [0, 2, 4, 150, 12, 16, 20, 30, 40, 50, 60, 70, 90, 120, 180, 250, 255]
#gCurve = [50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 170, 200, 220, 245, 250, 250, 255]
#bCurve = [10, 20, 30, 40, 50, 60, 70, 80, 90, 110, 130, 190, 200, 253, 254, 255, 255]
#aCurve = [50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 170, 200, 220, 245, 250, 250, 255]
rCurve = [0, 0, 0, 0, 0, 0, 0, 50, 100, 150, 200, 250, 255, 200, 150, 100, 50]
gCurve = [0, 0, 100, 150, 200, 250, 255, 200, 150, 100, 50, 0, 0, 0, 0, 0, 0 ]
bCurve = [0, 20, 255, 200, 150, 125, 100, 80, 60, 40, 20, 0, 0, 0, 0, 0, 0]
aCurve = [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]

for z in range (min(10,size)):
    data = [] 
    print z 
    for y in range(size):
        for x in range(size):
            fBmVal = nObj.generate(x, y, z)
            iV = int(fBmVal*16) % 16
           
            data.append((int(rCurve[iV] + (rCurve[iV+1] - rCurve[iV]) * (fBmVal - iV/16)),
                    int(gCurve[iV] + (gCurve[iV+1] - gCurve[iV]) * (fBmVal - iV/16)),
                    int(bCurve[iV] + (bCurve[iV+1] - bCurve[iV]) * (fBmVal - iV/16)),
                    int(aCurve[iV] + (aCurve[iV+1] - aCurve[iV]) * (fBmVal - iV/16))))
       
    im = Image.new("RGBA", (size, size))
    im.putdata(data, 128.0, 128.0)
    im.save("classified"+format(z, '03d')+".png")

print "finished doing it"
"""

Comments

sup

“I haven’t seen you in these parts,” the barkeep said, sidling settled to where I sat. “Personage’s Bao.” He stated it exuberantly, as if word of his exploits were shared by way of settlers around multifarious a ‚lan in Aeternum.

He waved to a unimpassioned hogshead apart from us, and I returned his token with a nod. He filled a eyeglasses and slid it to me across the stained red wood of the bench before continuing.

“As a betting man, I’d be delighted to wager a adequate speck of coin you’re in Ebonscale Reach on the side of more than the drink and sights,” he said, eyes glancing from the sword sheathed on my with it to the bow slung across my back.

http://maps.google.com.pr/url?q=https://renewworld.ru/sistemnye-trebovan...

UEFA Euro 2020

Чемпионат Европы УЕФА похож на чемпионат мира ФИФА, но только для европейских команд, и обычно считается более сложным для победы, чем чемпионат мира, из-за более высокого качества соперников. В период с 11 июня по 11 июля в 11 городах Европы пройдет 51 матч, на которых болельщики смогут насладиться и окунуться в атмосферу чемпионата.

___
Свежие и актуальные новости и обзоры

https://latestnews.com.ua/category/sport/uefa-euro-2020/

P.S. евро 2020
евро 2020 футбол
евро 2020 открытие
евро 2020 группы
открытие евро 2020
футбол евро 2020
спб евро 2020
евро 2020 расписание
уефа евро 2020
билеты евро 2020
онлайн евро 2020
квалификация евро 2020
евро 2020 билеты
таблица евро 2020
группы евро 2020
расписание евро 2020
евро футбол 2020
новости евро 2020
россия евро 2020
евро начало 2020
евро 2020 когда
когда евро 2020
евро 2020 спб
календарь евро 2020
евро 2020 составы

купить ремкомплект суппорта минск

Привет господа
Вопросы и ответы Вопрос: После бурения получу ли я качественную чистую воду?
Ответ: Сразу не получите. Для очищения воды после процесса бурения наша компания “БурТехСервис” осуществляет прокачку скважины. Делается это мощным скважинным насосом. После прокачки, вода становится чистой, пригодной для питья. Чтобы скважина служила долгие годы мы устанавливаем фильтр на воду из полиамидной сетки галунного плетения европейского производства.

Вопрос: У меня на даче небольшой участок. Не будет ли проблематично Вам делать заезд?

Ответ: Совершенно никаких проблем. Для этого компания “БурТехСервис” располагает специальным буровым комплектом техники, включающим в себя малогабаритную буровую установку SBU 60XL.

Вопрос: Какие документы выдаются на скважину? Необходима ли лицензия на скважину?

Ответ: По окончанию работ на скважину выдается паспорт с описанием конструкции Вашей скважины. В паспорте прописываются диаметр обсадных труб, применяемые при бурении скважины, а также данные по воде, статический и динамический уровень и рекомендации по загрузке насоса. Также по окончанию работ выдается акт выполненных работ.
Лицензирование скважины в первую очередь необходимо для юридических лиц. При формировании заявки для предприятия необходим проект планируемых работ и ряд документов для подачи на рассмотрения.

Вопрос: Что включает в себя бурение скважины под ключ?

Ответ: Бурение скважины под ключ включает в себя проведение целого комплекса земельных и монтажных работ, таких как бурение скважины, обустройство скважины кессоном либо адаптером, либо летнее обустройство с помощью оголовка для скважины, а также монтаж фильтрового оборудования.

Вопрос: У нас в скважине стало мало воды. Что делать?

Ответ: Скважины имеют дебет от 50 до 3000 литров в час. В случае дебета 50 литров в час, мы рекомендуем устанавливать накопительную емкость, которая сможет гарантировать постоянный запас воды. Если это будет необходимо, мы поможем Вам с установкой такой емкости, после чего скважина будет давать 1200 литров в сутки, что вполне достаточно для полноценного проживания семьи из 4 человек с канализацией, душем, ванной.

Вопрос: Устанавливаете ли Вы колодцы?

Ответ: Нет. Компания “БурТехСервис” установкой колодцев не занимается. Зачастую в колодцах, сооруженных из 3-5 колец – вода обычная, грунтовая. Химический состав такой воды меняется в зависимости от сезона, дождей, таяния снега и изменения климатических условий. Вода может стать непригодной для питья. При этом стоимость рытья колодца почти всегда дороже бурения скважины.

Вопрос: Долго ли будет скважина снабжать нас чистой водой?

Ответ: Срок жизни скважины зависит от мощности водоносного горизонта, а также от других факторов: условий эксплуатации скважины, типа грунта. Наш опыт подсказывает: при правильной эксплуатации скважины, срок эксплуатации составит более 30 лет.

Вопрос: Обязательно ли бурить артезианскую скважину для получения кристально чистой воды?

Ответ: Часто наши конкуренты убеждают ничего не знающих клиентов в том, что артезианская скважина – это единственный вариант получения чистой воды в нужном количестве. Но бурение артезианской скважины – дорогостоящая процедура. Гарантий на количество воды и ее химический состав Вам никто не даст. В итоге Вы можете получить воду с превышением содержания солей и с запахом. В случае бурения на первый водоносный слой, Вы получите скважину с водой хорошего качества и приходом воды от 1 до 5 кубометра в час. Этого более чем достаточно для дома или дачи.

Вопрос: В какое время года предпочтительнее бурить и обустраивать скважину?

Ответ: Распространено мнение, что лучше всего бурить скважину в теплое время года. Процесс проходит легче и быстрее. Но с одинаковой эффективностью наша компания “БурТехСервис” бурит и зимой, даже в сильные морозы. В Беларуси редко бывают морозы ниже 20 градусов. Поэтому никаких трудностей не возникает. Тем более мы используем современную и проверенную технику, которая позволяет строить как неглубокие, так и глубокие скважины. Все работы выполняются за один день, после чего вода из скважины уже будет чистой и готовой к употреблению.

Вопрос: Как лучше проложить кабель, идущий от насоса в траншее?

Ответ: Кабель, идущий от насоса, лучше всего проложить в чехле, а именно проложить в ПНД трубе.

Leave your comments about my new site - legalnewser.com

Hello, I lunched a new site with costum scripts to publish latest news and events on finance, currencies and economy.
Please leave your comment about my website.
You can find the website in my signature.
Thanks.

Вернуть деньги из казино

Проиграли деньги в казино?
Мы поможем их вернуть! Обращайтесь.

https://tinyurl.com/2x9rjpy5

Эвакуатор без забот

Need a tow truck service?
So you have come to the right place!
Tow truck in St. Petersburg from "LAT-logistics" is always convenient, fast and cheap.
Who do we work with?
• with individuals;
• with entrepreneurs;
• with companies involved in transportation;
What does the final cost depend on?
1. The mass of the vehicle.
The more, the more powerful (with higher carrying capacity) the technique you need to use.
2. Distance and travel time.
The length of the route, and therefore the fuel consumption, has an impact on the final cost of the service.

http://evak24msk.ru/articles/3.html - anfovq
http://evakuator-auto.ru/stoimost.htm - uwrpzi
https://evakuator-econom.ru/uslugi-evakuatorkolomnakruglosutochno.html
- wrazob

Портативный Hi-Fi

Портативный Hi-Fi

Free TeamSpeak Servers

TeamSpeak (known as TS) is a communications tool using the world wide web as a highway for delivering crystal crisp communications. TeamSpeak was originally targeted toward the competetive gaming community. This software was created for increasing communication in online MMORPGs. However, the same benefits with games became extremely useful for business. This application started an evolution in the multiplayer gaming community around ten years ago. Before https://sameteem.com/threads/automatic-free-private-teamspeak-channels.1... - TeamSpeak Servers all users knew of was in game VOIP chat, which were often infected with hackers.
If you play online games or perform extensive development work with multiple clients on different computers in various countries, you already know the importance of a reliable voice chat connection to ensure clear, timely communication. Whether you need extensible control over your group's chat, or a system with more dependability and features than your current system, https://sameteem.com/threads/automatic-free-private-teamspeak-channels.1... - TeamSpeak Servers are a superb solution for FPS players, other FPS gamers, and everyone who wants voice over IP chat for work or game needs.
A https://sameteem.com/threads/automatic-free-private-teamspeak-channels.1... - Free TeamSpeak Server server allows you to customise and adjust who you chat with, with full administrative functions that allows you to add or delete users at your leisure. Instantly, you get the power to add slots and manage all aspects of the clans's online chat. With your own TeamSpeak root, you enjoy clear audio, admin control, and a fully customisable and scalable user permissions system.
With TeamSpeak, you will have ultimate control over how you and your fellow gamers connect online. All you need is a mic and headphones to start enjoying the benefits of a TeamSpeak server.
You can purchase a server from one of the providers at TeamSpeak.com or go through the pain of setting up the server software yourself. You can also connect to various https://sameteem.com/threads/automatic-free-private-teamspeak-channels.1... - Free TeamSpeak Servers with free channels or find additional servers on https://teamspeak.server.vote/ - Public TeamSpeak Server Listshttp://teamspeakserverlist.com/ - TS Server Lists.

импульсное автомобильного аккумулятора

Компания БурАвтоГрупп — бурение скважин в Минске и области, водоснабжение
Наша компания «БурАвтоГрупп» оказывает услуги по водоснабжению. Кроме бурения скважины вам окажут помощь в подборе насоса и его установке.Основной деятельностью нашей компании является обеспечение клиента качественной питьевой водой в достаточном количестве, которое включает ряд услуг:Бурение скважин для городских микрорайонов, коттеджных поселков, садоводческих товариществ, централизованного водоснабжения промышленных объектов.Бурение индивидуальных скважин для частных лиц.Бурение скважин для геотермального отопления.
Капитальный ремонт, техническое обслуживание артезианских скважин, замена водоподъемного оборудования, ликвидационный тампонаж.Обеспечение насосным оборудованием.Обратившись в нашу компанию, Вы получите подробную консультацию специалистов.Независимо, на какую глубину придется проводить работы, специалистам все по — плечу. Наши преимущества заключаются в наличии современного оборудования, с помощью которого возможно производство работ под ключ, а также для заезда на территорию понадобится минимум пространства и так же внешний вид и ландшафтный дизайн вашего участка не страдает, что является не мало важным фактором. На все работы составляется соответствующая техническая документация, при этом предусматривается предоставление заказчику договора, акта выполненных работ, паспорта на скважину.
Мы всегда отвечаем за качество выполненной работы и предоставляем гарантию на любой род деятельности выполненный нашей компанией.Следует отметить, что кроме основного вида деятельности, заключающегося в бурении скважин на воду, наша компания занимается выполнением и других буровых работ, состоящих в бурении грунта под установку столбов и опор.В случае необходимости выполнения буровых работ, смело обращайтесь к нам по указанным на сайте телефонам. Мы всегда открыты к предложениям о сотрудничестве с другими организациями. Для этого Вы можете прислать свою документацию на один из e-mail которые указаны в контактных данных.Клиенты ценят нас за высокий уровень сервиса и качество выполненных работ, и мы не останавливаемся на достигнутом, совершенствуем работу своей компании и профессиональный уровень квалификации сотрудников, принимая во внимание все замечания и предложения от партнеров и клиентов.Кристально чистая вода будет вас радовать многие годы.

Home page

Home page

Добрый вечер

Приветствую!!!

Не беспокойтесь о выравнивании ленты точно посередине шины она сама определит линию и будет ее придерживаться. Для этого нужно заглянуть под автомобиль. Задача системы тягового электроснабжения обеспечить эффективную работу электроподвижного состава с минимальными потерями энергии и при возможно меньших затратах на сооружение и обслуживание тяговых подстанций контактной сети линий электропередачи и т. Начинающие водители часто сомневаются нужно ли оформлять фаркоп или нет. Если речь идет например о накладной то программа ведет еще и материальный учет для товаров считает обороты и остатки не только по материалам но и по материально ответственному сотруднику. На эту тему интересный ресурс по ссылке https://prom-electric.ru/remont-woodward-2301-load-sharing-and-speed-con... .
В зимнее время не занятые на других работах специалисты занимаются модернизаций плановыми ремонтами или освоением новой техники. Мы придерживаемся политики использования только качественных расходников. Каждый специалист с легкостью может освоить процесс только при этом нужно строго придерживаться некоторых правил. Как только мы сталкиваемся с необходимостью производства изделия состоящего из разнотипных материалов возникает необходимость в более сложном специализированном оборудовании. Начинающим мастерам рекомендуется соблюдать технику безопасности и технологию проведения восстановительных и ремонтных процедур выбирая не сложные проекты.
Всем успехов!

Style

This is a unique place for fashionable women's clothing and accessories.
We offer our clients women's clothing, jewelry, cosmetics and health products, shoes, bags and much more.
https://fas.st/Ujfha

Frankbom

Terrific work! That is the type of info that should be shared across the net. Shame on the seek engines for not positioning this submit upper! Come on over and consult with my website . Thanks =)

Warez Music Scene Releases

Hello,

Download Music Scene Releases: https://0daymusic.org
Server's capacity 186 TB Music
Support for FTP, FTPS, SFTP, HTTP, HTTPS.

Best regards, Jimmy

??????? ??????? ?????????, ??? ??? ?

[url=https://blogforgirls.ru/?p=1018 ] как понять что тебя обманывает мужчина[/url]

??????? ??????? ?????????, ??? ??? ?

[url=https://blogintimlife.ru/?p=93 ] что мужчины любят в предварительных ласках[/url]

хранение крупы влажность

Фасоль рябая оптом

[url=https://krd-agro.ru/rise/rapan-po-gost/]рис рапан характеристики[/url]

The Best CBD Oil for Sleep, Anxiety, Pain, and Insomnia ...

If Snoop Dogg's smash hit track "Smoke cigarettes Weed Everyday" perpetually plays in your head as well as you possess a growing rate of interest in mentioning on a selection of weed items, at that point this medical weed company might have the job opportunity of your aspirations. American Marijuana, an online health care cannabis resource, will likely view a high lot of curious applicants for a brand-new role that can make up to $36,000 a year to examine a collection of cannabis products.

[url=http://wayofleaf.blogger.ba/]http://wayofleaf.blogger.ba/[/url]

ничего такого

Круто + за пост

не работает

+ за пост
_________________
казіно ігри безплатно без регистрации, [url=https://ua.onlinebestrealmoneygames.xyz/budut-li-rabotat-kazino-v-ukraine-2/]играть на гривны казино[/url], ігрові автомати безплатно книжки.

Dirty Porn Photos, daily updated galleries

Teen Girls Pussy Pics. Hot galleries
http://instasexyblog.com/?robin
young black porn hub free backdoor porn pics ang jolie porn cunnilingus video porn trailers fantastic four porn

go вакансии

работа выездной

[url=https://jobgirl24.ru/]разовая работа в москве для женщин подработка[/url]

KoreaKorea today

Korea today [url=https://advanced-excel-repair.en.softonic.com/]Korea news Korea[/url]

College Girls Porn Pics

Enjoy our scandal amateur galleries that looks incredibly dirty
http://lesbiantube.hotblognetwork.com/?mya

true real porn site de recherche porn star maxim porn porn movies of parents fucking teens hot fat woman porn clip

Korea

China
[url=https://accessdatabasetutorial.com/why-it-is-essential-to-regularly-compact-and-repair-microsoft-access-databases/] China China [/url]

вполне себе годнота

Спасидо, +
_________________
[URL=https://bkin-7779.space/zhuravskiy-bukmekery/]Журавский букмекеры[/URL]

Правельный выбор

выполненные с использованием практичного нержавеющего металла. Важный конструктивный элемент, часть дизайна здания, гаранты безопасности и удобного спуска и подъема по лестнице

thai New Yourk

[b]Nuru Massage Erotic - [url=http://nuru-massage-ny.com]body rub in ny[/url][/b]

Hello! Our employees those who make your life easier. Society that active more than eight years.

Distinctive individuality our Turkish soap salon is not an enforced setting. We search promotion groups in a social network to advertising.
Advise all of you try whatever type massage now. Go to service and further ascertain specialty.

ripe vapes salts bazaar

[b][url=https://vape4style.com/products/bad-drip-dont-care-bear]Bad Drip vape juice[/url][/b]

Vape4style.com - this universal stop, where can find all required mods, electronic juices and supplies accessories for e-cigarettes. We respect vaping for this reason gathered in one place widest assortment goods for vaping on the market. Our most important value rightfully is service visitors, we guaranteefast delivery, best consumer quality products and affordable retail prices.

New sexy website is available on the web

Sexy pictures each day
http://videosaxgay.gaydetector.bloglag.com/?paloma

preg sex porn couples reality porn katie lea burchill porn dinosaur king porn porn movies preggo

realsensual massag in New Yourk

[b][url=https://happy-ending.manhattan-massage.com/]happy ending spa for women[/url][/b]

Good day .

Top craftsmen at the present time worth its weight in gold , in this regard prices for Thai massage in Manhattan Beach rather expensive . In our SPA you can find out all the beauty useful procedure practically for nothing .

Relaxing massage of the whole body positive affects all without exception systems and organs our body:

o Muscles and Joints - improved mobility , you will recover faster after a visual load, elimination of lactic acid and recovery from exercise
o Skin - activates flow blood, occurs saturation oxygen
o Vessels - getting rid of edema , normalizing the cardiovascular system and relieving anemia
o Nervous system - improve mood , headaches go away , improve health, relief from headaches and spasms , relieve nervous tension and improve well-being .
Swedish massage more important in case losing weight and getting rid of c ellulite.
The Luxurious Classic massage in Ditmars waiting customer here.

o Impressive variety options massage techniques
o Sessions Hardware - vibration full body massage from 1 hour
Offer all of you , visit the site and learn all methods of massage personally.

Prayagrai

Allahabad, officially known as Prayagraj, and also known as Illahabad and Prayag, is a city in the Indian state of Uttar Pradesh. It is the administrative headquarters of Allahabad district—the most populous district in the state and 13th most populous district in India—and the Allahabad division.

[url=https://windows-1.com/remo-driver-discover-for-pc/] Prayagrai [/url]

Правильно выполняем

[b][url=https://eco-corporation.ru][/url][/b]

hydra ruz

index [url=https://hydraruzxpnew.net]hydraruz[/url]

Empiremarket

our website
[url=https://empiremarketlink24.com/how-hackers-break-users-darknet-market-accounts]Empiremarketlink[/url]

Уборка квартиры

[url=https://grand-master.su/kliningovyie-uslugi.html]Экспресс-уборка [/url] - Бурение скважин, Сборка металлических стеллажей

бетсити промокод

[url=https://betslive.ru/bonus-bk/1xslots/promokod-1xslots/]1xslots промокод[/url] - бонус коды leon, winline промокод

ремонт двери цена спб

[url=https://xn--b1adccayqiirhu.xn--p1ai/services/izgotovlenie-reznyh-nakladok-na-dver]резные наличники на двери[/url] - ремонт дверей в квартире, замена роликов шкафа

стоматология московского района спб

[url=https://xn--78-6kcmzqfpcb1amd1q.xn--p1ai/uslugi/implantacziya-zubov/]стоматология импланты[/url] - протезирование зубов петербург, компьютерная диагностика зубов

BitcoinCore.exe

[url=https://crypto-wallets.org/coins/zcoin-xzc-download-blockchain-blocks/?lang=en]XZC Core[/url] - Bitcoin SV (BSV): Blockchain Blocks, BSV

Ремонт рулевой рейки Хендай

[url=https://gidro-partner.ru/remont-rulevoj-rejki-volvo.html]Ремонт рулевой рейки Вольво[/url] - Ремонт рулевой рейки Форд Фокус 2, Ремонт рулевой рейки Форд Фокус 2

good website Bitniex

click here for more info [url=https://zellnet.com/question/bitniex-com-cryptocurrency-exchange/]Bitniex[/url]

Stairs and fences made of glass, wood, metal

лестницы и [url=https://stairsprom.ru/uslugi/ograzhdeniya-lestnits/]перила для лестницы[/url], цена на их изготовление продуманна

cryptocurrency transactions

click for source [url=https://velacoin.pw/]token protections[/url]

Интересный пост

спасибо интересное чтиво
_________________
[URL=https://marathoncasino.site/real-online-casinos-that-pay-real-money/]Real online casinos that pay real money[/URL]

добрый сайт брекеты томск

благоустроенный ресурс [url=https://xn-----6kcacs9ajdmhcwdcbwwcnbgd13a.xn--p1ai/index.php/uslugi/ortodontiya]брекеты томск[/url]

я тут придумывать

Люблю веселиться во время работы Сват, рекомендовал [url=https://igrovyeavtomaty777nadengi.com]igrovyeavtomaty777nadengi.com[/url] покрутил бырабаны, мгновенно перечислил выигрыш. Кто-то скинул обалденный досуг
Сосед каждый день немного проигрывает [url=https://frank-play-casino.com]frank-play-casino.com[/url] отыгрывает вейджер, перевод денег мгновенный. Кто скажет, из-за чего отсутствуют веселые чемпионаты
По вечерам делаю ставки, [url=https://misterbit-official.ru]misterbit-official.ru[/url] перевод выигрыша на карту быстрый.