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 输出:
Listener 输出:
自动化配置脚本
从机配置脚本
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通信正常。