3DR 单人无人机 WiFi 通信

3DR 单人无人机 WiFi 通信

我有两架 3DR Solo 无人机。他们在无人机和控制器中都配备了 ARM 计算机,运行 busybox Linux。

据我了解:默认情况下,控制器充当无线接入点。它具有 SSID:SoloLink。此图显示了默认设置: 独奏默认设置

控制器是带有两个天线的东西,屏幕上显示“SOLO”,而实际的无人机/无人机是 X 形的东西。

这工作正常,我可以直接 ssh 进入控制器 ( ) 并使用 ( )进入实际的独奏ssh [email protected]ssh [email protected]

我可以从 3DR 的 github 页面上的 python 实用程序运行命令:(github.com/3drobotics/solo-cli/blob/master/soloutils/wifi.py抱歉,由于我的声誉,我只能有 2 个链接)告诉控制器连接到另一个 WiFi 网络。我设置了一个 Ubiquity PicoStation 作为路由器并具有 SSID:ubnt。要将控制器连接到ubnt网络,我连接到SoloLink网络并运行solo wifi --name=ubnt.这基本上是创建一个 bash 脚本并运行它:

if [ "$#" -lt "2" ]; then
    echo "Usage:   `basename $0` timeout_in_seconds command" >&2
    echo "Example: `basename $0` 2 sleep 3 || echo timeout" >&2
    exit 1
fi
cleanup()
{{
    trap - ALRM               #reset handler to default
    kill -ALRM $a 2>/dev/null #stop timer subshell if running
    kill $! 2>/dev/null &&    #kill last job
      exit 124                #exit with 124 if it was running
}}
watchit()
{{
    trap "cleanup" ALRM
    sleep $1& wait
    kill -ALRM $$
}}
watchit $1& a=$!         #start the timeout
shift                    #first param was timeout for sleep
trap "cleanup" ALRM INT  #cleanup after timeout
"$@"& wait $!; RET=$?    #start the job wait for it and save its return value
kill -ALRM $a            #send ALRM signal to watchit
wait $a                  #wait for watchit to finish cleanup
exit $RET                #return the value
SCRIPT
cat > /tmp/setupwifi.sh << 'SCRIPT'
# Delete old files
rm /mnt/rootfs.rw/lib/modules/3.10.17-rt12-*/kernel/net/ipv4/netfilter/iptable_filter.ko || true
/etc/init.d/hostapd stop
killall wpa_supplicant || true
killall udhcpc || true
cat <<EOF > /etc/wpa_client.conf
network={{
{credentials}
}}
EOF
echo 1 > /proc/sys/net/ipv4/ip_forward
sed -i.bak 's/dhcp-option=3.*/dhcp-option=3,10.1.1.1/g' /etc/dnsmasq.conf
sed -i.bak 's/dhcp-option=6.*/dhcp-option=6,8.8.8.8/g' /etc/dnsmasq.conf
/etc/init.d/dnsmasq restart
sleep 2
echo 'connecting to the internet...'
wpa_supplicant -i wlan0 -c /etc/wpa_client.conf -B
/tmp/timeout.sh 15 udhcpc -i wlan0 || {{
    echo -e "\\nerror: wrong credentials or couldn't connect to wifi network!\\n"
    ifconfig wlan0 down
}}
/etc/init.d/hostapd start
sleep 3
wget -O- http://example.com/ --timeout=5 >/dev/null 2>&1
if [[ $? -ne '0' ]]; then
    echo ''
    echo 'error: could not connect to the Internet!'
    echo 'please check your wifi credentials and try again.'
else
    echo 'setting up IP forwarding...'
    insmod /lib/modules/3.10.17-rt12-*/kernel/net/ipv4/netfilter/iptable_filter.ko 2>/dev/null
    iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
    iptables -A FORWARD -i wlan0 -o wlan0-ap -j ACCEPT
    iptables -A FORWARD -i wlan0-ap -o wlan0 -j ACCEPT
    echo ''
    echo 'success: Solo is now connected to the Internet.'
    echo 'if your computer does not yet have Internet access, try'
    echo "disconnecting and reconnecting to Solo's wifi network."
fi
SCRIPT
chmod +x /tmp/timeout.sh
chmod +x /tmp/setupwifi.sh
bash /tmp/setupwifi.sh > /log/setupwifi.log 2>&1

({credentials} 部分是因为该脚本位于 python 脚本中的一个大字符串中,并且它用我传递给它的凭据替换了该部分)

它似乎启用转发,重新配置 dnsmasq,配置 wpa_supplicant 连接到我的新 WiFi 网络,启动 wpa_supplicant,然后重新配置 iptables 以将流量转发到wlan0接口wlan0-ap,反之亦然。我修改了最后一条if/else语句,使其不执行 wget 而只运行该else块。

这运行良好,我可以从网络访问控制器ubnt。我的设置现在看起来像: 使用路由器进行单独设置 我可以很好地 ssh 到控制器,但我在网络上看不到 Solo。我在笔记本电脑上尝试过,但只看到路由器 ( )、控制器 ( ) 和我自己 ( )。ssh [email protected]nmap -sP 192.168.1.1/24192.168.1.1192.168.1.6192.168.1.76

这就是我被困住的地方

我希望能够从计算机访问 Solo 无人机。我知道控制器上有两个接口,但我不明白如何桥接它们。

这样做的目的是让我可以将另一对无人机连接到同一ubnt网络,然后我可以从一个中央源监视/控制两架无人机,并且飞行员可以在需要时在环路中进行控制。

任何帮助或谷歌条款将不胜感激。我在网络方面没有太多经验,并且我一直在寻找与网络相关的命令和术语。

答案1

实际上,一位想要我的意见的朋友链接到了我这篇文章 - 我也会在这里分享。

这里的问题是缺少路线。为了让您的192.168.1.76IP(或任何192.168.1.xIP)到达10.1.1.x,它需要知道路线。同一子网内的IP(例如[10.1.1.110.1.1.10]或[192.168.1.76192.168.1.1])不需要路由即可通信;他们使用广播来查找具有给定 IP 的设备并直接发送流量。

为了从一个子网到另一个子网,您必须定义一条路由。此外,您必须定义一条 BACK 路线。所以,你可以尝试这个(如果你的路由器和独奏控制器支持它):

您的192.168.1.1AP 中需要一条路由。源可以是任意,目标可以是10.1.1.0/24,下一跳可以是192.168.1.6- Solo 控制器。控制器知道这两个网络,因此如果您发送发往 的流量10.1.1.10,Solo应该已经知道如何到达那里,并且应该一起发送。此外,因为控制器本身实际上是无人机的网络网关 ( 10.1.1.1),并且它是知道192.168.1.0/24子网,那里不需要路由 - 隐含返回路由。

将该路由添加到您的路由器 ( any>10.1.1.0/24>192.168.1.6) 并查看是否可以解决问题。

相关内容