ROS框架搭建及常用命令
ROS入门参考网站 cn/ROS/Tutorials - ROS Wiki
- ROS工作空间目录结构
workspace_folder/ -- WORKSPACE
src/ -- SOURCE SPACE
CMakeLists.txt -- The 'toplevel' CMake file
package_1/
CMakeLists.txt
package.xml
...
package_n/
CATKIN_IGNORE -- Optional empty file to exclude package_n from being processed
CMakeLists.txt
package.xml
...
build/ -- BUILD SPACE
CATKIN_IGNORE -- Keeps catkin from walking this directory
devel/ -- DEVELOPMENT SPACE (set by CATKIN_DEVEL_PREFIX)
bin/
etc/
include/
lib/
share/
.catkin
env.bash
setup.bash
setup.sh
...
install/ -- INSTALL SPACE (set by CMAKE_INSTALL_PREFIX)
bin/
etc/
include/
lib/
share/
.catkin
env.bash
setup.bash
setup.sh
...
catkin_create_pkg
含义:脚本来创建一个新的catkin软件包,用法说明
catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
举例子:
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
catkin_make
含义:构建软件包
举例子:
cd ~/catkin_ws && catkin_make
rospack
查看这些一级依赖包。
举例子:
rospack depends1 beginner_tutorials
查看间接依赖。
举例子:
rospack depends1 rospy
echo $ROS_PACKAGE_PATH
含义:环境变量包含那些保存有ROS软件包的路径
-
ROS常用指令
1 node list
含义:命令会列出这些活动的节点
rosout这个节点用于收集和记录节点的调试输出
2 rosrun
含义:可以让你用包名直接运行软件包内的节点(而不需要知道包的路径)。
举例子:
rosrun [package_name] [node_name]
rosnode ping my_turtle
3 rqt_graph
含义:用动态的图显示了系统中正在发生的事情
举例子:
rosrun rqt_graph rqt_graph
4 rostopic
rostopic echo [topic]
含义:可以显示在某个话题上发布的数据
举例子:rostopic echo /turtle1/cmd_vel
rostopic pub [topic] [msg_type] [args]
含义:可以把数据发布到当前某个正在广播的话题上;
举例子:rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
rostopic type
含义:用来查看所发布话题的消息类型。
举例子:rostopic type /turtle1/cmd_vel
5 rostopic list
含义:能够列出当前已被订阅和发布的所有话题。
6 rosmsg
rosmsg show Show message description
rosmsg list List all messages
rosmsg md5 Display message md5sum
rosmsg package List messages in a package
rosmsg packages List packages that contain messages
rosmsg show < message type >
含义:查看话题的消息类型的结构体
举例子:rosmsg show geometry_msgs/Twist
7 rqt_plot
含义:命令可以在滚动时间图上显示发布到某个话题上的数据
举例子:
rosrun rqt_plot rqt_plot
8 rosservice
含义:可以很容易地通过服务附加到ROS客户端/服务器框架上。
rosservice list 输出活跃服务的信息
rosservice call 用给定的参数调用服务
rosservice type 输出服务的类型
rosservice find 按服务的类型查找服务
rosservice uri 输出服务的ROSRPC uri
查看服务具有参数的情况。
rosservice type /spawn | rossrv show
触发/spawn服务
rosservice call /spawn 2 2 0.2 ""
9 rosparam
含义:能让我们在ROS参数服务器(Parameter Server)上存储和操作数据
rosparam set 设置参数
rosparam get 获取参数
rosparam load 从文件中加载参数
rosparam dump 向文件中转储参数
rosparam delete 删除参数
rosparam list 列出参数名
rosparam get /
含义:来显示参数服务器上的所有内容
10 source devel/setup.bash
含义:使软件包的环境变量生效
11 roslaunch
含义:可以用来启动定义在launch(启动)文件中的节点,launch文件为XML语法,描述命名空间、话题的输入和输出等要素信息。
roslaunch beginner_tutorials turtlemimic.launch
-
ROS消息和服务
msg(消息):msg文件就是文本文件,用于描述ROS消息的字段。它们用于为不同编程语言编写的消息生成源代码。
srv(服务):一个srv文件描述一个服务。它由两部分组成:请求(request)和响应(response)。
包含请求和响应,这两部分用一条---线隔开,下面是一个srv文件的示例。
int64 A
int64 B
---
int64 Sum
增加msg或者srv主要步骤:
打开package.xml, 确保它包含以下两行:
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
CMakeLists.txt文件中,修改find_package、catkin_package以及add_message_files、generate_messages,新增部分为标黄的。
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
catkin_package(
...
CATKIN_DEPENDS message_runtime ...
...)
#添加msg
add_message_files(
FILES
Num.msg
)
#添加srv
add_service_files(
FILES
AddTwoInts.srv
)
generate_messages(
DEPENDENCIES
std_msgs
)
roswtf
错误检查,可以在线检查、环境变量检查等。
-
ROS实现发布与订阅
ROS实现C++发布者:
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
int main(int argc, char **argv)
{
ros::init(argc, argv, "talker");
ros::NodeHandle n;
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
ros::Rate loop_rate(10);
while (ros::ok())
{
std_msgs::String msg;
std::stringstream ss;
ss << "hello world " << count;
msg.data = ss.str();
ROS_INFO("%s", msg.data.c_str());
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
++count;
}
return 0;
}
ROS实现C++订阅者:
#include "ros/ros.h"
#include "std_msgs/String.h"
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("I heard: [%s]", msg->data.c_str());
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "listener");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
ros::spin();
return 0;
}
-
ROS服务节点和客户端节点
ROS编写服务节点
#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"
bool add(beginner_tutorials::AddTwoInts::Request &req,
beginner_tutorials::AddTwoInts::Response &res)
{
res.sum = req.a + req.b;
ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
ROS_INFO("sending back response: [%ld]", (long int)res.sum);
return true;
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "add_two_ints_server");
ros::NodeHandle n;
ros::ServiceServer service = n.advertiseService("add_two_ints", add);
ROS_INFO("Ready to add two ints.");
ros::spin();
return 0;
}
ROS编写客户端节点
#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"
#include <cstdlib>
int main(int argc, char **argv)
{
ros::init(argc, argv, "add_two_ints_client");
if (argc != 3)
{
ROS_INFO("usage: add_two_ints_client X Y");
return 1;
}
ros::NodeHandle n;
ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");
beginner_tutorials::AddTwoInts srv;
srv.request.a = atoll(argv[1]);
srv.request.b = atoll(argv[2]);
if (client.call(srv))
{
ROS_INFO("Sum: %ld", (long int)srv.response.sum);
}
else
{
ROS_ERROR("Failed to call service add_two_ints");
return 1;
}
return 0;
}
虚拟机安装
Ubuntu虚拟机安装VMware Tools
- 挂载VMware Tools镜像:
- 在VMware的菜单栏中,点击“虚拟机”->“安装VMware Tools”。
- 系统会生成一个VMware Tools的虚拟光盘,并挂载到虚拟机中。通常,这个光盘会包含一个名为“VMwareTools-xxxx.tar.gz”的压缩文件。
- 复制并解压文件:
- 在虚拟机中,找到挂载的虚拟光盘(通常在桌面的“VMware Tools”图标下或者文件管理器中的“虚拟机光驱”下)。
- 将“VMwareTools-xxxx.tar.gz”文件复制到桌面或其他方便的位置。
- 使用文件管理器或终端命令解压该文件。例如,在终端中可以使用以下命令:tar -zxvf ~/Desktop/VMwareTools-xxxx.tar.gz -C ~/Desktop(将xxxx替换为实际的文件名)。
- 进入解压目录并安装:
- 解压完成后,会生成一个名为“vmware-tools-distrib”的文件夹。
- 使用终端进入该文件夹:cd ~/Desktop/vmware-tools-distrib(路径可能因解压位置而异)。
- 在该文件夹中,运行安装脚本:sudo ./vmware-install.pl。
- 根据脚本的提示,输入yes或回车以继续安装。直到出现“Enjoy, –the VMware team”字样,表示安装成功。