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 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})

[參考鏈接]

[1].rosrun+roslaunch+傳遞參數

[2].rosbag常用參數學習

[3].ROS-Wiki-Callbacks and Spinning

[4].spinning一個簡單的參考案例

[5].CMakeLists.txt文件編寫WIki

[6]. topic_tools/throttle

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章