智能机器人(07):安全证书配置

一、启用 ssl
二、获得证书
三、自建证书
四、服务器的证书部署
五、客户端的证书设置
十、在做一份

对于传输密码或私密信息的http明文没有可靠性可言,需要https,为此需要制作ssl证书。

商业的权威机构用ca来证明某个.crt公钥属于特定组织或个人。.crt证书网站部署的证书文件。.key的私钥可以解密用.crt公钥加密后的信息(小心保管)。而.csr包含了.crt的公钥信息,供网站向CA发起认证请求,中间文件。

一、启用 ssl

$ sudo a2enmod ssl
这条命令相当于做软链接:
$ sudo ln -s /etc/apache2/mods-available/ssl.load /etc/apache2/mods-enabled
$ sudo ln -s /etc/apache2/mods-available/ssl.conf /etc/apache2/mods-enabled
对应的停用是:
$ sudo a2dismod ssl

二、获得证书

这个有自签名的和商业购买的两种方式。 大多数浏览器会对自签署的证书报警,可以从价格比较便宜的Comodo购买, 为了购买先产生自己的私钥和请求文件:
$ openssl req -new -newkey rsa:2048 -nodes -keyout mykey.key -out mycsr.csr
然后发送给 Comodo 购买证书:
Root CA Certificate – AddTrustExternalCARoot.crt
Intermediate CA Certificate – COMODORSAAddTrustCA.crt
Intermediate CA Certificate – COMODORSADomainValidationSecureServerCA.crt
Your PositiveSSL Certificate – mycrt.crt

三、自建证书

3.1 创建CA签名
$ sudo openssl genrsa -des3 -out zdh2.key 1024
如果不使用密码去除-des3选项
3.2、创建CSR
$ sudo openssl req -new -key zdh2.key -out zdh2.csr
3.3、自己签发证书
$ sudo openssl x509 -req -days 3650 -in zdh2.csr -signkey zdh2.key -out zdh2.crt
3.4、或者一步完成:
$ sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/apache2/ssl/zdh2.key -out /etc/apache2/ssl/zdh2.crt
上面的: openssl,命令行工具;req,证书类型;-x509,需要生成自签名证书文件,而不是证书请求文件;-nodes,不需要密码保护.key文件,否则每次apache都会提示输入密码;
-days 3650,证书有效期;-newkey rsa:2048: 同时生成rsa私钥和证书;-keyout,命名私钥文件;-out,命名证书文件。

四、服务器的证书部署

4.1、复制到某个目录
$ sudo mkdir /etc/apache2/ssl
$ sudo cp zdh.crt /etc/apache2/ssl …..
4.2、修改配置文件
以上步骤后/etc/apache2/sites-available/目录下会在/etc/apache2/sites-enabled/下有软链接,修改它:
$ sudo vim ……sites-enabled/default-ssl.conf
在段中保证以下内容:
SSLEngine On
SSLOptions +StrictRequire ???
SSLCertificateFile /etc/ssl/certs/zdh.crt
SSLCertificateKeyFile /etc/ssl/private/zdh.key
4.3、监听端口
检查/etc/apache2/ports.conf文件中443>(ssl的端口)
已经监听:
Listen 443
4.4、此时启动apache会提示输密码,如果不想的话在httpd.conf修改IfModule ssl_module 配置:
“SSLPassPhraseDialog exec:/home/admin/xxx/conf/apache_pass.sh”
而 apache_pass.sh 内容就是显示密码:
#!/bin/sh
echo “password”

4.5、测试部署
在客户机从浏览器访问:
https://serverIP
浏览器可能报警证书问题。需要通过下面步骤对客户机的证书做设置。

五、客户端的证书设置

7.1 Chrome
Q: 如果browser是google的chrome的话,会报错“Failed to get access to local media. Error code was Permission Denied”
因为,chrome needs https to use get user media,Updated to secure http and everything works fine.
由于,Starting with Chrome 47, getUserMedia() requests only allowed from secure HTTPS or localhost, so need to setup a self signed ssl certificate for webserver and and access with https://722.20.10.11:8080
所以,如果使用chrome浏览器的话,可以部署自签署证书采用ssl实现https。
如果一定要选择http实现webrtc的话,那就用firefox浏览器不要用chrome。

Q: how to always accept webRTC webcam request in chrome?
if command line:
$ google-chrome “http://localhost” –use-fake-ui-for-media-stream
which avoids the need to grant camera/microphone permissions.
or, on Chrome:
chrome://settings/content#media-stream-mic

APP: List of Chromium Command Line Switches
http://peter.sh/experiments/chromium-command-line-switches/

7.2 Firefox
Q: how to always accept webRTC webcam request in firefox?
Go in url about:config
Search media.navigator.permission.disabled
dbClick or set value to true

7.3 Setup ssl https connection
As mentioned earlier, apps running on Chrome browsers can’t access local cameras and microphones unless the application is hosted from localhost or an SSL server (https).
When you are doing development, it is simplest to get node.js to handle the SSL. Benefits of using SSL:
* Increase end user confidence
* Secure signaling traffic from eavesdroppers
* In Chrome: Browser remembers camera and microphone sharing preference for site. Does not re-ask at each – visit.
* In Chrome: Enables screen sharing API
Before applying, you will need to generate a CSR (Certificate Signing Request). The most common software used for generating CSR’s and handling SSL is OpenSSL,
There are many operating system specific guides available for how to use SSL on your server Self signed certificates are a free method of creating a certificate suitable for development. A warning will occur when browsing your site.
http://www.selfsignedcertificate.com/ <— from thi st ogenerate or, You can create a key and certificate yourself instead of downloading them from this page. This makes your key more secure. To generate a key: $ openssl genrsa -out 172.20.10.3.key 2048 And the certificate: $ openssl req -new -x509 -key 172.20.10.3.key -out 172.20.10.3.cert -days 3650 -subj /CN=172.20.10.3 or, to buy one http://bit.ly/i95aUS 如果是商业购买的,证书链可靠,浏览器不需要设置。 如果是自签名的,需要导入或下载证书,各个浏览器不同。 5.1、Firefox 这个在访问https://serverIP时, 会提示网站不可信任。 那么添加例外就可以: exception->confirm security exception https://serverIP ok,就可以通过ip地址访问。 5.2、Chrome 这个访问https://IP-address,浏览器: Your connection is not private Attackers might be trying to steal your information from 116.50.77.22 (for example, passwords, messages or credit cards). NET::ERR_CERT_COMMON_NAME_INVALID 具体的: This server could not prove that it is 116.50.77.22; its security certificate is not trusted by your computer’s operating system. This may be caused by a misconfiguration or an attacker intercepting your connection. Proceed to 116.50.77.22 (unsafe) 所以,同样需要添加证书: edit->preference->advanced setting->https/ssl->authorities->import->ok. 但是, Chrome非常憎恨自签署证书Why does Chrome hate self-signed certificates so much。 浏览器依然不能像http那样通过IP地址访问服务器,对于https://serverIP这种方式依然报警: Server’s certificate does not match the URL 所以,需要根据证书里Issued to的域名信息修改: $ vi /etc/hosts 10.10.0.1 dehaou14-n501jw $ ping dehaou14-n501jw ok https://dehaou14-n501jw/ ok

十、在做一份

对于webRTC的nodejs使用8080端口的音视频聊天服务,重复上述步骤,生成zdh2_rtc.crt和zdh2_rtc.key,重复上述步骤部署。

智能机器人(05):虚拟网络配置

一、需求
二、证书体系
三、模块安装
四、一些准备
六、—CA证书制作
七、—Server证书制作
八、—Client证书制作
九、—Server端典型配置
十、—Client端典型配置

  • 一、需求

机器人走出去之后,连接的可能是商场的无线wifi,也可能是厂区的无线热点,这些都是局域网,凡是属于下三个subnet的地址都是局域网,公网寻不到:
10.0.0.0 10.255.255.255 (10/8 prefix)
172.16.0.0 172.31.255.255 (172.16/12 prefix)
192.168.0.0 192.168.255.255 (192.168/16 prefix)
那么如何从茫茫机海中定位机器。为了实现目的需要在局域网上再假设一层专有网络。

1.1、例如场景:
1、服务器srv1处于香港某位置;
2、机器人rbt、rbt2…处于某个超市局域网内,ip地址是172.16.1.111,172.16.1.111…;
3、管理后台pc1、pc2…位于某个科技公司局域网内,ip地址192.168.1.66和192.168.1.88…;
4、那么此时通过srv1新建一虚拟网络VPN,使得rbt1、rbt2、pc1、pc2的虚拟网络为10.8.1.100/ 111/ 122/ 133,这样这台机器就位于同一网络了,不管物理空间上位于何处都可以通过node访问rostopic,或者ssh等常规管理。

1.2、服务器的配置文件为:客户机的配置文件为:
rbt1和rbt2上要合适配置/etc/hosts,并运行roscore。
pc1和pc2上要合适配置/etc/hosts,并export ROS_MASTER_URI=http://rbt:11311。
完成后可以测试:
$ rosnode ping /somenode

  • 二、证书体系

openVPN提供了多种身份验证方式,包括:预享私钥,第三方证书,用户名/密码组合。
openVPN大量使用openSSL加密库中的SSLv3/TLSv1协议函数库,例如x509。
x509证书链一般用到三类文件,key,csr,crt:
key是私用密钥,openssl格式,通常是rsa算法,爱咋用咋用。
csr是证书请求文件,用于申请证书。在申请的时候必须使用自己的私钥来签署申请,还可以设定密钥。
crt是证书文件是签署人用自己的key签署的凭证。通常签名证书时候需要一个序列号避免两个证书重复。

2.1、具体到本应用证书包括:
ca证书,服务器的Server证书,客户机的Client证书。

2.3、各文件的用途
文件名———-位置———-目的———–私密性
ca.crt—–server + all clients—–Root CA certificate—–NO
ca.key—-key signing machine only—–Root CA key—–yes

ta.key—–server + all clients—-antin DDOS—–yes
dh{nnn}.pem—-server only—–Diffie Hellman parameters—–NO

server1.crt—-server only—–Server Certificate—–NO
server1.key—–server only—–Server Key—–yes

client1.crt—–client1 only—–Client1 Certificate—–NO
client1.key—–client1 only—–Client1 Key—–yes

client2.crt—–client2 only—–Client2 Certificate—–NO
client2.key—–client2 only—–Client2 Key—–yes

… …

  • 三、模块安装

3.1、vpn安装
$ sudo apt-get install openvpn
3.2、easy-rsa安装
$ sudo apt-get install easy-rsa

  • 四、一些准备

通过easy-rsa制作三个证书。
首先单纯是为了方便考虑,在/etc/openvpn/目录下创建easy-rsa文件夹
$ sudo mkdir /etc/openvpn/easy-rsa/
然后把/usr/share/easy-rsa/目录下的所有文件全部复制到/etc/openvpn/easy-rsa/下
$ sudo cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/
当然也可以直接在/usr/share/easy-rsa/下制作证书,为了管理证书把easy-rsa放在openvpn下。

  • 六、—CA证书制作

6.1、编辑vars文件,设置证书组织信息:
$ sudo vi /etc/openvpn/easy-rsa/vars
export KEY_COUNTRY=”CN”
export KEY_PROVINCE=”ZJ”
export KEY_CITY=”HZ”
export KEY_ORG=”HDhello”
export KEY_EMAIL=”HD@most.in”
export KEY_OU=”WestLake”
export KEY_NAME=”Server1”
!!! 其中export KEY_NAME=”Server1”这个要记住统一,制作Server端证书时用到。
6.2、切换到root用户:
$ sudo su
使其生效:
$ source vars
执行clean-all删除当前目录下的keys文件夹:
$ ./clean-all
6.3、制作CA证书:
./build-ca
6.4、常见错误
如果:
140224783447712:error:0E065068:configuration file routines:STR_COPY:variable has no value:conf_def.c:618:line 198
line 198 of openssl-1.0.0.cnf reads:
subjectAltName=$ENV::KEY_ALTNAMES
这是因为 vars文件里面缺少一行, 在vars文件最后添加这一行:
export KEY_ALTNAMES=”something”
尽管这不是原本vars文件中有的但是还是把它加到文件的尾部,负责不能避免build-ca脚本失败。

这样查看keys目录看到已经生成ca.crt和ca.key两个文件,如此CA证书制作完成。
为了方便把该CA证书ca.crt文件复制到openvpn的启动目录/etc/openvpn下
$ cp keys/ca.crt /etc/openvpn/

  • 七、—Server证书制作

$ ./build-key-server Server1
!!!!! 注意上述 Server1,就是前面vars文件中设置的KEY_NAME。
这样可以查看生成的Server证书, 已经生成 Server1.crt、Server1.key和Server1.csr三个文件。

再为服务器生成加密交换时需要的Diffie-Hellman文件
$ ./build-dh
可以查看生成的文件,已经生成了dh2048.pem这个文件

再生成防止DDoS攻击的ta.key
$ openvpn –genkey –secret keys/ta.key

然后把 Server1.crt、Server1.key、dh2048.pem、ta.key复制到/etc/openvpn/目录下
$ cp keys/Server1.crt keys/Server1.key keys/dh2048.pem keys/ta.key /etc/openvpn/

  • 八、—Client证书制作

$ ./build-key Client001
!!!!! 注意上述 Client001是客户端的名称,这个可以自己定义。
这样可以看出已经生成 Client001.csr、Client001.crt和 Client001.key这个三个文件。
根据需要部署的客户机的数量,可以继续添加:
$ ./build-key Client002
… …
NOTE:
next time after several days i fu want to re-build some client files rember to sudo su first.

  • 九、—Server端典型配置

首先从openvpn自带默认模版复制Server端所需的配置文件:
$ cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
$ cd /etc/openvpn/
$ gzip -d server.conf.gz
!!! 注意在修改server.conf文件时候需要绝对路径
$ vi server.conf

port 22105 —指定端口号
proto tcp —指定协议
dev tun —指定非briage

ca ca.crt
cert Server1.crt
key Server1.key
dh dh2048.pem

tls-auth ta.key 0 # This file is secret

server 10.10.0.0 255.255.248.0 —The server will take 10.10.0.1 for itself, the rest will be made available to clients
ifconfig-pool-persist ipp.txt —Maintain a record of client virtual IP address associations in this file.

cipher BF-CBC # Blowfish (default)
auth SHA512 —Message Authentication
comp-lzo —Message Authentication
push “route 10.10.0.0 255.255.248.0”
persist-key
persist-tun
tun-mtu 1500
tun-mtu-extra 32

然后可以开启openvpn服务:
$ /etc/init.d/openvpn start
$ netstat
$ netstat -tunlp | grep 22105
可以看出openvpn已经在此启动,而且确实使用TCP协议22105端口而非默认的1194。

  • 十、—Client端典型配置

客户端所需的证书包括CA证书和Client证书。需要网络下载或者USB拷贝到客户机上。注意各个文件的权限。
CA证书主要使用crt结尾的文件,Client证书主要使用crt和key结尾的两个文件:
$ cp /media/ClientPC/UUI/ca.crt Client001.crt Client001.key /home/ClientPC/myvpn
修改以上几个文件的用户属性
$ chown dehaou1404:dehaou1404 ca.crt
$ chown dehaou1404:dehaou1404 Client001.*
把几个私钥文件降低权限:
$ chmod 600 ta.key Client001.key

然后使用openvpn默认的模板制作Client端配置文件:
$ cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /home/dehaou1404/myvpn
$ chown dehaou1404:dehaou1404 client.conf
$ nano client.conf

client —指定当前VPN是客户端
dev tun —指定非briage
proto tcp —与服务器端的保持一致

remote 192.168.1.3 22105 —指定远程服务器的实际public IP地址 和端口号
ca ca.crt
cert Client001.crt
key Client001.key
tls-client —使用TLS加密传输,server端为Server,client端为tls-client
tls-auth ta.key 1 —和Server配置一致 注意最后参数是1
#如果服务器设置了防御DoS等攻击的ta.key,则必须每个客户端开启;未设置则注释掉这一行;

# Server使用build-key-server脚本什成的,在x509 v3扩展中加入了ns-cert-type选项
# 防止VPN client使用他们的keys + DNS hack欺骗vpn client连接他们假冒的VPNServer
ns-cert-type server
# 指定采用服务器校验方式 注意easy-rsa的默认脚本中是没有ns-cert-type server的设定,
# *千万不要*在配置中加上这个设定。否则会导致TLS handshark failed。

persist-key —通过keepalive检测超时后重新启动VPN,不重新读取keys保留第一次使用的keys
persist-tun —通过keepalive检测超时后重新启动VPN,一直保持tun或者tap设备是linkup的

comp-lzo —与服务器保持一致 对数据进行压缩,
auth SHA512 —指对于数据通道的加密方法。
cipher BF-CBC —在交换密钥时用到的加密方法,真正影响传输性能。根据速度选择合适加密算法,
# 在服务器和客户端openvpn配置中用cipher BF-CBC或cipher AES-128-CBC指明,服务器+客户配置都更改。

tun-mtu 1500 —为了兼容,1500依然是诸多以太网卡的默认MTU设置,
# 但是厂商对如今1G/10G等高端网卡以及超五类/六类双绞线以及光纤的高大上特性又不能视而不见
tun-mtu-extra 32 —openvpn如果使用TCP协议,MTU一般不用修改;如果是用UDP协议,可以设置tun-mtu 1450会改善网络.
! mssfix 1450
ping-restart 60 —设置成120秒,尽可能和ping拉开距离,
# 这两个参数保证不会因为ping-restart导致断开,这样就将问题全部集中在控制通道了
ping 10 —设置为5秒,尽可能短,但不要太短

然后客户机可以加入虚拟网:
$ sudo openvpn –config client.conf
如果开机启动后台运行的话把命令写入/etc/rc.local文件中, 添加到语句:exit 0 前面:
/usr/sbin/openvpn –config /home/ClientPC/myvpn/client.ovpn > /dev/null &
注意:&符号不能省略避免阻塞系统启动。
***注意***:证书文件如果没有存放在/etc/openvpn/目录下,在.conf文件中要填写该文件的绝对位置路径。

  • 附、参考高级配置

https://help.ubuntu.com/lts/serverguide/openvpn.html
http://answers.ros.org/question/11045/how-to-set-up-vpn-between-ros-machines/

https://github.com/Nishida-Lab/TC2015/wiki/OpenVPN_ROS_client
http://www.lxway.com/4442182692.htm

智能机器人(04):通用网络配置

分布式特点的ROS对网络配置的要求主要四点:

1、只能有一台作为master,
2、所有节点node必须通过ROS_MASTER_URI配置为相同的master,
3、配对机器的所有端口必须具有完全的双向连接,
4、所有机器必须广播一个其他机器可以解析的机器名。

先设置三个环境变量,$ROS_MASTER_URI,$ROS_HOSTNAME,$ROS_IP :
ROS_MASTER_URI,整个ROS系统的主机IP+端口,启动roscore
ROS_HOSTNAME 和 ROS_IP设置ROS节点公网地址,两者互斥,ROS_HOSTNAME优先

常规可以这样设置:
export ROS_MASTER_URI=http://`hostname -I`:11311
export ROS_HOSTNAME=`hostname`
export ROS_IP=`hostname -I`
不带i的是主机名、带了i的输出主机地址(需要先设/etc/hosts)

再假设三台机器的应用场景:
一台笔记本作为robot的主机,master230 ,172.20.10.5;
一个台式机作为workstation的客户端,client501 ,172.20.10.3;
然后我们工作在远程的第三台笔记本上,client480,172.20.10.1.

1、edit  /etc/hosts file

To know the mapping of some hostnames to IP addresses before DNS can be referenced. This mapping is kept in the /etc/hosts file. In the absence of a name server, any network program on your system consults this file to determine the IP address that corresponds to a host name. For example in master’s netbook :

IPAddress—– Hostname—–Alias

127.0.0.1 localhost master230 .xxx.com

172.20.10.5 master230 master230.xxx.com

172.20.10.3 client501 client501.xxx.com

172.20.10.1 client480 client480.xxx.com

然后我们工作在远程的第三台笔记本上,client480,172.20.10.1。

don’t forget to restart your network for the changes to take effect:

$ /etc/init.d/networking restart

2、网络设置

首先,master230和client480的所有端口需要完整的双向连接。
1、自身ping
测试robot ,$ping master230
测试客户端 ,$ping client480
2、互相ping
测试robot ,$ping master230
测试客户端 ,$ping client480
3、netcat
只能自身ping通和相互ping通仅仅检查了相互之间的ICMP包正常,但这还是不够的,需要验证所有端口可用,完整地检查很困难,因为有65K个端口,可以使用netcat尝试
特定的端口测试。挑选大于1024的端口号:
(1)测试master230到client480, 启动netcat监听:
$netcat -l 1234
(2)在client480连接master230,
$netcat master230 1234
(3)互相聊一聊,正常。
(4)然后更换一个方向,正常。

3、多机互联

1、启动master
注意只能有一台作为master,这里选择master230作为master:
$roscore
$export ROS_MASTER_URI=http://p110:11311/
2、启动一个听者
$ssh hal
$export ROS_IP=p110.local
$export ROS_MASTER_URI=http://p110.local:11311
$rosrun rospy_tutorials listener.py
3、启动一个讲者
$ssh marvin
$export ROS_IP=dehao-B3.local
$export ROS_MASTER_URI=http://p110.local:11311
$rosrun rospy_tutorials talker.py
此时可以看到p110接收到来自dehao-B3的消息。
4、其实这是双向的,下一步互换:
把讲者和听者在两台机器之间互换,同样工作。
5、便利操作
如果长期这样使用,可以把上面的命令添加到.bashrc中。

在ROS节点node广播主题topic时,提供的是hostname:port组合也就是URI,有几种设置方法。
1、显式的设置名字
ROS_IP和ROS_HOSTNAME是设置ROS的node时候可选的环境变量,他们是互斥的,同时设置的话优先的是ROS_HOSTNAME,所以我们一般是设置ROS_HOSTNAME而不是设置ROS_IP。

4、时间同步

在坐标变换出现错误:TF complaining about extrapolation into the future时,首先要检查不同机器之间的时间矛盾:
$ntpdate -q other_computer_ip
必要的话安转chrony同一时间。

1. Check one machine against another machine:
$ ntpdate -q other_computer_ip or hostname
2. Install Chrony:
$ sudo apt-get install chrony
3. For instance computer c2 gets its time from computer c1 then add following line:
$ sudo /etc/chrony/chrony.conf
server c1 minpoll 0 maxpoll 5 maxdelay .05
4. That machine will then slowly move its time towards the server.
$ sudo /etc/init.d/chrony stop
$ ntpdate other_computer_ip
$ sudo /etc/init.d/chrony start
5. manually sync NTP
$ sudo ntpdate ntp.ubuntu.com

实际环境中:
需要把多个机器人rbt1、rbt2…和不同服务器server-vpn、server-web…和各个管理计算机pc1、pc2…配置在同一个虚拟专网里面,并配发不同的vpn证书已进行安全管理。
对于后台管理系统,需要通过ssl配发不同的证书进行安全管理。对于远程操操纵,更要配发证书进行安全管理。

智能机器人(02):系统功能

1. 自助定位导航机器人的功能

建图、定位、和导航:
gmapping – 负责建立地图
amcl – 确定在地图的位置
move_base – 导航

2. 自助定位导航机器人的控制

这张三种颜色的图:
白色代表已经实现而且是必需的
灰色代表已经实现的但是可选的
蓝色代表必需的,而且对硬件平台不独立的

中间的move_base这个大框包括: 全局地图,局部地图,全局路径,局部路径,还有恢复机制。
把move_base大框看作黑盒子,可以看到它要五个接口:
4个输入(”/tf”, “/odom”, “/map”,“/scan”)
1个输出(“cmd_vel”)

要使move_base大方框运行起来,就得构建好这4输入和1输出:
tf: 各个坐标系之间的转换关系。
odom: 根据各个轮速度推算出的航向信息,即机器人在odom坐标系的x,y坐标及航向角yaw。
map: 机器人在此地图中的目标位置。
scan: 传感器的信息用于定位。如果假定map坐标系和odom坐标系重合就不要scan了。
cmd_vel: 包含的是期望的机器人的前进速度和转向速度。

具体流程是:
move_base收到goal以后,通过基于actionlib的client向服务器发送此目标goal,actionlib服务器根据tf关系以及odom消息,不断feedback机器人状态给client, 规划和控制twist。

3. 自助定位导航机器人的架构

从低到高依次分为:
*1 motion driver
*2 base controller
*3 sensor sources
*4 gmapping+amcl
*5 move_base navi

*1 motion driver
这是最底层的电机驱动和反馈:
电机驱动: 硬件重要模块,不存在通用的电机驱动。
点击反馈:通过编码器将滚动圈数转化为距离,在ROS中edcoder就是 odometry
DSP活51单片机都可以满足要求。定时采样码盘值给base,同时对左右轮分别进行控速。

*2 base controller
base controller必须运行在robot自己的电脑上,负责两件事情:
第一是:在odom话题发布里程计数据,并可选的发布 odom -> base_link的tf转换。
第二是:在cmd_vel话题上发布控制线速度和角速度的大小。
这层的软件不需要关注硬件的差异,根据ROS接口写的程序换台robot依然可以运行。
给让其他节点订阅的odom,主要用航迹推演法将各个轮速度转化为机器人的x轴方向速度和机器人的旋转速度,然后发布。
由move_base规划输出的cmd_vel, 需要注意速度的平滑速度,给下位机执行。
要注意odom发布频率,涉及到costmap更新与坐标系的访问超时。

*3 sensor sources
单靠一个传感器可能是不够的,尤其是采用 kinect 之类只有小角度的景深设备。
这时候就需要用到多传感器融合的方法。多传感器融合定位、自定位是很重要的一部分,精度直接影响到建图导航的准确性。

*4 gmapping+amcl
通过laser或者rgbd完成地图的构建。一旦有了环境的地图,通过amcl实现robot的自主定位。
amcl定位模块作为move_base规划层的输入,模块间通讯方式实现了模块间的完全解耦。
所以导航规划层用什么定位方法,静态还是动态的地图,对于导航层内部几乎没有区别。

*5 move_base navi
在地图上指定一目标地点及到达时的robot位姿,通过自主规划路径到达。
机器人根据里程计的数据依靠move_base同时结合local和global代价地图去做路径规划,最终到达目标地点。
在机器人运动过程中,可以做到避障。在避障过程中,自动调整robot的移动速度。

NEXT:
智能机器人系统功能(01)
智能机器人运动驱动(03)
智能机器人基控制器(05)
智能机器人传感器源(07)
智能机器人自助定位(09)
智能机器人数据融合(11)
智能机器人自主导航(13)
智能机器人导航调试(15)
智能机器人任务调度(17)
智能机器人系统功能(19)