ROS入门记录 [3]

Tutorial——Beginner Level 1

10. Creating a ROS msg and srv

  • msg : message, package文件夹–> msg文件夹–> “xxxx.msg”文件
  int64 A
  int64 B
  int64 C
  • srv: service, 请求 + 回应
  int64 A
  int64 B
  ---
  int64 SUM

使用msg

$ roscd beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg
# 也能在Num.msg中添加别的:
string first_name
string last_name
uint8 age
uint32 score
#在package.xml中添加依赖项
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>

#在CMakeLists.txt中修改
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(
  DEPENDENCIES
  std_msgs
)

可以查看msg

$ rosmsg show Num
or
$ rosmsg show beginner_tutorials/Num

int64 num

使用srv

$ roscd beginner_tutorials
$ mkdir srv  # 创建srv文件夹
#  roscp [package_name] [file_to_copy_path] [copy_path]  # 从别的package拷贝service过来
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

同样需要修改package.xml文件,这步之前做过就不用做了

<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>

然后,需要修改CMakeLists.txt文件

add_service_files(
  FILES
  AddTwoInts.srv
)

可以查看srv

$ rossrv show AddTwoInts
or
$ rossrv show beginner_tutorials/AddTwoInts

int64 a
int64 b
---
int64 sum

commom step for msg and srv

$ roscd beginner_tutorials
$ cd ../..
$ catkin_make install
$ cd -

Review

  • rospack = ros+pack(age) : provides information related to ROS packages
  • roscd = ros+cd : changes directory to a ROS package or stack
  • rosls = ros+ls : lists files in a ROS package
  • roscp = ros+cp : copies files from/to a ROS package
  • rosmsg = ros+msg : provides information related to ROS message definitions
  • rossrv = ros+srv : provides information related to ROS service definitions
  • catkin_make : makes (compiles) a ROS package
    • rosmake = ros+make : makes (compiles) a ROS package (if you’re not using a catkin workspace)

11. Writing a Simple Publisher and Subscriber (Python)

$ roscd beginner_tutorials
$ mkdir scripts
$ cd scripts
$ wget https://raw.github.com/ros/ros_tutorials/kinetic-devel/rospy_tutorials/001_talker_listener/talker.py
$ chmod +x talker.py

关于talker.py的解释,链接

# talker.py
import rospy
from std_msgs.msg import String

def talker():
    pub = rospy.Publisher('chatter', String, queue_size=10)
    rospy.init_node('talker', anonymous=True)
    rate = rospy.Rate(10) # 10hz
    while not rospy.is_shutdown():
        hello_str = "hello world %s" % rospy.get_time()
        rospy.loginfo(hello_str)
        pub.publish(hello_str)
        rate.sleep()

if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass

以上创造了一个node,不断的发送 “hello world time()”
还需要创造一个接收的node:

$ roscd beginner_tutorials/scripts/
$ wget https://raw.github.com/ros/ros_tutorials/kinetic-devel/rospy_tutorials/001_talker_listener/listener.py
$ chmod +x listener.py

关于listener.py的解释,链接

# listener.py
import rospy
from std_msgs.msg import String

def callback(data):
    rospy.loginfo(rospy.get_caller_id() + 'I heard %s', data.data)

def listener():

    # In ROS, nodes are uniquely named. If two nodes with the same
    # name are launched, the previous one is kicked off. The
    # anonymous=True flag means that rospy will choose a unique
    # name for our 'listener' node so that multiple listeners can
    # run simultaneously.
    rospy.init_node('listener', anonymous=True)

    rospy.Subscriber('chatter', String, callback)

    # spin() simply keeps python from exiting until this node is stopped
    rospy.spin()

if __name__ == '__main__':
    listener()

Building your nodes

$ cd ~/catkin_ws
$ catkin_make

13. Examining the Simple Publisher and Subscriber

$ 准备工作
$ cd ~/catkin_ws
$ source devel/setup.bash  # 环境变量
$ roscore                  # 打开master,如果之前已经有,会报error
$ 启动talker
$ rosrun beginner_tutorials talker    #如果是C++
$ rosrun beginner_tutorials talker.py #如果是python
$ 在另一个terminal启动listener
$ rosrun beginner_tutorials listener    #如果是C++
$ rosrun beginner_tutorials listener.py #如果是python

可以看到两个窗口的log,talker发出的消息,listener在延迟一点点时间后收到。

# talker
[INFO] [WallTime: 1492089752.305381] hello world 1492089752.31
# listener
[INFO] [WallTime: 1492089752.306185] /listener_26673_1492089744027I heard hello world 1492089752.31
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值