最近在琢磨能不能用 CNN 来训练一个模型,用于控制一个模型小车,实现简单的循迹或者所谓的自动驾驶。于是拿出布灰已久的 Edison + 两轮平衡车 + 罗技摄像头,计划将这几样组装起来,上面运行 ROS 作为我的“机器人”平台,然后在笔记本上运行 master 做运算与控制。本笔记记录 ROS 在 Edison 上安装与运行 usb_cam 获取图像传输到主机的过程。

主要还是按照 Installing ROS Indigo on Intel Edison, Installing ROS Indigo on Raspberry Pi 这两个文档进行安装,但过程中会遇到不少问题,并且由于 Edison 用户可能比较少,大多都需要找相关资料来解决。

本笔记假设读者已经拥有基础 Linux 操作技能,某些基础操作不会细说。

安装 ubilinux

参考下面文档:

https://learn.sparkfun.com/tutorials/loading-debian-ubilinux-on-the-edison

将 ubilinux 安装到 sd 卡启动

因为 Edison 自带的 emmc 只有 4G,安装各种包之后空间只能勉强够用,因此建议使用 8G 以上的 sd 卡安装系统,安装在sd卡上还有一个好处就是可以简单的将系统备份下来。可参考下面文档:

https://github.com/sarweshkumar47/Boot-Intel-Edison-from-SDCard-with-Debian-Ubilinux

系统初始化

配置 wifi:

wpa_passphrase wifiid wifi_password

然后修改 /etc/network/interfaces,禁用 usb 网卡,使用 wlan0,将 wpa-ssid 跟 wpa-psk 配置上。

初始化的配置,顺便把 locale 配置一下

apt-get update
dpkg-reconfigure locale

安装 boost 1.5.3 库

Debian Wheezy 自带的 boost 库版本为 1.4.9,如果按此版本编译安装 ROS Indigo 的话会报以下错误:

error: macro "BOOST_SCOPE_EXIT" passed 2 arguments, but takes just 1

查看相关文档得知,Indigo 对应的 boost 版本为 1.5.3,可以按 Getting Started on Unix Variants 编译安装,也可以下载我编译好的 deb 包进行安装(编译一次需要 N 个小时)。当然,如果你有兴趣的话也可以尝试编译自己的deb包,参考 https://github.com/ulikoehler/deb-buildscripts/blob/master/deb-boost.sh

下载 deb 包: boost-all_1.53.0-1_i386.deb boost-all-dev_1.53.0-1_i386.deb

安装:

apt-get install libicu48
dpkg -i boost-all_1.53.0-1_i386.deb boost-all-dev_1.53.0-1_i386.deb

安装 opencv 库

编译安装:

下载opencv 2.4.9 代码

环境准备

apt-get install build-essential
apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev ffmpeg
apt-get install python-dev python-numpy


根据这里对代码进行修改 https://github.com/NextThingCo/buildroot/blob/master/package/opencv/0002-superres-Fix-return-type-value-VideoFrameSource_GPU.patch

263 行


-    return new VideoFrameSource(fileName);
+    return new VideoFrameSource_GPU(fileName);

在 CMakeLists.txt 中 set(OPENCV_VCSVERSION “2.4.9”)

mkdir release
cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..

编辑 CMakeCache.txt CPACK_BINARY_DEB:BOOL=ON

make
make install

上面这步可能需要运行 N 个小时

make package

可能会出错

CPackDeb: dpkg-shlibdeps: dpkg-shlibdeps: need at least one executable

按照这里的 patch 对 cmake 进行修正:https://public.kitware.com/Bug/view.php?id=13488

附预编译的 deb 包: OpenCV-2.4.9-i686-libs.deb OpenCV-2.4.9-i686-dev.deb OpenCV-2.4.9-i686-python.deb

编辑安装 ROS

可以参考 Installing ROS Indigo on Intel Edison, Installing ROS Indigo on Raspberry Pi 进行安装,但有两点区别:

1.2 console_bridge:

在运行下面命令后

sudo checkinstall make install

输入 2 并且将包名改为 ‘libconsole_bridge’ .

3.2.2 Resolving Dependencies with rosdep

运行 rosdep install 的时候去掉 -y 参数,并且跳过 apt-get install libboost-all-dev.

error while loading shared libraries: libconsole_bridge.so.0.3: cannot open shared object file: No such file or directory

如果你遇到这个错误,可以通过下面方式处理

cd /opt/ros/indigo/lib
sudo ln -s /usr/local/lib/i386-linux-gnu/libconsole_bridge.so.0.3 libconsole_bridge.so.0.3

编译 usb_cam

usb_cam 的编译跟前面 ros_comm 类似:

mkdir catkin_ws
cd catkin_ws
mkdir src
rosinstall_generator usb_cam image_transport_plugins --rosdistro indigo --deps --wet-only --exclude roslisp --tar > indigo-usb_cam.rosinstall
wstool init src indigo-usb_cam.rosinstall
rosdep install --from-paths src --ignore-src --rosdistro indigo -r --os=debian:wheezy
#跳过opencv boost相关的包
source /opt/ros/indigo/setup.bash
catkin_make

你也可以在之前的工作区上操作,因为新工作区会导致某些包又要重新编译,但好处就是以后 make 跑的时间会短一点。

运行 usb_cam 将 Edison 图像传输到电脑

开始运行之前请确认主机跟从机都可以相互ping通,并且可以ping通自己。

现在主机运行:

roscore

主机上开多一个终端,运行:

rosrun rviz rviz

Edison上编辑 launch 文件,运行

source devel/setup.bash
roscd usb_cam
vim launch/usb_cam.launch
roslaunch usb_cam.launch

usb_cam.launch 的内容,假设你主机的名字为 lam

<launch>
  <env name="ROS_MASTER_URI" value="http://lam.local:11311"/> 
  <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
    <param name="video_device" value="/dev/video0" />
    <param name="image_width" value="640" />
    <param name="image_height" value="480" />
    <param name="pixel_format" value="yuyv" />
    <param name="camera_frame_id" value="usb_cam" />
    <param name="io_method" value="mmap"/>
  </node>
</launch>

在 rviz 窗口上添加一个 Image,topic 为 /usb_cam/image_raw ,使用 compressed 传输。

Done.

Update 2017-04-22:

最终成果,由于加上电池后二轮平衡车难以平衡起来,干脆在万能的淘宝加工了几张有机玻璃板做成三轮车。Edison用串口跟单片机通讯,控制前进后退转弯。

发现 ROS 的确方便,除了跟底层通讯的模块用 C 写之外,其他用 python 写起来会感觉好享受。

Edison ROS