1
 
 

The night has returned here in the North, and I'm trying to build a housing for my Ricoh Theta X so I can leave it outside for extended periods of time in extreme cold, in the rain and in the snow, to capture timelapse videos of the northern lights.

My idea is to install the camera inside a clear spherical - or at least spherical-ish - glass or acrylic housing with the following properties:

  • Enough space inside to install a small heater, to protect the camera from the cold.
  • Not so much optical distortion that the camera's stitcher isn't able to stitch the two fisheye images together.
  • Prevents any water ingress.
  • Fairly resistant to scratches.

Ricoh does sell this polycarbonate hardcase for the Theta X. The problem with it is, it has a hole on the side to let a USB cable through, to power the camera externally. Unless it's sealed with silicone, this is almost guaranteed to let water in - and I don't want to seal it because that means losing access to the camera permanently.

So I decided to try making my own housing. This is my first attempt.

I found a large clear hollow sphere, originally for one of those globe light posts that used to be common in everybody's gardens in the 80's. I think it's made of acrylic, but maybe it's made of polycarbonate too, since it's supposed to resist weathering and cracking outside. The sphere has a hole at the base and a thread-like rim to mount it atop a pole.

So I 3D-printed a suitable mounting plate for it, that positions the camera at the center of the sphere, and mounts onto a regular photo tripod with a 3/8-16 UNC thread. Then I tried capturing a short test timelapse video this morning:

Test timelapse with the camera inside an acrylic sphere

Sadly it's not ideal: although I was very careful, the ball already came with small scratches and one long, thin hairline scratch. I guess it's not meant to be great optically: it's just a light bulb cover after all.

But the scratches aren't too visible. What's more problematic is that bright things tend to reflect inside the sphere. You can see this at the stitching seam (along the beach, left and right): the sky creates two light bands at the seam. I'm pretty sure the northern lights too will reflect inside the sphere in the dark.

Finally, the sphere is much too large: every little spec of dirt on it is really visible, and I expect any kind of rain or snow on it to ruin the image completely.

So I'll try to find a narrower sphere that "hugs" the camera a lot more, and made of glass so it's more scratch-resistant. Stay tuned 🙂

2
Mr.X (giraut.github.io)
3
Shipwrecks (giraut.github.io)
4
Up the flooded stream (giraut.github.io)
 
 

I went up our lake's outlet stream. The water level is still very high, and the stream is blocked with driftwood about a quarter mile from the entrance.

5
 
 

The level of the lake is still very high - highest it's been in years. I went around the lake to check out which buildings sustained water damage, and surprisingly found only three sheds with a few inches of water inside at the most. Folks got lucky with this one.

6
Swollen lake (giraut.github.io)
 
 

We've had a lot of rain lately, and our lake has risen a good 3 feet - which is rather exceptional. A lot of neighbors have sustained flood damage as a result. But we're lucky enough to live on higher ground. This is what our lakefront looks like now.

Here is what our beach normally looks like:

Cleaned up and leveled beach

7
submitted 2 weeks ago* (last edited 2 weeks ago) by to c/360cameras@piefed.social
 
 

I'm working on some tools for manipulating panorama images and as a first step, I made a simple python script for viewing the images. I'm sharing it here for anyone who might find it useful to have a working implementation to reference.

It's set up as a uv script, so you can run it with uv run script.py image.jpg where script.py is the file containing this code.

A few things I'm not quite happy with at the moment:

  1. The mouse control mapping function is wrong, but it works well enough to be usable.
  2. The script needs better clarity and consistency in variable naming when converting between any of the five different coordinate systems.

spoiler

# /// script  
# dependencies = [  
#   "numpy",  
#   "pillow",  
#   "pygame",  
# ]  
# ///  

# Convention:  
#   From the perspective of a viewer looking through the viewport...  
#   In 2D, the x-axis points to the right, and the y-axis points up.  
#   In 3D, we just extend this.  
#       The x-axis points to the right, the y-axis points up, and the z-axis points forward into the screen.  
#   When yaw = pitch = roll = 0, we are looking forward at the point (x,y,z) = (0,0,1) on the unit sphere  
#   We use the right hand rule for rotation direction. With the right thumb pointing in the direction of the axis, then a positive rotation around that axis (i.e. a rotation that increases the angle) follows the direction of the fingers' curl.  


from collections import defaultdict  
import itertools  
from pathlib import Path  
import sys  

import numpy as np  
from PIL import Image  
import pygame  


def ypr_to_rotation_matrix(yaw, pitch, roll):  
    # Create the rotation matrices  
    # See https://en.wikipedia.org/wiki/Rotation_matrix#General_3D_rotations  

    rotation_matrix_yaw = np.array([  
        [np.cos(yaw), 0, -np.sin(yaw)],  
        [0,           1, 0          ],  
        [np.sin(yaw), 0, np.cos(yaw)]  
    ])  
    rotation_matrix_pitch = np.array([  
        [1, 0,             0            ],  
        [0, np.cos(pitch), -np.sin(pitch)],  
        [0, np.sin(pitch), np.cos(pitch) ]  
    ])  
    rotation_matrix_roll = np.array([  
        [np.cos(roll), -np.sin(roll), 0],  
        [np.sin(roll), np.cos(roll),  0],  
        [0,            0,             1]  
    ])  

    rotation_matrix = rotation_matrix_yaw @ rotation_matrix_pitch @ rotation_matrix_roll  

    return rotation_matrix  


def equirectangular_to_rectilinear_image(img: Image.Image, size: tuple[int,int], viewport_dist: float, yaw, pitch, roll) -> Image.Image:  
    """  
    Args:  
        img: Input equirectangular image.  
        size: Output image size (width, height) in pixels.  
        viewport_dist: The distance between the viewport plane and the viewer. Assume the input image is on a unit sphere.  
    """  

    output_mesh = np.meshgrid(np.arange(size[0]), np.arange(size[1]))  
    output_x = output_mesh[0].flatten()  
    output_y = output_mesh[1].flatten()  

    # Compute the point on the viewport plane in 3D space  
    output_3d_x = (output_x - size[0] // 2) / size[0]  
    #output_3d_y = (output_y - size[1] // 2) / size[1]  
    output_3d_y = (output_y - size[1] // 2) / size[0]  
    output_3d_z = np.full_like(output_3d_x, viewport_dist)  

    # Normalize to put them on the unit sphere  
    norm = np.sqrt(output_3d_x ** 2 + output_3d_y ** 2 + output_3d_z ** 2)  
    unit_x = output_3d_x / norm  
    unit_y = output_3d_y / norm  
    unit_z = output_3d_z / norm  

    # Rotate the unit sphere coordinates based on the yaw/pitch/roll angles  
    rotation_matrix = ypr_to_rotation_matrix(yaw, pitch, roll)  
    rotated_coords = rotation_matrix @ np.vstack((unit_x, unit_y, unit_z))  

    # Convert back to lat/long coordinates  
    rotated_x, rotated_y, rotated_z = rotated_coords  
    latitude_1  = np.arcsin(rotated_y)  
    longitude_1 = np.arctan2(rotated_x, rotated_z)  

    # Convert to pixel coordinates in the equirectangular image  
    equirectangular_x = (longitude_1 / (2 * np.pi) * img.width).astype(int) % img.width  
    equirectangular_y = ((latitude_1 + np.pi / 2) / np.pi * img.height).astype(int) % img.height  

    # Sample the equirectangular image to create the rectilinear image  
    rectilinear_image = np.array(img)[equirectangular_y, equirectangular_x]  

    return Image.fromarray(rectilinear_image.reshape(size[1], size[0], -1))  


def map_mouse_drag(mouse_coord_start: tuple[int,int], mouse_coord_end: tuple[int,int], viewport_size: tuple[int,int], viewport_dist: float) -> tuple[float,float,float]:  
    """  
    Given a mouse click and drag event, compute the corresponding change in rotation.  

    Args:  
        mouse_coord_start: Mousedown coordinates on the image. Top-left corner is (0,0), bottom-right corner is `viewport_size`.  
        mouse_coord_end: Coordinate of the cursor after the click and drag. Follows the same convention as `mouse_coord_start`.  
        viewport_size: (width, height) of the viewport in pixels.  
        viewport_dist: Distance between the viewer and the viewport. A distance of 1 means the viewport is tangent to the unit sphere on which the image lies.  
    """  

    # Convert to numpy arrays  
    size = viewport_size[0]  
    np_start = np.array([mouse_coord_start[0]/size, mouse_coord_start[1]/size, viewport_dist])  
    np_end = np.array([mouse_coord_end[0]/size, mouse_coord_end[1]/size, viewport_dist])  

    # Map mouse coordinates to points in the unit sphere  
    unit_start = np_start / np.sqrt((np_start ** 2).sum())  
    unit_end   = np_end   / np.sqrt((np_end   ** 2).sum())  

    # Project onto the x-y plane  
    proj_start = np.array([unit_start[0], 0, unit_start[2]])  
    proj_end   = np.array([unit_end[0],   0, unit_end[2]])  

    # a x b = |a| |b| sin(theta) n  
    # If positive, then the angle is positive going from a to b. Otherwise, it's negative.  
    # Compute the y component of proj_start x proj_end  
    # (note: all other components are 0)  
    cross_product_y = unit_end[2] * unit_start[0] - unit_end[0] * unit_start[2]  
    mag_proj_start = np.sqrt((proj_start ** 2).sum())  
    mag_proj_end   = np.sqrt((proj_end   ** 2).sum())  
    sin_delta_yaw = cross_product_y / (mag_proj_start * mag_proj_end)  
    delta_yaw = -np.arcsin(sin_delta_yaw) # sign will match that of `sin_delta_yaw`  

    # Project onto the y-z plane  
    proj_start = np.array([0, unit_start[1], unit_start[2]])  
    proj_end   = np.array([0, unit_end[1],   unit_end[2]])  

    # Compute the x component of proj_start x proj_end  
    cross_product_x = unit_end[2] * unit_start[1] - unit_end[1] * unit_start[2]  
    mag_proj_start = np.sqrt((proj_start ** 2).sum())  
    mag_proj_end   = np.sqrt((proj_end   ** 2).sum())  
    sin_delta_pitch = cross_product_x / (mag_proj_start * mag_proj_end)  
    delta_pitch = -np.arcsin(sin_delta_pitch) # sign will match that of `sin_delta_yaw`  

    return (delta_yaw, delta_pitch, 0)  


def viewer(image: Image.Image, size: tuple[int, int]):  
    yaw = 0  
    pitch = 0  
    roll = 0  
    viewport_dist = 0.5  
    delta_yaw = np.pi / 100  
    delta_pitch = np.pi / 100  
    delta_roll = np.pi / 100  

    key_is_down = defaultdict(lambda: False)  
    mousedown_coord = None # Relative to the window (i.e. top-left is (0,0))  
    mousedown_ypr = None  
    mouse_coord = None # Relative to the window  
    pygame.init()  
    screen = pygame.display.set_mode(size)  
    clock = pygame.time.Clock()  

    for i in itertools.count():  
        # Process player inputs.  
        for event in pygame.event.get():  
            if event.type == pygame.QUIT:  
                pygame.quit()  
                raise SystemExit  
            elif event.type == pygame.KEYDOWN:  
                key_is_down[event.key] = True  
            elif event.type == pygame.KEYUP:  
                key_is_down[event.key] = False  
            elif event.type == pygame.MOUSEMOTION:  
                mouse_coord = event.pos  
            elif event.type == pygame.MOUSEBUTTONDOWN:  
                if event.button == 1:  
                    mousedown_coord = event.pos  
                    mousedown_ypr = (yaw, pitch, roll)  
            elif event.type == pygame.MOUSEBUTTONUP:  
                if event.button == 1:  
                    mousedown_coord = None  
                    mousedown_ypr = None  

        # Do logical updates here.  
        if mousedown_coord is None:  
            if key_is_down[pygame.K_LEFT]:  
                yaw += delta_yaw  
            if key_is_down[pygame.K_RIGHT]:  
                yaw -= delta_yaw  
            if key_is_down[pygame.K_UP]:  
                pitch += delta_pitch  
            if key_is_down[pygame.K_DOWN]:  
                pitch -= delta_pitch  
            if key_is_down[pygame.K_q]:  
                roll -= delta_roll  
            if key_is_down[pygame.K_e]:  
                roll += delta_roll  
        else:  
            assert mousedown_ypr is not None  
            assert mouse_coord is not None  
            delta_ypr = map_mouse_drag(  
                mouse_coord_start = mousedown_coord,  
                mouse_coord_end = mouse_coord,  
                viewport_size = size,  
                viewport_dist = viewport_dist,  
            )  
            yaw, pitch, roll = (  
                mousedown_ypr[0] + delta_ypr[0],  
                mousedown_ypr[1] + delta_ypr[1],  
                mousedown_ypr[2] + delta_ypr[2],  
            )  

        img = equirectangular_to_rectilinear_image(  
          img = image,  
          size = size,  
          viewport_dist = viewport_dist,  
          yaw = yaw, pitch = pitch, roll = roll,  
        )  

        # Render the graphics here.  
        surface = pygame.image.fromstring(  
                img.tobytes(), img.size, img.mode  
        )  
        screen.blit(surface, (0, 0))  

        pygame.display.flip()  

        clock.tick(20)  

    pygame.quit()  


def load_image(file_path: Path, target_width: int = 500) -> Image.Image:  
    img_full_res = Image.open(file_path)  

    width, height = img_full_res.size  

    # Calculate target height based on aspect ratio  
    ratio = target_width / float(width)  
    target_height = int(float(height) * float(ratio))  

    # Resize with the fastest/cheapest method  
    img_low_res = img_full_res.resize(  
            (target_width, target_height),  
            Image.Resampling.NEAREST,  
    )  

    return img_low_res  


def main():  
    args = sys.argv  

    file_path = Path(args[1])  

    viewer(  
        image = load_image(file_path),  
        size = (300, 200),  
    )  


if __name__ == '__main__':  
    main()  

8
 
 

I bought a Ricoh Theta TW-2 underwater housing for my Ricoh Theta X camera and it showed up in the mail today. So I went onto the lake and tested it by shooting a video of my pedal-powered kayak's propeller.

I also took a static photo:

Wilderness Systems Helix PD pedal drive propeller underwater

Our lake is really murky and it's almost impossible to see anything beyond a foot or two. So I figured the boat's prop was about the only interesting thing I could shoot with the camera for quick test without driving all the way to the sea. Also, there's something misaligned in that boat, so I thought I could use the camera to try and diagnose the problem while pedaling.

I don't really want to do underwater photography, but I want to be able to leave the camera sitting outside in the rain to shoot very long 360° timelapse videos, and it turns out the TW-2 underwater housing yields much higher quality images than the water-resistant (but not waterproof)Ricoh Theta TH-3 hardcase.

In fact, the camera's firmware has settings specifically for the TW-2 housing, so the stitching is correct either in air or in water, whereas it has no specific settings for the TH-3. You can even see the effect of those settings in the video: the camera was set for underwater image correction, and the stitching is clearly wrong when the camera is out of the water.

So my plan is to modify the TW-2 case to power the camera externally. Hopefully I'll manage to fit a USB-C plug in there without compromising the watertightness, but I doubt it - which is a shame considering the price of this housing.

But before I do that, I'll use it normally to shoot underwater pictures - and I'm hoping to catch some fish on camera under the ice this winter.

9
360° duckies (giraut.github.io)
 
 

I set up a 360° camera in the morning on the beach where the colony of mallards usually comes to rest at the end of the afternoon, to capture a video in the middle of their group, hoping they'd get used to having the camera in their midst. Yet even after a whole day, the mallards still felt something was wrong with that unusual object there and elected to lounge on the neighbor's beach instead. But the camera still got a few visitors 🙂

10
Misty lake (giraut.github.io)
 
 

Summer is winding down (not that we really had any summer this year 🙂) and our lake is entering its annual misty season, as the temperatures fall.

11
 
 

If you own a Ricoh Theta X camera with a recent firmware and you've tried to connect the old Ricoh Theta app to it in Wi-Fi client mode, you've probably noticed that it doesn't work anymore. Here's how to re-enable it.

For a bit of background:

The Ricoh Theta X can be remote-controlled through Wi-Fi using either AP mode or client mode:

  • AP mode is the camera acting as a standalone access point, and your cellphone connecting to it directly.
  • Client mode is the camera connecting to an existing access point, your cellphone connecting to the same access point, then connecting to the camera through the router.

The problem in client mode is, while you can connect the camera to the access point and the Ricoh Theta app sees the camera as connectable, when you try to connect to it, after entering the Wi-Fi password, the app shows a popup saying "Communicating" with a spinner but nothing happens.

The reason is, the password is in fact incorrect: the client mode password is not the same as the WiFi password. Unfortunately, there is no menu entry in newer firmware versions or in the Ricoh Theta app to set the client mode password - only the Wi-Fi AP password can be set to connect in AP mode. Some older documentation online mentions using the serial number as the client mode password, but this doesn't work anymore.

But the REAL reason this is broken is this:

Ricoh doesn't want you to use their old Ricoh Theta app. They want you to use their new Ricoh360 cloud app, that connects to their Ricoh360 cloud ecosystem and requires you to create an account and register your cameras. Because of course they do...

It has 360 in the name, so you know it's crap. But you need it because sure enough, only the cloud app can set the client mode password now, and that's very much on purpose.

Fortunately, if you don't want this cloud nonsense just to be able to remote-control your camera through your Wi-Fi, you can still set the client mode password using the REST API from your computer. Then you can keep using the old, simple, standalone Ricoh Theta app.

Here's how (note that you need a Linux machine for this. I don't have Windows, but I suppose it would be easy enough to do the same in Windows):

  • Set your camera to AP mode
  • Connect your computer's Wi-Fi to the camera's AP using the Wi-Fi password. Your computer gets an IP like 192.168.1.5 (not .1, as 192.168.1.1 is the camera itself)
  • Create a file called set wifi_client_password.sh file containing the following lines:
#!/bin/sh  

WIFI_CLIENT_PASSWORD=$1  

if [ ! "${WIFI_CLIENT_PASSWORD}" ];then  
  echo "Usage: $0 <wifi client password to set>"  
  exit  
fi  

curl --json '{ "name": "camera.setOptions", "parameters": { "options": { "_password": "'${WIFI_CLIENT_PASSWORD}'" } } }' http://192.168.1.1/osc/commands/execute  
echo  
  • Then run the script with the desired client mode password:
$ ./set wifi_client_password.sh abc123  
  • If the operation succeeds, you should see it in the JSON state report:
{"name":"camera.setOptions","state":"done"}  
  • Then enable client mode in the camera's settings, connect the Ricoh Theta app using Wireless LAN client mode, enter the password you just set with the script and it should work again.
12
A night in the atrium (giraut.github.io)
submitted 3 weeks ago* (last edited 3 weeks ago) by [M] to c/360cameras@piefed.social
 
 

This pair of office buildings has a huge glass atrium in-between them. I left a camera running and taking one HDR shot every 30 seconds. This is the result. Not much to see during the night, despite the huge storm that night, but the sunrise through the glass panes is interesting.

The camera was powered by a 12,000 mA power bank, allowing it to run for just under 17 hours. I'll try it again with a 45,000 mA power bank.

13
A night in the cottage (giraut.github.io)
 
 

This video is my latest attempt at making a long HDR timelapse video with the Ricoh Theta X. There's nothing more challenging for a camera than trying to shoot an overcast sky through a window in a dark room without overexposing the sky or underexposing the room. So I left the camera running in our cottage overnight looking at the lake to see how it would fare, and how long it would last on an external battery charge. The video isn't terribly impressive as timelapse videos go, but if you're trying to achieve the same thing, you might be interested.

I've been trying to shoot very long HDR timelapse videos with the Ricoh Theta X for some time, and it's proving rather more complicated than I expected, for the following reasons:

  • The camera's built-in timelapse app (called "interval shooting" in the shooting mode menu) has annoying limitations:
    • The camera doesn't do HDR in that mode
    • The image seems to be slightly "jumpy" from one frame to the next every once in a while - meaning, the POV changes very slightly and creates a small movement that shouldn't exist in a timelapse video shot from a fixed point. You can see this in my previous timelapse video shot with that mode.
    • When using the internal battery, the app works fine, but can't shoot more than ~720 images on a single charge. Sadly, when the camera is powered externally, he app seems to crash after shooting between 400 and 700 images. Then after the app crashes, the camera starts drawing a lot of current, overheats and empties my 12,000 mAh external power bank in a couple of hours. I'm not sure why but it's quite buggy and it won't take shots as long as I want.

So instead, now I'm using an external Bluetooth intervalometer to capture shots in regular photo mode at regular invervals - namely my trustry Flipper Zero with the BT Trigger app left running near the camera. The camera has no trouble taking regular photos while being powered eternally.

However, the Ricoh Theta X doing the stitching internally, it turns out to be quite a powerful little computer in its own right, and it requires rather a lot of power to process each photo - particularly in HDR mode where it takes several exposure-bracketed shots.

So I've been running experiments to see how much power I can feed it through the USB port, using a 45W power supply and a high-quality UBB-C extension cord (so the power supply and the cord isn't in the shots in the nadir), and also using my power bank's USB-QC port, so that the camera charges at least as fast as it discharges itself taking photos - or at least doesn't discharge faster than I need it to run for a given timelapse video's total duration.

So far I can take up to 17 hours worth of HDR photos on one power bank's charge and the camera's internal battery's charge combined, provided I activate the light/sound off mode to turn off the screen and conserve power, and I don't take more than one HDR shot every 30 seconds. Any faster than that and the camera will deplete its internal battery faster than the power bank can charge it back up in-between shots.

14
15
New birdhouses (giraut.github.io)
 
 

I replaced the decades-old birdhouses in the trees around our house. There are four birdhouses in this photosphere: can you find them? 🙂

16
Out to sea (giraut.github.io)
 
 

This is the follow-up of this video:

Down the canal to the sea

17
In-between the sky (giraut.github.io)
18
Midnight in the North (giraut.github.io)
19
 
 

This is the first video I've done with the low-profile Falcam F22 quick-release mount and it really makes a difference compared to my previous 3D-printed camera holder: now the nadir is very clean and the camera mast is almost completely invisible.

20
 
 

Dual fisheye lens 360° cameras don't quite capture everything around them: they have a blind circle along the stitch line all around the camera - and the closer to the camera, the more invisible whatever is located along that circle becomes. All such cameras hide their own body that way.

If you want to minimize or eliminate the image of the selfie stick, monopod or tripod you're holding the camera with, it pays to make it as slim as possible, and keep it in line with the camera so as much of it as possible disappears in the stitch line.

The Falcam F22 Insta360 Action Camera Quick Release Kit is as narrow as possible for that purpose. It was originally made for the Insta360, but it works great with the Ricoh Theta X too, since it's narrower than the camera itself.

I bought 3 quick-release kits:

  • I installed one of the sockets onto my highly modified 360° camera "tripod" in lieu of the 3D-printed camera holder I had on top of it to mount the camera.

  • I installed the second socket onto a modified Benro BK15 selfie stick: the swiveling head on this selfie stick is actually screwed on a standard 1/4-20 UNC threaded base. So all that's needed is to remove the swiveling head and its base by applying some head onto the head of the screw to destroy the threadlocker, then the Falcam F22's socket can screw directly onto the selfie stick.

  • I installed the third socket onto a 1/4-20 UNC-to-GoPro adapter, so that I can use any of the plethora of GoPro mounts out there to mount my Ricoh Theta X. Of course, those mounts aren't very discreet in the nadir of the photosphere, since they're not designed to hide in the stitch line. But at least when I need to mount the camera securely onto something unusual, I always have a solution, even if it's not perfect.

In this video, I show how the Falcam F22 works, and what you can expect to see at the nadir of the image if you use it with a Ricoh Theta X.

All in all, I recommend this quick-release mount for 360 photography: it's convenient, quick, secure and truly invisible.

21
Canals (giraut.github.io)
submitted 2 months ago by [M] to c/360cameras@piefed.social
22
The sea will set us free (giraut.github.io)
submitted 2 months ago by [M] to c/360cameras@piefed.social
23
 
 

This is the latest evolution of my 360° camera tripod. This one has a heavy base in which the telescopic mast can rotate.

If you've used a 360° camera, you know the tripod is visible in the nadir (the very bottom of the photosphere). It's usually desirable to make the tripod as small as possible, so as to be as unintrusive as possible, and/or easy to airbrush out in still pictures.

This "tripod" isn't a tripod at all, but an upside-down monopod with a small base attached to it. When it's fully deployed, it positions the camera at eye level, which is ideal for POV shots, and the base is quite far down on the ground so it's small in the resulting image.

The base I used before was a 140mm-diameter plastic disc, which was rather lightweight. It was fine indoors even with the monopod fully deployed, but it tended to be quite tipsy outside when there was any wind, or when the ground wasn't smooth or level. To prevent the camera from tipping over - which is almost a guaranteed disaster for the lenses - I usually weighed down the base with something heavy in the vicinity like a stone, or staked it to the ground with camping tent stakes.

I replaced the plastic base with a heavy 4x100 wheel hub for automotive trailer. I turned an adapter sleeve in the lathe to fit the larger end of the monopod inside of the axle bearings without play, and the monopod's original camera mounting plate serves to lock the whole assembly in place.

The wheel hub is the same size as the plastic base I used to use, but it's a lot heavier at 2.2 kg / 5 lbs, so the camera is a lot more stable. Better: even if I want to pin it down for safety, the monopod's shaft is free to rotate thanks to the bearings, so I can easily orient the camera if I want to point the front or rear lens toward the main subject of the scene - because it's less grainy than around the stitch line, or to make sunbursts appear straight instead of all curvy due to the fisheye projection for example.

Finally, the hub has ready-made holes that are normally used to mount a wheel onto, but are very useful to drive tent stakes through, for high-wind situations.

The entire "tripod" still fits smartly in my backpack. But of course it's quite a lot heavier now. Still, I'd rather carry the extra weight around than get scratched lenses again, because replacing a lens on a Ricoh Theta X camera is a lot more expensive than the 35 euros this wheel hub cost me (180 euros if you're curious).

24
Midnight rainbow (giraut.github.io)
submitted 2 months ago by [M] to c/360cameras@piefed.social
 
 

I went outside to try and capture the midnight sun, and I saw this guy behind the trees on the other side of the sky.

The North is magical...

25
 
 

I was last out of the swimming pool last night, it was a little windy and the midnight sun shone just right through the trees. I just had time to setup my 360° camera on the extended pole and capture the stainless steel-tiled wall doing its magical thing.

I already shared a video of that wall when the swimming pool opened a year and a half ago, but this time it's summertime and it's panoramic 🙂

I could sit there on the parking lot and watch that thing for hours - in the summer anyway.

view more: next ›