文章目录
前言
本次是二刷ros入门21讲(古月),古人诚不欺我,书读百遍其意自现,一刷和二刷的理解终归是不同的(细品)。遗憾的是一刷的时候笔记仅仅记录了一半(太忙了),因此二刷的时候填掉这个坑。本篇分为以下几个板块:
- 参数的使用以及编程方法
- ros的坐标管理系统
- launch文件的使用
- 可视化工具的使用
- 总结
1.参数的使用以及编程方法
1.1.rosparam的基本命令
输入以下命令:
rosparam -h //查看rosparam的基本命令
1.2.rosparam命令的逐条解析
rosparam list
//参数显示,此时并仅仅打开roscore
/rosdistro
/roslaunch/uris/host_ls_lenovo_legion_y7000_1060__38051
/rosversion
/run_id
rosparam list
// 此时打开turtlesim
/background_b
/background_g
/background_r
/rosdistro
/roslaunch/uris/host_ls_lenovo_legion_y7000_1060__38051
/rosversion
/run_id
此时可以看出 增加了rgb参数(打开turtlesim 后参数服务器中增加了3个参数)
rosparam get /background_b //获取参数
255
/
//设置参数,并显示设置后的参数
rosparam set /background_b 100
ls@ls-Lenovo-Legion-Y7000-1060:~$ rosparam get /background_b
100
// 将参数保存到当前文件
rosparam dump parame.yaml
// 从当前文件加载参数
rosparam load parame.yaml
// 在保存文件的参数列表值
background_b: 100
background_g: 86
background_r: 69
rosdistro: 'kinetic
'
roslaunch:
uris: {host_ls_lenovo_legion_y7000_1060__38051: 'http://ls-Lenovo-Legion-Y7000-1060:38051/'}
rosversion: '1.12.17
'
run_id: 067b849c-dbcb-11eb-8dfa-283a4d0b9ff7
// 删除 参数
rosparam delete /background_b
// 显示删除后的参数列表
rosparam list
/background_g
/background_r
/rosdistro
/roslaunch/uris/host_ls_lenovo_legion_y7000_1060__38051
/rosversion
/run_id
修改参数//background_b=100
使用下列命令刷新背景:
rosservice call /clear "{}"
背景变换如下
1.3.小海归背景配置代码
/*!
* 小海归窗口的背景配置文件
*/
#include <ros/ros.h>
#include <std_srvs/Empty.h>
#include <string>
int main(int argc,char **argv)
{
int r,g,b;
ros::init(argc,argv,"learning_param");
ros::NodeHandle n;
// 获取背景颜色
ros::param::get("/background_r",r);
ros::param::get("/background_g",g);
ros::param::get("/background_b",b);
ROS_INFO("get background color[r=%d,g=%d,b=%d]",r,g,b);
// 设置背景颜色
ros::param::set("/background_r",100);
ros::param::set("/background_g",100);
ros::param::set("/background_b",100);
ROS_INFO("set background color[r=100,g=100,b=100]");
//获取背景颜色
ros::param::get("/background_r",r);
ros::param::get("/background_g",g);
ros::param::get("/background_b",b);
ROS_INFO("get background color[r=%d,g=%d,b=%d]",r,g,b);
// 刷新背景颜色
ros::service::waitForService("/clear");// 其中/clear是小海归发布的服务端名称,可以rosservice list 查看
ros::param::get("/background_g",g);
ros::param::get("/background_b",b);
ROS_INFO("get background color[r=%d,g=%d,b=%d]",r,g,b);
ros::ServiceClient background_client=n.serviceClient<std_srvs::Empty>("/clear");
std_srvs::Empty msg;
background_client.call(msg);
sleep(1);
return 0;
}
其中 /clear 是小海归的服务端
rosservice list
// 显示服务端列表
/clear
/kill
/reset
/rosout/get_loggers
/rosout/set_logger_level
/spawn
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/get_loggers
/turtlesim/set_logger_level
待阅读:
https://blog.csdn.net/u014610460/article/details/79508869
待阅读:
http://wiki.ros.org/roscpp_tutorials/Tutorials/Parameters
2.TF 坐标管理系统
2.1 learning_tf_broadcaster.cpp
/*!
* tf 坐标系的广播
*/
#include <ros/ros.h>
#include <tf/transform_broadcaster.h>
#include <turtlesim/Pose.h>
std::string turtle_name;
void callback(const turtlesim::PoseConstPtr &msg)
{
// 创建一个广播器
static tf::TransformBroadcaster tf_broad;
// 初始化tf数据
tf::Transform transform_tmep;
transform_tmep.setOrigin(tf::Vector3(msg->x,msg->y,0));
tf::Quaternion q;
q.setRPY(0,0,msg->theta);
transform_tmep.setRotation(q);
//ROS_ERROR("msg.x=%f",msg->x);
tf_broad.sendTransform(tf::StampedTransform(transform_tmep,ros::Time::now(),"world",turtle_name));
}
int main(int argc,char **argv)
{
ros::init(argc,argv,"learning_tf_broadcaster");
ros::NodeHandle n;
if (argc!=2)
{
ROS_ERROR("please input turtle name:");
return -1;
}
turtle_name=argv[1];
ros::Subscriber turtle_pos_sub=n.subscribe(turtle_name+"/pose", 10,&callback);
ros::spin();
return 0;
}
CmakeList.txt 配置
add_executable(learning_tf_broadcaster src/learning_tf_broadcaster.cpp)
target_link_libraries(learning_tf_broadcaster ${catkin_LIBRARIES})
2.2 learning_tf_listener
/*!
* 小海归2监听小海1,并跟踪小海归1
*/
#include <ros/ros.h>
#include <tf/transform_listener.h>
#include <geometry_msgs/Twist.h>
#include <turtlesim/Spawn.h>
int main(int argc,char **argv)
{
ros::init(argc,argv,"learning_tf_listener");
ros::NodeHandle n;
// 产生第二个海归
ros::service::waitForService("/spawn");//等待海归的服务端
// 创建一个客户端
ros::ServiceClient turtle_vel=n.serviceClient<turtlesim::Spawn>("/spawn");
turtlesim::Spawn ser;
turtle_vel.call(ser);
// 创建一个发布者 用来发布小海归的速度指令
ros::Publisher turtle_pub_vel=n.advertise<geometry_msgs::Twist>("/turtle2/cmd_vel",10);
// 创建一个tf树监听
tf::TransformListener listener_temp;
ros::Rate rate_loop(10);
while (n.ok())
{
tf::StampedTransform transform_temp;
try {
// ros::Time(0)指tf树中的最新转换对应的时间
// ros::Duration(3.0) 时间延迟
listener_temp.waitForTransform("turtle2","/turtle1",ros::Time(0),ros::Duration(3.0));
listener_temp.lookupTransform("turtle2","/turtle1",ros::Time(0),transform_temp);
}
catch (tf::TransformException &ex)
{
ROS_ERROR("%s",ex.what());
ros::Duration(1.0).sleep();
continue;
}
geometry_msgs::Twist vel_msg;
vel_msg.angular.z=4.0* atan2(transform_temp.getOrigin().y(),transform_temp.getOrigin().x());
vel_msg.linear.x=0.5* sqrt(pow(transform_temp.getOrigin().x(),2)
+ pow(transform_temp.getOrigin().y(),2));
turtle_pub_vel.publish(vel_msg);
rate_loop.sleep();
}
return 0;
}
CmakeList.txt 的配置
add_executable(learning_tf_listener src/learning_tf_listener.cpp)
target_link_libraries(learning_tf_listener ${catkin_LIBRARIES})
2.3 运行结果展示
实现小海龟跟随实验
//打开新终端
ctrl+alt+t
roscore
//打开另一个终端
ctrl+alt+t
//打开小海龟
rosrun turtlesim turtlesim_node
//打开另一个终端
ctrl+alt+t
rosrun learning_tf learning_tf_broadcaster turtle1
//打开另一个终端
ctrl+alt+t
rosrun learning_tf learning_tf_listener
3.launch文件的编写
##3 .1 launch文件
以上执行太多节点需要打开的终端也太多(繁琐),因此多个节点常采用launch文件执行
<launch>
<node pkg="turtlesim" name="turtle1" type="turtlesim_node">
</node>
<node pkg="turtlesim" name="turtle1_key" type="turtle_teleop_key">
</node>
<param name="turtle1_name" type="string" value="/turtle1"/>
<node pkg="learning_tf" type="learning_tf_broadcaster" args="turtle1" name="turtle1_tf_broadcaster" >
</node>
<node pkg="learning_tf" type="learning_tf_broadcaster" args="turtle2" name="turtle2_tf_broadcaster" />
<node pkg="learning_tf" type="learning_tf_listener" name="turtle1_turtle2">
</node>
</launch>
** 执行以下命令**
roslaunch learning_tf tf.launch
3.2 坐标系之间的关系
rosrun tf tf_echo turtle1 world
总结
ros学习代码记录
本文是学习古月ros入门21讲的学习记录!