当前位置: 首页 > news >正文

在ros中进行无人机和无人车之间的通信(代码)

在ros中进行无人机和无人车之间的通信

  • 代码存放位置以及运行所必要的编译步骤
    • 无人机端
      • 1.创建ROS工作空间
      • 2.组织代码
      • 3.编译
      • 4.启动文件
    • 无人车端
      • 1.创建工作空间和包
      • 2.组织代码
      • 3.编译
      • 4.启动文件
    • 目录结构总结
    • 配置网络和启动
      • 1.网络配置
      • 2.启动ROS核心
      • 3.启动节点
    • 调试和验证

要实现无人车和无人机之间通过ROS(Robot Operating System)进行通信,双方既需要接收数据也要发布数据。

  1. 无人机平台

    • 接收无人车传输的 lat_lon_car(经度、纬度、高度),通过 location() 函数处理生成目标位置 lat_lon_target
    • lat_lon_target 发布回给无人车。
  2. 无人车平台

    • 发布它当前的经度、纬度和高度数据(lat_lon_car)。
    • 接收无人机平台传回的 lat_lon_target

ROS的通信机制基于发布/订阅模式(Publish/Subscribe),其中一个节点可以通过话题(topics)发布消息,另一个节点通过订阅同一个话题来接收消息。

关键步骤:

  1. 消息类型: 为了传输经度、纬度和高度数据,可以使用标准的 sensor_msgs/NavSatFix 消息类型(常用于GPS数据传输)。

  2. 通信话题

    • 无人车发布 lat_lon_car 数据到一个ROS话题,例如 car_position
    • 无人机订阅 car_position 话题,并处理数据,然后将生成的 lat_lon_target 发布到 drone_target 话题。
    • 无人车同时订阅 drone_target,接收无人机发布的目标位置。

代码解释:

  1. 无人车节点 (car.py)

    • 通过 car_position 话题发布当前的位置信息(NavSatFix 类型)。
    • 同时通过 drone_target 话题订阅无人机发布的目标位置。
  2. 无人机节点 (drone.py)

    • 通过 car_position 话题订阅无人车的当前位置。
    • 使用 location() 函数处理接收到的 lat_lon_car 数据,生成目标位置信息。
    • 通过 drone_target 话题将目标位置信息发布给无人车。

通信原理:

  • 发布者(Publisher):每个节点通过 rospy.Publisher() 来发布消息。
  • 订阅者(Subscriber):每个节点通过 rospy.Subscriber() 来接收其他节点发布的消息。
  • 无人车节点持续发布自己的位置信息,无人机节点接收到这些信息后,生成目标位置并发布回来。

代码存放位置以及运行所必要的编译步骤

无人机端

1.创建ROS工作空间

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_create_pkg drone_package std_msgs rospy roscpp #创建了一个包

#这一步后会在drone_package中生成下面几个文件

~/catkin_ws/
├── src/
│   ├── drone_package/
│   │   ├── CMakeLists.txt
│   │   ├── package.xml
│   │   ├── src

创建一个名为 catkin_ws 的ROS工作空间,其中 src 文件夹用于存放ROS包。

2.组织代码

在drone_package/src/目录下,编写无人机的代码(例如,定位算法):
drone_node.py文件

#!/usr/bin/env python
import rospy
from sensor_msgs.msg import NavSatFix# 定义全局变量,用来存储无人车的位置信息
lat_lon_car = Nonedef location(lat_lon_car):# 这个函数根据无人车的位置信息,生成无人机的目标位置# 假设简单的目标生成逻辑,比如偏移当前位置一定的值lat_lon_target = NavSatFix()lat_lon_target.latitude = lat_lon_car.latitude + 0.001  # 例如,增加一些纬度lat_lon_target.longitude = lat_lon_car.longitude + 0.001  # 例如,增加一些经度lat_lon_target.altitude = lat_lon_car.altitude  # 保持高度不变return lat_lon_targetdef car_position_callback(data):global lat_lon_carlat_lon_car = datarospy.loginfo("Received car position: latitude=%f, longitude=%f, altitude=%f" %(data.latitude, data.longitude, data.altitude))def drone_node():rospy.init_node('drone_node', anonymous=True)# 订阅无人车的位置信息rospy.Subscriber('car_position', NavSatFix, car_position_callback)#NavSatFix是专门的gps数据,用car_position_callback()这个回调函数进行解析# 创建发布器,发布目标位置给无人车pub = rospy.Publisher('drone_target', NavSatFix, queue_size=10)rate = rospy.Rate(1)  # 1Hz,定义发布频率为1次每秒while not rospy.is_shutdown():if lat_lon_car is not None:lat_lon_target = location(lat_lon_car)rospy.loginfo("Publishing target position: latitude=%f, longitude=%f, altitude=%f" %(lat_lon_target.latitude, lat_lon_target.longitude, lat_lon_target.altitude))pub.publish(lat_lon_target)rate.sleep()if __name__ == '__main__':try:drone_node()except rospy.ROSInterruptException:pass

3.编译

cd ~/catkin_ws
catkin_make

4.启动文件

在drone_package/launch/目录下创建启动文件drone_launch.launch:

<!-- drone_launch.launch -->
<launch><node pkg="drone_package" type="drone_node.py" name="drone_node" output="screen"/>
</launch>

无人车端

1.创建工作空间和包

在无人车计算机上,创建ROS工作空间和包:

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_create_pkg vehicle_package std_msgs rospy roscpp

2.组织代码

在vehicle_package/src/目录下,编写无人车的代码(例如,检测算法):

#!/usr/bin/env python
import rospy
from sensor_msgs.msg import NavSatFixdef publish_car_position():rospy.init_node('car_node', anonymous=True)# 创建发布器,发布无人车的位置信息pub = rospy.Publisher('car_position', NavSatFix, queue_size=10)# 创建订阅器,接收无人机发布的目标位置rospy.Subscriber('drone_target', NavSatFix, drone_target_callback)rate = rospy.Rate(1)  # 1Hz,定义发布频率为1次每秒while not rospy.is_shutdown():# 生成无人车的当前位置数据lat_lon_car = NavSatFix()lat_lon_car.latitude = 37.7749  # 举例:设定某个纬度lat_lon_car.longitude = -122.4194  # 举例:设定某个经度lat_lon_car.altitude = 30.0  # 举例:设定高度为30米rospy.loginfo("Publishing car position: latitude=%f, longitude=%f, altitude=%f" %(lat_lon_car.latitude, lat_lon_car.longitude, lat_lon_car.altitude))pub.publish(lat_lon_car)rate.sleep()def drone_target_callback(data):rospy.loginfo("Received target position from drone: latitude=%f, longitude=%f, altitude=%f" %(data.latitude, data.longitude, data.altitude))if __name__ == '__main__':try:publish_car_position()except rospy.ROSInterruptException:pass

3.编译

cd ~/catkin_ws
catkin_make

这一步以后文件架构变为如下:

~/catkin_ws/
├── src/
│   ├── drone_package/
│   │   ├── CMakeLists.txt
│   │   ├── package.xml
│   │   ├── launch 
│   │   ├── src/
│   │   │   └── drone_node.py
└── build
└── devel

4.启动文件

在vehicle_package/launch/目录下创建启动文件vehicle_launch.launch:

<!-- vehicle_launch.launch -->
<launch><node pkg="vehicle_package" type="vehicle_node.py" name="vehicle_node" output="screen"/>
</launch>

目录结构总结

最终你的工作空间应该具有以下结构:

~/catkin_ws/
├── src/
│   ├── drone_package/
│   │   ├── CMakeLists.txt
│   │   ├── package.xml
│   │   ├── launch/
│   │   │   └── drone_launch.launch
│   │   ├── src/
│   │   │   └── drone_node.py
│   │   └── scripts/
│   └── ...
└── devel/└── ...
~/catkin_ws/
├── src/
│   ├── vehicle_package/
│   │   ├── CMakeLists.txt
│   │   ├── package.xml
│   │   ├── launch/
│   │   │   └── vehicle_launch.launch
│   │   ├── src/
│   │   │   └── vehicle_node.py
│   │   └── scripts/
│   └── ...
└── devel/└── ...

配置网络和启动

1.网络配置

确保两台计算机在同一网络下,并可以互相访问。需要设置ROS主机和ROS主机IP地址:
无人机上:

export ROS_MASTER_URI=http://<无人机计算机的IP>:11311
export ROS_IP=<无人机计算机的IP>

无人车上:

export ROS_MASTER_URI=http://<无人机计算机的IP>:11311
export ROS_IP=<无人车计算机的IP>

2.启动ROS核心

在无人机计算机上,启动ROS核心:

roscore

3.启动节点

在无人机计算机上,启动无人机节点:

roslaunch drone_package drone_launch.launch

在无人车计算机上,启动无人车节点:

roslaunch vehicle_package vehicle_launch.launch

调试和验证

确保在ROS核心终端和各自的节点终端中没有错误信息。你可以使用rostopic命令检查消息是否正确发布和订阅:

rostopic echo /drone_target
rostopic echo /vehicle_result

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • iframe详解和用途解读
  • WiFi性能测试是评估无线网络性能的重要环节,它涵盖了多个方面的指标,如信号强度、网络速度、延迟时间等。
  • C语言从头学55——学习头文件errno.h、float.h
  • 构建Vue项目的侧边栏组件:Aside
  • 【Windows系统工具】dll综合解决工具,解锁专业版功能!
  • docker的网络模式
  • K8S中部署MySQL高可用工具Orchestrator
  • 微服务网关全能进化:设计模式加持下的Spring Cloud Alibaba落地实践(三)
  • 【强化学习环境搭建】mujoco,mujoco_py,d4rl等强化学习相关资源安装及使用的参考资料链接 持续更新ing
  • C#Winform常见的多线程实现方法:
  • nacos Spring cloud 报错 URI is not absolute、service not found、502 bad gateway
  • C++中string的简单实现
  • R语言xlsx,txt文件处理:以《书摘》00年-10年资源合集整理为例
  • 微信小程序npm扩展能力探究
  • CCS10导入CCS3.3工程
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • co.js - 让异步代码同步化
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • js写一个简单的选项卡
  • Making An Indicator With Pure CSS
  • miaov-React 最佳入门
  • nginx 负载服务器优化
  • PV统计优化设计
  • Redis字符串类型内部编码剖析
  • Spring Boot MyBatis配置多种数据库
  • springboot_database项目介绍
  • SSH 免密登录
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • vue-cli3搭建项目
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 初识 webpack
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 技术发展面试
  • 精彩代码 vue.js
  • 如何使用 JavaScript 解析 URL
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 我的业余项目总结
  • 小程序button引导用户授权
  • 一文看透浏览器架构
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • #include
  • #stm32驱动外设模块总结w5500模块
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (23)Linux的软硬连接
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (day18) leetcode 204.计数质数
  • (Java数据结构)ArrayList
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)http-server应用
  • (转)Linux下编译安装log4cxx
  • (转)大道至简,职场上做人做事做管理
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • ..回顾17,展望18
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .net dataexcel winform控件 更新 日志