ROS 节点和ROS Master是ROS 中两个重要的组件:

####ROS Master:
当任意的节点在ROS系统中启动的时候会寻找ROS Master并将其名字注册到ROS Master上。因此ROS Master包含了整个系统上所有Node的信息,
当任何一个节点信息改变后将会产生一个回调,并且用最新的信息对齐进行更新,这些信息往往是用于节点间连接所需要的必要信息。当一个节点开始发布一个topic,节点将会将topic的名字和数据类型信息传递给ROS Master,ROS Master将会检查是否有其他的节点订阅了这个topic,如果有任何的节点订阅了这个topic,ROS Master将会共享发布者的消息给订阅者节点。
在获取到节点的详细信息后,两个节点将会使用TCPROS协议进行交互,当两个节点链接到一起后,ROS Master将不再其作用,我们可以按照我们的意愿停止发布者或者订阅者节点。
ROS_MASTER_URI 环境变量包含ROS Master的IP地址以及端口信息,使用这些信息ROS节点可以定位到ROS Master位置,当这两个参数不对的话两个节点将不会成功连接。如果ROS运行在单个系统中,我们可以使用localhost的IP,但是在分布式系统我们必须准确定义这个环境变量,只有这样远程的节点之间才能够相互通信,在ROS系统中一般我们只需要一个ROS Master,在分布式系统ROS Master必须位于所有节点都能ping到的机器上。

####ROS Node:

一个ROS机器人应用通常是由很多的ROS节点构成,每个节点之间使用ROS Topics,Services和Paremeter Service进行交互。
使用节点有如下优点:

  1. 使用节点可以提高整个系统的错误容忍度,即使一个节点挂掉了,整个机器人系统仍然可以工作
  2. 节点可以降低系统的复杂度,增加系统的可调试性

每个运行的节点都拥有一个名字用于同系统的其他部分区分开来。

ROS 还提供了一个rosnode用于操作ros节点:

rosnode info [节点名] 这个用于打印节点的信息

Node [/hello_world_node]
Publications:
* /rosout [rosgraph_msgs/Log]

Subscriptions: None

Services:
* /hello_world_node/get_loggers
* /hello_world_node/set_logger_level

contacting node http://raspberrypi:60715/ ...
Pid: 1863
Connections:
* topic: /rosout
* to: /rosout
* direction: outbound
* transport: TCPROS

rosnode kill [节点名] 这个用于杀死正在运行的节点

rosnode list 用于列出所有正在运行的节点

/hello_world_node
/rosout
rosnode machine [机器名] 用于列出在一个机器上运行的所有节点
rosnode machine raspberrypi

/hello_world_node
/rosout

rosnode ping 这个用于检查一个节点的连通性

rosnode ping hello_world_node
rosnode: node is [/hello_world_node]
pinging /hello_world_node with a timeout of 3.0s
xmlrpc reply from http://raspberrypi:60715/ time=1.881838ms
xmlrpc reply from http://raspberrypi:60715/ time=2.676964ms
xmlrpc reply from http://raspberrypi:60715/ time=2.720833ms
xmlrpc reply from http://raspberrypi:60715/ time=2.691984ms
ping average: 2.492905ms

rosnode cleanup 这个用于清除用不到的节点

前面介绍过ROS package是ROS系统的最基本的单位,我们可以创建ROS package编译它并发布出去。
ROS 使用catkin编译系统进行编译的,使用catkin的好处是它可以很容易移植到支持CMake和Python的操作系统上。

下面就介绍如何创建一个catkin工作空间:

  • 创建一个catkin工作目录和src目录
mkdir ~/catkin_ws/src
  • 进入src目录,package就是创建在这个目录下:
cd	~/catkin_ws/src
  • 初始化catkin工作空间
catkin_init_workspace
  • 这时候虽然我们并没有作什么操作,但是我们仍然可以对其进行编译,首先退到catkin_ws目录,也就是src的上一级目录,运行catkin_make
catkin_make

这时候在/catkin_ws/ 目录就会生成buid devel 这两个文件夹,将source ~/catkin_ws/devel/setup.sh 添加到/.bashrc

echo "source  ~/catkin_ws/devel/setup.sh" >> ~/.bashrc

添加完后最好查看下是否生效

  • 创建package
    catkin_create_pkg ros_demo_pkg	roscpp	std_msgs actionlib actionlib_msgs

它的语法是catkin_create_pkg [package名] 依赖包
roscpp 在使用ROS C++ 编写代码的时候都需要添加这个依赖
std_msgs 这个包包含了ROS 基本的原始数据等
actionlib 这个用于创建可抢占的任务
actionlib_msg 这个包含了用于在action服务器和客户端之间进行交互的标准消息定义

  • 编译workspace
    退到workspace 在工作空间目录运行编译项目的命令:
    ~/catkin_ws$ catkin_make
    build文件夹包含了编译的脚本,src目录包含了项目的源码,devel包含类了bash脚本,头文件等。


ROS项目文件的结构如下图所示:

  • Packages: 这是ROS软件最常用的单元,它包含ROS 的运行时进程 nodes,库,配置文件等
  • package manifest: package 清单文件位于一个package里面,包含了关于包的作者,依赖关系等信息,和nodejs的package.json类似
  • Meta Package:指的是一组特殊目的而存在的包
  • Meta Package manifest: 作用和package manifest一样,但是二者有较大的区别,这会在后面的部分进行介绍
  • Messages: 用于ROS 进程间的
  • Services: 和Message一样也是一种进程间通信的方式,但是它是基于一种请求/答复的交互方式
  • Repositories:和我们通常所说的git Repositories一个概念

Packages 结构:

一个典型的ROS 包结构包含下面几个目录:
config: 这个包所需要的所有的配置文件都放在这个位置
include/package_name: 这个目录下包含这个包所需要的全部头文件以及库文件
scripts: 这个目录用于存放可执行的Python脚本
src: 这个目录用于存放可执行的C++代码
launch: 这个目录用于存放用于加载ROS 节点的加载文件
msg: 这个目录用于存放自定义的消息
srv: 这个目录用于存放自定义的服务
action: 这个目录用于存放自定义的Action
package.xml: 这个是这个package的清单文件
CMakeLists.txt: 这个是编译这个package的CMake 编译文件


Package有关的命令:

catkin_create_pkg :用于创建一个新的package
catkin_make :用于编译Ros package包
rospack : 获取package信息
rosdep : 用于安装package的依赖关系


package.xml

<?xml version="1.0"?>
<package>
<name>learn_Ros_1</name> 包名
<version>0.0.0</version> 版本
<description>The learn_Ros_1 package</description> 描述

<!-- 需要有一个 maintainer信息,但是不限于一个,可以有多个,每个maintainer信息占用一行-->
<!-- Example: -->
<!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
<maintainer email="tbfungeek@163.com">tbfungeek</maintainer>


<!--需要有一个授权信息,可以有多个,每个占用一行 -->
<!-- 如下是目前最为常用的几个 : BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
<license>BSD</license>


<!-- Url 标签是可选的,但是可以有多个,每个占用一行 -->
<!-- 可选的属性类型可以是 : website, bugtracker, or repository -->
<!-- 比如: -->
<!-- <url type="website">http://wiki.ros.org/learn_Ros_1</url> -->


<!-- Authors 标签是可选的,但是可以有多个,每个占用一行 -->
<!-- Authors 不一定是维护者 -->
<!-- Example: -->
<!-- <author email="tbfungeek@163.com">tbfungeek</author> -->

<!-- *_depend 标签用于特殊的依赖 -->
<!-- 可以依赖 catkin packages 或者系统 system dependencies -->
<!-- Examples: -->
<!-- build_depend 用于定义在编译时所需要的包 -->
<!-- <build_depend>message_generation</build_depend> -->
<!-- buildtool_depend 用于定义所需要的编译工具 -->
<!-- <buildtool_depend>catkin</buildtool_depend> -->
<!-- run_depend 用于定义运行时所需要的包: -->
<!-- <run_depend>message_runtime</run_depend> -->
<!-- test_depend 用于定义只有在测试的时候才需要的包 -->
<!-- <test_depend>gtest</test_depend> -->
<buildtool_depend>catkin</buildtool_depend>

<!-- The export tag contains other, unspecified, tags -->
<export>
<!-- Other tools can request additional information be placed here -->
</export>
</package>
ROS meta packages

Meta packages 和其他的package 不一样它只有一个package.xml文件.它不包含其他目录和文件,它只是将多个包组织成一个逻辑意义上的包。
在package.xml 文件中没有依赖节点只有 来包含组织在meta 包中的包。


ROS messages

ROS 节点可以发布特定类型的数据,消息的数据类型定义在ROS package的msg包里面,以.msg为扩展名的文件里面
消息类型的定义和我们定义一个变量形式上很类型,下面是一些例子:
int32 number
string name
float32 speed
在上面的例子中第一部分称为“field type” 第二部分称为“field name” 用于从消息中获取数据,通过上面的定义我们可以使用msg.number来获取number消息的值

下表是ROS内建的数据类型:

| Primitive type | Serialization | C++ | Python |
|——–|——–|
|bool(1) |unsigned 8-bit int|uint8_t(2)| bool|
|int8 |signed 8-bit int| int8_t| int|
|uint8|unsigned 8-bit int| uint8_t|int (3)|
|int16|signed 16-bit int| int16_t |int|
|uint16|unsigned 16-bit int| uint16_t |int
|int32|signed 32-bit int| int32_t| int|
|uint32|unsigned 32-bit int| uint32_t |int|
|int64|signed 64-bit int| int64_t |long|
|uint64|unsigned 64-bit int| uint64_t |long|
|float32|32-bit IEEE float| float |float|
|float64|64-bit IEEE float| double |float|
|string|ascii string(4)| std::string |string|
|time |secs/nsecs unsigned 32-bit ints |ros::Time|rospy.Time|
|duration|secs/nsecssigned 32-bit ints |ros::Duration|rospy.Duration|

除了上述的消息类型,ROS还支持特殊的消息类型 — 消息头,消息头中可以包含时间信息,消息序列id等,它主要用于指定是谁正在发送这个消息
下面是一个简单的消息头例子:
uint32 seq
time stamp
string frame_id
下面的命令可以用于查看某个特定消息头的消息

$rosmsg show std_msgs/Header

ROS services

ROS 是节点之间基于请求答复的模式的交互方式,一个节点发送一个请求,直到从另个请求获得答复为止,请求的描述符和消息的描述符相似,都是定义在一个以.msg结尾的文件中,而服务的定义是存放在包的srv目录下,以.srv为结尾的文件中。
下面是一个描述服务的例子:

#Request	message	type
string str
---
#Response message type
string str

ROS 主要有七大元素构成:

ROS Nodes: ROS 节点是用于执行处理的进程,每个节点都是使用例如roscpp和rospyROS库函数API来实现的,在一个机器人应用中往往有许多节点来执行不同的任务,使用ROS 交互的方法可以在节点之间进行交互和交换数据,

ROS Master: ROS Master 提供了名字注册和查询其他的服务的功能,没有Master,节点之间将不能找到彼此,不能交换信息或者数据,或者触发服务。在分布式系统中一般将节点运行在单独的电脑上,远程的节点可以通过这个Master找到彼此。

Parameter Server: 参数服务器是ROS Master 的一部分,它允许将系统的数据存储在一个中心位置,所有的节点可以访问和修改这些值。

Messages: 消息是节点之间进行交互的一种方式,它使用一个简单的数据结构进行消息传递。这是一种比较轻量级的交互方式,我们可以使用系统提供的类型外还可以使用自定义的消息类型。

Topics: 每个ROS消息是通过称为topics的总线来传输的,当一个消息通过topic发送出去的时候可以称为这个节点正在发布消息。反之,如果一个节点正在通过一个topic接收消息的时候称为,这个节点正在订阅消息。发布消息的节点和接收消息的节点可以不必知道对方,简而言之,发布节点和接收节点是彼此解偶的,每个topic有一个单独的名字,任何的节点都可以通过它来发送和接收消息,但是前提条件是这个类型要对。

Services: 在有些机器人应用中上述的发布订阅交互方式并不适用,发布订阅是一种单向的传输系统,而服务是一种双向的请求/答复的交互方式,我们可以定义一个包含两个部分的服务,一个用于请求另一个用于回复,当一个客户端节点发送一个请求消息到服务的时候,服务将会发送响应结果给客户端,客户端需要等待直到服务给出答复。

Bags:包是用于保存和回放ROS数据的格式,它适用于存储那些难以收集并且对开发和测试算法十分重要的数据。

对于编程一款强大的IDE将会极大地提高编程效率。对于ROS编程也一样。对于在PC机上编程我这边推荐的是使用QT,因为它基本不需要什么设置十分易用。对于树莓派上面编程,偏向于使用Vim,今天先介绍使用qt在PC机上编写ROS程序:

  • 首先配置Qt快捷方式启动文件:
    gedit ~/.local/share/applications/DigiaQtOpenSource-qtcreator.desktop
    这时候有可能会打开空白的文件,这是由于你输入的文件名不对,这时候可以ls ~/.local/share/applications/ 在这个目录找和上面类似是文件

如果成功打开DigiaQtOpenSource-qtcreator.desktop快捷方式文件,可以看到文件内容如下:

[Desktop Entry]
Type=Application
Exec=/home/jimmy/Qt5.2.0/Tools/QtCreator/bin/qtcreator
Name=Qt Creator (Opensource)
GenericName=The IDE of choice for Qt development.
Icon=QtProject-qtcreator
Terminal=false
Categories=Development;IDE;Qt;
MimeType=text/x-c++src;text/x-c++hdr;text/x-xsrc;application/x-designer;application/vnd.qt.qmakeprofile;application/vnd.qt.xml.resource;text/x-qml;text/x-qt.qml;text/x-qt.qbs;

修改 Exec 变量一行改为 Exec=bash -i -c /home/jimmy/Qt5.2.0/Tools/QtCreator/bin/qtcreator,保存并退出。添加 bash -i -c 是为了在通过快捷方式启动Qt Creator的同时加载ROS环境变量

  • 启动Qt Create
  • Open File or Project
  • 选择package下的CMakeLists.txt
  • 点击 Open,将会出现编译路径选择对话框。这里需要 Browse 将路径修改为 ~/catkin_ws/build/ 的路径。也就是工作空间目录下的build目录
  • 点击 Next 后,在出现的对话框的 Arguments 一栏填入 -DCMAKE_BUILD_TYPE=Debug (不填后面将无法调试),然后点击 Run CMake 即可开始编译,如果没有错误信息,则点击 Finish 完成,在 Edit界面可以看到工程结构,可以开始编辑工程了。

参考材料:

answers.ros.org/question/9068/which-ides-do-ros-developers-use/
http://wiki.ros.org/IDEs

编程是一门实践性很强的技术,个人比较不喜欢光学理论的方式来学习,下面就先用ROS来写个Hello World来让大家对ROS编程有个感性的认识:
切换到用于存放ROS 项目的目录,创建Hello World项目文件夹

mkdir hello_world_tutorial
cd hello_world_tutorial

下面我们要实现一个什么例子呢?就简单得创建一个node然后打印出Hello World Log吧:
创建 hello_world_node.cpp

hello_world_node.cpp

// Include ROS C++ API函数
#include <ros/ros.h>
int main(int argc, char** argv) {
//向ROS master 声明当前程序为 "hello_world_node" node
ros::init(argc, argv, "hello_world_node");
//启动ROS node
ros::start();
//打印一个Log信息
ROS_INFO_STREAM("Hello, world!");
//处理ROS 回调函数,直到收到Ctrl + C 事件
ros::spin();
//退出
ros::shutdown();
return 0;
}

使用g++命令编译,下面的某些地方可能需要根据你安装的ROS版本的不同而修改,比如/opt/ros/indigo/include ,这些地方可以进入opt/ros/查看你电脑上安装的ROS 版本。并替换下面命令中对应的版本,我的树莓派上面安装的是indigo

g++ hello_world_node.cpp -o hello_world_node -I/opt/ros/indigo/include -L/opt/ros/indigo/lib -Wl,-rpath,/opt/ros/indigo/lib -lroscpp -lrosconsole -lrostime

下面是对上面命令的说明:

hello_world_node.cpp 要编译的源码
-o hello_world_node 输出可执行文件的名字
-I/opt/ros/indigo/include 包含的头文件的地址
-L/opt/ros/indigo/lib 静态库的地址
-Wl,-rpath,/opt/ros/indigo/lib 共享库的地址
-lroscpp 链接libroscpp.so 库
-lrosconsole 链接librosconsole.so库
-lrostime 链接librostime.so库

运行完上面的命令你会看到在当前目录下会生成hello_world_node可执行文件,试着运行下:

./hello_world_node

这时候会报如下错误:

ERROR: ROS_MASTER_URI is not defined (Bad Environment)
[FATAL] [1392021564.231775029]: ROS_MASTER_URI is not defined in the
environment. Either type the following or (preferrably) add this to your
~/.bashrc file in order set up your local machine as a ROS master:
export ROS_MASTER_URI=http://localhost:11311
then, type ‘roscore’ in another shell to actually launch the master program.

其实这个错误信息已经十分明显:
这里提示没有ROS_MASTER_URI这个环境变量。其实这个环境变量是在/opt/ros/indigo/setup.sh 中定义的,所以你现在要做的就是运行下面命令,来让它生效。

source /opt/ros/indigo/setup.sh

但是这种方式只对当前的终端有效,如果你退出该终端又会出现上述的问题,所以推荐将其放在.bashrc文件上,这样就不需要每次启动一个终端都source一下。

再次运行hello_world_node将会出现如下提示:

[ERROR] [1392014787.460431497]: [registerPublisher] Failed to contact master at [localhost:11311].  Retrying...

ROS Master 允许ROS 之间能够彼此找到自己,两个ROS 节点如果需要运行必须具备两个条件

  1. ROS Master已经运行
  2. 要进行通信的ROS节点需要在ROS Master上声明

这是由于没有运行roscore,roscore 提供一些功能,这些功能中包含提供ROS Master,有了ROS Master 节点之间才可以相互找到对方并且进行通信。
这时候只需要重新创建一个终端,在终端上运行:

roscore

这时候在原来的那个终端再次运行hello_world_node,如果没有其他以外的话就可以输出如下的消息了:

[ INFO] [1392020655.967763511]: Hello, World!

PS:我在做上面实验的时候还遇到了下面的问题:

c_locale name not valid

遇到这个问题很简单只需要在终端中运行: export LC_ALL=”C” 即可


之前介绍了使用scp命令来在电脑和树莓派之间互传文件以及文件夹,这里还可以使用Filezilla 在二者之间传输文件,下载Filezilla

然后输入树莓派的ip地址以及登入用户名和密码如下所示:

这里需要注意的是ip地址之前一定要添加sftp://.

  1. 安装ssh工具:

    sudo apt-get install ssh	
  2. 重启ssh工具

    /etc/init.d/ssh restart
  3. 获取远程linux系统的ip地址

    ifconfig
  4. 复制文件或目录命令:

  • 将本地文件拷贝到远程:
    scp 文件名用户名@计算机IP或者计算机名称:远程路径

    本地192.168.1.8客户端
    scp /root/install.* root@192.168.1.12:/usr/local/src

  • 从远程将文件拷回本地:
    scp 用户名@计算机IP或者计算机名称:文件名本地路径

    本地192.168.1.8客户端取远程服务器12上的文件

scp root@192.168.1.12:/usr/local/src/*.log /root/

如果复制的是目录请在scp后面加 -r 参数

准备工具:
硬件:
树莓派3(包括电源适配器),SD卡(大于8G的高速卡),读卡器,一根网线。
也许你会问树莓派3已经搭载了板载wifi还要网线干吗?其实网线是用于第一次查看它的网址用的,后面会一一介绍。

  1. 在官网 https://www.raspberrypi.org/downloads/ 下下载需要安装的操作系统的镜像。


这里有很多可以安装的操作系统,NOOBS 是最方便安装的,特别适合初学者,但是这个需要在有显示器的情况下才能使用,因为安装过程需要交互,
我这里就不详细介绍这个的安装方式了,大家可以自己在网上搜索下,其实NOOBS并不是一个操作系统,它只是一个安装系统的引导方式。
我们这里介绍的是安装RASPBIAN系统,它是基于debain系统简化的,目前最新的系统代号为Jessie。点击进去下载该镜像,这里有两种模式一种是全功能版本的
这个比较大,解压后镜像大概有4G多,还有一个Lite版本解压后大概1.3G。我这边没有对比过具体少了哪些软件,处于个人的SD卡空间为16G所以先安装全功能版本的。

我这边下载的是2016-03-18-raspbian-jessie.zip,解压后你会看到2016-03-18-raspbian-jessie.img这个镜像文件。

  1. 将镜像文件烧写到SD卡上,将SD卡插入读卡器,下载烧写软件如果你的系统和我一样是LinuxMint那么系统已经自带了烧写软件。ImageWriter。
    如果你的系统是Ubuntu 那么你在软件库中也搜索这个烧写工具,如果是Window 就需要下载win32diskimager-v0.9-binary.zip。这个烧写过程很简单,这里就不详细介绍了。

  2. 将SD卡 装入树莓派,接上电源,看下红色电源灯的旁边那个黄色灯是否在闪烁,如过有就说明镜像烧写成功了,如果有显示屏接上去就可以看到了,但是我们不是没有显示屏吗?所以还得想个办法。
    首先查询树莓派的ip地址,用网线将树莓派与路由器相连,在电脑上登入路由器,一般都是192.168.1.1这个地址,以管理员的身份进入,在右边选择DHCP服务器–> 客户端列表。如下所示:


    可以看到名字为raspberrypi的设备,以及它的ip地址

  3. 打开终端输入ssh pi@[步骤3 查到的IP地址]

如果你不是第一次安装可能之前安装过,又重新刷了镜像,这时候会出现如下提示:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
…………………………………………….
Please contact your system administrator.
…………………………………………….
remove with: ssh-keygen -f “/home/jimmy/.ssh/known_hosts” -R 192.168.1.102
ECDSA host key for ………… has changed and you have requested strict checking.
Host key verification failed.

初看一下是不是被吓到了,其实很简单运行如下命令重新登入就可以了:

rm -rf ~/.ssh/known_hosts 

再次输入ssh pi@[步骤3 查到的IP地址]
你就可以看到:

Are you sure you want to continue connecting (yes/no)?

输入yes再输入密码就可以了,初始密码为raspberry,看到下面的命令行就说明进入ok了。

5 . 安装VNC 通过它你可以以图形界面的方式访问树莓派的桌面,在通过步骤4 ssh方式进入树莓派的情况下输入如下命令:

sudo apt-get update
sudo apt-get install tightvncserver

上面的意思是往树莓派上安装VNC服务,安装完成后就可以在树莓派运行VNC服务了。

vncserver :1

然后会要求你输入密码,这个是用于连接的时候使用的和登入的那个密码不同,需要8位字符。

Would you like to enter a view-only password (y/n)?

这个直接输入n就可以了。

接着需要在电脑上安装VNC客户端,我这边使用的是VNC Viewer 可以在 http://www.realvnc.com 网站上下载。下载完成后安装就可以了。
安装完成后运行,会出现如下界面


最后的那个是端口号可以随意指定。
点击连接输入密码就可以连接到树莓派了,这时候你就可以看到如下界面兴奋吧。

6 . 设置树莓派的Wifi地址,这个就不用介绍了吧和电脑设置wifi一样,设置完后就可以摆脱网线了。

7 . 乱码问题解决
细心的你一定观察到刚刚登入的时候会出现如下问题,并且在使用VNC进入的时候会出现乱码,下面介绍下解决方式:

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_PAPER = “zh_CN.UTF-8”,
LC_ADDRESS = “zh_CN.UTF-8”,
LC_MONETARY = “zh_CN.UTF-8”,
LC_NUMERIC = “zh_CN.UTF-8”,
LC_TELEPHONE = “zh_CN.UTF-8”,
LC_IDENTIFICATION = “zh_CN.UTF-8”,
LC_MEASUREMENT = “zh_CN.UTF-8”,
LC_NAME = “zh_CN.UTF-8”,
LANG = “en_GB.UTF-8”
are supported and installed on your system.
perl: warning: Falling back to a fallback locale (“en_GB.UTF-8”).

1.更新终端  sudo apt-get update 
2.安装中文字库 sudo apt-get install ttf-wqy-microhei
3.进入更改系统中的菜单界面 sudo dpkg-reconfigure locale
4.用空格键勾选前面带有 “zhCN” 的选项,选中zhCN.UTF-8
重启就可以了

8 . 设置VNC自动启用:

在上面介绍VNC的时候你可能会发现一个问题,但是一旦重启,你用客户端就等不上去了,这是因为VNC服务不是自动启用的,你需要进入SSH重启VNC Server或者把VNC Server设置为重启时自启动。
步骤如下:
ssh登入树莓派home目录:
cd 到.config目录下:

cd .config

在.config文件夹下建立一个’autostart’目录。

mkdir autostart

然后cd进去:

cd autostart

编辑一个配置文件:

vim tightvnc.desktop

这里需要注意的是树莓派是默认是没有安装vim的所以在执行这个之前需要事先安装Vim

然后输入下面的内容:
[Desktop Entry]
Type=Application
Name=TightVNC
Exec=vncserver :1
StartupNotify=false

保存退出,重启树莓派,就可以了

9 . 在我第一次使用的时候我遇到了一个问题,我的SD卡是16G的,并已经知道镜像大小为3G左右空间,但是我装了一个较大的软件的时候提示没有剩余空间了,这个有点搞笑,那个软件并没有那么大,那么空间去哪里了?其实SD卡刷完系统后,只有前4G空间是可用的。如果要使用整个SD卡,那么需要对其进行扩容,也就是说让树莓派系统识别4G以后的空间,下面就介绍下如何扩容。

使用VNC 进入树莓派,选择Rapsberry Pi configuation


切换到System页面,点击Expend FileSystem

使用df -h 就可以看到容量扩展到16G了

10 . Camera 启用:
树莓派上有一个Camera并行接口,接上Camera后还需要在树莓派上使能后才能使用,使能方法如下:
还是9步骤的那个切换到interace子页,在Camera那一项上选择Enable就ok了。

好了让我们拍个照片试试:
输入下面命令获取一张图像保存到image.jpg

raspistill -o image.jpg -rot 180

这时候就可以在主目录地址下多出了image.jpg照片。

11 . 设置时区

  • 安装ntp

    sudo apt-get install ntpdate 
  • 修改时区

    tzselect
  • 配置网络对时选择国内的ntp服务器

    sudo ntpdate cn.pool.ntp.org
  • 输入选择使用的时区信息为亚洲上海

    sudo dpkg-reconfigure tzdata