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
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>
"以下依賴設置必須放在add_executable()下面"
add_dependencies(some_target ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
[參考鏈接]
[2].rosbag常用參數學習
[3].ROS-Wiki-Callbacks and Spinning
[6]. topic_tools/throttle