Skip to content

RoboCup 集群无人机通信配置

多机网络配置

ROS 环境变量设置

.zshrc.bashrc 中添加以下配置:

bash
export ROS_IP=192.168.123.40
export ROS_MASTER_URI=http://192.168.123.29:11311

配置说明:

  • ROS_IP:当前机器的IP地址
  • ROS_MASTER_URI:ROS主节点的地址

主从机通信原理

配置完成后可实现:

  • 主机(Master):运行 roscore 启动ROS核心服务
  • 从机(Slave):无需运行 roscore,直接共享主机的话题

示例:

主机启动:

bash
roscore

从机验证连接:

bash
nx@ubuntu:~/shell$ rostopic list
/rosout
/rosout_agg

通信测试代码

Talker 节点(发布者)

点击查看 talker.cpp 源码
cpp
// talker.cpp
#include <ros/ros.h>
#include <std_msgs/String.h>
#include <sstream>

int main(int argc, char **argv) {
    ros::init(argc, argv, "uav_talker");
    ros::NodeHandle n;
    ros::Publisher chatter_pub = n.advertise<std_msgs::String>("swarm_chatter", 1000);
    ros::Rate loop_rate(1);

    int count = 0;
    while (ros::ok()) {
        std_msgs::String msg;
        std::stringstream ss;
        ss << "hello world " << count;
        msg.data = ss.str();
        
        ROS_INFO("%s", msg.data.c_str());
        chatter_pub.publish(msg);
        
        ros::spinOnce();
        loop_rate.sleep();
        ++count;
    }

    return 0;
}

Listener 节点(订阅者)

点击查看 listener.cpp 源码
cpp
// listener.cpp
#include <ros/ros.h>
#include <std_msgs/String.h>

void chatterCallback(const std_msgs::String::ConstPtr& msg) {
    ROS_INFO("I heard: [%s]", msg->data.c_str());
}

int main(int argc, char **argv) {
    ros::init(argc, argv, "uav_listener");
    std::cout << "uav_listener node started." << std::endl;
    ros::NodeHandle n;
    ros::Subscriber sub = n.subscribe("swarm_chatter", 1000, chatterCallback);
    
    ros::spin();
    return 0;
}

常见问题与解决方案

域名解析问题

在实际运行中,可能遇到主机域名解析问题。

问题现象:

当主机运行 rosrun hello_world uav_talker 时,从机查看话题信息:

bash
nx@ubuntu:~/swarm_ws$ rostopic info /swarm_chatter 
Type: std_msgs/String

Publishers: 
 * /uav_talker (http://aethereal2502:36543/)

Subscribers: 
 * /rostopic_3072_1757164780138 (http://aethereal2502:42669/)

可以看到出现了主机的域名 aethereal2502(可能是出厂设置),这导致从机无法正确解析主机地址。

问题表现:

bash
nx@ubuntu:~/swarm_ws$ rostopic list
/rosout
/rosout_agg
/swarm_chatter

# 订阅话题时无法接收消息
rostopic echo /swarm_chatter
subscribed to [/swarm_chatter]
no new messages

解决方案

方案一:修改 hosts 文件(推荐)

在从机的 /etc/hosts 文件末尾添加主机域名解析:

bash
# 在 /etc/hosts 文件末尾添加
192.168.123.29 aethereal2502

说明: 只要需要与有特殊域名的飞机通信,都需要添加相应的域名解析配置。

方案二:环境变量配置(测试无效)

AI 建议的方案(实际测试未生效):

bash
unset ROS_HOSTNAME

# 禁用ROS的主机名解析
export ROS_IPV6=off

目前该方案在实际测试中没有生效,所以推荐使用方案一。

测试结果

成功配置后的运行截图:

Talker 输出:Talker Output

Listener 输出:Listener Output

自动化配置脚本

从机配置脚本

slave_setup.sh
bash
#!/bin/zsh
# ROS从机网络配置

export ROS_IP=192.168.123.40
export ROS_MASTER_URI=http://192.168.123.29:11311
unset ROS_HOSTNAME

# 禁用ROS的主机名解析
export ROS_IPV6=off

echo "Slave network configured:"
echo "ROS_IP: $ROS_IP"
echo "ROS_MASTER_URI: $ROS_MASTER_URI"

主机配置脚本

master_setup.sh
bash
#!/bin/zsh
# ROS主机网络配置

export ROS_IP=192.168.123.29
export ROS_MASTER_URI=http://192.168.123.29:11311
unset ROS_HOSTNAME

# 禁用ROS的主机名解析
export ROS_IPV6=off

echo "Master network configured:"
echo "ROS_IP: $ROS_IP"
echo "ROS_MASTER_URI: $ROS_MASTER_URI"

# 可选:自动启动roscore
# roscore &

配置说明

环境变量vs脚本

写入配置文件的优缺点:

  • 优点: 永久生效,无需每次手动配置
  • 缺点: 不够灵活,难以在不同环境间切换

使用脚本的优缺点:

  • 优点: 灵活切换不同配置
  • 缺点: 每次新开终端都需要重新运行脚本

注意事项

重要提醒

在某些脚本中可能会新建 shell 终端,此时需要注意重新应用网络配置,确保ROS通信正常。