1、创建一个工作空间
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace
最后一行效果:在src下创建了一个CMakeLists.txt文件
2、创建一个包
$ cd ~/catkin_ws/src
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
效果:在src下创建一个名为beginner_tutorials的目录
并在这个目录下创建了两个文件 :package.xml文件和一个CMakeLists.txt文件和一个src子目录
其语法是catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
虽然还没有在包内写任何东西,但是可以编译了,
$ cd ~/catkin_ws
$ catkin_make
效果是在catkin_ws下创建了两个目录devel和build.
3、创建消息和服务
msg文件放在package的msg目录下,srv则放在package的srv目录下。
(1)创建消息的过程:
$ cd ~/catkin_ws/src/beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg // 创建了一个msg
还有关键的一步:我们要确保msg被转换成C++、Python和其它语言的源代码 :
查看package.xml,确保它包含以下两条语句:
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>
然后,打开CMakeLists.txt,利用find_package添加对message_generation的依赖:
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation ##自己添加的
)
同样,要确保设置了运行依赖项:
catkin_package(
...
CATKIN_DEPENDS message_runtime
...)
add_message_files(
FILES
Num.msg ##自己加
)
还要确保包含下面这一行:
generate_messages()
以上就是创建消息的全部内容,来测试一下:
$ cd ~/catkin_ws
$ catkin_make //编译一下
$ source devel/setup.bash
$ rosmsg show Num //查看消息,显示如下,说明消息创建成功
[begginer_tutorial/Num]:
int64 num
(2)创建服务
$ cd ~/catkin_ws/src/tutorials
$ mkdir srv
$ touch srv/AddTwoInts.srv //在srv下新建一个文件
在srv文件中写:
int64 a
int64 b
--- 说明:请求和响应由---分割
int64 sum
还有很关键的一步:我们要确保srv文件被转换成C++、Python和其它语言的源代码。和创建消息一样,要在CMakeLists.txt文件中增加对message_generation的依赖:
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation ##自己添加的 ) (是的,message_generation对消息和服务都起作用 )
类似的要在有
add_sevice_files(
FILES
AddTwoInts.srv ##自己加
)
新的服务创建完了之后,要重新编译一下才能生成:
$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
$ rossrv show AddTwoInts
显示如下内容:
[begginer_tutorials/AddTwoInts]: int64 a int64 b --- int64 sum
(3)msg和srv都需要的步骤
接下来,在CMakeLists.txt中找到如下部分:
$# generate_messages(
$# DEPENDENCIES
$# std_msgs # Or other packages containing msgs
$#)
去掉注释并附加上所有你消息文件所依赖的那些含有.msg文件的package(这个例子是依赖std_msgs,不要添加roscpp,rospy),结果如下:
generate_messages( DEPENDENCIES std_msgs )
4、编写简单的消息发布器和订阅器 (C++)
代码太多,见原网址。
5、编写简单的消息发布器和订阅器 (Python)
代码太多,见原网址。
其中 rospy.loginfo(str)
有三重作用,把消息输出到屏幕上;把消息写到节点的log中;把消息发到rosout。
rosout is a handy for debugging: you can pull up messages using rqt_console instead of having to find the console window with your Node’s output.
6、测试消息发布器和订阅器
无论是C++版本还是Python版本,写完代码后都要catkin_make
,还要source ~/catkin_ws/devel/setup.bash
.
$ roscore
$ rosrun beginner_tutorials talker //C++
$ rosrun beginner_tutorials talker.py // Python
$ rosrun beginner_tutorials listener //C++
$ rosrun beginner_tutorials listener.py // Python
完。