ROS学习快速索引

基础相关

创建工作空间(workspace)

ROS中整体代码是在工作空间中运行,因此我们需要先创建工作空间。假定我们的工作空间为test_ws,创建步骤如下:

  1. 创建文件夹test_ws/src,或者在某个路径下(自己想要创建工作空间的路径)输入:mkdir -p test_ws/src
  2. 进入src目录,打开终端输入catkin_init_workspace命令对新空间初始化,完成后在src文件夹下会出现CMakeList.txt文件;
  3. 终端返回test_ws目录(可以在第2步的前提下输入cd ..),在该终端下输入catkin_make对工作空间进行编译,完成后会在test_ws中出现build和devel文件。

创建成功!在test_ws中:

  • bulid:是编译的中间文件;
  • devel:(developing缩写)是最终的一个目标文件(可执行文件、脚本等);
  • src:源代码存放位置;
    src/package1/include:存放库文件(*.hpp,*.cpp,*.h,*.c)
    src/package1/action:存放动作(*.action)文件;
    src/package1/msg:存放消息(*.msg)
    src/package1/srv:存放服务器相关信息文件(*.srv)
    src/package1/launch:存放启动文件(*.launch)
    src/package1/scripts:存放python文件(*.py)
    src/package1/src:存放package的源文件(*.cpp,*.c)
    src/package1/CMakeList.txt:catkin_make文件
    src/package1/package.xml:package的描述文件

创建ROS package

ROS中的包,需要存放在src文件夹下,假设包名为pack_test,则创建步骤为:

  1. 进入test_ws/src文件夹下,打开终端;
  2. 输入catkin_create_pkg pack_test std_msgs roscpp创建包pack_test,其依赖为std_msgs和roscpp(ROS标准消息类型和C++编译环境);

命令结构为:catkin_create_pkg [package_name] [depend1] [depend2] [depend3]

关于ROS package的一些命令:

  • rospack profile:查看新添加包的信息;
  • rospack find [package_name]:查找指定包的位置;
  • rospack depends [package_name]:查看指定包的依赖;

消息传输机制

ROS的消息传输机制可以分为Message、Action和Server

Publisher & Subcriber(Message)

Message通信双方是Publisher和Subcriber,以下是C++程序示例:
Publisher:在pack_test包中的src文件下,创建Publisher.cpp文件,测试内容如下:

#include <ros/ros.h> // ros头文件
#include <std_msgs/String.h> // 消息头文件
#include <sstream> // stl字符串头文件
int main(int argc, char **argv)
{
    // ROS初始化,名称为Publisher
    ros::init(argc, argv, "Publisher"); 
    // 创建节点句柄
    ros::NodeHandle n; 
    // 创建消息发布变量,消息类型为std_msgs::String,名称为message,缓存1000字节
    ros::Publisher pub = n.advertise<std_msgs::String>("message", 1000);
    // 创建发布频率变量,频率为10Hz
    ros::Rate loop_rate(10);
    // 如果ROS出于开启状态,则保持循环
    while (ros::ok()){
    //ros::ok()返回false,代表可能发生了以下事件
		//1.SIGINT被触发(Ctrl-C)调用了ros::shutdown()
		//2.被另一同名节点踢出 ROS 网络
		//3.ros::shutdown()被程序的另一部分调用
		//4.节点中的所有ros::NodeHandles 都已经被销
     // 创建消息变量并,输入信息: I am the publish node 
        std_msgs::String msg;
        std::stringstream ss;
        ss << " I am the publish node ";
        msg.data = ss.str();
        // 发布消息
        pub.publish(msg);
        // 启动ROS消息回调处理函数
        ros::spinOnce();
        // 等待
        loop_rate.sleep();
    }
    return 0;
}

Subcriber:在pack_test包中的src文件下,创建Subcriber.cpp文件,测试内容为:

#include <ros/ros.h>
#include <std_msgs/String.h>
// 消息回调处理函数
void Callback(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, "Subscriber");
    ros::NodeHandle n;
    // 创建消息订阅变量,消息名称为message,缓存1000字节,回调函数为CallBack
    ros::Subscriber sub = n.subscribe("message", 1000, Callback);
    // 启动ROS消息回调处理函数
    ros::spin();
    return 0;
}

之后,我们要在pack_test/CMakeList.txt中(最下面)添加如下内容:

# 添加路径搜索目录
include_directories(
include
${catkin_INCLUDE_DIRS}
)
# 添加节点的可执行文件
add_executable(subscirber_node src/Subscriber_node.cpp)
add_executable(publisher_node   src/Publisher_node.cpp)

# 添加节点可指定文件作需要链接的库文件
target_link_libraries(subscriber_node ${catkin_LIBRARIES})
target_link_libraries(publisher_node   ${catkin_LIBRARIES})

最后,在test_ws中输入catkin_make,编译成功后,分别在test_ws中打开三个终端运行:

  1. roscore
  2. rosrun pack_test publisher_node
  3. rosrun pack_test subcriber_node

如果出现某个终端找不到pack_test,就在该终端输入source devel/setup.bash

Publisher & Subcriber(Message Python版本)

ROS中可以使用Python作为编程语言,其好处是不用编译,不用写CMakeLists.txt(只需要在CMakeList.txt中find_package内添加rospy,然后重新对包进行编译,以获得对python的支持),获得脚本语言快速的编写能力。我们将python脚本放入test_ws/src/pack_test/scripts,下面则是python对以上两个节点进行重写:
Publisher.py

#!/usr/bin/env python
# 添加ros函数库
import rospy
# 添加std_msgs中String类型
from std_msgs.msg import String
# 初始化节点
rospy.init_node('publisher_node')
# 初始化发布者,话题名称messaage,类型String,缓存1000字节
pub = rospy.Publisher('message', String, queue_size = 1000)
# 发布频率10Hz
rate = rospy.Rate(10)
# 定义发布的信息
msg = String()
msg = ' I am the talker node '
# 循环发布
while not rospy.is_shutdown():
	pub.publish(msg)
	rate.sleep()

subscriber.py

#!/usr/bin/env python
import rospy
from std_msgs.msg import String
# 话题回调函数
def CallBack(msg):
	rospy.info('I heard %s"', msg.data)

rospy.init_node('subscriber_node')
# 初始化订阅者,订阅话题为message,类型String,回调函数CallBack
sub = rospy.Subscriber('message', String, CallBack)
rospy.spin()

最后,我们在三个终端中依次运行:

  1. roscore
  2. rosrun pack_test publisher.py
  3. rosrun pack_test subscriber.py

launch文件初探

在终端中运行任何一个节点,我们都需要添加roscore的额外终端,不是很方便。ROS中提供了roslaunch命令,目的是实现同一个终端运行多个节点的目的,此命令会自动运行roscore节点,具体步骤为:

  1. 在包(比如pack_test)中新建launch文件夹,并在其中创建node.launch文件(文件名自拟)。
  2. 在node.launch中添加以下内容:
<?xml version="1.0"  encoding="UTF-8" standalone="no"?>
<launch>
    <!-- Subscriber node, 节点名称,包名,节点。output=“screen“将输出打印到终端,如果是python的话,要在type中输入python脚本名称 -->
    <node name="subscirber_node" pkg="test" type="subscriber_node" output="screen"/>
    <!-- Publisher node -->
    <node name="publisher_node" pkg="test" type="publisher_node"/>
</launch>
  1. 在test_ws中新建终端运行roslaunch pack_test node.launch

通过在新的终端中键入rosnode list可以查看当前运行的节点,rostopic list可查看已发布消息的名称。

自定义message

test_ws/src/pack_test/msg中新建Pose.msg文件,写入如下内容

float64 x
float64 y
float64 z

std_msgs文件中的变量类型与C++中的变量类型有如下的对应关系:

msg typec++msg typeC++
boolboolint64long long
int8charunit64unsigned long
int8unsigned charfloat32float
int16shortfloat64double
uint16unsigned shortstringstd::string
int32inttimeros::Time
uint32unsigned intdurationros::Duration

此外msg还可以使用其他包中的消息类型,比如senor_msgs中的Image.msg等等,或者用户自定义的消息类型,此时需要在generate_message中添加对这些包的依赖,并且在去掉add_dependencies注释。
注意:如果当前包中使用了其他包中所定义的消息,服务和动作类型,需要添加add_dependencies项。
比如,在以上我们的自定消息Pose.msg文件,我们需要修改CMakeList.txt文件:

  1. 在find_package中加入message_generation的依赖;
  2. 在add_message_files中添加Pose.msg
  3. generate_messages中添加自定义消息的依赖

比如:

find_package(catkin REQUIRED COMPONENTS
std_msgs
roscpp
rospy
...
message_generation
)

add_message_files(
FILES
Pose.msg
)

generate_messages(
DEPENDENCIES
std_msgs
)

修改package.xml文件,去掉注释:

<!--   <build_depend>message_generation</build_depend> -->
<!--   <exec_depend>message_runtime</exec_depend> -->
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值