Friday, December 19, 2014

Response to Woodward letter

On December 18, 2014, I received a letter from Rocky Scott, the Director of Corporate Relations with Woodward, Inc.  The letter was remarkable for its bullying and intimidating tone.  It also repeated several false statements, in an apparent attempt to extract more taxpayer money from the citizens.  In response, here are the facts:

Homestead Natural Area was not a gift from Woodward.  It was part of a $23.5 million taxpayer-financed package, which was adopted by Council on March 26, 2013.  The agreement says the property was “conveyed”, not donated, which just means Woodward transferred ownership to the City as part of the deal.

The City of Fort Collins is not required to ask the voters for millions of additional dollars to fund the Lincoln Avenue project next to Woodward.  It has always been up to Council whether or not to refer this question to the voters.  And, if Council should ask, you are free to vote “no” on the question.

It is important to know that the Lincoln project was never a high priority until the push for the redevelopment of this private property started.  And, in fact, the property is now being developed.  Further tax money for this project will ensure that far more important projects for the taxpayers will be significantly delayed or never started.

Part of the deal was tax increment financing, or TIF.  TIF is the diversion of additional property tax that comes as a result of development.  The idea that TIF is somehow “free” or an entitlement is simply false.  In our rapidly growing community, it is very unlikely that the property would have remained empty long.  And an unsubsidized development would have allowed state and local taxes to pay for our schools, libraries, Foothills Gateway, and other critical state and local services.  Instead, these taxes have been diverted to subsidize Woodward.

Additionally, TIF was not the whole deal.  For example, every city taxpayer is helping to pay for the increased cost of providing utility service to Woodward via a subsidy of Woodward’s utility capital expansion fees.

I am not the only person who opposed the size of the March 2013 tax package.  In fact, my opponent in the 2013 election also spoke out with concerns about its cost and risk to the taxpayers.  Together, we received 100% of the votes cast in District 5, whose interests I now represent.  We were not alone with concerns that night, and since then I have heard from many others who were opposed to the multimillion dollar deal.

Finally, I support honest business and productive employment. However, I am opposed to unnecessary handouts to wealthy multi-billion-dollar private companies.  We have the existing $23.5 million deal.  We don’t need to give millions of additional taxpayer dollars to this project, leaving individual citizens with the tax bill.

Woodward is entitled to its own opinion, but Woodward is not entitled to its own facts.  And it is not entitled to more than the letter of its agreement with the City.  Most Fort Collins residents and taxpayers are tired of multinational corporate entitlements.  It is my job to represent all of the citizens, not just one multi-billion-dollar business.  I will do the job I was elected to do.  I will not be intimidated or bullied into silence.

Wednesday, November 05, 2014

Thinking of a telescope rebuild

20 years ago, I built Big Blue:

It's been a great telescope.  But it is, well, big.  About 120 145 pounds, hard to take apart, hard to transport.  I've been reading up on alternative designs, and I came across this one by legendary Mel Bartels.  Here is my take on it.  A very light scope, easy to disassemble, and easier to transport.  First, the assembled scope:

It will easily disassemble and fold up for transport:

And the plywood bits will all fit on a single standard 4x8 sheet:

I'm not sure when I'll get around to building it, but it is fun to think about.

Edit (Nov 10 2014): I started disassembly, and found that the scope is actually 20% heavier than I realized (and includes 25 pounds of counterweights).  From initial estimates, the new design will weigh:

Upper cage: 6 pounds (was 11 pounds)
Mirror box: 46 pounds (was 53 pounds)
Rocker box: 30 pounds (was 41 pounds)
Counterweights: 8 pounds (was 25 pounds)

Overall, a 35% weight diet.  The mirror box/mirror combo is not that much lighter - but that does not take into account the bulk of the old box and the fact that it was really 78 pounds because I never removed the counterweights.  I'll make the new counterweights much easier to remove and reattach.

Wednesday, October 15, 2014

It's raining fusion projects

This week, three press releases came out about separate nuclear fusion initiatives.  First up was the University of Washington, who announced on October 8 that they will present their "dynomak" concept at the upcoming Fusion Energy Conference in St. Petersburg, Florida Russia.  Next up was Sandia Labs on October 14, who announced new results from their "Z-machine", including significant neutron production.  Finally, we have Lockheed-Martin, who announced on October 15  that they had made a breakthrough in some sort of cylindrical-confinement fusion configuration, and are working toward building a 100Mw reactor in the next decade that would fit in a semi trailer.

These follow on the heels of prior announcements from:

And, of course, ITER keeps plodding along, projecting that they might have something interesting by 2027, after consuming about $20 billion.

I've seen some speculation that Lockheed-Martin's concept might be related to EMC2 Fusion's results, although I don't see evidence from the available information.  At any rate, three announcements from three different groups within a week leads me to wonder whether something is afoot.  For one thing, there is the October 13-18 International Atomic Energy Agency Fusion Energy Conference.  But I also suspect that there is some grant or venture funding cycle that the three are going to compete for.

Interesting times for fusion research...

Thursday, July 31, 2014

EPA: Please regulate carbon dioxide emssions

Text of my testimony before the EPA yesterday (July 30, 2014):

Good afternoon.  My name is Ross Cunniff.  I am a Fort Collins City Council member, but I am speaking only on my own behalf today.

My father was born and raised in Colorado.  Although he left Colorado to serve in the US Army, we returned frequently in the 1960s and 1970s to visit our family here.  I have vivid memories of Colorado from those days.  I remember startling blue skies, fast-running mountain streams, tree-covered hillsides, and snow-capped mountain-tops.  My wife and I moved to Colorado in 1987 to raise our family.  Although many more people lived here by then, the character of the state was much the same as I remembered, and we delighted in sharing it with our daughters as they grew up.

However, the past decade has seen significant change for the worse.  Colorado is not the same as it was when I was growing up.  The view of the Front Range is frequently obscured by haze.  The mountains are not snow-capped nearly as often as they used to be.  Glaciers in Rocky Mountain National Park have receded.  The forests have been devastated, first by the infestation of pine beetles, and then by wildfires.  Drought has alternated with severe flooding, the impacts of which are made worse by the newly barren hillsides.  And diseases like West Nile are now present in Colorado, where they never were before.

All of these impacts are related to the significantly warmer climate.  The proof is in the numbers.  The frequency and duration of record-breaking heat waves has increased dramatically.  Not only that, but the intensity and length of cold spells has decreased.  This has directly impacted our watershed, and has led to the spread of warmer-weather insects, parasites, and diseases which would not have survived the winters of the past.

This is not a natural disaster, or something that is “just happening” to us.  People are the direct cause of this rapid climate change.  Our carbon dioxide emissions continue to increase, creating an invisible blanket around the planet which keeps heat from escaping into space.

On the Fort Collins City Council, we spend significant time and money dealing with the effects of climate change.  We had to add new water treatment stages to deal with ash from the 2012 High Park fire.  We, along with most communities in Larimer County, are still working to recover from the 2013 flash floods.  We spend time, energy, and money on policies and procedures regarding West Nile Virus in our community.  Although we have an aggressive climate action plan, we understand that we only control a small part of the United States’ carbon dioxide production.

This is why we need the federal government to help.  We need to act together as a united country, and rapidly and dramatically reduce our production of carbon dioxide.  Coal-fired power plants are the biggest single producers of CO2.  The proposed EPA regulations are a necessary start to our action.

My wife and I recently discovered that we are soon to become grandparents.  This has made my resolve to address climate change that much more passionate.  I want my grandchildren - and all our grandchildren - to enjoy the same beautiful Earth that we enjoyed.  Please act to help make that happen.

Saturday, November 30, 2013

Time-correlated animated GIF of ISON from NASA/STEREO

Thursday, November 28, comet C/2012 S1 (ISON) went through perihelion.  It's not clear what happened to it, yet, but the world had a ringside view thanks to NASA's STEREO spacecraft.  These spacecraft orbit the Sun.  Right now, they are opposite the Sun from Earth:

I took the animated GIFs I found at and time-correlated them into a single animated GIF, which you may find here:

[Original image credit: NRL/NASA]

If ISON does emerge somewhat intact, expect a plethora of images from amateur astronomers around the world.  Stay tuned...

Friday, January 11, 2013

Running for City Council

Today, I announced my bid for Fort Collins City Council, in District 5 (the current councilmember, Kelly Ohlson, is term-limited).  You can read all about it at - it should be a great adventure!

Sunday, December 16, 2012

GoPro Hero3 Black Multi-Camera Timing

In the previous post, I explored the field-of-view of a GoPro Hero3 Black camera.  In this post, I explore the timing of two cameras, both paired with the same remote.  I set the cameras to 848x480 240Hz video, pointed them at a kitchen timer that has an LED blink once per second, and recorded.  Here are four images from each camera, composed together so you can see how the timing varies:

So, accurate to within 2 frames at 240 Hz - only about 8 milliseconds or so of difference.  Should be good enough for my purposes.  The bigger concern is the color shift apparent between them.  Note that the bottom image seems a little more saturated than the top.  Probably correctable, but annoying.

GoPro Hero3 Black Field of View

I got two GoPro Hero3 Black cameras and am planning a panoramic project with them.  However, to do the project correctly and accurately, I need a good read on their field-of-view.  So, I set up a tripod and a grid and a tape measure, and took a few photos.  Here they are, desaturated and contrast-enhanced, with central red dots and some annotations.  First, measuring the diagonal FOV:

Next, the horizontal FOV:

Finally, the vertical FOV:

The front of the camera lens was almost exactly 17 inches from the grid.  The camera body started about 17.25 inches from the grid.  Assuming the sensor is embedded some distance into the body, I used an estimated field-to-sensor distance of 17.5 inches.  This yields the following field-of-view, in degrees:

Diagonal: 146
Horizontal: 121
Vertical: 93

Doing a little interval math on the field-to-sensor distance shows these angles are accurate to about plus or minus 1.5 degrees.

Interestingly, Photoshop seems unable to correct the barrel distortion of the GoPro's built-in lens.  The EXIF information says it is a 2.77mm f/2.8.  I suspect it is some sort of a non-linear distortion (i.e. stronger toward the corners than in the middle).  I'll do a little math and see what I can figure out...

Edit - Dec 29 2012
I wrote a program to account for the spherical projection the lens uses.  It is a very straightforward projection, and works out to a horizontal field-of-view of roughly 114 degrees (i.e. a little smaller than I calculated, probably due to the difficulty of reading the tape measure numbers as they get squished toward the edge).  Basically, you can reproject the pixels to a flat plane by scaling the distance of each pixel from the center of the image proportional to the atan of that distance, divided by the constant which comes out to half the horizontal field-of-view:

r = atan(r) * (180 / (WIDTH_HALF_ANGLE*M_PI)) * (w/2);

Using this correction, here is the diagonal FOV image, reprojected:

The keystoning of the sewing board is due to the fact that the camera was not facing directly perpendicular to it, so there is a perspective distortion.  Two things show that this is the correct projection:

1. The left and right edges of the sewing board, reasonably straight in reality, are straight in this image
2. The tape measure is a consistent width across the entire image.

Edit 2 - Mar 28, 2013
To make it absolutely clear how I did this, here is a code fragment from the C program I hacked together for this.  Strictly point-sampled (no interpolation) but good enough to demonstrate the math.

/* Half of the horizontal field-of-view, in degrees */
#define WIDTH_HALF_ANGLE        57

int i, j; // loop counters
int w, h, c; // input: image width & height & # of components (typically 3 or 4)
int nw, nh; // Expanded width-height range to pick up all the pixels
double x, y, r, ang; // temporary floating point variables
int ix, iy; // calculated indices
unsigned char *img, *dst;  // Source and destination raster images

    nw = w * 2.5;
    nh = h * 2.5;

    for (i = 0; i < nh; i++) {
        for (j = 0; j < nw; j++) {
            // Calculate fractional x/y coords - (0,0) is the center of the image
            x = (j - nw*0.5) / (0.5 * w);
            y = (nh*0.5 - i) / (0.5 * w);

            // Calculate distance from center, and normalize to a unit vector
            r = sqrt(x*x + y*y);
            if (r > 0.0) { x /= r; y /= r; }

            // Calculate the angle of this unit vector from
            // horizontal-to-the-right
            ang = atan(r) * 180 / (WIDTH_HALF_ANGLE*M_PI);

            // Calculate adjusted distance this pixel really was
            r = ang * w/2;

            // Figure out where in the image that distance is
            // (nearest neighbor sampling)
            ix = x*r + w/2 + 0.5;
            iy = h/2 - y*r + 0.5;

            // If that source pixel is within the image bounds...
            if ((ix >= 0) && (iy >= 0) && (ix < w) && (iy < h)) {
                // ... then copy it over
                for (n = 0; n < c; n++) {
                    dst[c*(i*nw + j) + n] = img[c*(iy*w + ix) + n];