这是一个将两个运行ROS话题服务的树莓派信息连接起来的教程,一个树莓派启用热点wifi,两个树莓派间通过网线通信,连接热点wifi可得到传感器和驱动信息
roscore与话题
- roscore是运行在主服务上的线程,其他topic和server通过主服务上进行相互连接,因此在ubuntu或者debian系统上必须统一ROS_MASTER_URI服务地址
- 常用的一些调试协助软件包括
rviz
(可视化)、rqt_topic
、rqt_plot
、rqt_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
10interface=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
7ifconfig 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
文件,启动后重新修改该文件,再通过ifdown
、ifup
重新修改有线配置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
7cp /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
4iface eth0 inet static
address 192.168.50.2
netmask 255.255.255.0
gateway 192.168.50.1在
/etc/rc.local
中添加配置有线设置1
2
3
4ifdown 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