ROS学习快速索引

基础相关

创建工作空间(workspace)
创建ROS package

消息传输机制

Publisher & Subcriber(Message)
Publisher & Subcriber(Message Python版本)
launch文件初探
自定义message

基础相关

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

创建文件夹test_ws/src,或者在某个路径下(自己想要创建工作空间的路径)输入:mkdir -p test_ws/src;
进入src目录,打开终端输入catkin_init_workspace命令对新空间初始化,完成后在src文件夹下会出现CMakeList.txt文件;
终端返回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,则创建步骤为:

进入test_ws/src文件夹下,打开终端;
输入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文件,测试内容如下:

%title插图%num

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

%title插图%num
*后,在test_ws中输入catkin_make,编译成功后,分别在test_ws中打开三个终端运行:

roscore
rosrun pack_test publisher_node
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对以上两个节点进行重写:

%title插图%num
*后,我们在三个终端中依次运行:

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

在包(比如pack_test)中新建launch文件夹,并在其中创建node.launch文件(文件名自拟)。
在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>

在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++中的变量类型有如下的对应关系:

%title插图%num

此外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中添加自定义消息的依赖

%title插图%num
去掉注释:

<!– <build_depend>message_generation</build_depend> –>
<!– <exec_depend>message_runtime</exec_depend> –>
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>