3DR 1인 드론 WiFi 통신

3DR 1인 드론 WiFi 통신

3DR Solo 드론이 두 대 있습니다. 드론과 컨트롤러 모두에 비지박스 Linux를 실행하는 ARM 컴퓨터가 있습니다.

내가 이해한 바로는: 기본적으로 컨트롤러는 무선 액세스 포인트 역할을 합니다. 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를 재구성하고, 새로운 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 드론에 액세스할 수 있기를 원합니다. 컨트롤러에 두 개의 인터페이스가 있다는 것을 알고 있지만 이를 연결하는 방법을 모르겠습니다.

이것의 목적은 다른 쌍의 드론을 동일한 ubnt네트워크에 연결한 다음 하나의 중앙 소스에서 두 드론을 모두 모니터링/제어할 수 있고 필요한 경우 조종사가 루프에서 제어할 수 있도록 하는 것입니다.

어떤 도움이나 Google 용어라도 대단히 감사하겠습니다. 저는 네트워킹에 대한 경험이 많지 않아서 항상 네트워킹과 관련된 명령과 용어를 찾고 있습니다.

답변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솔로 컨트롤러가 될 수 있습니다. 컨트롤러는 두 네트워크 모두에 대해 알고 있으므로 트래픽을 10.1.1.10다음으로 보내면~해야 한다거기에 가는 방법을 이미 알고 있고,~해야 한다함께 보내세요. 또한 컨트롤러 자체가 실제로는 드론의 네트워크 게이트웨이( 10.1.1.1)이기 때문에반품192.168.1.0/24서브넷을 알고 있으면 라우팅이 필요하지 않습니다. 암시적 반환 경로입니다.

이 경로를 라우터( any>10.1.1.0/24>192.168.1.6)에 추가하고 문제가 해결되는지 확인하세요.

관련 정보