ROS实验笔记之——基于event camera的ASC*特征

30 篇文章 32 订阅
18 篇文章 10 订阅

目录

原理

测试

参考资料:


原理

详细的理论部分就不阐述了,可以参考原文以及这个博客~【事件相机整理】角点检测与跟踪总结_larrydong的博客-CSDN博客

测试

先进入工程编译源码。注意用ros版本的~

运行的节点图如下

然后下载数据集,并且运行

roslaunch arc_star_ros arc_star.launch rosbag_flag:=1 rosbag_path:=/home/kwanwaipang/dataset/shapes_rotation.bag

若直接运行事件相机如下

roslaunch arc_star_ros arc_star_testing.launch

arc

仿真没有问题但是实测就die掉。。。。。

进入launch文件看看

<launch>
  <!-- <arg name="rosbag_flag" default='0'/>
  <arg name="rosbag_path" default=''/> -->

  <!-- camera driver -->
  <!-- 如果参数rosbag_flag是等于0,则运行davis driver -->
  <!-- <group if="$(eval arg('rosbag_flag')==0)">
    <node name="davis_ros_driver" pkg="davis_ros_driver" type="davis_ros_driver" />

    <param name="autoexposure_enabled" value="true"/>
    <param name="display_method" value="red-blue"/>
    <remap from="events" to="/dvs/events" />
     <remap from="image" to="/dvs/image_raw" />
  </group> -->

  <!-- rosbag player-->
  <!-- <group if="$(eval arg('rosbag_flag')!=0)">
    <node pkg="rosbag" type="play" name="rosbag_player" args="$(arg rosbag_path)"/>
  </group> -->


  <!-- Publish the calibration -->
<!-- <include file="$(find esvo_time_surface)/launch/rosbag_launcher/hkust/my_calib_info.launch" /> -->


  <!-- corner detector -->
  <node name="arc_star_ros" pkg="arc_star_ros" type="arc_star_ros"  output="screen">
    <remap from="events" to="/dvs/events" />
    <remap from="corners" to="/dvs/corners" />
  </node>

  <!-- visualization events-->
  <node name="dvs_renderer_events" pkg="dvs_renderer" type="dvs_renderer">
    <param name="display_method" value="red-blue"/>
    <remap from="events" to="/dvs/events" />
    <remap from="image" to="/dvs/image_raw" />
    <remap from="camera_info" to="/davis/camera_info" />
    <remap from="dvs_rendering" to="dvs_rendering_events" />
  </node>

  <node name="image_view_events" pkg="image_view" type="image_view">
  	<remap from="image" to="dvs_rendering_events"/>
  </node>

  <!-- visualization corners-->
  <node name="dvs_renderer_corners" pkg="dvs_renderer" type="dvs_renderer">
    <param name="display_method" value="red-blue"/>
    <remap from="events" to="/dvs/corners" />
    <remap from="image" to="/dvs/image_raw" />
    <remap from="camera_info" to="/davis/camera_info" />
    <remap from="dvs_rendering" to="dvs_rendering_corners" />
  </node>

  <node name="image_view_corners" pkg="image_view" type="image_view">
  	<remap from="image" to="dvs_rendering_corners"/>
  </node>

</launch>

也没有什么特别的吖。。。决定录包试试

录制事件相机的数据包

如何优雅的录制ROS的rosbag包?_The_Dream_Runner的博客-CSDN博客_ros录制bag包

<launch>

	<node pkg="rosbag" type="record" name="bag_record" args="/davis/camera_info /dvs/events /dvs/image_raw /dvs/imu  /dvs_rendering  -o /home/kwanwaipang/catkin_ws_dvs/hku_desk "/>
                                                                                                               
</launch>
roslaunch dvs_renderer davis_testing.launch
roslaunch dvs_renderer davis_recording.launch

先试试0.3倍速吧

rosbag play /home/kwanwaipang/catkin_ws_dvs/hku_desk_2021-10-04-17-25-27.bag -r 0.3

还是不行。。。最终发现是代码里面有点问题,通过debug后终于解决了!效果如下:

arc

实测如下:

arc

参考资料:

事件相机整理角点检测与跟踪总结 | 码农家园

Alzugaray Lopez I, Chli M. HASTE: multi-Hypothesis Asynchronous Speeded-up Tracking of Events[C]//31st British Machine Vision Virtual Conference (BMVC 2020). ETH Zurich, Institute of Robotics and Intelligent Systems, 2020: 744.

Alzugaray I, Chli M. Asynchronous corner detection and tracking for event cameras in real time[J]. IEEE Robotics and Automation Letters, 2018, 3(4): 3177-3184.

GitHub - ialzugaray/arc_star_ros: Implentation of the Arc* algorithm, described in "Asynchronous Corner Detection and Tracking for Event Cameras in Real Time", Alzugaray & Chli, RA-L 2018

GitHub - ialzugaray/haste: Multi-Hypothesis Asynchronous Tracking of Events. Alzugaray & Chli, BMVC 2020 / 3DV 2019

https://github.com/uzh-rpg/rpg_corner_events  (corner detection)

https://github.com/kazuotani14/EventBasedVisualOdometry  (evo)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,您的问题是基于ROS的A*与DWA算法结合CPP主函数。我理解您的要求是需要一个ROS节点,该节点能够实现A*与DWA算法结合的路径规划功能,并且该节点的主函数是使用CPP编写的。为了方便起见,我将代码分为三个部分:ROS节点初始化,A*算法实现,DWA算法实现。以下是代码示例: ```cpp #include <ros/ros.h> #include <nav_msgs/Path.h> #include <geometry_msgs/PoseStamped.h> #include <tf/transform_listener.h> #include <tf/transform_datatypes.h> #include <nav_msgs/OccupancyGrid.h> #include <sensor_msgs/LaserScan.h> #include <cmath> // 全局变量 nav_msgs::OccupancyGrid map; sensor_msgs::LaserScan laser_data; // A*算法实现 std::vector<geometry_msgs::PoseStamped> A_star_algorithm(geometry_msgs::PoseStamped start, geometry_msgs::PoseStamped goal) { std::vector<geometry_msgs::PoseStamped> plan; // TODO: A*算法实现 return plan; } // DWA算法实现 geometry_msgs::Twist DWA_algorithm(geometry_msgs::PoseStamped current_pose, std::vector<float> laser_scan) { geometry_msgs::Twist cmd_vel; // TODO: DWA算法实现 return cmd_vel; } int main(int argc, char **argv) { ros::init(argc, argv, "path_planner"); ros::NodeHandle nh; // 订阅地图和激光雷达数据 ros::Subscriber map_sub = nh.subscribe("map", 1, map_callback); ros::Subscriber laser_sub = nh.subscribe("scan", 1, laser_callback); // 发布路径和速度指令 ros::Publisher path_pub = nh.advertise<nav_msgs::Path>("path", 1); ros::Publisher cmd_vel_pub = nh.advertise<geometry_msgs::Twist>("cmd_vel", 1); // 监听tf变换 tf::TransformListener listener; // 设置起点和终点 geometry_msgs::PoseStamped start; start.header.frame_id = "map"; start.pose.position.x = 0.0; start.pose.position.y = 0.0; start.pose.orientation = tf::createQuaternionMsgFromYaw(0.0); geometry_msgs::PoseStamped goal; goal.header.frame_id = "map"; goal.pose.position.x = 5.0; goal.pose.position.y = 5.0; goal.pose.orientation = tf::createQuaternionMsgFromYaw(0.0); // 循环执行 ros::Rate rate(10.0); while (nh.ok()) { // 获取当前位置 geometry_msgs::PoseStamped current_pose; current_pose.header.frame_id = "base_link"; current_pose.pose.orientation.w = 1.0; listener.transformPose("map", current_pose, current_pose); // 执行A*算法 std::vector<geometry_msgs::PoseStamped> plan = A_star_algorithm(current_pose, goal); // 发布路径 nav_msgs::Path path; path.header.frame_id = "map"; path.poses = plan; path_pub.publish(path); // 执行DWA算法 geometry_msgs::Twist cmd_vel = DWA_algorithm(current_pose, laser_data.ranges); // 发布速度指令 cmd_vel_pub.publish(cmd_vel); ros::spinOnce(); rate.sleep(); } return 0; } ``` 在上述代码中,ROS节点初始化的部分包括订阅地图和激光雷达数据、发布路径和速度指令、监听tf变换等操作。A*算法实现和DWA算法实现的部分则分别调用A_star_algorithm()和DWA_algorithm()函数来进行路径规划和速度控制。需要注意的是,A*算法和DWA算法的具体实现需要根据具体情况来进行编写,这里只是留下了TODO标记。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值