ROS开发(三)——搭建平台

这是一个将两个运行ROS话题服务的树莓派信息连接起来的教程,一个树莓派启用热点wifi,两个树莓派间通过网线通信,连接热点wifi可得到传感器和驱动信息

roscore与话题

  • roscore是运行在主服务上的线程,其他topic和server通过主服务上进行相互连接,因此在ubuntu或者debian系统上必须统一ROS_MASTER_URI服务地址
  • 常用的一些调试协助软件包括rviz(可视化)、rqt_topicrqt_plotrqt_graph
  • 关于话题数据结构在官网Wiki中,或者通过rosmsg显示调用,或者自定义消息类型

1. 将树莓派Wifi作为热点

  • 安装软件
    • sudo apt-get install hostapd dnsmasq
  • 编辑/etc/dnsmasq.conf文件,添加

    - interface=wlan0
    - dhcp-range=10.0.0.2,10.0.0.5,255.255.255.0,12h
    
  • 新建/etc/hostapd/hostapd.conf,添加

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    interface=wlan0
    hw_mode=g
    channel=10
    auth_algs=1
    wpa=2
    wpa_key_mgmt=WPA-PSK
    wpa_pairwise=CCMP
    rsn_pairwise=CCMP
    wpa_passphrase=wifi密码
    ssid=wifi名字
  • 修改/etc/sysctl.conf ,更改
    net.ipv4.ip_forward=1

  • 添加脚本到/etc/rc.local
    1
    2
    3
    4
    5
    6
    7
    ifconfig wlan0 down
    ifconfig wlan0 10.0.0.1 netmask 255.255.255.0 up
    iwconfig wlan0 power off
    service dnsmasq restart
    hostapd -B /etc/hostapd/hostapd.conf & > /dev/null 2>&1sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
    sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT

2. 两块树莓派通过网线桥连

2.1主机配置

  • 为了保证通信效果,采用两根网线连接两个主控树莓派
    由于主机的wifi用于作为热点,因此按照网上将/etc/network/interfaces文件修改有线连接地址是不可行的,因为在启动时,会执行该文件,但文件内没有wifi连接配置信息,因此只能在启用热点wifi时用一个interfaces.d文件,启动后重新修改该文件,再通过ifdownifup重新修改有线配置

    1
    2
    3
    4
    #iface eth0 inet static
    # address 192.168.50.1
    # netmask 255.255.255.0
    # gateway 192.168.50.1
  • 通过复制的方式覆盖原文件,但启动后替换文件再启用有线

    1
    2
    3
    4
    5
    6
    7
    cp /etc/network/interfaces.unnormal.bak /etc/network/interfaces
    sleep 1
    ifdown eth0 &
    sleep 1
    ifup eth0 &
    sleep 1
    cp /etc/network/interfaces.normal.bak /etc/network/interfaces
  • 添加进/etc/rc.local文件末尾

    2.2 从机配置

  • 从机需要保证与主机通信同样的配置/etc/network/interfaces

    1
    2
    3
    4
    iface eth0 inet static
    address 192.168.50.2
    netmask 255.255.255.0
    gateway 192.168.50.1
  • /etc/rc.local中添加配置有线设置

    1
    2
    3
    4
    ifdown eth0 
    sleep 2
    ifup eth0
    sleep 2

3. 编写启动脚本

为了保证启动时能正常运行,在启动时配置脚本

  • 主机添加ROS启动项setup.sh脚本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #! /bin/bash
    rm -rf /root/.ros/log
    source /opt/ros/kinetic/setup.bash
    roscore &
    sleep 5
    source /home/pi/catkin_ws/devel/setup.bash
    roslaunch /home/pi/catkin_ws/src/press_sensor/launch/demo.launch &
    sleep 5
    roslaunch /home/pi/catkin_ws/src/uart_read/launch/demo.launch &

    cp /etc/network/interfaces.unnormal.bak /etc/network/interfaces
    sleep 1
    ifdown eth0 &
    sleep 1
    ifup eth0 &
    sleep 1
    cp /etc/network/interfaces.normal.bak /etc/network/interfaces
  • 从机添加脚本
    由于从机必须先验证是否能ping同主机,才能保证能获得主机roscore的消息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #! /bin/bash
    sleep 10
    flag=0
    while [ "$flag" != 1 ];do
    if ping -c 1 192.168.50.1 >/dev/null 2>&1;then
    flag=1
    else flag=0
    fi
    done
    source /opt/ros/kinetic/setup.bash
    source /home/pi/ros_catkin_ws/devel/setup.bash
    export ROS_MASTER_URI=http://192.168.50.1:11311
    sleep 5
    roslaunch /home/pi/ros_catkin_ws/src/uart_read/launch/demo.launch &
    sleep 2
    roslaunch /home/pi/ros_catkin_ws/src/motor_control/launch/demo.launch &
  • 或者主机通过命令启动从机程序

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/sh
    flag=0
    while [ "$flag" != 1 ];do
    if ping -c 1 192.168.50.2 >/dev/null 2>&1 ; then
    flag=1
    else flag=0
    fi
    done
    #echo "yes"
    ssh pi@192.168.50.2 'bash -s' < setpi2.sh
    echo "hello"
    exit 0

setpi2.sh为一个ssh远程脚本的命令

  • sudo -s source /home/pi/setup.sh