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>
"以下依赖设置必须放在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