3DR 1人ドローンWiFi通信

3DR 1人ドローンWiFi通信

3DR Soloドローンが2台あります。ドローンとコントローラの両方にビジボックスLinuxを実行するARMコンピュータがあります。

私が理解したのは:デフォルトでは、コントローラはワイヤレスアクセスポイントとして機能します。 SSIDはSoloLinkです。この画像はデフォルト設定を示しています。 ソロの基本設定

コントローラは画面に「SOLO」と表示された2つのアンテナがあり、実際のドローン/ドローンは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を再設定し、新しいWiFiネットワークに接続するようにwpa_supplicantを設定し、wpa_supplicantを起動してからiptablesを再設定してトラフィックをwlan0インターフェイスに転送したり、wlan0-apその逆も同様です。if/elsewgetを実行せずにブロックのみを実行するように最後のステートメントを修正しましたelse

これはうまく機能し、ネットワークからコントローラにアクセスできますubnt。私の設定は次のようになります。 ルーターによる個別設定 コントローラにSSHで接続できますが、ネットワーク上でSoloを見ることはできません。ノートパソコンで試してみましたが、ルーター( )、コントローラ( )、本人( )だけが見えます。ssh [email protected]nmap -sP 192.168.1.1/24192.168.1.1192.168.1.6192.168.1.76

ここが私がついているところだ

私のコンピュータからSoloドローンにアクセスできるようにしたいです。コントローラに2つのインターフェイスがあることを知っていますが、それを接続する方法がわかりません。

これの目的は、異なるペアのドローンを同じubntネットワークに接続し、1つの中央ソースから両方のドローンを監視/制御し、必要に応じてパイロットがループ内で制御できるようにすることです。

どんな助けやGoogleの用語にも感謝します。私はネットワーキングの経験があまりないので、常にネットワーキングに関連するコマンドと用語を探しています。

ベストアンサー1

実際に私の意見をしたい友人のこの投稿にリンクしました。ここでも共有します。

ここでの問題は、パスが不足していることです。あなたの192.168.1.76IP(またはすべての192.168.1.xIP)が到着するには、10.1.1.xルートを知る必要があります。同じサブネット内のIP(例:[10.1.1.1および10.1.1.10]または[192.168.1.76および192.168.1.1])は、通信にルーティングを必要としません。ブロードキャストを使用して、指定されたIPを持つデバイスを見つけ、トラフィックを直接送信します。

あるサブネットから別のサブネットに移動するには、パスを定義する必要があります。また、BACKパスを定義する必要があります。したがって、次のことを試すことができます(ルーターとソロコントローラーがサポートしている場合)。

192.168.1.1APにはパスが必要です。ソースは何でも、ターゲットは可能であり、ネクスト10.1.1.0/24ホップは192.168.1.6ソロコントローラになることができます。コントローラは両方のネットワークについて知っているので、次のトラフィックを10.1.1.10送信するとしなければならないそこに行く方法を既に知っていて、しなければならない一緒に送ってください。また、コントローラ自体が実際にはドローンのネットワークゲートウェイ(10.1.1.1)なので返品192.168.1.0/24サブネットを知っていれば、ルーティングは不要です。暗黙的な戻りパスです。

このルートをルーター(any>10.1.1.0/24>192.168.1.6)に追加し、問題が解決するかどうかを確認してください。

おすすめ記事