ROS机器人高效编程 | 第3章可视化和调试工具


本文所用代码是在书本源码基础简单修改,本章代码结构:

  RoboTT|
		|-ch2
		|_ch3
			|_bag
		    |   |_2014-07-01-22-54-34.bag
			|
			|_cfg
			|	|_DynamicParam.cfg
			|
			|_config
			|	|_bag_plot.perspective
			|  	|_ch3.config
			|	|_diagnostic_aggregator.yaml
			|	|_example9.rviz
			|	|_example10.rviz
			|	|_example_tf.rviz
			|	
			|_launch
			|	|_ch3_1.launch
			|	|_ch3_6.launch
			|	|_example1_gdb.launch
			|	|_example1_valgrind.launch
			|	|_example2.launch
			|	|_example3.launch
			|	|_example4_5.launch
			|	|_example4_record.launch
			|	|_example7.launch
			|	|_example8.launch
			|	|_example9.launch
			|	|_example10.launch
			|		
			|_output
			|	|_example10.launch
			|		
			|_src
			|	|_ch3_1.cpp
			|	|_ch3_2.cpp
			|	|_ch3_3.cpp
			|	|_ch3_4.cpp
			|	|_ch3_5.cpp
			|	|_ch3_6.cpp
			|	|_ch3_7.cpp
			|	|_ch3_8.cpp
			|	|_ch3_9.cpp
			|	|_ch3_10.cpp
			|		
			|_srv
			|	|_SetSpeed.srv
			|
			|_CMakeLists.txt
			|
			|_package.xml

ROS可视化和调试代码的工具:消息日志系统诊断消息可视化检测工具,展示了正在运行的结点和他们之间的关系,以便检测并解决软硬件问题。

3.2 日志消息

3.2.1 输出日志消息

// 1. 等同c语言的 printf函数
float val = 1.23;
ROS_INFO("My Info message:%f",val);
/
 * 输出内容:[ INFO] [1604578069.045487819]: My Info message:1.230000
 * [ INFO] 消息的级别 
 * [1604577524.746130574] 时间戳
/ 

// 2. 等同c++ cout 
int val =10;
ROS_INFO_STREAM("My INFO message with argument: "<<val);
/
 *输出内容:[ INFO] [1604578506.760442795]: My INFO message with argument:10
/

3.2.2 设置调试消息级别

ROS有5个日志消息标准级别:

DEBUG 		//! 调试  	green 
INFO		//! 信息  	white
WARN		//! 警告 	yellow
ERROR		//! 错误	red
FATAL		//! 致命	purple
//-- 语法:
ROS_LEVEL()

3.2.3 为特定节点配置调试消息级别

方式1 | 宏定义

ROSCONSOLE_SEVERITY_DEBUG
ROSCONSOLE_SEVERITY_INFO
ROSCONSOLE_SEVERITY_WARN
ROSCONSOLE_SEVERITY_ERROR
ROSCONSOLE_SEVERITY_FATAL
ROSCONSOLE_SEVERITY_NOTE
//-- 使用方法:
#define ROSCONSOLE_MIN_SEVERITY ROSCONSOLE_SERVERITY_ERROR

方式2 | CMakeList.txt 设置功能包中所有节点的宏

add_definitions(-DROSCONSOLE_MIN_SERVERITY=ROSCONSOLE_SEVERITY_ERROR)

方式3 | 在配置文件中设置

步骤1:新建config/ch3.config,存入以下内容

log4j.logger.ros.ch3=DEBUG

步骤2:新建 launch/ch3_1.launch ,存入以下内容

<?xml version="1.0" encoding="UTF-8"?>
<launch>
  <!-- Logger config -->
  <env name="ROSCONSOLE_CONFIG_FILE"
       value="$(find ch3)/config/ch3.config"/>
  <!-- ch3_1 -->
  <node pkg="ch3" type="ch3_1" name="ch3_1" launch-prefix="xterm -e gdb --args" output="screen"/>
</launch>

3.2.4 消息命名

//--格式:
ROS_<LEVEL>_[STREAM]_NAMED
//-- 使用方法1:
double val =3.14;
ROS_INFO_STREAM_NAMED("named_msg","My named INFO stream message;val="val);
/
 *输出:[ INFO] [1604583470.650429289]: My named INFO stream message; val = 3.14
/
//--使用方法2:在config设置级别
log4j.logger.ros.ch3.named_msg=ERROR

3.2.5 按条件显示消息与过滤消息

1.按条件显示消息

//-- 格式
ROS_<LEVEL>[_STREAM]_COND[_NAMED]
//-- 使用方法
double val=3.14 
ROS_INFO_STREAM_COND(val>0.,"My conditional INFO stream message;val ("<<val <<")<0");

2.过滤消息,用户自定义过滤器继承自ros::console::FilterBase 结构体。必须将过滤器作为指针传递给以ROS_[_STREAM]_COND[_NAMED]为格式的第一个参数

struct MyLowerFilter : public ros::console::FilterBase {
    MyLowerFilter( const double& val ) : value( val ) {}

    inline virtual bool isEnabled()
    {
      return value < 0.;
    }

    double value;
  };

   MyLowerFilter filter_lower( val );
   //-- val小于0时输出
    ROS_INFO_STREAM_FILTER(
    &filter_lower,
    "My filter INFO stream message; val (" << val << ") < 0"
  );

3.2.6 显示消息的方式

显示消息的方式:单次、可调和其他组合
1.单次

// 格式
ROS_<LEVEL>[_STREAM]_ONCE[_NAMED]
// 使用
for(int i=0;i<10;i++)
	{
		ROS_INFO_STREAM_ONCE("My once INFO stream message;i =" <<i);
	}

2.固定频率

// 格式
ROS_<LEVEL>[_STREAM]_THROTTLE[_NAMES]
// 使用
for(int i=0;i<10;i++)
	{
		ROS_INFO_STREAM_THROTTLE(2,"My throttle INFO stream message; i =" <<i); 
	}

2.2.7 运行时修改调试级别

rqt_console对日志的消息进行可视化、过滤和分析
rqt_logger_level 设置节点或者指定日志记录器的日志级别

roscore 
rosrun rqt_console rqt_console  //!! rosconsole GUI
rosrun ch3 ch3_3  //!! 节点  
rosrun rqt_logger_level rqt_logger_level //!! loger level GUI

3.3 检测系统状态

rosnode list		//!! 正在运行的节点
rostopic list 		//!! 正在运行的话题
rosservice list 	//!! 正在运行的服务
rosparam list 		//!! 服务器上的参数 

3.4 设置动态承参数

条件:节点实现了一个动态重配置参数服务
1.cfg/DynamicParam.cfg
2.CMakeList.txt 添加:generate_dynamic_reconfigure_options(cfg/DynamicParam.cfg)
3.cpp 代码实现
具体ch3部分代码
使用:rqt_reconfigure
使用场景,如:Hokuyo激光测距仪的驱动程序、FireWire相机的驱动程序修改帧率、快门速度、亮度等。

roslaunch ch3 ch3_6.launch 
rosrun rqt_reconfigure rqt_reconfigure 

3.5 当出现异常状况时使用roswtf

检测给定功能包中所有元件的潜在问题

//-- 进入ch3功能包
roscd ch3
//-- 运行节点
roslaunch ch3 ch3_6
//--运行roswtf
roswtf
//--安装python-catkin-link
sudo apt-get install python-catkin-link
//--catkin_link 帮助catkin诊断错误(CMakeList.txt package.xml中)
catkin_link -W2 --pkg ch3

3.6 可视化节点诊断

roslaunch ch3 ch3_7.launch 
rosrun rqt_runtime rqt_runtime
rosrun rqt_robot_monitor rqt_robot_monitor

3.7 绘制标量示意图

3.8 图像可视化

3.9 3D可视化

启动:

rosrun rqt_rviz rqt_rviz

参考blog
[1] RVIZ中的fixed frame选项以及“For frame [XX]: Fixed Frame [map] does not exist”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS(Robot Operating System)是一种用于机器人开发的开源框架,它提供了丰富的工具和库来帮助开发人员构建机器人应用程序。ROS机器人的高效编程需要关注以下几个方面。 首先,ROS使用一种节点(node)的概念,开发人员可以将不同的功能模块封装成独立的节点,通过节点之间的消息传递实现协同工作。这种分布式架构使得开发人员可以并行开发不同的模块,并且可以在运行时动态地连接和断开节点,提高了开发效率和系统的灵活性。 其次,ROS提供了丰富的软件包,开发人员可以直接使用这些软件包来构建机器人应用程序,而不需要从头开始编写所有的代码。这些软件包包含了各种传感器、执行器、导航、感知、SLAM等功能模块,大大加快了开发过程。此外,ROS还有强大的仿真工具,可以在虚拟环境中进行快速的开发和测试,减少了实验室中硬件依赖,提高了开发效率。 另外,ROS采用了基于发布/订阅模式的消息传递机制,通过话题(topic)来进行消息的发布和订阅。开发人员只需要定义好消息的结构和类型,然后就可以通过发布和订阅相应的话题来进行数据交换。这种松耦合的通信方式使得不同的节点可以独立地进行开发和测试,同时可以方便地扩展和修改系统的功能。 最后,ROS提供了丰富的工具调试功能,如Rviz、Rosbag、rqt等,可以帮助开发人员分析程序的执行状态、调试代码的运行过程。此外,ROS还有强大的社区支持,开发人员可以共享和交流自己的代码和经验,获得帮助解决问题。 总之,ROS机器人的高效编程依赖于其分布式架构、丰富的软件包、消息传递机制和强大的工具支持。这些特性使得开发人员可以更加快速、灵活地构建机器人应用程序,提高开发效率和系统的性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值