ROS学习入门

说明:

  • 学习视频:古月居 ROS入门21讲

  • 代码:https://github.com/huchunxu/ros_21_tutorials

    文章目录

    • ROS学习入门
      • 1. ROS常用命令
      • 2.工作空间
        • 1.创建工作空间
        • 2.创建功能包
        • 3.配置环境变量
      • 3.示例
        • 1.发布者示例
        • 2.发布者示例
      • 4.自定义话题消息与使用
        • 1.编写msg文件
        • 2.编写测试文件
        • 3.编译运行
      • 5.示例
        • 1.客户端示例
        • 2.服务端示例
      • 6.自定义服务数据与使用
        • 1.编写srv文件
        • 2.编写测试文件
        • 3.编译运行
      • 7.参数使用示例
      • 8.TF坐标变换
        • 1.TF变换演示
        • 2.TF示例
      • 9.launch文件使用
        • 1.基本语法
        • 2.示例

1. ROS常用命令

(1)rosnode 显示当前 节点 信息

rosnode list                    #获得运行节点列表
rosnode info [node-name]        #获得特定节点的信息
rosnode ping  [node-name]       #测试节点是否连通
rosnode kill [node-name]        #终止节点

(2)**rospack ** 获取 软件包 的有关信息

rospack find                          #显示软件包的目录
rospack list                 #显示出当前的包信息
rospack depends1 [package_name]      #显示当前包的一级依赖
rospack depends [package_name]      #显示当前包的所有依赖

(3)rostopic 获取 话题 的有关信息

rostopic bw            #显示主题使用的带宽
rostopic delay         #从标题中的时间戳显示主题的延迟
rostopic echo          #将消息打印到屏幕
rostopic find          #按类型查找主题
rostopic hz            #显示主题的发布率
rostopic info          #打印有关活动主题的信息
rostopic list          #列出活动主题
rostopic pub           #将数据发布到主题
rostopic type          #打印主题或字段类型

(4)rosmsg 获取 消息 的有关信息

rosmsg show
rosmsg info
rosmsg list

(5)rosbag 运行 录制

rosbag record -a -o [file_name]      #将运行过程录制到文件中
rosbag play [file_name]              #回放bag文件
rosbag info [file_name]              #查看bag包内容

(6)rosservice 获取 服务 的有关消息

rosservice type
rosservice info
rosservice list

(7)rosparam 获取 参数 的有关消息

rosparam list                                   #列出当前的参数
rosparam get [param_key]                        #显示某个参数值
rosparam set [param_key] [param_value]          #设置某个参数值
rosparam dump [file_name]                       #保存到参数文件
rosparam load [file_name]                       #从文件中读取参数
rosparam delete [param_key]                     #删除参数

(8)显示 节点图

rqt_graph

(9)运行程序

rosrun

(10)运行launch文件

roslaunch

(11)启动 rqt_logger_level 图形化工具

rosrun rqt_logger_level rqt_logger_level

(12)启动 rqt_console图形化工具

rqt_console

(13)启动 rqt_top图形化工具

rosrun rqt_top rqt_top

(14)启动 rqt_topic图形化工具

rosrun rqt_topic rqt_topic

(15)启动 可视化监视器

rosrun rqt_runtime_monitor rqt_runtime_monitor

(16)启动 图形查看器

rosrun rqt_image_view rqt_image_view

(17)启动 rqt_bag图形化工具

rqt_bag

(18)启动 rqt_gui图形化工具

rosrun rqt_gui rqt_gui

(19)分析包的潜在问题

roswtf

(20)查看 ROS_PACKAGE_PATH环境变量

echo $ROS_PACKAGE_PATH

2.工作空间

工作空间是一个存放工程开发相关文件的文件夹

  • src:代码空间;存放功能包的源码
  • build:编译空间;存放编译过程中的中间文件
  • devel:开发空间;存放开发过程中的可执行文件和库
  • install:安装空间;存放最终生成的可执行文件

1.创建工作空间

mkdir -p /catkin_ws/src
cd catkin_ws
catkin_make            #产生build、devel空间
catkin_make install    #产生install空间

2.创建功能包

# catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
cd src
catkin_create_pkg test_pkg roscpp rospy std_msgs
# cd ..
# catkin_make          #可以进行编译

3.配置环境变量

source devel/setup.bash     #仅对当前终端有效
vim ./bashrc
source ~/catkin_ws/devel/setup.bash   #在文件最后添加

3.示例

发布者和订阅者示例

1.发布者示例

cd ~/catkin_ws/src
catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim         # 创建功能包
cd learning_topin/src
vim velocity_publisher.cpp      #创建一个.cpp文件
/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************//*** 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist*/#include <ros/ros.h>
#include <geometry_msgs/Twist.h>int main(int argc, char **argv)
{// ROS节点初始化ros::init(argc, argv, "velocity_publisher");// 创建节点句柄ros::NodeHandle n;// 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);// 设置循环的频率ros::Rate loop_rate(10);int count = 0;while (ros::ok()){// 初始化geometry_msgs::Twist类型的消息geometry_msgs::Twist vel_msg;vel_msg.linear.x = 0.5;vel_msg.angular.z = 0.2;// 发布消息turtle_vel_pub.publish(vel_msg);ROS_INFO("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]", vel_msg.linear.x, vel_msg.angular.z);// 按照循环频率延时loop_rate.sleep();}return 0;
}
cd ..     # ~/catkin_ws/src/learning_topic
vim CMakeLists.txt           #打开CMakeLists.txt,新增两句
add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})
cd ~/catkin_ws               #切换到工作空间
catkin_make                  #编译

接下来进行运行

1. roscore
2. rosrun turtlesim turtlesim_node
3. rosrun learning_topic velocity_publisher

2.发布者示例

cd learning_topin/src
vim pose_subscriber.cpp      #创建一个.cpp文件
/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************//*** 该例程将订阅/turtle1/pose话题,消息类型turtlesim::Pose*/#include <ros/ros.h>
#include "turtlesim/Pose.h"// 接收到订阅的消息后,会进入消息回调函数
void poseCallback(const turtlesim::Pose::ConstPtr& msg)
{// 将接收到的消息打印出来ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f", msg->x, msg->y);
}int main(int argc, char **argv)
{// 初始化ROS节点ros::init(argc, argv, "pose_subscriber");// 创建节点句柄ros::NodeHandle n;// 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallbackros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, poseCallback);// 循环等待回调函数ros::spin();return 0;
}
cd ..     # ~/catkin_ws/src/learning_topic
vim CMakeLists.txt           #打开CMakeLists.txt,新增两句
add_executable(pose_subscriber src/pose_subscriber.cpp)
target_link_libraries(pose_subscriber ${catkin_LIBRARIES})
cd ~/catkin_ws               #切换到工作空间
catkin_make                  #编译

接下来进行运行

1. roscore
2. rosrun turtlesim turtlesim_node
3. rosrun learning_topic pose_subscriber

4.自定义话题消息与使用

1.编写msg文件

cd ~/catkin_ws/src/learning_topic
mkdir msg
cd msg
vim Persion.msg     #创建.msg文件
string name
uint8  age
uint8  sexuint8 unknown = 0
uint8 male    = 1
uint8 female  = 2

在.xml文件中添加(固定配置)

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

CMakeList.txt文件中添加

find_package(... message_generation)add_message_files(FILES Person.msg)
generate_messages(DEPENDENCIES std_msgs)catkin_package(... message_runtime)

2.编写测试文件

cd ~/catkin_ws/src/learning_topic/src
vim person_publisher.cpp
/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************//*** 该例程将发布/person_info话题,自定义消息类型learning_topic::Person*/#include <ros/ros.h>
#include "learning_topic/Person.h"int main(int argc, char **argv)
{// ROS节点初始化ros::init(argc, argv, "person_publisher");// 创建节点句柄ros::NodeHandle n;// 创建一个Publisher,发布名为/person_info的topic,消息类型为learning_topic::Person,队列长度10ros::Publisher person_info_pub = n.advertise<learning_topic::Person>("/person_info", 10);// 设置循环的频率ros::Rate loop_rate(1);int count = 0;while (ros::ok()){// 初始化learning_topic::Person类型的消息learning_topic::Person person_msg;person_msg.name = "Tom";person_msg.age  = 18;person_msg.sex  = learning_topic::Person::male;// 发布消息person_info_pub.publish(person_msg);ROS_INFO("Publish Person Info: name:%s  age:%d  sex:%d", person_msg.name.c_str(), person_msg.age, person_msg.sex);// 按照循环频率延时loop_rate.sleep();}return 0;
}

vim person_subscriber.cpp
/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************//*** 该例程将订阅/person_info话题,自定义消息类型learning_topic::Person*/#include <ros/ros.h>
#include "learning_topic/Person.h"// 接收到订阅的消息后,会进入消息回调函数
void personInfoCallback(const learning_topic::Person::ConstPtr& msg)
{// 将接收到的消息打印出来ROS_INFO("Subcribe Person Info: name:%s  age:%d  sex:%d", msg->name.c_str(), msg->age, msg->sex);
}int main(int argc, char **argv)
{// 初始化ROS节点ros::init(argc, argv, "person_subscriber");// 创建节点句柄ros::NodeHandle n;// 创建一个Subscriber,订阅名为/person_info的topic,注册回调函数personInfoCallbackros::Subscriber person_info_sub = n.subscribe("/person_info", 10, personInfoCallback);// 循环等待回调函数ros::spin();return 0;
}

cd ..
vim CMakeLists.txt          #添加以下
add_executable(person_publisher src/person_publisher.cpp)
target_link_libraries(person_publisher ${catkin_LIBRARIES})
add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp)add_executable(person_subscriber src/person_subscriber.cpp)
target_link_libraries(person_subscriber ${catkin_LIBRARIES})
add_dependencies(person_subscriber ${PROJECT_NAME}_generate_messages_cpp)

3.编译运行

cd ~/catkin_ws
catkin_make
1.roscore
2.rosrun learning_topic person_subscriber
3.rosrun learning_topic person_publisher

5.示例

客户端与服务端示例

1.客户端示例

cd ~/catkin_ws/src
catkin_create_pkg learning_service roscpp rospy std_msgs geometry_msgs turtlesim          #创建包
cd learning_service/src
vim turtle_spawn.cpp       #创建C++文件
/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************//*** 该例程将请求/spawn服务,服务数据类型turtlesim::Spawn*/#include <ros/ros.h>
#include <turtlesim/Spawn.h>int main(int argc, char** argv)
{// 初始化ROS节点ros::init(argc, argv, "turtle_spawn");// 创建节点句柄ros::NodeHandle node;// 发现/spawn服务后,创建一个服务客户端,连接名为/spawn的serviceros::service::waitForService("/spawn");ros::ServiceClient add_turtle = node.serviceClient<turtlesim::Spawn>("/spawn");// 初始化turtlesim::Spawn的请求数据turtlesim::Spawn srv;srv.request.x = 2.0;srv.request.y = 2.0;srv.request.name = "turtle2";// 请求服务调用ROS_INFO("Call service to spwan turtle[x:%0.6f, y:%0.6f, name:%s]", srv.request.x, srv.request.y, srv.request.name.c_str());add_turtle.call(srv);// 显示服务调用结果ROS_INFO("Spwan turtle successfully [name:%s]", srv.response.name.c_str());return 0;
};
cd ..
vim CMakeLists.txt   #修改CMakeLists.txt文件(添加)
add_executable(turtle_spawn src/turtle_spawn.cpp)
target_link_libraries(turtle_spawn ${catkin_LIBRARIES})

编译与运行

cd ~/catkin_ws
catkin_make
1.roscore
2.rosrun turtlesim turtlesim_node
3.rosrun learning_service turtle_spawn

2.服务端示例

cd ~/catkin_ws/src/learning_service/src
vim turtle_command_server.cpp
/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************//*** 该例程将执行/turtle_command服务,服务数据类型std_srvs/Trigger*/#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
#include <std_srvs/Trigger.h>ros::Publisher turtle_vel_pub;
bool pubCommand = false;// service回调函数,输入参数req,输出参数res
bool commandCallback(std_srvs::Trigger::Request  &req,std_srvs::Trigger::Response &res)
{pubCommand = !pubCommand;// 显示请求数据ROS_INFO("Publish turtle velocity command [%s]", pubCommand==true?"Yes":"No");// 设置反馈数据res.success = true;res.message = "Change turtle command state!";return true;
}int main(int argc, char **argv)
{// ROS节点初始化ros::init(argc, argv, "turtle_command_server");// 创建节点句柄ros::NodeHandle n;// 创建一个名为/turtle_command的server,注册回调函数commandCallbackros::ServiceServer command_service = n.advertiseService("/turtle_command", commandCallback);// 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);// 循环等待回调函数ROS_INFO("Ready to receive turtle command.");// 设置循环的频率ros::Rate loop_rate(10);while(ros::ok()){// 查看一次回调函数队列ros::spinOnce();// 如果标志为true,则发布速度指令if(pubCommand){geometry_msgs::Twist vel_msg;vel_msg.linear.x = 0.5;vel_msg.angular.z = 0.2;turtle_vel_pub.publish(vel_msg);}//按照循环频率延时loop_rate.sleep();}return 0;
}
cd ..
vim CMakeLists.txt           #修改CMakeLists.txt文件(添加)
add_executable(turtle_command_server src/turtle_command_server.cpp)
target_link_libraries(turtle_command_server ${catkin_LIBRARIES})

编译运行

cd ~/catkin_ws
catkin_make
1.roscore
2.rosrun turtlesim turtlesim_node
3.rosrun learning_service turtle_command_server
4.rosservice call /turtle_command "{}"

6.自定义服务数据与使用

1.编写srv文件

cd ~/catkin_ws/src/learning_service
mkdir srv
cd srv
vim Person.srv
string name
uint8  age
uint8  sexuint8 unknown = 0
uint8 male    = 1
uint8 female  = 2---
string result

修改package.xml文件(添加)

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

修改CMakeLists.txt文件(添加)

find_package(... message_generation)add_message_files(FILES Person.srv)
generate_messages(DEPENDENCIES std_msgs)catkin_package(... message_runtime)

2.编写测试文件

cd ~/catkin_ws/src/learning_service/src
vim person_server.cpp
/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************//*** 该例程将执行/show_person服务,服务数据类型learning_service::Person*/#include <ros/ros.h>
#include "learning_service/Person.h"// service回调函数,输入参数req,输出参数res
bool personCallback(learning_service::Person::Request  &req,learning_service::Person::Response &res)
{// 显示请求数据ROS_INFO("Person: name:%s  age:%d  sex:%d", req.name.c_str(), req.age, req.sex);// 设置反馈数据res.result = "OK";return true;
}int main(int argc, char **argv)
{// ROS节点初始化ros::init(argc, argv, "person_server");// 创建节点句柄ros::NodeHandle n;// 创建一个名为/show_person的server,注册回调函数personCallbackros::ServiceServer person_service = n.advertiseService("/show_person", personCallback);// 循环等待回调函数ROS_INFO("Ready to show person informtion.");ros::spin();return 0;
}
vim person_client.cpp
/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************//*** 该例程将请求/show_person服务,服务数据类型learning_service::Person*/#include <ros/ros.h>
#include "learning_service/Person.h"int main(int argc, char** argv)
{// 初始化ROS节点ros::init(argc, argv, "person_client");// 创建节点句柄ros::NodeHandle node;// 发现/spawn服务后,创建一个服务客户端,连接名为/spawn的serviceros::service::waitForService("/show_person");ros::ServiceClient person_client = node.serviceClient<learning_service::Person>("/show_person");// 初始化learning_service::Person的请求数据learning_service::Person srv;srv.request.name = "Tom";srv.request.age  = 20;srv.request.sex  = learning_service::Person::Request::male;// 请求服务调用ROS_INFO("Call service to show person[name:%s, age:%d, sex:%d]", srv.request.name.c_str(), srv.request.age, srv.request.sex);person_client.call(srv);// 显示服务调用结果ROS_INFO("Show person result : %s", srv.response.result.c_str());return 0;
};
cd ..
vim CMakeLists.txt        #添加
add_executable(person_server src/person_server.cpp)
target_link_libraries(person_server ${catkin_LIBRARIES})
add_dependencies(person_server ${PROJECT_NAME}_gencpp)add_executable(person_client src/person_client.cpp)
target_link_libraries(person_client ${catkin_LIBRARIES})
add_dependencies(person_client ${PROJECT_NAME}_gencpp)

3.编译运行

cd ~/catkin_ws
catkin_make
1.roscore
2.rosrun learning_service person_server
2.rosrun learning_service person_client

7.参数使用示例

cd ~/catkin_ws/src
catkin_create_pkg learning_parameter roscpp rospy std_srvs
cd learning_parameter/src
vim parameter_config.cpp
/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************//*** 该例程设置/读取海龟例程中的参数*/
#include <string>
#include <ros/ros.h>
#include <std_srvs/Empty.h>int main(int argc, char **argv)
{int red, green, blue;// ROS节点初始化ros::init(argc, argv, "parameter_config");// 创建节点句柄ros::NodeHandle node;// 读取背景颜色参数ros::param::get("/background_r", red);ros::param::get("/background_g", green);ros::param::get("/background_b", blue);ROS_INFO("Get Backgroud Color[%d, %d, %d]", red, green, blue);// 设置背景颜色参数ros::param::set("/background_r", 255);ros::param::set("/background_g", 255);ros::param::set("/background_b", 255);ROS_INFO("Set Backgroud Color[255, 255, 255]");// 读取背景颜色参数ros::param::get("/background_r", red);ros::param::get("/background_g", green);ros::param::get("/background_b", blue);ROS_INFO("Re-get Backgroud Color[%d, %d, %d]", red, green, blue);// 调用服务,刷新背景颜色ros::service::waitForService("/clear");ros::ServiceClient clear_background = node.serviceClient<std_srvs::Empty>("/clear");std_srvs::Empty srv;clear_background.call(srv);sleep(1);return 0;
}
cd ..
vim CMakeLists.txt
add_executable(parameter_config src/parameter_config.cpp)
target_link_libraries(parameter_config ${catkin_LIBRARIES})
cd ~/catkin_ws
catkin_make

运行

1.roscore
2.rosrun turtlesim turlesim_node
3.rosrun learrning_parameter parameter_config

8.TF坐标变换

1.TF变换演示

sudo apt-get install ros-melodic-turtle-tf    #安装功能包
1.roscore
2.roslanunch turtle_tf turtle_tf_demo.launch
3.rosrun turtlesim turtle_teleop_key
4.rosrun tf view_frames                       #保存坐标变换文件
5.rosrun tf tf_echo turtle1 turtle2           #终端显示坐标变换

2.TF示例

cd ~/catkin_ws/src
catkin_create_pkg learning_tf roscpp rospy tf turtlesim
cd learning_tf/src
vim turtle_tf_broadcaster.cpp
/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************//*** 该例程产生tf数据,并计算、发布turtle2的速度指令*/#include <ros/ros.h>
#include <tf/transform_broadcaster.h>
#include <turtlesim/Pose.h>std::string turtle_name;void poseCallback(const turtlesim::PoseConstPtr& msg)
{// 创建tf的广播器static tf::TransformBroadcaster br;// 初始化tf数据tf::Transform transform;transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0) );tf::Quaternion q;q.setRPY(0, 0, msg->theta);transform.setRotation(q);// 广播world与海龟坐标系之间的tf数据br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", turtle_name));
}int main(int argc, char** argv)
{// 初始化ROS节点ros::init(argc, argv, "my_tf_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;
};
vim turtle_tf_listener.cpp
/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************//*** 该例程监听tf数据,并计算、发布turtle2的速度指令*/#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节点ros::init(argc, argv, "my_tf_listener");// 创建节点句柄ros::NodeHandle node;// 请求产生turtle2ros::service::waitForService("/spawn");ros::ServiceClient add_turtle = node.serviceClient<turtlesim::Spawn>("/spawn");turtlesim::Spawn srv;add_turtle.call(srv);// 创建发布turtle2速度控制指令的发布者ros::Publisher turtle_vel = node.advertise<geometry_msgs::Twist>("/turtle2/cmd_vel", 10);// 创建tf的监听器tf::TransformListener listener;ros::Rate rate(10.0);while (node.ok()){// 获取turtle1与turtle2坐标系之间的tf数据tf::StampedTransform transform;try{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的速度控制指令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;
};
cd ..
vim CMakeLists.txt
add_executable(turtle_tf_broadcaster src/turtle_tf_broadcaster.cpp)
target_link_libraries(turtle_tf_broadcaster ${catkin_LIBRARIES})add_executable(turtle_tf_listener src/turtle_tf_listener.cpp)
target_link_libraries(turtle_tf_listener ${catkin_LIBRARIES})

编译运行

cd ~/catkin_ws
catkin_make
1.roscore
2.rosrun turtlesim turtlesim_node
3.rosrun learning_tf turtle_tf_broadcaster __name:=turtle1_tf_broadcaster /turtle1     #运行turtle1坐标广播
4.rosrun learning_tf turtle_tf_broadcaster __name:=turtle2_tf_broadcaster /turtlr2     #运行turtle2坐标广播
5.rosrun learning_tf turtle_tf_listener          #运行监听,创建turtle2,发送坐标给turtle2(控制运动)
6.rosrun turtlesim turtle_teleop_key             #键盘监听

9.launch文件使用

1.基本语法

1.launch文件格式

<launch>...</launch>

2.node 节点

<node pkg="package_name" type="executable_name" name="node_name" />
node是要启动的ROS节点,参数:pkg=“mypackage” :节点的功能包名称type="nodetype" : 节点的可执行文件名称name="nodename" :运行时的节点名字,它将覆盖任何通过调用ros::init来赋予节点的名称args="arg1 arg2 arg3" (可选):传递给节点的参数respawn="true" (可选) :如果节点停止,自动重启节点ns="foo" (可选):在"foo"命名空间启动节点output="log | screen"  (可选) :如果选择screen,节点的stdout(标准输出)和stderr(标准错误)信息将显示在终端窗口上;如果选择log,stdout和stderr将发送一个log文件,stderr也会显示在终端窗口上

3.include

<include file="$(dirname)/other.launch" />
include可以在当前launch文件中调用另一个launch文件,这样有利于代码的复用,减少开发工作量。

4.remap

<remap from="/turtlebot/cmd_vel" to="/cmd_vel" />
remap可以将一个参数名映射为另一个名字,参数:from="original-name"to="new-name"

5.arg

<arg name="arg_name" default="arg_value">
arg用来定义一个局部参数,该参数只能在一个launch文件中使用。有三种使用方法:
<arg name="foo"/> :声明一个参数foo,后面需要给它赋值
<arg name="foo" default="1"/> :声明一个参数foo,它有一个默认值,该值可以被修改。
<arg name="foo" value="bar"/> :声明一个常量foo,它的值不能被修改。

6.param

<param name="output_filename" value="odom" />
param用来定义一个设置在Parameter Server(参数服务器)的参数,它可以添加到node中。param包括以下几个参数:name="namespace/name":参数的名字value="value"(可选):定义参数的值,如果省略这个参数,则应该指定一个文件(binfile/texfile)或命令type="str|int|double|boot"(可选):指定参数的类型texfile="$(find pkg-name)/path/file" (可选)binfile="$(find pkg-name)/path/file" (可选)commadn="(find pkg-name)/exe '$(find pkg-name)/arg.txt'" (可选):exe是可执行文件( .py或 .cpp),arg.txt是参数文件

7.rosparam

<rosparam file="params.yaml" command="load" ns="params" />
可以使用.yaml文件load/dump/delete参数。delete和dump命令在load命令之前,load命令可以覆盖以前设置的参数。rosparam也可以添加到node中使用。rosparam包括以下几个参数:command="load|dump|delete"(默认时load)file="$(find pkg-name)/path/foo.yaml"(load或者dump命令):yaml文件的名字param="param-name":参数的名字

2.示例

cd ~/catkin_ws/src
catkin_create_pkg learning_launch
cd learning_launch
mkdir launch
cd launch
vim simple.launch
<launch><node pkg="learning_topic" type="person_subscriber" name="talker" output="screen" /><node pkg="learning_topic" type="person_publisher" name="listener" output="screen" />
</launch>

vim start_tf_demo_c++.launch
 <launch><!-- Turtlesim Node--><node pkg="turtlesim" type="turtlesim_node" name="sim"/><node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen"/><node pkg="learning_tf" type="turtle_tf_broadcaster" args="/turtle1" name="turtle1_tf_broadcaster" /><node pkg="learning_tf" type="turtle_tf_broadcaster" args="/turtle2" name="turtle2_tf_broadcaster" /><node pkg="learning_tf" type="turtle_tf_listener" name="listener" /></launch>

vim start_tf_demo_py.launch        #编写的是py文件,注意噢!
<launch><!-- Turtlesim Node--><node pkg="turtlesim" type="turtlesim_node" name="sim"/><node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen"/><node name="turtle1_tf_broadcaster" pkg="learning_tf" type="turtle_tf_broadcaster.py"><param name="turtle" type="string" value="turtle1" /></node><node name="turtle2_tf_broadcaster" pkg="learning_tf" type="turtle_tf_broadcaster.py"><param name="turtle" type="string" value="turtle2" /> </node><node pkg="learning_tf" type="turtle_tf_listener.py" name="listener" /></launch>

vim turtlesim_parameter_config.launch
<launch><param name="/turtle_number"   value="2"/><node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node"><param name="turtle_name1"   value="Tom"/><param name="turtle_name2"   value="Jerry"/><rosparam file="$(find learning_launch)/config/param.yaml" command="load"/></node><node pkg="turtlesim" type="turtle_teleop_key" name="turtle_teleop_key" output="screen"/></launch>
cd ..
mkdir config
cd config
vim param.yaml
A: 123
B: "hello"group:C: 456D: "hello"

cd ../launch
vim turtlesim_remap.launch
<launch><include file="$(find learning_launch)/launch/simple.launch" /><node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node"><remap from="/turtle1/cmd_vel" to="/cmd_vel"/></node></launch>

运行

roslaunch learning_launch simple.launch
roslaunch learning_launch start_tf_demo_c++.launch
roslaunch learning_launch start_tf_demo_py.launch
roslaunch learning_launch turtlesim_parameter_config.launch
roslaunch learning_launch turtlesim_remap.launch

ROS入门、ROS完整教程相关推荐

  1. ROS入门保姆级教程:5-ROS计算图

    ROS入门往期: ROS入门保姆级教程:1-hello world初体验 ROS入门保姆级教程:2-VScode中使用ROS ROS入门保姆级教程:3-ROS文件系统 ROS入门保姆级教程:4-ROS ...

  2. python爬虫教程入门-零基础入门Python爬虫不知道怎么学?这是入门的完整教程

    原标题:零基础入门Python爬虫不知道怎么学?这是入门的完整教程 这是一个适用于小白的Python爬虫免费教学课程,只有7节,让零基础的你初步了解爬虫,跟着课程内容能自己爬取资源.看着文章,打开电脑 ...

  3. python零基础入门教程-零基础入门Python爬虫不知道怎么学?这是入门的完整教程...

    原标题:零基础入门Python爬虫不知道怎么学?这是入门的完整教程 这是一个适用于小白的Python爬虫免费教学课程,只有7节,让零基础的你初步了解爬虫,跟着课程内容能自己爬取资源.看着文章,打开电脑 ...

  4. ROS入门-ROS的安装及编写简单的节点talker和listener

    废话不多说,我们开始吧!!! 我使用的Ubuntu 18.04的系统,所以安装的是最新的ROS版本. 以下是ROS版本和Ubuntu系统版本的对照. 安装ROS 1 配置Ubuntu软件库 先配置Ub ...

  5. ros入门保姆级教程之召唤小乌龟

    (我所使用的版本是Ubuntu20.04,安装ros请参考链接https://blog.csdn.net/qq_46106285/article/details/120982412?spm=1001. ...

  6. 学完python基础开始学爬虫_零基础入门Python爬虫不知道怎么学?这是入门的完整教程...

    这是一个适用于小白的Python爬虫免费教学课程,只有7节,让零基础的你初步了解爬虫,跟着课程内容能自己爬取资源.看着文章,打开电脑动手实践,平均45分钟就能学完一节,如果你愿意,今天内你就可以迈入爬 ...

  7. 如何自学python爬虫-零基础入门Python爬虫不知道怎么学?这是入门的完整教程

    这是一个适用于小白的Python爬虫免费教学课程,只有7节,让零基础的你初步了解爬虫,跟着课程内容能自己爬取资源.看着文章,打开电脑动手实践,平均45分钟就能学完一节,如果你愿意,今天内你就可以迈入爬 ...

  8. 【ROS入门教程】---- 01 ROS介绍

    ROS,机器人系统的不二选择 文章目录 ROS,机器人系统的不二选择 ROS是什么 ROS的强大之处 ROS的学习方法 总结 ROS是什么 作为新世纪的孩子们,可能从出生以来,我们就伴随着机器人的飞速 ...

  9. ROS入门21讲 | ROS机器人入门教程 【简明笔记】

    古月·ROS入门21讲 | 一学就会的ROS机器人入门教程 文章目录 ROS核心概念 ROS命令行 工作空间与功能包 订阅与发布 发布者 Publisher 订阅者 Subscriber 话题消息的自 ...

最新文章

  1. asp.net core 实战之 redis 负载均衡和quot;高可用quot;实现
  2. dataframe 排序_疯狂Spark之DataFrame创建方式详解一(九)
  3. Java学习之「Spring + AspectJ 」
  4. MySQL: 查看一次SQL的执行时间都花在哪些环节上
  5. 基于STM32的电池管理系统触摸屏设计方案
  6. http请求转为https请求 java_如何将Javaweb工程的访问协议由http改为https及通过域名访问?...
  7. python创建配置文件_python3 如何创建一个.ini的配置文件。
  8. 如何在虚拟机安装windows server 2003
  9. 软件测试报告怎么编写?第三方性能报告范文模板来了
  10. 【C++】有趣的数字
  11. 如何在Windows 10上禁用登录屏幕的背景模糊
  12. 程序员生存定律--成长路上常见的坑(2)
  13. Fortify白盒神器20.1.1安装教程
  14. 跨平台第三方平台登录和单点登录
  15. 股票精灵接口的脚本策划
  16. 举个栗子!Tableau技巧(53):添加跳转按钮实现页面切换
  17. 博学谷php,博学谷web前端
  18. 2021西湖论剑wp
  19. Vue Vue项目里面使用的$refs与$ref是什么意思,有什么用?
  20. Isight unable to evaluate matlab commands的解决办法

热门文章

  1. Python3使用tomorrow异步
  2. Linux C/C++编程之(十三)系统IO函数
  3. 『WPF』TextBox元素过滤键盘输入
  4. 海思Hi3515开发板方案使用介绍
  5. python命令行窗口最大化_基于python的豆瓣FM(终端命令行界面)
  6. 从三个维度分析DeFi连环清算问题的解决方案 | 链捕手
  7. 2021年技术自媒体经验分享 —— 开始尝试认真做 CSDN 的一年后的复盘
  8. 各品牌手机音视频格式支持一览表收藏
  9. qda二次判别_R语言线性分类判别LDA和二次分类判别QDA实例
  10. NandFlash和iNand