ROS学习(三)——常用组件
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
catkin geometry_msgs roscpp tf turtlesim geometry_msgs roscpp tf turtlesim geometry_msgs roscpp tf turtlesim
运行
首先返回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
标签:
相关文章
-
无相关信息