• RoboCup仿真3D TC笔记(2014年合肥中国公开赛 仿真3D比赛环境搭建)


    所谓“TC“,就是Technology Committee(技术委员),讲的好像很厉害,实则就一“网管”。

    TC的技术含量其实不高,但是涉及的东西很多很杂,网上零零散散的都有,在这里我想总的整理一下,算是栽颗小树吧…

    注:如果你只想自己装个环境写代码的话,请不要看以下写的,真的是无比之烦,建议你看官网的这个或其他博客:

    http://simspark.sourceforge.net/wiki/index.php/Installation_on_Linux;

    接下来,我将按以下流程讲解一下RoboCup仿真3D比赛环境的搭建方法:

    1. 硬件要求:

    (1)电脑硬件要求;

    (2)交换机硬件要求;

    (3)网线硬件要求;

    2. 各个电脑任务分配;

    3. 网络拓扑结构与IP配置(主要针对配置A、B两组);

    4. 系统安装与更新;

    5. 软件安装与系统配置(最麻烦的地方);

    6. 测试与使用。

    以下是几个主要参考资料和当时最新版软件,如果你要找更新的版本,请自行到相应网站查找:

    比赛环境搭建说明2013英文版: http://vdisk.weibo.com/s/A9EtgmXv_PvAg/1414220729

    simspark-0.2.4 : http://vdisk.weibo.com/s/A9EtgmXv_Pvfp/1414220781

    rcssserver3d-0.6.8.1 : http://vdisk.weibo.com/s/A9EtgmXv_PvOT/1414221074

    rcssserver3d-0.6.8.1 补丁(没这个补丁问题也不大) : http://vdisk.weibo.com/s/A9EtgmXv_PvOH/1414221055

    ode-0.11.1-tbb:http://vdisk.weibo.com/s/A9EtgmXv_Ptpj/1414236805

    roboviz:http://vdisk.weibo.com/s/A9EtgmXv_Ptp6/1414236776

    proxy:http://vdisk.weibo.com/s/A9EtgmXv_Ptp8/1414236797

    rclm2:http://vdisk.weibo.com/s/A9EtgmXv_Ptp4/1414236789

    restore.py: http://vdisk.weibo.com/s/A9EtgmXv_OXft/1414335116

    shFor3D.tar.gz: http://vdisk.weibo.com/s/A9EtgmXv_Pg4s/1414380754

    1. 硬件要求:

    (1) 电脑:

    总共要5台(i5/i7 x 1; 中档以上显卡 x 1; i3 配置以上 x 2; 配置随意 x 1)

    因为比赛分为A、B两个小组,一组需要5台,所以这次比赛有10台。这里只以一组举例。

    (这次组织方放血了,给的配置都超预期了,另外,那个“中档以上显卡的电脑”最好用英伟达的,显卡驱动比较好装)

    (2)交换机:

    要一台Gibibit的,也就是千兆交换机,虽说交换机基本都是千兆的,但之前的安徽省比赛就只给了个百兆的……

    分A、B两组比赛时,需要两台。

    (3)网线:

    一般的网线就行。

    以上信息,基本就是那个"2013年英文版“的翻译。

    2. 各个电脑任务分配:

    正所谓“好记性不如烂笔头”,比赛场上有10台电脑,很难搞清谁是谁,所以最好每个都贴个标签。

    (1)cpu最强的那台运行rcssserver3d,给它贴个标签:servera;

    (名字这么看,“server” + “a”,"server"好理解,”a"表示A组,因为我用A组举例的嘛!)

    (2)“中档以上显卡”的那台运行roboviz,给它贴个标签: monitora

    (3)cpu次强的两台分别运行两方球队,分别标记:clienta1,clienta2

    (4)配置最差的那台,作为NFS和NIS,标记:robocup3dfa;

    (为什么是"robocup3d"+"f"+"a"呢?因为这台要装fedora。别看这台硬件配置无所谓,但它却是这个比赛环境的核心!)

    3. 网络拓扑结构与IP配置(主要针对配置A、B两组-----10台电脑):

    这步其实就是在说10台电脑接网线的问题。

    如果只有一组电脑的话,那倒容易,5台电脑都接在同一个交换机上,并给每台电脑分配同一网域的不同IP即可。

    可麻烦就在于有两组电脑,而且正式比赛时还要求各自独立!!! 我心都碎成渣渣了……

    记得常用的两个命令:

    查看IP:ifconfig

    查看链接通断: ping

    以下将分为三个阶段分别给出以及IP配置结构图:

    (1)用于软件更新与软件安装阶段:

    因为我们还要系统更新和软件安装,所以还要连上Internet。

    这时候的IP地址基本是当地网络自行分配的,也可能要自己设定,但方式不重要,重要的是能上网就行。

    那个Internet是连到switch2还是连到switch1上都无所谓咯,这里就连在switch2上了。

    (2)用于代码上传和代码测试阶段:

    这个时候就要自己给电脑分配IP地址了,以下是我给的IP配置,你可以根据自己的习惯,给自己弄个熟悉的。

    monitora:   192.168.2.11    monitorb:  192.168.2.21

    servera:     192.168.2.12    serverb:    192.168.2.22

    clienta1:     192.168.2.13    clientb1:    192.168.2.23

    clienta2:     192.168.2.14    clientb2:    192.168.2.24

    robocup3dfa:  192.168.2.19    robocup3dfb:  192.168.2.29

    所有的子网掩码(Netmask):255.255.255.0

    所有的网关(gateway): 192.168.2.1(明白人应该知道这个是瞎掰的)

    所有的dns: 不用设置(或8.8.8.8)

    "AP"指的是无线路由器,它是用来让大家远程上传代码的,给它的IP是“192.168.2.100”,“100”是随便选的,只要别和上面的一样,随你怎么配。

    "AP"是连在switch1还是switch2上都无所谓,这里我连在switch1上了。

    (这里要说明一下为什么是“192.168.2.xxx“而不是"192.168.1.xxx",因为无线路由器经常分配192.168.1.xxx",为了避免冲突,就用".2"了,当然".3"、“.4"也可以咯。

    如果你对网络不熟悉的话,这句话的进一步理解还得到实践中去体会。)

    (3)用于正式比赛:

    这就让A、B组的机器独立了,不会相互干扰了。

    4. 系统安装与更新:

    继续只用A组举例:

    本次比赛使用两种linux操作系统:

    Ubuntu 12.04 64bit:monitora,servera,clienta1,clienta2

    Fedora 20 64bit:robocup3dfa

    注意:

    1. 在系统安装过程中,会提示设置初始用户的用户名,Ubuntu还会提示设置主机名。

    2. 为了方便记忆考虑,推荐就按以上名字设置:如monitora装Ubuntu时,相应的初始用户名和主机名就都设为monitora。

    3. 建议所有电脑用同一个密码,以后用起来方便。

    系统更新:

    Ubuntu:

    切换root身份:
    sudo -i

    更新:
    apt-get update -y

    Fedora:

    切换root身份
    su
    -

    先装一个自动搜索最快镜像的插件
    yum install yum-plugin-fastestmirror.noarch -y

    更新:
    yum update -y

    5. 软件安装与系统配置(最麻烦的地方):

    首先,我们回顾一下“2. 各个电脑任务分配”里说的东西:

    servera:运行rcssserver3d;

    monitora:运行roboviz;

    clienta1和clienta2 :运行球队程序;

    robocup3dfa:做NFS和NIS;

    安装软件当然要根据它们的不同作用来安装咯!

    为了以后配置考虑,我们先给所有的Ubuntu系统配置root密码:

     passwd root

    好了,那么就先从

    (1)servera开始吧:

    安装ssh服务:
     apt-get install openssh-server openssh-client -y
    安装vim编辑器(如果需要的话): apt
    -get install vim -y
    安装编译器:
    apt-get install g++ -y
    安装各种其他依赖库和相关工具: apt-get install subversion cmake libfreetype6-dev libode-dev libsdl-dev ruby ruby-dev libdevil-dev libboost-dev libboost-thread-dev libboost-regex-dev libboost-system-dev libtbb-dev build-essential automake libtool git libboost-program-options-dev libboost-thread-dev aptitude -y

    编译和安装多线程ode(建议不要装,装过之后server很容易崩溃,而且没它也不影响各个球队表现(多亏KylinSky我才知道这个情况的!)。只是标准要求要用,不过这次比赛就没装它):
    cd ode-0.11.1-tbb/
    ./autogen.sh
    ./configure --enable-shared --enable-malloc LIBS=-lX11
    make -j && make install

    编译安装simspark(我这里就不说明补丁了,说了反而添堵,自己看里面的README,很容易自己加上去):
    cd rcssserver3d-0.6.8.1
    mkdir build
    cd build
    cmake ..
    make
    make install
    ldconfig

    现在就可以运行球场平台了,试试吧!

    (2)monitora:

    安装ssh服务:
     apt-get install openssh-server openssh-client -y
     
    安装vim编辑器(如果需要的话):
     apt-get install vim -y
    
    安装编译器:
     apt-get install g++ -y
    
    安装各种其他依赖库和相关工具:
     apt-get install subversion cmake libfreetype6-dev libode-dev libsdl-dev ruby ruby-dev libdevil-dev libboost-dev libboost-thread-dev libboost-regex-dev libboost-system-dev libtbb-dev build-essential automake libtool git libboost-program-options-dev libboost-thread-dev aptitude -y
    (其实以上和servera的安装一样,其实还多装了一些,图个省心,就这样了)

    安装java,为了运行roboviz:
    apt-get install openjdk-6-jdk openjdk-6-jre -y

    配置roboviz(我以上给的roboviz是个配置好的,不用再配置了):
    cd roboviz
    ./build-linux64.sh

    设置roboviz的server的IP:
    其实现在你就可以打开roboviz了,只是一片黑。
    这是理所当然的,要知道monitora上是没有rcssserver3d的,rcssserver3d在servera上。
    修改文件:roboviz/bin/linux-amd64/resources/config.txt
    将其中: Server Host          :
    localhost
    改为: Server Host          : 192.168.2.12

    安装rclm2(全名RoboCupLeagueManager),它的作用估计也能猜出个大概了吧,先装着,回头还要说它:
    ./configure
    make
    make install

    现在,你可以在servera上运行rcssserver3d,而在monitora上运行roboviz了,这样负荷就从一台机器转移到两台机器上去了(当然,还有交换机)。

    (3)clienta1和clienta2:

    安装ssh服务:
     apt-get install openssh-server openssh-client -y
     
    安装vim编辑器(如果需要的话):
     apt-get install vim -y
    
    安装编译器:
     apt-get install g++ -y
    
    安装各种其他依赖库和相关工具:
     apt-get install subversion cmake libfreetype6-dev libode-dev libsdl-dev ruby ruby-dev libdevil-dev libboost-dev libboost-thread-dev libboost-regex-dev libboost-system-dev libtbb-dev build-essential automake libtool git libboost-program-options-dev libboost-thread-dev aptitude -y
    
    安装java,为了运行proxy:
     apt-get install openjdk-6-jdk openjdk-6-jre -y
    (和monitora一样,只是java的作用不一样)

    ubuntu都OK啦!

    只要Ubuntu们OK了,基本的比赛环境也就可以了。

    现在可以就可以按照以下方式开始比赛了:

    servera    运行    rcssserver3d
    monitora   运行    roboviz
    clienta1   运行    ./start.sh 192.168.2.12
    clienta2   运行    ./start.sh 192.168.2.12

    “原来这样就可以啦!”

    嗯……确实可以这么说,不过,还有几个问题,你要是现在不给解决了,后头有的是苦吃的:

    问题1:你要让各个球队怎么上传代码?U盘拷贝不是不行,只是到时那么多人,不但有上传,还有测试的,测试不行还有再上传的……有你受的了;

    问题2:不要忘记哦!每有一队上传代码,你不但要给clienta1传一份,还得要给clienta2也要传一份,人一多,事儿一多,就有你混乱的了;

    问题3:一个组基本有6到7支队伍,打单循环赛,你要怎么让每两队之间打一场?是让一支队伍先和剩下所有队伍打吗,然后再让一支队伍和剩下所有球队打吗?

             虽说是机器人,咱也不能这么累着人家啊。比赛场次安排也得有个规范的。

    (4)robocup3dfa:

    TC的价值如何体现,就是要看这台机器配置的怎么样了,不多说了,开始吧:

    以下有很多配置,我是用自己写的shell脚本来完成的,每个脚本的功能都很简单:shFor3D.tar.gz

     (robocup3dfa上的所有命令均已root身份运行,除非有特别说明处!!!!!!

    先是些基本软件工具:

    安装vim编辑器(如果需要的话)
    yum install vim -y; 
    
    安装syslog(当时很惊讶,fedora20居然没有自带这个服务)
    yum install rsyslog.x86_64 -y
    
    开启syslog服务:
    systemctl enable rsyslog
    systemctl start rsyslog

    在下载下来的shFor3D.tar.gz,有我写的一个用于远程测试的c源程序,很简单,两个文件共115行(包括空行),先解压编译,已备后用(更多说明见“其他重要信息”):

    解压sim3dStart
    tar -axf sim3dStart.tar.gz
    
    编译sim3dStart服务器和客户端
    cd sim3dStart/
    gcc sim3dStart-server.c -o sim3dStart-server
    gcc sim3dStart-client.c -o sim3dStart-client

    I. 安装和配置NFS服务器:

    啥是NFS(NetworkFileSystem)服务器呢,简单点说,就是个远程U盘,可以通过网络“插”在多台电脑上。

    更进一步可参考:《鸟个的linux私房菜(服务器)》----NFS服务器

    安装NFS需要的两个软件:
    yum install rpcbind.x86_64 -y; 
    yum install nfs-utils.x86_64 -y; 
    
    shFor3D里有个teams文件,用来罗列队名的,很重要!shFor3D里的脚本基本都用到它(一行一个队名,以下是今年的示例,其中ccwss1和ccwss2为测试用户):
    ccwss1
    ccwss2
    AHJZU_3D
    Apollo3D
    CIT3D
    Dreamwing3D
    HS
    HfutEngine3D
    Icarus
    Kylinsky3D
    Miracle3D
    NBUT_kylin
    SEU_Jolly
    Strive3D
    YuShan3D

    创建NFS开放的目录(其实我要开放的是各个参赛队伍的主目录,当然也要同时创建这些用户咯), .
    /UsersInit.sh 运行过之后会产生一个usersPasswd.txt的文件,名面有对应各个用户的用户名与密码 (其实这个脚本还有另一种用法,参见“其他重要信息”)

    如果有用户信息错误,以下命令可以删除所有用UsersInit.sh创建的用户:
    ./UserDel.sh

    现在每个用户已被创建,并且主目录被建立在/robocup3D下,比如ccwss1的主目录为:/robocup3D/ccwss1

    设置NFS的配置文件,即标出要开放那些目录: /etc/exports
    在文件中添加以下内容:
    /robocup3D/ccwss1       127.0.0.1(rw,no_root_squash)    192.168.2.0/24(rw,no_root_squash)
    /robocup3D/ccwss2       127.0.0.1(rw,no_root_squash)    192.168.2.0/24(rw,no_root_squash)
    /robocup3D/AHJZU_3D     127.0.0.1(rw,no_root_squash)    192.168.2.0/24(rw,no_root_squash)
    /robocup3D/Apollo3D     127.0.0.1(rw,no_root_squash)    192.168.2.0/24(rw,no_root_squash)
    /robocup3D/CIT3D        127.0.0.1(rw,no_root_squash)    192.168.2.0/24(rw,no_root_squash)
    /robocup3D/Dreamwing3D  127.0.0.1(rw,no_root_squash)    192.168.2.0/24(rw,no_root_squash)
    /robocup3D/HS           127.0.0.1(rw,no_root_squash)    192.168.2.0/24(rw,no_root_squash)
    /robocup3D/HfutEngine3D 127.0.0.1(rw,no_root_squash)    192.168.2.0/24(rw,no_root_squash)
    /robocup3D/Icarus       127.0.0.1(rw,no_root_squash)    192.168.2.0/24(rw,no_root_squash)
    /robocup3D/Kylinsky3D   127.0.0.1(rw,no_root_squash)    192.168.2.0/24(rw,no_root_squash)
    /robocup3D/Miracle3D    127.0.0.1(rw,no_root_squash)    192.168.2.0/24(rw,no_root_squash)
    /robocup3D/NBUT_kylin   127.0.0.1(rw,no_root_squash)    192.168.2.0/24(rw,no_root_squash)
    /robocup3D/SEU_Jolly    127.0.0.1(rw,no_root_squash)    192.168.2.0/24(rw,no_root_squash)
    /robocup3D/Strive3D     127.0.0.1(rw,no_root_squash)    192.168.2.0/24(rw,no_root_squash)
    /robocup3D/YuShan3D     127.0.0.1(rw,no_root_squash)    192.168.2.0/24(rw,no_root_squash)

    开放防火墙(也是个脚本,每次重启时都要运行一下):
    ./iptables_rule.sh

    开启NFS服务:
    systemctl enable nfs-server.service
    systemctl start nfs-server.service

    到这里,robocup3dfa上NFS服务器就算配置完毕了!

    现在我们要暂且回到ubuntu,去安装NFS客户端(每台Ubuntu都要按装):

    安装nfs客户端(aptitude和apt-get的功能一样,因为这是从别人blog上抄的,尊重原版,我也就这样写了)
    aptitude -y install nfs-common

    好啦!你现在已经完成NFS的全套配置了。

    你在Ubuntu机器上来这样测试一下(注意,此时要先按3. 网络拓扑结构与IP配置”中“(2)用于代码上传和代码测试阶段”的方式来设置fedora和ubuntu的IP):

    showmount -e 192.168.2.19
    成功的话有类似下列输出:
    
    Export list for localhost:
    /robocup3D/ccwss1       127.0.0.1(rw,no_root_squash)    192.168.2.0/24(rw,no_root_squash)
    /robocup3D/ccwss2       127.0.0.1(rw,no_root_squash)    192.168.2.0/24(rw,no_root_squash)
    /robocup3D/AHJZU_3D     127.0.0.1(rw,no_root_squash)    192.168.2.0/24(rw,no_root_squash)
    ........................................(以下省略)........................................
    基本就是和你刚刚配置的在fedora上的配置文件/etc/exports一样

    2012年和2013年我都做过国赛的TC助手,这两界把NFS搭建完毕之后,差不多就算整个环境搭建完成了。

    现在我们不妨测试一下(注意,此时要先按“3.网络拓扑结构与IP配置”中“(2)用于代码上传和代码测试阶段”的方式来设置fedora和Ubuntu的IP),

    在clienta1上操作:
    新建两个文件夹:
    mkdir -p myccwss1 myccwss2

    挂载NFS的两个开放目录到刚刚新建的文件夹中:
    mount -t nfs 192.168.2.19:/robocup3D/ccwss1 myccwss1 mount -t nfs 192.168.2.19:/robocup3D/ccwss2 myccwss2

    在clienta2上操作:
    (同clienta1)
    这时你可以在clienta1(或clienta2)上复制两份可执行文件分别放到myccwss1和myccwss2里。
    假设你是在clienta1上进行复制的,此时你会惊奇的发现clienta2里的myccwss1和myccwss2也有了刚刚复制的文件。
    这就是NFS,一台电脑的硬盘(robocup3dfa)被多台电脑分享了。

    还是按刚刚的方式:
    servera    运行    rcssserver3d
    monitora   运行    roboviz
    clienta1   运行    ./start.sh 192.168.2.12
    clienta2   运行    ./start.sh 192.168.2.12
    开始比赛吧!
    
    

    不过,本着“不作死就不会死”的精神,我们从Ubuntu回到fedora上继续(如果你刚刚进行了测试,请还原IP到能上网的状态):

    II. 安装和配置NIS服务器:

    啥是NIS(NetworkInfomationSystem)服务器呢?说不好,总之是用来统一管理用户等一系列信息用的。

    它主要有两个程序组成:ypserv和yppasswd。

    更进一步可参考:《鸟个的linux私房菜(服务器)》----NIS服务器

    安装NIS服务器程序(ypserv),同时这也是robocup3dfa上最后要安装的软件,安装完成后请按3. 网络拓扑结构与IP配置”中“(2)用于代码上传和代码测试阶段”的方式来设置robocup3dfa的IPyum install ypserv.x86_64 -y
    
    设置NIS(ypserv)配置文件,设置域名与固定ypserv端口:/etc/sysconfig/network
    (在文件最后追加)
    NISDOMAIN=robocup3dfa
    YPSERV_ARGS="-p 1011"

    设置NIS(ypserv)配置文件,设置NIS服务网域:/etc/ypserv.conf
    (在文件最后追加)
    127.0.0.0/255.255.255.0 :       *:      *:      none
    192.168.2.0/255.255.255.0:      *:      *:      none

    设置NIS配置文件,设置IP与域名对应关系:/etc/hosts
    (在文件最后追加)

      192.168.2.11    monitora

      192.168.2.12    servera

      192.168.2.13    clienta1

      192.168.2.14    clienta2

      192.168.2.19    robocup3dfa

    设置NIS(yppasswd)配置文件,固定端口:/etc/sysconfig/yppasswdd
    (在文件最后追加)
    YPPASSWDD_ARGS="--port 1012"

    设置主机名(重启后无效):
    hostname robocup3dfa
    设置主机名(重启后有效):/etc/hostname
    (在文件最后追加)
    robocup3dfa

    开启ypserv和yppasswd服务:
    systemctl enable ypserv
    systemctl start ypserv
    systemctl enable yppasswdd
    systemctl start yppasswdd

    初始NIS数据库:
    /usr/lib64/yp/ypinit -m
    (之后会弹出确认相关信息,基本都是OK,第一个确认是按“ctrl+D", 第二个确认是输入“y"回车,自己仔细阅读看一下吧

    现在我们要暂且回到ubuntu,去安装NIS客户端(每台Ubuntu都要安装):

    安装NIS客户端程序(注意,安装过程中不要走神,中途会弹出窗口让你设置NIS服务器域名,当然,我们得输入:robocup3dfa
    (同时这也是所有Ubuntu上最后要安装的软件,安装完成后请按3.网络拓扑结构与IP配置”中“(2)用于代码上传和代码测试阶段”的方式来设置Ubuntu们的IP:
    aptitude -y install nis

    设置NIS客户端配置文件,指定NIS服务器IP: /etc/yp.conf
    (在文件最后追加)
    ypserver 192.168.1.19

    设置NIS客户端配置文件,给本机加入NIS服务切换规则:
    (就修改红字标注的那些行,其实这几行中"nis"的先后顺序是有蹊跷的,关于“hosts“那行,你若把“nis"放句尾也行,只是在你用sudo,或切换用户,或ping 主机名时……自己可以试试,反正客户端有好几台)
    passwd: compat nis
    group: compat nis
    shadow: compat nis
    hosts: files nis mdns4_minimal [NOTFOUND=return] dns mdns4

    测试NIS客户端:
    yptest
    成功的话,会产生如下输出:
    Test 1: domainname
    Configured domainname is "robocup3dfa"
    
    Test 2: ypbind
    Used NIS server: robocup3dfa
    
    Test 3: yp_match
    WARNING: No such key in map (Map passwd.byname, key nobody)
    ....(中间省略)....
    
    Test 6: yp_master
    robocup3dfa
    
    ....(中间省略)....
    
    Test 8: yp_maplist
    passwd.byname
    protocols.byname
    hosts.byaddr
    hosts.byname
    ....(中间省略)....
    
    Test 9: yp_all
    ccwss1 robocup3d:$1$U9Gccb60$K5lDQ.mGBw9x4oNEkM0Lz/:2001:2000::/robocup3D/ccwss1:/bin/bash
    ....(中间省略)....
    1 tests failed

    总过有9个”test"有一个failed,不过没有关系,NIS照样可以用。

    给每个用户统一设置挂载点:

    创建挂载的入口目录(全都在/robocup3D/***):
    ./mkdir_home.sh
    
    挂载(每次开机重启时,都得要执行):
    ./mount_nfs.sh(注意事项,參见“其他重要信息”)

    我们在Ubuntu上来测试NIS吧,

    a,用户登录测试:
    在clienta1电脑上(密码在之前用UsersInit.sh生成的usersPasswd.txt文件里找):
    su - ccwss1
    密码:
    
    b,修改密码测试:
    yppasswd
    旧密码:
    新密码:
    再输一次:

    OK啦!这次真的是全部OK了,可是,可是……作死的血液又在沸腾了.

    如果有人不小心传错文件了,或有故意恶搞,塞个几十G的文件过来,那还不得把服务器撑爆吗?

    所以,我就给每个用户添加了硬盘容量使用限制,主要用的软件叫quota,不需要安装,fedora自带,那么我们就愉快的开始吧!

    (事实证明quota就是多余的,大家都是中华民族的好儿女,没人恶搞。最最重要的一点就是:那破无线路由器,唉……,组织方给的所有硬件都很到位,就这无线路由器最煞风景了,据说是那天临时从一个办公室抢来的。)

    回到robocup3dfa上

    让根目录支持quota:
    mount -o remount,usrquota,grpquota /
    
    让根目录长期支持quota,修改/etc/fstab
    将这行:
    UUID=5ab7082c-41f4-482e-8a0c-fd90d92884b6   /               ext4    errors=remount-ro  0       1
    改为(你的电脑上应该会有些不一样,但是只要记住是在倒数第三项上追加红色文字就行了):
    UUID=5ab7082c-41f4-482e-8a0c-fd90d92884b6   /               ext4    errors=remount-ro,usrquota,grpquota   0       1

    开启quota:
    quotaoff -vaug
    quotacheck -avugm
    quotaon -vaug

    给每个用户设置500M容量限制(应该没有500M,大概480M多一点的样子):
    ./quota.sh

    好了,你可以到clienta1上测试一下:

    切换ccwss1用户:
    su - ccsww1
    
    创建一个400M的文件并查看:
    dd if=/dev/zero of=bigfile1 bs=1M count=400
    ls -lh
    
    再创建一个400M的文件并查看(这时你看到bigfile2应该只有180几M)
    dd if=/dev/zero of=bigfile1 bs=1M count=400
    ls -lh
    
    测试完成后,就把两个bigfile删了吧。

    6. 测试与使用:

    首先,咱们确认一下,我们已经将每台机器的IP都设置成了192.168.2.xxx了,现在我们再接上无线路由器(AP),并设置其IP。

    请按3. 网络拓扑结构与IP配置”中“(2)用于代码上传和代码测试阶段”的方式来设置IP和网线接法。

    复制一份先前编译好的sim3dStart-server到servera上(还记得这个吗)
    
    servera    运行    sim3dStart-server
    monitor    运行    roboviz
    此时roboviz会是一片漆黑;

    接下来,将要模拟各个队伍的代码上传与测试(以下操作均在笔记本上完成):

    首先连上无线路由器。

    (这时我们不必要用root身份)
    远程上传可执行文件:
    scp -rp myBinary ccwss1@192.168.2.13:/robocup3D/ccwss1

    远程登录ccwss1:
    ssh ccwss1@192.168.2.13
    (此时的远程登录机为clienta1,登录后,你会发现用scp传上来的文件)

    远程启动rcssserver3d:
    restartSim3d
    这时roboviz就会显示球场了;

    运行球队代码:
    ./start.sh 192.168.2.12
    如果clienta1上运行了proxy,则只需运行(proxy的更多说明见“其他重要信息”):
    ./start.sh

    ./start.sh 127.0.0.1


    这时你可以再用另一个用户登录,上传并运行代码来进行比赛测试(注意有一些不同):
    远程上传代码:
    scp -rp myBinary ccwss2@192.168.2.14:/robocup3D/ccwss2

    远程登录ccwss2
    ssh ccwss2@192.168.2.14
    (此时的远程登录机为clienta2,登录后,你会发现用scp传上来的文件

    运行球队代码:
    ./start.sh 192.168.2.12
    如果clienta2上运行了proxy,则只需运行(proxy的更多说明见“其他重要信息”):
    ./start.sh

    ./start.sh 127.0.0.1

    如果其他球队要再测试的话,只要运行restartSim3d就能重启rcssserver3d了。

    最后冲刺了!马上就可以完成啦!

    不做特别说明,以下我们均已root身份执行命令!!!

    接下来我们要操作monitora这台电脑

    各台Ubuntu的root密码之前设了没?就在“4. 软件安装与系统配置”一开始的地方

    设置免密码登录:
    ssh-keygen
    然后一路回车;
    ssh-copy-id root@clienta1
    输入clienta1的root密码
    ssh-copy-id root@clienta2
    输入clienta2的root密码
    ssh-copy-id root@servera
    输入servera的root密码

    此时你在monitora上登录任意上面任意一台电脑都不用密码了,可以像下面这样试试:
    ssh root@clienta1

    配置rclm2:

    修改/usr/local/share/types/3Dspark/config文件(具体路径可能不一样,主要是types/3Dspark/config这个文件):    
    NET_PREFIX=10.10.0               ==>>    NET_PREFIX=192.168.2
    SERVER=${NET_PREFIX}.1           ==>>    SERVER=${NET_PREFIX}.2    
    CLIENT1=root@${NET_PREFIX}.2     ==>>    CLIENT1=root@${NET_PREFIX}.3
    CLIENT2=root@${NET_PREFIX}.3     ==>>    CLIENT2=root@${NET_PREFIX}.4
    这时候你应该可以猜出我上面在干什么吧;

    初始化rclm2:
    rclm2 groupA
    cd groupA
    ./script/init 3Dspark

    创建文件teamsOfA,列出小组中各参赛队用户主目录(以下以今年的A组为例):
    /robocup3D/AHJZU_3D
    /robocup3D/Apollo3D
    /robocup3D/Dreamwing3D
    /robocup3D/Icarus
    /robocup3D/Kylinsky3D
    /robocup3D/Miracle3D


    编制A组赛程安排:
    ./script/schedule/init teamsOfA
    这时会产生一个文件var/schedule。打开看一下,差不多是这个样子:
    /robocup3D/AHJZU_3D
    vs /robocup3D/Apollo3D
    /robocup3D/Apollo3D
    vs /robocup3D/Dreamwing3D
    ***************以下省略*********

    如果用rclm2来管理比赛的话,比赛场次顺序就是按照以上那个文件来的。

    让rclm2启用roboviz,修改script/game/start文件:

    pushd ~/Desktop/roboviz/
    改为你自己的roboviz路径,我修改的路径为:
    pushd /home/monitora/Desktop/roboviz/bin/linux-amd64/

    终于到最后一步了!当每个球队都上传了代码后,运行以下命令,正式比赛:
    ./script/start

    其他重要信息:

    1. 关于restartSim3d:

    (1)一个bug:

    sim3dStart-server有一个bug,就是当在servera上同时启动sim3dStart-server和rcssserver3d时,用于远程重启rcssserver3d的restartSim3d会运行失败。

    (2)restartSim3d脚本:

    restartSim3d是个shell脚本,就一行命令:

    sim3dStart-client servera

    猜猜看,如果换成在B组,这个命令会产生什么结果吗?

    如果我们要用在B组,我们应当把servera改成serverb(或者是IP:192.168.2.22也行)

    2. UsersInit.sh的用法:

    像这样运行程序:

    ./UsersInit.sh

    程序会创建teams里的所有用户,并随机产生6位密码,然后保存至usersPasswd.txt文件里。这里有个问题。

    我常常想将用户和密码信息提前1到2个星期通知个参赛队,但是要知道我这时还没有搭建环境呢!

    到了在会场再次运行UsersInit.sh时,它又会创建新的密码。这可麻烦了。那么提前告知大家用户名与密码有什么用呢?

    鉴于这点,这个脚本还有个用法

    ./UsersInit.sh oldUsersPasswd.txt

    其中oldUsersPasswd.txt可以是你之前运行./UsersInit.sh时得到的usersPasswd.txt(然后把它改名为oldUsersPasswd.txt以示区别),

    这种用法,程序会根据oldUsersPasswd.txt里的用户名与对应的密码来进行设置,也就是说旧密码有效。

    3. 电脑重启注意事项:

    电脑重启的顺序很重要,否则……试试看吧,试过之后印象更深刻。

    先打开:fedora;

    并且要确认:网络配置是否为192.168.2.19

    并且要打开防火墙:./iptables_rule.sh

    此时才能打开Ubuntu,而且还要确实IP配置和执行挂载命令 ./mount_nfs.sh

    4. proxy:

    为了和国际接轨,这个是今年国赛新加的东西,需要运行在clienta1和clienta2上,按正统规则来说,这个东西是属于标准的,但它与今年13支参赛队中的6支都不兼容(具体表现为所有的球员都不能正常走路),所以我也给取消不用了,不过既然是标准,我就讲讲用法吧。

    (操作servera电脑)
    切换root身份:
    su - 设置rcssserver3d的Agent的端口,从3100改为3110: /usr/local/share/simspark/spark.rb(路径可能不同) $agentPort = 3100 ==>> $agentPort = 3110 删除临时配置文件: rm -rf ~/.simspark

    (在clienta1和clienta2电脑上操作)
    解压并运行proxy:
    tar -axf proxy.tar.gz
    ./startProxy.sh 192.168.2.12 3110 3100

    此时,本来运行球队的命令:
    ./start.sh 192.168.2.12
    就可以改为:
    ./start.sh

    ./start.sh 127.0.0.l

    如果要用rclm2的话,还要修改rclm2的相关配置文件内容(见下)

    5. rclm2的使用说明:

    rclm2主要做以下5件事儿:

    (1)复制并修改rcssserver3d的配置文件到servera的root主目录里;

    (2)编制单循环赛的比赛场次安排;

    (3)按顺序启动rcssserver3d, roboviz, 球队1的代码, 球队2的代码

    (4)rcssserver3d崩溃时,记录并重置比赛时间和比分;

    (5)压缩log文件;

    第(1)件事儿挺重要的,它会在./script/start第一次运行后完成,不管你用不用rclm2,最好还是运行一次这个程序。

    第(2)件事儿也最好让rclm2帮你做,毕竟它编制出的比赛场次比较合理。

    第(3)件事儿嘛,是正式比赛时重复最多的步骤,其实当你习惯了用ssh手动启动时,不用rclm2也无所谓。

    第(4)件事儿也挺重要的,这主要是因为我们的rcssserver3d经常会崩溃(crash)(参加过比赛的老队员一般知道),比如在比赛到了153秒的时候,roboviz会突然显示

          "disconnected",于是比赛要重开,那么rclm2会自动恢复比赛时间和比分。如果你不想用rclm2的话,手动也能完成这个工作:

          

    打开root主目录下的naosoccersim.rb文件(之前在./script/start后产生的文件),记得还得是root身份哦:
    cd vim naosoccersim.rb

    其中大约在118,119行的样子,
    是这样两行:
    obj.setTime(0)
    obj.setScores(0,0)
    改为:
    obj.setTime(153)
    obj.setScores(2,1)
    重开rcssserver3d和roboviz,这时时间是从153开始了,比分一开始就是2:1.

    如何找到rcssservver3d崩溃时的时间?(最好先看看“6. 不用rclm2,而用手动启动rcssserver3d的注意事项”)
    root主目录里有个sparkmonitor的log文件,用vim打开它,并跳转到最后一行,行首就标注有time,那个就是崩溃时的时间。
    至于比分嘛,这个大家都会记得的。

    第(5)件事儿基本没人关注,它会把每次比赛的log文件从servera里传到monitora里,并压缩保存进groupA/archives文件夹里。如果要把restore.py整合进rclm2里面,这个还是有用的。

    6. 不用rclm2,而用手动启动比赛时的注意事项:

    用rclm2在./script/start第一次配置之后,若要改用手动启动rcssseerver3d和球队代码的话,

    在启动rcssserver3d时一定要以root身份,并且得在root主目录下运行rcssserver3d命令,否则之前的用rclm2做的相关配置就会失效,总重要的是不会产生sparkmonitor这个log文件。

    7. restore脚本:

    “都是rcssserver3d崩溃惹的祸“,如果就在你快要进球时,rcssserver3d崩溃了怎么办?以前的国赛,只能自认倒霉。现在,这个脚本可以回复rcssserver3d崩溃前的样子,

    但要用sparkmonitor这个log文件。

    在servera机器上:

    在rcssserver3d崩溃后做的第一件事,保存sparkmonitor:
    cp sparkmonitor sp.backup
    
    重开比赛,并按之前的左右场顺序上双方球员,待所有球员准备完毕后,恢复状态:
    ./restore sp.backup

    你可以自己测试一下,先让比赛比到一半,然后杀掉rcssserver3d,再按以上步骤恢复球场状态。

    这个说的是手动的情况,如果要用rclm2,你得要修改script/game/start这个脚本,今年A组没用rclm2,B组用了,至于怎么修改的,我忘备份了,不好意思…… 

    如果你使用了proxy,那么还得在多修改一些地方:

    修改script/game/start,大概在第57和第62行:
    将
    ssh ${CLIENT1} "su - $NAME1 -c './start.sh $SERVER &> log/start.log'" &
    ssh ${CLIENT2} "su - $NAME2 -c './start.sh $SERVER &> log/start.log'" &
    修改为:
    ssh ${CLIENT1} "su - $NAME1 -c './start.sh 127.0.0.1 &> log/start.log'" &
    ssh ${CLIENT2} "su - $NAME2 -c './start.sh 127.0.0.1 &> log/start.log'" &

    8. mount_nfs.sh使用说明:

    这个脚本很短,就13行(注释就占了6行),不妨打开看一下。

    注意这样一行:
     mount -t nfs robocup3dfa:$HomeDir/$username $HomeDir/$username
    
    你应该能看出来,如果把这个脚本用到B组而不做修改,肯定会出问题的(可能到正式比赛时才会显现),用到B组时,我们要修改为:
    mount -t nfs robocup3dfb:$HomeDir/$username $HomeDir/$username

    一点其他建议:

    组织一场比赛不但得有TC,还要有OC(OrganizationCommittee)。可国内比赛不分这个,以上是TC分内的事儿,但还有OC的事儿也得你自己来,

    什么“统计比分”啦、“发布通知”啦、“联系各方”啦,“编写规则”啦,“打印奖状”啦……总之有你烦的了!一定不要觉得费时间,耐下心思,简单培训几个会场的志愿者(如果没有志愿者………………),都是些很简单的活儿,虽然一开始可能有点不熟悉,不过很快就可以上手的。

        

  • 相关阅读:
    第六章 (3)CreateThread函数
    第六章(5)C/C++运行期库
    自己去除迅雷广告
    第六章(4)终止线程的运行
    第四章 进程(7)CreateProcess函数详解
    第六章(6)进程ID的相关函数
    第六章 线程的基础知识
    第四章 进程(5)进程的当前驱动器和目录
    第四章 进程(6)CreateProcess函数详解
    第六章 (2)线程函数
  • 原文地址:https://www.cnblogs.com/ansersion/p/4050308.html
Copyright © 2020-2023  润新知