Category: Article

How to contact USCIS and what to expect

For any foreigner in the US, when it comes to immigration related issues, there are always a lot of stories to tell. My recent story is about renewing my EAD (work authorization in the US) card.

After I sent out my renewal application, I have tried multiple methods to contact USCIS and would like share the experience here. My case is a little special that what I need to get legitimate work authorization again is simply the receipt notice from USCIS that my application is accepted to be processed. Usually it only takes 2 weeks for one to receive this letter in mail. Sometimes it doubles.

The application was sent to Lockbox and the official in-take process can be found here. The official website has listed a number of tools to submit all kinds of requests. But before having the receipt letter with a receipt number, most of them are not applicable.

  1. First thing you can try is to email the local Lockbox office at It takes a few days (e.g. 17 days in my case) to get the reply. But the local office should have the first-hand information about the thing I’ve submit. If they couldn’t find your application at all, I would assume the application is lost. In the end, I firstly get my receipt number from the kind officer through this email address.
  2. Second thing you can try is to call USCIS contact center. Trying to schedule an info-pass or appointment through the answering system could eventually lead you to live representative. The waiting time is usually around 30~60mins in my prior trials. When the representative couldn’t answer my question, I learned that I can ask to escalate the case to a tier-2 representative or officer. It is always better to make the phone call in the morning since the tier-2 representatives/officers do not take calls in the late afternoon. I found the officers are usually efficient and processional with access to more information.  In my case,  when other representatives could not tell me whether or not my receipt letter has been mailed to me, the officer told me that it was mailed out with an accurate mailed-out date.
  3. The last thing I tried is to contact my senator for help. Their contact can always be easily found and their application process is clearly described on their webpages. I provided the nice senator everything I have regarding the case. They actively asked for the things they need. I am not clear how they would contact USCIS. In the end, I didn’t hear back updates regarding my case.

It is always unpredictable when the Immigration documents would get processed and it is a bitter ordeal to one’s patience. Hope these help in relieving your anxiety.

Build a Robot From A Power Wheelchair (1/2)

I have been working on a robotic project for a while. In this project, we build a robotic wheelchair controlled by head motions.


It starts from a commercial powered wheelchair (Titan Front Wheel Drive Power Chair).

We took over the control signals, added a number of sensors and wrote some computer vision softwares. It is a lot of fun. At this time point, we can drive it with head motions, a little slow but very easy to control. A short video is posted.

Robotic Wheelchair
[KGVID width=”640″ height=”360″][/KGVID]

The most challenging part so far, to our surprise, is how to take over the driving signals. In fact, once the powered wheelchair can be controlled with digital signals, it is somehow a robot.

We can find quite a few posts discussing how to hack the joysticks with Arduino. If you have a VR2 joystick, it would be much easier. This post ( explains the process well. Basically, you can reproduce the digital signals triggered by the joystick with the Arduino.

But unfortunately, the joystick with the Titan power chair is with a different design and it is much more difficult to hack.
It is Dynamic Shark controller. If your remote (joystick) looks like this one , you probably have this kind of joystick.

The difficulty in reproducing the control signals generated by this kind of joystick is that it directly outputs 25V differential signals from the remote to the power module, which is a big black box under the seat. The signals are encoded and there is probably no way to get the encoding protocol.

We did quite a few rounds of trial and error and finally figured out a plan after burning out a joystick…


This kind of joystick works in a special way. At the end of the handle of joystick, there is with a small coil. 4 small coils are on the board under it. Because of the electromagnetic induction, the coil on the handle of the joystick produces different signals at different positions in the 4 small coils under it.

Roughly speaking, the (analog) signals produced by the 4 small coils are then processed by an on-board micro-controller to produce the driving signal. Because the signals produced by the micro-controller are encoded in an unknown protocol, we choose to get in by reproducing the outputs from the 4 small coils.

If you take away all 4 small coils (DO NOT do that…), the board looks like this


After some processing circuits, finally the outputs of the 4 coils can be found as two signals passed the two resistances in the red circuits. If you use an oscilloscope to check the signals, you will find that they are sine waves!

With this observation, the plan is clear. Soldering two wires at the right end of these two resistances (be careful!), we need to use an Arduino to reproduce these two sine waves to drive the wheelchair.

One of the two sine waves is for the X-direction and the other one is controlling the driving in the Y-direction.
The phase the sine wave indicates the sign (forward in X-direction or backward in X-direction) and the amplitude indicates the speed. The two sine waves should be sort-of aligned, which means the phase difference should be either 0 or 180.

With an Arduino, we will produce these sine waves signals to the two wires.

Convert the saved checkpoint of cuda-convenet to the proto of Caffe

*Credits of the scripts go to jamt9000 on github, thanks for the helpful work!

You are a deep learning consumer, you have a saved check point you trained with the cuda-convenet. You want to use Caffe to evaluate the trained neural networks on new data possiblely due to the absent of GPU. Hence you need to convert the saved checkpoint to the format compatible to Caffe.

1. check out this version of caffe: jamt9000/caffe:convert-cuda-convnet or my copy.

$git clone convert-cuda-convnet

2. compile it following the Caffe installation instruction

## Misc. Setup 
$make all
$make pycaffe

3. convert the check-point with the following codesnippet

import sys

from convert_net import *

if (len(sys.argv) < 2):
    print "Usage:- path-to-saved-convnet"

arg_convnet = sys.argv[1]
output_prototxt = arg_convnet + "-prototxt"
output_proto = arg_convnet + "-proto"

netpt = cudaconv_to_prototxt(arg_convnet)
fh=open(output_prototxt, 'w')
print "Wrote {0}".format(output_prototxt)

netpb = cudaconv_to_proto(arg_convnet)
fh=open(output_proto, 'wb')
print "Wrote {0}".format(output_proto)
$python saved-convnet-checkpoint

4. Now you should find two files: saved-convnet-checkpoint-proto and saved-convnet-checkpoint-prototxt, they are in an older format, you need some tools provided by Caffe to upgrade them.

5. checkout and compile the up-to-date (or any more recent stable) version of Caffe

6. Under build/tools/ you will find tools named upgrade_net_proto_text.bin and upgrade_net_proto_binary.bin, use them to upgrade the saved-convnet-checkpoint-proto and saved-convnet-checkpoint-prototxt accordingly.

7. Almost done, you may need to manually fix the prototext file a little bit for example, add the input layer following any example proto text files provided by the Caffe.

Good luck!