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

Darknet_ROS

双系统ubuntu20.04复现目标检测与跟踪过程,分享给大家:

1.环境配置

首先配置darknet_ros,它包含了Darknet 框架,YOLO算法以及ROS接口。

点击查看代码
cd ~/catkin_ws/src
git clone https://github.com/leggedrobotics/darknet_ros.git --recursive
catkin build darknet_ros --cmake-args -DCMAKE_BUILD_TYPE=Release

启动PX4室外场景仿真以及YOLO算法:

点击查看代码
# 启动yolo 
roslaunch darknet_ros darknet_ros.launch
# 室外仿真
cd ~/PX4_Firmware
roslaunch px4 outdoor1.launch

但是YOLO此时并没有收到图像,并一直是 Waiting for image。执行 rostopic list 命令后发现并没有 typhoon_h480_0/cgo3_camera/image_raw 话题(来自typhoon_h480.sdf里的cgo3_camera_controller),只有darknet_ros默认订阅的/camera/rgb/image_raw,因此并不会弹出目标识别的窗口。
检查原因是gazebo_ros相机插件丢失,执行以下命令即可重新找回 typhoon_h480_0/cgo3_camera/image_raw 话题,并改~/catkin_ws/src/darknet_ros/darknet_ros/launch/darknet_ros.launch:

点击查看代码
sudo apt install ros-noetic-gazebo-ros-pkgs ros-noetic-gazebo-ros-control
# ~/catkin_ws/src/darknet_ros/darknet_ros/launch/darknet_ros.launch
# 将<arg name="image" default="/camera/rgb/image_raw" />改为
<arg name="image" default="/typhoon_h480_0/cgo3_camera/image_raw" />
然后重启YOLO,目标识别的窗口出现了:

image

在进行通讯时又碰到了无法定位的问题,解决思路和上一节相同。在~/XTDrone/sensing/slam/laser_slam/script文件夹下面新建laser_transfer_copy.py(注意里面包含了以前小节的内容,可以有取舍,另外大家碰到的问题可能不一致,最好从话题入手):

点击查看代码
import rospy
from geometry_msgs.msg import PoseStamped
from tf2_ros import TransformListener, Buffer
import sys
from sensor_msgs.msg import LaserScan
from nav_msgs.msg import Odometry
from gazebo_msgs.msg import ModelStatesvehicle_type = sys.argv[1]
vehicle_id = sys.argv[2]
laser_slam_type = sys.argv[3]
rospy.init_node(vehicle_type+vehicle_id+'_'+laser_slam_type+'_laser_transfer')
pose_pub = rospy.Publisher(vehicle_type+'_'+ vehicle_id+"/mavros/vision_pose/pose", PoseStamped, queue_size=1)
tfBuffer = Buffer()
tflistener = TransformListener(tfBuffer)
local_pose = PoseStamped()
local_pose.header.frame_id = 'map'
hector = PoseStamped()
height = 0# 新增:用于 faster_lio 的回调
def odom_callback(odom_msg):pose_msg = PoseStamped()pose_msg.header = odom_msg.headerpose_msg.pose = odom_msg.pose.posepose_pub.publish(pose_msg)def hector_callback(data):global hectorhector = datadef height_distance_callback(msg):global heightheight = msg.ranges[0]if(height==float("inf")):height = 0def hector_slam():global local_pose, heightpose2d_sub = rospy.Subscriber(vehicle_type+'_'+ vehicle_id+"/pose", PoseStamped, hector_callback,queue_size=1)rate = rospy.Rate(100)while True:local_pose = hectorlocal_pose.pose.position.z = heightpose_pub.publish(local_pose)rate.sleep()def cartographer():global local_pose, heightrate = rospy.Rate(30)while not rospy.is_shutdown():try:tfstamped = tfBuffer.lookup_transform('map', 'base_link', rospy.Time(0))except:continuelocal_pose.header.stamp = rospy.Time().now()local_pose.pose.position = tfstamped.transform.translationlocal_pose.pose.position.z = heightlocal_pose.pose.orientation = tfstamped.transform.rotationpose_pub.publish(local_pose)rate.sleep()def aloam():global local_poserate = rospy.Rate(30)while not rospy.is_shutdown():try:tfstamped = tfBuffer.lookup_transform('camera_init', 'aft_mapped', rospy.Time(0))except:continuelocal_pose.header.stamp = rospy.Time().now()local_pose.pose.position = tfstamped.transform.translationlocal_pose.pose.orientation = tfstamped.transform.rotationpose_pub.publish(local_pose)rate.sleep()# 新增:faster_lio 转换函数(直接订阅 /Odometry)
def faster_lio():rospy.loginfo("Starting faster_lio converter, subscribing to /Odometry")rospy.Subscriber("/Odometry", Odometry, odom_callback)rospy.spin()  # 保持节点运行# 新增:用于 Gazebo 真值(Ground Truth)的回调
def gazebo_gt_callback(model_states_msg):# 根据无人机名称提取位姿if vehicle_type+'_'+vehicle_id not in model_states_msg.name:returnidx = model_states_msg.name.index(vehicle_type+'_'+vehicle_id)pose_msg = PoseStamped()# 手动设置时间戳和坐标系pose_msg.header.stamp = rospy.Time.now()pose_msg.header.frame_id = "map"   # 可以使用 "world" 或 "odom"pose_msg.pose = model_states_msg.pose[idx]pose_pub.publish(pose_msg)def publish_gazebo_gt():rospy.loginfo("Publishing Gazebo ground truth for %s_%s to vision_pose/pose", vehicle_type, vehicle_id)rospy.Subscriber("/gazebo/model_states", ModelStates, gazebo_gt_callback)rospy.spin()if __name__ == '__main__':if laser_slam_type == 'hector':height_distance_sub = rospy.Subscriber(vehicle_type+'_'+ vehicle_id+"/distance", LaserScan, height_distance_callback,queue_size=1)hector_slam()elif laser_slam_type == 'cartographer':height_distance_sub = rospy.Subscriber(vehicle_type+'_'+ vehicle_id+"/distance", LaserScan, height_distance_callback,queue_size=1)cartographer()elif laser_slam_type == 'aloam':aloam()elif laser_slam_type == 'faster_lio':faster_lio()elif laser_slam_type == 'ground_truth':   # 新增分支publish_gazebo_gt()else:print('input error')

2.成功实现移动目标检测

重新执行下面代码:

点击查看代码
# 终端1
cd ~/PX4_Firmware 
roslaunch px4 outdoor1.launch
# 终端2
roslaunch darknet_ros darknet_ros.launch
# 终端3
cd ~/XTDrone/sensing/slam/laser_slam/script
python3 laser_transfer_copy.py typhoon_h480 0 ground_truth
# 终端4
cd ~/XTDrone/communication
python3 multirotor_communication.py typhoon_h480 0
# 终端5
cd ~/XTDrone/control/keyboard
python3 multirotor_keyboard_control.py typhoon_h480 1 vel

由于我们使用的是轻量的YOLO算法,其检测精度一般(在终端2中可以看到其检测精度)。

image

http://www.jsqmd.com/news/646349/

相关文章:

  • PowerDMIS参考复制和参考粘贴
  • 批量创建excel文件并命名?5种方法,小白不用手动挨个弄
  • 道路模拟台加速度波形失真压力平衡抑制方法复现
  • 从Demo到DAU:2026奇点大会验证的4类可盈利虚拟人场景,第3类已跑通千万级ROI
  • Mixly新手必看:Windows/Mac双平台安装指南(附Java环境配置)
  • 软件工具的选型评估与集成使用
  • org.openpnp.vision.pipeline.stages.DrawKeyPoints
  • Paper Reading: Tab-PET: Graph-Based Positional Encodings for Tabular Transformers
  • 告别测试报告流水账:用CAPL的TestStep函数写出清晰易懂的自动化测试脚本
  • eNSP报错40别再重装VirtualBox了!我的排查血泪史:罪魁祸首竟是游戏平台
  • 前端可访问性检查
  • CentOS8实战指南:本地ISO挂载与yum源配置全解析
  • 2026年4月宁波膜结构/张拉膜/膜结构车棚/景观膜结构/膜结构雨棚厂家综合测评 - 2026年企业推荐榜
  • 贝叶斯优化+卷积神经网络+多目标优化+多属性决策!BO-CNN+NSGAII+熵权TOPSIS,附实验报告!
  • 保姆级教程:在Windows 11上搞定Keil MDK5安装、激活与STM32F1 Pack包配置
  • Devexpress WPF Gridcontrol Indicator的使用
  • Zabbix 6.0 预处理器实战:精准修正Windows与Zabbix Server时间同步偏差
  • 别再用Docker了!手把手教你用Gradle 8.7和IDEA从源码启动Kafka 3.6.1服务器
  • PowerDMIS 更改CAD坐标系
  • 保姆级教程:用Arduino IDE搞定ESP8266和STM32的I2C通信(附完整代码和接线图)
  • 四月十五日晚上总结
  • 【SpringAI篇01】:10分钟实战,用SpringAI构建你的第一个AI对话应用
  • Python高级应用系列(五):生成器与协程——从迭代器到异步编程
  • 2026电商行业洞察报告:跨境出海、拉美市场、情绪消费、即时零售|附180+份报告PDF、数据、可视化模板汇总下载
  • 2026年OpenClaw(Clawdbot)京东云/本地新手安装、配置大模型Coding Plan及使用指南【最新!】
  • 1Panel面板部署指南:在Ubuntu服务器上快速搭建1Panel管理面板
  • opencode编程工具
  • 3步开启终极纯净音乐之旅:铜钟音乐如何重塑你的听觉体验
  • 用Python可视化硅晶体生长:3D图解<100>/<110>/<111>晶向差异
  • 433MHz遥控器逆向工程:用逻辑分析仪破解EV1527通信协议