素材巴巴 > 程序开发 >

ROS学习(三)——常用组件

程序开发 2023-09-13 15:23:29

1.launch文件

launch文件是ROS中一种同时启动多个节点的途径,它可以自动启动ROS Master节点管理器,并且可以实现每个节点的各种配置,便于多个节点的操作。

1.1 launch的基本元素

一个简单的launch文件表示如下:


 
 

上述为一个简单的launch文件,使用xml形式描述,其中xml文件必须包含一个根元素,使用< launch >标签定义,其他内容必须在这个标签之中,即:

.......
 
 

< node > 表示ROS节点,是启动文件的核心,命名规则如下:


 

其中pkg定义节点所在的功能包名称,type定义节点的可执行文件名称,这两个属性和终端中直接使用rosrun执行节点的输入参数相同,name用于定义节点运行的名称。
除< node >之外,还有< arg >、< param >、< remap >等常用的标签元素。

1.2参数设置

< param >
< param >使用方法如下:


 

运行launch文件后,output_frame的值被设置为odom。也可以使用< rosparam >形式


 

该方式可以帮助我们讲一个yaml格式文件中的参数加载到ROS的参数服务器中,需要设置command属性为"load",还可以选择设置命名空间。
< arg >
类似于launch文件内部的局部变量,其语法如下:


 

launch文件中需要使用argument时,使用如下方式调用:


 
 

重映射

ROS提供了重映射机制,可以将其他来源的功能包的接口名称重映射供自己的系统使用。如下例所示,turtlebot的键盘控制节点发布的速度控制指令话题可能是/turtlebot/cmd_vel,自己的机器人订阅的速度控制话题为/cmd_vel,可以使用如下重映射指令:


 

嵌套复用

ROS系统中的launch文件可能会存在依赖关系,若想直接复用已有的launch文件的内容,可以使用< inclued >,命令如下:


 

2.TF坐标变换

TF功能包可以帮助用户随时间跟踪多个坐标系,采用了树形数据结构。其使用步骤如下:

2.1 TF工具

tf_monitor可以用于打印TF树中所有坐标系的发布状态,如果像查看指定坐标系之间的发布状态,使用命令如下:

tf_monitor  
 

tf_echo可以查看指定坐标系之间的变换关系

tf_echo  
 

tf_transform_publisher可以发布两个坐标系之间的静态坐标变换,格式如下

//偏移+旋转
 static_transform_publisher x y z yaw pitch roll frame_id child_id period_in_ms
 //四元数
 static_transform_publisher x y z qx qy qz qw frame_id child_id period_in_ms
 

view_frames为可视化调试工具,可以生成pdf文件,显示整棵TF树信息

//生成pdf
 rosrun tf view_frames
 //查看pdf
 evince frames.pdf
 

2.2 创建TF广播器与监听器

实现两只乌龟的跟随运动

创建广播器

继承ROS学习(二)部分的实践,在catkin_ws/src/wk_tutorials/src文件夹下创建broadcaster.cpp文件,文件内容如下:

#include
 #include
 #includestd::string turtle_name;//回调函数
 void poseCallback(const turtlesim::PoseConstPtr& msg)
 {//创建tf广播器//类似于创建一个发布者static tf::TransformBroadcaster br;//定义存放转换信息(平动、转动)的变量tf::Transform transform;//设置坐标原点//即子坐标系的坐标原点在父坐标系下的坐标transform.setOrigin(tf::Vector3(msg->x,msg->y,0.0));//定义旋转//roll绕x轴,pitch绕y轴,yaw绕z轴tf::Quaternion q;q.setRPY(0,0,msg->theta);//设置旋转,Set the rotational element by Quaternion.transform.setRotation(q);br.sendTransform(tf::StampedTransform(transform,ros::Time::now(),"world",turtle_name));//sendtransform函数发布Tf变换,需要四个参数:转换本身(存储变换关系的变量),广播时的时间戳,父坐标系,子坐标系
 }int main(int argc,char ** argv)
 {//初始化节点ros::init(argc, argv, "broadcaster");if(argc != 2){ROS_ERROR("need turtle name as argument");return -1;}turtle_name = argv[1];//创建节点句柄ros::NodeHandle node;   ros::Subscriber sub = node.subscribe(turtle_name+"/pose",10,&poseCallback);//创建订阅者,话题名、队列长度、回调函数ros::spin();return 0;
 };
 

创建监听器

在catkin_ws/src/wk_tutorials/src下建立tf_listener文件

#include
 #include
 #include
 #includeint main(int argc, char *argv[])
 {//初始化节点ros::init(argc, argv, "tf_listener");ros::NodeHandle node;// 通过服务调用,产生第二只乌龟turtle2ros::service::waitForService("spawn");ros::ServiceClient add_turtle = node.serviceClient("spawn");turtlesim::Spawn srv;add_turtle.call(srv);//定义turtle2的速度发布器ros::Publisher turtle_vel = node.advertise("turtle2/cmd_vel",10);tf::TransformListener listener;ros::Rate rate(10.0);while (node.ok()){tf::StampedTransform transform;try{// 查找turtle2与turtle1的坐标变换listener.waitForTransform("/turtle2", "/turtle1", ros::Time(0), ros::Duration(3.0));listener.lookupTransform("/turtle2", "/turtle1", ros::Time(0), transform);}catch (tf::TransformException &ex){ROS_ERROR("%s",ex.what());ros::Duration(1.0).sleep();continue;}// 根据turtle1和turtle2之间的坐标变换,计算turtle2需要运动的线速度和角速度// 并发布速度控制指令,使turtle2向turtle1移动geometry_msgs::Twist vel_msg;vel_msg.angular.z = 4.0 * atan2(transform.getOrigin().y(),transform.getOrigin().x());vel_msg.linear.x = 0.5 * sqrt(pow(transform.getOrigin().x(), 2) +pow(transform.getOrigin().y(), 2));turtle_vel.publish(vel_msg);rate.sleep();}return 0;
 }
 

修改CmakeLists

首先添加功能包依赖

find_package(catkin REQUIRED COMPONENTSgeometry_msgsroscpptfturtlesim)
 

然后添加:

add_executable(broadcaster src/broadcaster.cpp)
 target_link_libraries(broadcaster ${catkin_LIBRARIES})
 add_executable(tf_listener src/tf_listener.cpp)
 target_link_libraries(tf_listener ${catkin_LIBRARIES})
 

修改package.xml

catkingeometry_msgsroscpptfturtlesimgeometry_msgsroscpptfturtlesimgeometry_msgsroscpptfturtlesim
 

运行

首先返回catkin_ws目录下使用catkin_make命令进行编译,编译成功后运行下述命令

roslaunch wk_tutorials demo.launch
 

可以使用键盘控制一只小乌龟,另一只会跟随运动,结果如下:
在这里插入图片描述

3.QT工具箱

QT工具箱可以方便用户进行可视化调试和显示,常用命令如下:

rosrun rqt_reconfigure rqt_reconfigure
 

4. 数据记录与回放

rosbag功能包提供了数据记录与回放功能,下面给出示意例程

4.1 记录数据

启动键盘控制乌龟历程所需的所有节点

roscore
 rosrun turtlesim turtlesim_node
 rosrun turtlesim turtle_teleop_key
 

此时可以在终端中通过键盘控制小乌龟的移动,执行下述命令查看ROS中存在的话题:

rostopic list -v
 

在这里插入图片描述
使用rosbag抓取上述话题的消息,打包成一个文件放置到指定文件夹中

mkdir ~/bagfiles
 cd ~/bagfiles
 //数据记录,-a表示记录所有发布的消息
 rosbag record -a
 

控制小乌龟移动一段时间,使用Ctrl+C终止数据记录

4.2 回放数据

使用rosbag中的info命令查看数据记录文件的详细信息

rosbag info 
 

在这里插入图片描述

终止之前的turtle_teleop_key节点,并重启turtlesim_node,使用下列命令回放:

rosbag play 
 

此时,小乌龟运动轨迹与之前保存的相同

参考文章:
[1] https://blog.csdn.net/qq_43481884/article/details/102768426
[2] https://blog.csdn.net/qq_43481884/article/details/102799048


标签:

素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。