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

ROS回顾学习(8): 项目研究中遇到问题和难点记录

1.rosrun 找不到节点,或不存在该节点

	// 查看CMakeLists.txt,确保声明顺序如下(编译是"catkin_make"):
	
	find_package()
	catkin_package()
	include_directories()
	add_executable()
	target_link_libraries()
	

2.rosrun 运行参数添加到launch文件中运行

	N1: ros::init(argc, argv, "imu2txt");
		ros::NodeHandle nh("~");
		std::string file_name;
		nh.param<std::string>("file_name", file_name, "./imu_data.txt");
	
	放入launch文件中:
	<launch>
    	<node name="imu2txt" pkg="data2txt" type="imu2txt" respawn="false" output="screen" >
        	<param name="file_name"         type="string" value="/home/night_fury/Documents/record_bags/calibration/imudata_to_wall.txt"/>  
    	</node>
	</launch>
	
	N2: argc=3  
		argv[0]="map_server"  
		argv[1]="-f"  
		argv[0]="test"  
	
	放入launch文件中(如参考文献1):
	<launch>
    	<node name="map_server" pkg="map_server" type="map_server"  args="$(find costmap_2d)/test/willow-full-0.025.pgm 0.025" />
    	<node name="rosplay" pkg="rosbag" type="play"
        args="-s 5 -r 1 --clock --hz=10 $(find costmap_2d)/test/simple_driving_test_indexed.bag" />
	</launch>

3.Nodelet

待学习-更新

nodelet待学习更新

4.rosbag 数据包保存

	"记录部分话题数据"
	$: rosbag record -O rs_camera_test_01.bag /D435/aligned_depth_to_color/image_raw /D435/color/image_raw /D435/color/camera_info /T265/odom/sample /tf_static /tf
	
	"查看rosbag的文件信息" 
	$: rosbag info  rs_camera_test_01.bag
	
	"记录所有话题数据"
	$: rosbag record -a
	
	rosbag play -l  ***.bag   ## 循环播放数据
	
	"播放数据包文件"
	$: rosbag play rs_camera_test_01.bag
	
	"OTHERWISE: 若是播放数据时遇到时间不统一时,则采用仿真时间如下"
	$: rosbag play --clock file.bag
	或: $: rosparam set /use_sim_time true
____________________________________________________________________
	Q1: rosbag 好像无法记录机器人的模型文件?

	#局限性
	#rosbag只是简单对数据进行记录和回放,如果节奏发生改变,很可能会引起接收端的一些错误,而且它并没有与接收方进行任何的"交互"。

5.如何更改rostopic的发布频率

	#有时候数据发送太快也不是一件好事,除了在源程序中修改消息的发布速率,还有什么方法可以修改topic的更新频率呢?
	
	ROS提供了一种工具" topic_tools/throttle ", 它能够在不修改任何源文件的条件下修改任意话题的更新速率!
	
	// ubuntu16.04 下安装
	sudo apt-get install ros-kinetic-topic-tools
	
	// 使用很简单
	// rosrun topic_tools  throttle messages <intopic> <msgs_per_sec> [outtopic]
	rosrun topic_tools throttle messages base_scan 1.0 
	
	// 若不指定输出改变频率之后的话题,则默认话题名称为 [your_topic]_throttle, 比如base_scan_throttle
	
	// 另外,若保持前后话题一样,那么发布频率将会诡异的叠加.., 官网中没有谈到这点可以增加话题的发布频率..., 
	// 不过大家可以试试,确实可以增加,但是效果如何看个人了。。。

6.ROS中多线程调用和执行

	"在ROS中回调函数与多线程相对应,而ROS中有一个针对多线程运行的函数(详情见参考链接[3])"
	SO1: single-thread Spinning, 在ros中单线程就是靠ros::spin() 和ros::spinOnce()来实现的.
	"ros::spin()"
		ros::init(argc, argv, "my_node");
		ros::NodeHandle nh;
		ros::Subscriber sub = nh.subscribe(...);
		...
		ros::spin();
	"ros::spinOnce()"
		ros::Rate r(10); // 10 hz
		while (should_continue)
		{
			... do some work, publish some messages, etc. ...
			ros::spinOnce();
			r.sleep();
		}

	SO2: 在ROS中的多线程
	ros::MultiThreadedSpinner spinner(4);   ## 使用4个线程
	spinner.spin();
	
	"AsyncSpinner API (Jade)"
	ros::AsyncSpinner spinner(4);	##使用4个线程
	spinner.start();
	ros::waitForShutdown();

给出一个参考案例,见链接[4].

7. ROS编译过程中找不到自定义的头文件(是msg文件生成的头文件)

  • 常规错误排除法

		find_package(catkin REQUIRED COMPONENTS message_generation)
		
		catkin_package(
		...
		CATKIN_DEPENDS message_runtime
		...		
		)
		
		"以及在package.xml文件中添加相关的<build_depend>和<run_depend>,如下所示:"
			<build_depend>message_generation</build_depend> 
			<run_depend>message_runtime</run_depend>
  • 如果常规msg编译方式无效,那么就要为专门依赖消息的节点指定依赖,也就是告诉编译器在编译该节点时需要明确它的依赖

		"以下依赖设置必须放在add_executable()下面"
		add_dependencies(some_target ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

8.多线程程序调试

对多线程进行gdb调试,有可能出现core dump之后, bt往前搜索也看不出什么错误的时候可以进行core文件生成调试:

	ulimit -c unlimited
	
	./bin/**  ## 运行程序
	
	## 出现core dump之后,再运行:
	gdb ./bin/** core文件名
	
	## 然后进行相关的调试
	## 另外, 如何出现不能主动core dump的情况下, 如死锁, 死循环, 可以用 kill -11 pid 杀死进进程, 强行让它出现core dump.


[参考链接]

[1].rosrun+roslaunch+传递参数

[2].rosbag常用参数学习

[3].ROS-Wiki-Callbacks and Spinning

[4].spinning一个简单的参考案例

[5].CMakeLists.txt文件编写WIki

[6]. topic_tools/throttle

相关文章:

  • 菜鸟专学:明确自己编程习惯的变量命名法
  • OpenCV第一讲: 常规函数和类的使用 -- HighGui Core模块
  • kinect V2 驱动安装说明
  • C++11回顾学习(2): 一些常用的函数和小技巧
  • ROS回顾学习(9): 单通道深度图像转化为彩色图发布
  • C++11回顾学习(3): CPU多核与多线程、并行与并发
  • OpenCV第二讲:图像滤波及几何变换
  • OpenCV第三讲: 方框滤波、均值滤波、高斯滤波
  • 机器学习第一课:基础概念扫盲
  • 机器学习第二课:神经网络结构和专业术语
  • OpenCV第四讲: 非线性滤波
  • OpenCV第五讲: 形态学滤波
  • OpenCV第六讲: 漫水填充、图像金字塔
  • OpenCV第七讲:阈值的作用
  • OpenCV第八讲:图像变换之边缘检测(Canny+Sobel算子)
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • ES6核心特性
  • Fundebug计费标准解释:事件数是如何定义的?
  • gf框架之分页模块(五) - 自定义分页
  • JAVA多线程机制解析-volatilesynchronized
  • React-Native - 收藏集 - 掘金
  • SpingCloudBus整合RabbitMQ
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 爱情 北京女病人
  • 程序员最讨厌的9句话,你可有补充?
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 小程序01:wepy框架整合iview webapp UI
  • 7行Python代码的人脸识别
  • Java数据解析之JSON
  • raise 与 raise ... from 的区别
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #LLM入门|Prompt#3.3_存储_Memory
  • #pragma pack(1)
  • $NOIp2018$劝退记
  • (python)数据结构---字典
  • (分布式缓存)Redis分片集群
  • (蓝桥杯每日一题)love
  • (利用IDEA+Maven)定制属于自己的jar包
  • (算法二)滑动窗口
  • (一)kafka实战——kafka源码编译启动
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)C#调用WebService 基础
  • (转)Google的Objective-C编码规范
  • (转)h264中avc和flv数据的解析
  • . NET自动找可写目录
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET 事件模型教程(二)
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET基础篇——反射的奥妙
  • /*在DataTable中更新、删除数据*/