# ROS1-outdoorfly **Repository Path**: lin-yuheng/ros1-outdoorfly ## Basic Information - **Project Name**: ROS1-outdoorfly - **Description**: 天空端树梅派配置 - **Primary Language**: C++ - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-07-24 - **Last Updated**: 2025-07-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ROS1-outdoorfly # 介绍 天空端树梅派配置 # 软件架构 Outdoorfly/src/outdoor_offb 树梅派与Pixhawk通信的功能包 Outdoorfly/src/radio_radio 树梅派与串口通信的功能包 # 安装教程 ## 树梅派配置(从零开始) **树梅派配置**:rasberry Pi 4B 32G **树梅派环境**:Ubunut20.04 + mavros [ubuntu20.04安装mavros](https://blog.csdn.net/weixin_45291614/article/details/133212529) ### 1. 开启SSH服务 [如何在Ubuntu上开启SSH服务 并开机启动_ubuntu sshserver kaiqi-CSDN博客](https://blog.csdn.net/hwt0101/article/details/112527027) ```bash # 开机自动启动ssh命令 sudo systemctl enable ssh ``` #### 解决问题 ##### 1. 允许ssh密码登录权限 **ssh连接时报错** ``` root@192.168.50.221: Permission denied (publickey). ``` 登录目标机器,打开/etc/ssh/sshd_config ,修改PasswordAuthentication no为: PasswordAuthentication yes。 # vim /etc/ssh/sshd_config PasswordAuthentication yes 然后重启服务。 ```bash service sshd restart ``` ### 2.开启VNC [Ubuntu20.04之VNC的安装与使用](https://blog.csdn.net/qq_45516773/article/details/132072500) #### 2.1安装VNC-Server ```bash #在ubuntu上安装tigervnc-server sudo apt install tigervnc-standalone-server ``` 安装完**tigervnc**后需要启动一个**vncserver**来初识化密码 ```sh vncserver #启动vnc-server 或者用 vncpasswd #设置vnc密码,这里不要加sudo ``` #### 2.2配置VCN-Server 1. 创建并添加**xstartup**文件到`/etc/vnc/xstartup`(这步一定要做) ```sh sudo mkdir /etc/vnc #创建VNC目录 sudo nano /etc/vnc/xstartup #创建并编辑xstartup文件 ``` 2. 向/etc/vnc/xstartup文件中添加下面的内容(Ctrl+O->Enter->Ctrl+X保存文件) ```bash #!/bin/sh test x"$SHELL" = x"" && SHELL=/bin/bash test x"$1" = x"" && set -- default unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS vncconfig -iconic & "$SHELL" -l << EOF export XDG_SESSION_TYPE=x11 export GNOME_SHELL_SESSION_MODE=ubuntu dbus-launch --exit-with-session gnome-session --session=ubuntu EOF vncserver -kill $DISPLAY ``` 3. 设置为可执行文件 ```bash sudo chmod +x /etc/vnc/xstartup ``` 4. 创建并添加xstartup文件到~/.vnc/xstartup(区别于上一步,这步也要做) ```bash sudo nano ~/.vnc/xstartup #创建并编辑xstartup文件 ``` 5. 向~/.vnc/xstartup文件中添加下面的内容(Ctrl+O->Enter->Ctrl+X保存文件) ```bash #!/bin/sh [ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources ``` 6. 设置为可执行文件 sudo chmod a+x ~/.vnc/xstartup 7. 启动VCN-Server ``` sudo vncserver :1 -geometry 1920x1080 -depth 24 -localhost no ``` ``` sudo vncserver -localhost no # 使用这个进行启动就可以 ``` 注:-localhost no参数一定要有,没有的话可能无法正常连接,其余参数就是分辨率之类的了,可自定义参数 如果输出下面的类似内容则说明服务器端正常运行 ```bash New 'ubuntu:1 (ubuntu)' desktop at :1 on machine ubuntu Starting applications specified in /etc/X11/Xvnc-session Log file is /root/.vnc/ubuntu:1.log Use xtigervncviewer -SecurityTypes VncAuth,TLSVnc -passwd /root/.vnc/passwd ubuntu:1 to connect to the VNC server. ``` **P.S.**:如果出现登陆的用户为root用户时,需要到/root/.vnc目录下面把passwd文件删掉后重新用vncpasswd设置nc密码 8. 连接VNC 用**TigerVNC-Client**、**RealVNC-Client**、**MobaXterm**等VNC软件连接了 大部分的VNC-Client都是只需要Ubuntu的 IP + 端口 + 密码 即可,这里说明一下端口 端口号就是5900+服务器索引,如 vncserver :1指令开启的是第一个服务器,因此第一个服务器的端口就是5901,类推,vncserver :2的端口就是5902 举例:192.168.50.221:5901 9. VNC图形化界面登陆显示认证失败 (不建议修改) 解决办法:[Ubuntu的root账户登录图形界面失败的问题](https://blog.csdn.net/willhu2008/article/details/122892353) **修改gdm配置** 1)输入命令,修改gdm-autologin ```cobol #sudo gedit /etc/pam.d/gdm-autologin ``` 注释第三行:auth required pam_succeed_if.so user != root quiet_success 1)输入命令,修改gdm-password ```cobol #sudo gedit /etc/pam.d/gdm-password ``` 同样注释第三行:auth required pam_succeed_if.so user != root quiet_success ### 3. 安装serial功能包 ```bash sudo apt-get install ros-noetic-serial # 安装serial功能包 ``` [ROS noetic serial软件包的安装](https://blog.csdn.net/dwell548560/article/details/121648028) ## 多机系统时间同步 [ROS多机通信时间同步](https://blog.csdn.net/qq_34911636/article/details/119044440) 由于在外场实验中没有外网连接,树梅派系统时间不同步,通过将地面站笔记本电脑设置为服务器,树莓派设置为客户端,通过ntp功能包实现系统时间同步 ### 1. 笔记本电脑(服务器端)开机之后会自动启动ntp服务器 ```bash service ntp status # 检查笔记本是否打开ntp服务 ``` ### 2. 关闭树莓派ntp服务 ``` sudo /etc/init.d/ntp stop ``` ### 3. 时间同步指令 ```bash sudo ntpdate 192.168.50.99 # 这里的ip为地面站笔记本的ip ``` 查看树莓派系统时间 date指令 ```bash ubuntu@ubuntu:~$ date Fri Aug 9 23:04:41 CST 2024 ``` ## 通信时延问题 ### 问题描述 在通信测试中发现地面端接收到的数据和天空端的数据会从一开始几乎没有时延,到最后时延慢慢增加,到最后时延稳定在10s左右 ### 解决方案 一开始以为是地面端接收数据过慢导致数传缓冲区数据来不及处理,后面发现原因是天空端发送的UAV_STATE的信息是由mavros_offb_node节点发布的/outdoor/uav/state话题,被serial_node节点订阅并通过串口发送。然后mavros_offb_node发布话题的频率是50hz,serial_node的频率也是50hz,这样如果serial_node写入串口不及时,会导致/outdoor/uav/state的话题队列堆积,然后造成最后写入串口的并不是最新的飞机状态的消息。 目前mavros_offb_node发布状态的信息改为20Hz,serial_node的频率还是50hz # 使用说明 1. 在不同的飞机上需要修改的地方 * src/outdoor_offb/launch/outdoor_formation_control.launch 1.修改 line3 group ns="plane_1"; 2.修改 line 13 type="pack_follower1_states.py" * src/outdoor_offb/script/controller/consensus_formation_controller.py 修改 line 40 self.idx = 1 * src/outdoor_offb/script/vir_leader_formation_control_offb.py 修改 line 413 Con = Controller("plane_1", 1) * src/outdoor_offb/src/mavros_offb_node.cpp 1.修改 line 40 std::string uav_id = "plane_1"; 2.修改 line 185 uav_state.uav_index=1; * src/radio_serial/script/pack_neighbour_state.py 注释本机的话题发布 # 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request