[ros] ros入門記錄

ROS入門

半天入門ROS,整體感受比較好理解,python寫不用編譯超級爽,學完ros去學電控去了。 ros2比ros1好用,因此最終是學ros2.node

ros1

安裝

添加源python

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

添加密匙ubuntu

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

安裝rosbash

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

初始化rosdepcurl

> sudo rosdep init
> rosdep update

問題:函數

No module named 'rosdep2'工具

解決:學習

sudo update-alternatives --config pythonui

手動切換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()

ros2

因爲ros1對python3的支持很是差,ros2對python3的支持很是好,因此要花必定時間學習ros2.

安裝

原本準備裝最新的ROS 2 Dashing Diademata,中間報錯也不會解決,網上相關資料至關少,遂放棄,根據古月居的教程安裝了Crystal Clemmys。

  1. 設置UTF-8編碼
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8
  1. 更新軟件源
sudo apt update && sudo apt install curl gnupg2 lsb-release
curl http://repo.ros2.org/repos.key | sudo apt-key add -
sudo sh -c 'echo "deb [arch=amd64,arm64] http://packages.ros.org/ros2/ubuntu `lsb_release -cs` main" > /etc/apt/sources.list.d/ros2-latest.list'
  1. 安裝ros2(選一個速度比較快的源哦)
export ROS_DISTRO=crystal # or bouncy or ardent
sudo apt update
  • 桌面版安裝(包含ROS, RViz, demos, tutorials)
sudo apt install ros-$ROS_DISTRO-desktop
  • 基礎版安裝(包含通信庫、消息包、命令行工具,沒有GUI工具)
sudo apt install ros-$ROS_DISTRO-ros-base
  1. 安裝自動補全工具

ros2的命令行使用argcomplete工具進行補全,因此須要安裝該工具:

sudo apt install python3-argcomplete
  1. 設置環境變量

和ROS 1同樣,爲了讓系統找到ROS命令,安裝完成後須要將如下語句添加到.bashrc中:

source /opt/ros/crystal/setup.bash
  1. 安裝ROS 1

目前ROS 2的功能還不是很全面,不少功能包須要依賴ROS 1,因此仍是須要安裝ROS 1的,安裝方法能夠參考ROS 1 wiki教程。

ROS 2和ROS 1之間經過ros-bridge通訊,須要安裝:

sudo apt updates
sudo apt install ros-$ROS_DISTRO-ros1-bridge ros-$ROS_DISTRO-turtlebot2-*

建立工做空間

mkdir -p ~/ros2_ws
cd ~/ros2_ws

編譯運行節點

cd src
ros2 pkg create demo --denpendencies rclpy rclcpp std_msgs
mkdir scripts
touch talker.py

編寫程序

# 引用python接口
import numpy as np
import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class Talker(Node):

   def __init__(self):
       super().__init__('talker')
       self.i = 0
 
       # 建立一個Publisher,發佈名爲chatter的topic,消息類型爲String
       self.pub = self.create_publisher(String, 'chatter')
       self.img = []
       # 設置定時器,週期調用定時器回調函數timer_callback
       timer_period = 1.0
       self.tmr = self.create_timer(timer_period, self.timer_callback)
 
   def timer_callback(self):
       # 建立String類型的消息
       msg = String()
       msg.data = 'Hello World: {0}'.format(self.i)
       self.i += 1
       self.get_logger().info('Publishing: "{0}"'.format(msg.data))
       self.img = np.array(self.img)
       # 發佈消息
       self.pub.publish(msg)


def main(args=None):
   # ROS節點初始化
   rclpy.init(args=args)
   # 建立節點及發佈器
   node = Talker()
   # 循環
   rclpy.spin(node)
 
   # 銷燬節點,退出程序
   node.destroy_node()
   rclpy.shutdown()
 
 
if __name__ == '__main__':
   main()
python talker.py

查看node以及topic

ros2 node talker info
ros2 topic list
相關文章
相關標籤/搜索