pythonros
‘壹’ 如何在ros 使用odometry python
消息类型:
1. Twist - 线速度角速度
通常被用于发送到/cmd_vel话题,被base controller节点监听,控制机器人运动
注意这里存在tf操作:
创建TransformListener对象监听坐标系变换,这里需要sleep 2ms用于tf缓冲。
可以通过以下API获取tf变换,保存在TransformListener对象中,通过lookupTransform获取:
‘贰’ ros中python回调函数是不是必须要有rospy,spin或者rospy,spinonce函数
在使用ros::spin()的情况下,一般来说在初始化时已经设置好所有消息的回调,并且不需要其他背景程序运行。这样以来,每次消息到达时会执行用户的回调函数进行操作,相当于程序是消息事件驱动的;而在使用ros::spinOnce()的情况下,一般来说仅仅使用回调不足以完成任务,还需要其他辅助程序的执行:比如定时任务、数据处理、用户界面等。
关于消息接收回调机制在ROS官网上略有说明 (callbacks and spinning)。总体来说其原理是这样的:除了用户的主程序以外,ROS的socket连接控制进程会在后台接收订阅的消息,所有接收到的消息并不是立即处理,而是等到spin()或者spinOnce()执行时才集中处理。所以为了保证消息可以正常接收,需要尤其注意spinOnce()函数的使用 (对于spin()来说则不涉及太多的人为因素)。
I. 对于速度较快的消息,需要注意合理控制消息队列及spinOnce()的时间。例如,如果消息到达的频率是100Hz,而spinOnce()的执行频率是10Hz,那么就要至少保证消息队列中预留的大小大于10。
II. 如果对于用户自己的周期性任务,最好和spinOnce()并列调用。即使该任务是周期性的对于数据进行处理,例如对接收到的IMU数据进行Kalman滤波,也不建议直接放在回调函数中:因为存在通信接收的不确定性,不能保证该回调执行在时间上的稳定性。
// 示例代码
ros::Rate r(100);
while (ros::ok())
{
libusb_handle_events_timeout(...); // Handle USB events
ros::spinOnce(); // Handle ROS events
r.sleep();
}
III. 最后说明一下将ROS集成到其他程序架构时的情况。有些图形处理程序会将main()包裹起来,此时就需要找到一个合理的位置调用ros::spinOnce()。比如对于OpenGL来说,其中有一个方法就是采用设置定时器定时调用的方法:
// 示例代码
void timerCb(int value) {
ros::spinOnce();
}
glutTimerFunc(10, timerCb, 0);
glutMainLoop(); // Never returns
‘叁’ 如何编写ros的python程序
1 先建立工作空间~/catkin_ws
参阅http://www.douban.com/note/516838470/ 下的创建工作空间
catkin_create_pkg basic std_msgs rospy
2 在工作空间~/catkin_ws下创建包pkg目录basic
好处是通过创建包自动生成package.xml和CMakeLists.txt
可参阅http://www.douban.com/note/516843231/
3 在工程目录下建一个src子目录和.py文件
源代码文件:topic_publisher.py
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#!/usr/bin/env python
import roslib; roslib.load_manifest('basic')
import rospy
from std_msgs.msg import Int32
rospy.init_node('topic_publisher')
pub = rospy.Publisher('counter', Int32)
rate = rospy.Rate(2)
count = 0
while not rospy.is_shutdown():
pub.publish(count)
count += 1
rate.sleep()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
操作步骤如下
liao@liao-eagle:~/catkin_ws$ ls
build devel install src
liao@liao-eagle:~/catkin_ws$ cd src
liao@liao-eagle:~/catkin_ws/src$ ls
basic beginner_tutorials CMakeLists.txt first second
liao@liao-eagle:~/catkin_ws/src$ cd basic/
liao@liao-eagle:~/catkin_ws/src/basic$ ls
CMakeLists.txt package.xml src
liao@liao-eagle:~/catkin_ws/src/basic$ cd src
liao@liao-eagle:~/catkin_ws/src/basic/src$ vi topic_publisher.py
liao@liao-eagle:~/catkin_ws/src/basic/src$ chmod +x topic_publisher.py
4 回到~/catkin_ws目录下,编译程序
$ cd ~/catkin_ws
liao@liao-eagle:~/catkin_ws$ catkin_make
5 将当前工程加入到shell环境里去
liao@liao-eagle:~/catkin_ws$ echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
liao@liao-eagle:~/catkin_ws$ source ~/.bashrc
6 运行程序(需开两个终端)
liao@liao-eagle:~/catkin_ws$ roscore
liao@liao-eagle:~/catkin_ws$ rosrun basic topic_publisher.py
7 通过rostopic查看相关信息
liao@liao-eagle:~/catkin_ws$ rostopic list
/counter
/rosout
/rosout_agg
‘肆’ 如何编写ros的python程序
ROS Indigobeginner_Tutorials-10编写ROS话题版的Hello World程序(Python版)
我使用的虚拟机软件:VMware Workstation 11
使用的Ubuntu系统:Ubuntu 14.04.4 LTS
ROS版本:ROS Indigo
1. 前言 :
Hello world程序,在我们编程界,代表学习某种语言编写的第一个程序。对于ROS机器人操作系统来说,这个Hello World程序就是 : 写一个简单的消息发布器(发送) 和 订阅器(接收)。
2. 准备工作 :
C++的程序都会存放在每个程序包的src文件夹里。Python不同,Python程序都存放在scripts文件夹中, 反正意思都是源文件包。
Step 1 .所以,先在beginner_tutorials软件包中创建一个scripts文件夹:
$ roscd beginner_tutorials$ mkdir scripts$ cd scripts123
3. 编写消息发布器节点程序:
如果你懒得去写的话,你可以使用wget命令, 在github上获取一个talker.py源代码。如何获取呢 ?
Step 2 .开一个终端,输入下面的命令就可以获取talker.py:
$ wget
-devel/rospy_tutorials/001_talker_listener/talker.py$ ls
talker.py123
但是我建议你亲自动手,写一写:手动创建一个talker.py文件在/scripys文件夹里:
$ roscd beginner_tutorials/scripts$ gedit talker.py12
将这上面链接里的代码手动输入到talker.py文件中。(我就不将代码贴上来了)
下面我来讲解一下代码:
这些足以说明,hello_world_topic.launch启动脚本文件,启动成功。
总结:发布器和订阅器是很简单的, 就是简单的发布一个 自定义的话题。
我之前使用说过:节点之间通讯的方式有两种 : 话题(rostopic) 和 服务(rosservice)
所以,接下来,我们会讲:使用ROS服务来完成ROS版Hello World程序的例子。但是在这之前,我们需要学一学:如何创建自定义的ROS消息和ROS服务,以便ROS服务版的Hello World程序的编写。
所以下一讲,我们来学习:如何创建自定义的ROS消息和ROS服务。
‘伍’ 电脑里装了Python2和Python3,安装ros时,ros会使用Python几
在ROS中使用Python3
Use Python3 in ROS.
以下内容在Ubuntu 16.04 x64和ROS kinetic中测试通过
事实上,只要在.py文件加上python3的shebang,rosrun的时候就会自动调用相应的解释器了:
#!/usr/bin/env python3
但是,在安装ros-kinetic-desktop-full的时候,也并没有安装python3相关的package,所以需要手动安装。
1. 创建virtualenv环境(非必须)。
这一步不是必要的,在这只是为了保险起见。
sudo pip install virtualenv
# 我在这使用的是Python3.6rc2,指向系统已安装的python3也可以。
virtualenv rosenv -p /opt/python36rc/bin/python3source rosenv/bin/activatepython -V
# Python 3.6.0rc2
2. 安装相应的Package
需要安装catkin-tools和rospkg。
# 没有创建virtualenv的话,注意需要使用pip3pip install catkin-tools
pip install rospkg
3. 按正常方式创建ROS Packgae
创建Packge和Node的时候,无需source virtualenv。
但是,记得要在python node的文件头部加上shebang,否则rosrun仍会调用python2:
#!/usr/bin/env python3
4. rosrun
如果使用virtualenv,rosrun前记得source virtualenv就好了。
source ros_test/devel/setup.zsh# 如没有使用virtualenv,下一语句则跳过source rosenv/bin/activate
rosrun py3test pytest.py
Note
需要注意的是,即使使用的virtualenv中,python指向的是python3,但是只要不在.py文件中添加python3的shebang,rosrun还是会调用python2的。这样可以很方便地兼容原来Python2的Package。
‘陆’ 如何理解ros的python发布topic代码
第一步 去你的linux上写个串口程序 跟在win下调windows api一样一样的 就在terminal里用c/c++都可以 例子一大把 第二步 按照ros官网的tutorial把这个串口程序粘进去 建立topic然后 public数据上去
‘柒’ 用机器人操作系统ros编程,c++和python要学习到什么程度
c++和python 最起码对指针操作要灵活运用,具体该学习什么可以问问ITJOB的老师。
‘捌’ python-rosinstall什么意思
可以搜索software&updates,打开,可以看到相关的设置之前打了对够。或者cat /etc/apt/sources.list会看到类似以下的字眼,后面会接着universe multiverse等字
一般可忽略。
‘玖’ python2.7 运行脚本一直显示Traceback (most recent call last): 小白不懂 求大神指导
你给的值超出列表范围了。例如你的列表只有2个元素,你调用的时候查看了第三个元素就会报这个错。看样子你是调用第一个元素,那就是这个列表没定义?做个wlanacname=[]的定义试试
‘拾’ python 开发ros用什么ide
eclipse
Exec=/opt/eclipse/eclipse
务必加bash -i -c, 替换为
Exec=bash -i -c /opt/eclipse/eclipse