ROS(一) 写自己的节点

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):msg文件是一个描述ROS中所使用的消息类型的简单广西,它们会被生成不同语言的源代码。
  • 服务(srv):一个srv文件描述一项服务,它包含两个部分:请求和响应。

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

完。

你可能感兴趣的:(ROS)