[ros] ros入门记录

ROS入门

半天入门ROS,总体感觉比较好理解,python写不用编译超级爽,学完ros去学电控去了。

安装

添加源

> sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

添加密匙

> sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

安装ros

> sudo apt update
> sudo apt install ros-melodic-desktop-full

初始化rosdep

> sudo rosdep init
> rosdep update

问题:

No module named 'rosdep2'

解决:

sudo update-alternatives --config python

手动切换python2

设置环境

> echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
> source ~/.bashrc

安装rosinstall

> sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential

知识点

话题、服务。

话题有发布者和订阅者,发布者只管发布,订阅者只管开门让数据进来。发布的数据叫话题。

服务就是常用的

指令

  1. rosrun 后面接包名 + 节点名,运行节点
  2. roscore启动master
  3. rosnode list显示所有节点 rosnode info 节点名
  4. rqt_graph显示节点关系图
  5. rostopic list同理
  6. rostopic pub 话题名 内容 加上-r 可以指定每秒循环发多少次

工作空间

创建工作空间

mkdir -p catkin_ws/src
cd catkin_ws/src
catkin_init_workspace

编译空间

cd catkin_ws
catkin_make

设置环境变量

source devel/setup.sh

检查环境变量

echo $ROS_PACKAGE_PATH

创建功能包(必须要)

cd src
catkin_create test_pkg roscpp rospy std_msgs

编译功能包

cd catkin_ws
catkin_make
source devel/setup.bash

python下问题

  1. 好像只能python2
  2. 必须在文件头加上#!/usr/bin/env python2
  3. 我本来加的是#!/usr/bin/env python 结果报错no module named rospkg,感觉是python版本问题,遂换成python2解决。
  4. python写完之后不需要编译,直接rosrun即可。
  5. 记得给可执行权限。

coding

publisher

#!/usr/bin/env python2
# license removed for brevity
import rospy
from std_msgs.msg import String

def talker():
    pub = rospy.Publisher('chatter', String, queue_size=10) # 发布话题名为chatter的topic,类型为String,队列长10
    rospy.init_node('talker', anonymous=True) # 初始化节点,节点名为talker
    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()# 每隔100ms 一次

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

listener

#!/usr/bin/env python2
import rospy
from std_msgs.msg import String

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

    rospy.init_node('listener', anonymous=True) # 节点初始化,后面表示节点匿名化,可以保证节点名的唯一性,用于接收的节点一般不需要暴露节点名吧?

    rospy.Subscriber("chatter", String, callback) # 订阅chatter话题,这里只需要指定话题,因为多个不同的节点可能发布同一话题

    rospy.spin()# 循环调callback直到结束

if __name__ == '__main__':
    listener()

未完待续...

猜你喜欢

转载自www.cnblogs.com/aoru45/p/11372122.html
ROS