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
知識點
話題、服務。
話題有發佈者和訂閱者,發佈者只管發佈,訂閱者只管開門讓數據進來。發佈的數據叫話題。
服務就是經常使用的
指令
- rosrun 後面接包名 + 節點名,運行節點
- roscore啓動master
- rosnode list顯示全部節點 rosnode info 節點名
- rqt_graph顯示節點關係圖
- rostopic list同理
- 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下問題
- 好像只能python2
- 必須在文件頭加上#!/usr/bin/env python2
- 我原本加的是#!/usr/bin/env python 結果報錯no module named rospkg,感受是python版本問題,遂換成python2解決。
- python寫完以後不須要編譯,直接rosrun便可。
- 記得給可執行權限。
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。
- 設置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
- 更新軟件源
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'
- 安裝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
- 安裝自動補全工具
ros2的命令行使用argcomplete工具進行補全,因此須要安裝該工具:
sudo apt install python3-argcomplete
- 設置環境變量
和ROS 1同樣,爲了讓系統找到ROS命令,安裝完成後須要將如下語句添加到.bashrc中:
source /opt/ros/crystal/setup.bash
- 安裝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